From 18827e6745c557d4dd40450058c457f2aad60e6d Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Sat, 13 Dec 2025 08:34:17 +0200
Subject: [PATCH 01/32] awawawa
---
code/modules/admin/verbs/list_exposer.dm | 4 +-
.../blood_drinking/code/drinksomeblood.dm | 5 -
.../code/overfeeding/handle_overfeeding.dm | 7 -
modular_darkpack/modules/cars/code/car.dm | 32 --
.../modules/doors/code/vampdoor.dm | 2 -
.../modules/npc/code/human/__npc.dm | 275 --------------
.../modules/npc/code/human/_npc.dm | 3 +
.../npc/code/human/base_npc_ai_controller.dm | 11 +
.../modules/npc/code/human/npc_aggression.dm | 144 -------
.../modules/npc/code/human/npc_globals.dm | 8 -
.../npc/code/human/npc_human_subsystem.dm | 55 ---
.../modules/npc/code/human/npc_movement.dm | 315 ---------------
.../npc/code/human/npc_types/bacotell.dm | 7 -
.../npc/code/human/npc_types/bandit.dm | 8 -
.../human/npc_types/bouncers/__bouncer.dm | 185 ---------
.../npc_types/bouncers/bouncer_elysium.dm | 15 -
.../npc_types/bouncers/bouncer_endron.dm | 18 -
.../npc_types/bouncers/bouncer_giovanni.dm | 3 -
.../npc/code/human/npc_types/bubway.dm | 7 -
.../npc/code/human/npc_types/business.dm | 8 -
.../modules/npc/code/human/npc_types/club.dm | 28 --
.../npc/code/human/npc_types/garden.dm | 8 -
.../modules/npc/code/human/npc_types/guard.dm | 11 -
.../npc/code/human/npc_types/gummaguts.dm | 7 -
.../modules/npc/code/human/npc_types/hobo.dm | 9 -
.../npc/code/human/npc_types/illegal.dm | 8 -
.../modules/npc/code/human/npc_types/incel.dm | 7 -
.../npc/code/human/npc_types/police.dm | 26 --
.../modules/npc/code/human/npc_types/shop.dm | 8 -
.../npc/code/human/npc_types/stripper.dm | 28 --
.../npc/code/human/npc_types/walkby.dm | 7 -
.../code/human/socialroles/__socialrole.dm | 359 ------------------
.../npc/code/human/socialroles/bandit.dm | 145 -------
.../npc/code/human/socialroles/guard.dm | 98 -----
.../npc/code/human/socialroles/police.dm | 153 --------
.../npc/code/human/socialroles/poorfemale.dm | 124 ------
.../npc/code/human/socialroles/poormale.dm | 121 ------
.../npc/code/human/socialroles/richfemale.dm | 90 -----
.../npc/code/human/socialroles/richmale.dm | 90 -----
.../npc/code/human/socialroles/shop/__shop.dm | 109 ------
.../code/human/socialroles/shop/bacotell.dm | 2 -
.../npc/code/human/socialroles/shop/bubway.dm | 2 -
.../npc/code/human/socialroles/shop/garden.dm | 15 -
.../code/human/socialroles/shop/gummaguts.dm | 2 -
.../code/human/socialroles/shop/illegal.dm | 28 --
.../npc/code/human/socialroles/stripfemale.dm | 133 -------
.../npc/code/human/socialroles/usualfemale.dm | 147 -------
.../npc/code/human/socialroles/usualmale.dm | 142 -------
.../code/bouncer_barrier_subsystem.dm | 17 -
.../bouncer_roles/bouncer_elysium_role.dm | 3 -
.../code/bouncer_roles/bouncer_endron_role.dm | 49 ---
.../bouncer_roles/bouncer_giovanni_role.dm | 3 -
.../code/bouncer_roles/bouncer_mob_role.dm | 177 ---------
.../vip_areas/code/vip_barrier_perm.dm | 99 -----
.../code/vip_barriers/__vip_barrier.dm | 164 --------
.../code/vip_barriers/elysium_barrier.dm | 22 --
.../vip_barriers/elysium_stripclub_barrier.dm | 11 -
.../code/vip_barriers/endron_barrier.dm | 22 --
.../code/vip_barriers/giovanni_barrier.dm | 10 -
tgstation.dme | 54 +--
60 files changed, 18 insertions(+), 3632 deletions(-)
delete mode 100644 modular_darkpack/modules/npc/code/human/__npc.dm
create mode 100644 modular_darkpack/modules/npc/code/human/_npc.dm
create mode 100644 modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_aggression.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_globals.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_human_subsystem.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_movement.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_types/bacotell.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_types/bandit.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_types/bouncers/__bouncer.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_types/bouncers/bouncer_elysium.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_types/bouncers/bouncer_endron.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_types/bouncers/bouncer_giovanni.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_types/bubway.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_types/business.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_types/club.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_types/garden.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_types/guard.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_types/gummaguts.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_types/hobo.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_types/illegal.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_types/incel.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_types/police.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_types/shop.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_types/stripper.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/npc_types/walkby.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/socialroles/__socialrole.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/socialroles/bandit.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/socialroles/guard.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/socialroles/police.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/socialroles/poorfemale.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/socialroles/poormale.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/socialroles/richfemale.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/socialroles/richmale.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/socialroles/shop/__shop.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/socialroles/shop/bacotell.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/socialroles/shop/bubway.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/socialroles/shop/garden.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/socialroles/shop/gummaguts.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/socialroles/shop/illegal.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/socialroles/stripfemale.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/socialroles/usualfemale.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/socialroles/usualmale.dm
delete mode 100644 modular_darkpack/modules/vip_areas/code/bouncer_barrier_subsystem.dm
delete mode 100644 modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_elysium_role.dm
delete mode 100644 modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_endron_role.dm
delete mode 100644 modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_giovanni_role.dm
delete mode 100644 modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_mob_role.dm
delete mode 100644 modular_darkpack/modules/vip_areas/code/vip_barrier_perm.dm
delete mode 100644 modular_darkpack/modules/vip_areas/code/vip_barriers/__vip_barrier.dm
delete mode 100644 modular_darkpack/modules/vip_areas/code/vip_barriers/elysium_barrier.dm
delete mode 100644 modular_darkpack/modules/vip_areas/code/vip_barriers/elysium_stripclub_barrier.dm
delete mode 100644 modular_darkpack/modules/vip_areas/code/vip_barriers/endron_barrier.dm
delete mode 100644 modular_darkpack/modules/vip_areas/code/vip_barriers/giovanni_barrier.dm
diff --git a/code/modules/admin/verbs/list_exposer.dm b/code/modules/admin/verbs/list_exposer.dm
index 5dee40c6da19..f3a4d235b731 100644
--- a/code/modules/admin/verbs/list_exposer.dm
+++ b/code/modules/admin/verbs/list_exposer.dm
@@ -36,8 +36,8 @@
for(var/entry in GLOB.human_list)
var/mob/living/carbon/human/subject = entry
if(subject.ckey)
- data += "
| [subject] | [subject.dna.unique_enzymes] | [subject.get_bloodtype()?.name] |
"
- data += ""
+
+ data += ""data += "| [subject.real_name] | [subject.dna.unique_enzymes] | [subject.get_bloodtype()?.name] |
" // DARKPACK EDIT, ORIGINAL: data += "| [subject] | [subject.dna.unique_enzymes] | [subject.get_bloodtype()?.name] |
"
var/datum/browser/browser = new(usr, "DNA", "DNA Log", 440, 410)
browser.set_content(data)
diff --git a/modular_darkpack/modules/blood_drinking/code/drinksomeblood.dm b/modular_darkpack/modules/blood_drinking/code/drinksomeblood.dm
index ed6a8e2fce17..eb8afe083a03 100644
--- a/modular_darkpack/modules/blood_drinking/code/drinksomeblood.dm
+++ b/modular_darkpack/modules/blood_drinking/code/drinksomeblood.dm
@@ -6,11 +6,6 @@
src.emote("moan")
Immobilize(30, TRUE)
- if(isnpc(mob))
- var/mob/living/carbon/human/npc/NPC = mob
- NPC.danger_source = null
- mob.Stun(40) //NPCs don't get to resist
-
if(mob.blood_volume <= BLOOD_VOLUME_BAD)
to_chat(src, span_warning("Your victim's heart beats only weakly. Death comes for them."))
diff --git a/modular_darkpack/modules/blood_drinking/code/overfeeding/handle_overfeeding.dm b/modular_darkpack/modules/blood_drinking/code/overfeeding/handle_overfeeding.dm
index 574f97e87b22..f615b32c578a 100644
--- a/modular_darkpack/modules/blood_drinking/code/overfeeding/handle_overfeeding.dm
+++ b/modular_darkpack/modules/blood_drinking/code/overfeeding/handle_overfeeding.dm
@@ -1,13 +1,6 @@
/mob/living/carbon/human/proc/handle_overfeeding(var/mob/living/carbon/human/human_mob)
human_mob.blood_volume = 0
if(human_mob.stat != DEAD)
- if(isnpc(human_mob))
- var/mob/living/carbon/human/npc/Npc = human_mob
- Npc.last_attacker = null
- killed_count = killed_count+1
- if(killed_count >= 5)
- SEND_SOUND(src, sound('modular_darkpack/modules/deprecated/sounds/humanity_loss.ogg', 0, 0, 75))
- to_chat(src, span_userdanger("POLICE ASSAULT IN PROGRESS"))
SEND_SOUND(src, sound('modular_darkpack/modules/deprecated/sounds/feed_failed.ogg', 0, 0, 75))
to_chat(src, span_warning("This sad sacrifice for your own pleasure affects something deep in your mind."))
AdjustHumanity(-1, 0)
diff --git a/modular_darkpack/modules/cars/code/car.dm b/modular_darkpack/modules/cars/code/car.dm
index cbf800e57da3..f36ea727f703 100644
--- a/modular_darkpack/modules/cars/code/car.dm
+++ b/modular_darkpack/modules/cars/code/car.dm
@@ -230,8 +230,6 @@
if(!locked)
to_chat(user, span_warning("The [src] is already unlocked."))
return
- for(var/mob/living/carbon/human/npc/police/P in oviewers(DEFAULT_SIGHT_DISTANCE, src))
- P.Aggro(user)
log_game("[user] tried lockpicking [src]")
var/total_lockpicking = user.st_get_stat(STAT_LARCENY)
if(do_after(user, 10 SECONDS, src, interaction_key = DOAFTER_SOURCE_CAR))
@@ -281,8 +279,6 @@
if(!driver && !length(passengers) && COOLDOWN_FINISHED(src, beep_cooldown) && locked)
COOLDOWN_START(src, beep_cooldown, 7 SECONDS)
playsound(src, 'modular_darkpack/modules/cars/sounds/signal.ogg', 50, FALSE)
- for(var/mob/living/carbon/human/npc/police/P in oviewers(DEFAULT_SIGHT_DISTANCE, src))
- P.Aggro(user)
if(prob(10) && locked)
playsound(src, 'modular_darkpack/modules/cars/sounds/open.ogg', 50, TRUE)
@@ -487,10 +483,6 @@
speed_in_pixels = 0
COOLDOWN_START(src, impact_delay, 2 SECONDS)
- if(driver && istype(bumped_atom, /mob/living/carbon/human/npc))
- var/mob/living/carbon/human/npc/NPC = bumped_atom
- NPC.Aggro(driver, TRUE)
-
last_pos["x_pix"] = 0
last_pos["y_pix"] = 0
for(var/mob/living/L in src)
@@ -550,8 +542,6 @@
// Here lies the Car Backwards Long Jump - 2021-2025
var/turf/check_turf = get_turf_in_angle(true_movement_angle, src.loc, 3)
- handle_npc_dodge(check_turf, true_movement_angle)
-
var/turf/hit_turf
var/list/in_line = get_line(src, check_turf)
for(var/turf/T in in_line)
@@ -600,28 +590,6 @@
animate(src, pixel_x = last_pos["x_pix"]+moved_x, pixel_y = last_pos["y_pix"]+moved_y, SScarpool.wait, 1)
update_last_pos(moved_x, moved_y)
-/obj/darkpack_car/proc/handle_npc_dodge(turf/target, angle)
- for(var/turf/T in get_line(src, target))
- var/list/unpassable = T.get_blocking_contents(FALSE, src)
- if(!length(unpassable))
- continue
- for(var/mob/living/carbon/human/npc/NPC in unpassable)
- if(COOLDOWN_FINISHED(NPC, car_dodge) && !HAS_TRAIT(NPC, TRAIT_INCAPACITATED))
- var/list/dodge_direction = list(
- SIMPLIFY_DEGREES(angle + 45),
- SIMPLIFY_DEGREES(angle - 45),
- SIMPLIFY_DEGREES(angle + 90),
- SIMPLIFY_DEGREES(angle - 90),
- )
- for(var/dir_angle in dodge_direction)
- if(get_step(NPC, angle2dir(dir_angle)).density)
- dodge_direction.Remove(dir_angle)
- if(length(dodge_direction))
- step(NPC, angle2dir(pick(dodge_direction)), NPC.cached_multiplicative_slowdown)
- COOLDOWN_START(NPC, car_dodge, 2 SECONDS)
- if(prob(50))
- NPC.realistic_say(pick(NPC.socialrole.car_dodged))
-
/// Moves the client cameras of living inside of the car.
/obj/darkpack_car/proc/move_car_riders(moved_x, moved_y)
for(var/mob/living/rider in src)
diff --git a/modular_darkpack/modules/doors/code/vampdoor.dm b/modular_darkpack/modules/doors/code/vampdoor.dm
index 4410c493666c..d24d4b359d53 100644
--- a/modular_darkpack/modules/doors/code/vampdoor.dm
+++ b/modular_darkpack/modules/doors/code/vampdoor.dm
@@ -286,8 +286,6 @@
if(locked)
proc_unlock(5)
playsound(src, 'modular_darkpack/modules/doors/sounds/hack.ogg', 100, TRUE)
- for(var/mob/living/carbon/human/npc/police/P in oviewers(DEFAULT_SIGHT_DISTANCE, src))
- P.Aggro(user)
var/total_lockpicking = user.st_get_stat(STAT_LARCENY)
if(do_after(user, lockpick_timer, src, interaction_key = DOAFTER_SOURCE_DOOR))
if(!locked)
diff --git a/modular_darkpack/modules/npc/code/human/__npc.dm b/modular_darkpack/modules/npc/code/human/__npc.dm
deleted file mode 100644
index 55d995149eaf..000000000000
--- a/modular_darkpack/modules/npc/code/human/__npc.dm
+++ /dev/null
@@ -1,275 +0,0 @@
-#define BANDIT_TYPE_NPC /mob/living/carbon/human/npc/bandit
-#define POLICE_TYPE_NPC /mob/living/carbon/human/npc/police
-
-/mob/living/carbon/human/npc
- name = "NPC"
-
- // NPCs normally walk around slowly
- move_intent = MOVE_INTENT_WALK
-
- // NPC humans get the area of effect, player humans dont.
- violation_aoe = TRUE
-
- /// Until we do a full NPC refactor (see: rewriting every single bit of code)
- /// use this to determine NPC weapons and their chances to spawn with them -- assuming you want the NPC to do that
- /// Otherwise just set it under the NPC's type as
- /// my_weapon = type_path
- /// my_backup_weapon = type_path
- /// This only determines my_weapon, you set my_backup_weapon yourself
- /// The last entry in the list for a type of NPC should always have 100 as the index
- // DARKPACK TODO - reimplement weapons
- /*
- var/static/list/role_weapons_chances = list(
- BANDIT_TYPE_NPC = list(
- /obj/item/gun/ballistic/automatic/pistol/darkpack/deagle = 33,
- /obj/item/gun/ballistic/revolver/darkpack/snub = 33,
- /obj/item/melee/baseball_bat/vamp = 100,
- ),
- POLICE_TYPE_NPC = list(
- /obj/item/gun/ballistic/revolver/darkpack/magnum = 66,
- /obj/item/gun/ballistic/automatic/darkpack/ar15 = 100,
- )
- )
- */
- var/datum/socialrole/socialrole
-
- var/is_talking = FALSE
- COOLDOWN_DECLARE(annoyed_cooldown)
- COOLDOWN_DECLARE(car_dodge)
- var/hostile = FALSE
- var/aggressive = FALSE
- var/last_antagonised = 0
- var/mob/living/danger_source
- var/obj/effect/abstract/turf_fire/afraid_of_fire
- var/mob/living/last_attacker
- var/last_health = 100
- var/mob/living/last_damager
-
- var/turf/walktarget //dlya movementa
-
- var/last_grab = 0
-
- var/tupik_steps = 0
- var/tupik_loc
-
- var/stopturf = 1
-
- var/extra_mags = 2
- var/extra_loaded_rounds = 10
-
- var/has_weapon = FALSE
-
- var/my_weapon_type = null
- var/obj/item/my_weapon = null
-
- var/my_backup_weapon_type = null
- var/obj/item/my_backup_weapon = null
-
- var/spawned_weapon = FALSE
-
- var/spawned_backup_weapon = FALSE
-
- var/staying = FALSE
-
- var/lifespan = 0 //How many cycles. He'll be deleted if over than a ten thousand
- var/old_movement = FALSE
- var/max_stat = 2
-
- var/list/spotted_bodies = list()
-
- var/is_criminal = FALSE
-
- var/list/drop_on_death_list = null
-
-/mob/living/carbon/human/npc/Initialize(mapload)
- . = ..()
-
- GLOB.npc_list += src
- GLOB.alive_npc_list += src
-
- AddElement(/datum/element/relay_attackers)
- RegisterSignal(src, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(handle_attacked))
-
- // Annoy the NPC when pushed around
- RegisterSignal(src, COMSIG_LIVING_MOB_BUMPED, PROC_REF(handle_bumped))
- // Be annoyed if helped
- RegisterSignal(src, COMSIG_CARBON_HELP_ACT, PROC_REF(handle_helped))
-
- return INITIALIZE_HINT_LATELOAD
-
-/mob/living/carbon/human/npc/LateInitialize(mapload)
- // DARKPACK TODO - reimplement weapons
- /*
- if (role_weapons_chances.Find(type))
- for(var/weapon in role_weapons_chances[type])
- if(prob(role_weapons_chances[type][weapon]))
- my_weapon = new weapon(src)
- break
- */
-
- if (!my_weapon && my_weapon_type)
- my_weapon = new my_weapon_type(src)
-
- if (my_weapon)
- has_weapon = TRUE
- equip_to_appropriate_slot(my_weapon)
- if(istype(my_weapon, /obj/item/gun/ballistic))
- RegisterSignal(my_weapon, COMSIG_GUN_FIRED, PROC_REF(handle_gun))
- RegisterSignal(my_weapon, COMSIG_GUN_EMPTY, PROC_REF(handle_empty_gun))
- register_sticky_item(my_weapon)
-
- if (my_backup_weapon_type)
- my_backup_weapon = new my_backup_weapon_type(src)
- equip_to_appropriate_slot(my_backup_weapon)
- register_sticky_item(my_backup_weapon)
-
-/mob/living/carbon/human/npc/Destroy()
- QDEL_NULL(socialrole)
- danger_source = null
- QDEL_NULL(afraid_of_fire)
- last_attacker = null
- last_damager = null
- walktarget = null
- tupik_loc = null
- my_weapon_type = null
- my_weapon = null
- my_backup_weapon_type = null
- my_backup_weapon = null
- spotted_bodies = null
- drop_on_death_list = null
- GLOB.npc_list -= src
- GLOB.alive_npc_list -= src
- SShumannpcpool.try_repopulate()
- return ..()
-
-//====================Sticky Item Handling====================
-/mob/living/carbon/human/npc/proc/register_sticky_item(obj/item/my_item)
- ADD_TRAIT(my_item, TRAIT_NODROP, NPC_ITEM_TRAIT)
- if(!drop_on_death_list?.len)
- drop_on_death_list = list()
- drop_on_death_list += my_item
-
-/mob/living/carbon/human/npc/death(gibbed)
- . = ..()
-
- if (!LAZYLEN(drop_on_death_list))
- return
-
- for (var/obj/item/dropping_item in drop_on_death_list)
- LAZYREMOVE(drop_on_death_list, dropping_item)
- REMOVE_TRAIT(dropping_item, TRAIT_NODROP, NPC_ITEM_TRAIT)
- dropItemToGround(dropping_item, TRUE)
-
-//============================================================
-
-/mob/living/carbon/human/npc/proc/realistic_say(message)
- GLOB.move_manager.stop_looping(src)
-
- if (!message)
- return
- if (stat >= HARD_CRIT)
- return
- if (is_talking)
- return
- is_talking = TRUE
-
- addtimer(CALLBACK(src, PROC_REF(start_talking), message), 0.5 SECONDS)
-
-/mob/living/carbon/human/npc/proc/start_talking(message)
- create_typing_indicator()
- var/typing_delay = round(length_char(message) * 0.5)
- addtimer(CALLBACK(src, PROC_REF(finish_talking), message), max(0.1 SECONDS, typing_delay))
-
-/mob/living/carbon/human/npc/proc/finish_talking(message)
- remove_typing_indicator()
- say(message)
- is_talking = FALSE
-
-/mob/living/carbon/human/npc/proc/Annoy(atom/source)
- GLOB.move_manager.stop_looping(src)
-
- if (!can_npc_move())
- return
- if (danger_source)
- return
-
- if (!COOLDOWN_FINISHED(src, annoyed_cooldown))
- return
- COOLDOWN_START(src, annoyed_cooldown, 5 SECONDS)
-
- if(source)
- addtimer(CALLBACK(src, PROC_REF(face_atom), source), rand(0.3 SECONDS, 0.7 SECONDS))
-
- var/phrase
- if (prob(50))
- phrase = pick(socialrole.neutral_phrases)
- else
- if (gender == MALE)
- phrase = pick(socialrole.male_phrases)
- else
- phrase = pick(socialrole.female_phrases)
- realistic_say(phrase)
-
-/mob/living/carbon/human/npc/proc/handle_attacked(datum/source, atom/attacker, attack_flags)
- // Only aggro nearby npcs if its lethal.
- if(!(attack_flags & (ATTACKER_STAMINA_ATTACK|ATTACKER_SHOVING)))
- for(var/mob/living/carbon/human/npc/nearby_npcs in oviewers(DEFAULT_SIGHT_DISTANCE, src))
- nearby_npcs.Aggro(attacker)
- SSwanted_level.announce_crime("victim", get_turf(src), TRUE)
- Aggro(attacker, TRUE)
-
-/mob/living/carbon/human/npc/proc/handle_bumped(mob/living/carbon/human/npc/source, mob/living/bumping)
- SIGNAL_HANDLER
-
- if (bumping.can_mobswap_with(source))
- return
-
- source.Annoy(bumping)
-
-/mob/living/carbon/human/npc/proc/handle_helped(mob/living/carbon/human/npc/source, mob/living/helper)
- SIGNAL_HANDLER
-
- source.Annoy(helper)
-
-/mob/living/carbon/human/npc/Move(NewLoc, direct)
- if (!can_npc_move())
- GLOB.move_manager.stop_looping(src)
-
- var/getaway = stopturf + 1
-
- if (!old_movement)
- getaway = 2
-
- if (get_dist(src, walktarget) <= getaway)
- GLOB.move_manager.stop_looping(src)
- walktarget = null
-
- . = ..()
-
-/mob/living/carbon/human/npc/grabbedby(mob/living/carbon/user, supress_message = FALSE)
- . = ..()
-
- last_grab = world.time
-
-/mob/living/carbon/human/npc/ghoulificate(mob/owner)
- deadchat_broadcast(span_ghostalert("[owner] is ghoulificating [src]."), owner, src)
-
- AddComponent(\
- /datum/component/ghost_direct_control,\
- ban_type = ROLE_GHOUL,\
- poll_candidates = TRUE,\
- role_name = "[owner]'s ghoul",\
- poll_length = 30 SECONDS,\
- poll_question = "Do you want to play as [owner]'s ghoul?",\
-
- assumed_control_message = "You are now [owner]'s ghoul!",\
- after_assumed_control = CALLBACK(src, PROC_REF(ghoul_player_controlled), owner)\
- )
-
- //poll_ignore_key = POLL_IGNORE_GHOUL,
-
- . = ..()
- return TRUE
-
-/mob/living/carbon/human/npc/proc/ghoul_player_controlled(mob/owner)
- message_admins("[key_name_admin(src)] has became a ghoul by [key_name_admin(owner)].")
diff --git a/modular_darkpack/modules/npc/code/human/_npc.dm b/modular_darkpack/modules/npc/code/human/_npc.dm
new file mode 100644
index 000000000000..cdee813cfd27
--- /dev/null
+++ b/modular_darkpack/modules/npc/code/human/_npc.dm
@@ -0,0 +1,3 @@
+/mob/living/carbon/human/npc
+ ai_controller = /datum/ai_controller/npc
+
diff --git a/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm b/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
new file mode 100644
index 000000000000..f95a0a835b54
--- /dev/null
+++ b/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
@@ -0,0 +1,11 @@
+/datum/ai_controller/npc
+ ai_movement = /datum/ai_movement/jps
+ movement_delay = 0.4 SECONDS
+ planning_subtrees = list(
+ /datum/ai_planning_subtree/generic_resist,
+ )
+ blackboard = list(
+ BB_RESISTING = FALSE,
+ )
+ idle_behavior = /datum/idle_behavior/idle_random_walk
+
diff --git a/modular_darkpack/modules/npc/code/human/npc_aggression.dm b/modular_darkpack/modules/npc/code/human/npc_aggression.dm
deleted file mode 100644
index ff59719c80cb..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_aggression.dm
+++ /dev/null
@@ -1,144 +0,0 @@
-/mob/living/carbon/human/npc/proc/Aggro(mob/living/victim, attacked = FALSE)
- if (stat == DEAD)
- return
- if (attacked && danger_source != victim)
- GLOB.move_manager.stop_looping(src)
- if (victim == src)
- return
- if (isnpc(victim))
- return
-
- // If the victim doesn't appear dead, enter combat mode and set
- // them as the NPC's danger source.
- if (!HAS_TRAIT(victim, TRAIT_DEATHCOMA))
- set_combat_mode(TRUE)
- if (move_intent == MOVE_INTENT_WALK)
- toggle_move_intent()
-
- danger_source = victim
- if(attacked)
- last_attacker = victim
- if(health != last_health)
- last_health = health
- last_damager = victim
-
- if (!can_npc_move())
- return
- if ((last_antagonised + 5 SECONDS) >= world.time)
- return
- last_antagonised = world.time
-
- if (prob(50))
- if (!my_weapon && prob(50))
- emote("scream")
- else
- realistic_say(pick(socialrole.help_phrases))
-
-/mob/living/carbon/human/npc/proc/end_combat()
- danger_source = null
- if (has_weapon)
- if (get_active_held_item() == my_weapon)
- npc_stow_weapon()
- else
- has_weapon = FALSE
- walktarget = ChoosePath()
-
- set_combat_mode(FALSE)
- if (move_intent == MOVE_INTENT_RUN)
- toggle_move_intent()
-
-/mob/living/carbon/human/npc/proc/handle_gun(obj/item/gun/ballistic/weapon, mob/living/user, atom/target, params, zone_override)
- SIGNAL_HANDLER
-
- if(weapon.loc != src)
- UnregisterSignal(weapon, COMSIG_GUN_FIRED)
- UnregisterSignal(weapon, COMSIG_GUN_EMPTY)
- return
-
- if(!istype(weapon, /obj/item/gun/ballistic))
- return
-
- if(istype(weapon.magazine, /obj/item/ammo_box/magazine/internal))
- var/obj/item/ammo_box/magazine/internal_mag = weapon.magazine
- if(extra_loaded_rounds)
- internal_mag.give_round(new internal_mag.ammo_type())
- extra_loaded_rounds--
- addtimer(CALLBACK(src, PROC_REF(rack_held_gun), weapon), weapon.rack_delay)
- return
-
- if(!weapon.magazine.ammo_count() && extra_mags)
- extra_mags--
- weapon.eject_magazine_npc(src, new weapon.spawn_magazine_type(src))
- weapon.rack(src)
- if(!weapon.chambered)
- weapon.chamber_round()
-
-/mob/living/carbon/human/npc/proc/rack_held_gun(obj/item/gun/ballistic/weapon)
- if(weapon.bolt_locked)
- weapon.drop_bolt()
- weapon.rack(src)
-
-/mob/living/carbon/human/npc/proc/handle_empty_gun()
- SIGNAL_HANDLER
-
- UnregisterSignal(my_weapon, COMSIG_GUN_FIRED)
- UnregisterSignal(my_weapon, COMSIG_GUN_EMPTY)
- npc_stow_weapon()
-
- if (!my_backup_weapon || spawned_backup_weapon)
- return
- npc_draw_backup_weapon()
- my_weapon = my_backup_weapon
- spawned_backup_weapon = TRUE
-
-/mob/living/carbon/human/npc/proc/npc_stow_weapon()
- if (!my_weapon)
- return
-
- REMOVE_TRAIT(my_weapon, TRAIT_NODROP, NPC_ITEM_TRAIT)
- temporarilyRemoveItemFromInventory(my_weapon, TRUE)
- equip_to_appropriate_slot(my_weapon)
- ADD_TRAIT(my_weapon, TRAIT_NODROP, NPC_ITEM_TRAIT)
- spawned_weapon = FALSE
-
-/mob/living/carbon/human/npc/proc/npc_draw_weapon()
- if (!my_weapon)
- return
-
- REMOVE_TRAIT(my_weapon, TRAIT_NODROP, NPC_ITEM_TRAIT)
- temporarilyRemoveItemFromInventory(my_weapon, TRUE)
- put_in_active_hand(my_weapon)
- ADD_TRAIT(my_weapon, TRAIT_NODROP, NPC_ITEM_TRAIT)
- spawned_weapon = TRUE
-
-/mob/living/carbon/human/npc/proc/npc_draw_backup_weapon()
- if (!my_backup_weapon)
- return
-
- REMOVE_TRAIT(my_backup_weapon, TRAIT_NODROP, NPC_ITEM_TRAIT)
- temporarilyRemoveItemFromInventory(my_backup_weapon, TRUE)
- put_in_active_hand(my_backup_weapon)
- ADD_TRAIT(my_backup_weapon, TRAIT_NODROP, NPC_ITEM_TRAIT)
- spawned_weapon = TRUE
-
-/obj/item/gun/ballistic/proc/eject_magazine_npc(mob/user, obj/item/ammo_box/magazine/tac_load = null)
- if(bolt_type == BOLT_TYPE_OPEN)
- chambered = null
- if (magazine.ammo_count())
- playsound(src, load_sound, load_sound_volume, load_sound_vary)
- else
- playsound(src, load_empty_sound, load_sound_volume, load_sound_vary)
- magazine.forceMove(drop_location())
- var/obj/item/ammo_box/magazine/old_mag = magazine
-
- if (tac_load)
- tac_load.forceMove(src)
- if (bolt_type == BOLT_TYPE_OPEN && !bolt_locked)
- chamber_round(TRUE)
- magazine = tac_load
- else
- magazine = null
-
- old_mag.forceMove(get_turf(user))
- old_mag.update_icon()
- update_icon()
diff --git a/modular_darkpack/modules/npc/code/human/npc_globals.dm b/modular_darkpack/modules/npc/code/human/npc_globals.dm
deleted file mode 100644
index 95dba2e34389..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_globals.dm
+++ /dev/null
@@ -1,8 +0,0 @@
-/// All human NPCs, living or dead
-GLOBAL_LIST_EMPTY(npc_list)
-/// All living human NPCs
-GLOBAL_LIST_EMPTY(alive_npc_list)
-/// Landmarks that NPCs will navigate towards
-GLOBAL_LIST_EMPTY(npc_activities)
-/// Landmarks that NPCs will spawn at
-GLOBAL_LIST_EMPTY(npc_spawn_points)
diff --git a/modular_darkpack/modules/npc/code/human/npc_human_subsystem.dm b/modular_darkpack/modules/npc/code/human/npc_human_subsystem.dm
deleted file mode 100644
index 10887de97b85..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_human_subsystem.dm
+++ /dev/null
@@ -1,55 +0,0 @@
-SUBSYSTEM_DEF(humannpcpool)
- name = "Human NPC Pool"
- flags = SS_POST_FIRE_TIMING|SS_BACKGROUND
- priority = FIRE_PRIORITY_NPC
- runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
- wait = 0.3 SECONDS
-
- dependencies = list(
- /datum/controller/subsystem/mapping,
- /datum/controller/subsystem/atoms,
- )
-
- var/list/currentrun = list()
-
-/datum/controller/subsystem/humannpcpool/Initialize()
- try_repopulate()
- return SS_INIT_SUCCESS
-
-/datum/controller/subsystem/humannpcpool/stat_entry(msg)
- var/list/activelist = GLOB.npc_list
- var/list/living_list = GLOB.alive_npc_list
- msg = "NPCS:[length(activelist)] Living: [length(living_list)]"
- return ..()
-
-/datum/controller/subsystem/humannpcpool/fire(resumed = FALSE)
-
- if (!resumed)
- var/list/activelist = GLOB.npc_list
- src.currentrun = activelist.Copy()
-
- //cache for sanic speed (lists are references anyways)
- var/list/currentrun = src.currentrun
-
- while(currentrun.len)
- var/mob/living/carbon/human/npc/NPC = currentrun[currentrun.len]
- --currentrun.len
-
- if (MC_TICK_CHECK)
- return
- NPC.handle_automated_movement()
-
-/datum/controller/subsystem/humannpcpool/proc/try_repopulate()
- if (!length(GLOB.npc_spawn_points))
- return
-
- while (length(GLOB.alive_npc_list) < SSmapping.current_map.max_npcs)
- var/atom/chosen_spawn_point = pick(GLOB.npc_spawn_points)
- var/creating_npc = pick(
- /mob/living/carbon/human/npc/police, \
- /mob/living/carbon/human/npc/bandit, \
- /mob/living/carbon/human/npc/hobo, \
- /mob/living/carbon/human/npc/walkby, \
- /mob/living/carbon/human/npc/business \
- )
- new creating_npc(get_turf(chosen_spawn_point))
diff --git a/modular_darkpack/modules/npc/code/human/npc_movement.dm b/modular_darkpack/modules/npc/code/human/npc_movement.dm
deleted file mode 100644
index 6b49f28aaf7c..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_movement.dm
+++ /dev/null
@@ -1,315 +0,0 @@
-/obj/effect/landmark/npc_spawn_point
-
-/obj/effect/landmark/npc_spawn_point/Initialize(mapload)
- . = ..()
-
- GLOB.npc_spawn_points += src
-
-/obj/effect/landmark/npc_spawn_point/Destroy()
- GLOB.npc_spawn_points -= src
-
- . = ..()
-
-/obj/effect/landmark/npcbeacon
- name = "NPC beacon"
- var/directionwalk
-
-/obj/effect/landmark/npcbeacon/directed
- name = "NPC traffic"
- icon = 'modular_darkpack/modules/deprecated/icons/effects/landmarks_static.dmi'
- icon_state = "npc"
-
-/obj/effect/landmark/npcbeacon/directed/Initialize(mapload)
- . = ..()
-
- directionwalk = dir
-
-/obj/effect/landmark/npcwall
- name = "NPC Wall"
- icon_state = "x"
-
-/obj/effect/landmark/npcactivity
- name = "NPC Activity"
- icon = 'modular_darkpack/modules/deprecated/icons/effects/landmarks_static.dmi'
- icon_state = "bullets"
-
-/obj/effect/landmark/npcability
- name = "NPC Ability"
- icon = 'modular_darkpack/modules/deprecated/icons/effects/landmarks_static.dmi'
- icon_state = "ability"
-
-/obj/effect/landmark/npcactivity/Initialize(mapload)
- . = ..()
-
- GLOB.npc_activities += src
-
-/obj/effect/landmark/npcactivity/Destroy()
- . = ..()
-
- GLOB.npc_activities -= src
-
-/mob/living/carbon/human/npc/death()
- GLOB.alive_npc_list -= src
- SShumannpcpool.try_repopulate()
- GLOB.move_manager.stop_looping(src)
-
- if (!last_attacker || (get_dist(src, last_attacker) >= 10) || key || hostile)
- return ..()
-
- if (istype(last_attacker, /mob/living/simple_animal/hostile))
- var/mob/living/simple_animal/hostile/HS = last_attacker
- if(HS.my_creator)
- HS.my_creator.AdjustHumanity(-1, 0)
- HS.my_creator.killed_count += 1
- if(!HS.my_creator.warrant && !HS.my_creator.ignores_warrant)
- if(HS.my_creator.killed_count >= 5)
- HS.my_creator.warrant = TRUE
- SEND_SOUND(HS.my_creator, sound('modular_darkpack/modules/deprecated/sounds/suspect.ogg', 0, 0, 75))
- to_chat(HS.my_creator, span_userdanger("POLICE ASSAULT IN PROGRESS"))
- else
- SEND_SOUND(HS.my_creator, sound('modular_darkpack/modules/deprecated/sounds/sus.ogg', 0, 0, 75))
- to_chat(HS.my_creator, span_userdanger("SUSPICIOUS ACTION (murder)"))
- else if (ishuman(last_attacker))
- var/mob/living/carbon/human/HM = last_attacker
- HM.AdjustHumanity(-1, 0)
- HM.killed_count += 1
- if(!HM.warrant && !HM.ignores_warrant)
- if(HM.killed_count >= 5)
- HM.warrant = TRUE
- SEND_SOUND(HM, sound('modular_darkpack/modules/deprecated/sounds/suspect.ogg', 0, 0, 75))
- to_chat(HM, span_userdanger("POLICE ASSAULT IN PROGRESS"))
- else
- SEND_SOUND(HM, sound('modular_darkpack/modules/deprecated/sounds/sus.ogg', 0, 0, 75))
- to_chat(HM, span_userdanger("SUSPICIOUS ACTION (murder)"))
-
- . = ..()
-
-/mob/living/carbon/human/npc/Life()
- // huh, NPCs don't run Life() at all if they're dead
- // this means NPCs' organs will never rot, they'll stop bleeding, their body will stay
- // the temperature it was when they died, etc. remove?
- if (stat == DEAD)
- return
-
- . = ..()
-
- if (pulledby && (prob(25) || aggressive))
- INVOKE_ASYNC(src, PROC_REF(Aggro), pulledby, TRUE)
-
- if (!can_npc_move())
- return
- nutrition = 400
- if (get_dist(danger_source, src) < 7)
- last_antagonised = world.time
- if (fire_stacks >= 1)
- INVOKE_ASYNC(src, PROC_REF(execute_resist))
-
- if (staying)
- return
- if (!walktarget)
- walktarget = ChoosePath()
- if (loc == tupik_loc)
- tupik_steps += 1
- else
- tupik_loc = loc
- tupik_steps = 0
-
- if (tupik_steps <= 3)
- return
- var/turf/T = get_step(src, pick(NORTH, SOUTH, WEST, EAST))
- face_atom(T)
- step_to(src, T, 0)
-
- if (!walktarget || old_movement)
- return
- if (observed_by_player())
- return
- forceMove(get_turf(walktarget))
-
-/mob/living/carbon/human/npc/proc/CreateWay(direction)
- var/turf/location = get_turf(src)
- for(var/distance = 1 to 50)
- location = get_step(location, direction)
- if(iswallturf(location))
- return location
- for(var/atom/A in location)
- // DARKPACK TODO - reimplement decor
- /*
- if(A.density && !istype(A, /obj/structure/lamppost))
- return location
- */
- if(istype(A, /obj/effect/landmark/npcwall))
- return get_step_towards(location, get_turf(src))
- if(istype(A, /obj/effect/landmark/npcbeacon) && prob(50))
- stopturf = 1
- return get_step(location, direction)
-
-/mob/living/carbon/human/npc/proc/ChoosePath()
- if(!old_movement)
- var/list/possible_list = list()
- for(var/obj/effect/landmark/npcactivity/N in GLOB.npc_activities)
- if(get_dist(src, N) < 64)
- var/turf/T = get_step(N, turn(get_dir(src, N), 180))
- var/obj/effect/landmark/npcability/A = locate() in T
- if(A)
- if(N.x > x-3 && N.x < x+3)
- possible_list += N
- if(N.y > y-3 && N.y < y+3)
- possible_list += N
- if(!length(possible_list))
- var/atom/shitshit
- for(var/obj/effect/landmark/npcactivity/N in GLOB.npc_activities)
- if(!shitshit)
- shitshit = N
- if(get_dist(src, N) > 1 && get_dist(src, N) < get_dist(src, shitshit))
- shitshit = N
- if(shitshit)
- return shitshit
- else if (length(GLOB.npc_activities))
- return pick(GLOB.npc_activities)
- else
- return
-
- return pick(possible_list)
- else
- var/turf/north_steps = CreateWay(NORTH)
- var/turf/south_steps = CreateWay(SOUTH)
- var/turf/west_steps = CreateWay(WEST)
- var/turf/east_steps = CreateWay(EAST)
-
- if(dir == NORTH || dir == SOUTH)
- if(get_dist(src, west_steps) >= 7 && get_dist(src, east_steps) >= 7)
- return(pick(west_steps, east_steps))
- if(get_dist(src, west_steps) > get_dist(src, east_steps))
- if(prob(75))
- return west_steps
- else if(get_dist(src, east_steps) > get_dist(src, west_steps))
- if(prob(75))
- return east_steps
- else
- if(dir == NORTH)
- return pick(west_steps, east_steps, south_steps)
- else
- return pick(west_steps, east_steps, north_steps)
-
- if(dir == WEST || dir == EAST)
- if(get_dist(src, north_steps) >= 7 && get_dist(src, south_steps) >= 7)
- return pick(north_steps, south_steps)
- if(get_dist(src, north_steps) > get_dist(src, south_steps))
- if(prob(75))
- return north_steps
- else if(get_dist(src, south_steps) > get_dist(src, north_steps))
- if(prob(75))
- return south_steps
- else
- if(dir == WEST)
- return pick(north_steps, south_steps, east_steps)
- else
- return pick(north_steps, south_steps, west_steps)
-
-/mob/living/carbon/human/npc/proc/can_npc_move()
- if(stat >= HARD_CRIT)
- return FALSE
- if((last_grab + 1.5 SECONDS) > world.time)
- return FALSE
- if(mind || client)
- return FALSE
- if(IsSleeping())
- return FALSE
- if(IsUnconscious())
- return FALSE
- if(IsParalyzed())
- return FALSE
- if(IsKnockdown())
- return FALSE
- if(IsStun())
- return FALSE
- if(HAS_TRAIT(src, TRAIT_RESTRAINED))
- return FALSE
- if(is_talking)
- return FALSE
- if(pulledby)
- if (HAS_TRAIT(pulledby, TRAIT_CHARMER))
- return FALSE
- if (prob(30))
- execute_resist()
- return FALSE
-
- return TRUE
-
-/mob/living/carbon/human/npc/proc/observed_by_player()
- for (var/mob/observing_mob in viewers(DEFAULT_SIGHT_DISTANCE, src))
- if (!observing_mob.client)
- continue
- return TRUE
-
- return FALSE
-
-/mob/living/carbon/human/npc/proc/handle_automated_movement()
- if (!can_npc_move())
- return
-
- if(!staying)
- lifespan += 1
- if(!walktarget && !staying)
- stopturf = rand(1, 2)
- walktarget = ChoosePath()
- face_atom(walktarget)
-
- // Can't do anything if in a container
- if (!isturf(loc))
- return
-
- // Checks for fire, clearing the stored fire if none is in view
- afraid_of_fire = locate(/obj/effect/abstract/turf_fire) in view(DEFAULT_SIGHT_DISTANCE, src)
-
- // Combat behaviour
- if (danger_source)
- // Run away from the danger source if they aren't aggressive and have no weapon
- if (!has_weapon && !aggressive)
- GLOB.move_manager.move_away(src, danger_source, 10, cached_multiplicative_slowdown)
- else
- // Criminals will attack anyone, others will only attack non-police
- // DARKPACK TODO - reimplement IDs
- /*
- var/obj/item/card/id/id_card = danger_source.get_idcard(FALSE)
- if (!istype(id_card, /obj/item/card/id/police) || is_criminal)
- */
- if(!spawned_weapon && has_weapon)
- npc_draw_weapon()
- if(spawned_weapon && get_active_held_item() != my_weapon)
- has_weapon = FALSE
- if(danger_source)
- if(danger_source == src)
- danger_source = null
- else
- ClickOn(danger_source)
- face_atom(danger_source)
- GLOB.move_manager.move_to(src, danger_source, 1, cached_multiplicative_slowdown)
-
- // Deaggro if the danger source has been beaten up
- if (danger_source.stat > UNCONSCIOUS)
- end_combat()
-
- // Deaggro if 30 second have passed since being antagonised
- if ((last_antagonised + 30 SECONDS) <= world.time)
- end_combat()
-
- // Running away from fire behaviour
- else if (afraid_of_fire)
- GLOB.move_manager.move_away(src, afraid_of_fire, 10, cached_multiplicative_slowdown)
- if (prob(25))
- emote("scream")
-
- // Walking around behaviour
- else if (walktarget && !staying)
- if (prob(25))
- toggle_move_intent(src)
- GLOB.move_manager.move_to(src, walktarget, 0, cached_multiplicative_slowdown)
-
- if (!has_weapon || danger_source || !spawned_weapon)
- return
- if (get_active_held_item() == my_weapon)
- npc_stow_weapon()
- else
- has_weapon = FALSE
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/bacotell.dm b/modular_darkpack/modules/npc/code/human/npc_types/bacotell.dm
deleted file mode 100644
index b3dddea9d542..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_types/bacotell.dm
+++ /dev/null
@@ -1,7 +0,0 @@
-/mob/living/carbon/human/npc/bacotell
- staying = TRUE
-
-/mob/living/carbon/human/npc/bacotell/Initialize(mapload)
- . = ..()
-
- AssignSocialRole(/datum/socialrole/shop/bacotell)
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/bandit.dm b/modular_darkpack/modules/npc/code/human/npc_types/bandit.dm
deleted file mode 100644
index 13a32c525d40..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_types/bandit.dm
+++ /dev/null
@@ -1,8 +0,0 @@
-/mob/living/carbon/human/npc/bandit
- max_stat = HARD_CRIT
- my_backup_weapon_type = /obj/item/knife/vamp
-
-/mob/living/carbon/human/npc/bandit/Initialize(mapload)
- . = ..()
-
- AssignSocialRole(/datum/socialrole/bandit)
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/bouncers/__bouncer.dm b/modular_darkpack/modules/npc/code/human/npc_types/bouncers/__bouncer.dm
deleted file mode 100644
index ab7e28d2e9df..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_types/bouncers/__bouncer.dm
+++ /dev/null
@@ -1,185 +0,0 @@
-/mob/living/carbon/human/npc/bouncer
-
- //Assigns an ID to NPCs that guard certain doors, must match a barrier's ID
- var/protected_zone_id = "test"
-
- var/list/denial_phrases = list("I HAVE NO DENIAL PHRASE")
- var/list/entry_phrases = list("I HAVE NO ENTRY PHRASE")
- var/list/police_block_phrases = list("I HAVE NO POLICE BAN PHRASE")
- var/list/block_phrases = list("I HAVE NO BLOCK PHRASE")
-
- staying = TRUE
-
- var/left_home_at = 0
- var/walk_home_timer = 2 MINUTES
- var/warp_home_timer = 30 SECONDS
-
-
- var/datum/vip_barrier_perm/linked_perm = null
-
- var/message_cooldown = 0
- var/repeat_delay = 8 SECONDS
- var/resume_neutral_direction_delay = 4 SECONDS
-
- var/is_dominated = FALSE //Whether or not the man is dominated
- var/is_in_awe = FALSE //Whether or not the man is being hit by presence
-
- var/turf/start_turf = null //Where the creature spawns so it can return from whence it came
- var/our_role = /datum/socialrole/bouncer
-
- var/is_guarding = TRUE
-
- my_weapon_type = /obj/item/gun/ballistic/shotgun/vampire
- my_backup_weapon_type = /obj/item/melee/baton/vamp
-
- //Behavior settings
- aggressive=TRUE
-
-/mob/living/carbon/human/npc/bouncer/Initialize(mapload)
- .=..()
-
- if(mapload && src.type == /mob/living/carbon/human/npc/bouncer)
- CRASH("Bouncer created using default type, please use a child of this type in mapping.")
-
- AssignSocialRole(our_role)
-
- start_turf = get_turf(src)
-
- RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(yearn_for_home))
- RegisterSignal(src, COMSIG_MOB_STATCHANGE, PROC_REF(stat_change_process_is_guarding))
-
- if(SSbouncer_barriers.vip_barrier_perms?[protected_zone_id])
- linked_perm = SSbouncer_barriers.vip_barrier_perms[protected_zone_id]
- linked_perm.add_bouncer(src)
- else if(mapload && SSbouncer_barriers.initialized)
- CRASH("A Bouncer was created for vip_barrier_perms that were not loaded!")
-
-/mob/living/carbon/human/npc/bouncer/Destroy()
- if(linked_perm)
- linked_perm.linked_bouncers -= src
- linked_perm = null
-
- return ..()
-
-/mob/living/carbon/human/npc/bouncer/on_knockedout_trait_gain(datum/source)
- ..()
- set_is_guarding_false()
-
-/mob/living/carbon/human/npc/bouncer/on_immobilized_trait_gain(datum/source)
- ..()
- set_is_guarding_false()
-
-/mob/living/carbon/human/npc/bouncer/on_restrained_trait_gain(datum/source)
- ..()
- set_is_guarding_false()
-
-/mob/living/carbon/human/npc/bouncer/on_knockedout_trait_loss(datum/source)
- ..()
- set_is_guarding_true()
-
-/mob/living/carbon/human/npc/bouncer/on_immobilized_trait_loss(datum/source)
- ..()
- set_is_guarding_true()
-
-/mob/living/carbon/human/npc/bouncer/on_restrained_trait_loss(datum/source)
- ..()
- set_is_guarding_true()
-
-
-/mob/living/carbon/human/npc/bouncer/AssignSocialRole(datum/socialrole/bouncer/role, dont_random = FALSE)
- . = ..(role, dont_random)
-
- if(role && ispath(role, /datum/socialrole/bouncer))
- var/datum/socialrole/bouncer/social_role = new role()
- denial_phrases = social_role.denial_phrases
- entry_phrases = social_role.entry_phrases
- police_block_phrases = social_role.police_block_phrases
- block_phrases = social_role.block_phrases
- my_weapon_type = role.bouncer_weapon_type
- my_backup_weapon_type = role.bouncer_backup_weapon_type
-
-/mob/living/carbon/human/npc/bouncer/proc/stat_change_process_is_guarding(datum/source, statchange)
- if(statchange >= HARD_CRIT)
- is_guarding = FALSE
- if(statchange == DEAD)
- linked_perm.process_dead_bouncer(src)
- else if (!HAS_TRAIT(src, TRAIT_RESTRAINED) && !HAS_TRAIT(src, TRAIT_KNOCKEDOUT) && !HAS_TRAIT(src, TRAIT_IMMOBILIZED))
- is_guarding = TRUE
- go_home()
- else
- return
- linked_perm.check_barrier_guarded()
-
-/mob/living/carbon/human/npc/bouncer/proc/set_is_guarding_true(datum/source)
- if(stat >= HARD_CRIT)
- return
- is_guarding = TRUE
- go_home()
- linked_perm.check_barrier_guarded()
-
-/mob/living/carbon/human/npc/bouncer/proc/set_is_guarding_false(datum/source)
- is_guarding = FALSE
- linked_perm.check_barrier_guarded()
-
-
-//when the bouncer moves, they try to return home after awhile
-/mob/living/carbon/human/npc/bouncer/proc/yearn_for_home()
- SIGNAL_HANDLER
- if((get_turf(src) != start_turf) && !left_home_at)
- left_home_at = world.time
- addtimer(CALLBACK(src, PROC_REF(go_home)), walk_home_timer)
- else if((get_turf(src) == start_turf) && left_home_at)
- left_home_at = 0
-
-//mob tries to return home if its timer is up.
-/mob/living/carbon/human/npc/bouncer/proc/go_home()
- if(get_turf(src) == start_turf || !is_guarding)
- return
-
- if(left_home_at + walk_home_timer <= world.time)
- danger_source = null
- walk_to(src, start_turf, 1, cached_multiplicative_slowdown)
- addtimer(CALLBACK(src, PROC_REF(position_hard_reset)), warp_home_timer)
-
-/mob/living/carbon/human/npc/bouncer/proc/position_hard_reset()
- if(is_guarding && get_turf(src) != start_turf)
- danger_source = null
- forceMove(start_turf)
-
-
-
-/mob/living/carbon/human/npc/bouncer/examine(mob/user)
- .=..()
-
- if(can_be_reasoned_with() && in_range(src, user))
- var/list/interact_options = list(
- "Persuade for Entry" = image(icon = 'icons/obj/toys/dice.dmi', icon_state = "d10"))
-
- var/obj/item/held_item = user.get_active_held_item()
- if(held_item && istype(held_item, /obj/item/card/police))
- interact_options["Show Badge"] = image(icon = held_item.icon, icon_state = held_item.icon_state)
- var/picked_option = show_radial_menu(user, src, interact_options, radius = 38, require_near = TRUE)
- switch(picked_option)
- if("Persuade for Entry")
- to_chat(user, span_notice("You try to talk your way through."))
- linked_perm.notify_barrier_social_bypass(user, src)
- if("Show Badge")
- to_chat(user, span_notice("You flash your [held_item] as you try to talk your way through."))
- linked_perm.notify_barrier_social_bypass(user, src, TRUE)
-
-
-/mob/living/carbon/human/npc/bouncer/proc/can_be_reasoned_with()
- if(!is_guarding || get_turf(src)!=start_turf)
- return FALSE
- return TRUE
-
-
-/mob/living/carbon/human/npc/bouncer/proc/speak_seldom(phrase, mob/target)
- if(can_be_reasoned_with() && world.time > message_cooldown)
- message_cooldown = world.time + repeat_delay
- realistic_say(phrase)
- dir = get_dir(loc, get_turf(target))
- addtimer(CALLBACK(src, PROC_REF(resume_neutral_direction)), resume_neutral_direction_delay)
-
-/mob/living/carbon/human/npc/bouncer/proc/resume_neutral_direction()
- dir = initial(dir)
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/bouncers/bouncer_elysium.dm b/modular_darkpack/modules/npc/code/human/npc_types/bouncers/bouncer_elysium.dm
deleted file mode 100644
index 8d31f5902e11..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_types/bouncers/bouncer_elysium.dm
+++ /dev/null
@@ -1,15 +0,0 @@
-/mob/living/carbon/human/npc/bouncer/elysium
- our_role = /datum/socialrole/bouncer/elysium
- protected_zone_id = "elysium"
-
-/mob/living/carbon/human/npc/bouncer/elysium/elysium_2
- protected_zone_id = "elysium_2"
-
-/mob/living/carbon/human/npc/bouncer/elysium/stripclub
- protected_zone_id = "elysium_strip"
-
-/mob/living/carbon/human/npc/bouncer/elysium/theatre
- protected_zone_id = "elysium_theatre"
-
-/mob/living/carbon/human/npc/bouncer/elysium/theatre_backdoor
- protected_zone_id = "theatre_backdoor"
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/bouncers/bouncer_endron.dm b/modular_darkpack/modules/npc/code/human/npc_types/bouncers/bouncer_endron.dm
deleted file mode 100644
index 672d0ce6bda1..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_types/bouncers/bouncer_endron.dm
+++ /dev/null
@@ -1,18 +0,0 @@
-/mob/living/carbon/human/npc/bouncer/endron
- our_role = /datum/socialrole/bouncer/endron
- protected_zone_id = "endron"
-
-/mob/living/carbon/human/npc/bouncer/endron/endron_2
- our_role = /datum/socialrole/bouncer/endron/endron_2
- protected_zone_id = "endron_2"
-
-/mob/living/carbon/human/npc/bouncer/endron/endron_backdoor
- protected_zone_id = "endron_backdoor"
-
-/mob/living/carbon/human/npc/bouncer/endron/endron_lab
- our_role = /datum/socialrole/bouncer/endron/endron_lab
- protected_zone_id = "endron_lab"
-
-/mob/living/carbon/human/npc/bouncer/endron/endron_lab_2
- our_role = /datum/socialrole/bouncer/endron/endron_lab_2
- protected_zone_id = "endron_lab_2"
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/bouncers/bouncer_giovanni.dm b/modular_darkpack/modules/npc/code/human/npc_types/bouncers/bouncer_giovanni.dm
deleted file mode 100644
index a7d45997964f..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_types/bouncers/bouncer_giovanni.dm
+++ /dev/null
@@ -1,3 +0,0 @@
-/mob/living/carbon/human/npc/bouncer/giovanni
- our_role = /datum/socialrole/bouncer/giovanni
- protected_zone_id = "giovanni"
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/bubway.dm b/modular_darkpack/modules/npc/code/human/npc_types/bubway.dm
deleted file mode 100644
index fd9f001ebe59..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_types/bubway.dm
+++ /dev/null
@@ -1,7 +0,0 @@
-/mob/living/carbon/human/npc/bubway
- staying = TRUE
-
-/mob/living/carbon/human/npc/bubway/Initialize(mapload)
- . = ..()
-
- AssignSocialRole(/datum/socialrole/shop/bubway)
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/business.dm b/modular_darkpack/modules/npc/code/human/npc_types/business.dm
deleted file mode 100644
index 268eb97456d0..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_types/business.dm
+++ /dev/null
@@ -1,8 +0,0 @@
-/mob/living/carbon/human/npc/business
- bloodquality = BLOOD_QUALITY_HIGH
-
-/mob/living/carbon/human/npc/business/Initialize(mapload)
- . = ..()
-
- var/datum/socialrole/assign_role = pick(/datum/socialrole/richmale, /datum/socialrole/richfemale)
- AssignSocialRole(assign_role)
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/club.dm b/modular_darkpack/modules/npc/code/human/npc_types/club.dm
deleted file mode 100644
index 49743c088214..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_types/club.dm
+++ /dev/null
@@ -1,28 +0,0 @@
-/mob/living/carbon/human/npc/walkby/club
- staying = TRUE
-
-/mob/living/carbon/human/npc/walkby/club/Life()
- . = ..()
-
- if (!staying || stat >= UNCONSCIOUS)
- return
- if (!prob(5))
- return
-
- INVOKE_ASYNC(src, PROC_REF(dance_at_jukebox))
-
-/mob/living/carbon/human/npc/walkby/club/proc/dance_at_jukebox()
- var/hasjukebox = FALSE
- for (var/obj/machinery/jukebox/jukebox in range(5, src))
- hasjukebox = TRUE
-
- // Hacky check for if it's currently playing
- if (jukebox.static_power_usage != ACTIVE_POWER_USE)
- continue
- if (prob(50))
- dancefirst(src)
- else
- dancesecond(src)
-
- if (!hasjukebox)
- staying = FALSE
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/garden.dm b/modular_darkpack/modules/npc/code/human/npc_types/garden.dm
deleted file mode 100644
index 4b0b1227923b..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_types/garden.dm
+++ /dev/null
@@ -1,8 +0,0 @@
-/mob/living/carbon/human/npc/garden
- staying = TRUE
- is_talking = TRUE
-
-/mob/living/carbon/human/npc/garden/Initialize(mapload)
- . = ..()
-
- AssignSocialRole(/datum/socialrole/shop/garden)
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/guard.dm b/modular_darkpack/modules/npc/code/human/npc_types/guard.dm
deleted file mode 100644
index 02735da8cb25..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_types/guard.dm
+++ /dev/null
@@ -1,11 +0,0 @@
-/mob/living/carbon/human/npc/guard
- staying = TRUE
- aggressive = TRUE
- max_stat = DEAD
- my_weapon_type = /obj/item/gun/ballistic/automatic/pistol/darkpack/m1911
- my_backup_weapon_type = /obj/item/melee/baton/vamp
-
-/mob/living/carbon/human/npc/guard/Initialize(mapload)
- . = ..()
-
- AssignSocialRole(/datum/socialrole/guard)
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/gummaguts.dm b/modular_darkpack/modules/npc/code/human/npc_types/gummaguts.dm
deleted file mode 100644
index 82bfe1881c06..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_types/gummaguts.dm
+++ /dev/null
@@ -1,7 +0,0 @@
-/mob/living/carbon/human/npc/gummaguts
- staying = TRUE
-
-/mob/living/carbon/human/npc/gummaguts/Initialize(mapload)
- . = ..()
-
- AssignSocialRole(/datum/socialrole/shop/gummaguts)
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/hobo.dm b/modular_darkpack/modules/npc/code/human/npc_types/hobo.dm
deleted file mode 100644
index 3ac55810a3bf..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_types/hobo.dm
+++ /dev/null
@@ -1,9 +0,0 @@
-/mob/living/carbon/human/npc/hobo
- bloodquality = BLOOD_QUALITY_LOW
- old_movement = TRUE
-
-/mob/living/carbon/human/npc/hobo/Initialize(mapload)
- . = ..()
-
- var/datum/socialrole/assign_role = pick(/datum/socialrole/poormale, /datum/socialrole/poorfemale)
- AssignSocialRole(assign_role)
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/illegal.dm b/modular_darkpack/modules/npc/code/human/npc_types/illegal.dm
deleted file mode 100644
index 25f5ef547e89..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_types/illegal.dm
+++ /dev/null
@@ -1,8 +0,0 @@
-/mob/living/carbon/human/npc/illegal
- staying = TRUE
- is_talking = TRUE
-
-/mob/living/carbon/human/npc/illegal/Initialize(mapload)
- . = ..()
-
- AssignSocialRole(/datum/socialrole/shop/illegal)
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/incel.dm b/modular_darkpack/modules/npc/code/human/npc_types/incel.dm
deleted file mode 100644
index 41ffe46480a0..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_types/incel.dm
+++ /dev/null
@@ -1,7 +0,0 @@
-/mob/living/carbon/human/npc/incel
- staying = TRUE
-
-/mob/living/carbon/human/npc/incel/Initialize(mapload)
- . = ..()
-
- AssignSocialRole(/datum/socialrole/usualmale)
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/police.dm b/modular_darkpack/modules/npc/code/human/npc_types/police.dm
deleted file mode 100644
index 4fecde205789..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_types/police.dm
+++ /dev/null
@@ -1,26 +0,0 @@
-/mob/living/carbon/human/npc/police
- aggressive = TRUE
- max_stat = DEAD
- my_backup_weapon_type = /obj/item/melee/baton/vamp
-
-/mob/living/carbon/human/npc/police/Initialize(mapload)
- . = ..()
-
- AssignSocialRole(/datum/socialrole/police)
-
-/mob/living/carbon/human/npc/police/Life()
- . = ..()
-
- if (stat >= SOFT_CRIT)
- return
- if (!prob(10))
- return
-
- INVOKE_ASYNC(src, PROC_REF(check_for_criminals))
-
-/mob/living/carbon/human/npc/police/proc/check_for_criminals()
- for (var/mob/living/carbon/human/H in oviewers(4, src))
- if (!H.warrant)
- continue
-
- Aggro(H, FALSE)
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/shop.dm b/modular_darkpack/modules/npc/code/human/npc_types/shop.dm
deleted file mode 100644
index 4d2459c23756..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_types/shop.dm
+++ /dev/null
@@ -1,8 +0,0 @@
-/mob/living/carbon/human/npc/shop
- staying = TRUE
- is_talking = TRUE
-
-/mob/living/carbon/human/npc/shop/Initialize(mapload)
- . = ..()
-
- AssignSocialRole(/datum/socialrole/shop)
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/stripper.dm b/modular_darkpack/modules/npc/code/human/npc_types/stripper.dm
deleted file mode 100644
index 84c314572b70..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_types/stripper.dm
+++ /dev/null
@@ -1,28 +0,0 @@
-/mob/living/carbon/human/npc/stripper
- staying = TRUE
-
-/mob/living/carbon/human/npc/stripper/Initialize(mapload)
- . = ..()
-
- AssignSocialRole(/datum/socialrole/stripfemale)
-
- underwear = "Nude"
- undershirt = "Nude"
- socks = "Nude"
-
- update_body()
-
-/mob/living/carbon/human/npc/stripper/Life()
- . = ..()
-
- if (stat >= UNCONSCIOUS)
- return
- if (!prob(20))
- return
-
- INVOKE_ASYNC(src, PROC_REF(pole_dance))
-
-/mob/living/carbon/human/npc/stripper/proc/pole_dance()
- for (var/obj/structure/pole/pole in range(1, src))
- drop_all_held_items()
- ClickOn(pole)
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/walkby.dm b/modular_darkpack/modules/npc/code/human/npc_types/walkby.dm
deleted file mode 100644
index 669409a160fb..000000000000
--- a/modular_darkpack/modules/npc/code/human/npc_types/walkby.dm
+++ /dev/null
@@ -1,7 +0,0 @@
-/mob/living/carbon/human/npc/walkby
-
-/mob/living/carbon/human/npc/walkby/Initialize(mapload)
- . = ..()
-
- var/datum/socialrole/assign_role = pick(/datum/socialrole/usualmale, /datum/socialrole/usualfemale)
- AssignSocialRole(assign_role)
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/__socialrole.dm b/modular_darkpack/modules/npc/code/human/socialroles/__socialrole.dm
deleted file mode 100644
index 022f044594a8..000000000000
--- a/modular_darkpack/modules/npc/code/human/socialroles/__socialrole.dm
+++ /dev/null
@@ -1,359 +0,0 @@
-/datum/socialrole
- //For randomizing
- var/list/s_tones = list(
- "albino",
- "caucasian1",
- "caucasian2",
- "caucasian3",
- "latino",
- "mediterranean",
- "asian1",
- "asian2",
- "arab",
- "indian",
- "african1",
- "african2",
- )
- var/min_age = 18
- var/max_age = 85
- var/preferred_gender
- var/list/male_names = list(
- "Jack",
- "Robert",
- "Cornelius",
- "Tyler"
- )
- var/list/female_names = list(
- "Marla"
- )
- var/list/surnames = list(
- "Durden",
- "Polson",
- "Singer"
- )
-
- //Hair shit
- var/list/hair_colors = list(
- "040404", //Black
- "120b05", //Dark Brown
- "342414", //Brown
- "554433", //Light Brown
- "695c3b", //Dark Blond
- "ad924e", //Blond
- "dac07f", //Light Blond
- "802400", //Ginger
- "a5380e", //Ginger alt
- "ffeace", //Albino
- "650b0b", //Punk Red
- "14350e", //Punk Green
- "080918", //Punk Blue
- )
- var/list/male_hair = list(
- "Bald",
- "Afro",
- "Afro 2",
- "Afro (Large)",
- "Balding Hair",
- "Bedhead",
- "Bedhead 2",
- "Bedhead 3",
- "Boddicker",
- "Bowlcut",
- "Bowlcut 2",
- "Business Hair",
- "Business Hair 2",
- "Business Hair 3",
- "Business Hair 4",
- "Bun (Manbun)",
- "Buzzcut",
- "Comet",
- "CIA",
- "Coffee House",
- "Combover",
- "Crewcut",
- "Father",
- "Flat Top",
- "Gelled Back",
- "Joestar",
- "Keanu Hair",
- "Mohawk",
- "Mohawk (Shaved)",
- "Mohawk (Unshaven)",
- "Oxton",
- "Pompadour",
- "Ronin",
- "Shaved",
- )
- var/list/male_facial = list(
- "Beard (Abraham Lincoln)",
- "Beard (Chinstrap)",
- "Beard (Dwarf)",
- "Beard (Full)",
- "Beard (Cropped Fullbeard)",
- "Beard (Goatee)",
- "Beard (Hipster)",
- "Beard (Neckbeard)",
- "Beard (Very Long)",
- "Beard (Martial Artist)",
- "Beard (Moonshiner)",
- "Beard (Long)",
- "Beard (Volaju)",
- "Beard (Three o Clock Shadow)",
- "Beard (Five o Clock Shadow)",
- "Beard (Seven o Clock Shadow)",
- "Moustache (Fu Manchu)",
- "Moustache (Hulk Hogan)",
- "Moustache (Watson)",
- "Sideburns (Elvis)",
- "Sideburns (Mutton Chops)",
- "Sideburns",
- "Shaved",
- )
- var/list/female_hair = list(
- "Ahoge",
- "Long Bedhead",
- "Beehive",
- "Beehive 2",
- "Bob Hair",
- "Bob Hair 2",
- "Bob Hair 3",
- "Bob Hair 4",
- "Bobcurl",
- "Braided",
- "Braided Front",
- "Braid (Short)",
- "Braid (Low)",
- "Bun Head",
- "Bun Head 2",
- "Bun Head 3",
- "Bun (Large)",
- "Bun (Tight)",
- "Double Bun",
- "Emo",
- "Emo Fringe",
- "Feather",
- "Gentle",
- "Long Hair 1",
- "Long Hair 2",
- "Long Hair 3",
- "Long Over Eye",
- "Long Emo",
- "Long Fringe",
- "Ponytail",
- "Ponytail 2",
- "Ponytail 3",
- "Ponytail 4",
- "Ponytail 5",
- "Ponytail 6",
- "Ponytail 7",
- "Ponytail (High)",
- "Ponytail (Short)",
- "Ponytail (Long)",
- "Ponytail (Country)",
- "Ponytail (Fringe)",
- "Poofy",
- "Short Hair Rosa",
- "Shoulder-length Hair",
- "Volaju",
- )
-
- // TODO: refactor this into a premade outfit
- var/list/backpacks = list(
- /obj/item/storage/backpack/satchel,
- /obj/item/storage/backpack/satchel/leather
- )
- var/list/shoes = list()
- var/list/uniforms = list()
- var/list/belts = list()
- var/list/suits = list()
- var/list/hats = list()
- var/list/gloves = list()
- var/list/masks = list()
- var/list/neck = list()
- var/list/ears = list()
- var/list/glasses = list()
- var/list/inhand_items = list()
- var/list/pockets = list()
-
- //For workers and police
- var/obj/item/card/id/id_type
-
- //What will npc use in fight, if so
- var/obj/item/melee/melee_weapon
- var/obj/item/gun/range_weapon
-
- //For reaction
- var/list/male_phrases = list(
- "My wife is waiting for me at home...",
- "Sorry, pal, not today.",
- "Go find yourself someone at the bar, I'm busy.",
- )
- var/list/female_phrases = list(
- "Buy yourself a watch.",
- "I'm going to scream if you keep it up!",
- "Don't touch me.",
- )
- var/list/neutral_phrases = list(
- "Fuck off.",
- "Go on your way.",
- "Not the best time to talk right now, pal.",
- "Мgmmph...",
- "Do I know you?",
- "I don't have much time.",
- )
- var/list/random_phrases = list(
- "You a foreigner?...",
- "It seems I've been going around here in circles for the third time, already.",
- "Watch where you're walkin'!",
- "Go back to the drains where you came from.",
- "Tourists... Pheh.",
- "Rumors travel fast.",
- )
- var/list/answer_phrases = list(
- "I agree.",
- "Yes-yes...",
- "Exactly.",
- "Maybe.",
- "Exactly.",
- "Affirmative..",
- )
- var/list/help_phrases = list(
- "Help!",
- "Help Me!!",
- "What the hell's going on here!?",
- "Shoot!!",
- )
- var/list/car_dodged = list(
- "WOAH!",
- "Watch where you're going!",
- "Holy shit!",
- "Watch it!",
- "Learn to drive!",
- "You almost ran me over!",
- "What the fuck!?",
- )
-
- var/is_criminal = FALSE
-
-/mob/living/carbon/human/npc/proc/AssignSocialRole(datum/socialrole/S, dont_random)
- socialrole = new S()
-
- fully_replace_character_name(name, real_name)
-
- storyteller_stat_holder.randomize_attributes(1, max_stat)
- storyteller_stat_holder.randomize_abilities(0, max_stat)
-
- maxHealth = round(initial(maxHealth)+(initial(maxHealth)/3)*(st_get_stat(STAT_STAMINA)))
- health = round(initial(health)+(initial(health)/3)*(st_get_stat(STAT_STAMINA)))
- last_health = health
-
- is_criminal = socialrole.is_criminal
- if (check_holidays(FESTIVE_SEASON))
- if (!length(socialrole.suits))
- socialrole.suits = list(
- /obj/item/clothing/suit/vampire/coat/winter,
- /obj/item/clothing/suit/vampire/coat/winter/alt
- )
- if (!length(socialrole.neck) && prob(50))
- socialrole.neck = list(
- /obj/item/clothing/neck/vampire/scarf/red,
- /obj/item/clothing/neck/vampire/scarf,
- /obj/item/clothing/neck/vampire/scarf/blue,
- /obj/item/clothing/neck/vampire/scarf/green,
- /obj/item/clothing/neck/vampire/scarf/white
- )
-
- if(!dont_random)
- gender = pick(MALE, FEMALE)
- if(socialrole.preferred_gender)
- gender = socialrole.preferred_gender
- physique = gender
- var/list/m_names = list()
- var/list/f_names = list()
- var/list/s_names = list()
- var/random_name
- if(socialrole.male_names)
- m_names = socialrole.male_names
- else
- m_names = GLOB.first_names_male
- if(socialrole.female_names)
- f_names = socialrole.female_names
- else
- f_names = GLOB.first_names_female
- if(socialrole.surnames)
- s_names = socialrole.surnames
- else
- s_names = GLOB.last_names
- age = rand(socialrole.min_age, socialrole.max_age)
- skin_tone = pick(socialrole.s_tones)
-
- if (age >= 55)
- set_haircolor("a2a2a2")
- set_facial_haircolor(hair_color)
- else
- set_haircolor(pick(socialrole.hair_colors))
- set_facial_haircolor(hair_color)
- if (gender == MALE)
- set_hairstyle(pick(socialrole.male_hair))
- if (prob(25) || age >= 25)
- set_facial_hairstyle(pick(socialrole.male_facial))
- else
- set_facial_hairstyle("Shaved")
- random_name = "[pick(m_names)] [pick(s_names)]"
- fully_replace_character_name(newname = random_name)
- else
- set_hairstyle(pick(socialrole.female_hair))
- set_facial_hairstyle("Shaved")
- random_name = "[pick(f_names)] [pick(s_names)]"
- fully_replace_character_name(newname = random_name)
-
- set_eye_color(random_eye_color())
-
- underwear = random_underwear(gender)
- if (prob(50))
- underwear_color = eye_color_left
- if (prob(50) || gender == FEMALE)
- undershirt = random_undershirt(gender)
- if (prob(25))
- socks = random_socks()
-
- update_body()
-
- // this should be refactored into just... applying a premade outfit
- var/datum/outfit/O = new()
- if(length(socialrole.backpacks))
- O.back = pick(socialrole.backpacks)
- if(length(socialrole.uniforms))
- O.uniform = pick(socialrole.uniforms)
- if(length(socialrole.belts))
- O.belt = pick(socialrole.belts)
- if(length(socialrole.suits))
- O.suit = pick(socialrole.suits)
- if(length(socialrole.gloves))
- O.gloves = pick(socialrole.gloves)
- if(length(socialrole.shoes))
- O.shoes = pick(socialrole.shoes)
- if(length(socialrole.hats))
- O.head = pick(socialrole.hats)
- if(length(socialrole.masks))
- O.mask = pick(socialrole.masks)
- if(length(socialrole.neck))
- O.neck = pick(socialrole.neck)
- if(length(socialrole.ears))
- O.ears = pick(socialrole.ears)
- if(length(socialrole.glasses))
- O.glasses = pick(socialrole.glasses)
- if(length(socialrole.inhand_items))
- O.r_hand = pick(socialrole.inhand_items)
- if(socialrole.id_type)
- O.id = socialrole.id_type
- if(O.uniform && length(socialrole.pockets))
- O.l_pocket = pick(socialrole.pockets)
- if(length(socialrole.pockets) > 1 && prob(50))
- var/list/another_pocket = socialrole.pockets.Copy()
- another_pocket -= O.l_pocket
- O.r_pocket = pick(another_pocket)
- equipOutfit(O)
- qdel(O)
-
- dna.update_dna_identity()
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/bandit.dm b/modular_darkpack/modules/npc/code/human/socialroles/bandit.dm
deleted file mode 100644
index c844a20283c6..000000000000
--- a/modular_darkpack/modules/npc/code/human/socialroles/bandit.dm
+++ /dev/null
@@ -1,145 +0,0 @@
-
-/datum/socialrole/bandit
- s_tones = list(
- "albino",
- "caucasian1",
- "caucasian2",
- "caucasian3",
- "latino",
- "mediterranean",
- "asian1",
- "asian2",
- "arab",
- "indian",
- "african1",
- "african2"
- )
-
- min_age = 18
- max_age = 45
- preferred_gender = MALE
- male_names = null
- surnames = null
- is_criminal = TRUE
-
- hair_colors = list(
- "040404", //Black
- "120b05", //Dark Brown
- "342414", //Brown
- "554433" //Light Brown
- )
- male_hair = list(
- "Balding Hair",
- "Bedhead",
- "Bedhead 2",
- "Bedhead 3",
- "Boddicker",
- "Business Hair",
- "Business Hair 2",
- "Business Hair 3",
- "Business Hair 4",
- "Coffee House",
- "Combover",
- "Crewcut",
- "Father",
- "Flat Top",
- "Gelled Back",
- "Joestar",
- "Keanu Hair",
- "Oxton",
- "Volaju"
- )
- male_facial = list(
- "Beard (Abraham Lincoln)",
- "Beard (Chinstrap)",
- "Beard (Full)",
- "Beard (Cropped Fullbeard)",
- "Beard (Hipster)",
- "Beard (Neckbeard)",
- "Beard (Three o Clock Shadow)",
- "Beard (Five o Clock Shadow)",
- "Beard (Seven o Clock Shadow)",
- "Moustache (Hulk Hogan)",
- "Moustache (Watson)",
- "Sideburns (Elvis)",
- "Sideburns",
- "Shaved"
- )
-
- shoes = list(
- /obj/item/clothing/shoes/vampire/sneakers,
- /obj/item/clothing/shoes/vampire/sneakers/red,
- /obj/item/clothing/shoes/vampire/jackboots
- )
- uniforms = list(
- /obj/item/clothing/under/vampire/larry,
- /obj/item/clothing/under/vampire/bandit,
- /obj/item/clothing/under/vampire/biker
- )
- hats = list(
- /obj/item/clothing/head/vampire/bandana,
- /obj/item/clothing/head/vampire/bandana/red,
- /obj/item/clothing/head/vampire/bandana/black,
- /obj/item/clothing/head/vampire/beanie,
- /obj/item/clothing/head/vampire/beanie/black
- )
- pockets = list(
- // /obj/item/stack/dollar/rand,
- /obj/item/vamp/keys/hack
- )
-
- //[Lucia] - this has been edited to have better English because it included slurs, but none of the others have yet
- male_phrases = list(
- "Whatchu staring at?",
- "Tryina threaten me or sumthin'?",
- "You need somethin'?",
- "You've got some balls, that's for sure.",
- "You know who I work for?",
- "Get the hell outta here, 'fore I get my gang on yo' ass.",
- "You need sumn' punk?",
- "Get lost, liberal.",
- "Get outta this side of town.",
- "Think you scare me? You know who I work for?",
- "Think you're hot shit?"
- )
- neutral_phrases = list(
- "Why you starin' at me like that?",
- "Another dumbass tryin' to look threatening.",
- "Halloween's over, what's with the costumes.",
- "I think that whore gave me the clap.",
- "Gotta get home soon, family to feed and all that.",
- "Get lost, liberal.",
- "I think.. I miss my wife.",
- "What? You need somethin?",
- "Outta my way.",
- "Piss off asshole, ain't in the mood for your shit.",
- "Fuck off."
- )
- random_phrases = list(
- "Dumbass.",
- "I miss my girl...",
- "What's wrong bro?",
- "GOOD. FUCKING. EVENING.",
- "Evenin.",
- "Y'know I saw you sellin' dope, right?",
- "We're fucking doomed...",
- "It's over...",
- "Guh..."
- )
- answer_phrases = list(
- "I've got it...",
- "Fucking hellhole, this whole town.",
- "Shit, man.",
- "You don' look like I know you.. Do I know you?",
- "Right.",
- "Uhmm... Cool I guess",
- "Had some good food over at gummaguts, stomach hurts though..."
- )
- help_phrases = list(
- "God, not again!",
- "Fucking FREAK!",
- "What the hell are you doing!?",
- "You fucked up!",
- "Check yo' self, fool!",
- "We got shit, shit that'll shut you up for good!"
- )
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/guard.dm b/modular_darkpack/modules/npc/code/human/socialroles/guard.dm
deleted file mode 100644
index 6e763b549244..000000000000
--- a/modular_darkpack/modules/npc/code/human/socialroles/guard.dm
+++ /dev/null
@@ -1,98 +0,0 @@
-/datum/socialrole/guard
- s_tones = list(
- "albino",
- "caucasian1",
- "caucasian2",
- "caucasian3"
- )
-
- min_age = 18
- max_age = 85
- preferred_gender = MALE
- male_names = null
- surnames = null
-
- hair_colors = list(
- "040404", //Black
- "120b05", //Dark Brown
- "342414", //Brown
- "554433", //Light Brown
- "695c3b", //Dark Blond
- "ad924e", //Blond
- "dac07f", //Light Blond
- "802400", //Ginger
- "a5380e", //Ginger alt
- "ffeace", //Albino
- "650b0b", //Punk Red
- "14350e", //Punk Green
- "080918" //Punk Blue
- )
- male_hair = list(
- "Balding Hair",
- "Bedhead",
- "Bedhead 2",
- "Bedhead 3",
- "Boddicker",
- "Business Hair",
- "Business Hair 2",
- "Business Hair 3",
- "Business Hair 4",
- "Coffee House",
- "Combover",
- "Crewcut",
- "Father",
- "Flat Top",
- "Gelled Back",
- "Joestar",
- "Keanu Hair",
- "Oxton",
- "Volaju"
- )
- male_facial = list(
- "Beard (Abraham Lincoln)",
- "Beard (Chinstrap)",
- "Beard (Full)",
- "Beard (Cropped Fullbeard)",
- "Beard (Hipster)",
- "Beard (Neckbeard)",
- "Beard (Three o Clock Shadow)",
- "Beard (Five o Clock Shadow)",
- "Beard (Seven o Clock Shadow)",
- "Moustache (Hulk Hogan)",
- "Moustache (Watson)",
- "Sideburns (Elvis)",
- "Sideburns",
- "Shaved"
- )
-
- shoes = list(/obj/item/clothing/shoes/vampire)
- uniforms = list(/obj/item/clothing/under/vampire/guard)
-
- // pockets = list(/obj/item/vamp/keys/npc, /obj/item/stack/dollar/rand)
-
- neutral_phrases = list(
- "No loitering.",
- "I'm kinda, like, a cop, you know.",
- "I could go for some bearclaws right about now.",
- "Like the uniform?",
- "Hey, catch me later, I'll buy you a beer."
- )
- neutral_phrases = list(
- "No loitering.",
- "I'm kinda, like, a cop, you know?",
- "I could go for some bearclaws right about now.",
- "Like the uniform?",
- "Hey, catch me later, I'll buy you a beer."
- )
- random_phrases = list(
- "It's been a real quiet night.",
- "My brothers and father are security guards, too."
- )
- answer_phrases = list("I need some coffee.")
- help_phrases = list(
- "It's go time!",
- "Stop right there!!",
- "Drop your weapon!",
- "Freeze!!",
- "Not just a mall cop, you know!"
- )
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/police.dm b/modular_darkpack/modules/npc/code/human/socialroles/police.dm
deleted file mode 100644
index 090afed6fb32..000000000000
--- a/modular_darkpack/modules/npc/code/human/socialroles/police.dm
+++ /dev/null
@@ -1,153 +0,0 @@
-/datum/socialrole/police
- s_tones = list(
- "albino",
- "caucasian1",
- "caucasian2",
- "caucasian3"
- )
-
- min_age = 18
- max_age = 45
- male_names = null
- surnames = null
-
- hair_colors = list(
- "040404", //Black
- "120b05", //Dark Brown
- "342414", //Brown
- "554433", //Light Brown
- "695c3b", //Dark Blond
- "ad924e", //Blond
- "dac07f", //Light Blond
- "802400", //Ginger
- "a5380e", //Ginger alt
- "ffeace", //Albino
- )
-
- male_hair = list(
- "Balding Hair",
- "Bedhead",
- "Bedhead 2",
- "Bedhead 3",
- "Boddicker",
- "Business Hair",
- "Business Hair 2",
- "Business Hair 3",
- "Business Hair 4",
- "Coffee House",
- "Combover",
- "Crewcut",
- "Father",
- "Flat Top",
- "Gelled Back",
- "Joestar",
- "Keanu Hair",
- "Oxton",
- "Volaju",
- )
-
- female_hair = list(
- "Ahoge",
- "Bob Hair",
- "Bob Hair 2",
- "Bob Hair 3",
- "Bob Hair 4",
- "Bobcurl",
- "Braided",
- "Braided Front",
- "Braid (Short)",
- "Braid (Low)",
- "Bun Head",
- "Bun Head 2",
- "Bun Head 3",
- "Bun (Large)",
- "Bun (Tight)",
- "Gentle",
- "Long Hair 1",
- "Long Hair 2",
- "Long Hair 3",
- "Short Hair Rosa",
- "Shoulder-length Hair",
- "Volaju"
- )
-
-
- male_facial = list(
- "Beard (Abraham Lincoln)",
- "Beard (Chinstrap)",
- "Beard (Full)",
- "Beard (Cropped Fullbeard)",
- "Beard (Hipster)",
- "Beard (Neckbeard)",
- "Beard (Three o Clock Shadow)",
- "Beard (Five o Clock Shadow)",
- "Beard (Seven o Clock Shadow)",
- "Moustache (Hulk Hogan)",
- "Moustache (Watson)",
- "Sideburns (Elvis)",
- "Sideburns",
- "Shaved",
- )
-
- shoes = list(/obj/item/clothing/shoes/vampire/jackboots)
- uniforms = list(/obj/item/clothing/under/vampire/police)
- hats = list(/obj/item/clothing/head/vampire/police)
- suits = list(/obj/item/clothing/suit/vampire/vest/police)
- // pockets = list(/obj/item/stack/dollar/rand)
-
- male_phrases = list(
- "I see you.",
- "Looking suspicious...",
- "Don't try anything stupid.",
- "Nothing to see here.",
- "We're watching you...Scum.",
- "Have you seen a man in a black coat with black hair?",
- "Citizen.",
- "You catch the game last night?"
- )
-
- neutral_phrases = list(
- "I see you.",
- "Looking suspicious...",
- "Don't try anything stupid.",
- "Nothing to see here.",
- "We're watching you...Scum.",
- "Have you seen a man in a black coat with black hair?",
- "Citizen.",
- "You catch the game last night?"
- )
-
- female_phrases = list(
- "I see you.",
- "Looking suspicious...",
- "Don't try anything stupid.",
- "Nothing to see here.",
- "We're watching you...Scum.",
- "Have you seen a man in a black coat with black hair?",
- "Citizen.",
- "You catch the game last night?"
- )
-
- random_phrases = list(
- "I see you.",
- "Looking suspicious...",
- "Don't try anything stupid.",
- "Nothing to see here.",
- "We're watching you...Scum.",
- "Have you seen a man in a black coat with black hair?",
- "Citizen.",
- "You catch the game last night?",
- )
- answer_phrases = list(
- "I'm here to protect you."
- )
- help_phrases = list(
- "Lay down!",
- "Stop right there!!",
- "Drop your weapon!",
- "Stop there right now!!",
- "This is SFPD, hands on your head!",
- "You have the right to remain silent!",
- "Bush gave me the right to kick your head in!",
- "I'm gonna beat you harder than the Eagles got beat by the Patriots!",
- )
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/poorfemale.dm b/modular_darkpack/modules/npc/code/human/socialroles/poorfemale.dm
deleted file mode 100644
index 61cd4130effc..000000000000
--- a/modular_darkpack/modules/npc/code/human/socialroles/poorfemale.dm
+++ /dev/null
@@ -1,124 +0,0 @@
-/datum/socialrole/poorfemale
- s_tones = list("albino",
- "caucasian1",
- "caucasian2",
- "caucasian3",
- "latino",
- "mediterranean",
- "asian1",
- "asian2",
- "arab",
- "indian",
- "african1",
- "african2")
-
- min_age = 45
- max_age = 85
- preferred_gender = FEMALE
- female_names = null
- surnames = null
-
- hair_colors = list(
- "040404", //Black
- "120b05", //Dark Brown
- "342414", //Brown
- "554433", //Light Brown
- "695c3b", //Dark Blond
- "ad924e", //Blond
- "dac07f", //Light Blond
- "802400", //Ginger
- "a5380e", //Ginger alt
- "ffeace", //Albino
- "650b0b", //Punk Red
- "14350e", //Punk Green
- "080918" //Punk Blue
- )
- female_hair = list(
- "Ahoge",
- "Long Bedhead",
- "Beehive",
- "Beehive 2",
- "Bob Hair",
- "Bob Hair 2",
- "Bob Hair 3",
- "Bob Hair 4",
- "Bobcurl",
- "Braided",
- "Braided Front",
- "Braid (Short)",
- "Braid (Low)",
- "Bun Head",
- "Bun Head 2",
- "Bun Head 3",
- "Bun (Large)",
- "Bun (Tight)",
- "Double Bun",
- "Emo",
- "Emo Fringe",
- "Feather",
- "Gentle",
- "Long Hair 1",
- "Long Hair 2",
- "Long Hair 3",
- "Long Over Eye",
- "Long Emo",
- "Long Fringe",
- "Ponytail",
- "Ponytail 2",
- "Ponytail 3",
- "Ponytail 4",
- "Ponytail 5",
- "Ponytail 6",
- "Ponytail 7",
- "Ponytail (High)",
- "Ponytail (Short)",
- "Ponytail (Long)",
- "Ponytail (Country)",
- "Ponytail (Fringe)",
- "Poofy",
- "Short Hair Rosa",
- "Shoulder-length Hair",
- "Volaju"
- )
-
- shoes = list(/obj/item/clothing/shoes/vampire/brown)
- uniforms = list(/obj/item/clothing/under/vampire/homeless/female)
- suits = list(/obj/item/clothing/suit/vampire/coat/alt)
- hats = list(/obj/item/clothing/head/vampire/beanie/homeless)
-
- female_phrases = list(
- "Fuck, shit, daa-amn...",
- "We're fucked!",
- "Grubrhggsmm...",
- "Brrr.",
- "Drunk..."
- )
- neutral_phrases = list(
- "Fuck, shit, daa-amn...",
- "We're fucked!",
- "Grubrhggsmm...",
- "Brrr.",
- "Drunk..."
- )
- random_phrases = list(
- "Fuck, shit, daa-amn...",
- "We're fucked!",
- "Grubrhggsmm...",
- "Brrr.",
- "Drunk..."
- )
- answer_phrases = list(
- "Fuck, shit, daa-amn...",
- "We're fucked!",
- "Grubrhggsmm...",
- "Brrr.",
- "Drunk..."
- )
- help_phrases = list(
- "Aaaugh!",
- "AAAAHHHH!!",
- "What the fuck? WHO'RE YOU?!",
- "Shit!",
- "Ass!",
- "Dick!"
- )
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/poormale.dm b/modular_darkpack/modules/npc/code/human/socialroles/poormale.dm
deleted file mode 100644
index 8f5458df18ff..000000000000
--- a/modular_darkpack/modules/npc/code/human/socialroles/poormale.dm
+++ /dev/null
@@ -1,121 +0,0 @@
-/datum/socialrole/poormale
- s_tones = list("albino",
- "caucasian1",
- "caucasian2",
- "caucasian3",
- "latino",
- "mediterranean",
- "asian1",
- "asian2",
- "arab",
- "indian",
- "african1",
- "african2")
-
- min_age = 45
- max_age = 85
- preferred_gender = MALE
- male_names = null
- surnames = null
-
- hair_colors = list(
- "040404", //Black
- "120b05", //Dark Brown
- "342414", //Brown
- "554433", //Light Brown
- "695c3b", //Dark Blond
- "ad924e", //Blond
- "dac07f", //Light Blond
- "802400", //Ginger
- "a5380e", //Ginger alt
- "ffeace", //Albino
- "650b0b", //Punk Red
- "14350e", //Punk Green
- "080918" //Punk Blue
- )
- male_hair = list(
- "Balding Hair",
- "Bedhead",
- "Bedhead 2",
- "Bedhead 3",
- "Boddicker",
- "Business Hair",
- "Business Hair 2",
- "Business Hair 3",
- "Business Hair 4",
- "Coffee House",
- "Combover",
- "Crewcut",
- "Father",
- "Flat Top",
- "Gelled Back",
- "Joestar",
- "Keanu Hair",
- "Oxton",
- "Volaju"
- )
- male_facial = list(
- "Beard (Abraham Lincoln)",
- "Beard (Chinstrap)",
- "Beard (Full)",
- "Beard (Cropped Fullbeard)",
- "Beard (Hipster)",
- "Beard (Neckbeard)",
- "Beard (Three o Clock Shadow)",
- "Beard (Five o Clock Shadow)",
- "Beard (Seven o Clock Shadow)",
- "Moustache (Hulk Hogan)",
- "Moustache (Watson)",
- "Sideburns (Elvis)",
- "Sideburns"
- )
-
- shoes = list(/obj/item/clothing/shoes/vampire/jackboots/work)
- uniforms = list(/obj/item/clothing/under/vampire/homeless)
- suits = list(/obj/item/clothing/suit/vampire/coat)
- hats = list(/obj/item/clothing/head/vampire/beanie/black)
- gloves = list(/obj/item/clothing/gloves/vampire/work)
- neck = list(
- /obj/item/clothing/neck/vampire/scarf/red,
- /obj/item/clothing/neck/vampire/scarf,
- /obj/item/clothing/neck/vampire/scarf/blue,
- /obj/item/clothing/neck/vampire/scarf/green,
- /obj/item/clothing/neck/vampire/scarf/white
- )
-
- male_phrases = list(
- "Fuck, shit, daa-amn...",
- "We're fucked!",
- "Grubrhggsmm...",
- "Brrr.",
- "Drunk..."
- )
- neutral_phrases = list(
- "Fuck, shit, daa-amn...",
- "We're fucked!",
- "Grubrhggsmm...",
- "Brrr.",
- "Drunk..."
- )
- random_phrases = list(
- "Fuck, shit, daa-amn...",
- "We're fucked!",
- "Grubrhggsmm...",
- "Brrr.",
- "Drunk..."
- )
- answer_phrases = list(
- "Fuck, shit, daa-amn...",
- "We're fucked!",
- "Grubrhggsmm...",
- "Brrr.",
- "Drunk..."
- )
- help_phrases = list(
- "Aaaugh!",
- "AAAAHHHH!!",
- "What da' fuck? WHO'RE YOU?!",
- "Shit!",
- "Ass!",
- "Dick!"
- )
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/richfemale.dm b/modular_darkpack/modules/npc/code/human/socialroles/richfemale.dm
deleted file mode 100644
index 21898bc459da..000000000000
--- a/modular_darkpack/modules/npc/code/human/socialroles/richfemale.dm
+++ /dev/null
@@ -1,90 +0,0 @@
-/datum/socialrole/richfemale
- s_tones = list(
- "albino",
- "caucasian1",
- "caucasian2"
- )
-
- min_age = 18
- max_age = 85
- preferred_gender = FEMALE
- female_names = null
- surnames = null
-
- hair_colors = list(
- "040404", //Black
- "120b05", //Dark Brown
- "342414", //Brown
- "554433", //Light Brown
- "695c3b", //Dark Blond
- "ad924e", //Blond
- "dac07f", //Light Blond
- "802400", //Ginger
- "a5380e", //Ginger alt
- "ffeace", //Albino
- "650b0b", //Punk Red
- "14350e", //Punk Green
- "080918" //Punk Blue
- )
- female_hair = list(
- "Ahoge",
- "Bob Hair",
- "Bob Hair 2",
- "Bob Hair 3",
- "Bob Hair 4",
- "Bobcurl",
- "Braided",
- "Braided Front",
- "Braid (Short)",
- "Braid (Low)",
- "Bun Head",
- "Bun Head 2",
- "Bun Head 3",
- "Bun (Large)",
- "Bun (Tight)",
- "Gentle",
- "Long Hair 1",
- "Long Hair 2",
- "Long Hair 3",
- "Short Hair Rosa",
- "Shoulder-length Hair",
- "Volaju"
- )
-
- shoes = list(
- /obj/item/clothing/shoes/vampire/heels,
- /obj/item/clothing/shoes/vampire/heels/red
- )
- uniforms = list(/obj/item/clothing/under/vampire/business)
- pockets = list(
- /obj/item/vamp/keys/npc,
- // /obj/item/stack/dollar/fifty,
- // /obj/item/stack/dollar/hundred
- )
-
- female_phrases = list(
- "Whaddya want, I'm busy!",
- "Excuse me, do you know the way to the pyramid?",
- "...What?",
- "I'm going somewhere important, not like you'd get it.",
- "Get lost, filthy hobo...",
- "Get lost, peasant...",
- "You been to the bar tonight? It's a good place for hobos like you...",
- "Stop doing that, imbecile."
- )
- neutral_phrases = list(
- "Did you ask something?",
- "Excuse me?",
- "What?",
- "I'm going somewhere important.",
- "Get lost, peasant...",
- "Whaa-aat...",
- "Stop doing that, imbecile."
- )
- help_phrases = list(
- "What in the god damn?!",
- "Go away or I will call the cops!!",
- "What is happening?!",
- "Stop doing this!",
- "Someone, call the ambulance!"
- )
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/richmale.dm b/modular_darkpack/modules/npc/code/human/socialroles/richmale.dm
deleted file mode 100644
index e67f5e38a3f0..000000000000
--- a/modular_darkpack/modules/npc/code/human/socialroles/richmale.dm
+++ /dev/null
@@ -1,90 +0,0 @@
-/datum/socialrole/richmale
- s_tones = list(
- "albino",
- "caucasian1",
- "caucasian2"
- )
-
- min_age = 18
- max_age = 85
- preferred_gender = MALE
- male_names = null
- surnames = null
-
- hair_colors = list(
- "040404", //Black
- "120b05", //Dark Brown
- "342414", //Brown
- "554433", //Light Brown
- "695c3b", //Dark Blond
- "ad924e", //Blond
- "dac07f", //Light Blond
- "802400", //Ginger
- "a5380e", //Ginger alt
- "ffeace", //Albino
- "650b0b", //Punk Red
- "14350e", //Punk Green
- "080918" //Punk Blue
- )
- male_hair = list(
- "Business Hair",
- "Business Hair 2",
- "Business Hair 3",
- "Business Hair 4",
- "Coffee House",
- "Combover",
- "Crewcut",
- "Father",
- "Flat Top",
- "Gelled Back",
- "Joestar",
- "Keanu Hair",
- "Oxton",
- "Volaju"
- )
- male_facial = list(
- "Beard (Neckbeard)",
- "Beard (Three o Clock Shadow)",
- "Sideburns (Elvis)",
- "Sideburns",
- "Shaved"
- )
-
- shoes = list(
- /obj/item/clothing/shoes/vampire,
- /obj/item/clothing/shoes/vampire/white
- )
- uniforms = list(/obj/item/clothing/under/vampire/rich)
- inhand_items = list(/obj/item/storage/briefcase)
- pockets = list(
- /obj/item/vamp/keys/npc,
- // /obj/item/stack/dollar/fifty,
- // /obj/item/stack/dollar/hundred
- )
-
- male_phrases = list(
- "Did you ask something?",
- "My stocks! my stocks! They're falling...!",
- "You know, eventually we'll have our money on the computer, and the computer will do our taxes for us!",
- "I'm going somewhere important... unlike you.",
- "Get lost, filthy hobo...",
- "Ugh, work has me up so late, they better be paying me more...",
- "Finally quit that stupid job... so glad I moved here."
- )
- neutral_phrases = list(
- "Did you say somethin..?",
- "Excuse me?",
- "Hm? What is it?",
- "I've got to get going, got somewhere important to be.",
- "Get lost, jackass, get a job or something",
- "Get lost, peasant...",
- "Huh..? Sorry, the coffee hasn't kicked in.",
- "it's the middle of the night, I don't wanna deal with your shit right now."
- )
- help_phrases = list(
- "What in the god damn?!",
- "I'm calling the cops!",
- "OH HELL NO.",
- "That ain't gonna be happening to me!",
- "Someone, call the cops!"
- )
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/shop/__shop.dm b/modular_darkpack/modules/npc/code/human/socialroles/shop/__shop.dm
deleted file mode 100644
index 2d22c86c64e1..000000000000
--- a/modular_darkpack/modules/npc/code/human/socialroles/shop/__shop.dm
+++ /dev/null
@@ -1,109 +0,0 @@
-/datum/socialrole/shop
- s_tones = list(
- "albino",
- "caucasian1",
- "caucasian2",
- "caucasian3",
- "latino",
- "mediterranean",
- "asian1",
- "asian2",
- "arab",
- "indian",
- "african1",
- "african2"
- )
-
- min_age = 18
- max_age = 45
- preferred_gender = MALE
- male_names = null
- surnames = null
-
- hair_colors = list(
- "040404", //Black
- "120b05", //Dark Brown
- "342414", //Brown
- "554433", //Light Brown
- "695c3b", //Dark Blond
- "ad924e", //Blond
- "dac07f", //Light Blond
- "802400", //Ginger
- "a5380e", //Ginger alt
- "ffeace", //Albino
- "650b0b", //Punk Red
- "14350e", //Punk Green
- "080918" //Punk Blue
- )
- male_hair = list(
- "Balding Hair",
- "Bedhead",
- "Bedhead 2",
- "Bedhead 3",
- "Boddicker",
- "Business Hair",
- "Business Hair 2",
- "Business Hair 3",
- "Business Hair 4",
- "Coffee House",
- "Combover",
- "Crewcut",
- "Father",
- "Flat Top",
- "Gelled Back",
- "Joestar",
- "Keanu Hair",
- "Oxton",
- "Volaju"
- )
- male_facial = list(
- "Beard (Abraham Lincoln)",
- "Beard (Chinstrap)",
- "Beard (Full)",
- "Beard (Cropped Fullbeard)",
- "Beard (Hipster)",
- "Beard (Neckbeard)",
- "Beard (Three o Clock Shadow)",
- "Beard (Five o Clock Shadow)",
- "Beard (Seven o Clock Shadow)",
- "Moustache (Hulk Hogan)",
- "Moustache (Watson)",
- "Sideburns (Elvis)",
- "Sideburns",
- "Shaved"
- )
-
- shoes = list(
- /obj/item/clothing/shoes/vampire/sneakers,
- /obj/item/clothing/shoes/vampire,
- /obj/item/clothing/shoes/vampire/brown
- )
- uniforms = list(/obj/item/clothing/under/vampire/mechanic)
- pockets = list(
- /obj/item/vamp/keys/npc,
- // /obj/item/stack/dollar/rand
- )
-
- male_phrases = list(
- "Wanna buy something?",
- "Can I help?",
- "Hey, wanna buy it?"
- )
- neutral_phrases = list(
- "Wanna buy something?",
- "Can I help?",
- "Hey, wanna buy it?"
- )
- random_phrases = list(
- "Check this!",
- "Can I help?",
- "Hey, wanna buy it?"
- )
- answer_phrases = list("I just work here...")
- help_phrases = list(
- "What in the god damn?!",
- "Go away or I will call the cops!!",
- "What is happening?!",
- "Stop doing this!",
- "Someone, call the ambulance!"
- )
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/shop/bacotell.dm b/modular_darkpack/modules/npc/code/human/socialroles/shop/bacotell.dm
deleted file mode 100644
index 62ad3f067a0d..000000000000
--- a/modular_darkpack/modules/npc/code/human/socialroles/shop/bacotell.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-/datum/socialrole/shop/bacotell
- uniforms = list(/obj/item/clothing/under/vampire/bacotell)
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/shop/bubway.dm b/modular_darkpack/modules/npc/code/human/socialroles/shop/bubway.dm
deleted file mode 100644
index 39c5b4cb95cc..000000000000
--- a/modular_darkpack/modules/npc/code/human/socialroles/shop/bubway.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-/datum/socialrole/shop/bubway
- uniforms = list(/obj/item/clothing/under/vampire/bubway)
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/shop/garden.dm b/modular_darkpack/modules/npc/code/human/socialroles/shop/garden.dm
deleted file mode 100644
index 2ed7bfed9370..000000000000
--- a/modular_darkpack/modules/npc/code/human/socialroles/shop/garden.dm
+++ /dev/null
@@ -1,15 +0,0 @@
-/datum/socialrole/shop/garden //community garden
- neutral_phrases = list(
- "Would you like to buy something?",
- "Everything is non-invasive and climate appropriate!",
- "Sorry, we're out of bags."
- )
- random_phrases = list(
- "Just let me know when you're ready.",
- "Next, here, please!",
- )
- help_phrases = list(
- "Why would you do that?!",
- "Take what you want, let me go!",
- "Someone, get a doctor!"
- )
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/shop/gummaguts.dm b/modular_darkpack/modules/npc/code/human/socialroles/shop/gummaguts.dm
deleted file mode 100644
index 01c69491f038..000000000000
--- a/modular_darkpack/modules/npc/code/human/socialroles/shop/gummaguts.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-/datum/socialrole/shop/gummaguts
- uniforms = list(/obj/item/clothing/under/vampire/gummaguts)
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/shop/illegal.dm b/modular_darkpack/modules/npc/code/human/socialroles/shop/illegal.dm
deleted file mode 100644
index a7657a396225..000000000000
--- a/modular_darkpack/modules/npc/code/human/socialroles/shop/illegal.dm
+++ /dev/null
@@ -1,28 +0,0 @@
-/datum/socialrole/shop/illegal
- masks = list(/obj/item/clothing/mask/vampire/balaclava)
- shoes = list(/obj/item/clothing/shoes/vampire/sneakers)
- uniforms = list(/obj/item/clothing/under/vampire/emo)
- // pockets = list(/obj/item/stack/dollar/rand)
-
- male_phrases = list(
- "Pss... wanna try some weed?",
- "Hey, vagabond...",
- "Check this shit..."
- )
- neutral_phrases = list(
- "Pss... wanna try some weed?",
- "Hey, vagabond...",
- "Check this shit..."
- )
- random_phrases = list(
- "Pss... wanna try some weed?",
- "Hey, vagabond...",
- "Check this shit..."
- )
- answer_phrases = list("Nothing personal...")
- help_phrases = list(
- "Cops!",
- "Fuck the police!!",
- "COPS?!!"
- )
- is_criminal = TRUE
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/stripfemale.dm b/modular_darkpack/modules/npc/code/human/socialroles/stripfemale.dm
deleted file mode 100644
index 2754c3464ede..000000000000
--- a/modular_darkpack/modules/npc/code/human/socialroles/stripfemale.dm
+++ /dev/null
@@ -1,133 +0,0 @@
-/datum/socialrole/stripfemale
- s_tones = list(
- "albino",
- "caucasian1",
- "caucasian2",
- "caucasian3",
- "latino",
- "mediterranean",
- "asian1",
- "asian2",
- "arab",
- "indian",
- "african1",
- "african2"
- )
-
- min_age = 18
- max_age = 30
- preferred_gender = FEMALE
- female_names = null
- surnames = null
-
- hair_colors = list(
- "040404", //Black
- "120b05", //Dark Brown
- "342414", //Brown
- "554433", //Light Brown
- "695c3b", //Dark Blond
- "ad924e", //Blond
- "dac07f", //Light Blond
- "802400", //Ginger
- "a5380e", //Ginger alt
- "ffeace", //Albino
- "650b0b", //Punk Red
- "14350e", //Punk Green
- "080918" //Punk Blue
- )
- female_hair = list(
- "Ahoge",
- "Long Bedhead",
- "Beehive",
- "Beehive 2",
- "Bob Hair",
- "Bob Hair 2",
- "Bob Hair 3",
- "Bob Hair 4",
- "Bobcurl",
- "Braided",
- "Braided Front",
- "Braid (Short)",
- "Braid (Low)",
- "Bun Head",
- "Bun Head 2",
- "Bun Head 3",
- "Bun (Large)",
- "Bun (Tight)",
- "Double Bun",
- "Emo",
- "Emo Fringe",
- "Feather",
- "Gentle",
- "Long Hair 1",
- "Long Hair 2",
- "Long Hair 3",
- "Long Over Eye",
- "Long Emo",
- "Long Fringe",
- "Ponytail",
- "Ponytail 2",
- "Ponytail 3",
- "Ponytail 4",
- "Ponytail 5",
- "Ponytail 6",
- "Ponytail 7",
- "Ponytail (High)",
- "Ponytail (Short)",
- "Ponytail (Long)",
- "Ponytail (Country)",
- "Ponytail (Fringe)",
- "Poofy",
- "Short Hair Rosa",
- "Shoulder-length Hair",
- "Volaju"
- )
-
- shoes = list(/obj/item/clothing/shoes/vampire/heels)
- uniforms = list(/obj/item/clothing/under/vampire/burlesque)
- backpacks = list()
-
- female_phrases = list(
- "No touching~.",
- "Like what you see?",
- "Wanna play?",
- "He-he.",
- "Want a private dance?...",
- "Sit and rest.",
- "Do you like this?",
- "Ahh..."
- )
- neutral_phrases = list(
- "No touching~.",
- "Like what you see?",
- "Wanna play?",
- "He-he.",
- "Want a private dance?...",
- "Sit and rest.",
- "Do you like this?",
- "Ahh..."
- )
- random_phrases = list(
- "No touching~.",
- "Like what you see?",
- "Wanna play?",
- "He-he.",
- "Want a private dance?...",
- "Sit and rest.",
- "Do you like this?",
- "Ahh..."
- )
- answer_phrases = list(
- "That'll cost...",
- "He-he-he.",
- "Twenty bucks.",
- "Sure you do..."
- )
- help_phrases = list(
- "Oh God!",
- "Ahhh!!",
- "I'm just a stripper!",
- "Stop!",
- "Help me!",
- "Help!"
- )
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/usualfemale.dm b/modular_darkpack/modules/npc/code/human/socialroles/usualfemale.dm
deleted file mode 100644
index 33a67b316759..000000000000
--- a/modular_darkpack/modules/npc/code/human/socialroles/usualfemale.dm
+++ /dev/null
@@ -1,147 +0,0 @@
-/datum/socialrole/usualfemale
- s_tones = list(
- "albino",
- "caucasian1",
- "caucasian2",
- "caucasian3",
- "latino",
- "mediterranean",
- "asian1",
- "asian2",
- "arab",
- "indian",
- "african1",
- "african2"
- )
-
- min_age = 18
- max_age = 85
- preferred_gender = FEMALE
- female_names = null
- surnames = null
- hair_colors = list(
- "040404", //Black
- "120b05", //Dark Brown
- "342414", //Brown
- "554433", //Light Brown
- "695c3b", //Dark Blond
- "ad924e", //Blond
- "dac07f", //Light Blond
- "802400", //Ginger
- "a5380e", //Ginger alt
- "ffeace", //Albino
- "650b0b", //Punk Red
- "14350e", //Punk Green
- "080918" //Punk Blue
- )
- female_hair = list(
- "Ahoge",
- "Long Bedhead",
- "Beehive",
- "Beehive 2",
- "Bob Hair",
- "Bob Hair 2",
- "Bob Hair 3",
- "Bob Hair 4",
- "Bobcurl",
- "Braided",
- "Braided Front",
- "Braid (Short)",
- "Braid (Low)",
- "Bun Head",
- "Bun Head 2",
- "Bun Head 3",
- "Bun (Large)",
- "Bun (Tight)",
- "Double Bun",
- "Emo",
- "Emo Fringe",
- "Feather",
- "Gentle",
- "Long Hair 1",
- "Long Hair 2",
- "Long Hair 3",
- "Long Over Eye",
- "Long Emo",
- "Long Fringe",
- "Ponytail",
- "Ponytail 2",
- "Ponytail 3",
- "Ponytail 4",
- "Ponytail 5",
- "Ponytail 6",
- "Ponytail 7",
- "Ponytail (High)",
- "Ponytail (Short)",
- "Ponytail (Long)",
- "Ponytail (Country)",
- "Ponytail (Fringe)",
- "Poofy",
- "Short Hair Rosa",
- "Shoulder-length Hair",
- "Volaju"
- )
-
- shoes = list(
- /obj/item/clothing/shoes/vampire/heels,
- /obj/item/clothing/shoes/vampire/sneakers,
- /obj/item/clothing/shoes/vampire/jackboots
- )
- uniforms = list(
- /obj/item/clothing/under/vampire/black,
- /obj/item/clothing/under/vampire/red,
- /obj/item/clothing/under/vampire/gothic
- )
- pockets = list(
- /obj/item/vamp/keys/npc,
- // /obj/item/stack/dollar/rand
- )
-
- female_phrases = list(
- "What do you need?",
- "Do you need something?",
- "Do I really need to answer?",
- "I'm late.",
- "Pervert...",
- "Can't speak right now.",
- "Buy yourself a watch",
- "Hey.",
- "Go away."
- )
- neutral_phrases = list(
- "What do you need?",
- "Do you need something?",
- "Do I really need to answer?",
- "I'm late.",
- "Pervert...",
- "Can't speak right now.",
- "Buy yourself a watch",
- "Hey.",
- "Go away."
- )
- random_phrases = list(
- "Hey, fatso!",
- "I miss my beer...",
- "What's up?",
- "Heyyyyy.",
- "Do I know you?",
- "There's something wrong with this city, you know?",
- "Oh, wow."
- )
- answer_phrases = list(
- "I'm trying...",
- "Crazy.",
- "Things aren't good, baby.",
- "You mixed me up with someone else.",
- "Yeah, exactly.",
- "Okay...",
- "Fine."
- )
- help_phrases = list(
- "Oh God!",
- "Go away!!",
- "What the heck is happening?!",
- "Stop!",
- "Someone, help!",
- "Mommy!"
- )
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/usualmale.dm b/modular_darkpack/modules/npc/code/human/socialroles/usualmale.dm
deleted file mode 100644
index fdcd21ba712b..000000000000
--- a/modular_darkpack/modules/npc/code/human/socialroles/usualmale.dm
+++ /dev/null
@@ -1,142 +0,0 @@
-/datum/socialrole/usualmale
- s_tones = list(
- "albino",
- "caucasian1",
- "caucasian2",
- "caucasian3",
- "latino",
- "mediterranean",
- "asian1",
- "asian2",
- "arab",
- "indian",
- "african1",
- "african2")
-
- min_age = 18
- max_age = 85
- preferred_gender = MALE
- male_names = null
- surnames = null
-
- hair_colors = list(
- "040404", //Black
- "120b05", //Dark Brown
- "342414", //Brown
- "554433", //Light Brown
- "695c3b", //Dark Blond
- "ad924e", //Blond
- "dac07f", //Light Blond
- "802400", //Ginger
- "a5380e", //Ginger alt
- "ffeace", //Albino
- "650b0b", //Punk Red
- "14350e", //Punk Green
- "080918" //Punk Blue
- )
- male_hair = list(
- "Balding Hair",
- "Bedhead",
- "Bedhead 2",
- "Bedhead 3",
- "Boddicker",
- "Business Hair",
- "Business Hair 2",
- "Business Hair 3",
- "Business Hair 4",
- "Coffee House",
- "Combover",
- "Crewcut",
- "Father",
- "Flat Top",
- "Gelled Back",
- "Joestar",
- "Keanu Hair",
- "Oxton",
- "Volaju"
- )
- male_facial = list(
- "Beard (Abraham Lincoln)",
- "Beard (Chinstrap)",
- "Beard (Full)",
- "Beard (Cropped Fullbeard)",
- "Beard (Hipster)",
- "Beard (Neckbeard)",
- "Beard (Three o Clock Shadow)",
- "Beard (Five o Clock Shadow)",
- "Beard (Seven o Clock Shadow)",
- "Moustache (Hulk Hogan)",
- "Moustache (Watson)",
- "Sideburns (Elvis)",
- "Sideburns",
- "Shaved"
- )
-
- shoes = list(
- /obj/item/clothing/shoes/vampire/sneakers,
- /obj/item/clothing/shoes/vampire,
- /obj/item/clothing/shoes/vampire/brown
- )
- uniforms = list(
- /obj/item/clothing/under/vampire/mechanic,
- /obj/item/clothing/under/vampire/sport,
- /obj/item/clothing/under/vampire/office,
- /obj/item/clothing/under/vampire/sexy,
- /obj/item/clothing/under/vampire/slickback,
- /obj/item/clothing/under/vampire/emo
- )
- pockets = list(
- /obj/item/vamp/keys/npc,
- // /obj/item/stack/dollar/rand
- )
-
- male_phrases = list(
- "Need something? Or are you just trying to waste my time?",
- "What's up?",
- "What'd you say?",
- "I'm late, my wife is gonna kill me.",
- "You heard about the new place in town..?",
- "Can't speak right now.",
- "Good night I guess?",
- "Guh...",
- "I dunno what to say.",
- "That's all, folks."
- )
- neutral_phrases = list(
- "What do you need, mate?",
- "Do you need something?",
- "Can you repeat what you were saying?",
- "I'm late, don't interrupt me.",
- "Check the bar if you want somebody to bother...",
- "Can't speak right now.",
- "Goodnight, I guess?",
- "Guh...",
- "I dunno what to say.",
- "That's all, folks."
- )
- random_phrases = list(
- "Hey, mate!",
- "I miss my beer...",
- "Everything okay?",
- "Hello.",
- "Haven't I seen you around before?",
- "Something wrong here.",
- "Oooh, dude..."
- )
- answer_phrases = list(
- "Trying...",
- "Awesome.",
- "Bad, mate.",
- "You picked wrong person.",
- "Yeah, right.",
- "O'kaay...",
- "Nice."
- )
- help_phrases = list(
- "Oh God!",
- "Go away!!",
- "What the hell is happening?!",
- "Stop!",
- "Someone, help!",
- "Mommy!"
- )
diff --git a/modular_darkpack/modules/vip_areas/code/bouncer_barrier_subsystem.dm b/modular_darkpack/modules/vip_areas/code/bouncer_barrier_subsystem.dm
deleted file mode 100644
index e0d20e97dfc9..000000000000
--- a/modular_darkpack/modules/vip_areas/code/bouncer_barrier_subsystem.dm
+++ /dev/null
@@ -1,17 +0,0 @@
-SUBSYSTEM_DEF(bouncer_barriers)
- name = "Bouncer Barrier"
- flags = SS_NO_FIRE
- init_order = INIT_ORDER_BARRIER
- var/barriers_enabled = TRUE
-
- ///List of vip barriers
- var/list/datum/vip_barrier_perm/vip_barrier_perms = list()
-
-
-/datum/controller/subsystem/bouncer_barriers/Initialize()
- for(var/barrier in subtypesof(/obj/effect/vip_barrier))
- var/obj/effect/vip_barrier/test_barrier = new barrier
- if(!vip_barrier_perms?[test_barrier.protected_zone_id])
- vip_barrier_perms[test_barrier.protected_zone_id] = new /datum/vip_barrier_perm(test_barrier.protected_zone_id)
- qdel(test_barrier)
- return ..()
diff --git a/modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_elysium_role.dm b/modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_elysium_role.dm
deleted file mode 100644
index a08454545c65..000000000000
--- a/modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_elysium_role.dm
+++ /dev/null
@@ -1,3 +0,0 @@
-/datum/socialrole/bouncer/elysium
- suits = list(/obj/item/clothing/suit/vampire/trench)
- glasses = list(/obj/item/clothing/glasses/sunglasses)
diff --git a/modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_endron_role.dm b/modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_endron_role.dm
deleted file mode 100644
index 69c9a86a3ac8..000000000000
--- a/modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_endron_role.dm
+++ /dev/null
@@ -1,49 +0,0 @@
-//DARKPACK TODO - all these endron clothes
-
-/datum/socialrole/bouncer/endron
- bouncer_weapon_type = /obj/item/gun/ballistic/automatic/darkpack/mp5
- bouncer_backup_weapon_type = /obj/item/melee/baton/vamp
- shoes = list(/obj/item/clothing/shoes/vampire/jackboots)
- //uniforms = list(/obj/item/clothing/under/pentex/pentex_turtleneck)
- pockets = list(/obj/item/vamp/keys/npc, /obj/item/stack/dollar/rand)
- gloves = list(/obj/item/clothing/gloves/vampire/work)
- suits = list(/obj/item/clothing/suit/vampire/vest)
- glasses = list(/obj/item/clothing/glasses/vampire/sun)
- hats = list(/obj/item/clothing/head/beret/black)
- masks = list(/obj/item/clothing/mask/vampire/balaclava)
-
-/datum/socialrole/bouncer/endron/endron_lab
- bouncer_weapon_type = /obj/item/gun/ballistic/automatic/darkpack/mp5
- bouncer_backup_weapon_type = /obj/item/melee/baton/vamp
- shoes = list(/obj/item/clothing/shoes/vampire/jackboots)
- //uniforms = list(/obj/item/clothing/under/pentex/pentex_janitor)
- pockets = list(/obj/item/vamp/keys/npc, /obj/item/stack/dollar/rand)
- gloves = list(/obj/item/clothing/gloves/vampire/latex)
- suits = list(/obj/item/clothing/suit/vampire/vest)
- glasses = list(/obj/item/clothing/glasses/vampire/sun)
- hats = list(/obj/item/clothing/head/beret/black)
- masks = list(/obj/item/clothing/mask/gas/explorer)
-
-/datum/socialrole/bouncer/endron/endron_lab_2
- bouncer_weapon_type = /obj/item/gun/ballistic/automatic/darkpack/mp5
- bouncer_backup_weapon_type = /obj/item/melee/baton/vamp
- shoes = list(/obj/item/clothing/shoes/vampire/jackboots)
- //uniforms = list(/obj/item/clothing/under/pentex/pentex_janitor)
- pockets = list(/obj/item/vamp/keys/npc, /obj/item/stack/dollar/rand)
- gloves = list(/obj/item/clothing/gloves/vampire/latex)
- suits = list(/obj/item/clothing/suit/vampire/vest)
- glasses = list(/obj/item/clothing/glasses/vampire/sun)
- hats = list(/obj/item/clothing/head/beret/black)
- masks = list(/obj/item/clothing/mask/gas/explorer)
-
-/datum/socialrole/bouncer/endron/endron_2
- bouncer_weapon_type = /obj/item/gun/ballistic/automatic/pistol/darkpack/deagle
- bouncer_backup_weapon_type = /obj/item/melee/baton/vamp
- shoes = list(/obj/item/clothing/shoes/vampire/jackboots)
- //uniforms = list(/obj/item/clothing/under/pentex/pentex_suit)
- pockets = list(/obj/item/vamp/keys/npc, /obj/item/stack/dollar/rand)
- gloves = list(/obj/item/clothing/gloves/vampire/work)
- suits = list(/obj/item/clothing/suit/vampire/vest)
- glasses = list(/obj/item/clothing/glasses/night)
- hats = list(/obj/item/clothing/head/vampire/pentex_beret)
- masks = list(/obj/item/clothing/mask/gas/sechailer)
diff --git a/modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_giovanni_role.dm b/modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_giovanni_role.dm
deleted file mode 100644
index 6916ad74b560..000000000000
--- a/modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_giovanni_role.dm
+++ /dev/null
@@ -1,3 +0,0 @@
-/datum/socialrole/bouncer/giovanni
- bouncer_weapon_type = /obj/item/gun/ballistic/automatic/darkpack/thompson
- bouncer_backup_weapon_type = null
diff --git a/modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_mob_role.dm b/modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_mob_role.dm
deleted file mode 100644
index 2538d813b5b6..000000000000
--- a/modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_mob_role.dm
+++ /dev/null
@@ -1,177 +0,0 @@
-/datum/socialrole/bouncer
- is_criminal = TRUE
-
- //Appearence
- s_tones = list(
- "albino",
- "caucasian1",
- "caucasian2",
- "caucasian3",
- "latino",
- "mediterranean",
- "asian1",
- "asian2",
- "arab",
- "indian",
- "african1",
- "african2"
- )
-
- min_age = 18
- max_age = 85
- male_names = null
- surnames = null
-
- hair_colors = list(
- "040404", //Black
- "120b05", //Dark Brown
- "342414", //Brown
- "554433", //Light Brown
- "695c3b", //Dark Blond
- "ad924e", //Blond
- "dac07f", //Light Blond
- "802400", //Ginger
- "a5380e", //Ginger alt
- "ffeace", //Albino
- "650b0b", //Punk Red
- "14350e", //Punk Green
- "080918" //Punk Blue
- )
- male_hair = list(
- "Balding Hair",
- "Bedhead",
- "Bedhead 2",
- "Bedhead 3",
- "Boddicker",
- "Business Hair",
- "Business Hair 2",
- "Business Hair 3",
- "Business Hair 4",
- "Coffee House",
- "Combover",
- "Crewcut",
- "Father",
- "Flat Top",
- "Gelled Back",
- "Joestar",
- "Keanu Hair",
- "Oxton",
- "Volaju"
- )
- male_facial = list(
- "Beard (Abraham Lincoln)",
- "Beard (Chinstrap)",
- "Beard (Full)",
- "Beard (Cropped Fullbeard)",
- "Beard (Hipster)",
- "Beard (Neckbeard)",
- "Beard (Three o Clock Shadow)",
- "Beard (Five o Clock Shadow)",
- "Beard (Seven o Clock Shadow)",
- "Moustache (Hulk Hogan)",
- "Moustache (Watson)",
- "Sideburns (Elvis)",
- "Sideburns",
- "Shaved"
- )
-
- female_hair = list("Ahoge",
- "Long Bedhead",
- "Beehive",
- "Beehive 2",
- "Bob Hair",
- "Bob Hair 2",
- "Bob Hair 3",
- "Bob Hair 4",
- "Bobcurl",
- "Braided",
- "Braided Front",
- "Braid (Short)",
- "Braid (Low)",
- "Bun Head",
- "Bun Head 2",
- "Bun Head 3",
- "Bun (Large)",
- "Bun (Tight)",
- "Double Bun",
- "Emo",
- "Emo Fringe",
- "Feather",
- "Gentle",
- "Long Hair 1",
- "Long Hair 2",
- "Long Hair 3",
- "Long Over Eye",
- "Long Emo",
- "Long Fringe",
- "Ponytail",
- "Ponytail 2",
- "Ponytail 3",
- "Ponytail 4",
- "Ponytail 5",
- "Ponytail 6",
- "Ponytail 7",
- "Ponytail (High)",
- "Ponytail (Short)",
- "Ponytail (Long)",
- "Ponytail (Country)",
- "Ponytail (Fringe)",
- "Poofy",
- "Short Hair Rosa",
- "Shoulder-length Hair",
- "Volaju")
-
- shoes = list(/obj/item/clothing/shoes/vampire/jackboots)
- uniforms = list(/obj/item/clothing/under/vampire/guard)
- pockets = list(/obj/item/vamp/keys/npc, /obj/item/stack/dollar/rand)
- backpacks = list()
-
- //Voice Lines
- neutral_phrases = list(
- "Buddy, you'd better step back.",
- "Only VIP's are allowed through here.",
- "Mind your manners."
- )
- random_phrases = list(
- "Real quiet night tonight."
- )
-
- answer_phrases = list("Shit, man.")
- help_phrases = list(
- "It's time you walked out.",
- "Let me show you the door.",
- "We were having a peaceful night, till you showed up.",
- "This is gonna hurt me more than it hurts you."
- )
-
-
- //Phrase said when someone is denied entry
- var/denial_phrases = list(
- "You aren't on the list.",
- "No entry. Not for you.",
- "It's a private gathering, past here."
- )
-
-
- var/entry_phrases = list(
- "Good to see you again.",
- "Welcome to the dark side.",
- "We've been expecting you.",
- "A pleasure, as always."
- )
-
- var/police_block_phrases = list(
- "Fuck Twelve.",
- "Oh yeah? Why don't you come back with a warrant?",
- "You aren't getting in without a warrant.",
- "I know my rights. You stay the hell out."
- )
-
- var/block_phrases = list(
- "I thought we told you to piss off.",
- "For the last time, you aren't getting in.",
- "Nice story, bucko. Now scram."
- )
-
- var/bouncer_weapon_type = /obj/item/gun/ballistic/shotgun/vampire
- var/bouncer_backup_weapon_type = /obj/item/claymore/machete
diff --git a/modular_darkpack/modules/vip_areas/code/vip_barrier_perm.dm b/modular_darkpack/modules/vip_areas/code/vip_barrier_perm.dm
deleted file mode 100644
index 90e82b337528..000000000000
--- a/modular_darkpack/modules/vip_areas/code/vip_barrier_perm.dm
+++ /dev/null
@@ -1,99 +0,0 @@
-//Holds associated lists of walls and bouncers in a single permission network.
-/datum/vip_barrier_perm
- var/name
- var/list/linked_barriers = list()
- var/list/linked_bouncers = list()
- var/actively_guarded = TRUE
-
- var/guard_recheck_lag = 1 SECONDS
-
- //people the guards have determined can pass anyways
- var/list/allow_list = list()
-
- //people the guards have decided to deny no matter what
- var/list/block_list = list("Unknown")
-
-
-/datum/vip_barrier_perm/New(protected_zone_id)
- name = protected_zone_id
-
-//registers bouncer with the perms
-/datum/vip_barrier_perm/proc/add_bouncer(target_bouncer)
- linked_bouncers += target_bouncer
-
-//registers barrier with the perms
-/datum/vip_barrier_perm/proc/add_barrier(target_barrier)
- linked_barriers += target_barrier
- RegisterSignal(target_barrier, COMSIG_BARRIER_NOTIFY_GUARD_BLOCKED, PROC_REF(notify_guard_blocked))
- RegisterSignal(target_barrier, COMSIG_BARRIER_NOTIFY_GUARD_ENTRY, PROC_REF(notify_guard_entry))
-
-
-//handles bouncer death
-/datum/vip_barrier_perm/proc/process_dead_bouncer(mob/living/carbon/human/npc/bouncer/dead_bouncer)
- dead_bouncer.is_guarding = FALSE
- linked_bouncers -= dead_bouncer
- if(!linked_bouncers)
- for(var/obj/effect/vip_barrier/barrier in linked_barriers)
- UnregisterSignal(barrier, COMSIG_BARRIER_NOTIFY_GUARD_BLOCKED)
- UnregisterSignal(barrier, COMSIG_BARRIER_NOTIFY_GUARD_ENTRY)
-
-
-
-/datum/vip_barrier_perm/proc/check_barrier_guarded()
- var/barrier_is_guarded = FALSE
-
- for(var/mob/living/carbon/human/npc/bouncer/linked_bouncer in linked_bouncers)
- if(!linked_bouncer.is_guarding)
- continue
- barrier_is_guarded = TRUE
- break
-
- if(!actively_guarded && barrier_is_guarded)
- actively_guarded = TRUE
- for(var/obj/effect/vip_barrier/barrier in linked_barriers)
- barrier.update_icon()
-
- else if (actively_guarded && !barrier_is_guarded)
- actively_guarded = FALSE
- for(var/obj/effect/vip_barrier/barrier in linked_barriers)
- barrier.update_icon()
-
-//=============================================================================
-//Procs for communication between barriers and bouncers
-/datum/vip_barrier_perm/proc/notify_guard_entry(datum/source, mob/target_mob)
- SIGNAL_HANDLER
- if(!linked_bouncers.len)
- return
- var/mob/living/carbon/human/npc/bouncer/target_bouncer = pick(linked_bouncers)
- target_bouncer.speak_seldom(pick(target_bouncer.entry_phrases), target_mob)
-
-/datum/vip_barrier_perm/proc/notify_guard_blocked(datum/source, mob/target_mob)
- SIGNAL_HANDLER
- if(!linked_bouncers.len)
- return
- if(prob(80))
- return
- var/mob/living/carbon/human/npc/bouncer/target_bouncer = pick(linked_bouncers)
- target_bouncer.speak_seldom(pick(target_bouncer.denial_phrases), target_mob)
-
-/datum/vip_barrier_perm/proc/notify_guard_police_denial(mob/target_mob)
- if(!linked_bouncers.len)
- return
- var/mob/living/carbon/human/npc/bouncer/target_bouncer = pick(linked_bouncers)
- target_bouncer.speak_seldom(pick(target_bouncer.police_block_phrases), target_mob)
-
-/datum/vip_barrier_perm/proc/notify_guard_blocked_denial(mob/target_mob)
- if(!linked_bouncers.len)
- return
- var/mob/living/carbon/human/npc/bouncer/target_bouncer = pick(linked_bouncers)
- target_bouncer.speak_seldom(pick(target_bouncer.block_phrases), target_mob)
-
-/datum/vip_barrier_perm/proc/notify_barrier_social_bypass(mob/user, mob/bouncer, used_badge)
- if(!linked_barriers.len)
- return
- var/obj/effect/vip_barrier/target_barrier = linked_barriers[1]
- target_barrier.handle_social_bypass(user, bouncer, used_badge)
-
-
-//=============================================================================
-
diff --git a/modular_darkpack/modules/vip_areas/code/vip_barriers/__vip_barrier.dm b/modular_darkpack/modules/vip_areas/code/vip_barriers/__vip_barrier.dm
deleted file mode 100644
index d43c01dce6b8..000000000000
--- a/modular_darkpack/modules/vip_areas/code/vip_barriers/__vip_barrier.dm
+++ /dev/null
@@ -1,164 +0,0 @@
-/obj/effect/vip_barrier
- name = "Basic Check Point"
- desc = "Not a real checkpoint."
- icon = 'modular_darkpack/modules/vip_areas/icons/barrier.dmi'
- icon_state = "camarilla_blocking"
- var/block_sound = "modular_darkpack/modules/deprecated/sounds/bouncer_blocked.ogg"
-
- //Social bypass numbers
- var/social_bypass_allowed = TRUE
- var/social_bypass_time = 20 SECONDS
- var/can_use_badge = TRUE
- var/mean_to_cops = TRUE
- var/social_roll_difficulty = 7
-
- //Display settings
- var/always_invisible = FALSE
-
- density = FALSE
- anchored = TRUE
-
-
-
- //Assigns an ID to NPCs that guard certain doors, must match a barrier's ID
- //*********All barriers under a protected_zone_id should be of the same type!*********
- var/protected_zone_id = "test"
-
- var/datum/vip_barrier_perm/linked_perm = null
-
-
-/obj/effect/vip_barrier/Initialize(mapload)
- . = ..()
-
- if(mapload && src.type == /obj/effect/vip_barrier)
- CRASH("VIP Barrier created using default type, please use a child of this type in mapping.")
-
- //we do this in an initialize so mappers do not have to code as much
- if(SSbouncer_barriers.vip_barrier_perms?[protected_zone_id])
- linked_perm = SSbouncer_barriers.vip_barrier_perms[protected_zone_id]
- linked_perm.add_barrier(src)
- //spessman purity means I have to register a signal with myself, pain
- RegisterSignal(src, COMSIG_BARRIER_NOTIFY_GUARD_BLOCKED, PROC_REF(playBlockSound))
- update_icon()
- else if(mapload && SSbouncer_barriers.initialized)
- CRASH("A VIP barrier was created for vip_barrier_perms that were not loaded!")
-
-/obj/effect/vip_barrier/Destroy()
- if(linked_perm)
- linked_perm.linked_barriers -= src
- linked_perm = null
- return ..()
-
-
-/obj/effect/vip_barrier/CanPass(atom/movable/mover, turf/target)
- . = ..()
- var/entry_allowed = TRUE
-
- if(!isliving(mover))
- return entry_allowed
-
- if(check_direction_always_allowed(mover))
- return entry_allowed
-
- var/mob/living/mover_mob = mover
- if(!mover_mob.mind)
- entry_allowed = FALSE
- else if(linked_perm.actively_guarded)
- entry_allowed = check_entry_permission_base(mover_mob)
-
- if(!entry_allowed && mover.pulledby && isliving(mover.pulledby))
- entry_allowed = check_entry_permission_base(mover.pulledby)
-
- if(entry_allowed)
- SEND_SIGNAL(src, COMSIG_BARRIER_NOTIFY_GUARD_ENTRY, mover_mob)
- else
- SEND_SIGNAL(src, COMSIG_BARRIER_NOTIFY_GUARD_BLOCKED, mover_mob)
-
- return entry_allowed
-
-/obj/effect/vip_barrier/proc/check_direction_always_allowed(atom/movable/mover)
- if(src.loc == mover.loc)
- return TRUE
- var/origin_dir = get_dir(src, mover)
- return !(origin_dir & src.dir)
-
-/obj/effect/vip_barrier/proc/playBlockSound(atom/movable/mover)
- SIGNAL_HANDLER
- playsound(mover, block_sound, vol = 10, falloff_distance = 2, vary = TRUE)
-
-
-//Call this parent after any children run
-/obj/effect/vip_barrier/proc/check_entry_permission_base(mob/living/carbon/human/entering_mob)
- if(LAZYFIND(linked_perm.allow_list, entering_mob.name))
- return TRUE
-
- if(LAZYFIND(linked_perm.block_list, entering_mob.name))
- return FALSE
-
- return check_entry_permission_custom(entering_mob)
-
-//Function for providing custom blocks and allowances for entering people
-/obj/effect/vip_barrier/proc/check_entry_permission_custom(mob/living/carbon/human/entering_mob)
- return TRUE
-
-/obj/effect/vip_barrier/proc/handle_social_bypass(mob/living/carbon/human/user, mob/bouncer, used_badge = FALSE)
-
- if(user.get_face_name() == "Unknown")
- to_chat(user, span_notice("They won't talk to someone they can't look in the eye."))
- return
-
- if(check_entry_permission_base(user))
- to_chat(user, span_notice("...But you are already allowed entry."))
- return
-
- //handle block list babies
- if(LAZYFIND(linked_perm.block_list, user.name))
- if(identify_cop(user, used_badge))
- linked_perm.notify_guard_police_denial(user)
- else
- linked_perm.notify_guard_blocked_denial(user)
- return
-
-
- if(!do_after(user, max(5 SECONDS, social_bypass_time - (user.st_get_stat(STAT_CHARISMA) * 2 SECONDS)), bouncer))
- return
-
-
-
- var/involved_social_roll = social_roll_difficulty
- if(used_badge)
- involved_social_roll -= 1
-
- if(SSroll.storyteller_roll(user.st_get_stat(STAT_CHARISMA), involved_social_roll, mobs_to_show_output = user) == ROLL_SUCCESS)
- to_chat(user, span_notice("You manage to persuade your way past the guards."))
- linked_perm.allow_list += user.get_face_name()
- return
-
- to_chat(user, span_notice("The guards turn you away, taking note of you as they do."))
- linked_perm.block_list += user.name
- if(identify_cop(user, used_badge))
- linked_perm.notify_guard_police_denial(user)
- else
- linked_perm.notify_guard_blocked_denial(user)
-
-
-/obj/effect/vip_barrier/proc/identify_cop(mob/living/carbon/human/user, used_badge = FALSE)
- if(mean_to_cops && (used_badge || (user.wear_id && istype(user.wear_id,/obj/item/card/police))))
- return TRUE
- return FALSE
-
-
-
-/obj/effect/vip_barrier/proc/signal_update_icon()
- SIGNAL_HANDLER
- update_icon()
-
-/obj/effect/vip_barrier/update_icon()
- .=..()
- if(always_invisible)
- alpha = 0
- return
- if(linked_perm.actively_guarded)
- alpha = 255
- else
- alpha = 128
diff --git a/modular_darkpack/modules/vip_areas/code/vip_barriers/elysium_barrier.dm b/modular_darkpack/modules/vip_areas/code/vip_barriers/elysium_barrier.dm
deleted file mode 100644
index 75e77c0c713f..000000000000
--- a/modular_darkpack/modules/vip_areas/code/vip_barriers/elysium_barrier.dm
+++ /dev/null
@@ -1,22 +0,0 @@
-/obj/effect/vip_barrier/elysium
- name = "Elysium Checkpoint"
- desc = "The barrier between a moonlit night and a world of darkness."
- protected_zone_id = "elysium"
- social_roll_difficulty = 9
-
-
-/obj/effect/vip_barrier/elysium_2
- protected_zone_id = "elysium_2"
-
-
-
-/obj/effect/vip_barrier/elysium/theatre
- protected_zone_id = "elysium_theatre"
-
-/obj/effect/vip_barrier/elysium/theatre_backdoor
- protected_zone_id = "theatre_backdoor"
-
-/obj/effect/vip_barrier/elysium/check_entry_permission_custom(mob/living/carbon/human/entering_mob)
- if(iskindred(entering_mob) || isghoul(entering_mob))
- return TRUE
- return FALSE
diff --git a/modular_darkpack/modules/vip_areas/code/vip_barriers/elysium_stripclub_barrier.dm b/modular_darkpack/modules/vip_areas/code/vip_barriers/elysium_stripclub_barrier.dm
deleted file mode 100644
index 2d0b23b9e737..000000000000
--- a/modular_darkpack/modules/vip_areas/code/vip_barriers/elysium_stripclub_barrier.dm
+++ /dev/null
@@ -1,11 +0,0 @@
-/obj/effect/vip_barrier/stripclub
- name = "VIP Area"
- desc = "Marks the beginning of the city's neutral zone for nonhumans. Beyond, true freaks of the night may congregate safely."
- protected_zone_id = "elysium_strip"
- social_roll_difficulty = 9
-
-
-/obj/effect/vip_barrier/stripclub/check_entry_permission_custom(mob/living/carbon/human/entering_mob)
- if(!ishumanbasic(entering_mob) || (entering_mob.mind && entering_mob.mind.assigned_role == "Stripper"))
- return TRUE
- return FALSE
diff --git a/modular_darkpack/modules/vip_areas/code/vip_barriers/endron_barrier.dm b/modular_darkpack/modules/vip_areas/code/vip_barriers/endron_barrier.dm
deleted file mode 100644
index 83d42dba5c77..000000000000
--- a/modular_darkpack/modules/vip_areas/code/vip_barriers/endron_barrier.dm
+++ /dev/null
@@ -1,22 +0,0 @@
-/obj/effect/vip_barrier/endron
- name = "Endron Checkpoint"
- desc = "There's an employees only sign here."
- protected_zone_id = "endron"
- social_roll_difficulty = 7
-
-/obj/effect/vip_barrier/endron/endron_2
- protected_zone_id = "endron_2"
-
-/obj/effect/vip_barrier/endron/endron_backdoor
- protected_zone_id = "endron_backdoor"
-
-/obj/effect/vip_barrier/endron/endron_lab
- protected_zone_id = "endron_lab"
-
-/obj/effect/vip_barrier/endron/endron_lab_2
- protected_zone_id = "endron_lab_2"
-
-/obj/effect/vip_barrier/endron/check_entry_permission_custom(mob/living/carbon/human/entering_mob)
- if(entering_mob.mind && entering_mob.mind.assigned_role && (entering_mob.mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_ENDRON))
- return TRUE
- return FALSE
diff --git a/modular_darkpack/modules/vip_areas/code/vip_barriers/giovanni_barrier.dm b/modular_darkpack/modules/vip_areas/code/vip_barriers/giovanni_barrier.dm
deleted file mode 100644
index def5c4521bed..000000000000
--- a/modular_darkpack/modules/vip_areas/code/vip_barriers/giovanni_barrier.dm
+++ /dev/null
@@ -1,10 +0,0 @@
-/obj/effect/vip_barrier/giovanni
- name = "Giovanni Checkpoint"
- desc = "This here's a family gathering, capice?"
- protected_zone_id = "giovanni"
- social_roll_difficulty = 7
-
-/obj/effect/vip_barrier/giovanni/check_entry_permission_custom(mob/living/carbon/human/entering_mob)
- if(entering_mob.mind && entering_mob.mind.assigned_role && (entering_mob.mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_GIOVANNI))
- return TRUE
- return FALSE
diff --git a/tgstation.dme b/tgstation.dme
index 1e6dc0f362d2..b778accfeae1 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -7181,47 +7181,8 @@
#include "modular_darkpack\modules\matrix\code\job.dm"
#include "modular_darkpack\modules\matrix\code\matrix.dm"
#include "modular_darkpack\modules\mob_spawners\code\citizen.dm"
-#include "modular_darkpack\modules\npc\code\human\__npc.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_aggression.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_globals.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_human_subsystem.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_movement.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_types\bacotell.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_types\bandit.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_types\bubway.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_types\business.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_types\club.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_types\garden.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_types\guard.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_types\gummaguts.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_types\hobo.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_types\illegal.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_types\incel.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_types\police.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_types\shop.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_types\stripper.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_types\walkby.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_types\bouncers\__bouncer.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_types\bouncers\bouncer_elysium.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_types\bouncers\bouncer_endron.dm"
-#include "modular_darkpack\modules\npc\code\human\npc_types\bouncers\bouncer_giovanni.dm"
-#include "modular_darkpack\modules\npc\code\human\socialroles\__socialrole.dm"
-#include "modular_darkpack\modules\npc\code\human\socialroles\bandit.dm"
-#include "modular_darkpack\modules\npc\code\human\socialroles\guard.dm"
-#include "modular_darkpack\modules\npc\code\human\socialroles\police.dm"
-#include "modular_darkpack\modules\npc\code\human\socialroles\poorfemale.dm"
-#include "modular_darkpack\modules\npc\code\human\socialroles\poormale.dm"
-#include "modular_darkpack\modules\npc\code\human\socialroles\richfemale.dm"
-#include "modular_darkpack\modules\npc\code\human\socialroles\richmale.dm"
-#include "modular_darkpack\modules\npc\code\human\socialroles\stripfemale.dm"
-#include "modular_darkpack\modules\npc\code\human\socialroles\usualfemale.dm"
-#include "modular_darkpack\modules\npc\code\human\socialroles\usualmale.dm"
-#include "modular_darkpack\modules\npc\code\human\socialroles\shop\__shop.dm"
-#include "modular_darkpack\modules\npc\code\human\socialroles\shop\bacotell.dm"
-#include "modular_darkpack\modules\npc\code\human\socialroles\shop\bubway.dm"
-#include "modular_darkpack\modules\npc\code\human\socialroles\shop\garden.dm"
-#include "modular_darkpack\modules\npc\code\human\socialroles\shop\gummaguts.dm"
-#include "modular_darkpack\modules\npc\code\human\socialroles\shop\illegal.dm"
+#include "modular_darkpack\modules\npc\code\human\_npc.dm"
+#include "modular_darkpack\modules\npc\code\human\base_npc_ai_controller.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\blood_guard.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\necromancy_zombies.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\shadow_guard.dm"
@@ -7377,17 +7338,6 @@
#include "modular_darkpack\modules\vaults\code\drill.dm"
#include "modular_darkpack\modules\vaults\code\keypad.dm"
#include "modular_darkpack\modules\vaults\code\vaultdoors.dm"
-#include "modular_darkpack\modules\vip_areas\code\bouncer_barrier_subsystem.dm"
-#include "modular_darkpack\modules\vip_areas\code\vip_barrier_perm.dm"
-#include "modular_darkpack\modules\vip_areas\code\bouncer_roles\bouncer_elysium_role.dm"
-#include "modular_darkpack\modules\vip_areas\code\bouncer_roles\bouncer_endron_role.dm"
-#include "modular_darkpack\modules\vip_areas\code\bouncer_roles\bouncer_giovanni_role.dm"
-#include "modular_darkpack\modules\vip_areas\code\bouncer_roles\bouncer_mob_role.dm"
-#include "modular_darkpack\modules\vip_areas\code\vip_barriers\__vip_barrier.dm"
-#include "modular_darkpack\modules\vip_areas\code\vip_barriers\elysium_barrier.dm"
-#include "modular_darkpack\modules\vip_areas\code\vip_barriers\elysium_stripclub_barrier.dm"
-#include "modular_darkpack\modules\vip_areas\code\vip_barriers\endron_barrier.dm"
-#include "modular_darkpack\modules\vip_areas\code\vip_barriers\giovanni_barrier.dm"
#include "modular_darkpack\modules\vitae\code\blood_bond.dm"
#include "modular_darkpack\modules\vitae\code\blood_pack.dm"
#include "modular_darkpack\modules\vitae\code\embracing.dm"
From 0d501aaa5d824c01d57b1e19e1f82d6118008945 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Sat, 13 Dec 2025 09:06:56 +0200
Subject: [PATCH 02/32] awawa
---
code/__DEFINES/~darkpack/ai/npc.dm | 1 +
.../npc/code/human/base_npc_ai_controller.dm | 28 ++++++++++++++++++-
tgstation.dme | 1 +
3 files changed, 29 insertions(+), 1 deletion(-)
create mode 100644 code/__DEFINES/~darkpack/ai/npc.dm
diff --git a/code/__DEFINES/~darkpack/ai/npc.dm b/code/__DEFINES/~darkpack/ai/npc.dm
new file mode 100644
index 000000000000..0985f1f0fbda
--- /dev/null
+++ b/code/__DEFINES/~darkpack/ai/npc.dm
@@ -0,0 +1 @@
+#define BB_MOVE_TARGET "move_target"
diff --git a/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm b/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
index f95a0a835b54..f4afc3c41a16 100644
--- a/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
+++ b/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
@@ -1,11 +1,37 @@
/datum/ai_controller/npc
ai_movement = /datum/ai_movement/jps
movement_delay = 0.4 SECONDS
+ ai_traits =
planning_subtrees = list(
/datum/ai_planning_subtree/generic_resist,
)
blackboard = list(
BB_RESISTING = FALSE,
)
- idle_behavior = /datum/idle_behavior/idle_random_walk
+ idle_behavior = /datum/idle_behavior/walk_near_target/npc
+/datum/idle_behavior/walk_near_target/npc
+ walk_chance = 100
+ minimum_distance = 3
+ target_key = BB_MOVE_TARGET
+ behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
+
+///look for our village
+/datum/ai_planning_subtree/look_for_walk_target
+
+/datum/ai_planning_subtree/look_for_walk_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
+ if(controller.blackboard_key_exists(BB_MOVE_TARGET))
+ return
+
+ controller.queue_behavior(/datum/ai_behavior/find_target, BB_MOVE_TARGET)
+
+/datum/ai_behavior/find_target
+
+/datum/ai_behavior/find_target/perform(seconds_per_tick, datum/ai_controller/controller, village_key)
+
+ var/obj/effect/landmark/home_marker = locate(/obj/effect/landmark/ai_movement) in GLOB.landmarks_list
+ if(isnull(home_marker))
+ return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+
+ controller.set_blackboard_key(village_key, home_marker)
+ return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
diff --git a/tgstation.dme b/tgstation.dme
index b778accfeae1..87f615cd045b 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -451,6 +451,7 @@
#include "code\__DEFINES\~darkpack\storyteller_stats.dm"
#include "code\__DEFINES\~darkpack\subsystems.dm"
#include "code\__DEFINES\~darkpack\vampire_clan.dm"
+#include "code\__DEFINES\~darkpack\ai\npc.dm"
#include "code\__DEFINES\~darkpack\dcs\bouncer_signals.dm"
#include "code\__DEFINES\~darkpack\dcs\fire_signals.dm"
#include "code\__DEFINES\~darkpack\dcs\gun_signals.dm"
From 60a29bdce16fa6798f95d0b6128eac3411d8d757 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Sat, 13 Dec 2025 09:26:08 +0200
Subject: [PATCH 03/32] rahhhh
---
code/modules/admin/verbs/list_exposer.dm | 4 ++--
.../npc/code/human/base_npc_ai_controller.dm | 18 ++++++++++++------
modular_darkpack/modules/npc/code/landmarks.dm | 3 +++
tgstation.dme | 1 +
4 files changed, 18 insertions(+), 8 deletions(-)
create mode 100644 modular_darkpack/modules/npc/code/landmarks.dm
diff --git a/code/modules/admin/verbs/list_exposer.dm b/code/modules/admin/verbs/list_exposer.dm
index f3a4d235b731..bd9cd8a71706 100644
--- a/code/modules/admin/verbs/list_exposer.dm
+++ b/code/modules/admin/verbs/list_exposer.dm
@@ -36,8 +36,8 @@
for(var/entry in GLOB.human_list)
var/mob/living/carbon/human/subject = entry
if(subject.ckey)
-
- data += ""data += "| [subject.real_name] | [subject.dna.unique_enzymes] | [subject.get_bloodtype()?.name] |
" // DARKPACK EDIT, ORIGINAL: data += "| [subject] | [subject.dna.unique_enzymes] | [subject.get_bloodtype()?.name] |
"
+ data += "| [subject.real_name] | [subject.dna.unique_enzymes] | [subject.get_bloodtype()?.name] |
" // DARKPACK EDIT, ORIGINAL: data += "| [subject] | [subject.dna.unique_enzymes] | [subject.get_bloodtype()?.name] |
"
+ data += ""
var/datum/browser/browser = new(usr, "DNA", "DNA Log", 440, 410)
browser.set_content(data)
diff --git a/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm b/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
index f4afc3c41a16..609588a98b12 100644
--- a/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
+++ b/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
@@ -1,12 +1,13 @@
/datum/ai_controller/npc
ai_movement = /datum/ai_movement/jps
movement_delay = 0.4 SECONDS
- ai_traits =
planning_subtrees = list(
/datum/ai_planning_subtree/generic_resist,
+ /datum/ai_planning_subtree/look_for_walk_target,
)
blackboard = list(
BB_RESISTING = FALSE,
+ BB_MOVE_TARGET = null
)
idle_behavior = /datum/idle_behavior/walk_near_target/npc
@@ -14,7 +15,6 @@
walk_chance = 100
minimum_distance = 3
target_key = BB_MOVE_TARGET
- behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
///look for our village
/datum/ai_planning_subtree/look_for_walk_target
@@ -26,12 +26,18 @@
controller.queue_behavior(/datum/ai_behavior/find_target, BB_MOVE_TARGET)
/datum/ai_behavior/find_target
+ behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
-/datum/ai_behavior/find_target/perform(seconds_per_tick, datum/ai_controller/controller, village_key)
+/datum/ai_behavior/find_target/perform(seconds_per_tick, datum/ai_controller/controller, destination)
+ var/list/possible_destinations = list()
+ for(var/obj/effect/landmark/npcbeacon/random_destination in GLOB.landmarks_list)
+ if(random_destination == controller.blackboard[BB_MOVE_TARGET])
+ continue
+ possible_destinations += random_destination
- var/obj/effect/landmark/home_marker = locate(/obj/effect/landmark/ai_movement) in GLOB.landmarks_list
- if(isnull(home_marker))
+ var/obj/effect/landmark/destination_marker = pick(possible_destinations)
+ if(isnull(destination_marker))
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
- controller.set_blackboard_key(village_key, home_marker)
+ controller.set_blackboard_key(destination, destination_marker)
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
diff --git a/modular_darkpack/modules/npc/code/landmarks.dm b/modular_darkpack/modules/npc/code/landmarks.dm
new file mode 100644
index 000000000000..b68ceb242a91
--- /dev/null
+++ b/modular_darkpack/modules/npc/code/landmarks.dm
@@ -0,0 +1,3 @@
+/obj/effect/landmark/npcbeacon
+ name = "NPC beacon"
+ icon_state = "x"
diff --git a/tgstation.dme b/tgstation.dme
index 87f615cd045b..50e9ba4096f0 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -7182,6 +7182,7 @@
#include "modular_darkpack\modules\matrix\code\job.dm"
#include "modular_darkpack\modules\matrix\code\matrix.dm"
#include "modular_darkpack\modules\mob_spawners\code\citizen.dm"
+#include "modular_darkpack\modules\npc\code\landmarks.dm"
#include "modular_darkpack\modules\npc\code\human\_npc.dm"
#include "modular_darkpack\modules\npc\code\human\base_npc_ai_controller.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\blood_guard.dm"
From ffde7e5fcfbdd309f106964d6cbb75a032cc5fd3 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Sat, 13 Dec 2025 09:38:29 +0200
Subject: [PATCH 04/32] awawa
---
code/__DEFINES/~darkpack/ai/npc.dm | 1 -
.../npc/code/human/base_npc_ai_controller.dm | 21 +++++++++----------
2 files changed, 10 insertions(+), 12 deletions(-)
delete mode 100644 code/__DEFINES/~darkpack/ai/npc.dm
diff --git a/code/__DEFINES/~darkpack/ai/npc.dm b/code/__DEFINES/~darkpack/ai/npc.dm
deleted file mode 100644
index 0985f1f0fbda..000000000000
--- a/code/__DEFINES/~darkpack/ai/npc.dm
+++ /dev/null
@@ -1 +0,0 @@
-#define BB_MOVE_TARGET "move_target"
diff --git a/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm b/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
index 609588a98b12..846a8370bc04 100644
--- a/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
+++ b/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
@@ -4,26 +4,22 @@
planning_subtrees = list(
/datum/ai_planning_subtree/generic_resist,
/datum/ai_planning_subtree/look_for_walk_target,
+ /datum/ai_planning_subtree/travel_to_point/and_clear_target,
)
blackboard = list(
BB_RESISTING = FALSE,
- BB_MOVE_TARGET = null
+ BB_TRAVEL_DESTINATION = null
)
- idle_behavior = /datum/idle_behavior/walk_near_target/npc
+ idle_behavior = null
-/datum/idle_behavior/walk_near_target/npc
- walk_chance = 100
- minimum_distance = 3
- target_key = BB_MOVE_TARGET
-
-///look for our village
+///look for our npc beacon
/datum/ai_planning_subtree/look_for_walk_target
/datum/ai_planning_subtree/look_for_walk_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
- if(controller.blackboard_key_exists(BB_MOVE_TARGET))
+ if(controller.blackboard_key_exists(BB_TRAVEL_DESTINATION))
return
- controller.queue_behavior(/datum/ai_behavior/find_target, BB_MOVE_TARGET)
+ controller.queue_behavior(/datum/ai_behavior/find_target, BB_TRAVEL_DESTINATION)
/datum/ai_behavior/find_target
behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
@@ -31,10 +27,13 @@
/datum/ai_behavior/find_target/perform(seconds_per_tick, datum/ai_controller/controller, destination)
var/list/possible_destinations = list()
for(var/obj/effect/landmark/npcbeacon/random_destination in GLOB.landmarks_list)
- if(random_destination == controller.blackboard[BB_MOVE_TARGET])
+ if(random_destination == controller.blackboard[BB_TRAVEL_DESTINATION])
continue
possible_destinations += random_destination
+ if(!length(possible_destinations))
+ return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+
var/obj/effect/landmark/destination_marker = pick(possible_destinations)
if(isnull(destination_marker))
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
From 483676f5c981e54f2780e07e23b35ba8b254634a Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Sat, 13 Dec 2025 09:39:35 +0200
Subject: [PATCH 05/32] Update tgstation.dme
---
tgstation.dme | 1 -
1 file changed, 1 deletion(-)
diff --git a/tgstation.dme b/tgstation.dme
index 50e9ba4096f0..509159edfb14 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -451,7 +451,6 @@
#include "code\__DEFINES\~darkpack\storyteller_stats.dm"
#include "code\__DEFINES\~darkpack\subsystems.dm"
#include "code\__DEFINES\~darkpack\vampire_clan.dm"
-#include "code\__DEFINES\~darkpack\ai\npc.dm"
#include "code\__DEFINES\~darkpack\dcs\bouncer_signals.dm"
#include "code\__DEFINES\~darkpack\dcs\fire_signals.dm"
#include "code\__DEFINES\~darkpack\dcs\gun_signals.dm"
From 8fc1cca7e4ddb6090b4ac1a96f587aed50966c4f Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Sun, 14 Dec 2025 19:52:03 +0200
Subject: [PATCH 06/32] good lord.
---
code/__DEFINES/~darkpack/generations.dm | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/code/__DEFINES/~darkpack/generations.dm b/code/__DEFINES/~darkpack/generations.dm
index a9f867e5885b..5d6f0a3b1675 100644
--- a/code/__DEFINES/~darkpack/generations.dm
+++ b/code/__DEFINES/~darkpack/generations.dm
@@ -8,18 +8,16 @@
#define HIGHEST_GENERATION_LIMIT 16
/// Limit for lowest generation possible
#define LOWEST_GENERATION_LIMIT 1
-/// Limit for public generation bonus
-#define MAX_GENERATION_BONUS 3
-/// Limit for trusted player generation bonus
-#define MAX_TRUSTED_GENERATION_BONUS 5
/// Limit for lowest public generation
#define MAX_PUBLIC_GENERATION 10
/// Limit for lowest trusted player generation
#define MAX_TRUSTED_GENERATION 8
/// The default generation everyone begins at
#define DEFAULT_GENERATION 13
+// The generation a ghoul is. This is purely so that ghouls can use disciplines on humans only.
+#define GHOUL_GENERATION HIGHEST_GENERATION_LIMIT + 1
// The generation a human is.
-#define HUMAN_GENERATION HIGHEST_GENERATION_LIMIT + 1
+#define HUMAN_GENERATION GHOUL_GENERATION + 1
// The lowest generation that anyone using Blood of Potency can go down to.
#define BLOOD_POTENCY_GENERATION 4
From b9602d47bdb5d5140f7edf20147dc7596ef21d35 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Sun, 14 Dec 2025 20:00:30 +0200
Subject: [PATCH 07/32] Revert "good lord."
This reverts commit 8fc1cca7e4ddb6090b4ac1a96f587aed50966c4f.
---
code/__DEFINES/~darkpack/generations.dm | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/code/__DEFINES/~darkpack/generations.dm b/code/__DEFINES/~darkpack/generations.dm
index 5d6f0a3b1675..a9f867e5885b 100644
--- a/code/__DEFINES/~darkpack/generations.dm
+++ b/code/__DEFINES/~darkpack/generations.dm
@@ -8,16 +8,18 @@
#define HIGHEST_GENERATION_LIMIT 16
/// Limit for lowest generation possible
#define LOWEST_GENERATION_LIMIT 1
+/// Limit for public generation bonus
+#define MAX_GENERATION_BONUS 3
+/// Limit for trusted player generation bonus
+#define MAX_TRUSTED_GENERATION_BONUS 5
/// Limit for lowest public generation
#define MAX_PUBLIC_GENERATION 10
/// Limit for lowest trusted player generation
#define MAX_TRUSTED_GENERATION 8
/// The default generation everyone begins at
#define DEFAULT_GENERATION 13
-// The generation a ghoul is. This is purely so that ghouls can use disciplines on humans only.
-#define GHOUL_GENERATION HIGHEST_GENERATION_LIMIT + 1
// The generation a human is.
-#define HUMAN_GENERATION GHOUL_GENERATION + 1
+#define HUMAN_GENERATION HIGHEST_GENERATION_LIMIT + 1
// The lowest generation that anyone using Blood of Potency can go down to.
#define BLOOD_POTENCY_GENERATION 4
From d2c2d55bb9b6808721eb1ffced967e227bba7e83 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Sun, 21 Dec 2025 03:02:41 +0200
Subject: [PATCH 08/32] hmh
---
.../npc/code/human/base_npc_ai_controller.dm | 34 ++-----------------
.../npc/code/human/random_movevment.dm | 24 +++++++++++++
tgstation.dme | 1 +
3 files changed, 27 insertions(+), 32 deletions(-)
create mode 100644 modular_darkpack/modules/npc/code/human/random_movevment.dm
diff --git a/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm b/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
index 846a8370bc04..f070a7a09c34 100644
--- a/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
+++ b/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
@@ -3,40 +3,10 @@
movement_delay = 0.4 SECONDS
planning_subtrees = list(
/datum/ai_planning_subtree/generic_resist,
- /datum/ai_planning_subtree/look_for_walk_target,
- /datum/ai_planning_subtree/travel_to_point/and_clear_target,
+ /datum/ai_planning_subtree/find_patrol_beacon/npc
)
blackboard = list(
BB_RESISTING = FALSE,
- BB_TRAVEL_DESTINATION = null
+ BB_BEACON_TARGET = null
)
idle_behavior = null
-
-///look for our npc beacon
-/datum/ai_planning_subtree/look_for_walk_target
-
-/datum/ai_planning_subtree/look_for_walk_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
- if(controller.blackboard_key_exists(BB_TRAVEL_DESTINATION))
- return
-
- controller.queue_behavior(/datum/ai_behavior/find_target, BB_TRAVEL_DESTINATION)
-
-/datum/ai_behavior/find_target
- behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
-
-/datum/ai_behavior/find_target/perform(seconds_per_tick, datum/ai_controller/controller, destination)
- var/list/possible_destinations = list()
- for(var/obj/effect/landmark/npcbeacon/random_destination in GLOB.landmarks_list)
- if(random_destination == controller.blackboard[BB_TRAVEL_DESTINATION])
- continue
- possible_destinations += random_destination
-
- if(!length(possible_destinations))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
-
- var/obj/effect/landmark/destination_marker = pick(possible_destinations)
- if(isnull(destination_marker))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
-
- controller.set_blackboard_key(destination, destination_marker)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
diff --git a/modular_darkpack/modules/npc/code/human/random_movevment.dm b/modular_darkpack/modules/npc/code/human/random_movevment.dm
new file mode 100644
index 000000000000..62baa79baf7a
--- /dev/null
+++ b/modular_darkpack/modules/npc/code/human/random_movevment.dm
@@ -0,0 +1,24 @@
+/datum/ai_planning_subtree/find_patrol_beacon/npc
+ travel_behavior = /datum/ai_behavior/travel_towards/beacon/npc
+
+/datum/ai_planning_subtree/find_patrol_beacon/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
+ if(controller.blackboard[BB_BOT_BEACON_COOLDOWN] > world.time)
+ return
+
+ if(controller.blackboard_key_exists(BB_BEACON_TARGET))
+ controller.queue_behavior(travel_behavior, BB_BEACON_TARGET)
+ return
+
+ if(controller.blackboard_key_exists(BB_PREVIOUS_BEACON_TARGET))
+ controller.queue_behavior(/datum/ai_behavior/find_next_beacon_target, BB_BEACON_TARGET)
+ return
+
+ controller.queue_behavior(/datum/ai_behavior/find_first_beacon_target, BB_BEACON_TARGET)
+
+/datum/ai_behavior/travel_towards/beacon/npc
+ new_movement_type = /datum/ai_movement/jps/npc
+
+/datum/ai_movement/jps/npc
+ diagonal_flags = DIAGONAL_REMOVE_CLUNKY
+ maximum_length = AI_BOT_PATH_LENGTH
+ max_pathing_attempts = 10
diff --git a/tgstation.dme b/tgstation.dme
index d8260c152338..2cbefcf3d8be 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -7193,6 +7193,7 @@
#include "modular_darkpack\modules\npc\code\landmarks.dm"
#include "modular_darkpack\modules\npc\code\human\_npc.dm"
#include "modular_darkpack\modules\npc\code\human\base_npc_ai_controller.dm"
+#include "modular_darkpack\modules\npc\code\human\random_movevment.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\blood_guard.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\necromancy_zombies.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\shadow_guard.dm"
From 3a37e0526214bf08e9491f0e06c3caa8dbaccd64 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Sun, 21 Dec 2025 03:47:44 +0200
Subject: [PATCH 09/32] aewawaw
---
code/__DEFINES/~darkpack/factions.dm | 2 +-
.../modules/npc/code/human/_npc.dm | 1 +
.../npc/code/human/base_npc_ai_controller.dm | 13 ++++--
.../modules/npc/code/human/random_movement.dm | 45 +++++++++++++++++++
.../npc/code/human/random_movevment.dm | 24 ----------
tgstation.dme | 2 +-
6 files changed, 57 insertions(+), 30 deletions(-)
create mode 100644 modular_darkpack/modules/npc/code/human/random_movement.dm
delete mode 100644 modular_darkpack/modules/npc/code/human/random_movevment.dm
diff --git a/code/__DEFINES/~darkpack/factions.dm b/code/__DEFINES/~darkpack/factions.dm
index a50f6a29f635..6b9701d65687 100644
--- a/code/__DEFINES/~darkpack/factions.dm
+++ b/code/__DEFINES/~darkpack/factions.dm
@@ -7,5 +7,5 @@
// City faction
#define FACTION_CITY "city"
-
#define FACTION_GAIA "gaia"
+#define FACTION_NPC "npc"
diff --git a/modular_darkpack/modules/npc/code/human/_npc.dm b/modular_darkpack/modules/npc/code/human/_npc.dm
index cdee813cfd27..2dd686e4bcc2 100644
--- a/modular_darkpack/modules/npc/code/human/_npc.dm
+++ b/modular_darkpack/modules/npc/code/human/_npc.dm
@@ -1,3 +1,4 @@
/mob/living/carbon/human/npc
+ faction = list(FACTION_NPC)
ai_controller = /datum/ai_controller/npc
diff --git a/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm b/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
index f070a7a09c34..66b63cbedcab 100644
--- a/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
+++ b/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
@@ -2,11 +2,16 @@
ai_movement = /datum/ai_movement/jps
movement_delay = 0.4 SECONDS
planning_subtrees = list(
- /datum/ai_planning_subtree/generic_resist,
- /datum/ai_planning_subtree/find_patrol_beacon/npc
+ /datum/ai_planning_subtree/escape_captivity,
+ /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee,
+ /datum/ai_planning_subtree/flee_target,
+ /datum/ai_planning_subtree/target_retaliate,
+ /datum/ai_planning_subtree/basic_melee_attack_subtree,
+ /datum/ai_planning_subtree/look_for_walk_target
)
blackboard = list(
- BB_RESISTING = FALSE,
- BB_BEACON_TARGET = null
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ BB_TARGET_MINIMUM_STAT = UNCONSCIOUS,
+ BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
)
idle_behavior = null
diff --git a/modular_darkpack/modules/npc/code/human/random_movement.dm b/modular_darkpack/modules/npc/code/human/random_movement.dm
new file mode 100644
index 000000000000..31630ffaf7fb
--- /dev/null
+++ b/modular_darkpack/modules/npc/code/human/random_movement.dm
@@ -0,0 +1,45 @@
+/datum/ai_behavior/travel_towards/stop_on_arrival/npc
+ new_movement_type = /datum/ai_movement/jps/npc
+
+/datum/ai_movement/jps/npc
+ diagonal_flags = DIAGONAL_REMOVE_CLUNKY
+ maximum_length = AI_BOT_PATH_LENGTH
+ max_pathing_attempts = 10
+
+///look for our npc beacon
+/datum/ai_planning_subtree/look_for_walk_target
+ var/travel_behavior = /datum/ai_behavior/travel_towards/stop_on_arrival/npc
+
+/datum/ai_planning_subtree/look_for_walk_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
+ if(controller.blackboard_key_exists(BB_TRAVEL_DESTINATION))
+ controller.queue_behavior(travel_behavior, BB_TRAVEL_DESTINATION)
+ return
+
+ controller.queue_behavior(/datum/ai_behavior/find_target, BB_TRAVEL_DESTINATION)
+
+/datum/ai_behavior/find_target
+ behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
+ var/list/past_destinations = list()
+
+/datum/ai_behavior/find_target/perform(seconds_per_tick, datum/ai_controller/controller, destination)
+ var/list/possible_destinations = list()
+ for(var/obj/effect/landmark/npcbeacon/random_destination in GLOB.landmarks_list)
+ if(random_destination == controller.blackboard[BB_TRAVEL_DESTINATION])
+ continue
+ if(random_destination in past_destinations)
+ continue
+ possible_destinations += random_destination
+
+ if(!length(possible_destinations))
+ return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+
+ var/obj/effect/landmark/destination_marker = pick(possible_destinations)
+ if(isnull(destination_marker))
+ return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+
+ if(length(past_destinations) >= 5)
+ past_destinations -= past_destinations[1]
+ past_destinations += destination_marker
+
+ controller.set_blackboard_key(destination, destination_marker)
+ return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
diff --git a/modular_darkpack/modules/npc/code/human/random_movevment.dm b/modular_darkpack/modules/npc/code/human/random_movevment.dm
deleted file mode 100644
index 62baa79baf7a..000000000000
--- a/modular_darkpack/modules/npc/code/human/random_movevment.dm
+++ /dev/null
@@ -1,24 +0,0 @@
-/datum/ai_planning_subtree/find_patrol_beacon/npc
- travel_behavior = /datum/ai_behavior/travel_towards/beacon/npc
-
-/datum/ai_planning_subtree/find_patrol_beacon/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
- if(controller.blackboard[BB_BOT_BEACON_COOLDOWN] > world.time)
- return
-
- if(controller.blackboard_key_exists(BB_BEACON_TARGET))
- controller.queue_behavior(travel_behavior, BB_BEACON_TARGET)
- return
-
- if(controller.blackboard_key_exists(BB_PREVIOUS_BEACON_TARGET))
- controller.queue_behavior(/datum/ai_behavior/find_next_beacon_target, BB_BEACON_TARGET)
- return
-
- controller.queue_behavior(/datum/ai_behavior/find_first_beacon_target, BB_BEACON_TARGET)
-
-/datum/ai_behavior/travel_towards/beacon/npc
- new_movement_type = /datum/ai_movement/jps/npc
-
-/datum/ai_movement/jps/npc
- diagonal_flags = DIAGONAL_REMOVE_CLUNKY
- maximum_length = AI_BOT_PATH_LENGTH
- max_pathing_attempts = 10
diff --git a/tgstation.dme b/tgstation.dme
index 2cbefcf3d8be..a6bc1456abf2 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -7193,7 +7193,7 @@
#include "modular_darkpack\modules\npc\code\landmarks.dm"
#include "modular_darkpack\modules\npc\code\human\_npc.dm"
#include "modular_darkpack\modules\npc\code\human\base_npc_ai_controller.dm"
-#include "modular_darkpack\modules\npc\code\human\random_movevment.dm"
+#include "modular_darkpack\modules\npc\code\human\random_movement.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\blood_guard.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\necromancy_zombies.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\shadow_guard.dm"
From 6c73e2573da1f16484d69c8ab9110bcc2c652060 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Sun, 21 Dec 2025 05:39:10 +0200
Subject: [PATCH 10/32] Update landmarks.dm
---
modular_darkpack/modules/npc/code/landmarks.dm | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/modular_darkpack/modules/npc/code/landmarks.dm b/modular_darkpack/modules/npc/code/landmarks.dm
index b68ceb242a91..89ffb99f279f 100644
--- a/modular_darkpack/modules/npc/code/landmarks.dm
+++ b/modular_darkpack/modules/npc/code/landmarks.dm
@@ -1,3 +1,11 @@
/obj/effect/landmark/npcbeacon
- name = "NPC beacon"
+ name = "NPC landmark"
+ icon_state = "x3"
+
+/obj/effect/landmark/ai_avoid_turf
+ name = "AI avoidant turf landmark"
icon_state = "x"
+ can_astar_pass = CANASTARPASS_ALWAYS_PROC
+
+/obj/effect/landmark/ai_avoid_turf/CanAStarPass(to_dir, datum/can_pass_info/pass_info)
+ return FALSE
From e2b9ca756ccb2899490f59f2103353105da9ef44 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Sun, 21 Dec 2025 05:46:06 +0200
Subject: [PATCH 11/32] Update vampdoor.dm
---
modular_darkpack/modules/doors/code/vampdoor.dm | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/modular_darkpack/modules/doors/code/vampdoor.dm b/modular_darkpack/modules/doors/code/vampdoor.dm
index 95db77b86f06..df0e30db0050 100644
--- a/modular_darkpack/modules/doors/code/vampdoor.dm
+++ b/modular_darkpack/modules/doors/code/vampdoor.dm
@@ -384,4 +384,8 @@
to_chat(human, span_notice("It's just where I left it..."))
return TRUE
+// DARKPACK TODO: Look into AI being able to open and close doors. Maybe even unlock doors? or lockpick them for thieves?
+/obj/structure/vampdoor/CanAStarPass(to_dir, datum/can_pass_info/pass_info)
+ return (!closed || door_broken)
+
#undef DOAFTER_SOURCE_DOOR
From c04a89ebb5cf1d1d8dbc7f18c62f42fae826f9b1 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Sun, 21 Dec 2025 05:54:26 +0200
Subject: [PATCH 12/32] Update vampdoor.dm
---
modular_darkpack/modules/doors/code/vampdoor.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modular_darkpack/modules/doors/code/vampdoor.dm b/modular_darkpack/modules/doors/code/vampdoor.dm
index df0e30db0050..ea0fe97528d6 100644
--- a/modular_darkpack/modules/doors/code/vampdoor.dm
+++ b/modular_darkpack/modules/doors/code/vampdoor.dm
@@ -384,7 +384,7 @@
to_chat(human, span_notice("It's just where I left it..."))
return TRUE
-// DARKPACK TODO: Look into AI being able to open and close doors. Maybe even unlock doors? or lockpick them for thieves?
+// DARKPACK TODO - Look into AI being able to open and close doors. Maybe even unlock doors? or lockpick them for thieves?
/obj/structure/vampdoor/CanAStarPass(to_dir, datum/can_pass_info/pass_info)
return (!closed || door_broken)
From 1f257dad9151c185c37d6efc86b058fdd4a7fb33 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Sun, 21 Dec 2025 06:20:30 +0200
Subject: [PATCH 13/32] wew
---
.../modules/npc/code/human/_npc.dm | 2 +-
.../npc/code/human/base_npc_ai_controller.dm | 44 ++++++++++++++++---
.../modules/npc/code/human/random_movement.dm | 4 +-
3 files changed, 41 insertions(+), 9 deletions(-)
diff --git a/modular_darkpack/modules/npc/code/human/_npc.dm b/modular_darkpack/modules/npc/code/human/_npc.dm
index 2dd686e4bcc2..10cc9b9b6f84 100644
--- a/modular_darkpack/modules/npc/code/human/_npc.dm
+++ b/modular_darkpack/modules/npc/code/human/_npc.dm
@@ -1,4 +1,4 @@
/mob/living/carbon/human/npc
faction = list(FACTION_NPC)
ai_controller = /datum/ai_controller/npc
-
+ move_intent = MOVE_INTENT_WALK
diff --git a/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm b/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
index 66b63cbedcab..ad91e90add38 100644
--- a/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
+++ b/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
@@ -1,17 +1,49 @@
/datum/ai_controller/npc
ai_movement = /datum/ai_movement/jps
- movement_delay = 0.4 SECONDS
+ movement_delay = 0.8 SECONDS
planning_subtrees = list(
- /datum/ai_planning_subtree/escape_captivity,
- /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee,
+ /datum/ai_planning_subtree/escape_captivity, // Resist out of cuffs or whatnot first.
+ /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee, // Then handle combat.
/datum/ai_planning_subtree/flee_target,
/datum/ai_planning_subtree/target_retaliate,
- /datum/ai_planning_subtree/basic_melee_attack_subtree,
- /datum/ai_planning_subtree/look_for_walk_target
+ /datum/ai_planning_subtree/basic_melee_attack_subtree, // End handling combat.
+ /datum/ai_planning_subtree/look_for_walk_target // Random walking behavior.
)
blackboard = list(
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
BB_TARGET_MINIMUM_STAT = UNCONSCIOUS,
BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
)
- idle_behavior = null
+ can_idle = FALSE
+
+/datum/ai_controller/npc/PossessPawn(atom/new_pawn)
+ if(!isliving(new_pawn))
+ return AI_CONTROLLER_INCOMPATIBLE
+ RegisterSignal(new_pawn, COMSIG_MOB_MOVESPEED_UPDATED, PROC_REF(update_movespeed))
+
+ var/mob/living/living_pawn = new_pawn
+ movement_delay = living_pawn.cached_multiplicative_slowdown
+ return ..() //Run parent at end
+
+/datum/ai_controller/npc/proc/update_movespeed(mob/living/pawn)
+ SIGNAL_HANDLER
+ movement_delay = pawn.cached_multiplicative_slowdown
+
+/datum/ai_controller/npc/on_stat_changed(mob/living/source, new_stat)
+ . = ..()
+ update_able_to_run()
+
+/datum/ai_controller/npc/setup_able_to_run()
+ . = ..()
+ RegisterSignal(pawn, COMSIG_MOB_INCAPACITATE_CHANGED, PROC_REF(update_able_to_run))
+
+/datum/ai_controller/npc/clear_able_to_run()
+ UnregisterSignal(pawn, list(COMSIG_MOB_INCAPACITATE_CHANGED, COMSIG_MOB_STATCHANGE))
+ return ..()
+
+/datum/ai_controller/npc/get_able_to_run()
+ var/mob/living/living_pawn = pawn
+
+ if(INCAPACITATED_IGNORING(living_pawn, INCAPABLE_RESTRAINTS|INCAPABLE_STASIS|INCAPABLE_GRAB) || living_pawn.stat > CONSCIOUS)
+ return AI_UNABLE_TO_RUN
+ return ..()
diff --git a/modular_darkpack/modules/npc/code/human/random_movement.dm b/modular_darkpack/modules/npc/code/human/random_movement.dm
index 31630ffaf7fb..f2257e30cf76 100644
--- a/modular_darkpack/modules/npc/code/human/random_movement.dm
+++ b/modular_darkpack/modules/npc/code/human/random_movement.dm
@@ -31,11 +31,11 @@
possible_destinations += random_destination
if(!length(possible_destinations))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ return AI_BEHAVIOR_FAILED
var/obj/effect/landmark/destination_marker = pick(possible_destinations)
if(isnull(destination_marker))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ return AI_BEHAVIOR_FAILED
if(length(past_destinations) >= 5)
past_destinations -= past_destinations[1]
From f101676896bde4764a083122210c533c3c1c2c76 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Sun, 21 Dec 2025 17:05:53 +0200
Subject: [PATCH 14/32] rah
---
modular_darkpack/modules/npc/code/human/clolthing_datums.dm | 0
tgstation.dme | 1 +
tools/UpdatePaths/Scripts/DarkPack/438_NPCs.txt | 6 ++++++
3 files changed, 7 insertions(+)
create mode 100644 modular_darkpack/modules/npc/code/human/clolthing_datums.dm
create mode 100644 tools/UpdatePaths/Scripts/DarkPack/438_NPCs.txt
diff --git a/modular_darkpack/modules/npc/code/human/clolthing_datums.dm b/modular_darkpack/modules/npc/code/human/clolthing_datums.dm
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/tgstation.dme b/tgstation.dme
index a6bc1456abf2..ccbe07efb253 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -7193,6 +7193,7 @@
#include "modular_darkpack\modules\npc\code\landmarks.dm"
#include "modular_darkpack\modules\npc\code\human\_npc.dm"
#include "modular_darkpack\modules\npc\code\human\base_npc_ai_controller.dm"
+#include "modular_darkpack\modules\npc\code\human\clolthing_datums.dm"
#include "modular_darkpack\modules\npc\code\human\random_movement.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\blood_guard.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\necromancy_zombies.dm"
diff --git a/tools/UpdatePaths/Scripts/DarkPack/438_NPCs.txt b/tools/UpdatePaths/Scripts/DarkPack/438_NPCs.txt
new file mode 100644
index 000000000000..3d39f7ccd526
--- /dev/null
+++ b/tools/UpdatePaths/Scripts/DarkPack/438_NPCs.txt
@@ -0,0 +1,6 @@
+/obj/effect/landmark/npcbeacon/directed : @DELETE
+/obj/effect/landmark/npc_spawn_point : @DELETE
+/obj/effect/landmark/npcwall : @DELETE
+/mob/living/carbon/human/npc/incel : @DELETE
+/mob/living/carbon/human/npc/hobo
+/mob/living/carbon/human/npc/shop
From afc255016f8bfb66b614a68ad97248c2cabc6b51 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Sun, 21 Dec 2025 18:24:52 +0200
Subject: [PATCH 15/32] clothes!
---
.../modules/npc/code/human/_npc.dm | 28 +++
.../npc/code/human/clolthing_datums.dm | 175 ++++++++++++++++++
2 files changed, 203 insertions(+)
diff --git a/modular_darkpack/modules/npc/code/human/_npc.dm b/modular_darkpack/modules/npc/code/human/_npc.dm
index 10cc9b9b6f84..0ebeb1176a71 100644
--- a/modular_darkpack/modules/npc/code/human/_npc.dm
+++ b/modular_darkpack/modules/npc/code/human/_npc.dm
@@ -2,3 +2,31 @@
faction = list(FACTION_NPC)
ai_controller = /datum/ai_controller/npc
move_intent = MOVE_INTENT_WALK
+ var/outfit_type = /datum/outfit/npc
+
+/mob/living/carbon/human/npc/Initialize(mapload)
+ . = ..()
+ equipOutfit(outfit_type)
+
+/mob/living/carbon/human/npc/bandit
+ outfit_type = /datum/outfit/npc/bandit
+
+/mob/living/carbon/human/npc/rich
+ outfit_type = /datum/outfit/npc/rich
+
+/mob/living/carbon/human/npc/average
+ outfit_type = /datum/outfit/npc/average
+
+/mob/living/carbon/human/npc/poor
+ outfit_type = /datum/outfit/npc/poor
+
+/mob/living/carbon/human/npc/shop
+ ai_controller = /datum/ai_controller/npc/stand_still
+ outfit_type = /datum/outfit/npc/shop
+
+/mob/living/carbon/human/npc/police
+ outfit_type = /datum/outfit/npc/police
+
+/mob/living/carbon/human/npc/police/standing
+ ai_controller = /datum/ai_controller/npc/stand_still
+ outfit_type = /datum/outfit/npc/police
diff --git a/modular_darkpack/modules/npc/code/human/clolthing_datums.dm b/modular_darkpack/modules/npc/code/human/clolthing_datums.dm
index e69de29bb2d1..8286e081d5e8 100644
--- a/modular_darkpack/modules/npc/code/human/clolthing_datums.dm
+++ b/modular_darkpack/modules/npc/code/human/clolthing_datums.dm
@@ -0,0 +1,175 @@
+/datum/outfit/npc
+ name = "NPC Default"
+ uniform = /obj/item/clothing/under/vampire/gangrel
+ shoes = /obj/item/clothing/shoes/vampire
+ backpack_contents = list(
+ /obj/item/vamp/keys/npc = 1,
+ /obj/item/stack/dollar/hundred = 1,
+ )
+
+/datum/outfit/npc/pre_equip(mob/living/carbon/human/user, visuals_only)
+ back = pick(
+ /obj/item/storage/backpack,
+ /obj/item/storage/backpack/satchel,
+ /obj/item/storage/backpack/duffelbag,
+ /obj/item/storage/backpack/satchel/leather,
+ /obj/item/storage/backpack/messenger,
+ null,
+ )
+
+
+/datum/outfit/npc/bandit
+ name = "NPC Bandit"
+
+/datum/outfit/npc/bandit/pre_equip(mob/living/carbon/human/user, visuals_only)
+ shoes = pick(
+ /obj/item/clothing/shoes/vampire/sneakers,
+ /obj/item/clothing/shoes/vampire/sneakers/red,
+ /obj/item/clothing/shoes/vampire/jackboots,
+ )
+ uniform = pick(
+ /obj/item/clothing/under/vampire/larry,
+ /obj/item/clothing/under/vampire/bandit,
+ /obj/item/clothing/under/vampire/biker,
+ )
+ head = pick(
+ /obj/item/clothing/head/vampire/bandana,
+ /obj/item/clothing/head/vampire/bandana/red,
+ /obj/item/clothing/head/vampire/bandana/black,
+ /obj/item/clothing/head/vampire/beanie,
+ /obj/item/clothing/head/vampire/beanie/black,
+ null,
+ )
+ l_pocket = pick(
+ /obj/item/stack/dollar/rand,
+ /obj/item/vamp/keys/hack,
+ null,
+ )
+ r_pocket = pick(
+ /obj/item/stack/dollar/rand,
+ /obj/item/vamp/keys/hack,
+ null,
+ )
+ r_hand = pick(
+ /obj/item/knife/vamp,
+ /obj/item/melee/baseball_bat/vamp,
+ /obj/item/crowbar,
+ null,
+ )
+
+/datum/outfit/npc/rich
+ name = "NPC Rich"
+
+/datum/outfit/npc/bandit/pre_equip(mob/living/carbon/human/user, visuals_only)
+ uniform = pick(
+ /obj/item/clothing/shoes/vampire/white,
+ /obj/item/clothing/under/vampire/rich,
+ /obj/item/clothing/under/vampire/business,
+ )
+ shoes = pick(
+ /obj/item/clothing/shoes/vampire,
+ /obj/item/clothing/shoes/vampire/white,
+ /obj/item/clothing/shoes/vampire/heels,
+ /obj/item/clothing/shoes/vampire/heels/red,
+ )
+ r_hand = pick(
+ /obj/item/storage/briefcase,
+ null,
+ )
+ l_pocket = pick(
+ /obj/item/stack/dollar/hundred,
+ /obj/item/stack/dollar/fifty,
+ /obj/item/vamp/keys/npc,
+ null,
+ )
+ r_pocket = pick(
+ /obj/item/stack/dollar/hundred,
+ /obj/item/stack/dollar/fifty,
+ /obj/item/vamp/keys/npc,
+ null,
+ )
+
+/datum/outfit/npc/average
+ name = "NPC Average"
+
+/datum/outfit/npc/average/pre_equip(mob/living/carbon/human/user, visuals_only)
+ uniform = pick(
+ /obj/item/clothing/under/vampire/mechanic,
+ /obj/item/clothing/under/vampire/sport,
+ /obj/item/clothing/under/vampire/office,
+ /obj/item/clothing/under/vampire/sexy,
+ /obj/item/clothing/under/vampire/slickback,
+ /obj/item/clothing/under/vampire/emo,
+ /obj/item/clothing/under/vampire/black,
+ /obj/item/clothing/under/vampire/red,
+ /obj/item/clothing/under/vampire/gothic,
+ )
+ shoes = pick(
+ /obj/item/clothing/shoes/vampire/sneakers,
+ /obj/item/clothing/shoes/vampire/heels,
+ /obj/item/clothing/shoes/vampire,
+ /obj/item/clothing/shoes/vampire/brown,
+ )
+ l_pocket = pick(
+ /obj/item/vamp/keys/npc,
+ /obj/item/stack/dollar/rand,
+ null,
+ )
+ r_pocket = pick(
+ /obj/item/vamp/keys/npc,
+ /obj/item/stack/dollar/rand,
+ null,
+ )
+
+/datum/outfit/npc/poor
+ name = "NPC Poor"
+/datum/outfit/npc/poor/pre_equip(mob/living/carbon/human/user, visuals_only)
+ uniform = pick(
+ /obj/item/clothing/under/vampire/homeless,
+ /obj/item/clothing/under/vampire/homeless/female,
+ )
+ shoes = pick(
+ /obj/item/clothing/shoes/vampire/jackboots/work,
+ /obj/item/clothing/shoes/vampire/brown,
+ )
+ suit = pick(
+ /obj/item/clothing/suit/vampire/coat,
+ /obj/item/clothing/suit/vampire/coat/alt,
+ )
+ head = pick(
+ /obj/item/clothing/head/vampire/beanie/black,
+ /obj/item/clothing/head/vampire/beanie/homeless,
+ )
+ neck = pick(
+ /obj/item/clothing/neck/vampire/scarf/red,
+ /obj/item/clothing/neck/vampire/scarf,
+ /obj/item/clothing/neck/vampire/scarf/blue,
+ /obj/item/clothing/neck/vampire/scarf/green,
+ /obj/item/clothing/neck/vampire/scarf/white,
+ )
+
+/datum/outfit/npc/shop
+ name = "NPC Shopkeeper"
+ uniform = /obj/item/clothing/under/vampire/mechanic
+
+/datum/outfit/npc/shop/pre_equip(mob/living/carbon/human/user, visuals_only)
+ shoes = pick(
+ /obj/item/clothing/shoes/vampire/sneakers,
+ /obj/item/clothing/shoes/vampire,
+ /obj/item/clothing/shoes/vampire/brown,
+ )
+ l_pocket = pick(
+ /obj/item/stack/dollar/rand,
+ /obj/item/vamp/keys/npc,
+ null,
+ )
+
+/datum/outfit/npc/police
+ name = "NPC Police Officer"
+ uniform = /obj/item/clothing/under/vampire/police
+ shoes = /obj/item/clothing/shoes/vampire/jackboots
+ suit = /obj/item/clothing/suit/vampire/vest/police
+ head = /obj/item/clothing/head/vampire/police
+ gloves = /obj/item/clothing/gloves/color/black
+ r_hand = /obj/item/melee/baton
+ l_pocket = /obj/item/stack/dollar/rand
From afbc0de6f3d2d5fb6cf67c102177df011206bfec Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Sun, 21 Dec 2025 18:25:04 +0200
Subject: [PATCH 16/32] Update _npc.dm
---
modular_darkpack/modules/npc/code/human/_npc.dm | 1 -
1 file changed, 1 deletion(-)
diff --git a/modular_darkpack/modules/npc/code/human/_npc.dm b/modular_darkpack/modules/npc/code/human/_npc.dm
index 0ebeb1176a71..26fd12502a17 100644
--- a/modular_darkpack/modules/npc/code/human/_npc.dm
+++ b/modular_darkpack/modules/npc/code/human/_npc.dm
@@ -29,4 +29,3 @@
/mob/living/carbon/human/npc/police/standing
ai_controller = /datum/ai_controller/npc/stand_still
- outfit_type = /datum/outfit/npc/police
From c0e98cda509fedb45fdc8d9881093cc9596c85bc Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Sun, 21 Dec 2025 18:42:31 +0200
Subject: [PATCH 17/32] stand still NPC moment
---
.../_npc_ai.dm} | 0
.../{ => ai/behaviors}/random_movement.dm | 0
.../npc/code/human/ai/stand_still_npc_ai.dm | 38 +++++++++++++++++++
tgstation.dme | 5 ++-
4 files changed, 41 insertions(+), 2 deletions(-)
rename modular_darkpack/modules/npc/code/human/{base_npc_ai_controller.dm => ai/_npc_ai.dm} (100%)
rename modular_darkpack/modules/npc/code/human/{ => ai/behaviors}/random_movement.dm (100%)
create mode 100644 modular_darkpack/modules/npc/code/human/ai/stand_still_npc_ai.dm
diff --git a/modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm b/modular_darkpack/modules/npc/code/human/ai/_npc_ai.dm
similarity index 100%
rename from modular_darkpack/modules/npc/code/human/base_npc_ai_controller.dm
rename to modular_darkpack/modules/npc/code/human/ai/_npc_ai.dm
diff --git a/modular_darkpack/modules/npc/code/human/random_movement.dm b/modular_darkpack/modules/npc/code/human/ai/behaviors/random_movement.dm
similarity index 100%
rename from modular_darkpack/modules/npc/code/human/random_movement.dm
rename to modular_darkpack/modules/npc/code/human/ai/behaviors/random_movement.dm
diff --git a/modular_darkpack/modules/npc/code/human/ai/stand_still_npc_ai.dm b/modular_darkpack/modules/npc/code/human/ai/stand_still_npc_ai.dm
new file mode 100644
index 000000000000..a5e70a81646e
--- /dev/null
+++ b/modular_darkpack/modules/npc/code/human/ai/stand_still_npc_ai.dm
@@ -0,0 +1,38 @@
+/datum/ai_controller/npc/stand_still
+ ai_movement = /datum/ai_movement/jps
+ movement_delay = 0.8 SECONDS
+ planning_subtrees = list(
+ /datum/ai_planning_subtree/escape_captivity, // Resist out of cuffs or whatnot first.
+ /datum/ai_planning_subtree/target_retaliate, // Then handle combat.
+ /datum/ai_planning_subtree/basic_melee_attack_subtree,
+ /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee,
+ /datum/ai_planning_subtree/flee_target, // End handling combat.
+ /datum/ai_planning_subtree/go_home
+ )
+ blackboard = list(
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ BB_TARGET_MINIMUM_STAT = UNCONSCIOUS,
+ BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ BB_HOME_VILLAGE = null
+ )
+ can_idle = FALSE
+
+/datum/ai_controller/npc/stand_still/New(atom/new_pawn)
+ set_blackboard_key(BB_HOME_VILLAGE, get_turf(new_pawn))
+
+/datum/ai_planning_subtree/go_home
+ var/travel_behavior = /datum/ai_behavior/travel_towards/stop_on_arrival/npc
+
+/datum/ai_planning_subtree/go_home/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
+ if(controller.blackboard_key_exists(BB_TRAVEL_DESTINATION))
+ controller.queue_behavior(travel_behavior, BB_TRAVEL_DESTINATION)
+ return
+
+ controller.queue_behavior(/datum/ai_behavior/find_home, BB_TRAVEL_DESTINATION)
+
+/datum/ai_behavior/find_home
+ behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
+
+/datum/ai_behavior/find_home/perform(seconds_per_tick, datum/ai_controller/controller, destination)
+ controller.set_blackboard_key(destination, BB_HOME_VILLAGE)
+ return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
diff --git a/tgstation.dme b/tgstation.dme
index ccbe07efb253..ca160e94249d 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -7192,9 +7192,10 @@
#include "modular_darkpack\modules\mob_spawners\code\citizen.dm"
#include "modular_darkpack\modules\npc\code\landmarks.dm"
#include "modular_darkpack\modules\npc\code\human\_npc.dm"
-#include "modular_darkpack\modules\npc\code\human\base_npc_ai_controller.dm"
#include "modular_darkpack\modules\npc\code\human\clolthing_datums.dm"
-#include "modular_darkpack\modules\npc\code\human\random_movement.dm"
+#include "modular_darkpack\modules\npc\code\human\ai\_npc_ai.dm"
+#include "modular_darkpack\modules\npc\code\human\ai\stand_still_npc_ai.dm"
+#include "modular_darkpack\modules\npc\code\human\ai\behaviors\random_movement.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\blood_guard.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\necromancy_zombies.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\shadow_guard.dm"
From 5cc1e901eec9bc1c0129e0f2b2f0c3801e0b2cd3 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Sun, 21 Dec 2025 18:43:24 +0200
Subject: [PATCH 18/32] Update 438_NPCs.txt
---
tools/UpdatePaths/Scripts/DarkPack/438_NPCs.txt | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/tools/UpdatePaths/Scripts/DarkPack/438_NPCs.txt b/tools/UpdatePaths/Scripts/DarkPack/438_NPCs.txt
index 3d39f7ccd526..d2f3a17bd023 100644
--- a/tools/UpdatePaths/Scripts/DarkPack/438_NPCs.txt
+++ b/tools/UpdatePaths/Scripts/DarkPack/438_NPCs.txt
@@ -1,6 +1,5 @@
/obj/effect/landmark/npcbeacon/directed : @DELETE
/obj/effect/landmark/npc_spawn_point : @DELETE
-/obj/effect/landmark/npcwall : @DELETE
-/mob/living/carbon/human/npc/incel : @DELETE
-/mob/living/carbon/human/npc/hobo
-/mob/living/carbon/human/npc/shop
+/obj/effect/landmark/npcwall : /obj/effect/landmark/ai_avoid_turf
+/mob/living/carbon/human/npc/incel : /mob/living/carbon/human/npc
+/mob/living/carbon/human/npc/hobo : /mob/living/carbon/human/npc/poor
From 70173e122d92319d6e5cf6f7f6b0b3f33ca0d753 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Thu, 25 Dec 2025 03:22:17 +0200
Subject: [PATCH 19/32] clothing
---
.../npc/code/human/{clolthing_datums.dm => clothing_datums.dm} | 0
tgstation.dme | 2 +-
2 files changed, 1 insertion(+), 1 deletion(-)
rename modular_darkpack/modules/npc/code/human/{clolthing_datums.dm => clothing_datums.dm} (100%)
diff --git a/modular_darkpack/modules/npc/code/human/clolthing_datums.dm b/modular_darkpack/modules/npc/code/human/clothing_datums.dm
similarity index 100%
rename from modular_darkpack/modules/npc/code/human/clolthing_datums.dm
rename to modular_darkpack/modules/npc/code/human/clothing_datums.dm
diff --git a/tgstation.dme b/tgstation.dme
index ca160e94249d..820632b328fd 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -7192,7 +7192,7 @@
#include "modular_darkpack\modules\mob_spawners\code\citizen.dm"
#include "modular_darkpack\modules\npc\code\landmarks.dm"
#include "modular_darkpack\modules\npc\code\human\_npc.dm"
-#include "modular_darkpack\modules\npc\code\human\clolthing_datums.dm"
+#include "modular_darkpack\modules\npc\code\human\clothing_datums.dm"
#include "modular_darkpack\modules\npc\code\human\ai\_npc_ai.dm"
#include "modular_darkpack\modules\npc\code\human\ai\stand_still_npc_ai.dm"
#include "modular_darkpack\modules\npc\code\human\ai\behaviors\random_movement.dm"
From 401305b17b0b373b8fa3fa3fb8b4b4ee3046b994 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Thu, 25 Dec 2025 04:42:18 +0200
Subject: [PATCH 20/32] Update stand_still_npc_ai.dm
---
.../modules/npc/code/human/ai/stand_still_npc_ai.dm | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/modular_darkpack/modules/npc/code/human/ai/stand_still_npc_ai.dm b/modular_darkpack/modules/npc/code/human/ai/stand_still_npc_ai.dm
index a5e70a81646e..cf935d8afb2f 100644
--- a/modular_darkpack/modules/npc/code/human/ai/stand_still_npc_ai.dm
+++ b/modular_darkpack/modules/npc/code/human/ai/stand_still_npc_ai.dm
@@ -18,12 +18,15 @@
can_idle = FALSE
/datum/ai_controller/npc/stand_still/New(atom/new_pawn)
+ . = ..()
set_blackboard_key(BB_HOME_VILLAGE, get_turf(new_pawn))
/datum/ai_planning_subtree/go_home
var/travel_behavior = /datum/ai_behavior/travel_towards/stop_on_arrival/npc
/datum/ai_planning_subtree/go_home/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
+ if(get_turf(controller.pawn) == controller.blackboard[BB_HOME_VILLAGE])
+ return
if(controller.blackboard_key_exists(BB_TRAVEL_DESTINATION))
controller.queue_behavior(travel_behavior, BB_TRAVEL_DESTINATION)
return
@@ -34,5 +37,5 @@
behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
/datum/ai_behavior/find_home/perform(seconds_per_tick, datum/ai_controller/controller, destination)
- controller.set_blackboard_key(destination, BB_HOME_VILLAGE)
+ controller.set_blackboard_key(destination, controller.blackboard[BB_HOME_VILLAGE])
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
From 5516ccf9ab26d1021468c9166cd10e2a926b6362 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Thu, 25 Dec 2025 06:19:45 +0200
Subject: [PATCH 21/32] hostility.
---
modular_darkpack/modules/npc/code/human/_npc.dm | 3 +++
modular_darkpack/modules/npc/code/human/ai/_npc_ai.dm | 4 +---
.../modules/npc/code/human/ai/hostile_npc_ai.dm | 7 +++++++
.../modules/npc/code/human/ai/stand_still_npc_ai.dm | 7 ++++---
tgstation.dme | 1 +
5 files changed, 16 insertions(+), 6 deletions(-)
create mode 100644 modular_darkpack/modules/npc/code/human/ai/hostile_npc_ai.dm
diff --git a/modular_darkpack/modules/npc/code/human/_npc.dm b/modular_darkpack/modules/npc/code/human/_npc.dm
index 26fd12502a17..0b12f40b9bb2 100644
--- a/modular_darkpack/modules/npc/code/human/_npc.dm
+++ b/modular_darkpack/modules/npc/code/human/_npc.dm
@@ -6,9 +6,11 @@
/mob/living/carbon/human/npc/Initialize(mapload)
. = ..()
+ AddElement(/datum/element/ai_retaliate)
equipOutfit(outfit_type)
/mob/living/carbon/human/npc/bandit
+ ai_controller = /datum/ai_controller/npc/hostile
outfit_type = /datum/outfit/npc/bandit
/mob/living/carbon/human/npc/rich
@@ -25,6 +27,7 @@
outfit_type = /datum/outfit/npc/shop
/mob/living/carbon/human/npc/police
+ ai_controller = /datum/ai_controller/npc/hostile
outfit_type = /datum/outfit/npc/police
/mob/living/carbon/human/npc/police/standing
diff --git a/modular_darkpack/modules/npc/code/human/ai/_npc_ai.dm b/modular_darkpack/modules/npc/code/human/ai/_npc_ai.dm
index ad91e90add38..e41c69914921 100644
--- a/modular_darkpack/modules/npc/code/human/ai/_npc_ai.dm
+++ b/modular_darkpack/modules/npc/code/human/ai/_npc_ai.dm
@@ -4,9 +4,7 @@
planning_subtrees = list(
/datum/ai_planning_subtree/escape_captivity, // Resist out of cuffs or whatnot first.
/datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee, // Then handle combat.
- /datum/ai_planning_subtree/flee_target,
- /datum/ai_planning_subtree/target_retaliate,
- /datum/ai_planning_subtree/basic_melee_attack_subtree, // End handling combat.
+ /datum/ai_planning_subtree/flee_target, // End handling combat.
/datum/ai_planning_subtree/look_for_walk_target // Random walking behavior.
)
blackboard = list(
diff --git a/modular_darkpack/modules/npc/code/human/ai/hostile_npc_ai.dm b/modular_darkpack/modules/npc/code/human/ai/hostile_npc_ai.dm
new file mode 100644
index 000000000000..7616bb8b523c
--- /dev/null
+++ b/modular_darkpack/modules/npc/code/human/ai/hostile_npc_ai.dm
@@ -0,0 +1,7 @@
+/datum/ai_controller/npc/hostile
+ planning_subtrees = list(
+ /datum/ai_planning_subtree/escape_captivity, // Resist out of cuffs or whatnot first.
+ /datum/ai_planning_subtree/target_retaliate, // Then handle combat.
+ /datum/ai_planning_subtree/basic_melee_attack_subtree, // End handling combat.
+ /datum/ai_planning_subtree/look_for_walk_target // Random walking behavior.
+ )
diff --git a/modular_darkpack/modules/npc/code/human/ai/stand_still_npc_ai.dm b/modular_darkpack/modules/npc/code/human/ai/stand_still_npc_ai.dm
index cf935d8afb2f..5ad8bfc65797 100644
--- a/modular_darkpack/modules/npc/code/human/ai/stand_still_npc_ai.dm
+++ b/modular_darkpack/modules/npc/code/human/ai/stand_still_npc_ai.dm
@@ -4,9 +4,7 @@
planning_subtrees = list(
/datum/ai_planning_subtree/escape_captivity, // Resist out of cuffs or whatnot first.
/datum/ai_planning_subtree/target_retaliate, // Then handle combat.
- /datum/ai_planning_subtree/basic_melee_attack_subtree,
- /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee,
- /datum/ai_planning_subtree/flee_target, // End handling combat.
+ /datum/ai_planning_subtree/basic_melee_attack_subtree, // End handling combat.
/datum/ai_planning_subtree/go_home
)
blackboard = list(
@@ -26,6 +24,9 @@
/datum/ai_planning_subtree/go_home/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
if(get_turf(controller.pawn) == controller.blackboard[BB_HOME_VILLAGE])
+ var/mob/living/nearest_mob = get_closest_atom(/mob/living, oviewers(DEFAULT_SIGHT_DISTANCE, controller.pawn), controller.pawn)
+ if(can_see(controller.pawn, nearest_mob, DEFAULT_SIGHT_DISTANCE))
+ controller.pawn.dir = get_dir(controller.pawn, nearest_mob)
return
if(controller.blackboard_key_exists(BB_TRAVEL_DESTINATION))
controller.queue_behavior(travel_behavior, BB_TRAVEL_DESTINATION)
diff --git a/tgstation.dme b/tgstation.dme
index 820632b328fd..4ec970e11a01 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -7194,6 +7194,7 @@
#include "modular_darkpack\modules\npc\code\human\_npc.dm"
#include "modular_darkpack\modules\npc\code\human\clothing_datums.dm"
#include "modular_darkpack\modules\npc\code\human\ai\_npc_ai.dm"
+#include "modular_darkpack\modules\npc\code\human\ai\hostile_npc_ai.dm"
#include "modular_darkpack\modules\npc\code\human\ai\stand_still_npc_ai.dm"
#include "modular_darkpack\modules\npc\code\human\ai\behaviors\random_movement.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\blood_guard.dm"
From 1319f715302a29b14a71313994ecf6b99867a13e Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Thu, 25 Dec 2025 06:43:32 +0200
Subject: [PATCH 22/32] awa
---
modular_darkpack/modules/npc/code/human/ai/_npc_ai.dm | 1 +
modular_darkpack/modules/npc/code/human/ai/hostile_npc_ai.dm | 1 +
modular_darkpack/modules/npc/code/landmarks.dm | 3 +++
3 files changed, 5 insertions(+)
diff --git a/modular_darkpack/modules/npc/code/human/ai/_npc_ai.dm b/modular_darkpack/modules/npc/code/human/ai/_npc_ai.dm
index e41c69914921..bb0a6ed1dacb 100644
--- a/modular_darkpack/modules/npc/code/human/ai/_npc_ai.dm
+++ b/modular_darkpack/modules/npc/code/human/ai/_npc_ai.dm
@@ -11,6 +11,7 @@
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
BB_TARGET_MINIMUM_STAT = UNCONSCIOUS,
BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ BB_REINFORCEMENTS_EMOTE = "screams for help!",
)
can_idle = FALSE
diff --git a/modular_darkpack/modules/npc/code/human/ai/hostile_npc_ai.dm b/modular_darkpack/modules/npc/code/human/ai/hostile_npc_ai.dm
index 7616bb8b523c..1a32076dc9a3 100644
--- a/modular_darkpack/modules/npc/code/human/ai/hostile_npc_ai.dm
+++ b/modular_darkpack/modules/npc/code/human/ai/hostile_npc_ai.dm
@@ -2,6 +2,7 @@
planning_subtrees = list(
/datum/ai_planning_subtree/escape_captivity, // Resist out of cuffs or whatnot first.
/datum/ai_planning_subtree/target_retaliate, // Then handle combat.
+ /datum/ai_planning_subtree/call_reinforcements,
/datum/ai_planning_subtree/basic_melee_attack_subtree, // End handling combat.
/datum/ai_planning_subtree/look_for_walk_target // Random walking behavior.
)
diff --git a/modular_darkpack/modules/npc/code/landmarks.dm b/modular_darkpack/modules/npc/code/landmarks.dm
index 89ffb99f279f..3b06ed29e08c 100644
--- a/modular_darkpack/modules/npc/code/landmarks.dm
+++ b/modular_darkpack/modules/npc/code/landmarks.dm
@@ -8,4 +8,7 @@
can_astar_pass = CANASTARPASS_ALWAYS_PROC
/obj/effect/landmark/ai_avoid_turf/CanAStarPass(to_dir, datum/can_pass_info/pass_info)
+ var/mob/living/living_npc = pass_info.requester_ref?.resolve()
+ if(living_npc?.ai_controller?.blackboard[BB_BASIC_MOB_CURRENT_TARGET])
+ return TRUE
return FALSE
From ef0fc44bd143f24ded3991dd0204485510798227 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Thu, 25 Dec 2025 21:30:12 +0200
Subject: [PATCH 23/32] Update landmarks.dm
---
modular_darkpack/modules/npc/code/landmarks.dm | 1 +
1 file changed, 1 insertion(+)
diff --git a/modular_darkpack/modules/npc/code/landmarks.dm b/modular_darkpack/modules/npc/code/landmarks.dm
index 3b06ed29e08c..0b8031f3dbea 100644
--- a/modular_darkpack/modules/npc/code/landmarks.dm
+++ b/modular_darkpack/modules/npc/code/landmarks.dm
@@ -7,6 +7,7 @@
icon_state = "x"
can_astar_pass = CANASTARPASS_ALWAYS_PROC
+// We want NPCs avoiding crossing these unless they're actively chasing someone.
/obj/effect/landmark/ai_avoid_turf/CanAStarPass(to_dir, datum/can_pass_info/pass_info)
var/mob/living/living_npc = pass_info.requester_ref?.resolve()
if(living_npc?.ai_controller?.blackboard[BB_BASIC_MOB_CURRENT_TARGET])
From b886a29eb4950e2e9c1856bd7502d527fb6a3147 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Thu, 25 Dec 2025 21:58:04 +0200
Subject: [PATCH 24/32] aaaaaaaaaaa
---
modular_darkpack/modules/npc/code/human/_npc.dm | 4 ++--
.../modules/npc/code/human/ai/_npc_ai.dm | 3 ++-
.../ai/{hostile_npc_ai.dm => bandit_npc_ai.dm} | 8 +++++++-
.../modules/npc/code/human/ai/police_npc_ai.dm | 14 ++++++++++++++
tgstation.dme | 3 ++-
5 files changed, 27 insertions(+), 5 deletions(-)
rename modular_darkpack/modules/npc/code/human/ai/{hostile_npc_ai.dm => bandit_npc_ai.dm} (59%)
create mode 100644 modular_darkpack/modules/npc/code/human/ai/police_npc_ai.dm
diff --git a/modular_darkpack/modules/npc/code/human/_npc.dm b/modular_darkpack/modules/npc/code/human/_npc.dm
index 0b12f40b9bb2..4cdd9841d16b 100644
--- a/modular_darkpack/modules/npc/code/human/_npc.dm
+++ b/modular_darkpack/modules/npc/code/human/_npc.dm
@@ -10,7 +10,7 @@
equipOutfit(outfit_type)
/mob/living/carbon/human/npc/bandit
- ai_controller = /datum/ai_controller/npc/hostile
+ ai_controller = /datum/ai_controller/npc/bandit
outfit_type = /datum/outfit/npc/bandit
/mob/living/carbon/human/npc/rich
@@ -27,7 +27,7 @@
outfit_type = /datum/outfit/npc/shop
/mob/living/carbon/human/npc/police
- ai_controller = /datum/ai_controller/npc/hostile
+ ai_controller = /datum/ai_controller/npc/police
outfit_type = /datum/outfit/npc/police
/mob/living/carbon/human/npc/police/standing
diff --git a/modular_darkpack/modules/npc/code/human/ai/_npc_ai.dm b/modular_darkpack/modules/npc/code/human/ai/_npc_ai.dm
index bb0a6ed1dacb..e37c5899a592 100644
--- a/modular_darkpack/modules/npc/code/human/ai/_npc_ai.dm
+++ b/modular_darkpack/modules/npc/code/human/ai/_npc_ai.dm
@@ -4,6 +4,7 @@
planning_subtrees = list(
/datum/ai_planning_subtree/escape_captivity, // Resist out of cuffs or whatnot first.
/datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee, // Then handle combat.
+ /datum/ai_planning_subtree/call_reinforcements,
/datum/ai_planning_subtree/flee_target, // End handling combat.
/datum/ai_planning_subtree/look_for_walk_target // Random walking behavior.
)
@@ -11,7 +12,7 @@
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
BB_TARGET_MINIMUM_STAT = UNCONSCIOUS,
BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
- BB_REINFORCEMENTS_EMOTE = "screams for help!",
+ BB_REINFORCEMENTS_SAY = "HELP!!!",
)
can_idle = FALSE
diff --git a/modular_darkpack/modules/npc/code/human/ai/hostile_npc_ai.dm b/modular_darkpack/modules/npc/code/human/ai/bandit_npc_ai.dm
similarity index 59%
rename from modular_darkpack/modules/npc/code/human/ai/hostile_npc_ai.dm
rename to modular_darkpack/modules/npc/code/human/ai/bandit_npc_ai.dm
index 1a32076dc9a3..222f23e6070f 100644
--- a/modular_darkpack/modules/npc/code/human/ai/hostile_npc_ai.dm
+++ b/modular_darkpack/modules/npc/code/human/ai/bandit_npc_ai.dm
@@ -1,4 +1,4 @@
-/datum/ai_controller/npc/hostile
+/datum/ai_controller/npc/bandit
planning_subtrees = list(
/datum/ai_planning_subtree/escape_captivity, // Resist out of cuffs or whatnot first.
/datum/ai_planning_subtree/target_retaliate, // Then handle combat.
@@ -6,3 +6,9 @@
/datum/ai_planning_subtree/basic_melee_attack_subtree, // End handling combat.
/datum/ai_planning_subtree/look_for_walk_target // Random walking behavior.
)
+ blackboard = list(
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ BB_TARGET_MINIMUM_STAT = UNCONSCIOUS,
+ BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ BB_REINFORCEMENTS_SAY = "GET THIS BASTARD!",
+ )
diff --git a/modular_darkpack/modules/npc/code/human/ai/police_npc_ai.dm b/modular_darkpack/modules/npc/code/human/ai/police_npc_ai.dm
new file mode 100644
index 000000000000..d1eca0a5c521
--- /dev/null
+++ b/modular_darkpack/modules/npc/code/human/ai/police_npc_ai.dm
@@ -0,0 +1,14 @@
+/datum/ai_controller/npc/police
+ planning_subtrees = list(
+ /datum/ai_planning_subtree/escape_captivity, // Resist out of cuffs or whatnot first.
+ /datum/ai_planning_subtree/target_retaliate, // Then handle combat.
+ /datum/ai_planning_subtree/call_reinforcements,
+ /datum/ai_planning_subtree/basic_melee_attack_subtree, // End handling combat.
+ /datum/ai_planning_subtree/look_for_walk_target // Random walking behavior.
+ )
+ blackboard = list(
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ BB_TARGET_MINIMUM_STAT = UNCONSCIOUS,
+ BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ BB_REINFORCEMENTS_EMOTE = "presses their radio's emergency button.",
+ )
diff --git a/tgstation.dme b/tgstation.dme
index 4ec970e11a01..869f9877b428 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -7194,7 +7194,8 @@
#include "modular_darkpack\modules\npc\code\human\_npc.dm"
#include "modular_darkpack\modules\npc\code\human\clothing_datums.dm"
#include "modular_darkpack\modules\npc\code\human\ai\_npc_ai.dm"
-#include "modular_darkpack\modules\npc\code\human\ai\hostile_npc_ai.dm"
+#include "modular_darkpack\modules\npc\code\human\ai\bandit_npc_ai.dm"
+#include "modular_darkpack\modules\npc\code\human\ai\police_npc_ai.dm"
#include "modular_darkpack\modules\npc\code\human\ai\stand_still_npc_ai.dm"
#include "modular_darkpack\modules\npc\code\human\ai\behaviors\random_movement.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\blood_guard.dm"
From 8dac9f97992be5920aa310ccdfb5271d1242b382 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Thu, 25 Dec 2025 21:58:25 +0200
Subject: [PATCH 25/32] aa
---
.../npc/code/human/ai/{ => subtypes}/bandit_npc_ai.dm | 0
.../npc/code/human/ai/{ => subtypes}/police_npc_ai.dm | 0
.../npc/code/human/ai/{ => subtypes}/stand_still_npc_ai.dm | 0
tgstation.dme | 6 +++---
4 files changed, 3 insertions(+), 3 deletions(-)
rename modular_darkpack/modules/npc/code/human/ai/{ => subtypes}/bandit_npc_ai.dm (100%)
rename modular_darkpack/modules/npc/code/human/ai/{ => subtypes}/police_npc_ai.dm (100%)
rename modular_darkpack/modules/npc/code/human/ai/{ => subtypes}/stand_still_npc_ai.dm (100%)
diff --git a/modular_darkpack/modules/npc/code/human/ai/bandit_npc_ai.dm b/modular_darkpack/modules/npc/code/human/ai/subtypes/bandit_npc_ai.dm
similarity index 100%
rename from modular_darkpack/modules/npc/code/human/ai/bandit_npc_ai.dm
rename to modular_darkpack/modules/npc/code/human/ai/subtypes/bandit_npc_ai.dm
diff --git a/modular_darkpack/modules/npc/code/human/ai/police_npc_ai.dm b/modular_darkpack/modules/npc/code/human/ai/subtypes/police_npc_ai.dm
similarity index 100%
rename from modular_darkpack/modules/npc/code/human/ai/police_npc_ai.dm
rename to modular_darkpack/modules/npc/code/human/ai/subtypes/police_npc_ai.dm
diff --git a/modular_darkpack/modules/npc/code/human/ai/stand_still_npc_ai.dm b/modular_darkpack/modules/npc/code/human/ai/subtypes/stand_still_npc_ai.dm
similarity index 100%
rename from modular_darkpack/modules/npc/code/human/ai/stand_still_npc_ai.dm
rename to modular_darkpack/modules/npc/code/human/ai/subtypes/stand_still_npc_ai.dm
diff --git a/tgstation.dme b/tgstation.dme
index 869f9877b428..e11643b79320 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -7194,10 +7194,10 @@
#include "modular_darkpack\modules\npc\code\human\_npc.dm"
#include "modular_darkpack\modules\npc\code\human\clothing_datums.dm"
#include "modular_darkpack\modules\npc\code\human\ai\_npc_ai.dm"
-#include "modular_darkpack\modules\npc\code\human\ai\bandit_npc_ai.dm"
-#include "modular_darkpack\modules\npc\code\human\ai\police_npc_ai.dm"
-#include "modular_darkpack\modules\npc\code\human\ai\stand_still_npc_ai.dm"
#include "modular_darkpack\modules\npc\code\human\ai\behaviors\random_movement.dm"
+#include "modular_darkpack\modules\npc\code\human\ai\subtypes\bandit_npc_ai.dm"
+#include "modular_darkpack\modules\npc\code\human\ai\subtypes\police_npc_ai.dm"
+#include "modular_darkpack\modules\npc\code\human\ai\subtypes\stand_still_npc_ai.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\blood_guard.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\necromancy_zombies.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\shadow_guard.dm"
From 8b83632affcfc92d812be079489231daa48d2a67 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Fri, 26 Dec 2025 01:24:50 +0200
Subject: [PATCH 26/32] rahhh
---
.../human/ai/behaviors/choose_attack_subtree.dm | 16 ++++++++++++++++
.../npc/code/human/ai/subtypes/bandit_npc_ai.dm | 3 ++-
.../npc/code/human/ai/subtypes/police_npc_ai.dm | 2 +-
.../code/human/ai/subtypes/stand_still_npc_ai.dm | 2 +-
.../modules/npc/code/human/clothing_datums.dm | 5 +----
tgstation.dme | 1 +
6 files changed, 22 insertions(+), 7 deletions(-)
create mode 100644 modular_darkpack/modules/npc/code/human/ai/behaviors/choose_attack_subtree.dm
diff --git a/modular_darkpack/modules/npc/code/human/ai/behaviors/choose_attack_subtree.dm b/modular_darkpack/modules/npc/code/human/ai/behaviors/choose_attack_subtree.dm
new file mode 100644
index 000000000000..999ac0a1d73d
--- /dev/null
+++ b/modular_darkpack/modules/npc/code/human/ai/behaviors/choose_attack_subtree.dm
@@ -0,0 +1,16 @@
+/datum/ai_planning_subtree/choose_attack_subtree
+
+/datum/ai_planning_subtree/choose_attack_subtree/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
+ var/mob/living/carbon/human/human_pawn = controller.pawn
+ if(human_pawn.is_holding_item_of_types(typesof(/obj/item/gun)))
+ var/datum/ai_planning_subtree/basic_ranged_attack_subtree/npc/ranged_attack_subtree = GLOB.ai_subtrees[/datum/ai_planning_subtree/basic_ranged_attack_subtree]
+ ranged_attack_subtree.SelectBehaviors(controller, seconds_per_tick)
+ var/datum/ai_planning_subtree/basic_melee_attack_subtree/melee_attack_subtree = GLOB.ai_subtrees[/datum/ai_planning_subtree/basic_melee_attack_subtree]
+ melee_attack_subtree.SelectBehaviors(controller, seconds_per_tick)
+
+/datum/ai_planning_subtree/basic_ranged_attack_subtree/npc
+ ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/npc
+
+/datum/ai_behavior/basic_ranged_attack/npc
+ action_cooldown = 3 SECONDS
+ avoid_friendly_fire = TRUE
diff --git a/modular_darkpack/modules/npc/code/human/ai/subtypes/bandit_npc_ai.dm b/modular_darkpack/modules/npc/code/human/ai/subtypes/bandit_npc_ai.dm
index 222f23e6070f..2d24ba1302b8 100644
--- a/modular_darkpack/modules/npc/code/human/ai/subtypes/bandit_npc_ai.dm
+++ b/modular_darkpack/modules/npc/code/human/ai/subtypes/bandit_npc_ai.dm
@@ -3,7 +3,7 @@
/datum/ai_planning_subtree/escape_captivity, // Resist out of cuffs or whatnot first.
/datum/ai_planning_subtree/target_retaliate, // Then handle combat.
/datum/ai_planning_subtree/call_reinforcements,
- /datum/ai_planning_subtree/basic_melee_attack_subtree, // End handling combat.
+ /datum/ai_planning_subtree/choose_attack_subtree, // End handling combat.
/datum/ai_planning_subtree/look_for_walk_target // Random walking behavior.
)
blackboard = list(
@@ -12,3 +12,4 @@
BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
BB_REINFORCEMENTS_SAY = "GET THIS BASTARD!",
)
+
diff --git a/modular_darkpack/modules/npc/code/human/ai/subtypes/police_npc_ai.dm b/modular_darkpack/modules/npc/code/human/ai/subtypes/police_npc_ai.dm
index d1eca0a5c521..da695a7710e5 100644
--- a/modular_darkpack/modules/npc/code/human/ai/subtypes/police_npc_ai.dm
+++ b/modular_darkpack/modules/npc/code/human/ai/subtypes/police_npc_ai.dm
@@ -3,7 +3,7 @@
/datum/ai_planning_subtree/escape_captivity, // Resist out of cuffs or whatnot first.
/datum/ai_planning_subtree/target_retaliate, // Then handle combat.
/datum/ai_planning_subtree/call_reinforcements,
- /datum/ai_planning_subtree/basic_melee_attack_subtree, // End handling combat.
+ /datum/ai_planning_subtree/choose_attack_subtree, // End handling combat.
/datum/ai_planning_subtree/look_for_walk_target // Random walking behavior.
)
blackboard = list(
diff --git a/modular_darkpack/modules/npc/code/human/ai/subtypes/stand_still_npc_ai.dm b/modular_darkpack/modules/npc/code/human/ai/subtypes/stand_still_npc_ai.dm
index 5ad8bfc65797..e441b072f34e 100644
--- a/modular_darkpack/modules/npc/code/human/ai/subtypes/stand_still_npc_ai.dm
+++ b/modular_darkpack/modules/npc/code/human/ai/subtypes/stand_still_npc_ai.dm
@@ -4,7 +4,7 @@
planning_subtrees = list(
/datum/ai_planning_subtree/escape_captivity, // Resist out of cuffs or whatnot first.
/datum/ai_planning_subtree/target_retaliate, // Then handle combat.
- /datum/ai_planning_subtree/basic_melee_attack_subtree, // End handling combat.
+ /datum/ai_planning_subtree/choose_attack_subtree, // End handling combat.
/datum/ai_planning_subtree/go_home
)
blackboard = list(
diff --git a/modular_darkpack/modules/npc/code/human/clothing_datums.dm b/modular_darkpack/modules/npc/code/human/clothing_datums.dm
index 8286e081d5e8..0f3f4f518bda 100644
--- a/modular_darkpack/modules/npc/code/human/clothing_datums.dm
+++ b/modular_darkpack/modules/npc/code/human/clothing_datums.dm
@@ -2,10 +2,6 @@
name = "NPC Default"
uniform = /obj/item/clothing/under/vampire/gangrel
shoes = /obj/item/clothing/shoes/vampire
- backpack_contents = list(
- /obj/item/vamp/keys/npc = 1,
- /obj/item/stack/dollar/hundred = 1,
- )
/datum/outfit/npc/pre_equip(mob/living/carbon/human/user, visuals_only)
back = pick(
@@ -123,6 +119,7 @@
/datum/outfit/npc/poor
name = "NPC Poor"
+
/datum/outfit/npc/poor/pre_equip(mob/living/carbon/human/user, visuals_only)
uniform = pick(
/obj/item/clothing/under/vampire/homeless,
diff --git a/tgstation.dme b/tgstation.dme
index e11643b79320..f8d6f0920cb3 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -7194,6 +7194,7 @@
#include "modular_darkpack\modules\npc\code\human\_npc.dm"
#include "modular_darkpack\modules\npc\code\human\clothing_datums.dm"
#include "modular_darkpack\modules\npc\code\human\ai\_npc_ai.dm"
+#include "modular_darkpack\modules\npc\code\human\ai\behaviors\choose_attack_subtree.dm"
#include "modular_darkpack\modules\npc\code\human\ai\behaviors\random_movement.dm"
#include "modular_darkpack\modules\npc\code\human\ai\subtypes\bandit_npc_ai.dm"
#include "modular_darkpack\modules\npc\code\human\ai\subtypes\police_npc_ai.dm"
From 74f8c5d20cf15c112d5772caad4c0510ee88a8eb Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Fri, 26 Dec 2025 01:35:23 +0200
Subject: [PATCH 27/32] Update clothing_datums.dm
---
.../modules/npc/code/human/clothing_datums.dm | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/modular_darkpack/modules/npc/code/human/clothing_datums.dm b/modular_darkpack/modules/npc/code/human/clothing_datums.dm
index 0f3f4f518bda..a00b653c936c 100644
--- a/modular_darkpack/modules/npc/code/human/clothing_datums.dm
+++ b/modular_darkpack/modules/npc/code/human/clothing_datums.dm
@@ -4,6 +4,7 @@
shoes = /obj/item/clothing/shoes/vampire
/datum/outfit/npc/pre_equip(mob/living/carbon/human/user, visuals_only)
+ . = ..()
back = pick(
/obj/item/storage/backpack,
/obj/item/storage/backpack/satchel,
@@ -13,11 +14,11 @@
null,
)
-
/datum/outfit/npc/bandit
name = "NPC Bandit"
/datum/outfit/npc/bandit/pre_equip(mob/living/carbon/human/user, visuals_only)
+ . = ..()
shoes = pick(
/obj/item/clothing/shoes/vampire/sneakers,
/obj/item/clothing/shoes/vampire/sneakers/red,
@@ -57,6 +58,7 @@
name = "NPC Rich"
/datum/outfit/npc/bandit/pre_equip(mob/living/carbon/human/user, visuals_only)
+ . = ..()
uniform = pick(
/obj/item/clothing/shoes/vampire/white,
/obj/item/clothing/under/vampire/rich,
@@ -89,6 +91,7 @@
name = "NPC Average"
/datum/outfit/npc/average/pre_equip(mob/living/carbon/human/user, visuals_only)
+ . = ..()
uniform = pick(
/obj/item/clothing/under/vampire/mechanic,
/obj/item/clothing/under/vampire/sport,
@@ -121,6 +124,7 @@
name = "NPC Poor"
/datum/outfit/npc/poor/pre_equip(mob/living/carbon/human/user, visuals_only)
+ . = ..()
uniform = pick(
/obj/item/clothing/under/vampire/homeless,
/obj/item/clothing/under/vampire/homeless/female,
@@ -150,6 +154,7 @@
uniform = /obj/item/clothing/under/vampire/mechanic
/datum/outfit/npc/shop/pre_equip(mob/living/carbon/human/user, visuals_only)
+ . = ..()
shoes = pick(
/obj/item/clothing/shoes/vampire/sneakers,
/obj/item/clothing/shoes/vampire,
@@ -168,5 +173,12 @@
suit = /obj/item/clothing/suit/vampire/vest/police
head = /obj/item/clothing/head/vampire/police
gloves = /obj/item/clothing/gloves/color/black
- r_hand = /obj/item/melee/baton
l_pocket = /obj/item/stack/dollar/rand
+
+/datum/outfit/npc/police/pre_equip(mob/living/carbon/human/user, visuals_only)
+ . = ..()
+ r_hand = pick(
+ /obj/item/melee/baton,
+ /obj/item/gun/ballistic/automatic/pistol/darkpack/glock19,
+ null,
+ )
From ba388bc6e41a3e708c86eb9c05266d661d4ce101 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Fri, 26 Dec 2025 01:42:12 +0200
Subject: [PATCH 28/32] Update choose_attack_subtree.dm
---
.../npc/code/human/ai/behaviors/choose_attack_subtree.dm | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/modular_darkpack/modules/npc/code/human/ai/behaviors/choose_attack_subtree.dm b/modular_darkpack/modules/npc/code/human/ai/behaviors/choose_attack_subtree.dm
index 999ac0a1d73d..ee8195573024 100644
--- a/modular_darkpack/modules/npc/code/human/ai/behaviors/choose_attack_subtree.dm
+++ b/modular_darkpack/modules/npc/code/human/ai/behaviors/choose_attack_subtree.dm
@@ -2,9 +2,11 @@
/datum/ai_planning_subtree/choose_attack_subtree/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
var/mob/living/carbon/human/human_pawn = controller.pawn
- if(human_pawn.is_holding_item_of_types(typesof(/obj/item/gun)))
+
+ if(human_pawn.is_holding_item_of_type(/obj/item/gun))
var/datum/ai_planning_subtree/basic_ranged_attack_subtree/npc/ranged_attack_subtree = GLOB.ai_subtrees[/datum/ai_planning_subtree/basic_ranged_attack_subtree]
ranged_attack_subtree.SelectBehaviors(controller, seconds_per_tick)
+
var/datum/ai_planning_subtree/basic_melee_attack_subtree/melee_attack_subtree = GLOB.ai_subtrees[/datum/ai_planning_subtree/basic_melee_attack_subtree]
melee_attack_subtree.SelectBehaviors(controller, seconds_per_tick)
From cd7ba54f4f293423743bc7b54ebe26e0f7a73298 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Fri, 26 Dec 2025 01:56:19 +0200
Subject: [PATCH 29/32] Update clothing_datums.dm
---
modular_darkpack/modules/npc/code/human/clothing_datums.dm | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/modular_darkpack/modules/npc/code/human/clothing_datums.dm b/modular_darkpack/modules/npc/code/human/clothing_datums.dm
index a00b653c936c..7e0c489f21df 100644
--- a/modular_darkpack/modules/npc/code/human/clothing_datums.dm
+++ b/modular_darkpack/modules/npc/code/human/clothing_datums.dm
@@ -57,10 +57,9 @@
/datum/outfit/npc/rich
name = "NPC Rich"
-/datum/outfit/npc/bandit/pre_equip(mob/living/carbon/human/user, visuals_only)
+/datum/outfit/npc/rich/pre_equip(mob/living/carbon/human/user, visuals_only)
. = ..()
uniform = pick(
- /obj/item/clothing/shoes/vampire/white,
/obj/item/clothing/under/vampire/rich,
/obj/item/clothing/under/vampire/business,
)
From 76abb5551da443a219b587f3af94c2f22557a0dd Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Fri, 26 Dec 2025 02:33:11 +0200
Subject: [PATCH 30/32] guns now shoot people
---
.../modules/npc/code/human/_npc.dm | 35 +++++++++++++++++++
.../modules/npc/code/human/ai/_npc_ai.dm | 1 +
.../ai/behaviors/choose_attack_subtree.dm | 2 ++
3 files changed, 38 insertions(+)
diff --git a/modular_darkpack/modules/npc/code/human/_npc.dm b/modular_darkpack/modules/npc/code/human/_npc.dm
index 4cdd9841d16b..7e8ff999309b 100644
--- a/modular_darkpack/modules/npc/code/human/_npc.dm
+++ b/modular_darkpack/modules/npc/code/human/_npc.dm
@@ -9,6 +9,41 @@
AddElement(/datum/element/ai_retaliate)
equipOutfit(outfit_type)
+/mob/living/carbon/human/npc/RangedAttack(atom/atom_target, modifiers)
+ . = ..()
+ INVOKE_ASYNC(src, PROC_REF(fire_gun), atom_target, modifiers)
+
+/mob/living/carbon/human/npc/proc/fire_gun(atom/target, modifiers)
+ var/obj/item/gun/gun = locate() in contents
+ if(!gun.can_shoot())
+ if(istype(gun, /obj/item/gun/ballistic))
+ var/obj/item/gun/ballistic/ballistic = gun
+ if(!ballistic.chambered || ballistic.bolt_locked)
+ ballistic.rack() //we racked so both checked variables should be something else now
+ // do we have nothing chambered/chambered is spent AND we have no mag or our mag is empty
+ if(!ballistic.chambered?.loaded_projectile && magazine_useless(gun)) // ran out of ammo
+ ai_controller?.set_blackboard_key(BB_GUNMIMIC_GUN_EMPTY, TRUE) //BANZAIIIIIIII
+ ai_controller?.CancelActions()
+ else //if we cant fire we probably like ran out of energy or magic charges or whatever the hell idk
+ ai_controller?.set_blackboard_key(BB_GUNMIMIC_GUN_EMPTY, TRUE)
+ ai_controller?.CancelActions() // Stop our firing behavior so we can plan melee
+ else
+ ai_controller?.set_blackboard_key(BB_GUNMIMIC_GUN_EMPTY, FALSE)
+ gun.fire_gun(target, user = src, flag = FALSE, params = modifiers) //still make like a cool click click sound if trying to fire empty
+
+/mob/living/carbon/human/npc/proc/magazine_useless(obj/item/gun/ballistic/ballistic)
+ if(isnull(ballistic.magazine) || !length(ballistic.magazine.stored_ammo))
+ return TRUE
+ // is there ATLEAST one unspent round (for the sake of revolvers or a magazine somehow having spent rounds in it)
+ for(var/obj/item/ammo_casing/thing as anything in ballistic.magazine.stored_ammo)
+ if(ispath(thing))
+ return FALSE // unspent
+ if(!isnull(thing.loaded_projectile))
+ return FALSE //unspent
+ return TRUE
+
+/// NPC subtypes
+
/mob/living/carbon/human/npc/bandit
ai_controller = /datum/ai_controller/npc/bandit
outfit_type = /datum/outfit/npc/bandit
diff --git a/modular_darkpack/modules/npc/code/human/ai/_npc_ai.dm b/modular_darkpack/modules/npc/code/human/ai/_npc_ai.dm
index e37c5899a592..9d3660b4cb54 100644
--- a/modular_darkpack/modules/npc/code/human/ai/_npc_ai.dm
+++ b/modular_darkpack/modules/npc/code/human/ai/_npc_ai.dm
@@ -13,6 +13,7 @@
BB_TARGET_MINIMUM_STAT = UNCONSCIOUS,
BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
BB_REINFORCEMENTS_SAY = "HELP!!!",
+ BB_GUNMIMIC_GUN_EMPTY = FALSE,
)
can_idle = FALSE
diff --git a/modular_darkpack/modules/npc/code/human/ai/behaviors/choose_attack_subtree.dm b/modular_darkpack/modules/npc/code/human/ai/behaviors/choose_attack_subtree.dm
index ee8195573024..b546bb5e7492 100644
--- a/modular_darkpack/modules/npc/code/human/ai/behaviors/choose_attack_subtree.dm
+++ b/modular_darkpack/modules/npc/code/human/ai/behaviors/choose_attack_subtree.dm
@@ -4,6 +4,8 @@
var/mob/living/carbon/human/human_pawn = controller.pawn
if(human_pawn.is_holding_item_of_type(/obj/item/gun))
+ if(controller.blackboard[BB_GUNMIMIC_GUN_EMPTY])
+ return
var/datum/ai_planning_subtree/basic_ranged_attack_subtree/npc/ranged_attack_subtree = GLOB.ai_subtrees[/datum/ai_planning_subtree/basic_ranged_attack_subtree]
ranged_attack_subtree.SelectBehaviors(controller, seconds_per_tick)
From 412ec1428a8ae5e9877a46914989f66ca84427fd Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Fri, 26 Dec 2025 21:31:49 +0200
Subject: [PATCH 31/32] awawa
---
_maps/map_files/generic/CentCom_minimal.dmm | 156 +++++++++++-------
.../ai/behaviors/choose_attack_subtree.dm | 11 +-
.../code/human/ai/behaviors/find_weapon.dm | 51 ++++++
.../code/human/ai/subtypes/bandit_npc_ai.dm | 3 +
.../code/human/ai/subtypes/police_npc_ai.dm | 3 +
.../human/ai/subtypes/stand_still_npc_ai.dm | 4 +
tgstation.dme | 1 +
7 files changed, 168 insertions(+), 61 deletions(-)
create mode 100644 modular_darkpack/modules/npc/code/human/ai/behaviors/find_weapon.dm
diff --git a/_maps/map_files/generic/CentCom_minimal.dmm b/_maps/map_files/generic/CentCom_minimal.dmm
index 053792354325..68b9df987d56 100644
--- a/_maps/map_files/generic/CentCom_minimal.dmm
+++ b/_maps/map_files/generic/CentCom_minimal.dmm
@@ -2,29 +2,65 @@
"a" = (
/turf/open/floor/iron,
/area/centcom/central_command_areas/control)
-"g" = (
-/obj/machinery/light/floor,
-/turf/open/floor/iron,
+"d" = (
+/turf/closed/wall/vampwall,
/area/centcom/central_command_areas/control)
"h" = (
/turf/closed/indestructible/riveted,
/area/centcom/central_command_areas/control)
+"p" = (
+/obj/machinery/light/floor,
+/obj/effect/landmark/npcbeacon,
+/turf/open/floor/iron,
+/area/centcom/central_command_areas/control)
+"s" = (
+/mob/living/carbon/human/npc/police/standing,
+/turf/open/floor/iron,
+/area/centcom/central_command_areas/control)
"x" = (
/obj/effect/landmark/error,
/obj/effect/landmark/observer_start,
/obj/effect/landmark/latejoin,
/turf/open/floor/iron,
/area/centcom/central_command_areas/control)
+"y" = (
+/obj/structure/vampdoor{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/centcom/central_command_areas/control)
"A" = (
/turf/cordon,
/area/space)
"G" = (
/turf/closed/indestructible/splashscreen,
/area/space)
+"H" = (
+/obj/effect/landmark/npcbeacon,
+/obj/machinery/light/floor,
+/turf/open/floor/iron,
+/area/centcom/central_command_areas/control)
+"P" = (
+/obj/structure/vampdoor,
+/turf/open/floor/iron,
+/area/centcom/central_command_areas/control)
+"Q" = (
+/obj/effect/landmark/ai_avoid_turf,
+/turf/open/floor/carpet,
+/area/centcom/central_command_areas/control)
+"U" = (
+/mob/living/carbon/human/npc,
+/turf/open/floor/iron,
+/area/centcom/central_command_areas/control)
"W" = (
/obj/effect/landmark/start/new_player,
/turf/cordon,
/area/space)
+"Z" = (
+/obj/effect/landmark/ai_avoid_turf,
+/obj/effect/landmark/ai_avoid_turf,
+/turf/open/floor/carpet,
+/area/centcom/central_command_areas/control)
(1,1,1) = {"
A
@@ -144,9 +180,9 @@ a
a
a
a
+Q
a
-a
-a
+Q
a
a
a
@@ -173,15 +209,15 @@ A
h
a
a
+H
a
a
+Q
+p
+Q
a
a
-g
-a
-a
-a
-a
+H
a
a
h
@@ -208,9 +244,9 @@ a
a
a
a
-a
-a
-a
+Q
+Q
+Q
a
a
a
@@ -268,17 +304,17 @@ A
A
h
a
+Q
+Q
+Q
a
a
a
a
a
-a
-a
-a
-a
-a
-a
+Q
+Q
+Q
a
h
"}
@@ -301,15 +337,15 @@ A
h
a
a
-g
-a
-a
+p
+Q
+U
a
-g
+p
x
a
-a
-g
+Q
+p
a
a
h
@@ -332,17 +368,17 @@ A
A
h
a
+Q
+Q
+Q
a
a
+s
a
a
-a
-a
-a
-a
-a
-a
-a
+Z
+Q
+Q
a
h
"}
@@ -363,19 +399,19 @@ A
A
A
h
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
+d
+d
+d
+d
+y
+d
+d
+d
+y
+d
+d
+d
+d
h
"}
(12,1,1) = {"
@@ -400,11 +436,11 @@ a
a
a
a
+Q
+Q
+Q
a
-a
-a
-a
-a
+d
a
a
a
@@ -429,15 +465,15 @@ A
h
a
a
+H
a
a
+Q
+p
+Q
a
-a
-g
-a
-a
-a
-a
+d
+H
a
a
h
@@ -464,11 +500,11 @@ a
a
a
a
+Q
a
+Q
a
-a
-a
-a
+d
a
a
a
@@ -500,7 +536,7 @@ a
a
a
a
-a
+P
a
a
a
@@ -532,7 +568,7 @@ a
a
a
a
-a
+d
a
a
a
diff --git a/modular_darkpack/modules/npc/code/human/ai/behaviors/choose_attack_subtree.dm b/modular_darkpack/modules/npc/code/human/ai/behaviors/choose_attack_subtree.dm
index b546bb5e7492..0db906c8ec77 100644
--- a/modular_darkpack/modules/npc/code/human/ai/behaviors/choose_attack_subtree.dm
+++ b/modular_darkpack/modules/npc/code/human/ai/behaviors/choose_attack_subtree.dm
@@ -5,11 +5,12 @@
if(human_pawn.is_holding_item_of_type(/obj/item/gun))
if(controller.blackboard[BB_GUNMIMIC_GUN_EMPTY])
+ controller.queue_behavior(/datum/ai_behavior/find_weapon)
return
var/datum/ai_planning_subtree/basic_ranged_attack_subtree/npc/ranged_attack_subtree = GLOB.ai_subtrees[/datum/ai_planning_subtree/basic_ranged_attack_subtree]
ranged_attack_subtree.SelectBehaviors(controller, seconds_per_tick)
- var/datum/ai_planning_subtree/basic_melee_attack_subtree/melee_attack_subtree = GLOB.ai_subtrees[/datum/ai_planning_subtree/basic_melee_attack_subtree]
+ var/datum/ai_planning_subtree/basic_melee_attack_subtree/npc/melee_attack_subtree = GLOB.ai_subtrees[/datum/ai_planning_subtree/basic_melee_attack_subtree]
melee_attack_subtree.SelectBehaviors(controller, seconds_per_tick)
/datum/ai_planning_subtree/basic_ranged_attack_subtree/npc
@@ -18,3 +19,11 @@
/datum/ai_behavior/basic_ranged_attack/npc
action_cooldown = 3 SECONDS
avoid_friendly_fire = TRUE
+
+/datum/ai_planning_subtree/basic_melee_attack_subtree/npc
+ melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/npc
+ end_planning = FALSE
+
+/datum/ai_behavior/basic_melee_attack/npc
+ action_cooldown = 0.2 SECONDS // We gotta check unfortunately often because we're in a race condition with nextmove
+ behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION | AI_BEHAVIOR_REQUIRE_REACH
diff --git a/modular_darkpack/modules/npc/code/human/ai/behaviors/find_weapon.dm b/modular_darkpack/modules/npc/code/human/ai/behaviors/find_weapon.dm
new file mode 100644
index 000000000000..79195c7c0736
--- /dev/null
+++ b/modular_darkpack/modules/npc/code/human/ai/behaviors/find_weapon.dm
@@ -0,0 +1,51 @@
+/datum/ai_planning_subtree/search_for_weapon
+
+/datum/ai_planning_subtree/search_for_weapon/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
+ if(controller.blackboard_key_exists(BB_MONKEY_BEST_FORCE_FOUND))
+ return
+ controller.queue_behavior(/datum/ai_behavior/find_weapon)
+
+///re-used behavior pattern by monkeys for finding a weapon
+/datum/ai_behavior/find_weapon
+
+/datum/ai_behavior/find_weapon/perform(seconds_per_tick, datum/ai_controller/controller, ...)
+ var/mob/living/living_pawn = controller.pawn
+
+ if(!(locate(/obj/item) in living_pawn.held_items))
+ controller.set_blackboard_key(BB_MONKEY_BEST_FORCE_FOUND, 0)
+
+ if(controller.blackboard[BB_MONKEY_GUN_NEURONS_ACTIVATED] && (locate(/obj/item/gun) in living_pawn.held_items) && !controller.blackboard_key_exists(BB_GUNMIMIC_GUN_EMPTY))
+ // We have a loaded gun, what could we possibly want?
+ return AI_BEHAVIOR_FAILED
+
+ var/obj/item/weapon
+ var/list/nearby_items = list()
+ for(var/obj/item/item in oview(2, living_pawn))
+ nearby_items += item
+
+ for(var/obj/item/item in living_pawn.held_items) // If we've got some garbage in out hands that's going to stop us from effectively attacking, we should get rid of it.
+ if(item.force < 2)
+ living_pawn.dropItemToGround(item)
+
+ weapon = GetBestWeapon(controller, nearby_items, living_pawn.held_items)
+
+ var/pickpocket = FALSE
+ for(var/mob/living/carbon/human/human in oview(5, living_pawn))
+ var/obj/item/held_weapon = GetBestWeapon(controller, human.held_items + weapon, living_pawn.held_items)
+ if(held_weapon == weapon) // It's just the same one, not a held one
+ continue
+ pickpocket = TRUE
+ weapon = held_weapon
+
+ if(!weapon || (weapon in living_pawn.held_items))
+ return AI_BEHAVIOR_FAILED
+
+ if(weapon.force < 2) // our bite does 2 damage on average, no point in settling for anything less
+ return AI_BEHAVIOR_FAILED
+
+ controller.set_blackboard_key(BB_MONKEY_PICKUPTARGET, weapon)
+ if(pickpocket)
+ controller.queue_behavior(/datum/ai_behavior/monkey_equip/pickpocket, BB_MONKEY_PICKUPTARGET)
+ else
+ controller.queue_behavior(/datum/ai_behavior/monkey_equip/ground, BB_MONKEY_PICKUPTARGET)
+ return AI_BEHAVIOR_SUCCEEDED | AI_BEHAVIOR_DELAY
diff --git a/modular_darkpack/modules/npc/code/human/ai/subtypes/bandit_npc_ai.dm b/modular_darkpack/modules/npc/code/human/ai/subtypes/bandit_npc_ai.dm
index 2d24ba1302b8..b0bc24f9963a 100644
--- a/modular_darkpack/modules/npc/code/human/ai/subtypes/bandit_npc_ai.dm
+++ b/modular_darkpack/modules/npc/code/human/ai/subtypes/bandit_npc_ai.dm
@@ -3,6 +3,7 @@
/datum/ai_planning_subtree/escape_captivity, // Resist out of cuffs or whatnot first.
/datum/ai_planning_subtree/target_retaliate, // Then handle combat.
/datum/ai_planning_subtree/call_reinforcements,
+ /datum/ai_planning_subtree/search_for_weapon,
/datum/ai_planning_subtree/choose_attack_subtree, // End handling combat.
/datum/ai_planning_subtree/look_for_walk_target // Random walking behavior.
)
@@ -11,5 +12,7 @@
BB_TARGET_MINIMUM_STAT = UNCONSCIOUS,
BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
BB_REINFORCEMENTS_SAY = "GET THIS BASTARD!",
+ BB_GUNMIMIC_GUN_EMPTY = FALSE,
+ BB_MONKEY_BLACKLISTITEMS = list(),
)
diff --git a/modular_darkpack/modules/npc/code/human/ai/subtypes/police_npc_ai.dm b/modular_darkpack/modules/npc/code/human/ai/subtypes/police_npc_ai.dm
index da695a7710e5..81ebf26daae3 100644
--- a/modular_darkpack/modules/npc/code/human/ai/subtypes/police_npc_ai.dm
+++ b/modular_darkpack/modules/npc/code/human/ai/subtypes/police_npc_ai.dm
@@ -3,6 +3,7 @@
/datum/ai_planning_subtree/escape_captivity, // Resist out of cuffs or whatnot first.
/datum/ai_planning_subtree/target_retaliate, // Then handle combat.
/datum/ai_planning_subtree/call_reinforcements,
+ /datum/ai_planning_subtree/search_for_weapon,
/datum/ai_planning_subtree/choose_attack_subtree, // End handling combat.
/datum/ai_planning_subtree/look_for_walk_target // Random walking behavior.
)
@@ -11,4 +12,6 @@
BB_TARGET_MINIMUM_STAT = UNCONSCIOUS,
BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
BB_REINFORCEMENTS_EMOTE = "presses their radio's emergency button.",
+ BB_GUNMIMIC_GUN_EMPTY = FALSE,
+ BB_MONKEY_BLACKLISTITEMS = list(),
)
diff --git a/modular_darkpack/modules/npc/code/human/ai/subtypes/stand_still_npc_ai.dm b/modular_darkpack/modules/npc/code/human/ai/subtypes/stand_still_npc_ai.dm
index e441b072f34e..18a2e346295d 100644
--- a/modular_darkpack/modules/npc/code/human/ai/subtypes/stand_still_npc_ai.dm
+++ b/modular_darkpack/modules/npc/code/human/ai/subtypes/stand_still_npc_ai.dm
@@ -4,6 +4,7 @@
planning_subtrees = list(
/datum/ai_planning_subtree/escape_captivity, // Resist out of cuffs or whatnot first.
/datum/ai_planning_subtree/target_retaliate, // Then handle combat.
+ /datum/ai_planning_subtree/search_for_weapon,
/datum/ai_planning_subtree/choose_attack_subtree, // End handling combat.
/datum/ai_planning_subtree/go_home
)
@@ -11,6 +12,9 @@
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
BB_TARGET_MINIMUM_STAT = UNCONSCIOUS,
BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ BB_REINFORCEMENTS_EMOTE = "presses their radio's emergency button.",
+ BB_GUNMIMIC_GUN_EMPTY = FALSE,
+ BB_MONKEY_BLACKLISTITEMS = list(),
BB_HOME_VILLAGE = null
)
can_idle = FALSE
diff --git a/tgstation.dme b/tgstation.dme
index 0be5124f6784..eece1e33e904 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -7201,6 +7201,7 @@
#include "modular_darkpack\modules\npc\code\human\clothing_datums.dm"
#include "modular_darkpack\modules\npc\code\human\ai\_npc_ai.dm"
#include "modular_darkpack\modules\npc\code\human\ai\behaviors\choose_attack_subtree.dm"
+#include "modular_darkpack\modules\npc\code\human\ai\behaviors\find_weapon.dm"
#include "modular_darkpack\modules\npc\code\human\ai\behaviors\random_movement.dm"
#include "modular_darkpack\modules\npc\code\human\ai\subtypes\bandit_npc_ai.dm"
#include "modular_darkpack\modules\npc\code\human\ai\subtypes\police_npc_ai.dm"
From 6cd096566de9baca14bc47580af5c54e48dddb25 Mon Sep 17 00:00:00 2001
From: XeonMations <62395746+XeonMations@users.noreply.github.com>
Date: Thu, 22 Jan 2026 20:34:10 +0200
Subject: [PATCH 32/32] Update obfuscate.dm
---
.../code/discipline/obfuscate/obfuscate.dm | 20 -------------------
1 file changed, 20 deletions(-)
diff --git a/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm b/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm
index 99e25cd1bbcb..e1cfe831f33f 100644
--- a/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm
+++ b/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm
@@ -87,10 +87,6 @@
RegisterSignals(owner, aggressive_signals, PROC_REF(on_combat_signal))
RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(handle_move))
RegisterSignal(owner, COMSIG_POWER_ACTIVATE, PROC_REF(on_discipline_activation))
-
- for(var/mob/living/carbon/human/npc/NPC in GLOB.npc_list)
- if (NPC.danger_source == owner)
- NPC.danger_source = null
ADD_TRAIT(owner, TRAIT_OBFUSCATED, OBFUSCATE_TRAIT)
/datum/discipline_power/obfuscate/cloak_of_shadows/deactivate()
@@ -136,11 +132,6 @@
RegisterSignals(owner, aggressive_signals, PROC_REF(on_combat_signal))
RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(handle_move))
RegisterSignal(owner, COMSIG_POWER_ACTIVATE, PROC_REF(on_discipline_activation))
-
- for(var/mob/living/carbon/human/npc/NPC in GLOB.npc_list)
- if (NPC.danger_source == owner)
- NPC.danger_source = null
-
ADD_TRAIT(owner, TRAIT_OBFUSCATED, OBFUSCATE_TRAIT)
/datum/discipline_power/obfuscate/unseen_presence/deactivate()
@@ -263,10 +254,6 @@
owner.updateappearance(mutcolor_update = TRUE)
to_chat(owner, span_notice("You assume the appearance of [target.name]."))
- for(var/mob/living/carbon/human/npc/NPC in GLOB.npc_list)
- if (NPC.danger_source == owner)
- NPC.danger_source = null
-
/datum/discipline_power/obfuscate/mask_of_a_thousand_faces/deactivate()
. = ..()
original_dna.copy_dna(owner.dna, 0)
@@ -309,9 +296,6 @@
RegisterSignals(owner, aggressive_signals, PROC_REF(on_combat_signal))
RegisterSignal(owner, COMSIG_POWER_ACTIVATE, PROC_REF(on_discipline_activation))
- for(var/mob/living/carbon/human/npc/NPC in GLOB.npc_list)
- if (NPC.danger_source == owner)
- NPC.danger_source = null
if(prob(1))
SEND_SIGNAL(SSmasquerade, COMSIG_PLAYER_MASQUERADE_REINFORCE, owner)
@@ -345,10 +329,6 @@
. = ..()
RegisterSignals(owner, aggressive_signals, PROC_REF(on_combat_signal))
RegisterSignal(owner, COMSIG_POWER_ACTIVATE, PROC_REF(on_discipline_activation))
-
- for(var/mob/living/carbon/human/npc/NPC in GLOB.npc_list)
- if (NPC.danger_source == owner)
- NPC.danger_source = null
ADD_TRAIT(owner, TRAIT_OBFUSCATED, OBFUSCATE_TRAIT)
/datum/discipline_power/obfuscate/cloak_the_gathering/deactivate()