"
if(!length(data_entries))
report_text += "No forensic traces found."
else
diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm
index 76fe9d365490..98b7e92c5180 100644
--- a/code/modules/events/_event.dm
+++ b/code/modules/events/_event.dm
@@ -38,6 +38,8 @@
/// Flags dictating whether this event should be run on certain kinds of map
var/map_flags = NONE
+ var/darkpack_allowed = FALSE // DARKPACK EDIT ADD - EVENTS
+
/datum/round_event_control/New()
if(!length(admin_setup))
return
diff --git a/code/modules/food_and_drinks/machinery/icecream_vat.dm b/code/modules/food_and_drinks/machinery/icecream_vat.dm
index 6e20c2a50d4b..4c6515b48ef4 100644
--- a/code/modules/food_and_drinks/machinery/icecream_vat.dm
+++ b/code/modules/food_and_drinks/machinery/icecream_vat.dm
@@ -32,9 +32,9 @@
///List of all reagenets the icecream vat will spawn with, if preinstall_reagents is TRUE.
var/static/list/icecream_vat_reagents = list(
/datum/reagent/consumable/milk = 6,
-// /datum/reagent/consumable/korta_milk = 6, // DARKPACK EDIT REMOVE
+// /datum/reagent/consumable/korta_milk = 6, // DARKPACK EDIT REMOVAL
/datum/reagent/consumable/flour = 6,
-// /datum/reagent/consumable/korta_flour = 6, // DARKPACK EDIT REMOVE
+// /datum/reagent/consumable/korta_flour = 6, // DARKPACK EDIT REMOVAL
/datum/reagent/consumable/sugar = 6,
/datum/reagent/consumable/ice = 6,
/datum/reagent/consumable/coco = 6,
diff --git a/code/modules/food_and_drinks/machinery/smartfridge.dm b/code/modules/food_and_drinks/machinery/smartfridge.dm
index 3d9578218747..31a6e85075d1 100644
--- a/code/modules/food_and_drinks/machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/machinery/smartfridge.dm
@@ -537,6 +537,7 @@
desc = "A wooden contraption, used to dry plant products, food and hide."
icon_state = "drying-rack"
base_icon_state = "drying-rack"
+ icon = 'modular_darkpack/master_files/icons/obj/machines/smartfridge.dmi' // DARKPACK EDIT ADD
resistance_flags = FLAMMABLE
visible_contents = FALSE
base_build_path = /obj/machinery/smartfridge/drying/rack
@@ -586,7 +587,18 @@
if(drying)
. += "[base_icon_state]-drying"
if(contents.len)
- . += "[base_icon_state]-filled"
+ // DARKPACK EDIT CHANGE START
+ var/still_drying = FALSE
+ for(var/obj/item/item_iterator in src)
+ if(!accept_check(item_iterator))
+ continue
+ still_drying = TRUE
+ break
+ if(still_drying)
+ . += "[base_icon_state]-filled"
+ else
+ . += "[base_icon_state]-filled-dried"
+ // DARKPACK EDIT CHANGE END
// ----------------------------
// Bar drink smartfridge
diff --git a/code/modules/food_and_drinks/recipes/soup_guide.dm b/code/modules/food_and_drinks/recipes/soup_guide.dm
index a930fa204d75..8dba0dddc48c 100644
--- a/code/modules/food_and_drinks/recipes/soup_guide.dm
+++ b/code/modules/food_and_drinks/recipes/soup_guide.dm
@@ -51,7 +51,7 @@
/datum/crafting_recipe/food/reaction/soup/coldchili
reaction = /datum/chemical_reaction/food/soup/coldchili
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/reaction/soup/clownchili
reaction = /datum/chemical_reaction/food/soup/clownchili
*/
@@ -72,7 +72,7 @@
/datum/crafting_recipe/food/reaction/soup/misosoup
reaction = /datum/chemical_reaction/food/soup/misosoup
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/reaction/soup/slimesoup
reaction = /datum/chemical_reaction/food/soup/slimesoup
@@ -84,7 +84,7 @@
*/
/datum/crafting_recipe/food/reaction/soup/mysterysoup
reaction = /datum/chemical_reaction/food/soup/mysterysoup
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/reaction/soup/monkey
reaction = /datum/chemical_reaction/food/soup/monkey
*/
@@ -111,7 +111,7 @@
/datum/crafting_recipe/food/reaction/soup/bungocurry
reaction = /datum/chemical_reaction/food/soup/bungocurry
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/reaction/soup/electron
reaction = /datum/chemical_reaction/food/soup/electron
*/
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
index f015297e994e..a882fb1d81cd 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
@@ -13,7 +13,7 @@
result = /obj/item/food/bread/meat
dish_category = DISH_BREAD
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/xenomeatbread
name = "Xenomeat bread"
reqs = list(
@@ -77,7 +77,7 @@
result = /obj/item/food/bread/creamcheese
dish_category = DISH_BREAD
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/mimanabread
name = "Mimana bread"
reqs = list(
@@ -162,7 +162,7 @@
result = /obj/item/food/croissant/throwing
dish_category = DISH_BREAD
crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/breaddog
name = "Living dog/bread hybrid"
reqs = list(
@@ -234,7 +234,7 @@
added_foodtypes = GROSS
dish_category = DISH_BREAD
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/breadcat
name = "Bread cat/bread hybrid"
reqs = list(
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
index 48df54b35a7e..854ea1002f59 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
@@ -33,7 +33,7 @@
result = /obj/item/food/burger/corgi
dish_category = DISH_BURGER
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/appendixburger
name = "Appendix burger"
reqs = list(
@@ -92,7 +92,7 @@
result = /obj/item/food/burger/tofu
dish_category = DISH_BURGER
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/ghostburger
name = "Ghost burger"
reqs = list(
@@ -239,7 +239,7 @@
removed_foodtypes = BREAKFAST
dish_category = DISH_BURGER
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/slimeburger
name = "Jelly burger"
reqs = list(
@@ -280,7 +280,7 @@
result = /obj/item/food/burger/rat
dish_category = DISH_BURGER
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/baseballburger
name = "Home run baseball burger"
reqs = list(
@@ -302,7 +302,7 @@
result = /obj/item/food/burger/baconburger
removed_foodtypes = BREAKFAST
dish_category = DISH_BURGER
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/empoweredburger
name = "Empowered Burger"
@@ -348,7 +348,7 @@
result = /obj/item/food/burger/cheese
dish_category = DISH_BURGER
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/soylentburger
name = "Soylent Burger"
reqs = list(
@@ -390,7 +390,7 @@
result = /obj/item/food/burger/chicken
dish_category = DISH_BURGER
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/crazyhamburger
name = "Crazy hamburger"
reqs = list(
@@ -418,7 +418,7 @@
result = /obj/item/food/burger/sloppy_moe
dish_category = DISH_BURGER
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/kortaburger
name = "Plain Rootburger"
reqs = list(
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
index 426f8405cb9e..9bcaf51c56a2 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
@@ -86,7 +86,7 @@
dish_category = DISH_CAKE
meal_category = MEAL_DESSERT
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/energycake
name = "Energy cake"
reqs = list(
@@ -130,7 +130,7 @@
dish_category = DISH_CAKE
meal_category = MEAL_DESSERT
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/holycake
name = "Angel food cake"
reqs = list(
@@ -152,7 +152,7 @@
dish_category = DISH_CAKE
meal_category = MEAL_DESSERT
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/hardwarecake
name = "Hardware cake"
reqs = list(
@@ -250,7 +250,7 @@
dish_category = DISH_CAKE
meal_category = MEAL_DESSERT
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/cak
name = "Living cat/cake hybrid"
reqs = list(
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm
index f1e53cbfa191..5dfb0c86d58d 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm
@@ -1,7 +1,7 @@
// This is the home of drink related tablecrafting recipes, I have opted to only let players bottle fancy boozes to reduce the number of entries.
///////////////// Booze & Bottles ///////////////////
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/lizardwine
name = "Lizard Wine"
time = 4 SECONDS
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm
index 5c55c9983d64..14ec0805373e 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm
@@ -50,7 +50,7 @@
dish_category = DISH_FROZEN
meal_category = MEAL_DESSERT
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/honkdae
name ="Honkdae"
reqs = list(
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_guide.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_guide.dm
index 6e28e6357b6e..f7bb48571616 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_guide.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_guide.dm
@@ -12,7 +12,7 @@
non_craftable = TRUE
steps = list("Use cloth on a glass shard of any type")
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/runed_metal
reqs = list(/obj/item/stack/sheet/plasteel = 1)
requirements_mats_blacklist = list(/obj/item/stack/sheet/plasteel) // runed metal has its own material
@@ -48,7 +48,7 @@
qdel(chemical_reaction)
..()
-/* // DARKPACK EDIT REMOVE*
+/* // DARKPACK EDIT REMOVAL*
* Sets up information for our recipe based on the chemical reaction we have set.
*/
/datum/crafting_recipe/food/reaction/proc/setup_chemical_reaction_details(datum/chemical_reaction/chemical_reaction)
@@ -815,7 +815,7 @@
/datum/crafting_recipe/food/oven/bread
reqs = list(/obj/item/food/dough = 1)
result = /obj/item/food/bread/plain
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/oven/rootbread
reqs = list(/obj/item/food/rootdough = 1)
result = /obj/item/food/bread/root
@@ -947,7 +947,7 @@
reqs = list(/obj/item/food/cheese/cheese_curds = 1)
result = /obj/item/food/cheese/firm_cheese
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/drying/headcheese
reqs = list(/obj/item/food/raw_headcheese = 1)
result = /obj/item/food/headcheese
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
index f70ba30bac1b..6c338148c4af 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
@@ -29,7 +29,7 @@
result = /obj/item/food/kebab/tofu
dish_category = DISH_MEAT
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/tailkebab
name = "Lizard tail kebab"
reqs = list(
@@ -53,7 +53,7 @@
dish_category = DISH_MEAT
////////////////////////////////////////////////MR SPIDER////////////////////////////////////////////////
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/spidereggsham
name = "Spider eggs ham"
reqs = list(
@@ -276,7 +276,7 @@
removed_foodtypes = BREAKFAST
dish_category = DISH_MEAT
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/korta_wellington
name = "Korta Wellington"
reqs = list(
@@ -313,7 +313,7 @@
added_foodtypes = GRAIN
dish_category = DISH_MEAT
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/full_roast_lizzy
name = "Grain-Free Roast Chicken Dinner"
reqs = list(
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm
index c6107484012d..bd3240a06eae 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm
@@ -115,7 +115,7 @@
cuisine_category = CUISINE_MEXICAN
dish_category = DISH_BURRITO
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/stuffedlegion
name = "Stuffed legion"
time = 4 SECONDS
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
index f175243fbd02..94f1409046ba 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
@@ -14,7 +14,7 @@
dish_category = DISH_CANDY
meal_category = MEAL_DESSERT
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/spiderlollipop
name = "Spider Lollipop"
reqs = list(/obj/item/stack/rods = 1,
@@ -117,7 +117,7 @@
added_foodtypes = SUGAR
dish_category = DISH_UNCATEGORIZED
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/powercrepe
name = "Powercrepe"
time = 4 SECONDS
@@ -169,7 +169,7 @@
removed_foodtypes = BREAKFAST
dish_category = DISH_SALAD
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/butterbear //ITS ALIVEEEEEE!
name = "Living bear/butter hybrid"
reqs = list(
@@ -201,7 +201,7 @@
removed_foodtypes = RAW
meal_category = MEAL_APPETIZER
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/royalcheese
name = "Royal Cheese"
reqs = list(
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_moth.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_moth.dm
index f657c3973f51..d7a4bc41c326 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_moth.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_moth.dm
@@ -1,4 +1,4 @@
-/* /datum/crafting_recipe/food/herby_cheese // DARKPACK EDIT REMOVE
+/* /datum/crafting_recipe/food/herby_cheese // DARKPACK EDIT REMOVAL
name = "Herby cheese"
reqs = list(
/obj/item/food/cheese/curd_cheese = 1,
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
index 44384e7a6531..ced52c61149c 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
@@ -306,7 +306,7 @@
result = /obj/item/food/soylenviridians // they look like waffles
dish_category = DISH_PASTRY
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/soylentgreen
name = "Soylent green"
reqs = list(
@@ -407,7 +407,7 @@
added_foodtypes = FRUIT|SUGAR
dish_category = DISH_PASTRY
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/donkpocket/gondola
time = 1.5 SECONDS
name = "Gondola-pocket"
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm
index cd38856e9b49..5059f99f7833 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm
@@ -37,7 +37,7 @@
dish_category = DISH_PIE
meal_category = MEAL_DESSERT
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/xenopie
name = "Xeno pie"
reqs = list(
@@ -273,7 +273,7 @@
dish_category = DISH_PIE
meal_category = MEAL_DESSERT
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/asdfpie
name = "Pie-flavored pie"
reqs = list(
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm
index e2a6d5adf364..73f1c3266124 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm
@@ -99,7 +99,7 @@
)
result = /obj/item/food/pizzaslice/ants
added_foodtypes = BUGS
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/pizza/energy
reqs = list(
/obj/item/food/flatdough = 1,
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
index 7e16d4dc1af1..44ab3f2cf8de 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
@@ -25,7 +25,7 @@
)
result = /obj/item/food/sandwich/cheese
dish_category = DISH_SANDWICH
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/slimesandwich
name = "Jelly sandwich"
reqs = list(
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm
index 0592dd6a51cd..5e79f79b2a81 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm
@@ -13,7 +13,7 @@
dish_category = DISH_NOODLES
cuisine_category = CUISINE_ITALIAN
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/datum/crafting_recipe/food/copypasta
name = "Copypasta"
reqs = list(
diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm
index ddf0b30145f5..45f8a346b203 100644
--- a/code/modules/holiday/holidays.dm
+++ b/code/modules/holiday/holidays.dm
@@ -115,6 +115,7 @@ GLOBAL_LIST_INIT(holiday_mail, list())
// JANUARY
+/* // DARKPACK EDIT REMOVAL - (TG lore cruft)
//Fleet Day is celebrated on Jan 19th, the date on which moths were merged (#34498)
/datum/holiday/fleet_day
name = "Fleet Day"
@@ -127,6 +128,7 @@ GLOBAL_LIST_INIT(holiday_mail, list())
/datum/holiday/fleet_day/getStationPrefix()
return pick("Moth", "Fleet", "Nomadic")
+*/
// FEBRUARY
@@ -363,6 +365,7 @@ GLOBAL_LIST_INIT(holiday_mail, list())
holiday_hat = /obj/item/clothing/head/utility/hardhat
no_mail_holiday = TRUE
+/* // DARKPACK EDIT REMOVAL - (TG lore cruft)
//Draconic Day is celebrated on May 3rd, the date on which the Draconic language was merged (#26780)
/datum/holiday/draconic_day
name = "Draconic Language Day"
@@ -374,6 +377,7 @@ GLOBAL_LIST_INIT(holiday_mail, list())
/datum/holiday/draconic_day/getStationPrefix()
return pick("Draconic", "Literature", "Reading")
+*/
/datum/holiday/firefighter
name = "Firefighter's Day"
@@ -418,6 +422,7 @@ GLOBAL_LIST_INIT(holiday_mail, list())
// JUNE
+/* // DARKPACK EDIT REMOVAL - (TG lore cruft)
//The Festival of Atrakor's Might (Tizira's Moon) is celebrated on June 15th, the date on which the lizard visual revamp was merged (#9808)
/datum/holiday/atrakor_festival
name = "Festival of Atrakor's Might"
@@ -429,6 +434,7 @@ GLOBAL_LIST_INIT(holiday_mail, list())
/datum/holiday/atrakor_festival/getStationPrefix()
return pick("Moon", "Night Sky", "Celebration")
+*/
/// Garbage DAYYYYY
/// Huh?.... NOOOO
@@ -603,6 +609,7 @@ GLOBAL_LIST_INIT(holiday_mail, list())
// SEPTEMBER
+/* // DARKPACK EDIT REMOVAL - (TG lore cruft)
//Tiziran Unification Day is celebrated on Sept 1st, the day on which lizards were made a roundstart race
/datum/holiday/tiziran_unification
name = "Tiziran Unification Day"
@@ -616,7 +623,9 @@ GLOBAL_LIST_INIT(holiday_mail, list())
/datum/holiday/tiziran_unification/getStationPrefix()
return pick("Tizira", "Lizard", "Imperial")
+*/
+/* // DARKPACK EDIT REMOVAL - (TG lore cruft)
/datum/holiday/ianbirthday
name = IAN_HOLIDAY //github.com/tgstation/tgstation/commit/de7e4f0de0d568cd6e1f0d7bcc3fd34700598acb
begin_month = SEPTEMBER
@@ -638,6 +647,7 @@ GLOBAL_LIST_INIT(holiday_mail, list())
/datum/holiday/ianbirthday/getStationPrefix()
return pick("Ian", "Corgi", "Erro")
+*/
/datum/holiday/pirate
name = "Talk-Like-a-Pirate Day"
@@ -793,6 +803,7 @@ GLOBAL_LIST_INIT(holiday_mail, list())
/datum/holiday/hello/greet()
return "[pick(list("Aloha", "Bonjour", "Hello", "Hi", "Greetings", "Salutations", "Bienvenidos", "Hola", "Howdy", "Ni hao", "Guten Tag", "Konnichiwa", "G'day cunt"))]! " + ..()
+/* // DARKPACK EDIT REMOVAL - (TG lore cruft)
//The Festival of Holy Lights is celebrated on Nov 28th, the date on which ethereals were merged (#40995)
/datum/holiday/holy_lights
name = "Festival of Holy Lights"
@@ -809,6 +820,7 @@ GLOBAL_LIST_INIT(holiday_mail, list())
/datum/holiday/holy_lights/getStationPrefix()
return pick("Ethereal", "Lantern", "Holy")
+*/
// DECEMBER
diff --git a/code/modules/jobs/job_types/ai.dm b/code/modules/jobs/job_types/ai.dm
index b4a5346e1a5d..96f9c484dc90 100644
--- a/code/modules/jobs/job_types/ai.dm
+++ b/code/modules/jobs/job_types/ai.dm
@@ -19,7 +19,7 @@
/datum/job_department/silicon,
)
random_spawns_possible = FALSE
- job_flags = JOB_EQUIP_RANK | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS // DARKPACK EDIT, ORIGINAL: job_flags = JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS
+ job_flags = JOB_EQUIP_RANK | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS // DARKPACK EDIT CHANGE - ORIGINAL: job_flags = JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS
config_tag = "AI"
diff --git a/code/modules/jobs/job_types/cyborg.dm b/code/modules/jobs/job_types/cyborg.dm
index e67ea5d1c5fd..07425e8b17e0 100644
--- a/code/modules/jobs/job_types/cyborg.dm
+++ b/code/modules/jobs/job_types/cyborg.dm
@@ -19,7 +19,7 @@
/datum/job_department/silicon,
)
random_spawns_possible = FALSE
- job_flags = JOB_EQUIP_RANK | JOB_CANNOT_OPEN_SLOTS // DARKPACK EDIT, ORIGINAL: job_flags = JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK | JOB_CANNOT_OPEN_SLOTS
+ job_flags = JOB_EQUIP_RANK | JOB_CANNOT_OPEN_SLOTS // DARKPACK EDIT CHANGE - ORIGINAL: job_flags = JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK | JOB_CANNOT_OPEN_SLOTS
/datum/job/cyborg/after_spawn(mob/living/spawned, client/player_client)
diff --git a/code/modules/jobs/job_types/station_trait/bridge_assistant.dm b/code/modules/jobs/job_types/station_trait/bridge_assistant.dm
index a62f2b33200d..e52e4814cfa1 100644
--- a/code/modules/jobs/job_types/station_trait/bridge_assistant.dm
+++ b/code/modules/jobs/job_types/station_trait/bridge_assistant.dm
@@ -31,7 +31,7 @@
)
rpg_title = "Royal Guard"
allow_bureaucratic_error = FALSE
- job_flags = NONE // DARKPACK EDIT, ORIGINAL: job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS | JOB_ANTAG_PROTECTED
+ job_flags = NONE // DARKPACK EDIT CHANGE - ORIGINAL: job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS | JOB_ANTAG_PROTECTED
human_authority = JOB_AUTHORITY_NON_HUMANS_ALLOWED
/datum/job/bridge_assistant/after_spawn(mob/living/spawned, client/player_client)
diff --git a/code/modules/jobs/job_types/station_trait/cargo_gorilla.dm b/code/modules/jobs/job_types/station_trait/cargo_gorilla.dm
index ce33e255fc06..19fba20c410c 100644
--- a/code/modules/jobs/job_types/station_trait/cargo_gorilla.dm
+++ b/code/modules/jobs/job_types/station_trait/cargo_gorilla.dm
@@ -15,7 +15,7 @@
)
rpg_title = "Beast of Burden"
allow_bureaucratic_error = FALSE
- job_flags = NONE // DARKPACK EDIT, ORIGINAL: job_flags = STATION_TRAIT_JOB_FLAGS | JOB_ANNOUNCE_ARRIVAL | JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK |JOB_ANTAG_BLACKLISTED
+ job_flags = NONE // DARKPACK EDIT CHANGE - ORIGINAL: job_flags = STATION_TRAIT_JOB_FLAGS | JOB_ANNOUNCE_ARRIVAL | JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK |JOB_ANTAG_BLACKLISTED
/datum/job/cargo_gorilla/get_roundstart_spawn_point()
if (length(GLOB.gorilla_start))
diff --git a/code/modules/jobs/job_types/station_trait/human_ai.dm b/code/modules/jobs/job_types/station_trait/human_ai.dm
index 59d0a534e385..1c53cd75597a 100644
--- a/code/modules/jobs/job_types/station_trait/human_ai.dm
+++ b/code/modules/jobs/job_types/station_trait/human_ai.dm
@@ -38,7 +38,7 @@
rpg_title = "Omnissiah"
random_spawns_possible = FALSE
allow_bureaucratic_error = FALSE
- job_flags = NONE // DARKPACK EDIT, ORIGINAL: job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS | JOB_ANTAG_PROTECTED
+ job_flags = NONE // DARKPACK EDIT CHANGE - ORIGINAL: job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS | JOB_ANTAG_PROTECTED
human_authority = JOB_AUTHORITY_NON_HUMANS_ALLOWED //we can safely assume NT doesn't care what species AIs are made of, much less if they can't even afford an AI.
/datum/job/human_ai/get_roundstart_spawn_point()
diff --git a/code/modules/jobs/job_types/station_trait/pun_pun.dm b/code/modules/jobs/job_types/station_trait/pun_pun.dm
index 6571c4629010..4c61355a89a8 100644
--- a/code/modules/jobs/job_types/station_trait/pun_pun.dm
+++ b/code/modules/jobs/job_types/station_trait/pun_pun.dm
@@ -24,7 +24,7 @@
)
rpg_title = "Homunculus"
allow_bureaucratic_error = FALSE
- job_flags = NONE // DARKPACK EDIT, ORIGINAL: job_flags = (STATION_JOB_FLAGS|STATION_TRAIT_JOB_FLAGS)&~JOB_ASSIGN_QUIRKS
+ job_flags = NONE // DARKPACK EDIT CHANGE - ORIGINAL: job_flags = (STATION_JOB_FLAGS|STATION_TRAIT_JOB_FLAGS)&~JOB_ASSIGN_QUIRKS
/datum/job/pun_pun/get_spawn_mob(client/player_client, atom/spawn_point)
if (!player_client)
diff --git a/code/modules/jobs/job_types/station_trait/veteran_advisor.dm b/code/modules/jobs/job_types/station_trait/veteran_advisor.dm
index 2e188ce58b7d..c487967c5ed9 100644
--- a/code/modules/jobs/job_types/station_trait/veteran_advisor.dm
+++ b/code/modules/jobs/job_types/station_trait/veteran_advisor.dm
@@ -34,7 +34,7 @@
)
rpg_title = "Royal Advisor"
allow_bureaucratic_error = FALSE
- job_flags = NONE // DARKPACK EDIT, ORIGINAL: job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS | JOB_ANTAG_PROTECTED
+ job_flags = NONE // DARKPACK EDIT CHANGE - ORIGINAL: job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS | JOB_ANTAG_PROTECTED
/datum/job/veteran_advisor/get_default_roundstart_spawn_point()
for(var/obj/effect/landmark/start/spawn_point as anything in GLOB.start_landmarks_list)
diff --git a/code/modules/library/bookcase.dm b/code/modules/library/bookcase.dm
index 373fc6aa3e5d..56cf9de94753 100644
--- a/code/modules/library/bookcase.dm
+++ b/code/modules/library/bookcase.dm
@@ -23,7 +23,7 @@
var/category_prob = 25
/// How many random books to generate.
var/books_to_load = 0
- //DARKPACK EDIT START - bookshelf generation
+ // DARKPACK EDIT START - bookshelf generation
// What books we don't want to generate on not their respective bookshelves
var/restricted_categories = list(
BOOK_CATEGORY_ADULT,
@@ -31,7 +31,7 @@
BOOK_CATEGORY_LUPINE,
BOOK_CATEGORY_KUEIJIN,
)
- //DARKPACK EDIT END
+ // DARKPACK EDIT END
/datum/armor/structure_bookcase
fire = 50
@@ -66,7 +66,7 @@
if(load_random_books)
var/randomizing_categories = prob(category_prob) || random_category == BOOK_CATEGORY_RANDOM
// We only need to run this special logic if we're randomizing a non-adult bookshelf
- if(randomizing_categories && !(random_category in restricted_categories)) // DARKPACK EDIT CHANGE - Original : if(randomizing_categories && random_category != BOOK_CATEGORY_ADULT)
+ if(randomizing_categories && !(random_category in restricted_categories)) // DARKPACK EDIT CHANGE - ORIGINAL: if(randomizing_categories && random_category != BOOK_CATEGORY_ADULT)
// Category is manually randomized rather than using BOOK_CATEGORY_RANDOM
// So we can exclude adult books in non-adult bookshelves
// And also weight the prime category more heavily
@@ -92,7 +92,7 @@
var/area/our_area = get_area(src)
- //DARKPACK ADDITION START - Paths
+ // DARKPACK EDIT ADD START - Paths
// Check if we're NOT in a chantry area and roll for occult book spawn. This is so that non-Chantry Thaumaturgists can access the paths feature
if(!istype(our_area, /area/vtm/interior/chantry) && prob(15))
// 15% chance to spawn in a bookcase thats not the library. May need balance tweaking for maps w/ more or less bookshelves.
@@ -111,7 +111,7 @@
/obj/item/path_spellbook/levinbolt/level5)
new occult_book_type(src)
update_appearance()
- //DARKPACK ADDITION END - Paths
+ // DARKPACK EDIT ADD END - Paths
var/area_type = our_area.type //Save me from the dark
diff --git a/code/modules/loadout/categories/pocket.dm b/code/modules/loadout/categories/pocket.dm
index 0beab6885563..476ec6575612 100644
--- a/code/modules/loadout/categories/pocket.dm
+++ b/code/modules/loadout/categories/pocket.dm
@@ -275,7 +275,7 @@
// The wallet loadout item is special, and puts the player's ID and other small items into it on initialize (fancy!)
/datum/loadout_item/pocket_items/wallet
name = "Wallet"
- item_path = /obj/item/storage/wallet/darkpack // DARKPACK EDIT CHANGE - Original : item_path = /obj/item/storage/wallet
+ item_path = /obj/item/storage/wallet/darkpack // DARKPACK EDIT CHANGE - ORIGINAL: item_path = /obj/item/storage/wallet
/datum/loadout_item/pocket_items/wallet/insert_path_into_outfit(datum/outfit/outfit, mob/living/carbon/human/equipper, visuals_only = FALSE)
return
@@ -292,11 +292,11 @@
UnregisterSignal(source, COMSIG_HUMAN_CHARACTER_SETUP_FINISHED)
/datum/loadout_item/pocket_items/wallet/proc/equip_wallet(mob/living/carbon/human/equipper)
- var/obj/item/card/id_card = equipper.get_item_by_slot(ITEM_SLOT_ID) // DARKPACK EDIT CHANGE - Original : var/obj/item/card/id/advanced/id_card = equipper.get_item_by_slot(ITEM_SLOT_ID)
- if(istype(id_card, /obj/item/storage/wallet/darkpack)) // Wallets station trait guard // DARKPACK EDIT CHANGE - Original : if(istype(id_card, /obj/item/storage/wallet)) // Wallets station trait guard
+ var/obj/item/card/id_card = equipper.get_item_by_slot(ITEM_SLOT_ID) // DARKPACK EDIT CHANGE - ORIGINAL: var/obj/item/card/id/advanced/id_card = equipper.get_item_by_slot(ITEM_SLOT_ID)
+ if(istype(id_card, /obj/item/storage/wallet/darkpack)) // Wallets station trait guard // DARKPACK EDIT CHANGE - ORIGINAL: if(istype(id_card, /obj/item/storage/wallet)) // Wallets station trait guard
return
- var/obj/item/storage/wallet/darkpack/wallet = new(equipper) // DARKPACK EDIT CHANGE - Original : var/obj/item/storage/wallet/wallet = new(equipper)
+ var/obj/item/storage/wallet/darkpack/wallet = new(equipper) // DARKPACK EDIT CHANGE - ORIGINAL: var/obj/item/storage/wallet/wallet = new(equipper)
if(!istype(id_card))
// They must have a PDA or some other thing in their ID slot, abort
if(!equipper.equip_to_storage(wallet, ITEM_SLOT_BACK, indirect_action = TRUE))
diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm b/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm
index c3368019ed20..7d4d87d13bd7 100644
--- a/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm
+++ b/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm
@@ -112,7 +112,7 @@
. += observer_desc
. += "It is activated by [activation_method]."
-/obj/machinery/anomalous_crystal/Hear(atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, list/message_mods = list(), message_range, source) // DARKPACK EDIT, ORIGINAL: /obj/machinery/anomalous_crystal/Hear(atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, list/message_mods = list(), message_range)
+/obj/machinery/anomalous_crystal/Hear(atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, list/message_mods = list(), message_range, source) // DARKPACK EDIT CHANGE - ORIGINAL: /obj/machinery/anomalous_crystal/Hear(atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, list/message_mods = list(), message_range)
. = ..()
if(isliving(speaker))
ActivationReaction(speaker, ACTIVATE_SPEECH)
diff --git a/code/modules/mob/dead/new_player/latejoin_menu.dm b/code/modules/mob/dead/new_player/latejoin_menu.dm
index 1fd9e6650ce5..0f74236b7c65 100644
--- a/code/modules/mob/dead/new_player/latejoin_menu.dm
+++ b/code/modules/mob/dead/new_player/latejoin_menu.dm
@@ -166,7 +166,7 @@ GLOBAL_DATUM_INIT(latejoin_menu, /datum/latejoin_menu, new)
tgui_alert(owner, "The server is full!", "Oh No!")
return TRUE
- //DARKPACK EDIT ADD START - (prevents players from joining with negative freebie points)
+ // DARKPACK EDIT ADD START - (prevents players from joining with negative freebie points)
var/datum/st_stat/freebie/freebie_stat = owner.client?.prefs?.preference_storyteller_stats[STAT_FREEBIE_POINTS]
if(freebie_stat && freebie_stat.get_points() < 0)
tgui_alert(owner, "You cannot join with negative freebie points! Please fix your character preferences.", "Oh No!")
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 615783cf095e..9d8977e9cf9f 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -139,12 +139,18 @@
return "[jobtitle] doesn't have any free splat slots for you. (This can include human)"
if(JOB_UNAVAILABLE_WHITELIST)
return "You aren't whitelisted for [jobtitle]."
- if(JOB_UNAVAILABLE_KINDRED_AGE)
+ if(JOB_UNAVAILABLE_KINDRED_AGE_MIN)
return "Your character is too young for [jobtitle]."
+ if(JOB_UNAVAILABLE_KINDRED_AGE_MAX)
+ return "Your character is too old for [jobtitle]."
if(JOB_UNAVAILABLE_KINDRED_GENERATION)
return "Your character's generation is too high for [jobtitle]."
if(JOB_UNAVAILABLE_KINDRED_CLAN)
return "Your character's clan is incompatible for [jobtitle]."
+ if(JOB_UNAVAILABLE_FERA_TRIBE)
+ return "Your character's tribe is incompatible for [jobtitle]."
+ if(JOB_UNAVAILABLE_FERA_AUSPICE)
+ return "Your character's auspice is incompatible for [jobtitle]."
// DARKPACK EDIT END
return GENERIC_JOB_UNAVAILABLE_ERROR
@@ -221,7 +227,7 @@
var/is_captain = IS_NOT_CAPTAIN
var/captain_sound = 'sound/announcer/notice/notice2.ogg'
// If we already have a captain, are they a "Captain" rank and are we allowing multiple of them to be assigned?
- if(is_prince_job(job)) // DARKPACK EDIT, ORIGINAL: if(is_captain_job(job))
+ if(is_prince_job(job)) // DARKPACK EDIT CHANGE - ORIGINAL: if(is_captain_job(job))
is_captain = IS_FULL_CAPTAIN
captain_sound = 'sound/announcer/announcement/announce.ogg'
// If we don't have an assigned cap yet, check if this person qualifies for some from of captaincy.
@@ -241,7 +247,7 @@
humanc = character //Let's retypecast the var to be human,
if(humanc) //These procs all expect humans
- var/chosen_rank = humanc.client?.prefs.alt_job_titles?[rank] || rank // DARKPACK EDIT ADDITION - ALTERNATIVE_JOB_TITLES
+ var/chosen_rank = humanc.client?.prefs.alt_job_titles?[rank] || rank // DARKPACK EDIT ADD - ALTERNATIVE_JOB_TITLES
if(SSshuttle.arrivals)
SSshuttle.arrivals.QueueAnnounce(humanc, chosen_rank) // DARKPACK EDIT CHANGE - ALTERNATIVE_JOB_TITLES - ORIGINAL: SSshuttle.arrivals.QueueAnnounce(humanc, rank)
else
@@ -250,7 +256,7 @@
humanc.increment_scar_slot()
humanc.load_persistent_scars()
- humanc.load_guestbook() // DARKPACK EDIT ADDITION
+ humanc.load_guestbook() // DARKPACK EDIT ADD
if(GLOB.curse_of_madness_triggered)
give_madness(humanc, GLOB.curse_of_madness_triggered)
diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm
index c110d53703d8..bf5178969ea9 100644
--- a/code/modules/mob/dead/new_player/preferences_setup.dm
+++ b/code/modules/mob/dead/new_player/preferences_setup.dm
@@ -94,7 +94,7 @@
return preview_job
/datum/preferences/proc/render_new_preview_appearance(mob/living/carbon/human/dummy/mannequin, show_job_clothes = TRUE)
- var/datum/job/no_job = SSjob.get_job_type(/datum/job/vampire/unassigned) // DARKPACK EDIT, ORIGINAL: var/datum/job/no_job = SSjob.get_job_type(/datum/job/unassigned)
+ var/datum/job/no_job = SSjob.get_job_type(/datum/job/vampire/unassigned) // DARKPACK EDIT CHANGE - ORIGINAL: var/datum/job/no_job = SSjob.get_job_type(/datum/job/unassigned)
var/datum/job/preview_job = get_highest_priority_job() || no_job
if(preview_job)
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 0435890acd89..cd069dd8ae61 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -11,7 +11,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
plane = GHOST_PLANE
stat = DEAD
density = FALSE
- see_invisible = OBSERVER_SIGHT //DARKPACK EDIT, Original : see_invisible = SEE_INVISIBLE_OBSERVER
+ see_invisible = OBSERVER_SIGHT // DARKPACK EDIT CHANGE - ORIGINAL: see_invisible = SEE_INVISIBLE_OBSERVER
lighting_cutoff = LIGHTING_CUTOFF_MEDIUM
invisibility = INVISIBILITY_OBSERVER
hud_type = /datum/hud/ghost
@@ -713,7 +713,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(!(ghost_hud_flags & GHOST_VISION))
set_invis_see(SEE_INVISIBLE_LIVING)
else
- set_invis_see(OBSERVER_SIGHT) //DARKPACK EDIT, Original : see_invisible = SEE_INVISIBLE_OBSERVER
+ set_invis_see(OBSERVER_SIGHT) // DARKPACK EDIT CHANGE - ORIGINAL: see_invisible = SEE_INVISIBLE_OBSERVER
updateghostimages()
..()
diff --git a/code/modules/mob/dead/observer/observer_say.dm b/code/modules/mob/dead/observer/observer_say.dm
index 60d4111927c2..86c277f2fb57 100644
--- a/code/modules/mob/dead/observer/observer_say.dm
+++ b/code/modules/mob/dead/observer/observer_say.dm
@@ -58,7 +58,7 @@
. = say_dead(message)
-/mob/dead/observer/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range, source) // DARKPACK EDIT, ORIGINAL: /mob/dead/observer/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range)
+/mob/dead/observer/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range, source) // DARKPACK EDIT CHANGE - ORIGINAL: /mob/dead/observer/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range)
. = ..()
var/atom/movable/to_follow = speaker
if(radio_freq)
diff --git a/code/modules/mob/living/basic/basic_defense.dm b/code/modules/mob/living/basic/basic_defense.dm
index 30523655e778..fe19aad2b6c5 100644
--- a/code/modules/mob/living/basic/basic_defense.dm
+++ b/code/modules/mob/living/basic/basic_defense.dm
@@ -54,6 +54,10 @@
attack_roll_type = /datum/storyteller_roll/attack/kick
damage_roll_type = /datum/storyteller_roll/damage/kick
damage_bonus_dice++
+ else if(atk_effect == ATTACK_EFFECT_CLAW)
+ attack_roll_type = /datum/storyteller_roll/attack/claw
+ damage_roll_type = /datum/storyteller_roll/damage/claw
+ damage_bonus_dice += 2
user.do_attack_animation(src, atk_effect)
@@ -132,10 +136,12 @@
else
log_combat(user, src, "punched")
+ /* // DARKPACK EDIT REMOVAL - (A decent amount of combat involves biting here which creates issue from being getting fat from combat)
if(biting && (mob_biotypes & MOB_ORGANIC)) //Good for you. You probably just ate someone alive.
var/datum/reagents/tasty_meal = new()
tasty_meal.add_reagent(/datum/reagent/consumable/nutriment/protein, round(damage/3, 1))
tasty_meal.trans_to(user, tasty_meal.total_volume, transferred_by = user, methods = INGEST)
+ */
// DARKPACK EDIT CHANGE END
updatehealth()
return TRUE
diff --git a/code/modules/mob/living/basic/pets/cat/cat.dm b/code/modules/mob/living/basic/pets/cat/cat.dm
index 560d61af23c2..4d489d3987df 100644
--- a/code/modules/mob/living/basic/pets/cat/cat.dm
+++ b/code/modules/mob/living/basic/pets/cat/cat.dm
@@ -172,6 +172,7 @@
AddComponent(\
/datum/component/breed,\
can_breed_with = typecacheof(list(/mob/living/basic/pet/cat)),\
+ breed_timer = 30 MINUTES, /* DARKPACK EDIT ADD - (Less baby spam)*/\
baby_paths = baby_types,\
post_birth = post_birth_callback,\
)
diff --git a/code/modules/mob/living/basic/pets/dog/_dog.dm b/code/modules/mob/living/basic/pets/dog/_dog.dm
index aabcfd6440e2..927faa23c963 100644
--- a/code/modules/mob/living/basic/pets/dog/_dog.dm
+++ b/code/modules/mob/living/basic/pets/dog/_dog.dm
@@ -36,14 +36,14 @@
attack_vis_effect = ATTACK_EFFECT_BITE
melee_attack_cooldown = 0.8 SECONDS
/// Instructions you can give to dogs
- /* // DARKPACK EDIT REMOVE START - NPC - (Moving this into a proc so we can have subtypes with different commands)
+ /* // DARKPACK EDIT REMOVAL START - NPC - (Moving this into a proc so we can have subtypes with different commands)
var/static/list/pet_commands = list(
/datum/pet_command/idle,
/datum/pet_command/free,
/datum/pet_command/move,
/datum/pet_command/good_boy/dog,
/datum/pet_command/follow/dog,
-// /datum/pet_command/perform_trick_sequence // DARKPACK EDIT REMOVE - Might be usable later - NPC
+// /datum/pet_command/perform_trick_sequence // DARKPACK EDIT REMOVAL - Might be usable later - NPC
/datum/pet_command/attack/dog,
/datum/pet_command/fetch,
/datum/pet_command/play_dead,
@@ -123,7 +123,7 @@
)
AddElement(/datum/element/ai_flee_while_injured) // DARKPACK EDIT ADD - NPC
AddComponent(/datum/component/tameable, food_types = food_types, tame_chance = 30, bonus_tame_chance = 15, unique = FALSE)
-// AddComponent(/datum/component/obeys_commands, pet_commands) // DARKPACK EDIT REMOVE - npc
+// AddComponent(/datum/component/obeys_commands, pet_commands) // DARKPACK EDIT REMOVAL - npc
add_obey_commands()
var/dog_area = get_area(src)
for(var/obj/structure/bed/dogbed/dog_bed in dog_area)
@@ -132,7 +132,7 @@
// DARKPACK EDIT ADD START - NPC - (snowflake obeys_commands abstraction proc)
/mob/living/basic/pet/dog/proc/add_obey_commands()
- var/static/list/pet_commands = list( // DARKPACK EDIT REMOVE START - npc - Moving this into a proc so we can have subtypes with different commands
+ var/static/list/pet_commands = list(
/datum/pet_command/idle,
/datum/pet_command/free,
/datum/pet_command/move,
diff --git a/code/modules/mob/living/basic/pets/dog/corgi.dm b/code/modules/mob/living/basic/pets/dog/corgi.dm
index 028015535ae8..0cf4b48e52c4 100644
--- a/code/modules/mob/living/basic/pets/dog/corgi.dm
+++ b/code/modules/mob/living/basic/pets/dog/corgi.dm
@@ -76,6 +76,7 @@
AddComponent(\
/datum/component/breed,\
can_breed_with = typecacheof(list(/mob/living/basic/pet/dog/corgi)),\
+ breed_timer = 30 MINUTES, /* DARKPACK EDIT ADD - (Less baby spam)*/\
baby_paths = baby_paths,\
)
diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm
index e02cf2986030..a42799967653 100644
--- a/code/modules/mob/living/brain/brain_item.dm
+++ b/code/modules/mob/living/brain/brain_item.dm
@@ -724,11 +724,27 @@
return found_head || active_hand // If we are a feral biter, return a usable head.
if(target.pulledby == owner) // if we're grabbing our target we're beating them to death with our bare hands
return active_hand
- if(target.body_position == LYING_DOWN && owner.usable_legs)
+ if(should_kick(target) && target.body_position == LYING_DOWN && owner.usable_legs) // DARKPACK EDIT CHANGE
var/obj/item/bodypart/found_bodypart = owner.get_bodypart(IS_LEFT_INDEX(active_hand.held_index) ? BODY_ZONE_L_LEG : BODY_ZONE_R_LEG)
return found_bodypart || active_hand
return active_hand
+// DARKPACK EDIT ADD START
+/obj/item/organ/brain/proc/should_kick(mob/living/carbon/human/target)
+ var/obj/item/bodypart/arm/active_hand = owner.get_active_hand()
+ var/obj/item/bodypart/leg/active_leg = owner.get_bodypart(IS_LEFT_INDEX(active_hand.held_index) ? BODY_ZONE_L_LEG : BODY_ZONE_R_LEG)
+ if(!active_hand)
+ return TRUE
+ if(!active_leg)
+ return FALSE
+ // Now lets acctually compare them
+ if(active_hand.attack_type == AGGRAVATED)
+ return FALSE // AGG damage is gonna almost always be better dps or more desired..
+ if(active_hand.unarmed_attack_effect == ATTACK_EFFECT_CLAW)
+ return FALSE // Claws get an extra bonus dice compared to kicking
+ return TRUE // Otherwise, kicking is PROBALLY better as it gets a +1 bonus to damage compared to punches.
+// DARKPACK EDIT ADD END
+
/// Brains REALLY like ghosting people. we need special tricks to avoid that, namely removing the old brain with no_id_transfer
/obj/item/organ/brain/replace_into(mob/living/carbon/new_owner)
var/obj/item/organ/brain/old_brain = new_owner.get_organ_slot(ORGAN_SLOT_BRAIN)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 65e4c7fa5d4a..068db7caf721 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -474,7 +474,7 @@
set_sight(initial(sight))
else
set_sight(SEE_TURFS|SEE_MOBS|SEE_OBJS)
- set_invis_see(OBSERVER_SIGHT) // DARKPACK EDIT, Original : set_invis_see(SEE_INVISIBLE_OBSERVER)
+ set_invis_see(OBSERVER_SIGHT) // DARKPACK EDIT CHANGE - ORIGINAL: set_invis_see(SEE_INVISIBLE_OBSERVER)
return
var/new_sight = initial(sight)
diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm
index 4c848c2870d9..d56e98ba1aeb 100644
--- a/code/modules/mob/living/carbon/human/_species.dm
+++ b/code/modules/mob/living/carbon/human/_species.dm
@@ -811,6 +811,10 @@ GLOBAL_LIST_EMPTY(features_by_species)
attack_roll_type = /datum/storyteller_roll/attack/kick
damage_roll_type = /datum/storyteller_roll/damage/kick
damage_bonus_dice++
+ else if(atk_effect == ATTACK_EFFECT_CLAW)
+ attack_roll_type = /datum/storyteller_roll/attack/claw
+ damage_roll_type = /datum/storyteller_roll/damage/claw
+ damage_bonus_dice += 2
user.do_attack_animation(target, atk_effect)
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 27ffa1df3e54..edb52ef85761 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -20,7 +20,7 @@
/datum/emote/living/carbon/human/glasses/can_run_emote(mob/user, status_check = TRUE, intentional, params)
var/obj/eyes_slot = user.get_item_by_slot(ITEM_SLOT_EYES)
- if(istype(eyes_slot, /obj/item/clothing/glasses) || istype(eyes_slot, /obj/item/clothing/glasses/sunglasses)) // DARKPACK EDIT CHANGE - Original : if(istype(eyes_slot, /obj/item/clothing/glasses/regular) || istype(eyes_slot, /obj/item/clothing/glasses/sunglasses))
+ if(istype(eyes_slot, /obj/item/clothing/glasses) || istype(eyes_slot, /obj/item/clothing/glasses/sunglasses)) // DARKPACK EDIT CHANGE - ORIGINAL: if(istype(eyes_slot, /obj/item/clothing/glasses/regular) || istype(eyes_slot, /obj/item/clothing/glasses/sunglasses))
return ..()
return FALSE
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index cac94283d815..be7c9c052ae6 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -40,7 +40,7 @@
name = get_visible_name()
/// Combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a separate proc as it'll be useful elsewhere
-/mob/living/carbon/human/get_visible_name(add_id_name = TRUE, force_real_name = FALSE, mob/examiner) // DARKPACK EDIT, ORIGINAL: /mob/living/carbon/human/get_visible_name(add_id_name = TRUE, force_real_name = FALSE)
+/mob/living/carbon/human/get_visible_name(add_id_name = TRUE, force_real_name = FALSE, mob/examiner) // DARKPACK EDIT CHANGE - ORIGINAL: /mob/living/carbon/human/get_visible_name(add_id_name = TRUE, force_real_name = FALSE)
var/list/identity = list(null, null, null)
SEND_SIGNAL(src, COMSIG_HUMAN_GET_VISIBLE_NAME, identity)
var/signal_face = LAZYACCESS(identity, VISIBLE_NAME_FACE)
@@ -49,7 +49,7 @@
if(force_set) // our name is overriden by something
return signal_face // no need to null-check, because force_set will always set a signal_face
- var/face_name = isnull(signal_face) ? get_face_name() : signal_face // DARKPACK EDIT, ORIGINAL: var/face_name = isnull(signal_face) ? get_face_name("") : signal_face
+ var/face_name = isnull(signal_face) ? get_face_name() : signal_face // DARKPACK EDIT CHANGE - ORIGINAL: var/face_name = isnull(signal_face) ? get_face_name("") : signal_face
var/id_name = isnull(signal_id) ? get_id_name("", honorifics = add_id_name) : signal_id
// We need to account for real name
@@ -59,7 +59,7 @@
// We're just some unknown guy
if(HAS_TRAIT(src, TRAIT_UNKNOWN_APPEARANCE) || HAS_TRAIT(src, TRAIT_INVISIBLE_MAN))
- return get_generic_name(prefixed = TRUE, lowercase = TRUE) // DARKPACK EDIT, ORIGINAL: return "Unknown"
+ return get_generic_name(prefixed = TRUE, lowercase = TRUE) // DARKPACK EDIT CHANGE - ORIGINAL: return "Unknown"
// We have a face and an ID
if(face_name && id_name)
@@ -74,7 +74,7 @@
// DARKPACK EDIT ADD END
// Just go down the list of stuff we recorded
- return known_name || face_name || id_name || get_generic_name(prefixed = TRUE, lowercase = TRUE) // DARKPACK EDIT, ORIGINAL: return face_name || id_name || "Unknown"
+ return known_name || face_name || id_name || get_generic_name(prefixed = TRUE, lowercase = TRUE) // DARKPACK EDIT CHANGE - ORIGINAL: return face_name || id_name || "Unknown"
/**
* Gets what the face of this mob looks like
@@ -82,12 +82,12 @@
* * if_no_face - What to return if we have no face or our face is obscured/disfigured
*/
/mob/living/carbon/proc/get_face_name(if_no_face = "Unknown")
- return // DARKPACK EDIT, ORIGINAL: return real_name
+ return // DARKPACK EDIT CHANGE - ORIGINAL: return real_name
/mob/living/carbon/human/get_face_name(if_no_face = "Unknown")
if(!real_name || is_face_obscured())
return if_no_face
- return // DARKPACK EDIT, ORIGINAL: return real_name
+ return // DARKPACK EDIT CHANGE - ORIGINAL: return real_name
/mob/living/carbon/human/proc/is_face_obscured()
if(HAS_TRAIT(src, TRAIT_UNKNOWN_APPEARANCE))
diff --git a/code/modules/mob/living/carbon/human/human_say.dm b/code/modules/mob/living/carbon/human/human_say.dm
index cbd8742b5106..4c0343190102 100644
--- a/code/modules/mob/living/carbon/human/human_say.dm
+++ b/code/modules/mob/living/carbon/human/human_say.dm
@@ -39,7 +39,7 @@
return override_voice
if(add_id_name && real_name == id_name) // Allows for "Captain John" to have the voice "Captain Join" and not "John"
return get_id_name("", honorifics = TRUE)
- return name // DARKPACK EDIT, ORIGINAL: return real_name
+ return name // DARKPACK EDIT CHANGE - ORIGINAL: return real_name
/mob/living/carbon/human/get_message_voice(visible_name)
. = ..()
diff --git a/code/modules/mob/living/carbon/human/init_signals.dm b/code/modules/mob/living/carbon/human/init_signals.dm
index 923ec33f2128..55ab5d6b6b82 100644
--- a/code/modules/mob/living/carbon/human/init_signals.dm
+++ b/code/modules/mob/living/carbon/human/init_signals.dm
@@ -14,10 +14,6 @@
RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_HUSK), SIGNAL_REMOVETRAIT(TRAIT_HUSK)), PROC_REF(refresh_obscured))
RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_INVISIBLE_MAN), SIGNAL_REMOVETRAIT(TRAIT_INVISIBLE_MAN)), PROC_REF(invisible_man_toggle))
- //DARKPACK EDIT ADD START - POWERS - (Obfuscate Discipline)
- RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_OBFUSCATED), PROC_REF(make_invisible))
- RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_OBFUSCATED), PROC_REF(make_visible))
- //DARKPACK EDIT ADD END
/// Gaining or losing [TRAIT_DWARF] updates our height and grants passtable
/mob/living/carbon/human/proc/on_dwarf_trait(datum/source)
diff --git a/code/modules/mob/living/carbon/human/physiology.dm b/code/modules/mob/living/carbon/human/physiology.dm
index 507f1eb60947..a94e9d76fd46 100644
--- a/code/modules/mob/living/carbon/human/physiology.dm
+++ b/code/modules/mob/living/carbon/human/physiology.dm
@@ -41,7 +41,7 @@
var/datum/armor/armor // internal armor datum
- var/hunger_mod = 0.2 //% of hunger rate taken per tick. //DARKPACK EDIT CHANGE - Original : var/hunger_mod = 1
+ var/hunger_mod = 0.2 //% of hunger rate taken per tick. // DARKPACK EDIT CHANGE - ORIGINAL: var/hunger_mod = 1
/datum/physiology/New()
armor = new
diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
index 2c9c1127edf2..59bd21e22143 100644
--- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm
+++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
@@ -276,7 +276,7 @@
detached_head.copy_appearance_from(headless, overwrite_eyes = TRUE)
detached_head.update_icon_dropped()
-/obj/item/dullahan_relay/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range, source) // DARKPACK EDIT, ORIGINAL: /obj/item/dullahan_relay/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range)
+/obj/item/dullahan_relay/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range, source) // DARKPACK EDIT CHANGE - ORIGINAL: /obj/item/dullahan_relay/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range)
. = ..()
var/dist = get_dist(speaker, src) - message_range
if(dist > 0 && dist <= EAVESDROP_EXTRA_RANGE)
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 06e5e4d4c7fd..879544411f0e 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -477,7 +477,7 @@
return
var/datum/blood_type/blood_type = get_bloodtype()
- if(!(blood_type.reagent_type in typesof(chem.type))) // DARKPACK EDIT, ORIGINAL: if(blood_type.reagent_type != chem.type)
+ if(!(blood_type.reagent_type in typesof(chem.type))) // DARKPACK EDIT CHANGE - ORIGINAL: if(blood_type.reagent_type != chem.type)
return
var/cached_blood_volume = get_blood_volume()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 63e601e472b3..02cd45cdae9c 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -666,7 +666,7 @@
/mob/living/proc/get_bank_account()
RETURN_TYPE(/datum/bank_account)
var/datum/bank_account/account
- var/obj/item/card/credit/I = get_creditcard() // DARKPACK EDIT - ORIGINAL: var/obj/item/card/id/I = get_idcard()
+ var/obj/item/card/credit/I = get_creditcard() // DARKPACK EDIT CHANGE - ORIGINAL: var/obj/item/card/id/I = get_idcard()
if(I?.registered_account)
account = I.registered_account
diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm
index 6547b91a7ebf..f8a998adb744 100644
--- a/code/modules/mob/living/living_say.dm
+++ b/code/modules/mob/living/living_say.dm
@@ -274,7 +274,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list(
return TRUE
-/mob/living/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range=0, source) // DARKPACK EDIT, ORIGINAL: /mob/living/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range=0)
+/mob/living/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range=0, source) // DARKPACK EDIT CHANGE - ORIGINAL: /mob/living/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range=0)
if((SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_HEAR, args) & COMSIG_MOVABLE_CANCEL_HEARING) || !GET_CLIENT(src))
return FALSE
@@ -383,7 +383,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list(
create_chat_message(speaker, message_language, raw_message, spans)
// Recompose message for AI hrefs, language incomprehension.
- message = compose_message(speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, message_mods, source = source) // DARKPACK EDIT, ORIGINAL: message = compose_message(speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, message_mods)
+ message = compose_message(speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, message_mods, source = source) // DARKPACK EDIT CHANGE - ORIGINAL: message = compose_message(speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, message_mods)
var/show_message_success = show_message(message, MSG_AUDIBLE, deaf_message, deaf_type, avoid_highlight)
return understood && show_message_success
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index 40ffef06fc7d..8e245b45d7c1 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -220,7 +220,7 @@
acceleration = !acceleration
to_chat(usr, "Camera acceleration has been toggled [acceleration ? "on" : "off"].")
-/mob/eye/camera/ai/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range, source) // DARKPACK EDIT, ORIGINAL: /mob/eye/camera/ai/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range)
+/mob/eye/camera/ai/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range, source) // DARKPACK EDIT CHANGE - ORIGINAL: /mob/eye/camera/ai/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range)
. = ..()
if(relay_speech && speaker && ai && !radio_freq && speaker != ai && SScameras.is_visible_by_cameras(speaker))
ai.relay_speech(speaker, message_language, raw_message, radio_freq, spans, message_mods)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 30e9f956aa58..dfed8f5d0dbe 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -292,7 +292,7 @@
var/raw_msg = message
var/space = should_have_space_before_emote(html_decode(message)[1]) ? " " : "" // DARKPACK EDIT ADD
if(visible_message_flags & WITH_EMPHASIS_MESSAGE)
- raw_msg = apply_message_emphasis(message) // DARKPACK EDIT, ORIGINAL: message = apply_message_emphasis(message)
+ raw_msg = apply_message_emphasis(message) // DARKPACK EDIT CHANGE - ORIGINAL: message = apply_message_emphasis(message)
/* // DARKPACK EDIT REMOVAL START
if(visible_message_flags & EMOTE_MESSAGE)
message = span_emote("[src] [message]")
@@ -304,10 +304,10 @@
if(self_message && hearing_mob == src)
continue
- // DARKPACK EDIT ADDITION START
+ // DARKPACK EDIT ADD START
if(visible_message_flags & EMOTE_MESSAGE)
message = span_emote("[GET_GUESTBOOK_NAME(hearing_mob, src)][space][raw_msg]")
- // DARKPACK EDIT ADDITION END
+ // DARKPACK EDIT ADD END
//This entire if/else chain could be in two lines but isn't for readibilties sake.
var/msg = message
@@ -343,7 +343,7 @@
if(visible_message_flags & WITH_EMPHASIS_MESSAGE)
self_message = apply_message_emphasis(self_message)
if(visible_message_flags & EMOTE_MESSAGE)
- self_message = span_emote("[real_name][space][self_message]") // May make more sense as "You do x" // DARKPACK EDIT CHANGE, ORIGINAL: self_message = span_emote("[src] [self_message]")
+ self_message = span_emote("[real_name][space][self_message]") // May make more sense as "You do x" // DARKPACK EDIT CHANGE - ORIGINAL: self_message = span_emote("[src] [self_message]")
if(visible_message_flags & ALWAYS_SHOW_SELF_MESSAGE)
to_chat(src, self_message, avoid_highlighting = block_self_highlight)
@@ -371,7 +371,7 @@
var/raw_msg = message
var/space = should_have_space_before_emote(html_decode(message)[1]) ? " " : "" // DARKPACK EDIT ADD
if(audible_message_flags & WITH_EMPHASIS_MESSAGE)
- raw_msg = apply_message_emphasis(message) // DARKPACK EDIT, ORIGINAL: message = apply_message_emphasis(message)
+ raw_msg = apply_message_emphasis(message) // DARKPACK EDIT CHANGE - ORIGINAL: message = apply_message_emphasis(message)
/* // DARKPACK EDIT REMOVAL START
if(audible_message_flags & EMOTE_MESSAGE)
message = span_emote("[src] [message]")
@@ -381,10 +381,10 @@
continue
if(self_message && hearing_mob == src)
continue
- // DARKPACK EDIT ADDITION START
+ // DARKPACK EDIT ADD START
if(audible_message_flags & EMOTE_MESSAGE)
message = span_emote("[GET_GUESTBOOK_NAME(hearing_mob, src)][space][raw_msg]")
- // DARKPACK EDIT ADDITION END
+ // DARKPACK EDIT ADD END
if(audible_message_flags & EMOTE_MESSAGE && runechat_prefs_check(hearing_mob, audible_message_flags) && !HAS_TRAIT(hearing_mob, TRAIT_DEAF))
hearing_mob.create_chat_message(src, raw_message = raw_msg, runechat_flags = audible_message_flags)
hearing_mob.show_message(message, MSG_AUDIBLE, deaf_message, MSG_VISUAL)
@@ -411,7 +411,7 @@
if(audible_message_flags & WITH_EMPHASIS_MESSAGE)
self_message = apply_message_emphasis(self_message)
if(audible_message_flags & EMOTE_MESSAGE)
- self_message = span_emote("[GET_GUESTBOOK_NAME(src, src)][space][self_message]") // DARKPACK EDIT CHANGE, ORIGINAL: self_message = span_emote("[src] [self_message]")
+ self_message = span_emote("[GET_GUESTBOOK_NAME(src, src)][space][self_message]") // DARKPACK EDIT CHANGE - ORIGINAL: self_message = span_emote("[src] [self_message]")
if(audible_message_flags & ALWAYS_SHOW_SELF_MESSAGE)
to_chat(src, self_message, avoid_highlighting = block_self_highlight)
diff --git a/code/modules/mod/mod_link.dm b/code/modules/mod/mod_link.dm
index d7fc7070605b..31797198dc85 100644
--- a/code/modules/mod/mod_link.dm
+++ b/code/modules/mod/mod_link.dm
@@ -117,7 +117,7 @@
/obj/item/mod/control/proc/delete_link_visual(mob/living/old_user)
return delete_link_visual_generic(mod_link, old_user)
-/obj/item/mod/control/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range, source) // DARKPACK EDIT, ORIGINAL: /obj/item/mod/control/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range)
+/obj/item/mod/control/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range, source) // DARKPACK EDIT CHANGE - ORIGINAL: /obj/item/mod/control/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range)
. = ..()
if(speaker != wearer && speaker != ai_assistant)
return
@@ -296,7 +296,7 @@
old_user.update_worn_neck()
return delete_link_visual_generic(mod_link, old_user)
-/obj/item/clothing/neck/link_scryer/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range, source) // DARKPACK EDIT, ORIGINAL: /obj/item/clothing/neck/link_scryer/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range)
+/obj/item/clothing/neck/link_scryer/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range, source) // DARKPACK EDIT CHANGE - ORIGINAL: /obj/item/clothing/neck/link_scryer/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range)
. = ..()
if(speaker != loc)
return
diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm
index 228b2539f91b..2dcef451fdf9 100644
--- a/code/modules/movespeed/modifiers/mobs.dm
+++ b/code/modules/movespeed/modifiers/mobs.dm
@@ -1,6 +1,6 @@
/datum/movespeed_modifier/obesity
// large weight slows even if flying and floating
- multiplicative_slowdown = 1.2 //DARKPACK EDIT CHANGE - Original : multiplicative_slowdown = 1.2
+ multiplicative_slowdown = 1.2 // DARKPACK EDIT CHANGE - ORIGINAL: multiplicative_slowdown = 1.2
/datum/movespeed_modifier/monkey_reagent_speedmod
variable = TRUE
diff --git a/code/modules/paperwork/paper_premade.dm b/code/modules/paperwork/paper_premade.dm
index b5686fa7c96a..fee1cf9fa40a 100644
--- a/code/modules/paperwork/paper_premade.dm
+++ b/code/modules/paperwork/paper_premade.dm
@@ -439,7 +439,7 @@
Blood types not written above can only receive from the same blood type.
- "} // DARKPACK EDIT REMOVE - Removed "Certain species do not have blood."
+ "} // DARKPACK EDIT REMOVAL - Removed "Certain species do not have blood."
/*
* Stations
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 2e2c0d60aec5..c9cdd89d6b51 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -24,7 +24,7 @@
. = ..()
ADD_TRAIT(src, TRAIT_FISHING_BAIT, INNATE_TRAIT)
ADD_TRAIT(src, TRAIT_POISONOUS_BAIT, INNATE_TRAIT) //bro is fishing using lithium...
- /* // DARKPACK EDIT REMOVE
+ /* // DARKPACK EDIT REMOVAL
var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/battery_match)
AddElement(
/datum/element/slapcrafting,\
diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
index da0e31fc9301..0877e5bfb6d6 100644
--- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm
+++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
@@ -185,7 +185,7 @@
desc = "A high-tech shotgun shell which can be loaded with materials to produce unique effects."
icon_state = "cshell"
projectile_type = null
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/obj/item/ammo_casing/shotgun/techshell/Initialize(mapload)
. = ..()
diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm
index 64241bfb5e5a..b0e19b4e7339 100644
--- a/code/modules/projectiles/guns/energy/energy_gun.dm
+++ b/code/modules/projectiles/guns/energy/energy_gun.dm
@@ -15,7 +15,7 @@
// Only actual eguns can be converted
if(type != /obj/item/gun/energy/e_gun)
return
- /*// DARKPACK EDIT REMOVE
+ /*// DARKPACK EDIT REMOVAL
var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/advancedegun, /datum/crafting_recipe/tempgun, /datum/crafting_recipe/beam_rifle)
AddElement(
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index 23fc3430814e..64424d2a644d 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -25,7 +25,7 @@
// Only actual KAs can be converted
if(type != /obj/item/gun/energy/recharge/kinetic_accelerator)
return
- /* // DARKPACK EDIT REMOVE
+ /* // DARKPACK EDIT REMOVAL
var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/ebow)
AddElement(
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 5cc5c679dec9..b48515ae9589 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -22,7 +22,7 @@
/datum/element/slapcrafting,\
slapcraft_recipes = slapcraft_recipe_list,\
)
- */ // DARKPACK EDIT REMOVE
+ */ // DARKPACK EDIT REMOVAL
/obj/item/gun/energy/laser/add_seclight_point()
AddComponent(/datum/component/seclite_attachable, \
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index c6d6cfb0d525..c262c10575fa 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -73,7 +73,7 @@
return
/obj/item/firing_pin/proc/pin_auth(mob/living/user)
- var/result = ALLOW_FIRE // DARKPACK EDIT ADD - Removes firing pin authorization - Original : var/result = SEND_SIGNAL(user, COMSIG_LIVING_FIRING_PIN_CHECK, src)
+ var/result = ALLOW_FIRE // DARKPACK EDIT ADD - Removes firing pin authorization - ORIGINAL: var/result = SEND_SIGNAL(user, COMSIG_LIVING_FIRING_PIN_CHECK, src)
if(result & ALLOW_FIRE)
return TRUE
if(result & BLOCK_FIRE)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 91d408a885e8..021c7d9b70bc 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -48,10 +48,13 @@
return list("[blood_type] type blood" = 1)
// DARKPACK EDIT ADD - blood increments bloodpool
-/datum/reagent/blood/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired)
+/datum/reagent/blood/expose_mob(mob/living/exposed_mob, methods, reac_volume, show_message, touch_protection)
. = ..()
- if((!istype(src, /datum/reagent/blood/vitae)) && get_kindred_splat(affected_mob))
- affected_mob.adjust_blood_pool(metabolization_rate * 0.005 * seconds_per_tick)
+ if((!istype(src, /datum/reagent/blood/vitae)) && get_kindred_splat(exposed_mob))
+ if(methods & INGEST)
+ if(get_splat_with_vitae(exposed_mob))
+ //100u of vitae = 1bp, keeping consistent w/ give vitae action. 200u of normal blood = 1 bp
+ exposed_mob.adjust_blood_pool(reac_volume * 0.005)
// DARKPACK EDIT ADD END
/datum/reagent/consumable/liquidgibs
diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm
index 5ee03126b6ef..12bd5470bea6 100644
--- a/code/modules/reagents/reagent_containers/blood_pack.dm
+++ b/code/modules/reagents/reagent_containers/blood_pack.dm
@@ -32,7 +32,7 @@
/obj/item/reagent_containers/blood/random/Initialize(mapload, vol)
icon_state = "bloodpack"
- blood_type = random_human_blood_type_name() // DARKPACK EDIT, ORIGINAL: blood_type = pick(BLOOD_TYPE_A_PLUS, BLOOD_TYPE_A_MINUS, BLOOD_TYPE_B_PLUS, BLOOD_TYPE_B_MINUS, BLOOD_TYPE_O_PLUS, BLOOD_TYPE_O_MINUS, BLOOD_TYPE_LIZARD)
+ blood_type = random_human_blood_type_name() // DARKPACK EDIT CHANGE - ORIGINAL: blood_type = pick(BLOOD_TYPE_A_PLUS, BLOOD_TYPE_A_MINUS, BLOOD_TYPE_B_PLUS, BLOOD_TYPE_B_MINUS, BLOOD_TYPE_O_PLUS, BLOOD_TYPE_O_MINUS, BLOOD_TYPE_LIZARD)
return ..()
/obj/item/reagent_containers/blood/a_plus
diff --git a/code/modules/research/anomaly/anomaly_core.dm b/code/modules/research/anomaly/anomaly_core.dm
index 3e12dd2e9e9e..c0bfbe678edd 100644
--- a/code/modules/research/anomaly/anomaly_core.dm
+++ b/code/modules/research/anomaly/anomaly_core.dm
@@ -170,7 +170,7 @@
var/datum/dimension_theme/theme = SSmaterials.dimensional_themes[new_theme_path]
for(var/turf/turf as anything in RANGE_TURFS(1, our_turf))
theme.apply_theme(turf, show_effect = TRUE)
-/* // DARKPACK EDIT REMOVE
+/* // DARKPACK EDIT REMOVAL
/obj/item/assembly/signaler/anomaly/dimensional/Initialize(mapload)
. = ..()
var/static/list/recipes = list(/datum/crafting_recipe/dimensional_bombcore)
diff --git a/code/modules/spells/spell_types/shapeshift/_shapeshift.dm b/code/modules/spells/spell_types/shapeshift/_shapeshift.dm
index 8e9e70ef2fb4..5d03acb297a3 100644
--- a/code/modules/spells/spell_types/shapeshift/_shapeshift.dm
+++ b/code/modules/spells/spell_types/shapeshift/_shapeshift.dm
@@ -170,7 +170,7 @@
polymorph_bot.bot_cover_flags |= BOT_COVER_EMAGGED
polymorph_bot.bot_mode_flags &= ~BOT_MODE_REMOTE_ENABLED
- new_shape.storyteller_stats = caster.storyteller_stats //DARKPACK EDIT ADD
+ new_shape.storyteller_stats = caster.storyteller_stats // DARKPACK EDIT ADD - STORYTELLER_STATS
return new_shape
diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
index 7d16dbefc5c2..7c4cd5797a29 100644
--- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
@@ -176,41 +176,41 @@
///ZOMBIE
/obj/item/bodypart/head/zombie
limb_id = SPECIES_ZOMBIE
- is_dimorphic = TRUE // DARKPACK EDIT -- original : is_dimorphic = FALSE
- should_draw_greyscale = TRUE // DARKPACK EDIT -- original : should_draw_grayscale = FALSE
+ is_dimorphic = TRUE // DARKPACK EDIT CHANGE - ORIGINAL: is_dimorphic = FALSE
+ should_draw_greyscale = TRUE // DARKPACK EDIT CHANGE - ORIGINAL: should_draw_grayscale = FALSE
head_flags = HEAD_EYESPRITES|HEAD_DEBRAIN
can_dismember = TRUE
/obj/item/bodypart/chest/zombie
limb_id = SPECIES_ZOMBIE
- is_dimorphic = TRUE // DARKPACK EDIT -- original : is_dimorphic = FALSE
- should_draw_greyscale = TRUE // DARKPACK EDIT -- original : should_draw_grayscale = FALSE
+ is_dimorphic = TRUE // DARKPACK EDIT CHANGE - ORIGINAL: is_dimorphic = FALSE
+ should_draw_greyscale = TRUE // DARKPACK EDIT CHANGE - ORIGINAL: should_draw_grayscale = FALSE
wing_types = null
/obj/item/bodypart/arm/left/zombie
limb_id = SPECIES_ZOMBIE
- should_draw_greyscale = TRUE // DARKPACK EDIT -- original : should_draw_grayscale = FALSE
+ should_draw_greyscale = TRUE // DARKPACK EDIT CHANGE - ORIGINAL: should_draw_grayscale = FALSE
/obj/item/bodypart/arm/right/zombie
limb_id = SPECIES_ZOMBIE
- should_draw_greyscale = TRUE // DARKPACK EDIT -- original : should_draw_grayscale = FALSE
+ should_draw_greyscale = TRUE // DARKPACK EDIT CHANGE - ORIGINAL: should_draw_grayscale = FALSE
/obj/item/bodypart/leg/left/zombie
limb_id = SPECIES_ZOMBIE
- should_draw_greyscale = TRUE // DARKPACK EDIT -- original : should_draw_grayscale = FALSE
+ should_draw_greyscale = TRUE // DARKPACK EDIT CHANGE - ORIGINAL: should_draw_grayscale = FALSE
/obj/item/bodypart/leg/right/zombie
limb_id = SPECIES_ZOMBIE
- should_draw_greyscale = TRUE // DARKPACK EDIT -- original : should_draw_grayscale = FALSE
+ should_draw_greyscale = TRUE // DARKPACK EDIT CHANGE - ORIGINAL: should_draw_grayscale = FALSE
/obj/item/bodypart/leg/left/zombie/infectious
limb_id = SPECIES_ZOMBIE
- should_draw_greyscale = TRUE // DARKPACK EDIT -- original : should_draw_grayscale = FALSE
+ should_draw_greyscale = TRUE // DARKPACK EDIT CHANGE - ORIGINAL: should_draw_grayscale = FALSE
speed_modifier = 0.8 //braaaaains
/obj/item/bodypart/leg/right/zombie/infectious
limb_id = SPECIES_ZOMBIE
- should_draw_greyscale = TRUE // DARKPACK EDIT -- original : should_draw_grayscale = FALSE
+ should_draw_greyscale = TRUE // DARKPACK EDIT CHANGE - ORIGINAL: should_draw_grayscale = FALSE
speed_modifier = 0.8 //braaaaains
///PODPEOPLE
diff --git a/code/modules/surgery/organs/external/wings/functional_wings.dm b/code/modules/surgery/organs/external/wings/functional_wings.dm
index 11e629ddd5fd..ae84f98605be 100644
--- a/code/modules/surgery/organs/external/wings/functional_wings.dm
+++ b/code/modules/surgery/organs/external/wings/functional_wings.dm
@@ -4,8 +4,8 @@
/datum/action/innate/flight
name = "Toggle Flight"
check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_IMMOBILE|AB_CHECK_INCAPACITATED
- button_icon = 'modular_darkpack/master_files/icons/hud/actions.dmi' // DARKPACK EDIT CHANGE - Original : button_icon = 'icons/mob/actions/actions_items.dmi'
- button_icon_state = "fly" // DARKPACK EDIT CHANGE - Original : button_icon_state = "flight"
+ button_icon = 'modular_darkpack/master_files/icons/hud/actions.dmi' // DARKPACK EDIT CHANGE - ORIGINAL: button_icon = 'icons/mob/actions/actions_items.dmi'
+ button_icon_state = "fly" // DARKPACK EDIT CHANGE - ORIGINAL: button_icon_state = "flight"
/datum/action/innate/flight/Activate()
var/mob/living/carbon/human/human = owner
diff --git a/code/modules/surgery/organs/internal/stomach/_stomach.dm b/code/modules/surgery/organs/internal/stomach/_stomach.dm
index 50b7e2ce9c61..80c6772ed851 100644
--- a/code/modules/surgery/organs/internal/stomach/_stomach.dm
+++ b/code/modules/surgery/organs/internal/stomach/_stomach.dm
@@ -35,7 +35,7 @@
var/metabolism_efficiency = 0.05 // the lowest we should go is 0.025
/// Multiplier for hunger rate
- var/hunger_modifier = 0.2 // DARKPACK EDIT CHANGE - Original : var/hunger_modifier = 1
+ var/hunger_modifier = 0.2 // DARKPACK EDIT CHANGE - ORIGINAL: var/hunger_modifier = 1
/// Whether the stomach's been repaired with surgery and can be fixed again or not
var/operated = FALSE
/// List of all atoms within the stomach
@@ -201,7 +201,7 @@
/obj/item/organ/stomach/proc/handle_hunger_slowdown(mob/living/carbon/human/human)
var/hungry = (500 - human.nutrition) / 5 //So overeat would be 100 and default level would be 80
if(hungry >= 70)
- human.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, multiplicative_slowdown = (hungry / 80)) // DARKPACK EDIT CHANGE - ORIGINAL : human.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, multiplicative_slowdown = (hungry / 50))
+ human.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, multiplicative_slowdown = (hungry / 80)) // DARKPACK EDIT CHANGE - ORIGINAL: human.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, multiplicative_slowdown = (hungry / 50))
else
human.remove_movespeed_modifier(/datum/movespeed_modifier/hunger)
diff --git a/code/modules/tgui_input/say_modal/modal.dm b/code/modules/tgui_input/say_modal/modal.dm
index 9944ee74e609..2f4fb23f1f82 100644
--- a/code/modules/tgui_input/say_modal/modal.dm
+++ b/code/modules/tgui_input/say_modal/modal.dm
@@ -92,7 +92,7 @@
if(!payload?["channel"])
CRASH("No channel provided to an open TGUI-Say")
window_open = TRUE
- if(payload["channel"] != OOC_CHANNEL && payload["channel"] != ADMIN_CHANNEL && payload["channel"] != LOOC_CHANNEL) // DARKPACK EDIT, ORIGINAL: if(payload["channel"] != OOC_CHANNEL && payload["channel"] != ADMIN_CHANNEL)
+ if(payload["channel"] != OOC_CHANNEL && payload["channel"] != ADMIN_CHANNEL && payload["channel"] != LOOC_CHANNEL) // DARKPACK EDIT CHANGE - ORIGINAL: if(payload["channel"] != OOC_CHANNEL && payload["channel"] != ADMIN_CHANNEL)
start_thinking()
if(!client.typing_indicators)
log_speech_indicators("[key_name(client)] started typing at [loc_name(client.mob)], indicators DISABLED.")
diff --git a/code/modules/tgui_input/say_modal/speech.dm b/code/modules/tgui_input/say_modal/speech.dm
index 12e37dbe2e0b..318f9cc002be 100644
--- a/code/modules/tgui_input/say_modal/speech.dm
+++ b/code/modules/tgui_input/say_modal/speech.dm
@@ -12,7 +12,7 @@
var/list/phrases = alter_phrases || hurt_phrases
/// No OOC leaks
- if(!entry || payload["channel"] == OOC_CHANNEL || payload["channel"] == ME_CHANNEL || payload["channel"] == LOOC_CHANNEL) // DARKPACK EDIT, ORIGINAL: if(!entry || payload["channel"] == OOC_CHANNEL || payload["channel"] == ME_CHANNEL)
+ if(!entry || payload["channel"] == OOC_CHANNEL || payload["channel"] == ME_CHANNEL || payload["channel"] == LOOC_CHANNEL) // DARKPACK EDIT CHANGE - ORIGINAL: if(!entry || payload["channel"] == OOC_CHANNEL || payload["channel"] == ME_CHANNEL)
return pick(phrases)
/// Random trimming for larger sentences
if(length(entry) > 50)
@@ -139,7 +139,7 @@
return TRUE
if(type == "force")
var/target_channel = payload["channel"]
- if(target_channel == ME_CHANNEL || target_channel == OOC_CHANNEL || target_channel == LOOC_CHANNEL) // DARKPACK EDIT, ORIGINAL: if(target_channel == ME_CHANNEL || target_channel == OOC_CHANNEL)
+ if(target_channel == ME_CHANNEL || target_channel == OOC_CHANNEL || target_channel == LOOC_CHANNEL) // DARKPACK EDIT CHANGE - ORIGINAL: if(target_channel == ME_CHANNEL || target_channel == OOC_CHANNEL)
target_channel = SAY_CHANNEL // No ooc leaks
delegate_speech(alter_entry(payload), target_channel)
return TRUE
diff --git a/code/modules/unit_tests/quirks.dm b/code/modules/unit_tests/quirks.dm
index edc80fc96250..8a31b5ac2983 100644
--- a/code/modules/unit_tests/quirks.dm
+++ b/code/modules/unit_tests/quirks.dm
@@ -10,7 +10,7 @@
if (isnull(icon))
TEST_FAIL("[quirk_type] has no icon!")
continue
- /* DARKPACK EDIT REMOVAL - MERITS/FLAWS
+ /* DARKPACK EDIT REMOVAL - MERITS_FLAWS
if (icon in used_icons)
TEST_FAIL("[icon] used in both [quirk_type] and [used_icons[icon]]!")
continue
@@ -22,7 +22,7 @@
/datum/unit_test/quirk_initial_medical_records
/datum/unit_test/quirk_initial_medical_records/Run()
- /* DARKPACK EDIT REMOVAL - MERITS/FLAWS - we don't need this and darkpack quirk splat/clan exclusion makes it impossible to add to a random test character with no splats
+ /* DARKPACK EDIT REMOVAL - MERITS_FLAWS - we don't need this and darkpack quirk splat/clan exclusion makes it impossible to add to a random test character with no splats
var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human/consistent)
for(var/datum/quirk/quirk_type as anything in valid_subtypesof(/datum/quirk))
@@ -50,7 +50,7 @@
)
/datum/unit_test/blood_deficiency_mail/Run()
- /* DARKPACK EDIT REMOVAL - MERITS/FLAWS - we are not using /tg/ quirks
+ /* DARKPACK EDIT REMOVAL - MERITS_FLAWS - we are not using /tg/ quirks
var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent)
dummy.add_quirk(/datum/quirk/blooddeficiency)
var/datum/quirk/blooddeficiency/quirk = dummy.get_quirk(/datum/quirk/blooddeficiency)
@@ -88,7 +88,7 @@
GLOB.uncommon_roundstart_languages = list(/datum/language/uncommon)
for (var/datum/quirk/quirk_type as anything in valid_subtypesof(/datum/quirk))
- // DARKPACK EDIT ADD START - MERITS/FLAWS
+ // DARKPACK EDIT ADD START - MERITS_FLAWS
if(!quirk_type::darkpack_allowed)
continue
var/list/forbidden_splats_test
@@ -110,7 +110,7 @@
new_character.mind_initialize()
abstract_player.new_character = new_character
- // DARKPACK EDIT ADD START - MERITS/FLAWS
+ // DARKPACK EDIT ADD START - MERITS_FLAWS
// if allowed splats, add the allowed splat, then test, failure if its not added
if(allowed_splats_test)
for(var/datum/splat/allowed_splat in allowed_splats_test)
@@ -131,7 +131,7 @@
if(!forbidden_splats_test && !allowed_splats_test && !excluded_clans_test && !included_clans_test)
if (!new_character.add_quirk(quirk_type, roundstart_mock_client))
TEST_FAIL("Failed to initialize quirk [quirk_type] on a roundstart character!")
- // DARKPACK EDIT ADD END - MERITS/FLAWS
+ // DARKPACK EDIT ADD END - MERITS_FLAWS
var/mob/living/carbon/human/latejoin_character = allocate(/mob/living/carbon/human/consistent)
var/datum/client_interface/latejoin_mock_client = new()
@@ -139,7 +139,7 @@
latejoin_character.mock_client = latejoin_mock_client
latejoin_character.mind_initialize()
- // DARKPACK EDIT ADD - MERITS/FLAWS
+ // DARKPACK EDIT ADD - MERITS_FLAWS
// if allowed splats, add the allowed splat, then test, failure if its not added
if(allowed_splats_test)
for(var/datum/splat/allowed_splat in allowed_splats_test)
@@ -160,7 +160,7 @@
if(!forbidden_splats_test && !allowed_splats_test && !excluded_clans_test && !included_clans_test)
if (!latejoin_character.add_quirk(quirk_type, latejoin_mock_client))
TEST_FAIL("Failed to initialize quirk [quirk_type] on a latejoin character!")
- // DARKPACK EDIT ADD END - MERITS/FLAWS
+ // DARKPACK EDIT ADD END - MERITS_FLAWS
// Clean up after ourselves
GLOB.uncommon_roundstart_languages.Cut()
diff --git a/code/modules/unit_tests/say.dm b/code/modules/unit_tests/say.dm
index 1e0e93fe9930..b32b9ce913ad 100644
--- a/code/modules/unit_tests/say.dm
+++ b/code/modules/unit_tests/say.dm
@@ -8,7 +8,7 @@
test("Hello", "Hello", list())
test(";HELP", "HELP", list(MODE_HEADSET = TRUE))
test(";%Never gonna give you up", "Never gonna give you up", list(MODE_HEADSET = TRUE, MODE_SING = TRUE))
- test(".v Gun plz", "Gun plz", list(RADIO_KEY = RADIO_KEY_SERVICE, RADIO_EXTENSION = RADIO_CHANNEL_SERVICE)) // DARKPACK EDIT, ORIGINAL: test(".s Gun plz", "Gun plz", list(RADIO_KEY = RADIO_KEY_SECURITY, RADIO_TOKEN = RADIO_TOKEN_SECURITY))
+ test(".v Gun plz", "Gun plz", list(RADIO_KEY = RADIO_KEY_SERVICE, RADIO_EXTENSION = RADIO_CHANNEL_SERVICE)) // DARKPACK EDIT CHANGE - ORIGINAL: test(".s Gun plz", "Gun plz", list(RADIO_KEY = RADIO_KEY_SECURITY, RADIO_TOKEN = RADIO_TOKEN_SECURITY))
test("...What", "...What", list())
/datum/unit_test/get_message_mods/proc/test(message, expected_message, list/expected_mods)
diff --git a/code/modules/unit_tests/station_trait_tests.dm b/code/modules/unit_tests/station_trait_tests.dm
index 7b3557be9354..d5bbbe276f5b 100644
--- a/code/modules/unit_tests/station_trait_tests.dm
+++ b/code/modules/unit_tests/station_trait_tests.dm
@@ -3,7 +3,7 @@
/datum/unit_test/station_traits/Run()
var/datum/station_trait/cybernetic_revolution/cyber_trait = allocate(/datum/station_trait/cybernetic_revolution)
- for(var/datum/job/job as anything in subtypesof(/datum/job) - typesof(/datum/job/vampire)) // DARKPACK EDIT, ORIGINAL: for(var/datum/job/job as anything in subtypesof(/datum/job))
+ for(var/datum/job/job as anything in subtypesof(/datum/job) - typesof(/datum/job/vampire)) // DARKPACK EDIT CHANGE - ORIGINAL: for(var/datum/job/job as anything in subtypesof(/datum/job))
if(!(initial(job.job_flags) & JOB_CREW_MEMBER))
continue
if((initial(job.job_flags) & STATION_TRAIT_JOB_FLAGS) == STATION_TRAIT_JOB_FLAGS)
diff --git a/code/modules/unit_tests/surgeries.dm b/code/modules/unit_tests/surgeries.dm
index c04dcec1012b..661e48aee572 100644
--- a/code/modules/unit_tests/surgeries.dm
+++ b/code/modules/unit_tests/surgeries.dm
@@ -62,7 +62,7 @@
UNLINT(surgery.success(alice.get_bodypart(BODY_ZONE_HEAD, TRUE), user, bobs_head, list()))
TEST_ASSERT(!isnull(alice.get_bodypart(BODY_ZONE_HEAD)), "Alice has no head after prosthetic replacement")
- TEST_ASSERT_EQUAL(alice.real_name, "Bob", "Bob's head was transplanted onto Alice's body, but their name is not Bob") // DARKPACK EDIT, ORIGINAL: TEST_ASSERT_EQUAL(alice.get_visible_name(), "Bob", "Bob's head was transplanted onto Alice's body, but their name is not Bob")
+ TEST_ASSERT_EQUAL(alice.real_name, "Bob", "Bob's head was transplanted onto Alice's body, but their name is not Bob") // DARKPACK EDIT CHANGE - ORIGINAL: TEST_ASSERT_EQUAL(alice.get_visible_name(), "Bob", "Bob's head was transplanted onto Alice's body, but their name is not Bob")
TEST_ASSERT_EQUAL(alice.hairstyle, "Short Hair", "Bob's head was transplanted onto Alice's body, but their hairstyle is not Short Hair")
TEST_ASSERT_EQUAL(alice.hair_color, COLOR_LIGHT_BROWN, "Bob's head was transplanted onto Alice's body, but their hair color is not COLOR_LIGHT_BROWN")
TEST_ASSERT_EQUAL(alice.facial_hairstyle, "Beard (Full)", "Bob's head was transplanted onto Alice's body, but their facial hairstyle is not Beard (Full)")
diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm
index 5dd77c050dcb..68109446e1dc 100644
--- a/code/modules/vending/boozeomat.dm
+++ b/code/modules/vending/boozeomat.dm
@@ -69,7 +69,6 @@
/obj/item/reagent_containers/cup/glass/drinkingglass = 30,
// DARKPACK EDIT START
/obj/item/reagent_containers/cup/glass/drinkingglass/whiskey_shot = 12,
- /*
/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass = 12,
/obj/item/reagent_containers/cup/glass/drinkingglass/collins_glass = 15,
/obj/item/reagent_containers/cup/glass/drinkingglass/martini_glass = 15,
@@ -77,9 +76,7 @@
/obj/item/reagent_containers/cup/glass/drinkingglass/pint = 15,
/obj/item/reagent_containers/cup/glass/drinkingglass/vodka_shot = 12,
/obj/item/reagent_containers/cup/glass/drinkingglass/whiskey_shot = 15,
- */
// DARKPACK EDIT ADD END
- /obj/item/reagent_containers/cup/glass/drinkingglass/wine_glass = 15,
/obj/item/reagent_containers/cup/glass/flask = 3,
/obj/item/reagent_containers/cup/glass/bottle = 15,
/obj/item/reagent_containers/cup/glass/bottle/small = 15,
diff --git a/code/modules/wiremod/components/atom/hear.dm b/code/modules/wiremod/components/atom/hear.dm
index 72d85ba22b0a..3e031adbc2bd 100644
--- a/code/modules/wiremod/components/atom/hear.dm
+++ b/code/modules/wiremod/components/atom/hear.dm
@@ -43,7 +43,7 @@
SIGNAL_HANDLER
return Hear(arglist(arguments))
-/obj/item/circuit_component/hear/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range, source) // DARKPACK EDIT, ORIGINAL: /obj/item/circuit_component/hear/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range)
+/obj/item/circuit_component/hear/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range, source) // DARKPACK EDIT CHANGE - ORIGINAL: /obj/item/circuit_component/hear/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range)
if(!on.value)
return FALSE
if(speaker == parent?.shell)
diff --git a/config/darkpack_config.txt b/config/darkpack_config.txt
index 0da4988cc480..bd565bc978fd 100644
--- a/config/darkpack_config.txt
+++ b/config/darkpack_config.txt
@@ -51,3 +51,6 @@ LOG_STATS
#HUMANITY_SUNLIGHT_RESISTANCE
#EXTRA_ISSUE_URLS https://github.com/DarkPack13/SecondCity
+
+## Bool for if roleplay only merits/quirks are enabled
+ROLEPLAY_ONLY_MERITS 1
diff --git a/config/darkpack_config/bloopers/blooper_config.json b/config/darkpack_config/bloopers/blooper_config.json
new file mode 100644
index 000000000000..33e7d963ec29
--- /dev/null
+++ b/config/darkpack_config/bloopers/blooper_config.json
@@ -0,0 +1,24 @@
+[
+ {
+ "name": "Ehh 1",
+ "id": "ehh1",
+ "files": [
+ "ehh.ogg"
+ ]
+ },
+
+ {
+ "name": "Pencil",
+ "id": "pencil",
+ "files": [
+ "pencil.ogg"
+ ]
+ },
+ {
+ "name": "Dot",
+ "id": "dot",
+ "files": [
+ "dot.ogg"
+ ]
+ }
+]
diff --git a/config/darkpack_config/bloopers/blooper_config.json.example b/config/darkpack_config/bloopers/blooper_config.json.example
new file mode 100644
index 000000000000..4f31f32bb619
--- /dev/null
+++ b/config/darkpack_config/bloopers/blooper_config.json.example
@@ -0,0 +1,13 @@
+[
+ {
+ "name": "Example Blooper",
+ "id": "example",
+ "files": ["example.ogg"],
+ "min_speed": 2,
+ "max_speed": 16,
+ "min_pitch": 0.4,
+ "max_pitch": 2,
+ "min_vary": 0.1,
+ "max_vary": 0.8
+ }
+]
diff --git a/config/darkpack_config/bloopers/sounds/dot.ogg b/config/darkpack_config/bloopers/sounds/dot.ogg
new file mode 100644
index 000000000000..428f68ff9654
Binary files /dev/null and b/config/darkpack_config/bloopers/sounds/dot.ogg differ
diff --git a/config/darkpack_config/bloopers/sounds/ehh.ogg b/config/darkpack_config/bloopers/sounds/ehh.ogg
new file mode 100644
index 000000000000..44679bd4a6c5
Binary files /dev/null and b/config/darkpack_config/bloopers/sounds/ehh.ogg differ
diff --git a/config/darkpack_config/bloopers/sounds/pencil.ogg b/config/darkpack_config/bloopers/sounds/pencil.ogg
new file mode 100644
index 000000000000..b0e25e448ce0
Binary files /dev/null and b/config/darkpack_config/bloopers/sounds/pencil.ogg differ
diff --git a/config/game_options.txt b/config/game_options.txt
index 3b66a0668bee..43d3b5725b9a 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -157,7 +157,7 @@ DYNAMIC_CONFIG_ENABLED
## RANDOM EVENTS ###
## Comment this out to disable random events during the round.
-#ALLOW_RANDOM_EVENTS
+ALLOW_RANDOM_EVENTS
## Uncomment this to disable station traits.
#FORBID_STATION_TRAITS
diff --git a/html/changelogs/AutoChangeLog-pr-1002.yml b/html/changelogs/AutoChangeLog-pr-1002.yml
new file mode 100644
index 000000000000..bb261d1c62df
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1002.yml
@@ -0,0 +1,4 @@
+author: "Magisterium2022"
+delete-after: True
+changes:
+ - balance: "Made Lupus and Hispo unable to be handcuffed."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1004.yml b/html/changelogs/AutoChangeLog-pr-1004.yml
new file mode 100644
index 000000000000..a72a0c9cf539
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1004.yml
@@ -0,0 +1,5 @@
+author: "FalloutFalcon"
+delete-after: True
+changes:
+ - balance: "number of successes required for Fera shifting is based on how many forms your swapping between"
+ - bugfix: "Feras's shift difficulty is based on the form your currently in rather then the one your turning into"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1007.yml b/html/changelogs/AutoChangeLog-pr-1007.yml
new file mode 100644
index 000000000000..6f48ff462819
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1007.yml
@@ -0,0 +1,8 @@
+author: "FalloutFalcon"
+delete-after: True
+changes:
+ - rscadd: "Adds support for automatic successes based on the TTRPG"
+ - code_imp: "Cleans up some of the code surrounding potance"
+ - balance: "Kills some of the snowflaky effect of potance in favor of it granting automatic successes (TTRPG accuracy)"
+ - qol: "Makes the dice unicode characters to show individual dice results a little larger"
+ - bugfix: "Potance 1-2 no longer cripples melee damage and it now scales correctly with all dots."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1008.yml b/html/changelogs/AutoChangeLog-pr-1008.yml
new file mode 100644
index 000000000000..bd3046f7a227
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1008.yml
@@ -0,0 +1,4 @@
+author: "FalloutFalcon"
+delete-after: True
+changes:
+ - bugfix: "Doors can no longer be repunched for infinite door items"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1013.yml b/html/changelogs/AutoChangeLog-pr-1013.yml
new file mode 100644
index 000000000000..a7526bbc63d3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1013.yml
@@ -0,0 +1,4 @@
+author: "FalloutFalcon"
+delete-after: True
+changes:
+ - rscdel: "Removed some TG holidays from appearing"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1018.yml b/html/changelogs/AutoChangeLog-pr-1018.yml
new file mode 100644
index 000000000000..7016ff57dc76
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1018.yml
@@ -0,0 +1,4 @@
+author: "chazzyjazzy"
+delete-after: True
+changes:
+ - balance: "animalism mobs now have bloodpool = 2"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1019.yml b/html/changelogs/AutoChangeLog-pr-1019.yml
new file mode 100644
index 000000000000..8a1e87dbcf52
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1019.yml
@@ -0,0 +1,6 @@
+author: "chazzyjazzy"
+delete-after: True
+changes:
+ - bugfix: "fixes Thaumaturgy 4 not incrementing the target's bloodpool"
+ - bugfix: "Thaumaturgy 4 Theft of Vitae now costs 1 bloodpoint"
+ - balance: "lowers Lure of Flames and Levinbolt 'palm of flame'-type ability's damage from 25 burn (50 against kindred) per click to 15 burn (30 against kindred), 20 for 'candle' and 'illuminate'"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1020.yml b/html/changelogs/AutoChangeLog-pr-1020.yml
new file mode 100644
index 000000000000..301c9752c83b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1020.yml
@@ -0,0 +1,4 @@
+author: "FalloutFalcon"
+delete-after: True
+changes:
+ - rscadd: "Delirium status effect"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1021.yml b/html/changelogs/AutoChangeLog-pr-1021.yml
new file mode 100644
index 000000000000..5de36deac2f2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1021.yml
@@ -0,0 +1,4 @@
+author: "FalloutFalcon"
+delete-after: True
+changes:
+ - qol: "Makes the local host start now sound quieter and only play once"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1022.yml b/html/changelogs/AutoChangeLog-pr-1022.yml
new file mode 100644
index 000000000000..97bd1e842731
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1022.yml
@@ -0,0 +1,4 @@
+author: "FalloutFalcon"
+delete-after: True
+changes:
+ - balance: "Fera transformations damage worn clothing"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1023.yml b/html/changelogs/AutoChangeLog-pr-1023.yml
new file mode 100644
index 000000000000..0c76ebc0bffb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1023.yml
@@ -0,0 +1,4 @@
+author: "Stutternov"
+delete-after: True
+changes:
+ - rscadd: "Adds maximum immortal age variable for jobs."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1025.yml b/html/changelogs/AutoChangeLog-pr-1025.yml
new file mode 100644
index 000000000000..68fd006e4c9e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1025.yml
@@ -0,0 +1,4 @@
+author: "chazzyjazzy"
+delete-after: True
+changes:
+ - bugfix: "adds hunter landmarks"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1026.yml b/html/changelogs/AutoChangeLog-pr-1026.yml
new file mode 100644
index 000000000000..20b1e0f135c4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1026.yml
@@ -0,0 +1,4 @@
+author: "FalloutFalcon"
+delete-after: True
+changes:
+ - balance: "Removes nutriment gain from biting"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1028.yml b/html/changelogs/AutoChangeLog-pr-1028.yml
new file mode 100644
index 000000000000..377d115d68c3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1028.yml
@@ -0,0 +1,4 @@
+author: "FalloutFalcon, Major00"
+delete-after: True
+changes:
+ - image: "Resprites wooden drying racks"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1029.yml b/html/changelogs/AutoChangeLog-pr-1029.yml
new file mode 100644
index 000000000000..f20e1cf797b9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1029.yml
@@ -0,0 +1,4 @@
+author: "FalloutFalcon"
+delete-after: True
+changes:
+ - rscadd: "landmark for cargo crate delivery locations"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-850.yml b/html/changelogs/AutoChangeLog-pr-850.yml
new file mode 100644
index 000000000000..e92eca185a0c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-850.yml
@@ -0,0 +1,4 @@
+author: "Kolibri-B"
+delete-after: True
+changes:
+ - bugfix: "Fixed Obtenebration 3 \"Arms of the Abyss\" tentacle behaviour"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-860.yml b/html/changelogs/AutoChangeLog-pr-860.yml
deleted file mode 100644
index 605bf52325a7..000000000000
--- a/html/changelogs/AutoChangeLog-pr-860.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "FalloutFalcon"
-delete-after: True
-changes:
- - bugfix: "The umbra should now have its parallax again"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-861.yml b/html/changelogs/AutoChangeLog-pr-861.yml
deleted file mode 100644
index 602a5a4d9076..000000000000
--- a/html/changelogs/AutoChangeLog-pr-861.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-author: "chazzyjazzy"
-delete-after: True
-changes:
- - bugfix: "makes *glasses work again"
- - bugfix: "fixes a bug with guestbooks not displaying names correctly or at all or duplicately"
- - bugfix: "resolves harddeletes causing lag"
- - bugfix: "removes Giovanni from tower employee"
- - bugfix: "removes Gargoyle from tremere regent"
- - bugfix: "adds ghouls to police sergeant"
- - bugfix: "makes npcs all have hair colors now instead of all having white"
- - bugfix: "npcs now properly get immobilized from stuns like Dominate"
- - bugfix: "makes the wallet worn sprite invisible (it was ugly)"
- - bugfix: "visceratika's dot 5 now allows walking through walls, it was bugged"
- - bugfix: "quietus' dot 2 touch attack now can no longer be dropped"
- - bugfix: "auspex 2 is no longer is free and infinite, was an unintended bug"
- - bugfix: "identifying artifacts via tremere ritual now awards research points again"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-908.yml b/html/changelogs/AutoChangeLog-pr-908.yml
new file mode 100644
index 000000000000..2d0f7c715cd4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-908.yml
@@ -0,0 +1,5 @@
+author: "FalloutFalcon"
+delete-after: True
+changes:
+ - rscadd: "Adds two werewolf fetishes; Nyxs Bangle and Dagger of retribution"
+ - refactor: "Cleans up some artifact code around ownership and power granting"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-931.yml b/html/changelogs/AutoChangeLog-pr-931.yml
deleted file mode 100644
index d98096d38c73..000000000000
--- a/html/changelogs/AutoChangeLog-pr-931.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Icarus-The-Sun"
-delete-after: True
-changes:
- - rscadd: "Adds Dull Fangs as a flaw"
- - bugfix: "Pliers can be used to remove fangs"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-937.yml b/html/changelogs/AutoChangeLog-pr-937.yml
deleted file mode 100644
index c7e42e9094eb..000000000000
--- a/html/changelogs/AutoChangeLog-pr-937.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "limette, biplume"
-delete-after: True
-changes:
- - rscadd: "eyes of the beast now glow in the dark and breach"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-939.yml b/html/changelogs/AutoChangeLog-pr-939.yml
deleted file mode 100644
index 908cc7655e47..000000000000
--- a/html/changelogs/AutoChangeLog-pr-939.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "chazzyjazzy"
-delete-after: True
-changes:
- - bugfix: "you can no longer join with negative freebie points"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-940.yml b/html/changelogs/AutoChangeLog-pr-940.yml
deleted file mode 100644
index b651c84a6d38..000000000000
--- a/html/changelogs/AutoChangeLog-pr-940.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Icarus-The-Sun"
-delete-after: True
-changes:
- - bugfix: "Mixing Bowls can now be used."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-941.yml b/html/changelogs/AutoChangeLog-pr-941.yml
deleted file mode 100644
index 25033086ef3c..000000000000
--- a/html/changelogs/AutoChangeLog-pr-941.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Icarus-The-Sun"
-delete-after: True
-changes:
- - qol: "Ashtrays, Cigars, Matchboxes and Malboro Golds are available in the smoke shop."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-943.yml b/html/changelogs/AutoChangeLog-pr-943.yml
deleted file mode 100644
index eda8cac2747a..000000000000
--- a/html/changelogs/AutoChangeLog-pr-943.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Beautiful TG coders"
-delete-after: True
-changes:
- - code_imp: "TG Pull. Thank you TG."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-948.yml b/html/changelogs/AutoChangeLog-pr-948.yml
new file mode 100644
index 000000000000..645c8f0d56ed
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-948.yml
@@ -0,0 +1,7 @@
+author: "buffyuwu"
+delete-after: True
+changes:
+ - rscadd: "ghouls now get potence 1 for free"
+ - bugfix: "ghouls can now only have level 1 in their disciplines"
+ - bugfix: "solves bloodheal and potence harddels by removing the disciplines on_lose_or_destroy"
+ - bugfix: "fixes a bug with transformation disciplines causing disciplines to become unusable"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-982.yml b/html/changelogs/AutoChangeLog-pr-982.yml
new file mode 100644
index 000000000000..960620cefdc6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-982.yml
@@ -0,0 +1,4 @@
+author: "chazzyjazzy"
+delete-after: True
+changes:
+ - rscadd: "adds the Society of Leopold, the largest subdivision of the Inquisiton, Vampire and Werewolf hunters"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-988.yml b/html/changelogs/AutoChangeLog-pr-988.yml
new file mode 100644
index 000000000000..505cca2995cb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-988.yml
@@ -0,0 +1,5 @@
+author: "chazzyjazzy"
+delete-after: True
+changes:
+ - rscadd: "adds blackout random event"
+ - code_imp: "cleaned up fusebox damage code"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-997.yml b/html/changelogs/AutoChangeLog-pr-997.yml
new file mode 100644
index 000000000000..8ab2c4bc30ec
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-997.yml
@@ -0,0 +1,4 @@
+author: "FalloutFalcon"
+delete-after: True
+changes:
+ - rscadd: "Adds Wolf Sight Merit from W20"
\ No newline at end of file
diff --git a/html/changelogs/archive/2026-04.yml b/html/changelogs/archive/2026-04.yml
index 9d5096dd6e8a..a29dc3826ae4 100644
--- a/html/changelogs/archive/2026-04.yml
+++ b/html/changelogs/archive/2026-04.yml
@@ -111,3 +111,55 @@
- bugfix: auspex 2 failure to_chat actually prints
- rscadd: Adds Betrayer's Mark, Thaumaturgically Inept, and Mage Blood as Tremere-specific
flaws
+2026-04-27:
+ Beautiful TG coders:
+ - code_imp: TG Pull. Thank you TG.
+ FalloutFalcon:
+ - bugfix: Normal AND razor claws both deal extra die of damage
+ - bugfix: fixed an issue where disciplines would appear on the wrong characters
+ in some instances
+ - bugfix: The umbra should now have its parallax again
+ - balance: Some jobs are restricted by auspice or tribe
+ - bugfix: Changing splats will properly update your emotion aura
+ Icarus-The-Sun:
+ - qol: Ashtrays, Cigars, Matchboxes and Malboro Golds are available in the smoke
+ shop.
+ - balance: Changes night vision granted by the pierce the veil ritual to be stronger
+ - qol: Adds canes to the pharmacy
+ - bugfix: Mixing Bowls can now be used.
+ - rscadd: Adds Dull Fangs as a flaw
+ - bugfix: Pliers can be used to remove fangs
+ Kolibri-B:
+ - rscadd: Added a few more objects that Obtenebration 5 can phase through
+ - bugfix: Fixes Obtenebration 5 not phasing through doors
+ Magisterium2022:
+ - rscadd: Gave Vicissitude owners the ability to performs surgeries on themselves.
+ - rscadd: Made Bloodform immune to cuffs, staking, and brute damage, ability to
+ pass through doors and mobs, alongside pacifism and masquerade violating appearance.
+ Marshmellow105:
+ - code_imp: removed duplicate setite areas
+ - bugfix: FBI agents spawn with a police radio again
+ - bugfix: FBI agent keys spawn in their pockets now to prevent bugs with loadout
+ items
+ - rscadd: Adds a subtype of glock magazine so Federal Agents dont have to roundstart
+ re-pack magazines with hollowpoint
+ chazzyjazzy:
+ - bugfix: makes *glasses work again
+ - bugfix: fixes a bug with guestbooks not displaying names correctly or at all or
+ duplicately
+ - bugfix: resolves harddeletes causing lag
+ - bugfix: removes Giovanni from tower employee
+ - bugfix: removes Gargoyle from tremere regent
+ - bugfix: adds ghouls to police sergeant
+ - bugfix: makes npcs all have hair colors now instead of all having white
+ - bugfix: npcs now properly get immobilized from stuns like Dominate
+ - bugfix: makes the wallet worn sprite invisible (it was ugly)
+ - bugfix: visceratika's dot 5 now allows walking through walls, it was bugged
+ - bugfix: quietus' dot 2 touch attack now can no longer be dropped
+ - bugfix: auspex 2 is no longer is free and infinite, was an unintended bug
+ - bugfix: identifying artifacts via tremere ritual now awards research points again
+ - rscadd: Adds Calling the Hungry Shade and Pierce the Veil Abyss Mysticism rituals
+ for Lasombras
+ - bugfix: you can no longer join with negative freebie points
+ limette, biplume:
+ - rscadd: eyes of the beast now glow in the dark and breach
diff --git a/html/changelogs/archive/2026-05.yml b/html/changelogs/archive/2026-05.yml
new file mode 100644
index 000000000000..356dd54adaa1
--- /dev/null
+++ b/html/changelogs/archive/2026-05.yml
@@ -0,0 +1,54 @@
+2026-05-04:
+ Biplume:
+ - balance: Crinos, Hispo, and Lupus speeds were all nerfed.
+ - balance: Hispo and Lupus bites do aggravated damage.
+ FalloutFalcon:
+ - config: Adds config for if roleplay only merits are available
+ - balance: You can no longer jump while lying down
+ - qol: Street signs tell you where you are
+ - balance: Claws are prefered to kicking
+ - bugfix: Claws get intended bonus dice on basic mobs
+ - balance: Fera claws are sharp and deal aggravated damage
+ - rscadd: reworks frenzying to be a role-play/fluff effect rather then stealing
+ control of your character.
+ - bugfix: color effect from Kiss status effect should properly clear
+ - balance: fera warforms are considered large mobs
+ - balance: Gangrel forms are downgraded to large mobs instead of huge
+ - image: hair dye spray has an onfloor
+ - rscdel: Removes dice output preference in favor of always outputting to chat unless
+ declared by the roll.
+ - balance: reduces the rate at which cats breed
+ FalloutFalcon, CYBILIZE:
+ - bugfix: fixed separate phone calls occasionally sharing audio with each other
+ - code_imp: corrected secure phone frequency assignment logic
+ buffyuwu:
+ - bugfix: Crime will no longer be automatically reported outside of masquerade enforced
+ areas
+ chazzyjazzy:
+ - code_imp: every job datum now has a faction
+ - code_imp: removes unused and useless 'is_gun_store' job on /obj/structure/retail
+ - bugfix: fixes the very smallest and the very tallest height from not being applied
+ - rscadd: store owners now say unique things to you when you open their store
+ - rscadd: store owners now have revamped outfits for unique and cool looks
+ - rscadd: makes lightposts go out when the area power transformer is broken
+ - rscadd: gargoyles can now tuck their wings, preventing them from flying, but making
+ them able to wear other clothes
+ - rscadd: gargoyle flight now makes a flapping noise
+ - rscadd: fixes serpentis 1
+ - bugfix: readds bank vault door to giovanni kindred roles
+ - bugfix: adds npc subtypes for the new store owners
+ - rscadd: empty bloodbags can now be bought at the pharmacy
+ - bugfix: negative stat modifiers now work
+ chazzyjazzy, buffyuwu:
+ - rscadd: blush of health quirk
+ - rscadd: eat food quirk
+ - bugfix: aura hearts now beat only when they should
+ - bugfix: setites now get their clan keys
+ - bugfix: bloodpacks now actually increment bloodpool
+ - bugfix: sunglasses and other glasses now act in the same way masks do for masquerade
+ violating eyes
+ - bugfix: dementation's missing sprite is now patched
+ dwinters99:
+ - rscadd: company logo element
+ theselfish:
+ - rscadd: Tremere may have a Third Eye.
diff --git a/modular_darkpack/master_files/code/datums/quirks/_quirk.dm b/modular_darkpack/master_files/code/datums/quirks/_quirk.dm
index 9bc8517ac97f..c794cc064b78 100644
--- a/modular_darkpack/master_files/code/datums/quirks/_quirk.dm
+++ b/modular_darkpack/master_files/code/datums/quirks/_quirk.dm
@@ -1,2 +1,5 @@
/datum/quirk
var/darkpack_allowed = FALSE // MERITS/FLAWS
+ // I would like to highlight these to admins or players but for now it lets them be controlled via config
+ /// If the quirk has 0 mechnaical effect.
+ var/roleplay_only = FALSE
diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/blind.dm b/modular_darkpack/master_files/code/datums/quirks/negative_quirks/blind.dm
similarity index 100%
rename from modular_darkpack/modules/merits_flaws/code/negative_quirks/blind.dm
rename to modular_darkpack/master_files/code/datums/quirks/negative_quirks/blind.dm
diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/deaf.dm b/modular_darkpack/master_files/code/datums/quirks/negative_quirks/deaf.dm
similarity index 100%
rename from modular_darkpack/modules/merits_flaws/code/negative_quirks/deaf.dm
rename to modular_darkpack/master_files/code/datums/quirks/negative_quirks/deaf.dm
diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/illiterate.dm b/modular_darkpack/master_files/code/datums/quirks/negative_quirks/illiterate.dm
similarity index 68%
rename from modular_darkpack/modules/merits_flaws/code/negative_quirks/illiterate.dm
rename to modular_darkpack/master_files/code/datums/quirks/negative_quirks/illiterate.dm
index 5f4cd9985306..509ed80f6ce8 100644
--- a/modular_darkpack/modules/merits_flaws/code/negative_quirks/illiterate.dm
+++ b/modular_darkpack/master_files/code/datums/quirks/negative_quirks/illiterate.dm
@@ -1,4 +1,4 @@
/datum/quirk/illiterate
- desc = "Perhaps you communicate best through illustration, dance, or impassioned speech; but you can’t read or write."
+ desc = "Perhaps you communicate best through illustration, dance, or impassioned speech; but you can't read or write."
value = -2
darkpack_allowed = TRUE
diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/mute.dm b/modular_darkpack/master_files/code/datums/quirks/negative_quirks/mute.dm
similarity index 100%
rename from modular_darkpack/modules/merits_flaws/code/negative_quirks/mute.dm
rename to modular_darkpack/master_files/code/datums/quirks/negative_quirks/mute.dm
diff --git a/modular_darkpack/master_files/code/game/atoms_movable.dm b/modular_darkpack/master_files/code/game/atoms_movable.dm
new file mode 100644
index 000000000000..518eb3232ad2
--- /dev/null
+++ b/modular_darkpack/master_files/code/game/atoms_movable.dm
@@ -0,0 +1,15 @@
+/atom/movable
+ // Text-to-blooper sounds
+ // yes. all atoms can have a say.
+ var/datum/blooper/blooper
+ var/blooper_speed = 50
+ var/blooper_pitch = 50
+ var/blooper_pitch_range = 50 //Actual pitch is (pitch - (blooper_pitch_range*0.5)) to (pitch + (blooper_pitch_range*0.5))
+ COOLDOWN_DECLARE(blooper_cooldown)
+
+/atom/movable/send_speech(message, range = 7, obj/source = src, bubble_type, list/spans, datum/language/message_language, list/message_mods = list(), forced = FALSE, tts_message, list/tts_filter)
+ . = ..()
+ if(!blooper)
+ return
+ var/list/listeners = get_hearers_in_view(range, source)
+ blooper.play_bloop(source, listeners, message, range, BLOOPER_TRANSMIT_VOLUME, blooper_speed, blooper_pitch, blooper_pitch_range)
diff --git a/modular_darkpack/master_files/code/game/objects/items/storage/bags.dm b/modular_darkpack/master_files/code/game/objects/items/storage/bags.dm
index 12093d4ef64d..2546e7ccd908 100644
--- a/modular_darkpack/master_files/code/game/objects/items/storage/bags.dm
+++ b/modular_darkpack/master_files/code/game/objects/items/storage/bags.dm
@@ -1,4 +1,3 @@
-///DARKPACK - Money bag subtype; covers Darkpack money types
/obj/item/storage/bag/money
storage_type = /datum/storage/bag/money/darkpack
diff --git a/modular_darkpack/master_files/code/game/objects/objs.dm b/modular_darkpack/master_files/code/game/objects/objs.dm
new file mode 100644
index 000000000000..3cb7449e497e
--- /dev/null
+++ b/modular_darkpack/master_files/code/game/objects/objs.dm
@@ -0,0 +1,9 @@
+/obj
+ // DARKPACK Module - COMPANY_LOGOS - If matching a /datum/brand's manufacturer, append a logo to the examine text. Element only added by default on /obj/
+ var/brand
+
+
+/obj/Initialize(mapload)
+ . = ..()
+ if(brand) // DARKPACK module - COMPANY_LOGOS - If we don't have a brand, disregard.
+ AddElement(/datum/element/corp_label, GLOB.all_brandnames[brand])
diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_defines.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_defines.dm
index e4e35faf014c..1c3c3d17781d 100644
--- a/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_defines.dm
@@ -1,9 +1,11 @@
/mob/living/carbon
+ bloodquality = BLOOD_QUALITY_NORMAL
+
var/chronological_age = 0
+
var/image/suckbar
var/atom/suckbar_loc
- var/killed_count = 0
var/fakediablerist = FALSE
var/can_be_embraced = TRUE
- bloodquality = 2
+
diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/examine.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/examine.dm
index 2f42f973773a..94b43988b00d 100644
--- a/modular_darkpack/master_files/code/modules/mob/living/carbon/examine.dm
+++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/examine.dm
@@ -73,6 +73,9 @@
. += span_rose(span_bold("[pick(five)] "))
if(HAS_TRAIT(src, TRAIT_PERMAFANGS) && !HAS_TRAIT(src, TRAIT_DULLFANGS))
. += span_warning("[p_They()] [p_have()] visible fangs in [p_their()] mouth. ")
+ if(!src.head)
+ if(HAS_TRAIT(src, TRAIT_THIRD_EYE))
+ . += span_bolddanger("[p_They()] [p_have()] a third eye on [p_their()] forehead! ")
if(HAS_TRAIT(src, TRAIT_BETRAYERS_MARK))
if(isliving(user))
var/mob/living/living_user = user
diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/human.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/human.dm
index f78afb1a0081..c54b4e84351f 100644
--- a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/human.dm
+++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/human.dm
@@ -33,3 +33,4 @@
. = ..()
+
diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/initialize.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/initialize.dm
index 0ac4a2ff2f89..abfa8077977c 100644
--- a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/initialize.dm
+++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/initialize.dm
@@ -5,3 +5,10 @@
AddComponent(/datum/component/jumper)
AddComponent(/datum/component/violation_observer, violation_aoe)
update_visible_name()
+ // clientless mobs are given a random voice
+ if(!client && length(SSblooper.blooper_list))
+ var/blooper_key = pick(SSblooper.blooper_list)
+ blooper = SSblooper.blooper_list[blooper_key]
+ blooper_speed = rand(0, 100)
+ blooper_pitch = rand(0, 100)
+ blooper_pitch_range = rand(0, 100)
diff --git a/modular_darkpack/master_files/code/modules/mob/living/init_signals.dm b/modular_darkpack/master_files/code/modules/mob/living/init_signals.dm
index eac7c193efe6..61061505d219 100644
--- a/modular_darkpack/master_files/code/modules/mob/living/init_signals.dm
+++ b/modular_darkpack/master_files/code/modules/mob/living/init_signals.dm
@@ -1,13 +1,5 @@
/mob/living/register_init_signals()
. = ..()
- RegisterSignal(src, COMSIG_ENTER_AREA, PROC_REF(update_zone_hud))
-
-/mob/living/proc/update_zone_hud(mob/source, area/new_area)
- SIGNAL_HANDLER
-
- var/atom/movable/screen/zone_hud = hud_used?.screen_objects[HUD_MOB_ZONE]
- if(zone_hud)
- if(!istype(new_area, /area/vtm))
- return
- var/area/vtm/our_area = new_area
- zone_hud.icon_state = "[our_area.zone_type]"
+ RegisterSignal(src, COMSIG_ENTER_AREA, PROC_REF(update_zone_hud)) // AREAS - (Zone hud)
+ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_OBFUSCATED), PROC_REF(make_invisible)) // POWERS - (Obfuscate Discipline)
+ RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_OBFUSCATED), PROC_REF(make_visible)) // POWERS - (Obfuscate Discipline)
diff --git a/modular_darkpack/master_files/code/modules/mob/living/living.dm b/modular_darkpack/master_files/code/modules/mob/living/living.dm
index 59bd200edda7..ffc42bb4bc1b 100644
--- a/modular_darkpack/master_files/code/modules/mob/living/living.dm
+++ b/modular_darkpack/master_files/code/modules/mob/living/living.dm
@@ -1,16 +1,13 @@
/mob/living/Initialize(mapload)
. = ..()
storyteller_stats = create_new_stat_prefs(storyteller_stats)
- become_area_sensitive("zone_hud")
- update_zone_hud(src, get_area(src))
+ become_area_sensitive(ZONE_TRAIT)
+ update_zone_hud(src, get_area(src)) // AREAS - (Zone hud)
-/mob/living/Destroy()
- lastattacked = null
- drunked_of = null
+/mob/living/Destroy(force)
storyteller_stats = null
beastmaster_minions = null
minion_command_components = null
- grabbed_by_tentacle = null
QDEL_LAZYLIST(splats)
return ..()
diff --git a/modular_darkpack/master_files/code/modules/mob/living/living_defines.dm b/modular_darkpack/master_files/code/modules/mob/living/living_defines.dm
index 3c729416bdc0..c4fa9ff11c8d 100644
--- a/modular_darkpack/master_files/code/modules/mob/living/living_defines.dm
+++ b/modular_darkpack/master_files/code/modules/mob/living/living_defines.dm
@@ -1,53 +1,55 @@
/mob/living
has_emotion = TRUE
- var/mob/living/lastattacked
-
- var/bloodquality = 1
-
- var/list/drunked_of = list()
-
- var/discipline_time_plus = 0
- var/blood_efficiency = 1
- var/thaum_damage_plus = 0
+ //Damage related vars, NOTE: THESE SHOULD ONLY BE MODIFIED BY PROCS
+ ///Aggravated damage caused by supernatural attacks.
+ var/aggloss = 0
- var/resistant_to_disciplines = FALSE
+ var/list/storyteller_stats = list() // STORYTELLER_STATS
- var/dancing = FALSE
+ /// List of supernatural types that this mob is part of
+ var/list/datum/splat/splats // SPLATS
- var/frenzy_chance_boost = 10
COOLDOWN_DECLARE(drinkblood_use_cd)
COOLDOWN_DECLARE(drinkblood_click_cd)
var/bloodpool = 5
var/maxbloodpool = 5
+
+ /// The quality of the mobs blood when drank from. Decides how much BP a vampire will regain.
+ var/bloodquality = BLOOD_QUALITY_LOW
+
+ COOLDOWN_DECLARE(masquerade_timer)
var/masquerade_score = 5
+
+ var/killed_count = 0
var/warrant = FALSE
var/ignores_warrant = FALSE
- //Damage related vars, NOTE: THESE SHOULD ONLY BE MODIFIED BY PROCS
- ///Aggravated damage caused by supernatural attacks.
- var/aggloss = 0
+ var/discipline_time_plus = 0
+ /// Multiplier for how efficently bloodpool is spent for BLOODPOWER SPECIFICLY
+ var/blood_efficiency = 1
+ var/thaum_damage_plus = 0
+ // DARKPACK TODO - FRENZY - (This never did FUCK anything.)
+ var/frenzy_chance_boost = 10
+
+ var/resistant_to_disciplines = FALSE
- var/list/storyteller_stats = list()
+ // dogshit.
+ var/dancing = FALSE
//beastmaster
var/list/beastmaster_minions = list()
var/list/datum/component/obeys_commands/minion_command_components = list()
- var/obj/grabbed_by_tentacle = null
- var/escape_attempt = 0
+ var/tentacle_escape_attempt = 0
var/tentacle_aggro_mode = "Aggressive"
var/possessed = FALSE //dominate 5 body posession
var/datum/weakref/conditioner // dominate 4
//obfuscate icon, client side
var/obf_icons
- COOLDOWN_DECLARE(masquerade_timer)
//thaumaturgy & necro path stuff
var/research_points = 0
var/collected_souls = 0
-
- /// List of supernatural types that this mob is part of
- var/list/datum/splat/splats
diff --git a/modular_darkpack/master_files/code/modules/mob/living/living_say.dm b/modular_darkpack/master_files/code/modules/mob/living/living_say.dm
new file mode 100644
index 000000000000..019d54697b00
--- /dev/null
+++ b/modular_darkpack/master_files/code/modules/mob/living/living_say.dm
@@ -0,0 +1,14 @@
+/mob/living/send_speech(message_raw, message_range = 6, obj/source = src, bubble_type = bubble_icon, list/spans, datum/language/message_language = null, list/message_mods = list(), forced = null, tts_message, list/tts_filter)
+ . = ..()
+ if(!blooper)
+ return
+ if(HAS_TRAIT(src, TRAIT_SIGN_LANG) && !HAS_TRAIT(src, TRAIT_MUTE)) //if you can speak and you sign, your hands don't make a bark. Unless you are completely mute, you can have some hand bark.
+ return
+ var/pref_volume = client ? (client?.prefs?.read_preference(/datum/preference/numeric/blooper_sound_volume) / 100) : 1
+ var/volume = BLOOPER_TRANSMIT_VOLUME * pref_volume
+ if(message_mods[WHISPER_MODE])
+ volume = BLOOPER_TRANSMIT_VOLUME * 0.5
+ message_range++
+ var/list/listeners = get_hearers_in_view(message_range, source)
+ var/is_yelling = (say_test(message_raw) == "2") // boost the volume if their message ends in !
+ blooper.play_bloop(source, listeners, message_raw, message_range, volume * (is_yelling ? 2 : 1), blooper_speed, blooper_pitch, blooper_pitch_range)
diff --git a/modular_darkpack/master_files/code/modules/mob/living/silicon/silicon.dm b/modular_darkpack/master_files/code/modules/mob/living/silicon/silicon.dm
new file mode 100644
index 000000000000..118a0fc5e2a7
--- /dev/null
+++ b/modular_darkpack/master_files/code/modules/mob/living/silicon/silicon.dm
@@ -0,0 +1,7 @@
+// we let borgs have some bark too
+/mob/living/silicon/Login()
+ blooper = SSblooper.blooper_list[client.prefs.read_preference(/datum/preference/choiced/blooper)]
+ blooper_speed = client.prefs.read_preference(/datum/preference/numeric/blooper_speed)
+ blooper_pitch = client.prefs.read_preference(/datum/preference/numeric/blooper_pitch)
+ blooper_pitch_range = client.prefs.read_preference(/datum/preference/numeric/blooper_pitch_range)
+ . = ..()
diff --git a/modular_darkpack/master_files/code/modules/rituals/code/ritual_rune.dm b/modular_darkpack/master_files/code/modules/rituals/code/ritual_rune.dm
index cf0d3ea94326..f18792d173c0 100644
--- a/modular_darkpack/master_files/code/modules/rituals/code/ritual_rune.dm
+++ b/modular_darkpack/master_files/code/modules/rituals/code/ritual_rune.dm
@@ -16,6 +16,7 @@
var/activation_color
var/cost = 1 // this needs to be set in subtypes
var/ritual_name
+ var/difficulty = 6 // set in subtypes
/// What discipline is required (if any) to use this rune.
var/required_discipline
@@ -35,9 +36,27 @@
qdel(src)
return CLICK_ACTION_SUCCESS
+/*
+*What happens when the ritual rune executes successfully
+*/
/obj/ritual_rune/proc/complete()
return
+/*
+*What happens when the ritual rune executes with a failure
+*/
+/obj/ritual_rune/proc/ritual_failure()
+ return
+
+/*
+*What happens when the ritual rune executes with a botch
+*/
+/obj/ritual_rune/proc/ritual_botch()
+ return
+
+/*
+* What happens when the user clicks on the rune. Ideally shouldn't be overriden.
+*/
/obj/ritual_rune/attack_hand(mob/user)
if(activated)
return
@@ -57,13 +76,19 @@
if(!ritual_roll_datum)
ritual_roll_datum = new()
- ritual_roll_datum.difficulty = 3 + level
-
- if(ritual_roll_datum.st_roll(last_activator, last_activator) != ROLL_SUCCESS)
- return FALSE
-
- complete()
- return TRUE
+ ritual_roll_datum.difficulty = difficulty
+
+ var/roll_result = ritual_roll_datum.st_roll(last_activator, last_activator)
+ switch(roll_result)
+ if(ROLL_SUCCESS)
+ complete()
+ return TRUE
+ if(ROLL_FAILURE)
+ ritual_failure()
+ return FALSE
+ if(ROLL_BOTCH)
+ ritual_botch()
+ return FALSE
/obj/ritual_rune/proc/check_and_consume_sacrifices(mob/user)
var/list/found_items = list()
diff --git a/modular_darkpack/master_files/icons/obj/machines/smartfridge.dmi b/modular_darkpack/master_files/icons/obj/machines/smartfridge.dmi
new file mode 100644
index 000000000000..6688e5f9ff05
Binary files /dev/null and b/modular_darkpack/master_files/icons/obj/machines/smartfridge.dmi differ
diff --git a/modular_darkpack/master_files/strings/sillytips.txt b/modular_darkpack/master_files/strings/sillytips.txt
index 3d91ff47443d..2c1b536c90b0 100644
--- a/modular_darkpack/master_files/strings/sillytips.txt
+++ b/modular_darkpack/master_files/strings/sillytips.txt
@@ -1,69 +1,69 @@
-The Malkavian hivemind allows you to send any message, except images. Don't forget what they took from you.
-Little known fact, you can actually take Lupus Kinfolk home with you for free. I have 47 in my back yard.
-Little known fact, you can actually take Corvid Kinfolk home with you for free. I have 47 in my back yard.
-Little known fact, you can actually take Kyubi Kinfolk home with you for free. I have 47 in my back yard.
-Little known fact, you can actually take Feline Kinfolk home with you for free. I have 47 in my back yard.
-Little known fact, you can actually take Latrani Kinfolk home with you for free. I have 47 in my back yard.
-Elkabo, elkabo, pixy queen where all is green.
+* is blind
+/obj/item/melee/vampirearms/knife/gangrel/lasombra
+All of the Salubri in the world are in San Francisco.
+Also try Minecraft!!
+Are you trujah, then?
+As a Garou, it's tremendously important to slaughter anyone who drops so much as a bottlecap in the woods.
Ask about the free arsenic!
-Maggots love you. Trust me.
-There's nothing stopping you from just putting a chew toy in the mouth of a vampire. What are they going to do, bite you?
-The Delirium is a genetic, supernatural fear of Garou and other breeds that remind you of Jacob from Twilight.
-It's 2009, get over it.
+Blowing up the oil rig with a dirty bomb will certainly help Gaia recover.
+Call in the burgermen.
+Deer will freeze when they see a vehicle. This includes scooters.
+Diablerize your Sire NOW!!!
+Do not feed your Ghoul after midnight~.
+Do you have any bloodpacks? I got a headache.
+Do you think a Nexus Crawler would improve the feng shui of this landfill?
+Do you think there are any Garou in the Teen Wolf fandom?
+Does anyone else think what Tremere did was really screwed up?
+Dogs know how to skateboard.
+Don’t listen to the stop signs.
+Elkabo, elkabo, pixy queen where all is green.
Everyone thinks the game was made by yankees anyway.
+Explain it to me like I'm a dog.
First priority more mechanics for people to enjoy. Last priority refactoring if it isn't lagging.
-It doesn't need to expand. Only to go deeper.
Fixed on Darkpack.
-Do you have any bloodpacks? I got a headache.
-* is blind
+Gaia saved next week!
+I AM THE SWORD OF CAINE!!!
I WANT A BLACK AND MILD!!!!!!!
-Explain it to me like I'm a dog.
-This truly is a world of darkness.
-Are you trujah, then?
-All of the Salubri in the world are in San Francisco.
I run on blood! I take jobs from American vampires!
-Trujah in the future have studied your ass for centuries - and sent me back in time to kick it!
-This is Ennoia, by the way. I have an eagle head right now.
+It doesn't need to expand. Only to go deeper.
+It's 2009, get over it.
+Just level appearance.
+Kinfolk are just ghouls for dogs.
+Little known fact, you can actually take Corvid Kinfolk home with you for free. I have 47 in my back yard.
+Little known fact, you can actually take Feline Kinfolk home with you for free. I have 47 in my back yard.
+Little known fact, you can actually take Kyubi Kinfolk home with you for free. I have 47 in my back yard.
+Little known fact, you can actually take Latrani Kinfolk home with you for free. I have 47 in my back yard.
+Little known fact, you can actually take Lupus Kinfolk home with you for free. I have 47 in my back yard.
Lots of people spread nasty rumors about the Tzimisce turning people into chairs. The reality is that they prefer loveseats. More surface area for the skin, you see.
-I AM THE SWORD OF CAINE!!!
-Sire: God
-As a Garou, it's tremendously important to slaughter anyone who drops so much as a bottlecap in the woods.
-Blowing up the oil rig with a dirty bomb will certainly help Gaia recover.
-My Wyrm could beat up your Wyrm.
Lupus-born Garou typically can't read and typically don't have a legal identity. This means it's really easy to write a hit piece in the newspaper about them without fear of legal retribution.
-Kinfolk are just ghouls for dogs.
-The Black Furies breeding pits do not exist. Do not attempt to breach the Bawn to find it.
-Gaia saved next week!
-Do you think a Nexus Crawler would improve the feng shui of this landfill?
+Maggots love you. Trust me.
+Maybe the real Beckoning is the Kindred we met along the way.
+My Wyrm could beat up your Wyrm.
+Ravens and crows will chase shiny objects around. Make sure to start corvid turf wars.
Reminder: Emissions caused by Corporate Wolves factories are good and cool, but emissions from Endron factories are disgusting and evil.
-You've turned your back on Fenris, the Get of Fenris, and even Gaia! For your TREACHERY, the only penalty... is DEATH. Who's next?
-Diablerize your Sire NOW!!!
-What if heartsblood tastes like a fruit gusher?
-There's a Nosferatu standing behind you watching you roleplay.
-The get_step() ziggurat cannot hurt you.
+Sire: God
+So-called “Kindred” will insist that garlic, holy water, and crosses are ineffective against them. They are lying. Do not listen to them.
+The Black Furies breeding pits do not exist. Do not attempt to breach the Bawn to find it.
+The Camarilla doesn’t want you to know this but the ghouls at the Tower are free. You can take them home. I have 458 ghouls.
+The Delirium is a genetic, supernatural fear of Garou and other breeds that remind you of Jacob from Twilight.
+The Malkavian hivemind allows you to send any message, except images. Don't forget what they took from you.
The get_step() spaceship cannot hurt you.
+The get_step() ziggurat cannot hurt you.
+The mannequins no longer get a little quirky at night.
+There are many different types of werewolf fetishes. Stop it.
There are two wolves inside you. They are both in nullspace.
There are two wolves..... and two birds.... inside of you. All four are in nullspace...
-Just level appearance.
-Maybe the real Beckoning is the Kindred we met along the way.
-Does anyone else think what Tremere did was really screwed up?
-Do you think there are any Garou in the Teen Wolf fandom?
-There are many different types of werewolf fetishes. Stop it.
-You're thinking about fangs right now.
-/obj/item/melee/vampirearms/knife/gangrel/lasombra
-When in doubt, just put vampire in the typepath.
-Call in the burgermen.
+There's a Nosferatu standing behind you watching you roleplay.
+There's nothing stopping you from just putting a chew toy in the mouth of a vampire. What are they going to do, bite you?
+This is Ennoia, by the way. I have an eagle head right now.
+This truly is a world of darkness.
+Trujah in the future have studied your ass for centuries - and sent me back in time to kick it!
+What if heartsblood tastes like a fruit gusher?
What the hell is Bardo?
-What the hell is Sanguinus?
What the hell is Ogham?
-Ravens and crows will chase shiny objects around. Make sure to start corvid turf wars.
-Deer will freeze when they see a vehicle. This includes scooters.
-The mannequins no longer get a little quirky at night.
-Do not feed your Ghoul after midnight~.
-Dogs know how to skateboard.
-Don’t listen to the stop signs.
-You cannot buy a blender at the dollar store.
-The Camarilla doesn’t want you to know this but the ghouls at the Tower are free. You can take them home. I have 458 ghouls.
-Also try Minecraft!!
-So-called “Kindred” will insist that garlic, holy water, and crosses are ineffective against them. They are lying. Do not listen to them.
+What the hell is Sanguinus?
+When in doubt, just put vampire in the typepath.
You can throw a stick to distract an aggressive Garou.
+You cannot buy a blender at the dollar store.
+You're thinking about fangs right now.
+You've turned your back on Fenris, the Get of Fenris, and even Gaia! For your TREACHERY, the only penalty... is DEATH. Who's next?
diff --git a/modular_darkpack/master_files/strings/tips.txt b/modular_darkpack/master_files/strings/tips.txt
index e32f4e5e813a..5e3fea6abbd3 100644
--- a/modular_darkpack/master_files/strings/tips.txt
+++ b/modular_darkpack/master_files/strings/tips.txt
@@ -1,71 +1,71 @@
-You can find a lockpick on certain NPCs and at the black market or hardware store. Dexterity and larceny assist in your chances to succeed, and doors have varying difficulty.
-With high enough strength, you can attempt to bash down a door, but failing can injure you.
-Cars use gasoline; you can buy more at a gas station. This can be used in the production of molotovs, as well.
-If you ever find yourself lost, look for a city map, use the navigate verb or button. Or just ask for directions.
-Discipline levels can be changed with Right-Click.
-Human players can use the "Report a Masquerade violation" button in people's examine text to report any weird supernatural stuff they shouldn't be seeing, like vampires feeding or punching people across a room.
-You can jump around by pressing MMB. You can even jump over railings while standing next to them.
-You can send announcements as the Prince by using your computer. Other kindred can see it on other computers too.
-The Malkavian hivemind allows you to send any message, except images.
-You can find and publish your phone number on your phone.
-To use Thaumaturgy properly you should get an Arcane Tome. Some of them spawn in Chantry. Lasombra can also learn Abyss Mysticism by crafting a tome after reaching Obtenebration at level 5.
-Followers of Set, also known as Ministry, can avoid diablerie and staking by moving their heart to an urn.
-Diablerie lowers your generation by one, if your victim's is lower than yours. Diablerie is one of the vilest deeds imaginable, and any kindred who learn of this will seek your permanent death.
-Blood quality depends on the power or lifestyle of a creature. Vampire blood satisfies the most, after that lupine blood, then the wealthy, then the poor, then animals, and so on.
-You can bloodbond people as a kindred. To do so - grab them and force them to swallow your vitae with Give Vitae ability. Bloodbonds strengthen the victim's emotions towards you and create an obsession.
-You can make a ghoul by bloodbonding a non-playable character. If there are any ghosts that want to play a ghoul - they will take over the ghouled NPC.
-Ghouls are weaker than kindred, and require vitae instead of mortal blood. But they also are immune to humanity and can learn any clan's disciplines to level 1.
-If you are a mortal and do drugs, kindred can experience the same high by drinking your blood.
-Tzimisce can upgrade your body with flesh and blood. Or they can turn you into a chair. Take this risk at your own judgement.
-Magical artifacts need to be identified in order to be used. The Tremere, Garou, or those with a tremendously high Occult skill can identify them.
-As a Prince, your objectives are to rule Camarilla and the City. Follow all Six Traditions of Kindred and decide how to fight global dangers. Don't forget to call on the Primogens if you need some help.
-As a Sheriff, your objectives are to protect Masquerade in the City. Speak with Camarilla's agents and decide the best technique to liquidate Masquerade breaches and breachers.
-As a Seneschal, your objectives are to help Prince make any business in the City. You are his right hand man, and he expects you to deal with matters beneath him.
-As a Hound, your objectives are to enforce the Traditions and the Camarilla's rule of the city.
+@You can italicize, embolden or underline portions of your messages by enclosing them with |, + or _ respectively. You can also avoid this by adding backslashes (they won't show in the message) before these characters.
+A "Scene" in game represents 3 minutes.
+A "Turn" in game represents 5 seconds.
+A thrown glass of water can make a slippery tile, allowing you to slow down your pursuers in a pinch.
+ATMs can be smashed with a high force weapon for whatever cash is inside of them.
As a Baron, you lead the individualistic kindred of the city. You are still part of the Camarilla, but you have more sway here. San Francisco is an Anarch domain.
As a Bruiser, you hang out with the Baron and support him in his rebellious troublemaking.
-As a Dealer, you hold a powerful domain. You can make deals with whomever you want - but boons are always worth more than money.
As a Chantry Regent, your objectives are to lead the Tremere of San Francisco and keep the Chantry secure, as well as hunt down any who would steal your clan's secrets.
-As an Archivist, your objectives are to protect Tremere knowledge and the Chantry.
-As a Taxi Driver, your objectives are to drive. Real human being.
+As a Dealer, you hold a powerful domain. You can make deals with whomever you want - but boons are always worth more than money.
+As a Hound, your objectives are to enforce the Traditions and the Camarilla's rule of the city.
+As a Hunter, your objectives are to Hunt abnormal beings and night creatures in City.
As a Primogen, your objectives are to represent your clan in the city, and make sure they are organized and loyal enough to keep you in power.
+As a Prince, your objectives are to rule Camarilla and the City. Follow all Six Traditions of Kindred and decide how to fight global dangers. Don't forget to call on the Primogens if you need some help.
As a Sabbat member, you must fight the enemies of the Dark Father - servants of the vile Antediluvians.
-As a Hunter, your objectives are to Hunt abnormal beings and night creatures in City.
-A "Turn" in game represents 5 seconds.
-A "Scene" in game represents 3 minutes.
-There are 36 turns in a scene.
-You don't need to have your keys in your hand to unlock a door. Just right-click.
-If you have a high enough strength, jumping in combat mode will create a shockwave.
-You can conceal your satchel by Alt + Right-clicking it.
-Lower generation vampires have access to stronger abilities, at the cost of requiring more blood to be sated.
-Your firearm stat dramatically improves your ability to control recoil.
-Vampires are hard to kill, but can be immobilized by driving a stake into their heart.
-You can set off a sprinkler by attacking it with any item that would light a cigarette.
-ATMs can be smashed with a high force weapon for whatever cash is inside of them.
-Duffle bags can hold two large whitelisted items that bypass their normal item weight restriction.
-Pool tables can be interacted with and let you play a mock game of billiards.
-Gun casings leave forensic evidence that can trace back to your firearm unless preventative measures are taken.
-Hovering over a dice roll with reveal what stats were used for rolls.
-@You can italicize, embolden or underline portions of your messages by enclosing them with |, + or _ respectively. You can also avoid this by adding backslashes (they won't show in the message) before these characters.
-♪ Hey, have you ever tried appending the % character before your messages when speaking in-game? ♫
-A thrown glass of water can make a slippery tile, allowing you to slow down your pursuers in a pinch.
+As a Seneschal, your objectives are to help Prince make any business in the City. You are his right hand man, and he expects you to deal with matters beneath him.
+As a Sheriff, your objectives are to protect Masquerade in the City. Speak with Camarilla's agents and decide the best technique to liquidate Masquerade breaches and breachers.
+As a Taxi Driver, your objectives are to drive. Real human being.
+As an Archivist, your objectives are to protect Tremere knowledge and the Chantry.
Basketball requires focus. If you don't click on your target (player or hoop) you are more likely to miss.
Basketball requires skill. Spinning drains stamina, reduces accuracy, but gives resistance from disarm. Use it to dunk!
Basketball requires stamina. The more you have, the less likely your ball will be stolen and the more likely you can steal from another player.
Basketball requires strategy. The direction both players are facing affects disarms so having your back to another player that is trying to steal is ideal.
Basketball requires teamwork. Passing the ball with LMB is instant and costs no stamina.
+Blood quality depends on the power or lifestyle of a creature. Vampire blood satisfies the most, after that lupine blood, then the wealthy, then the poor, then animals, and so on.
+Boots can store items like knives or lighters.
+Boots can store items like knives or lighters.
+Cars use gasoline; you can buy more at a gas station. This can be used in the production of molotovs, as well.
+Diablerie lowers your generation by one, if your victim's is lower than yours. Diablerie is one of the vilest deeds imaginable, and any kindred who learn of this will seek your permanent death.
+Discipline levels can be changed with Right-Click.
Don't be afraid to ask for help, whether from your peers or from admins.
+Duffle bags can hold two large whitelisted items that bypass their normal item weight restriction.
+Followers of Set, also known as Ministry, can avoid diablerie and staking by moving their heart to an urn.
+Ghouls are weaker than kindred, and require vitae instead of mortal blood. But they also are immune to humanity and can learn any clan's disciplines to level 1.
+Gun casings leave forensic evidence that can trace back to your firearm unless preventative measures are taken.
Holding alt and left clicking a tile will allow you to see its contents in the top right window pane, which is much faster than holding shift and right clicking.
+Hovering over a dice roll with reveal what stats were used for rolls.
+Human players can use the "Report a Masquerade violation" button in people's examine text to report any weird supernatural stuff they shouldn't be seeing, like vampires feeding or punching people across a room.
+If you are a mortal and do drugs, kindred can experience the same high by drinking your blood.
+If you ever find yourself lost, look for a city map, use the navigate verb or button. Or just ask for directions.
+If you have a high enough strength, jumping in combat mode will create a shockwave.
If you're bleeding, you can apply pressure to the limb by grabbing yourself while targeting the bleeding limb. This will slow you down and take up a hand, but it'll slow down how fast you lose blood. Note this won't help the bleeding clot any faster.
If you're using hotkey mode, you can stop pulling things using H.
Laying down will help slow down bloodloss. Death will halt it entirely.
+Lower generation vampires have access to stronger abilities, at the cost of requiring more blood to be sated.
+Magical artifacts need to be identified in order to be used. The Tremere, Garou, or those with a tremendously high Occult skill can identify them.
Most things have special interactions with right, alt, shift, and control click. Experiment!
+Pool tables can be interacted with and let you play a mock game of billiards.
+The Malkavian hivemind allows you to send any message, except images.
The resist button will allow you to resist out of handcuffs, being buckled to a chair or bed, out of locked lockers and more. Whenever you're stuck, try resisting!
+There are 36 turns in a scene.
+To destroy any firearm's serial number, right-click it with a screwdriver in hand.
+To use Thaumaturgy properly you should get an Arcane Tome. Some of them spawn in Chantry. Lasombra can also learn Abyss Mysticism by crafting a tome after reaching Obtenebration at level 5.
+Tzimisce can upgrade your body with flesh and blood. Or they can turn you into a chair. Take this risk at your own judgement.
+Vampires are hard to kill, but can be immobilized by driving a stake into their heart.
When in doubt about technical issues, clear your cache (byond launcher > cogwheel > preferences > game prefs), update your BYOND, and relog.
-You can use :L / .L or :R / .R to speak through an item being held in your left or right hand respectively. This allows you to talk into a city-bounced radio without manually turning on its microphone!
-You can right click someone with wire cutters, jaws of life, and box cutters to instantly snap cablecuffs or zipties. The jaws can even instantly break handcuffs!
+With high enough strength, you can attempt to bash down a door, but failing can injure you.
+You can bloodbond people as a kindred. To do so - grab them and force them to swallow your vitae with Give Vitae ability. Bloodbonds strengthen the victim's emotions towards you and create an obsession.
You can board up windows by left-clicking a window with planks in hand.
-Boots can store items like knives or lighters.
-To destroy any firearm's serial number, right-click it with a screwdriver in hand.
You can board up windows by left-clicking a window with planks in hand.
-Boots can store items like knives or lighters.
+You can conceal your satchel by Alt + Right-clicking it.
+You can find a lockpick on certain NPCs and at the black market or hardware store. Dexterity and larceny assist in your chances to succeed, and doors have varying difficulty.
+You can find and publish your phone number on your phone.
+You can jump around by pressing MMB. You can even jump over railings while standing next to them.
+You can make a ghoul by bloodbonding a non-playable character. If there are any ghosts that want to play a ghoul - they will take over the ghouled NPC.
+You can right click someone with wire cutters, jaws of life, and box cutters to instantly snap cablecuffs or zipties. The jaws can even instantly break handcuffs!
+You can send announcements as the Prince by using your computer. Other kindred can see it on other computers too.
+You can set off a sprinkler by attacking it with any item that would light a cigarette.
+You can use :L / .L or :R / .R to speak through an item being held in your left or right hand respectively. This allows you to talk into a city-bounced radio without manually turning on its microphone!
+You don't need to have your keys in your hand to unlock a door. Just right-click.
+Your firearm stat dramatically improves your ability to control recoil.
+♪ Hey, have you ever tried appending the % character before your messages when speaking in-game? ♫
diff --git a/modular_darkpack/modules/areas/code/__vtm.dm b/modular_darkpack/modules/areas/code/__vtm.dm
index 6988767d90d3..26706fa23215 100644
--- a/modular_darkpack/modules/areas/code/__vtm.dm
+++ b/modular_darkpack/modules/areas/code/__vtm.dm
@@ -14,11 +14,6 @@
// is this able to be classified as a domain? e.g, territorial flaw, later political implementation
var/domain = FALSE
-/area/vtm/powered(chan)
- if (!requires_power)
- return TRUE
- return FALSE
-
/area/vtm/proc/break_elysium()
if (zone_type != ZONE_MASQUERADE)
return
diff --git a/modular_darkpack/modules/areas/code/interiors/city_interiors.dm b/modular_darkpack/modules/areas/code/interiors/city_interiors.dm
index ee116544257c..e5697e8255e3 100644
--- a/modular_darkpack/modules/areas/code/interiors/city_interiors.dm
+++ b/modular_darkpack/modules/areas/code/interiors/city_interiors.dm
@@ -298,16 +298,6 @@
fire_controled = TRUE
domain = TRUE
-/area/vtm/interior/setite
- name = "Community Center"
- icon_state = "hotel"
- fire_controled = TRUE
- domain = TRUE
-
-/area/vtm/interior/setite/basement
- name = "Community Center Basement"
- zone_type = "elysium"
-
/area/vtm/interior/substation
name = "Grid Substation"
icon_state = "hotel"
diff --git a/modular_darkpack/modules/areas/code/outsides/forest.dm b/modular_darkpack/modules/areas/code/outsides/forest.dm
index 38683d7d72ef..bda6e42be2bf 100644
--- a/modular_darkpack/modules/areas/code/outsides/forest.dm
+++ b/modular_darkpack/modules/areas/code/outsides/forest.dm
@@ -5,3 +5,4 @@
sound_environment = SOUND_ENVIRONMENT_FOREST
gauntlet_rating = 6
domain = TRUE
+ requires_power = FALSE
diff --git a/modular_darkpack/modules/areas/code/zone_hud.dm b/modular_darkpack/modules/areas/code/zone_hud.dm
index bcccadeb92be..ca4a04799367 100644
--- a/modular_darkpack/modules/areas/code/zone_hud.dm
+++ b/modular_darkpack/modules/areas/code/zone_hud.dm
@@ -6,4 +6,13 @@
alpha = 32
screen_loc = ui_zone_hud
+/mob/living/proc/update_zone_hud(mob/source, area/new_area)
+ SIGNAL_HANDLER
+
+ var/atom/movable/screen/zone_hud = hud_used?.screen_objects[HUD_MOB_ZONE]
+ if(zone_hud)
+ if(!istype(new_area, /area/vtm))
+ return
+ var/area/vtm/our_area = new_area
+ zone_hud.icon_state = "[our_area.zone_type]"
#undef ui_zone_hud
diff --git a/modular_darkpack/modules/blood_drinking/code/bite_helper_procs.dm b/modular_darkpack/modules/blood_drinking/code/bite_helper_procs.dm
index 208252bbe896..55bc48b1ad6e 100644
--- a/modular_darkpack/modules/blood_drinking/code/bite_helper_procs.dm
+++ b/modular_darkpack/modules/blood_drinking/code/bite_helper_procs.dm
@@ -17,8 +17,6 @@
REMOVE_TRAIT(src, TRAIT_NEEDS_BLOOD, TRAIT_GENERIC)
to_chat(src, span_notice("Your hunger is satisfied as the Beast inside retreats."))
- //DARKPACK TODO: roll for frenzy when hungry and seeing, smelling, tasting blood, maybe like the old system where you roll every once in a while. the roll is
- //self control 3 for seeing blood, 4 for smelling it, i think 6 for tasting it, all while hungry?
bloodpool = clamp(bloodpool+amount, 0, maxbloodpool)
if(updating_health)
update_blood_hud()
diff --git a/modular_darkpack/modules/blood_drinking/code/drinksomeblood.dm b/modular_darkpack/modules/blood_drinking/code/drinksomeblood.dm
index fed0091f0aee..76584a82afd1 100644
--- a/modular_darkpack/modules/blood_drinking/code/drinksomeblood.dm
+++ b/modular_darkpack/modules/blood_drinking/code/drinksomeblood.dm
@@ -52,8 +52,6 @@
if(ishuman(drunk_from))
var/mob/living/carbon/human/H = drunk_from
- drunked_of |= "[H.dna.real_name]"
-
if(!get_kindred_splat(drunk_from))
H.blood_volume = max(H.blood_volume-50, 150)
diff --git a/modular_darkpack/modules/blood_drinking/code/kiss_status_effect/status_effect_kiss.dm b/modular_darkpack/modules/blood_drinking/code/kiss_status_effect/status_effect_kiss.dm
index f1d3c31ab0c8..6016544ef4ab 100644
--- a/modular_darkpack/modules/blood_drinking/code/kiss_status_effect/status_effect_kiss.dm
+++ b/modular_darkpack/modules/blood_drinking/code/kiss_status_effect/status_effect_kiss.dm
@@ -7,7 +7,7 @@
/datum/status_effect/kissed/on_apply()
. = ..()
to_chat(owner, span_userlove("Sharp fangs pierce your skin, but the pain quickly fades as a numbing warmth sets in...")) //feel free to change these
- owner.add_client_colour(/datum/client_colour/brightened)
+ owner.add_client_colour(/datum/client_colour/brightened, "kissed")
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.adjust_eye_blur(15)
@@ -15,7 +15,7 @@
/datum/status_effect/kissed/on_remove()
to_chat(owner, span_userlove("As you wake, you find it hard to recall anything of the past few minutes. All you remember is a pleasant, warm feeling.")) //feel free to change these
- owner.remove_client_colour(/datum/client_colour/brightened)
+ owner.remove_client_colour("kissed")
owner.SetSleeping(50)
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
@@ -28,5 +28,5 @@
icon_state = "in_love" //would be good to give this it's own icon eventually
/datum/client_colour/brightened
- priority = CLIENT_COLOR_HELMET_PRIORITY
+ priority = CLIENT_COLOR_IMPORTANT_PRIORITY
color = list(1.15,0,0,0,1.15,0,0,0,1.15,0,0,0)
diff --git a/modular_darkpack/modules/blood_drinking/code/vamp_bite.dm b/modular_darkpack/modules/blood_drinking/code/vamp_bite.dm
index 0d16f446a2f3..fa40f0cc91b5 100644
--- a/modular_darkpack/modules/blood_drinking/code/vamp_bite.dm
+++ b/modular_darkpack/modules/blood_drinking/code/vamp_bite.dm
@@ -74,15 +74,7 @@
var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
if(!skipface)
if(get_kindred_splat(src) && HAS_TRAIT(src, TRAIT_NEEDS_BLOOD))
- var/stat_to_roll = is_enlightenment() ? STAT_INSTINCT : STAT_SELF_CONTROL
- var/datum/storyteller_roll/frezy_roll = new()
- frezy_roll.applicable_stats = list(stat_to_roll)
- var/frenzy_result = frezy_roll.st_roll(src, bit_living)
- if(frenzy_result != ROLL_SUCCESS)
- to_chat(src, span_userdanger("The taste of blood sends you into a frenzy as you feed!"))
- // DARKPACK TODO: frenzy, please put the call here
- else
- to_chat(src, span_green("The taste of fresh blood while hungry almost drives you into frenzy!"))
+ trigger_kindred_frenzy(bit_living, 6, 0, "The taste of blood while hungry")
if(!HAS_TRAIT(src, TRAIT_BLOODY_LOVER))
playsound(src, 'modular_darkpack/modules/blood_drinking/sounds/drinkblood1.ogg', 50, TRUE)
diff --git a/modular_darkpack/modules/blooper/README.md b/modular_darkpack/modules/blooper/README.md
new file mode 100644
index 000000000000..bfa1011fdbf3
--- /dev/null
+++ b/modular_darkpack/modules/blooper/README.md
@@ -0,0 +1,51 @@
+https://github.com/DarkPack13/SecondCity/pull/945
+
+## \
+
+Module ID: BLOOPERS
+
+### Description:
+
+Adds voice bloopers (voice barks) to the game. Similiar to animal crossing animalese. Noises that get played when a character talks.
+
+By default, no vocal bloopers are included in the repository, a sample config file is provided to demonstrate the format used.
+To set things up, copy `blooper_config.json.example` and rename it to `blooper_config.json`, then add an entry for each blooper.
+
+### Config Format
+
+- name: Required, the user-friendly name of the voice, will be shown in the config menu
+- id: Required, an internal ID for the voice, must be unique
+- files: Required, a JSON array of audio file names, relative to the bloopers directory.
+ If there's more than one entry, a file is randomly chosen each time the user speaks
+- min_speed: Optional, the minimum value the user can set for the voice speed
+- max_speed: Optional, the maximum value the user can set for the voice speed
+- min_pitch: Optional, the minimum value the user can set for the voice pitch
+- max_pitch: Optional, the maximum value the user can set for the voice pitch
+- min_vary: Optional, the minimum value the user can set for the voice pitch variance
+- max_vary: Optional, the maximum value the user can set for the voice pitch variance
+
+### TG Proc/File Changes:
+
+- N/A
+
+### Modular Overrides:
+
+- N/A
+
+### Defines:
+
+- N/A
+
+### Included files that are not contained in this module:
+
+- N/A
+
+### Credits:
+
+XeonMations
+xPokee
+LT3
+TealSeer
+GeneriedJenelle
+ghost
+SynthTwo
diff --git a/modular_darkpack/modules/blooper/code/blooper.dm b/modular_darkpack/modules/blooper/code/blooper.dm
new file mode 100644
index 000000000000..1291dcc2508e
--- /dev/null
+++ b/modular_darkpack/modules/blooper/code/blooper.dm
@@ -0,0 +1,63 @@
+/datum/blooper
+ /// User friendly name of the blooper, displayed in preferences menu
+ var/name = null
+ /// Internal ID of blooper, must be unique
+ var/id = null
+ /// List of sounds, one is chosen randomly each time the blooper is played
+ var/list/sound/soundpath_list = list()
+
+ var/min_pitch = BLOOPER_DEFAULT_MINPITCH
+ var/max_pitch = BLOOPER_DEFAULT_MAXPITCH
+ var/min_vary = BLOOPER_DEFAULT_MINVARY
+ var/max_vary = BLOOPER_DEFAULT_MAXVARY
+
+ // Speed vars. Speed determines the number of characters required for each blooper, with lower speeds being faster with higher blooper density
+ var/min_speed = BLOOPER_DEFAULT_MINSPEED
+ var/max_speed = BLOOPER_DEFAULT_MAXSPEED
+
+/**
+ * Plays the vocal blooper for all listeners, duration is controlled by length of the message argument
+ * * speaker - Origin source of the blooper, used for 3D audio calculations and to set the cooldown
+ * * listeners - List of mobs that will hear the blooper
+ * * message - Chat message being sent, used to determine how long bloopers play for (longer message, more sounds)
+ * * distance - Range at which the sounds will be heard
+ * * volume - Volume the sounds will play at
+ * * speed - How fast the bloopers will be, percentage between 0 - 100, converted and clamped to datum's min/max values
+ * * pitch - How high-pitched the bloopers will be, percentage between 0 - 100, converted and clamped to datum's min/max values
+ * * pitch_range - Amount of pitch variance for each blooper, percentage between 0 - 100, converted and clamped to datum's max/min values
+ */
+/datum/blooper/proc/play_bloop(atom/movable/speaker, list/listeners, message, distance, volume, speed, pitch, pitch_range)
+ if(!COOLDOWN_FINISHED(speaker, blooper_cooldown))
+ return
+ volume = min(volume, 100)
+ // convert passed values (which are percentages) into value clamped between min and max of blooper datum
+ speed = round(min_speed + ((max_speed - min_speed) * ((100 - speed) / 100)), 0.01) // this one gets inverted because lower % = faster isn't intuitive
+ pitch = round(min_pitch + ((max_pitch - min_pitch) * (pitch / 100)), 0.01)
+ pitch_range = round(min_vary + ((max_vary - min_vary) * (pitch_range / 100)), 0.01)
+ for(var/mob/target_mob in listeners)
+ if(target_mob.client && !(target_mob.client.prefs.read_preference(/datum/preference/toggle/hear_blooper)))
+ listeners -= target_mob
+ var/sound/blooper_pick = pick(soundpath_list)
+ var/num_bloopers = min(round(length(message) / speed, 1) + 1, BLOOPER_MAX_BLOOPERS)
+ var/total_delay = 0
+ for(var/i in 1 to num_bloopers)
+ if(total_delay > BLOOPER_MAX_TIME)
+ break
+ addtimer(CALLBACK(src, PROC_REF(play_callback), speaker, listeners, distance, volume, BLOOPER_DO_VARY(pitch, pitch_range), blooper_pick), total_delay)
+ total_delay += rand(DS2TICKS(speed / BLOOPER_SPEED_BASELINE), DS2TICKS(speed / BLOOPER_SPEED_BASELINE) + DS2TICKS(speed / BLOOPER_SPEED_BASELINE)) TICKS
+ COOLDOWN_START(speaker, blooper_cooldown, total_delay)
+
+/// Private callback function to actually play the sound, used for timers scheduled in play_bloop
+/datum/blooper/proc/play_callback(atom/movable/speaker, list/listeners, distance, volume, pitch, sound/voice)
+ PRIVATE_PROC(TRUE)
+ for(var/mob/target_mob in listeners)
+ target_mob.playsound_local(
+ turf_source = get_turf(speaker),
+ soundin = voice,
+ vol = volume,
+ vary = TRUE,
+ frequency = pitch,
+ falloff_distance = 0,
+ falloff_exponent = BLOOPER_SOUND_FALLOFF_EXPONENT,
+ max_distance = distance,
+ )
diff --git a/modular_darkpack/modules/blooper/code/blooper_subsystem.dm b/modular_darkpack/modules/blooper/code/blooper_subsystem.dm
new file mode 100644
index 000000000000..94949df9fd28
--- /dev/null
+++ b/modular_darkpack/modules/blooper/code/blooper_subsystem.dm
@@ -0,0 +1,40 @@
+#define BLOOPER_CONFIG_PATH "[global.config.directory]/darkpack_config/bloopers"
+
+SUBSYSTEM_DEF(blooper)
+ name = "Blooper"
+ ss_flags = SS_NO_FIRE | SS_NO_INIT
+
+ var/list/blooper_list
+
+/datum/controller/subsystem/blooper/OnConfigLoad()
+ blooper_list = initialize_blooper_datums()
+
+/datum/controller/subsystem/blooper/proc/initialize_blooper_datums()
+ var/list/blooper_datums = list()
+ if(!rustg_file_exists("[BLOOPER_CONFIG_PATH]/blooper_config.json"))
+ logger.Log(LOG_CATEGORY_DEBUG, "blooper_config.json not found.")
+ return blooper_datums
+ var/list/blooper_entries = safe_json_decode(rustg_file_read("[BLOOPER_CONFIG_PATH]/blooper_config.json"))
+ if(isnull(blooper_entries))
+ stack_trace("Blooper config is malformed!")
+ return blooper_datums
+ for(var/entry in blooper_entries)
+ // These fields are required
+ if(isnull(entry["name"]) || isnull(entry["id"]) || isnull(entry["files"]) || !length(entry["files"]))
+ stack_trace("Blooper config entry was missing required field!")
+ continue
+ var/datum/blooper/new_blooper = new()
+ new_blooper.name = entry["name"]
+ new_blooper.id = entry["id"]
+ for(var/file in entry["files"])
+ new_blooper.soundpath_list += sound("[BLOOPER_CONFIG_PATH]/sounds/[file]")
+ new_blooper.min_pitch = entry["min_pitch"] || BLOOPER_DEFAULT_MINPITCH
+ new_blooper.max_pitch = entry["max_pitch"] || BLOOPER_DEFAULT_MAXPITCH
+ new_blooper.min_vary = entry["min_vary"] || BLOOPER_DEFAULT_MINVARY
+ new_blooper.max_vary = entry["max_vary"] || BLOOPER_DEFAULT_MAXVARY
+ new_blooper.min_speed = entry["min_speed"] || BLOOPER_DEFAULT_MINSPEED
+ new_blooper.max_speed = entry["max_speed"] || BLOOPER_DEFAULT_MAXSPEED
+ blooper_datums[new_blooper.id] = new_blooper
+ return blooper_datums
+
+#undef BLOOPER_CONFIG_PATH
diff --git a/modular_darkpack/modules/blooper/code/changeling.dm b/modular_darkpack/modules/blooper/code/changeling.dm
new file mode 100644
index 000000000000..6e40ecf4881a
--- /dev/null
+++ b/modular_darkpack/modules/blooper/code/changeling.dm
@@ -0,0 +1,9 @@
+/datum/changeling_profile
+ /// The blooper voice used by the profile source
+ var/datum/blooper/blooper
+ /// The blooper speed used by the profile source
+ var/blooper_speed
+ /// The blooper pitch used by the profile source
+ var/blooper_pitch
+ /// The blooper pitch range used by the profile source
+ var/blooper_pitch_range
diff --git a/modular_darkpack/modules/blooper/code/preferences/middleware/blooper.dm b/modular_darkpack/modules/blooper/code/preferences/middleware/blooper.dm
new file mode 100644
index 000000000000..4edbc76c08b3
--- /dev/null
+++ b/modular_darkpack/modules/blooper/code/preferences/middleware/blooper.dm
@@ -0,0 +1,12 @@
+/datum/preference_middleware/blooper
+ action_delegations = list(
+ "play_blooper" = PROC_REF(play_blooper),
+ )
+
+/datum/preference_middleware/blooper/proc/play_blooper(list/params, mob/user)
+ var/datum/blooper/blooper_to_use = SSblooper.blooper_list[preferences.read_preference(/datum/preference/choiced/blooper)]
+ var/blooper_speed = preferences.read_preference(/datum/preference/numeric/blooper_speed)
+ var/blooper_pitch = preferences.read_preference(/datum/preference/numeric/blooper_pitch)
+ var/blooper_pitch_range = preferences.read_preference(/datum/preference/numeric/blooper_pitch_range)
+ blooper_to_use.play_bloop(user, list(user), "This is a test message to hear a blooper.", 7, 70, blooper_speed, blooper_pitch, blooper_pitch_range)
+ return TRUE
diff --git a/modular_darkpack/modules/blooper/code/preferences/preferences.dm b/modular_darkpack/modules/blooper/code/preferences/preferences.dm
new file mode 100644
index 000000000000..04d5bc47e0ef
--- /dev/null
+++ b/modular_darkpack/modules/blooper/code/preferences/preferences.dm
@@ -0,0 +1,99 @@
+/datum/preference/choiced/blooper
+ category = PREFERENCE_CATEGORY_VOCALS
+ savefile_identifier = PREFERENCE_CHARACTER
+ savefile_key = "blooper_choice"
+
+/datum/preference/choiced/blooper/init_possible_values()
+ // no bloopers configured, return dummy list to avoid runtimes
+ if(!length(SSblooper.blooper_list))
+ return list("none")
+ return assoc_to_keys(SSblooper.blooper_list)
+
+/datum/preference/choiced/blooper/apply_to_human(mob/living/carbon/human/target, value)
+ target.blooper = SSblooper.blooper_list[value]
+
+/datum/preference/choiced/blooper/is_accessible(datum/preferences/preferences)
+ return ..() && length(SSblooper.blooper_list)
+
+/datum/preference/choiced/blooper/compile_constant_data()
+ var/list/data = ..()
+ if(!length(SSblooper.blooper_list))
+ return data
+ var/list/display_names = list()
+ for(var/id in get_choices())
+ display_names[id] = astype(SSblooper.blooper_list[id], /datum/blooper).name
+ data[CHOICED_PREFERENCE_DISPLAY_NAMES] = display_names
+ return data
+
+/datum/preference/numeric/blooper_speed
+ category = PREFERENCE_CATEGORY_VOCALS
+ savefile_identifier = PREFERENCE_CHARACTER
+ savefile_key = "blooper_speed"
+ minimum = 0
+ maximum = 100
+
+/datum/preference/numeric/blooper_speed/apply_to_human(mob/living/carbon/human/target, value)
+ target.blooper_speed = value
+
+/datum/preference/numeric/blooper_speed/create_default_value()
+ return 50
+
+/datum/preference/numeric/blooper_speed/is_accessible(datum/preferences/preferences)
+ return ..() && length(SSblooper.blooper_list)
+
+/datum/preference/numeric/blooper_pitch
+ category = PREFERENCE_CATEGORY_VOCALS
+ savefile_identifier = PREFERENCE_CHARACTER
+ savefile_key = "blooper_pitch"
+ minimum = 0
+ maximum = 100
+
+/datum/preference/numeric/blooper_pitch/apply_to_human(mob/living/carbon/human/target, value)
+ target.blooper_pitch = value
+
+/datum/preference/numeric/blooper_pitch/create_default_value()
+ return 50
+
+/datum/preference/numeric/blooper_pitch/is_accessible(datum/preferences/preferences)
+ return ..() && length(SSblooper.blooper_list)
+
+/datum/preference/numeric/blooper_pitch_range
+ category = PREFERENCE_CATEGORY_VOCALS
+ savefile_identifier = PREFERENCE_CHARACTER
+ savefile_key = "blooper_pitch_range"
+ minimum = 0
+ maximum = 100
+
+/datum/preference/numeric/blooper_pitch_range/apply_to_human(mob/living/carbon/human/target, value)
+ target.blooper_pitch_range = value
+
+/datum/preference/numeric/blooper_pitch_range/create_default_value()
+ return 30
+
+/datum/preference/numeric/blooper_pitch_range/is_accessible(datum/preferences/preferences)
+ return ..() && length(SSblooper.blooper_list)
+
+// Game preferences beyond this point.
+
+// Hear vocal bloopers
+/datum/preference/toggle/hear_blooper
+ category = PREFERENCE_CATEGORY_GAME_PREFERENCES
+ savefile_identifier = PREFERENCE_PLAYER
+ savefile_key = "blooper_hear"
+ default_value = TRUE
+
+/datum/preference/numeric/blooper_sound_volume
+ category = PREFERENCE_CATEGORY_GAME_PREFERENCES
+ savefile_identifier = PREFERENCE_PLAYER
+ savefile_key = "sound_blooper_volume"
+ minimum = 0
+ maximum = 100
+
+/datum/preference/numeric/blooper_sound_volume/apply_to_human(mob/living/carbon/human/target, value)
+ return
+
+/datum/preference/numeric/blooper_sound_volume/create_default_value()
+ return 100
+
+/datum/preference/numeric/blooper_sound_volume/is_accessible(datum/preferences/preferences)
+ return ..() && length(SSblooper.blooper_list)
diff --git a/modular_darkpack/modules/books/code/books.dm b/modular_darkpack/modules/books/code/books.dm
index 2936ddb2f9c1..96153c2e5405 100644
--- a/modular_darkpack/modules/books/code/books.dm
+++ b/modular_darkpack/modules/books/code/books.dm
@@ -42,3 +42,12 @@
/obj/item/vampirebook/quran/read_book(mob/living/carbon/human/user)
quote = pick(GLOB.quran_quotes)
+
+/obj/item/vampirebook/bible
+ name = "Bible"
+ icon_state = "bible"
+
+// note to self - fucking move this to the parent type
+/obj/item/vampirebook/bible/read_book(mob/living/carbon/human/user)
+ . = ..()
+ quote = pick(GLOB.bible_quotes)
diff --git a/modular_darkpack/modules/cars/code/car.dm b/modular_darkpack/modules/cars/code/car.dm
index f5a83940f720..53d9d4be11a7 100644
--- a/modular_darkpack/modules/cars/code/car.dm
+++ b/modular_darkpack/modules/cars/code/car.dm
@@ -476,20 +476,20 @@
if(istype(bumped_atom, /mob/living))
var/mob/living/hit_mob = bumped_atom
switch(hit_mob.mob_size)
- if(MOB_SIZE_HUGE) //gangrel warforms, werewolves, bears, ppl with fortitude
+ if(MOB_SIZE_HUGE) // zulo form
playsound(src, 'modular_darkpack/modules/cars/sounds/bump.ogg', 75, TRUE)
speed_in_pixels = 0
COOLDOWN_START(src, impact_delay, 2 SECONDS)
hit_mob.Paralyze(1 SECONDS)
- if(MOB_SIZE_LARGE) //ppl with fat bodytype
+ if(MOB_SIZE_LARGE) // gangrel warforms, werewolves, bears
playsound(src, 'modular_darkpack/modules/cars/sounds/bump.ogg', 60, TRUE)
speed_in_pixels = round(speed_in_pixels * 0.35)
hit_mob.Knockdown(1 SECONDS)
- if(MOB_SIZE_SMALL) //small animals
+ if(MOB_SIZE_SMALL) //small animals
playsound(src, 'modular_darkpack/modules/cars/sounds/bump.ogg', 40, TRUE)
speed_in_pixels = round(speed_in_pixels * 0.75)
hit_mob.Knockdown(1 SECONDS)
- else //everything else
+ else //everything else
playsound(src, 'modular_darkpack/modules/cars/sounds/bump.ogg', 50, TRUE)
speed_in_pixels = round(speed_in_pixels * 0.5)
hit_mob.Knockdown(1 SECONDS)
diff --git a/modular_darkpack/modules/cars/code/subtypes.dm b/modular_darkpack/modules/cars/code/subtypes.dm
index 4bd94b6a4c7e..5aaf4f3807ae 100644
--- a/modular_darkpack/modules/cars/code/subtypes.dm
+++ b/modular_darkpack/modules/cars/code/subtypes.dm
@@ -92,8 +92,8 @@
/obj/darkpack_car/police/unmarked
icon_state = "unmarked"
-/obj/darkpack_car/police/process()
- // If the light is not on, OR if we only have 1 light color, there is 0 reason to swap between light states
+/obj/darkpack_car/police/process(seconds_per_tick)
+ // If the light is not on, OR if we only have 1 light color, there is 0 reason to swap between light states
if(!light_on || (primary_light_color == secondary_light_color))
return ..()
if(!COOLDOWN_FINISHED(src, last_color_change))
diff --git a/modular_darkpack/modules/city_traits/code/negative_traits.dm b/modular_darkpack/modules/city_traits/code/negative_traits.dm
index 1f0ff9742bd6..ba2b4f7305b8 100644
--- a/modular_darkpack/modules/city_traits/code/negative_traits.dm
+++ b/modular_darkpack/modules/city_traits/code/negative_traits.dm
@@ -39,10 +39,7 @@
/datum/station_trait/faulty_power_grid/on_round_start()
. = ..()
- // Fuck I hate it, rework fusebox code
- for(var/obj/fusebox/broken_box in world)
+ for(var/obj/fusebox/F in GLOB.fuseboxes)
if(prob(75))
continue
- broken_box.damaged += rand(50, 200)
- broken_box.check_damage()
-
+ F.take_damage(rand(50,200))
diff --git a/modular_darkpack/modules/clothes/code/belt.dm b/modular_darkpack/modules/clothes/code/belt.dm
index a2c1cfb7ca4d..1a0d331f7c52 100644
--- a/modular_darkpack/modules/clothes/code/belt.dm
+++ b/modular_darkpack/modules/clothes/code/belt.dm
@@ -40,8 +40,8 @@
/obj/item/storage/belt/holster/detective/darkpack/fbi/PopulateContents()
new /obj/item/gun/ballistic/automatic/pistol/darkpack/glock21(src)
- new /obj/item/ammo_box/magazine/glock45acp(src)
- new /obj/item/ammo_box/magazine/glock45acp(src)
+ new /obj/item/ammo_box/magazine/glock45acp/hp(src)
+ new /obj/item/ammo_box/magazine/glock45acp/hp(src)
/obj/item/storage/belt/holster/detective/darkpack/endron
diff --git a/modular_darkpack/modules/clothes/code/eyes.dm b/modular_darkpack/modules/clothes/code/eyes.dm
index bc804e86136b..446b8a31f4d0 100644
--- a/modular_darkpack/modules/clothes/code/eyes.dm
+++ b/modular_darkpack/modules/clothes/code/eyes.dm
@@ -8,6 +8,7 @@
icon = 'modular_darkpack/modules/clothes/icons/clothing.dmi'
worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi'
ONFLOOR_ICON_HELPER('modular_darkpack/modules/clothes/icons/clothing_onfloor.dmi')
+ flags_cover = GLASSESCOVERSEYES
/obj/item/clothing/glasses/vampire/Initialize(mapload)
. = ..()
diff --git a/modular_darkpack/modules/company_logos/code/company_logos.dm b/modular_darkpack/modules/company_logos/code/company_logos.dm
new file mode 100644
index 000000000000..35be926ef778
--- /dev/null
+++ b/modular_darkpack/modules/company_logos/code/company_logos.dm
@@ -0,0 +1,71 @@
+GLOBAL_LIST_INIT(all_brands, init_subtypes_w_path_keys(/datum/brand, list()))
+GLOBAL_LIST_INIT(all_brandnames, brand_list_by_name())
+
+/proc/brand_list_by_name()
+ var/list/brand_list = GLOB.all_brands
+
+ for(var/path in brand_list)
+ var/datum/brand/this_brand = brand_list[path]
+ brand_list[this_brand.manufacturer] = this_brand
+ return brand_list
+
+/datum/element/corp_label
+ var/datum/brand/our_brand = /datum/brand
+ element_flags = ELEMENT_BESPOKE
+ argument_hash_start_idx = 1
+
+/datum/element/corp_label/Attach(datum/target, datum/brand/my_brand)
+ . = ..()
+ if(!isatom(target))
+ return ELEMENT_INCOMPATIBLE
+
+ var/obj/product = target
+
+ if(!product.brand)
+ return ELEMENT_INCOMPATIBLE
+
+ our_brand = my_brand
+
+ if(isnull(my_brand))
+ our_brand = /datum/brand
+
+ RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
+ RegisterSignal(target, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examine_more))
+
+/datum/element/corp_label/Detach(datum/target)
+ UnregisterSignal(target, list(COMSIG_ATOM_EXAMINE))
+ return ..()
+
+/datum/element/corp_label/proc/on_examine(datum/source, mob/user, list/examine_list)
+ SIGNAL_HANDLER
+ examine_list += span_notice(" This item is branded. [EXAMINE_HINT("Look closer")] for more information.")
+
+/datum/element/corp_label/proc/on_examine_more(datum/source, mob/user, list/examine_list)
+ SIGNAL_HANDLER
+ var/logo
+ if(our_brand.render_logo)
+ logo = "[icon2html(our_brand.logo_icon, user, our_brand.manufacturer, extra_classes = "corplogo")]"
+
+ examine_list += span_info("[logo ? "[logo] " : ""]Brought to you by [our_brand.full_name].")
+
+ if(our_brand.slogan)
+ examine_list += span_notice("\"[our_brand.slogan]\"")
+
+/datum/brand
+ abstract_type = /datum/brand
+
+ // Used to index the brand and reference the icon_state
+ var/manufacturer = "badcode"
+ // The full, plain-text name of the company.
+ var/full_name = "Bad Code Inc."
+ // Company slogan. Displayed alongside the logo in most cases.
+ var/slogan = "Bad Code Inc.: Telling America's Coders they screwed up since 1970."
+ // Formatting applied to the name in item descriptions
+ var/name_span = "hypnophrase"
+ // The icon file we're grabbing our icon_state from. Default dimensions in this file are 300x110.
+ var/logo_icon = 'modular_darkpack/modules/COMPANY_LOGOS/icons/corp_logos.dmi'
+ // If FALSE, skip rendering the logo in examine text.
+ var/render_logo = TRUE
+ // Company color used for coloring certain items that change depending on brand
+ var/company_color = COLOR_ADMIN_PINK
+
diff --git a/modular_darkpack/modules/company_logos/code/pentex.dm b/modular_darkpack/modules/company_logos/code/pentex.dm
new file mode 100644
index 000000000000..afd75319797a
--- /dev/null
+++ b/modular_darkpack/modules/company_logos/code/pentex.dm
@@ -0,0 +1,210 @@
+/datum/brand/pentex
+ manufacturer = "pentex"
+ full_name = EVIL_COMPANY
+ slogan = "Pentex: Making All The Really Tough Decisions For You!"
+ name_span = "corp_label_pentex"
+ company_color = COLOR_CORP_PENTEX
+
+// TOP 21 - Companies that are or were at one time in the top 21
+/datum/brand/pentex/ardus
+ manufacturer = "ardus"
+ full_name = EVIL_TRASH_COMPANY
+ slogan = "Keeping America's wilderness clean!"
+ name_span = "corp_label_ardus"
+ company_color = COLOR_CORP_ARDUS
+
+/datum/brand/pentex/avalon
+ manufacturer = "avalon"
+ full_name = EVIL_TOY_COMPANY
+ slogan = "Blast off to Fun!"
+ name_span = "corp_label_avalon"
+ company_color = COLOR_CORP_AVALON
+
+/datum/brand/pentex/circinus
+ manufacturer = "circinus"
+ full_name = EVIL_CIGARETTE_COMPANY
+ slogan = "The best taste in the tent."
+ name_span = "corp_label_circinus"
+ company_color = COLOR_CORP_CIRCINUS
+
+/datum/brand/pentex/consolidex
+ manufacturer = "consolidex"
+ full_name = EVIL_INVESTMENT_COMPANY
+ slogan = "Portfolio simplified."
+ name_span = "corp_label_consolidex"
+ company_color = COLOR_CORP_CONSOLIDEX
+
+/datum/brand/pentex/endron
+ manufacturer = "endron"
+ full_name = EVIL_OIL_COMPANY
+ slogan = "For a greener tomorrow!"
+ name_span = "corp_label_endron"
+ company_color = COLOR_CORP_ENDRON
+
+/datum/brand/pentex/endron/atlas
+ manufacturer = "atlas"
+ full_name = EVIL_NUCLEAR_COMPANY
+ slogan = "Atlas: Providers for Our Future."
+ render_logo = FALSE
+
+/datum/brand/pentex/harold_and_harold
+ manufacturer = "harold_and_harold"
+ full_name = EVIL_MINING_COMPANY
+ slogan = "Finding what makes the world work, underground."
+ name_span = "corp_label_harold_harold"
+ company_color = COLOR_CORP_HAROLD_HAROLD
+
+/datum/brand/pentex/good_house
+ manufacturer = "good_house"
+ full_name = EVIL_PAPER_COMPANY
+ slogan = "Sustainable stationary for a sustainable future."
+ name_span = "corp_label_good_house"
+ company_color = COLOR_CORP_GOOD_HOUSE
+
+/datum/brand/pentex/hallahan
+ manufacturer = "hallahan"
+ full_name = EVIL_FISHING_COMPANY
+ slogan = "Bounty of the sea straight to your plate."
+ name_span = "corp_label_hallahan"
+ company_color = COLOR_CORP_HALLAHAN
+
+/datum/brand/pentex/herculean
+ manufacturer = "herculean"
+ full_name = EVIL_HANDGUN_COMPANY
+ slogan = "No labour too great for a Herculean."
+ name_span = "corp_label_herculean"
+ company_color = COLOR_CORP_HERCULEAN
+
+/datum/brand/pentex/herricks
+ manufacturer = "herricks"
+ full_name = EVIL_GROCERY_COMPANY
+ slogan = "A full pantry without costing a full wallet."
+ name_span = "corp_label_herricks"
+ company_color = COLOR_CORP_HERRICKS
+
+/datum/brand/pentex/king
+ manufacturer = "king"
+ full_name = EVIL_LIQUOR_COMPANY
+ slogan = "Nobody is better at brewing than the King."
+ name_span = "corp_label_king"
+ company_color = COLOR_CORP_KING
+
+/datum/brand/pentex/magadon
+ manufacturer = "magadon"
+ full_name = EVIL_PHARMA_COMPANY
+ slogan = "Magadon: building a better you."
+ name_span = "corp_label_magadon"
+ company_color = COLOR_CORP_MAGADON
+
+/datum/brand/pentex/magadon/aesop
+ manufacturer = "aesop"
+ full_name = EVIL_COSMETICS_COMPANY
+ slogan = "Humane testing for Human needs."
+ render_logo = FALSE
+
+/datum/brand/pentex/magadon/autumn
+ manufacturer = "autumn"
+ full_name = EVIL_HOSPITAL_COMPANY
+ slogan = "Let our family care for your family."
+ render_logo = FALSE
+
+/datum/brand/pentex/nastrum
+ manufacturer = "nastrum"
+ full_name = EVIL_AVIATION_COMPANY
+ slogan = "Safety in efficiency."
+ name_span = "corp_label_nastrum"
+ company_color = COLOR_CORP_NASTRUM
+
+/datum/brand/pentex/omni
+ manufacturer = "omni"
+ full_name = EVIL_TELEVISION_COMPANY
+ slogan = "Omni: Entertainment at your fingertips."
+ name_span = "corp_label_omni_tv"
+ company_color = COLOR_CORP_OMNI_TV
+
+/datum/brand/pentex/otolleys
+ manufacturer = "otolleys"
+ full_name = EVIL_FAST_FOOD_COMPANY
+ slogan = "The family place."
+ name_span = "corp_label_otolleys"
+ company_color = COLOR_CORP_OTOLLEYS
+
+/datum/brand/pentex/black_dog
+ manufacturer = "black_dog"
+ full_name = EVIL_TTRPG_COMPANY
+ slogan = "Bring some Shadow to your table."
+ name_span = "corp_label_black_dog"
+ company_color = COLOR_CORP_BLACK_DOG
+
+/datum/brand/pentex/rainbow
+ manufacturer = "rainbow"
+ full_name = EVIL_PLASTIC_COMPANY
+ slogan = "Materials for the whole spectrum of products."
+ name_span = "corp_label_rainbow"
+ company_color = COLOR_CORP_RAINBOW_INC
+
+/datum/brand/pentex/tellus
+ manufacturer = "tellus"
+ full_name = EVIL_COMPUTER_COMPANY
+ slogan = "Tellus: Virtual worlds you could fall into."
+ name_span = "corp_label_tellus"
+ company_color = COLOR_CORP_TELLUS
+
+/datum/brand/pentex/tellus/sunburst
+ manufacturer = "sunburst"
+ full_name = EVIL_COMPUTER_COMPANY_2
+ slogan = "Computer parts should be sustainable. At Sunburst, they are."
+ render_logo = FALSE
+
+/datum/brand/pentex/vesuvius
+ manufacturer = "vesuvius"
+ full_name = EVIL_PUBLISHING_COMPANY
+ slogan = "Nobody tells a story like Vesuvius."
+ name_span = "corp_label_vesuvius"
+ company_color = COLOR_CORP_VESUVIUS
+
+/datum/brand/pentex/young_and_smith
+ manufacturer = "young_and_smith"
+ full_name = EVIL_FOOD_COMPANY
+ slogan = "Make your grocery trips simpler. Ask for Young and Smith."
+ name_span = "corp_label_young_smith"
+ company_color = COLOR_CORP_YOUNG_SMITH
+
+// EVERTHING ELSE - Pentex subsidiares that are not and have never been in the top 21
+/datum/brand/pentex/endron/easton
+ manufacturer = "easton"
+ full_name = EVIL_ENGINE_COMPANY
+ slogan = "Let Easton Exploratory be your guide on the search for the world's energy."
+ render_logo = FALSE
+
+/datum/brand/pentex/endron/falcon_motors
+ manufacturer = "falcon_motors"
+ full_name = EVIL_CAR_COMPANY
+ slogan = "The smoothest ride is on the wings of a Falcon."
+ render_logo = FALSE
+
+/datum/brand/pentex/endron/egpc // Is this the most niche subsidiary? Probably.
+ manufacturer = "egpc"
+ full_name = EVIL_EGYPTIAN_OIL_COMPANY
+ render_logo = FALSE
+
+/datum/brand/pentex/harold_and_harold/kauket // Nevermind. It's probably this one.
+ manufacturer = "kauket"
+ full_name = EVIL_EGYPTIAN_MINING_COMPANY
+ render_logo = FALSE
+
+/datum/brand/pentex/king/aquaclear
+ manufacturer = "aquaclear"
+ full_name = EVIL_WATERWAY_COMPANY
+ slogan = "Keeping the world flowing."
+ render_logo = FALSE
+
+/datum/brand/pentex/king/dragon_valley
+ manufacturer = "dragon_valley"
+ full_name = EVIL_WINE_COMPANY
+ slogan = "Raid the Dragon's Horde for a night you'll never forget."
+ render_logo = FALSE
+
+/datum/brand/pentex/king/king // Confusing, but meaningful distinction. The actual breweries that make the booze.
+ manufacturer = "king2"
+ full_name = EVIL_BEER_COMPANY
diff --git a/modular_darkpack/modules/company_logos/icons/corp_logos.dmi b/modular_darkpack/modules/company_logos/icons/corp_logos.dmi
new file mode 100644
index 000000000000..079cb0d7199a
Binary files /dev/null and b/modular_darkpack/modules/company_logos/icons/corp_logos.dmi differ
diff --git a/modular_darkpack/modules/company_logos/readme.md b/modular_darkpack/modules/company_logos/readme.md
new file mode 100644
index 000000000000..f007e1e53b94
--- /dev/null
+++ b/modular_darkpack/modules/company_logos/readme.md
@@ -0,0 +1,10 @@
+https://github.com/DarkPack13/SecondCity/pull/491
+
+## \
+
+Module ID: COMPANY_LOGOS
+
+### Credits:
+
+dwinters99
+Drulikar
diff --git a/modular_darkpack/modules/decor/code/decor.dm b/modular_darkpack/modules/decor/code/decor.dm
index 5ff48a591ad9..05a5debd316a 100644
--- a/modular_darkpack/modules/decor/code/decor.dm
+++ b/modular_darkpack/modules/decor/code/decor.dm
@@ -48,10 +48,27 @@
/obj/structure/lamppost/Initialize(mapload)
. = ..()
+ var/area/vtm/my_area = get_area(src)
if(check_holidays(FESTIVE_SEASON))
- var/area/my_area = get_area(src)
if(istype(my_area) && my_area.outdoors)
icon_state = "[initial(icon_state)]-snow"
+ RegisterSignal(my_area, COMSIG_AREA_POWER_CHANGE, PROC_REF(on_power_change))
+ // DARKPACK TODO - fuseboxes and areas aren't meaningfully connected to each other, and thusly aren't meaningfully connected to lights/devices that may need poer.
+ // TLDR we need to basically re-evaluate how we approach power... the current system is flavcode spaghetti shit.
+ if(my_area.powered(AREA_USAGE_LIGHT))
+ create_lights()
+
+/obj/structure/lamppost/proc/on_power_change(area/A)
+ SIGNAL_HANDLER
+
+
+ if(A.power_light)
+ create_lights()
+ else
+ QDEL_LIST(my_lights)
+
+/obj/structure/lamppost/proc/create_lights()
+ QDEL_LIST(my_lights)
switch(number_of_lamps)
if(1)
new_light(get_step(loc, dir))
@@ -74,6 +91,7 @@
my_lights += new /obj/effect/decal/lamplight(location)
/obj/structure/lamppost/Destroy(force)
+ UnregisterSignal(get_area(src), COMSIG_AREA_POWER_CHANGE)
QDEL_LIST(my_lights)
. = ..()
@@ -459,19 +477,20 @@
if(pole_in_use)
to_chat(user, "It's already in use - wait a bit.")
return
+
if(user.dancing)
return
- else
- pole_in_use = TRUE
- user.setDir(SOUTH)
- user.Stun(100)
- user.forceMove(src.loc)
- user.visible_message("[user] dances on [src]!")
- animatepole(user)
- user.layer = layer //set them to the poles layer
- pole_in_use = FALSE
- user.pixel_y = 0
- icon_state = initial(icon_state)
+
+ pole_in_use = TRUE
+ user.setDir(SOUTH)
+ user.Stun(100)
+ user.forceMove(src.loc)
+ user.visible_message("[user] dances on [src]!")
+ animatepole(user)
+ user.layer = layer //set them to the poles layer
+ pole_in_use = FALSE
+ user.pixel_y = 0
+ icon_state = initial(icon_state)
/obj/structure/pole/proc/animatepole(mob/living/user)
return
diff --git a/modular_darkpack/modules/decor/code/road_signs.dm b/modular_darkpack/modules/decor/code/road_signs.dm
index 569560d7c9d5..0e52499f65f6 100644
--- a/modular_darkpack/modules/decor/code/road_signs.dm
+++ b/modular_darkpack/modules/decor/code/road_signs.dm
@@ -10,18 +10,96 @@
name = "stop sign"
icon_state = "stop"
+/obj/structure/roadsign/fourway
+ icon_state = "4way"
+
+/obj/structure/roadsign/allway
+ icon_state = "allway"
+
+/obj/structure/roadsign/wrongway
+ icon_state = "wrongway"
+
/obj/structure/roadsign/noparking
name = "no parking sign"
icon_state = "noparking"
+/obj/structure/roadsign/noturnleft
+ icon_state = "noturnleft"
+
+/obj/structure/roadsign/noturnright
+ icon_state = "noturnright"
+
+/obj/structure/roadsign/noturnforward
+ icon_state = "noturnforward"
+
+/obj/structure/roadsign/noturnback
+ icon_state = "noturnback"
+
/obj/structure/roadsign/nopedestrian
name = "no pedestrian sign"
icon_state = "nopedestrian"
+/obj/structure/roadsign/exitright
+ icon_state = "exitright"
+
+/obj/structure/roadsign/exitleft
+ icon_state = "exitleft"
+
+
+/obj/structure/roadsign/street
+ name = "street sign"
+ icon_state = "street"
+ /// IF set, will override the getter for the area's name
+ var/custom_street_name
+
+/obj/structure/roadsign/street/Initialize(mapload)
+ . = ..()
+ update_appearance()
+
+/obj/structure/roadsign/street/update_name(updates)
+ . = ..()
+ var/street_name = get_street_name()
+ if(!street_name)
+ return
+ name = "street sign ([street_name])"
+
+/obj/structure/roadsign/street/update_desc(updates)
+ . = ..()
+ var/street_name = get_street_name()
+ if(!street_name)
+ return
+ desc = "A street sign declaring you are at \"[street_name]\""
+
+/obj/structure/roadsign/street/proc/get_street_name()
+ if(custom_street_name)
+ return custom_street_name
+ var/area/my_area = get_area(src)
+ if(my_area)
+ return my_area
+
+
+/obj/structure/roadsign/onewayleft
+ icon_state = "onewayleft"
+
+/obj/structure/roadsign/onewayright
+ icon_state = "onewayright"
+
/obj/structure/roadsign/busstop
name = "bus stop sign"
icon_state = "busstop"
+/obj/structure/roadsign/railcrossing
+ icon_state = "railcrossing"
+
+/obj/structure/roadsign/onlyforward
+ icon_state = "onlyforward"
+
+/obj/structure/roadsign/onlyright
+ icon_state = "onlyright"
+
+/obj/structure/roadsign/onlyleft
+ icon_state = "onlyleft"
+
/obj/structure/roadsign/speedlimit
name = "speed limit sign"
icon_state = "speed50"
@@ -38,10 +116,16 @@
name = "traffic light warning sign"
icon_state = "warningtrafficlight"
+/obj/structure/roadsign/warningdeer
+ icon_state = "warningdeer"
+
/obj/structure/roadsign/warningpedestrian
name = "pedestrian warning sign"
icon_state = "warningpedestrian"
+/obj/structure/roadsign/circleofdoom
+ icon_state = "circleofdoom"
+
/obj/structure/roadsign/parking
name = "parking sign"
icon_state = "parking"
diff --git a/modular_darkpack/modules/decor/code/signs_city.dm b/modular_darkpack/modules/decor/code/signs_city.dm
index f93e5563d81e..30f3957a8f29 100644
--- a/modular_darkpack/modules/decor/code/signs_city.dm
+++ b/modular_darkpack/modules/decor/code/signs_city.dm
@@ -103,6 +103,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/chinese/alt4, 0)
icon_state = "chinese6"
MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/chinese/alt5, 0)
+// Hrm. Not synced with PRIMARY_NIGHTCLUB_COMPANY and it cant really be..
/obj/structure/sign/city/strip_club
name = "sign"
desc = "It says DO RA. Maybe it's some kind of strip club..."
diff --git a/modular_darkpack/modules/delivery/code/_delivery_defs_gvars.dm b/modular_darkpack/modules/delivery/code/_delivery_defs_gvars.dm
deleted file mode 100644
index c206cd05a8e3..000000000000
--- a/modular_darkpack/modules/delivery/code/_delivery_defs_gvars.dm
+++ /dev/null
@@ -1,5 +0,0 @@
-GLOBAL_LIST_EMPTY(delivery_garage_areas)
-GLOBAL_LIST_EMPTY(delivery_available_veh_spawners)
-GLOBAL_LIST_EMPTY(delivery_available_receivers)
-GLOBAL_LIST_EMPTY(delivery_available_dispensers)
-GLOBAL_LIST_EMPTY(delivery_stats)
diff --git a/modular_darkpack/modules/delivery/code/delivery_areas.dm b/modular_darkpack/modules/delivery/code/delivery_areas.dm
deleted file mode 100644
index ab81d5fcdbd6..000000000000
--- a/modular_darkpack/modules/delivery/code/delivery_areas.dm
+++ /dev/null
@@ -1,21 +0,0 @@
-/area/vtm/interior/delivery
- name = "Delivery office"
- icon = 'modular_darkpack/modules/areas/icons/areas.dmi'
- icon_state = "shop"
- fire_controled = TRUE
- var/delivery_employer_tag = "default"
-
-/area/vtm/interior/delivery_garage
- name = "Delivery garage"
- icon = 'modular_darkpack/modules/areas/icons/areas.dmi'
- icon_state = "strip"
- fire_controled = TRUE
- var/delivery_employer_tag = "default"
-
-/area/vtm/interior/delivery_garage/Initialize(mapload)
- GLOB.delivery_garage_areas.Add(src)
- . = ..()
-
-/area/vtm/interior/delivery_garage/Destroy()
- GLOB.delivery_garage_areas.Remove(src)
- . = ..()
diff --git a/modular_darkpack/modules/delivery/code/delivery_datums.dm b/modular_darkpack/modules/delivery/code/delivery_datums.dm
deleted file mode 100644
index 56dda93b7864..000000000000
--- a/modular_darkpack/modules/delivery/code/delivery_datums.dm
+++ /dev/null
@@ -1,733 +0,0 @@
-/datum/delivery_datum/
- var/delivery_employer_tag
- var/contract_difficulty
- var/obj/structure/delivery_board/board
- var/obj/item/delivery_contract/contract
- var/mob/original_owner
- var/list/contract_takers = list()
- var/area/vtm/interior/delivery_garage/garage_area
- var/obj/effect/landmark/delivery_truck_beacon/truck_spawner
- var/obj/darkpack_car/delivery_truck/active_truck
- var/list/spawned_keys = list()
- var/list/delivery_dispensers = list()
- var/list/delivery_receivers = list()
- var/list/crate_designations = list()
- var/list/active_crates = list()
- var/list/delivery_score = list(
- "trucks_used" = 0,
- "truck_returned" = 0,
- "dispensed_crates" = 0,
- "delivered_crates" = 0,
- "misdelivered_crates" = 0,
- "completed_receivers" = 0,
- "manifest_refresh" = 0,
- "timeout_timestamp" = 0,
- )
-
-/datum/delivery_datum/proc/create_stats_table()
- GLOB.delivery_stats = list(
- "oops" = list(
- "income" = 0,
- "grade" = 0,
- "completed" = 0,
- "completed_receivers" = 0,
- "delivered_crates" = 0,
- ),
- "millenium_delivery" = list(
- "income" = 0,
- "grade" = 0,
- "completed" = 0,
- "completed_receivers" = 0,
- "delivered_crates" = 0,
- ),
- "bar_delivery" = list(
- "income" = 0,
- "grade" = 0,
- "completed" = 0,
- "completed_receivers" = 0,
- "delivered_crates" = 0,
- ),
- )
-
-/datum/delivery_datum/proc/track_stats(grade,income)
- if(GLOB.delivery_stats.len == 0) create_stats_table()
- GLOB.delivery_stats["[delivery_employer_tag]"]["income"] += income
- GLOB.delivery_stats["[delivery_employer_tag]"]["grade"] += grade
- GLOB.delivery_stats["[delivery_employer_tag]"]["completed"] += 1
- GLOB.delivery_stats["[delivery_employer_tag]"]["completed_receivers"] += delivery_score["completed_receivers"]
- GLOB.delivery_stats["[delivery_employer_tag]"]["delivered_crates"] += delivery_score["delivered_crates"]
- return
-
-/datum/delivery_datum/proc/process_payouts(grade)
- var/payout_quota = 0
- payout_quota += delivery_score["delivered_crates"] * 100
- payout_quota += delivery_score["completed_receivers"] * 200
- var/payout_multiplier
- switch(grade)
- if(7)
- payout_multiplier = 1.5
- if(6)
- payout_multiplier = 1.3
- if(5)
- payout_multiplier = 1.1
- if(4)
- payout_multiplier = 1
- if(3)
- payout_multiplier = 0.9
- if(2)
- payout_multiplier = 0.7
- if(1)
- payout_multiplier = 0.5
- payout_quota *= payout_multiplier
- track_stats(grade,payout_quota)
- var/final_payout = round((payout_quota / contract_takers.len),1)
- broadcast_to_holders("Delivery Complete.[final_payout] paid to the accounts of all participants.")
- for(var/mob/living/carbon/human/payee in contract_takers)
- if(!payee.account_id)
- continue
- var/datum/bank_account/payee_account = SSeconomy.bank_accounts_by_id["[payee.account_id]"]
- payee_account.account_balance += final_payout
-
-
-/datum/delivery_datum/proc/parse_grade(grade)
- if(!grade) return
- switch(grade)
- if(7)
- return "S"
- if(6)
- return "A"
- if(5)
- return "B"
- if(4)
- return "C"
- if(3)
- return "D"
- if(2)
- return "E"
- if(1)
- return "F"
-
-/datum/delivery_datum/proc/delivery_finish()
- if(active_truck)
- var/area/truck_area = get_area(active_truck)
- if(truck_area == garage_area) delivery_score["truck_returned"] = 1
- var/final_grade = 7
- if(world.time > delivery_score["timeout_timestamp"])
- final_grade -= 3
- if(delivery_receivers.len > 0)
- final_grade -= 5
- if(delivery_score["trucks_used"] > 1)
- final_grade -= 1
- if(delivery_score["truck_returned"] == 0)
- final_grade -= 1
- if(delivery_score["dispensed_crates"] > delivery_score["delivered_crates"])
- final_grade -= 1
- if(delivery_score["misdelivered_crates"] > 0)
- final_grade -= 1
- if(delivery_score["manifest_refresh"] > 3)
- final_grade -= 1
- if(final_grade < 1) final_grade = 1
- broadcast_to_holders("Delivery Grade: [parse_grade(final_grade)]")
- process_payouts(final_grade)
- qdel(contract)
- qdel(src)
-
-
-/datum/delivery_datum/proc/add_owner(mob/user)
- if(contract_takers.Find(user) == 0)
- contract_takers.Add(user)
- return 1
- else
- return 0
-
-/datum/delivery_datum/proc/check_owner(mob/user)
- if(contract_takers.Find(user) == 0)
- return 0
- else
- return 1
-
-/datum/delivery_datum/proc/check_complete()
- if(delivery_receivers.len == 0)
- return 1
- else
- return 0
-
-/datum/delivery_datum/proc/broadcast_to_holders(message)
- if(!message) return
- for (var/mob/living/carbon/human/mob in contract_takers)
- to_chat(mob, "
"
-
- switch(winner_array["income"])
- if("none")
- parts += "No surplus profits were generated by the delivery network in the city. The businesses continue as they are, without any significant influence over them. "
- if("oops")
- parts += "As the OOPS Delivery Service maintains its monopoly over the city's nightly delivery service market, surplus profits generated from the deliveries head right to the unknown forces behind the entire operation, benefiting mostly themselves and those who work for them."
- if("millenium_delivery")
- parts += "The Millenium Tower Delivery Service secures the biggest share of the city's delivery market and secures the surplus profits from the night in the name of the Camarilla who moves the funds support Camarilla-aligned interests outside of the city. "
- if("bar_delivery")
- parts += "The Bar Delivery Service secures the majority of the night's delivery market share and receives the surplus profits from the market. The funds are handed out, according to need, to interests aligned with the Anarch movement outside of the city. "
-
- parts += "
"
-
- return parts.Join()
diff --git a/modular_darkpack/modules/delivery/code/delivery_obj/delivery_dispensers.dm b/modular_darkpack/modules/delivery/code/delivery_obj/delivery_dispensers.dm
deleted file mode 100644
index ecaa2e62afd8..000000000000
--- a/modular_darkpack/modules/delivery/code/delivery_obj/delivery_dispensers.dm
+++ /dev/null
@@ -1,77 +0,0 @@
-//oops
-
-/obj/structure/delivery_dispenser/oops1
- chute_name = "OOPS Delivery Center - Garage 1"
- delivery_employer_tag = "oops"
-
-/obj/structure/delivery_dispenser/oops2
- chute_name = "OOPS Delivery Center - Garage 2"
- delivery_employer_tag = "oops"
-
-/obj/structure/delivery_dispenser/oops3
- chute_name = "OOPS Delivery Center - Garage 3"
- delivery_employer_tag = "oops"
-
-/obj/structure/delivery_dispenser/oops4
- chute_name = "OOPS Delivery Center - Office 1"
- delivery_employer_tag = "oops"
-
-/obj/structure/delivery_dispenser/oops5
- chute_name = "OOPS Delivery Center - Office 2"
- delivery_employer_tag = "oops"
-
-/obj/structure/delivery_dispenser/oops6
- chute_name = "OOPS Delivery Center - Exterior"
- delivery_employer_tag = "oops"
-
-//millenium
-
-/obj/structure/delivery_dispenser/mt1
- chute_name = "Millenium Tower - Delivery Garage 1"
- delivery_employer_tag = "millenium_delivery"
-
-/obj/structure/delivery_dispenser/mt2
- chute_name = "Millenium Tower - Delivery Garage 2"
- delivery_employer_tag = "millenium_delivery"
-
-/obj/structure/delivery_dispenser/mt3
- chute_name = "Millenium Tower - Back Courtyard 1"
- delivery_employer_tag = "millenium_delivery"
-
-/obj/structure/delivery_dispenser/mt4
- chute_name = "Millenium Tower - Back Courtyard 2"
- delivery_employer_tag = "millenium_delivery"
-
-/obj/structure/delivery_dispenser/mt5
- chute_name = "Millenium Tower - Back Courtyard 3"
- delivery_employer_tag = "millenium_delivery"
-
-/obj/structure/delivery_dispenser/mt6
- chute_name = "Millenium Tower - Delivery Garage Exterior"
- delivery_employer_tag = "millenium_delivery"
-
-//bar
-
-/obj/structure/delivery_dispenser/bar1
- chute_name = "Bar - Delivery Garage 1"
- delivery_employer_tag = "bar_delivery"
-
-/obj/structure/delivery_dispenser/bar2
- chute_name = "Bar - Delivery Garage 2"
- delivery_employer_tag = "bar_delivery"
-
-/obj/structure/delivery_dispenser/bar3
- chute_name = "Bar - Storage Room"
- delivery_employer_tag = "bar_delivery"
-
-/obj/structure/delivery_dispenser/bar4
- chute_name = "Bar - Exterior 1"
- delivery_employer_tag = "bar_delivery"
-
-/obj/structure/delivery_dispenser/bar5
- chute_name = "Bar - Exterior 2"
- delivery_employer_tag = "bar_delivery"
-
-/obj/structure/delivery_dispenser/bar6
- chute_name = "Bar - Exterior 3"
- delivery_employer_tag = "bar_delivery"
diff --git a/modular_darkpack/modules/delivery/code/delivery_obj/delivery_map_defines.dm b/modular_darkpack/modules/delivery/code/delivery_obj/delivery_map_defines.dm
deleted file mode 100644
index 55e188c5c39c..000000000000
--- a/modular_darkpack/modules/delivery/code/delivery_obj/delivery_map_defines.dm
+++ /dev/null
@@ -1,107 +0,0 @@
-// OOPS office defines
-
-/obj/structure/vampdoor/glass/oops_office
- name = "OOPS delivery office"
- lock_id = "oops"
- lockpick_difficulty = 12
-
-/obj/structure/delivery_board/oops_office
- name = "OOPS delivery assigment board"
- delivery_employer_tag = "oops"
- desc = "The OOPS Delivery Service is said to be ran by the same forces that established and maintain the " + CITY_NAME + " nightly delivery market and the ones ultimately setting and surprisingly, diligently following their own rules per securing the surplus of each night's crate 'trade'. Contracts taken from this board will aid the OOPS service in maintaining the market for everyone involved, however this will also have the side effect of filling the coffers of the powers running the company for their unknown ends."
-
-/area/vtm/interior/delivery/oops_office
- name = "OOPS delivery office"
- delivery_employer_tag = "oops"
-
-/area/vtm/interior/delivery_garage/oops_office
- name = "OOPS delivery office - Garage"
- delivery_employer_tag = "oops"
-
-/obj/effect/landmark/delivery_truck_beacon/oops_office
- spawn_dir = WEST
- delivery_employer_tag = "oops"
-
-// Camarilla variant
-
-/obj/structure/vampdoor/glass/mt_office
- name = "Millenium Tower delivery garage"
- lock_id = LOCKACCESS_JAZZ_CLUB_DELIVERY
- lockpick_difficulty = 12
-
-/obj/structure/delivery_board/mt_office
- name = "Millenium Tower delivery assigment board"
- delivery_employer_tag = "millenium_delivery"
- desc = "The Millenium Tower Delivery Service was established once the Ventrue caught on and adopted the OOPS model for themselves and serves as a Camarilla-backed member of the delivery market. Camarilla related deliveries focus more on private matters of the cities Kindred and working for this Service will help the Camarilla secure the nightly market surplus for their own means."
- crate_types = list(
- "red" = list(
- "cargo_name" = "Industrial-Grade Cleaning Supplies",
- "color" = "#7c1313",
- "desc" = "Extremely strong cleaning supplies or base chemicals to manufacture them, in high quantities. One could easily sterilize entire rooms with the contents of these crates. Strong septic smell.",
- ),
- "blue" = list(
- "cargo_name" = "Books and Correspondence",
- "color" = "#202bca",
- "desc" = "Sets of heavy tomes sealed in special containers preventing damage along with modern paperbacks and archived letters both hand and machine written.",
- ),
- "yellow" = list(
- "cargo_name" = "Art Pieces",
- "color" = "#b8ac3f",
- "desc" = "Paintings, Sculptures, Pottery, Artifacts and anything else in between, sealed for safety and sometimes meant for assembly post-delivery. Also any tools required for such assembly.",
- ),
- "green" = list(
- "cargo_name" = "Personal Items",
- "color" = "#165f29",
- "desc" = "Private correspondence and deliveries marked as private. It could be cargo belonging to other crates but earmarked for private delivery due to private reselling or personal use. Typically, just mail but shipped in bulk. ",
- ),
- )
-
-/area/vtm/interior/delivery_garage/mt_office
- name = "Millenium Tower delivery office - Garage"
- delivery_employer_tag = "millenium_delivery"
-
-/obj/effect/landmark/delivery_truck_beacon/mt_office
- spawn_dir = NORTH
- delivery_employer_tag = "millenium_delivery"
-
-//Anarchs
-
-/obj/structure/vampdoor/glass/bar_office
- name = "Bar delivery garage"
- lock_id = LOCKACCESS_BAR_DELIVERY
- lockpick_difficulty = 12
-
-/obj/structure/delivery_board/bar_office
- name = "Bar delivery assigment board"
- delivery_employer_tag = "bar_delivery"
- desc = "The Bar Delivery Service is the Anarch-backed entry onto the deliver market and while initially mostly established to get on the local Camarilla representations nerves, has since grown to its own fully fledged member of the market and serves to provide much needed funds to Anarch aligned partners outside of the city."
- crate_types = list(
- "red" = list(
- "cargo_name" = "Homemade Party Favors",
- "color" = "#7c1313",
- "desc" = "The products of underground fermentation and cultivation, separated into containers appropriate for their form, fully cleared and legal for transport.",
- ),
- "blue" = list(
- "cargo_name" = "Teaching Aides",
- "color" = "#202bca",
- "desc" = "Sharp or blunt tools used to discipline the unruly and reward the smart. All in their original, legal wrappings and clear for transport.",
- ),
- "yellow" = list(
- "cargo_name" = "Care Package",
- "color" = "#b8ac3f",
- "desc" = "Supplies - mostly hermetically sealed food rations, assorted medical supplies as well as clothes and other basics.",
- ),
- "green" = list(
- "cargo_name" = "Personal Items",
- "color" = "#165f29",
- "desc" = "Private correspondence and deliveries marked as private. It could be cargo belonging to other crates but earmarked for private delivery due to private reselling or personal use. Typically, just mail but shipped in bulk. ",
- ),
- )
-
-/area/vtm/interior/delivery_garage/bar_office
- name = "Bar delivery office - Garage"
- delivery_employer_tag = "bar_delivery"
-
-/obj/effect/landmark/delivery_truck_beacon/bar_office
- spawn_dir = SOUTH
- delivery_employer_tag = "bar_delivery"
diff --git a/modular_darkpack/modules/delivery/code/delivery_obj/delivery_recievers.dm b/modular_darkpack/modules/delivery/code/delivery_obj/delivery_recievers.dm
deleted file mode 100644
index 1c57748c4a99..000000000000
--- a/modular_darkpack/modules/delivery/code/delivery_obj/delivery_recievers.dm
+++ /dev/null
@@ -1,98 +0,0 @@
-// Ideally all instanced receivers shoudl be defined here, so its easier to keep track
-
-/obj/structure/delivery_receiver/store1
- chute_name = "Bubway - Ghetto"
-
-/obj/structure/delivery_receiver/store2
- chute_name = "Veterinary Clinic - Ghetto"
-
-/obj/structure/delivery_receiver/store3
- chute_name = "Pawn Shop - Ghetto"
-
-/obj/structure/delivery_receiver/store4
- chute_name = "Weapon Shop - Ghetto"
-
-/obj/structure/delivery_receiver/store5
- chute_name = "Pawn Shop - Pacific Heights"
-
-/obj/structure/delivery_receiver/store6
- chute_name = "Gumma Guts - Fisherman's Wharf"
-
-/obj/structure/delivery_receiver/store7
- chute_name = "Seaside Arcade - Fisherman's Wharf"
-
-/obj/structure/delivery_receiver/store8
- chute_name = "Community Garden - Fisherman's Wharf"
-
-/obj/structure/delivery_receiver/store9
- chute_name = "Convineance Store - Fisherman's Wharf"
-
-/obj/structure/delivery_receiver/store10
- chute_name = "Boardwalk Store North - Fisherman's Wharf"
-
-/obj/structure/delivery_receiver/store11
- chute_name = "Boardwalk Store South - Fisherman's Wharf"
-
-/obj/structure/delivery_receiver/store12
- chute_name = "Big Clothing Store - Union Square"
-
-/obj/structure/delivery_receiver/store13
- chute_name = "Small Clothing Store - Union Square"
-
-/obj/structure/delivery_receiver/store14
- chute_name = "Weapon Store - Union Square"
-
-/obj/structure/delivery_receiver/store15
- chute_name = "Medium Clothing Store - Union Square"
-
-/obj/structure/delivery_receiver/store16
- chute_name = "Baco Tell Central - Union Square"
-
-/obj/structure/delivery_receiver/store17
- chute_name = "Baco Tell South - Union Square"
-
-/obj/structure/delivery_receiver/store18
- chute_name = "Clothing Store South - Union Square"
-
-/obj/structure/delivery_receiver/store19
- chute_name = "Gas Station - Pacific Heights"
-
-/obj/structure/delivery_receiver/store20
- chute_name = "Gas Station - Fisherman's Wharf"
-
-
-/obj/structure/delivery_receiver/special1
- chute_name = "Casino - Chinatown"
-
-/obj/structure/delivery_receiver/special2
- chute_name = "Laundromat - Chinatown"
-
-/obj/structure/delivery_receiver/special3
- chute_name = "Restaurant - Chinatown"
-
-/obj/structure/delivery_receiver/special4
- chute_name = "Hotel - Ghetto"
-
-/obj/structure/delivery_receiver/special5
- chute_name = "Museum Rear - Ghetto"
-
-/obj/structure/delivery_receiver/special6
- chute_name = "City Limits North"
-
-/obj/structure/delivery_receiver/special7
- chute_name = "City Limits East"
-
-/obj/structure/delivery_receiver/special8
- chute_name = "City Limits South"
-
-/obj/structure/delivery_receiver/special9
- chute_name = "City Limits West"
-
-/obj/structure/delivery_receiver/special10
- chute_name = "Church Side Entrance - Pacific Heights"
-
-/obj/structure/delivery_receiver/special11
- chute_name = "Private/Undisclosed Enterprise - Pacific Heights"
-
-/obj/structure/delivery_receiver/special12
- chute_name = "Forest Approach - Pacific Heights"
diff --git a/modular_darkpack/modules/delivery/code/delivery_objs.dm b/modular_darkpack/modules/delivery/code/delivery_objs.dm
deleted file mode 100644
index dab1678b0674..000000000000
--- a/modular_darkpack/modules/delivery/code/delivery_objs.dm
+++ /dev/null
@@ -1,507 +0,0 @@
-/obj/item/delivery_contract
- name = "delivery contract"
- desc = "A delivery contract issued by a delivery company. Use it in your hand to scan it for details. If your name is on the contract, use it on someone else to add them to it."
- icon = 'modular_darkpack/modules/deprecated/icons/onfloor.dmi'
- icon_state = "masquerade"
- color = "#bbb95c"
- lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/items_righthand.dmi'
- ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi')
-
- var/datum/delivery_datum/delivery
- var/datum/delivery_manifest/manifest
-
-/obj/item/delivery_contract/New(mob/user, obj/board,difficulty)
- delivery = new(user,board,difficulty)
- delivery.contract = src
- manifest = new(delivery)
- . = ..()
-
-/obj/item/delivery_contract/attack(mob/living/M, mob/living/user)
- if(!delivery)
- to_chat(user,span_notice("Error: No delivery datum attached. This is most likely a bug."))
- return
- if(!manifest) return "no_manifest"
- if(M == user)
- if(delivery.check_owner(user) == 0)
- to_chat(user, span_warning("You are not listed on this manifest. Before you can use it, one of its owners needs to add you to the crew handling it by using the manifest on you."))
- return
- else
- manifest.read_data(user)
- return
- if(M.client == null)
- to_chat(user,span_notice("Error: Target mob has no client. This is not a player mob."))
- return
- if(delivery.check_owner(user) == 0)
- to_chat(user,span_warning("You are not listed on this manifest. Before you can use it, one of its owners needs to add you to the crew handling it by using the manifest on you."))
- return
- if(delivery.check_owner(user) == 1)
- if(delivery.check_owner(M) == 0)
- if(tgui_alert(user,"Do you want to add [M] to the delivery contract?","Contract add confirmation",list("Yes","No"),timeout = 10 SECONDS) == "Yes")
- delivery.add_owner(M)
- var/obj/item/vamp/keys/cargo_truck/truck_keys = new(src)
- truck_keys.delivery = delivery
- truck_keys.owner = M
- M.put_in_hands(truck_keys)
- to_chat(user, span_notice("Success! User [M] added."))
- return
- if(delivery.check_owner(M) == 1)
- if(delivery.original_owner == M) return
- if(delivery.original_owner != user)
- to_chat(user,span_notice("Only the original owner of the contract, [delivery.original_owner] can remove people from the contract."))
- return
- else
- if(delivery.delivery_receivers.len == 0)
- to_chat(user,span_warning("This delivery is complete and should be handed in. Removing users is no longer possibe."))
- return
- if(tgui_alert(user,"Do you want to remove [M] from the delivery contract?","Contract remove confirmation",list("Yes","No"),timeout = 10 SECONDS) == "Yes")
- delivery.contract_takers.Remove(M)
- for(var/obj/item/vamp/keys/cargo_truck/truck_keys in delivery.spawned_keys)
- if(truck_keys.owner == M)
- qdel(truck_keys)
- to_chat(user, span_notice("Success! User [M] removed."))
- return
-
- . = ..()
-
-/obj/item/delivery_contract/attack_self(mob/user)
- if(!delivery)
- to_chat(user,span_notice("Error: No delivery datum attached. This is most likely a bug."))
- return
- if(!manifest) return "no_manifest"
-
- if(delivery.check_owner(user) == 0)
- to_chat(user, span_warning("You are not listed on this manifest. Before you can use it, one of its owners needs to add you to the crew handling it by using the manifest on you."))
- else
- manifest.read_data(user)
- . = ..()
-
-
-/obj/item/delivery_contract/Destroy()
- . = ..()
- if(delivery) qdel(delivery)
- if(manifest) qdel(manifest)
-
-
-/obj/structure/delivery_board
- color = "#ffb171"
- name = "delivery assignment board"
- desc = "A board made out of cork where delivery contracts are pinned. Use it with an emtpy hand to see if any are available."
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "nboard02"
- anchored = TRUE
- density = FALSE
- var/delivery_started = 0
- var/delivery_employer_tag = "default"
- var/next_delivery_timestamp
- var/list/crate_types = list(
- "red" = list(
- "cargo_name" = "Cleaning Supplies",
- "color" = "#7c1313",
- "desc" = "Red tinted crates typically contain cleaning supplies, including cleaning chemicals, replacement mops, rags and personal safety equipment.",
- ),
- "blue" = list(
- "cargo_name" = "Maintenance Supplies",
- "color" = "#202bca",
- "desc" = "Anything and everything related to maintaining electronics in a store or house - replacement batteries, light bulbs, electronic components as well as tools needed to replace and fix devices using them. ",
- ),
- "yellow" = list(
- "cargo_name" = "Equipment and Electronics",
- "color" = "#b8ac3f",
- "desc" = "Large items like computers and other electronics, lightning and ventilation systems, AC units as well as shelving and furniture typically in separate elements and needing further assembly. Also, tools required for the assembly of the above.",
- ),
- "green" = list(
- "cargo_name" = "Personal Items",
- "color" = "#165f29",
- "desc" = "Private correspondence and deliveries marked as private. It could be cargo belonging to other crates but earmarked for private delivery due to private reselling or personal use. Typically, just mail but shipped in bulk. ",
- ),
- )
-
-/obj/structure/delivery_board/proc/delivery_icon()
- icon_state = "nboard02"
- update_icon()
-
-/obj/structure/delivery_board/proc/delivery_cooldown(timer)
- var/time_to_wait = 5 MINUTES
- if(timer) time_to_wait = timer
- addtimer(CALLBACK(src,TYPE_PROC_REF(/obj/structure/delivery_board,delivery_icon)),time_to_wait)
-
-/obj/structure/delivery_board/attack_hand(mob/living/user)
- . = ..()
- if(!delivery_started)
- if(world.time > next_delivery_timestamp)
- if(tgui_alert(user,"A new contract is available. Do you wish to start a delivery?","Delivery available",list("Yes","No"),timeout = 10 SECONDS) == "Yes")
- var/picked_difficulty
- var/difficulty_text
- switch(tgui_input_list(user,"Select a contract length, details will be outlined before accepting.","Contract Selection",list("Short","Medium","Long"),timeout = 10 SECONDS))
- if("Short")
- picked_difficulty = 1
- difficulty_text = "A short contract involves 3 locations with up to 6 crates each, meaning the entire delivery can be completed with one truck. The time limit is 20 minutes."
- if("Medium")
- picked_difficulty = 2
- difficulty_text = "A medium contract involves 5 locations with up to 10 crates each, the entire delivery should be completed in 3 runs. The time limit is 45 minutes. "
- if("Long")
- picked_difficulty = 3
- difficulty_text = "A long contract involves 7 locations with up to 15 crates each, meaning that without partial loads each delivery will require a restock. The timie limit is 90 minutes."
- if(tgui_alert(user,difficulty_text,"Confirm Contract",list("Yes","No"),timeout = 10 SECONDS) == "Yes")
- var/obj/item/delivery_contract/contract = new(user,src,picked_difficulty)
- switch(contract.delivery.start_contract())
- if(1)
- user.put_in_hands(contract)
- icon_state = "nboard00"
- update_icon()
- to_chat(user,span_notice("Success! A new contract was created and aprorpiate items have been created and dispensed. Check the cotnract item for information about your delivery."))
- contract.manifest.save_data(init = TRUE)
- contract.manifest.read_data(contract.delivery.original_owner)
- delivery_started = 1
- return
- if("fail_reci")
- to_chat(user, span_warning("Not enough receivers avaialble in the game world. This is most likley because too many cotnracts are active at the same time, but is very likely a mapping bug."))
- qdel(contract)
- if("fail_garage")
- to_chat(user, span_warning("No garage area found. This is a mapping bug and should be reported."))
- qdel(contract)
- if("fail_disp")
- to_chat(user, span_warning("Not enough dispensers. This is a mapping bug and should be reported."))
- qdel(contract)
- if("fail_truck")
- to_chat(user, span_warning("Truck spawning failed. This is a mapping bug and should be reported."))
- qdel(contract)
- return
- else
- (to_chat(user,span_notice("A contract was just concluded. There are [time2text((next_delivery_timestamp - world.time),"mm:ss")] left until the next contract can be picked.")))
- else
- to_chat(user,span_notice("There are no contracts available."))
-
-/obj/structure/delivery_board/attackby(obj/item/I, mob/living/user, params)
- if(istype(I,/obj/item/delivery_contract/))
- var/obj/item/delivery_contract/contract_item = I
- if(contract_item.delivery.delivery_employer_tag != delivery_employer_tag)
- to_chat(user,span_warning("This contract does not seem to be from this board."))
- return
- if(contract_item.delivery.check_owner(user) == 0)
- to_chat(user,span_warning("You don't seem to be on this contract. Only the person who signed the cotract can add you."))
- return
- if(contract_item.delivery.delivery_receivers.len == 0)
- if(get_area(contract_item.delivery.active_truck) != contract_item.delivery.garage_area)
- to_chat(user,span_warning("Warning: Truck outside of garage area."))
- if(tgui_alert(user,"Do you wish to finalize the contract?","Finalize Confirm",list("Yes","No"),timeout = 10 SECONDS) == "Yes")
- contract_item.delivery.delivery_finish()
- return
- if(tgui_alert(user,"Do you wish to update the information on the contract?","Contract Update",list("Yes","No"),timeout = 10 SECONDS) == "Yes")
- contract_item.manifest.save_data()
- return
- if(get_area(contract_item.delivery.active_truck) != contract_item.delivery.garage_area)
- to_chat(user,span_warning("Warning: Truck outside of garage area."))
- if(tgui_alert(user,"Do you wish to finalize the contract early?","Finalize Confirm",list("Yes","No"),timeout = 10 SECONDS) == "Yes")
- contract_item.delivery.delivery_finish()
- return
-
- if(istype(I,/obj/item/vamp/keys/cargo_truck))
- var/obj/item/vamp/keys/cargo_truck/truck_keys = I
- if(truck_keys.delivery.delivery_employer_tag != delivery_employer_tag)
- to_chat(user,span_warning("These keys dont's eem to be oes not seem to be from this board."))
- return
- if(tgui_alert(user,"Are you SURE you want to respawn the delivery truck? This will reduce your final grade.","Respawn Truck", list("Yes","No"), timeout = 10 SECONDS) == "Yes")
- var/obj/old_truck = truck_keys.delivery.active_truck
- var/obj/effect/landmark/delivery_truck_beacon/truck_beacon = truck_keys.delivery.truck_spawner
- qdel(old_truck)
- truck_beacon.spawn_truck(truck_keys.delivery)
- . = ..()
-
-
-/obj/structure/delivery_receiver
-
- name = "delivery chute"
- desc = "A chute used to handle bulk deliveries. A standard shipping crate should slide right in."
- anchored = TRUE
- density = FALSE
- icon = 'modular_darkpack/modules/deprecated/icons/props.dmi'
- icon_state = "box_put"
- var/chute_name = "default"
- var/delivery_in_use = 0
- var/receiver_in_use = 0
- var/list/delivery_status = list(
- "red" = 0,
- "blue" = 0,
- "yellow" = 0,
- "green" = 0,
- )
- light_color = "#ffffff"
- light_power = 2
-
-/obj/structure/delivery_receiver/proc/reset_receiver()
- delivery_in_use = 0
- delivery_status = list(
- "red" = 0,
- "blue" = 0,
- "yellow" = 0,
- "green" = 0,
- )
- animate(src, alpha = 0, time = 5 SECONDS)
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- set_light(0)
-
-/obj/structure/delivery_receiver/proc/check_deliveries()
- if(delivery_status["red"] != 0 || delivery_status["blue"] != 0 || delivery_status["yellow"] != 0 || delivery_status["green"] != 0) return 0
- return 1
-
-/obj/structure/delivery_receiver/Initialize(mapload)
- . = ..()
- alpha = 0
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- GLOB.delivery_available_receivers.Add(src)
- name = "[initial(name)] - [capitalize(chute_name)]"
-
-/obj/structure/delivery_receiver/Destroy()
- . = ..()
- GLOB.delivery_available_receivers.Remove(src)
-
-/obj/structure/delivery_receiver/attack_hand(mob/living/user)
- . = ..()
- if(receiver_in_use == 1)
- to_chat(user, span_warning("Someone is already operating this receiver!"))
- if(user.pulling)
- if(delivery_in_use == 0) return
- if(istype(user.pulling,/obj/structure/delivery_crate/))
- var/obj/structure/delivery_crate/pulled_crate = user.pulling
- if(pulled_crate.delivery.check_owner(user) == 0)
- to_chat(user, span_warning("You aren't authorized to handle this delivery. For security reasons, the receiver denies the package."))
- return
- receiver_in_use = 1
- playsound(src,'sound/effects/cargocrate_move.ogg',50,10)
- if(do_after(user, 2 SECONDS, src))
- if(delivery_status[pulled_crate.crate_type] > 0)
- delivery_status[pulled_crate.crate_type] -= 1
- pulled_crate.delivery.delivery_score["delivered_crates"] += 1
- if(check_deliveries() == 1)
- pulled_crate.delivery.receiver_complete(src)
- reset_receiver()
- else
- pulled_crate.delivery.delivery_score["misdelivered_crates"] += 1
- playsound(src,'sound/effects/cargocrate_load.ogg',50,10)
- qdel(pulled_crate)
- receiver_in_use = 0
-
-/obj/structure/delivery_dispenser
-
- name = "Cargo Dispenser"
- desc = "A chute used to handle bulk deliveries. There is a visible keyhole and a small button to push."
- anchored = TRUE
- density = FALSE
- icon = 'modular_darkpack/modules/deprecated/icons/props.dmi'
- icon_state = "box_take"
- var/chute_name = "default"
- var/dispenser_active = 0
- var/dispenser_in_use
- var/delivery_employer_tag
- var/crate_type
- light_color = "#ffffff"
- light_power = 20
-
-/obj/structure/delivery_dispenser/Initialize(mapload)
- . = ..()
- GLOB.delivery_available_dispensers.Add(src)
- alpha = 0
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- name = "[initial(name)] - [capitalize(chute_name)]]"
-
-/obj/structure/delivery_dispenser/Destroy()
- . = ..()
- GLOB.delivery_available_dispensers.Remove(src)
-
-/obj/structure/delivery_dispenser/proc/reset_dispenser()
- dispenser_active = 0
- crate_type = null
- light_color = initial(light_color)
- set_light(0)
- animate(src,alpha = 0,5 SECONDS)
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
-
-/obj/structure/delivery_dispenser/proc/dispense_cargo(obj/truck_key, turf/target_turf)
- if(!truck_key) return
- var/obj/item/vamp/keys/cargo_truck/key_item = truck_key
- var/obj/structure/delivery_crate/dispensed_crate = new(target_turf)
- dispensed_crate.crate_type = crate_type
- dispensed_crate.delivery = key_item.delivery
- dispensed_crate.source_dispenser = src
- dispensed_crate.name += " - [key_item.delivery.crate_designations["[crate_type]"]["cargo_name"]]"
- dispensed_crate.color = key_item.delivery.crate_designations["[crate_type]"]["color"]
- dispensed_crate.desc += " [key_item.delivery.crate_designations["[crate_type]"]["desc"]]"
- dispensed_crate.update_icon()
- playsound(src,'sound/effects/cargocrate_unload.ogg',50,10)
- key_item.delivery.delivery_score["dispensed_crates"] += 1
-
-/obj/structure/delivery_dispenser/attack_hand(mob/living/user)
- . = ..()
- if(dispenser_active == 0)
- to_chat(user, span_notice("The device seems to be offline."))
- return
- if(dispenser_in_use == 1)
- to_chat(user, span_warning("Someone is already using this dispenser!"))
- return
- if(user.pulling == null)
- to_chat(user, span_notice("It appears that you need to use a key to operate this dispenser. If you are on a delivery, use the key you got when you signed up or were added to the contract."))
- return
- if(user.pulling != null)
- if(istype(user.pulling, /obj/structure/delivery_crate))
- var/obj/structure/delivery_crate/pulled_crate = user.pulling
- if(pulled_crate.source_dispenser == src)
- dispenser_in_use = 1
- playsound(src,'sound/effects/cargocrate_move.ogg',50,10)
- if(do_after(user, 2 SECONDS, src))
- pulled_crate.delivery.delivery_score["dispensed_crates"] -= 1
- playsound(src,'sound/effects/cargocrate_load.ogg',50,10)
- qdel(pulled_crate)
- dispenser_in_use = 0
-
-/obj/structure/delivery_dispenser/attackby(obj/item/I, mob/living/user, params)
- . = ..()
- if(dispenser_in_use == 1)
- to_chat(user, span_warning("Someone is already using this dispenser!"))
- return
- if(istype(I,/obj/item/vamp/keys/cargo_truck))
- var/obj/item/vamp/keys/cargo_truck/truck_key = I
- if(truck_key.delivery == null)
- to_chat(user,span_warning("Error, delivery data missing. This is a bug."))
- return
- if(truck_key.delivery.delivery_dispensers.Find(src) == 0)
- to_chat(user,span_notice("They key does not seem to work in this dispenser."))
- return
- var/turf/user_turf = get_turf(user)
- for(var/obj/structure/delivery_crate/potential_crate in user_turf.contents)
- to_chat(user, span_warning("There is already a crate on the ground here!"))
- return
- dispenser_in_use = 1
- playsound(src,'sound/effects/cargocrate_move.ogg',50,10)
- if(do_after(user, 2 SECONDS, src))
- dispense_cargo(truck_key,user_turf)
- dispenser_in_use = 0
-
-/obj/structure/delivery_crate
-
- name = "delivery crate"
- desc = "A sealed crate, ready for transport and delivery."
- anchored = FALSE
- density = TRUE
- icon = 'icons/obj/crates.dmi'
- icon_state = "crate"
- var/datum/delivery_datum/delivery
- var/obj/structure/delivery_dispenser/source_dispenser
- var/crate_type
-
-/obj/structure/delivery_crate/Initialize(mapload)
- if(crate_type) name = initial(name) + " - [crate_type]"
- AddElement(/datum/element/climbable)
- . = ..()
-
-/obj/structure/delivery_crate/Destroy()
- if(delivery)
- delivery.active_crates.Remove(src)
- delivery = null
- . = ..()
-
-/obj/darkpack_car/delivery_truck
- name = "delivery truck"
- desc = "A truck with specially prepared racks in the back allowing for easy storage and retrieval of delivery packages."
- icon_state = "track"
- max_passengers = 4
- component_type = null
- baggage_limit = 0
- baggage_max = null
- var/delivery_capacity = 20
- var/datum/delivery_datum/delivery
- var/datum/delivery_storage/delivery_trunk
-
-/obj/darkpack_car/delivery_truck/Destroy()
- if(delivery)
- if(delivery.active_truck == src) delivery.active_truck = null
- delivery = null
- qdel(delivery_trunk)
- . = ..()
-
-
-/obj/darkpack_car/delivery_truck/Initialize(mapload)
- . = ..()
- delivery_trunk = new(src,delivery_capacity)
-
-/obj/darkpack_car/delivery_truck/ComponentInitialize(mapload)
- return
-
-/obj/darkpack_car/delivery_truck/attack_hand(mob/user)
- . = ..()
- if(locked == TRUE)
- to_chat(user,span_warning("The truck is locked!"))
- return
- if(user.pulling == null)
- if(delivery_trunk.storage.len == 0)
- to_chat(user, span_notice("There is nothing in the back of the truck."))
- return
- var/turf/user_turf = get_turf(user)
- for(var/obj/structure/delivery_crate/potential_crate in user_turf.contents)
- to_chat(user, span_warning("There is already a crate on the ground here!"))
- return
- delivery_trunk.retrieval_menu(user)
- else
- var/obj/structure/delivery_crate/pulled_crate = user.pulling
- if(!pulled_crate)
- to_chat(user, span_warning("The special compartments in the back dont really fit anything other than delivery crates. Use a nomral truck for other cargo."))
- return
- else
- playsound(src,'sound/effects/cargocrate_move.ogg',50,10)
- if(do_after(user, 2 SECONDS, pulled_crate))
- playsound(src,'sound/effects/cargocrate_load.ogg',50,10)
- delivery_trunk.add_to_storage(user,pulled_crate)
-
-/obj/effect/landmark/delivery_truck_beacon
- name = "delivery truck spawner"
- icon = 'icons/effects/landmarks_static.dmi'
- icon_state = "x4"
- invisibility = 101
- density = FALSE
- var/spawn_dir = NORTH
- var/delivery_employer_tag = "default"
-
-/obj/effect/landmark/delivery_truck_beacon/proc/spawn_truck(datum/linked_datum)
- if(!linked_datum) return
- var/turf/local_turf = get_turf(src)
- var/obj/darkpack_car/delivery_truck/spawned_truck = new(local_turf)
- spawned_truck.dir = spawn_dir
- switch(spawn_dir)
- if(NORTH)
- spawned_truck.movement_vector = 0
- if(SOUTH)
- spawned_truck.movement_vector = 180
- if(EAST)
- spawned_truck.movement_vector = 90
- if(WEST)
- spawned_truck.movement_vector = 270
- spawned_truck.delivery = linked_datum
- spawned_truck.delivery.active_truck = spawned_truck
- spawned_truck.locked = TRUE
- spawned_truck.access = spawned_truck.delivery.delivery_employer_tag
- var/obj/item/vamp/keys/cargo_truck/spawned_keys = new(local_turf)
- spawned_keys.delivery = linked_datum
- spawned_keys.owner = spawned_keys.delivery.original_owner
- spawned_keys.accesslocks = list(spawned_truck.delivery.delivery_employer_tag)
- spawned_truck.delivery.spawned_keys.Add(spawned_keys)
- spawned_truck.delivery.original_owner.put_in_hands(spawned_keys)
-
-/obj/effect/landmark/delivery_truck_beacon/Initialize(mapload)
- GLOB.delivery_available_veh_spawners.Add(src)
- . = ..()
-
-/obj/effect/landmark/delivery_truck_beacon/Destroy()
- GLOB.delivery_available_veh_spawners.Remove(src)
- . = ..()
-
-/obj/item/vamp/keys/cargo_truck
-
- var/datum/delivery_datum/delivery
- var/mob/living/owner
-
-/obj/item/vamp/keys/cargo_truck/Destroy()
- if(delivery)
- delivery.spawned_keys.Remove(src)
- delivery = null
- . = ..()
diff --git a/modular_darkpack/modules/doors/code/keys/keys.dm b/modular_darkpack/modules/doors/code/keys/keys.dm
index 4a1976b572a8..354e585e2746 100644
--- a/modular_darkpack/modules/doors/code/keys/keys.dm
+++ b/modular_darkpack/modules/doors/code/keys/keys.dm
@@ -61,6 +61,7 @@
LOCKACCESS_JAZZ_CLUB,
LOCKACCESS_PRIMOGEN,
LOCKACCESS_JAZZ_CLUB_DELIVERY,
+ LOCKACCESS_PRINCE,
)
color = "#bd3327"
@@ -318,6 +319,12 @@
)
color = "#6a2e1d"
+/obj/item/vamp/keys/setite
+ name = "setite keys"
+ accesslocks = list(
+ LOCKACCESS_SETITE
+ )
+
//===========================CLINIC KEYS===========================
/obj/item/vamp/keys/clinic
name = "clinic keys"
diff --git a/modular_darkpack/modules/doors/code/vampdoor.dm b/modular_darkpack/modules/doors/code/vampdoor.dm
index 6ea11036e7a5..1158f4192fdd 100644
--- a/modular_darkpack/modules/doors/code/vampdoor.dm
+++ b/modular_darkpack/modules/doors/code/vampdoor.dm
@@ -112,14 +112,15 @@
/obj/structure/vampdoor/atom_break(damage_flag)
. = ..()
- if(!door_broken)
- break_door()
+ break_door()
/obj/structure/vampdoor/atom_fix()
. = ..()
fix_door()
/obj/structure/vampdoor/proc/break_door(mob/user)
+ if(door_broken)
+ return FALSE
playsound(get_turf(src), 'modular_darkpack/master_files/sounds/effects/door/get_bent.ogg', 100, FALSE)
var/obj/item/shield/door/broken_door = new(get_turf(src))
broken_door.icon_state = base_icon_state
@@ -136,6 +137,7 @@
locked = FALSE
icon_state = "[base_icon_state]-b"
update_icon()
+ return TRUE
/obj/structure/vampdoor/proc/fix_door()
name = initial(name)
@@ -194,10 +196,10 @@
. = ..()
if(.)
return
- var/mob/living/living_user = user
if(door_broken)
to_chat(user, span_warning("There is no door to use here."))
return
+ var/mob/living/living_user = user
if(living_user.combat_mode)
pixel_z = pixel_z+rand(-1, 1)
pixel_w = pixel_w+rand(-1, 1)
@@ -214,6 +216,9 @@
. = ..()
if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN)
return
+ if(door_broken)
+ to_chat(user, span_warning("There is no door to use here."))
+ return
var/mob/living/living_user = user
if(living_user.combat_mode)
if(ishuman(user))
diff --git a/modular_darkpack/modules/drugs/code/meth/pills.dm b/modular_darkpack/modules/drugs/code/meth/pills.dm
index d330debb8fbc..042b43959061 100644
--- a/modular_darkpack/modules/drugs/code/meth/pills.dm
+++ b/modular_darkpack/modules/drugs/code/meth/pills.dm
@@ -3,7 +3,7 @@
desc = "There is opium attention sign on the top."
spawn_count = 10
spawn_type = /obj/item/reagent_containers/applicator/pill/ephedrine
- custom_price = 200 // DARKPACK EDIT ADD - ECONOMY
+ custom_price = 200
/obj/item/reagent_containers/applicator/pill/ephedrine
name = "ephedrine pill"
diff --git a/modular_darkpack/modules/drugs/code/weed/bong.dm b/modular_darkpack/modules/drugs/code/weed/bong.dm
index 0a523d9ce054..36974f94ccc6 100644
--- a/modular_darkpack/modules/drugs/code/weed/bong.dm
+++ b/modular_darkpack/modules/drugs/code/weed/bong.dm
@@ -133,6 +133,10 @@
if(flavor_text)
visible_message(flavor_text)
+ if(iscarbon(loc))
+ var/mob/living/carbon/smoker = loc
+ smoker.trigger_rotschreck(src, 3)
+
/obj/item/bong/proc/put_out()
set_light_on(FALSE)
lit = FALSE
diff --git a/modular_darkpack/modules/drugs/code/weed/fake_steam.dm b/modular_darkpack/modules/drugs/code/weed/fake_steam.dm
index 561d5a545fdd..87ef36ba0789 100644
--- a/modular_darkpack/modules/drugs/code/weed/fake_steam.dm
+++ b/modular_darkpack/modules/drugs/code/weed/fake_steam.dm
@@ -21,7 +21,7 @@
STOP_PROCESSING(SSobj, src)
return ..()
-/obj/effect/abstract/fake_steam/process()
+/obj/effect/abstract/fake_steam/process(seconds_per_tick)
if(next_stage_down > world.time)
return
stage_down()
diff --git a/modular_darkpack/modules/electricity/code/fusebox.dm b/modular_darkpack/modules/electricity/code/fusebox.dm
index a0bbd69e9226..e5e322382fee 100644
--- a/modular_darkpack/modules/electricity/code/fusebox.dm
+++ b/modular_darkpack/modules/electricity/code/fusebox.dm
@@ -1,3 +1,5 @@
+GLOBAL_LIST_EMPTY(fuseboxes)
+
// The way this completely bypasses the entire power system is so strange
/obj/fusebox
name = "fuse box"
@@ -7,50 +9,68 @@
base_icon_state = "fusebox"
layer = SIGN_LAYER
anchored = TRUE
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF
pixel_y = 32
-
+ max_integrity = 100
+ prevent_destruction = TRUE
//Damage on the fusebox
var/damaged = 0
- //If our door is open/closed. bool
- var/open = FALSE
//Repairing var for the loop
var/repairing = FALSE
//Soundloop for Transformers
var/datum/looping_sound/generator/soundloop
+/obj/fusebox/Initialize(mapload)
+ . = ..()
+ GLOB.fuseboxes += src
+
+/obj/fusebox/atom_destruction(damage_flag)
+ . = ..()
+ power_off()
+
+
+//they shouldnt really ever be destroyed, but...
+/obj/fusebox/Destroy()
+ GLOB.fuseboxes -= src
+ return ..()
+
/obj/fusebox/update_icon_state()
. = ..()
- if(damaged > 100)
+ if(atom_integrity <= 0)
icon_state = "[base_icon_state]_off"
else
icon_state = base_icon_state
/obj/fusebox/proc/update_sound_state()
if(!isnull(soundloop))
- if(damaged > 100)
+ if(atom_integrity <= 0)
soundloop.stop()
else
soundloop.start(src)
-/obj/fusebox/proc/check_damage(mob/living/user)
- if(damaged > 100 && !open)
- open = TRUE
- var/area/power_area = get_area(src)
- power_area.power_light = FALSE
- power_area.power_equip = FALSE
- power_area.power_environ = FALSE
- power_area.power_change()
- power_area.fire_controled = FALSE
- var/datum/effect_system/basic/spark_spread/local_spark = new(get_turf(src), 5, 1)
- local_spark.start()
- for(var/obj/machinery/light/L in power_area)
- L.update(FALSE)
- playsound(loc, 'modular_darkpack/modules/electricity/sounds/generator_break.ogg', 100, TRUE)
- user?.electrocute_act(50, src, siemens_coeff = 1, flags = NONE)
+/obj/fusebox/proc/power_off()
+ var/area/power_area = get_area(src)
+ power_area.power_light = FALSE
+ power_area.power_equip = FALSE
+ power_area.power_environ = FALSE
+ power_area.power_change()
+ power_area.fire_controled = FALSE
+ var/datum/effect_system/basic/spark_spread/local_spark = new(get_turf(src), 5, 1)
+ local_spark.start()
+ for(var/obj/machinery/light/L in power_area)
+ L.update(FALSE)
+ playsound(loc, 'modular_darkpack/modules/electricity/sounds/generator_break.ogg', 100, TRUE)
+ for(var/mob/living/M in range(1, src))
+ M.electrocute_act(50, src, siemens_coeff = 1, flags = NONE)
update_icon()
update_sound_state()
+/datum/storyteller_roll/fusebox_repair
+ bumper_text = "electrical repair"
+ applicable_stats = list(STAT_INTELLIGENCE, STAT_TECHNOLOGY)
+ difficulty = 7
+ numerical = TRUE
+
/obj/fusebox/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
if(tool.tool_behaviour == TOOL_WIRECUTTER)
if(!repairing)
@@ -59,32 +79,31 @@
repairing = FALSE
return ITEM_INTERACT_BLOCKING
- damaged = 0
- update_icon_state()
- update_sound_state()
- playsound(get_turf(src),'modular_darkpack/modules/electricity/sounds/fusebox_fix.ogg', 50, FALSE)
- var/area/power_area = get_area(src)
- power_area.power_light = TRUE
- power_area.power_equip = TRUE
- power_area.power_environ = TRUE
- power_area.power_change()
- if(initial(power_area.fire_controled))
- power_area.fire_controled = TRUE
- for(var/obj/machinery/light/L in power_area)
- L.update(FALSE)
+ var/datum/storyteller_roll/fusebox_repair/fusebox_roll = new()
+ var/successes = fusebox_roll.st_roll(user, src)
+ var/repair_amount = successes * 40
+ if(repair_amount > 0)
+ repair_damage(repair_amount)
+ update_icon_state()
+ update_sound_state()
+ playsound(get_turf(src), 'modular_darkpack/modules/electricity/sounds/fusebox_fix.ogg', 50, FALSE)
+ var/area/power_area = get_area(src)
+ power_area.power_light = TRUE
+ power_area.power_equip = TRUE
+ power_area.power_environ = TRUE
+ power_area.power_change()
+ if(initial(power_area.fire_controled))
+ power_area.fire_controled = TRUE
+ for(var/obj/machinery/light/L in power_area)
+ L.update(FALSE)
- repairing = FALSE
- return ITEM_INTERACT_SUCCESS
+ repairing = FALSE
+ return ITEM_INTERACT_SUCCESS
+ if(repair_amount <= 0)
+ user.electrocute_act(50, src, siemens_coeff = 1, flags = NONE)
return NONE
-// This sucks. Snowflaking its own integrity system is always bad.
-/obj/fusebox/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
- . = ..()
- if(attacking_item.force)
- damaged += attacking_item.force
- check_damage(user)
-
// transformers (another type of fusebox)
/obj/fusebox/transformer
name = "transformer"
@@ -96,4 +115,3 @@
/obj/fusebox/transformer/Initialize(mapload)
. = ..()
soundloop = new(src, TRUE)
-
diff --git a/modular_darkpack/modules/ert/code/items/first_team.dm b/modular_darkpack/modules/ert/code/items/first_team.dm
index f48bc483bc03..6db3421e5cce 100644
--- a/modular_darkpack/modules/ert/code/items/first_team.dm
+++ b/modular_darkpack/modules/ert/code/items/first_team.dm
@@ -19,12 +19,11 @@
inhand_icon_state = null
gender = PLURAL
ONFLOOR_ICON_HELPER('modular_darkpack/modules/ert/icons/onfloor.dmi')
-
+ brand = "pentex"
/obj/item/clothing/shoes/vampire/darkpack_ert/firstteam
name = "\improper First team boots"
desc = "Pitch-black boots with hard, industrial laces."
- icon_state = "ftboots"
armor_type = /datum/armor/shoes_jackboots
//------------GLOVES------------
@@ -35,12 +34,11 @@
ONFLOOR_ICON_HELPER('modular_darkpack/modules/ert/icons/onfloor.dmi')
icon_state = "ftgloves"
undyeable = TRUE
-
+ brand = "pentex"
/obj/item/clothing/gloves/vampire/darkpack_ert/firstteam
name = "\improper First Team gloves"
desc = "Provides protection from the good, the bad and the ugly."
- icon_state = "ftgloves"
body_parts_covered = HANDS
armor_type = /datum/armor/gloves_combat
@@ -52,11 +50,11 @@
inhand_icon_state = null
worn_icon = 'modular_darkpack/modules/ert/icons/worn.dmi'
ONFLOOR_ICON_HELPER('modular_darkpack/modules/ert/icons/onfloor.dmi')
+ brand = "pentex"
/obj/item/clothing/head/vampire/darkpack_ert/firstteam_helmet
name = "\improper First Team helmet"
desc = "A black helmet with two, green-glowing eye-pieces that seem to stare through your soul."
- icon_state = "fthelmet"
armor_type = /datum/armor/first_team
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR
visor_flags_inv = HIDEFACE|HIDESNOUT
@@ -66,7 +64,7 @@
//------------ARMOR------------
/obj/item/clothing/suit/vampire/darkpack_ert
- icon_state = "ftuni"
+ icon_state = "ftarmor"
icon = 'modular_darkpack/modules/ert/icons/clothing.dmi'
worn_icon = 'modular_darkpack/modules/ert/icons/worn.dmi'
ONFLOOR_ICON_HELPER('modular_darkpack/modules/ert/icons/onfloor.dmi')
@@ -79,6 +77,7 @@
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
max_integrity = 250
resistance_flags = NONE
+ brand = "pentex"
/obj/item/clothing/suit/vampire/darkpack_ert/Initialize()
. = ..()
@@ -88,7 +87,6 @@
/obj/item/clothing/suit/vampire/darkpack_ert/firstteam_armor
name = "\improper First Team Armoured Vest"
desc = "A strong looking, armoured-vest with a large '1' engraved onto the breast."
- icon_state = "ftarmor"
inhand_icon_state = null
armor_type = /datum/armor/first_team
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
@@ -108,7 +106,7 @@
icon = 'modular_darkpack/modules/ert/icons/clothing.dmi'
worn_icon = 'modular_darkpack/modules/ert/icons/worn.dmi'
ONFLOOR_ICON_HELPER('modular_darkpack/modules/ert/icons/onfloor.dmi')
-
+ brand = "pentex"
/obj/item/clothing/under/vampire/darkpack_ert/Initialize()
. = ..()
@@ -117,13 +115,14 @@
/obj/item/clothing/under/vampire/darkpack_ert/firstteam_uniform
name = "First Team uniform"
desc = "A completely blacked out uniform with a large '1' symbol sewn onto the shoulder-pad."
- icon_state = "ftuni"
armor_type = /datum/armor/clothing_under/security_head_of_security
+ brand = "pentex"
//------------Glasses------------
/obj/item/clothing/glasses/night/thermal
vision_flags = SEE_MOBS
+// brand = "mars" // TODO: implement the rest of the non-top 21 pentex subsids
//------------Weapons------------/obj/item/ammo_casing/vampire/c12gvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
/obj/item/ammo_box/darkpack/c556/bale //DONT EVER PUT THIS IN A MAP
@@ -179,6 +178,7 @@
ONFLOOR_ICON_HELPER('modular_darkpack/modules/ert/icons/onfloor.dmi')
icon_state = "f12"
base_icon_state = "f12"
+// brand = "fullforce" // TODO: implement the rest of the non-top 21 pentex subsids
/obj/projectile/bullet/darkpack/f12g
name = "12g explosive slug"
@@ -186,6 +186,7 @@
armour_penetration = 50
exposed_wound_bonus = 10
wound_bonus = 5
+// brand = "fullforce" // TODO: implement the rest of the non-top 21 pentex subsids
/obj/projectile/bullet/darkpack/f12g/on_hit(atom/target, blocked = 0, pierce_hit)
..()
@@ -199,6 +200,7 @@
icon_state = "12box_frag"
ammo_type = /obj/item/ammo_casing/vampire/c12g/f12g
max_ammo = 40
+// brand = "fullforce" // TODO: implement the rest of the non-top 21 pentex subsids
/obj/item/ammo_box/magazine/darkpack/px66f
name = "\improper PX66F magazine (5.56mm)"
@@ -212,6 +214,7 @@
caliber = CALIBER_556NATO
max_ammo = 30
multiple_sprites = AMMO_BOX_FULL_EMPTY
+// brand = "fullforce" // TODO: implement the rest of the non-top 21 pentex subsids
/obj/item/ammo_box/magazine/darkpack/px249f
name = "\improper PX249F box magazine (5.56mm)"
@@ -225,6 +228,7 @@
caliber = CALIBER_556NATO
max_ammo = 200
multiple_sprites = AMMO_BOX_FULL_EMPTY
+// brand = "fullforce" // TODO: implement the rest of the non-top 21 pentex subsids
/obj/item/ammo_box/magazine/internal/px12r
name = "shotgun internal magazine"
@@ -243,14 +247,17 @@
caliber = CALIBER_45
max_ammo = 12
multiple_sprites = AMMO_BOX_FULL_EMPTY
+ brand = "herculean"
/obj/item/ammo_box/magazine/darkpack/mk23/silver
name = "automatic pistol magazine (.45 ACP Silver)"
ammo_type = /obj/item/ammo_casing/vampire/c45acp/silver
+ brand = "herculean"
/obj/item/ammo_box/magazine/darkpack/mk23/hp
name = "automatic pistol magazine (.45 ACP HP)"
ammo_type = /obj/item/ammo_casing/vampire/c45acp/HP
+ brand = "herculean"
/obj/item/gun/ballistic/automatic/pistol/darkpack/mk23_socom
name = "\improper Mark 23 SOCOM Pistol"
@@ -273,6 +280,7 @@
can_suppress = FALSE
can_unsuppress = FALSE
fire_sound = 'modular_darkpack/modules/weapons/sounds/glock.ogg' //Doesnt matter when it's always using the supressed SFX
+ brand = "herculean"
/obj/item/gun/ballistic/automatic/darkpack/px66f //DO NOT DISTRIBUTE IN MAPPING
name = "\improper PX66F Rifle"
@@ -297,6 +305,7 @@
can_suppress = FALSE
fire_sound = 'modular_darkpack/modules/ert/sounds/silenced_rifle.ogg'
masquerade_violating = TRUE
+// brand = "fullforce" // TODO: implement the rest of the non-top 21 pentex subsids
/obj/item/gun/ballistic/automatic/darkpack/px66f/Initialize()
. = ..()
@@ -325,7 +334,7 @@
rack_sound = 'modular_darkpack/modules/ert/sounds/cycling.ogg'
inhand_x_dimension = 32
inhand_y_dimension = 32
-
+// brand = "fullforce" // TODO: implement the rest of the non-top 21 pentex subsids
/obj/item/gun/ballistic/automatic/l6_saw/darkpack
name = "\improper PX249F Light Machine Gun"
@@ -349,6 +358,7 @@
spread = 6
fire_sound = 'modular_darkpack/modules/ert/sounds/m249fire.ogg'
rack_sound = 'modular_darkpack/modules/ert/sounds/m249rack.ogg'
+// brand = "fullforce" // TODO: implement the rest of the non-top 21 pentex subsids
/obj/item/gun/ballistic/automatic/l6_saw/darkpack/update_icon_state()
. = ..()
diff --git a/modular_darkpack/modules/events/attributions.txt b/modular_darkpack/modules/events/attributions.txt
new file mode 100644
index 000000000000..9184d81866e8
--- /dev/null
+++ b/modular_darkpack/modules/events/attributions.txt
@@ -0,0 +1,2 @@
+thank you to yfjesse on freesound.org for news_notification.ogg
+https://freesound.org/people/yfjesse/sounds/235911/
diff --git a/modular_darkpack/modules/events/code/_darkpack_event.dm b/modular_darkpack/modules/events/code/_darkpack_event.dm
new file mode 100644
index 000000000000..7e354a05fced
--- /dev/null
+++ b/modular_darkpack/modules/events/code/_darkpack_event.dm
@@ -0,0 +1,4 @@
+/datum/round_event_control/darkpack
+ darkpack_allowed = TRUE
+
+// note - no need for a /datum/round_event/darkpack subtype. they only fire if the above exists.
diff --git a/modular_darkpack/modules/events/code/blackout_event.dm b/modular_darkpack/modules/events/code/blackout_event.dm
new file mode 100644
index 000000000000..ab7036ba74d3
--- /dev/null
+++ b/modular_darkpack/modules/events/code/blackout_event.dm
@@ -0,0 +1,30 @@
+/datum/round_event_control/darkpack/blackout
+ name = "Blackout"
+ typepath = /datum/round_event/blackout
+ weight = 6
+ min_players = 5
+ max_occurrences = 2
+ earliest_start = 10 MINUTES
+ category = EVENT_CATEGORY_ENGINEERING
+ description = "A cascading failure in the city's power grid."
+ darkpack_allowed = TRUE
+
+/datum/round_event/blackout
+ start_when = 1
+ announce_when = 5
+
+/datum/round_event/blackout/announce(fake)
+ priority_announce(
+ "A breaking news notification has appeared on your phone - rolling blackouts are affecting your area due to inclement weather.",
+ "Local BREAKING NEWS Alert",
+ 'modular_darkpack/modules/events/sounds/news_notification.ogg',
+ ANNOUNCEMENT_TYPE_PRIORITY,
+ color_override = "red",
+ )
+
+/datum/round_event/blackout/start()
+ for(var/obj/fusebox/F in GLOB.fuseboxes)
+ if(prob(50))
+ continue
+ F.take_damage(101)
+ F.power_off()
diff --git a/modular_darkpack/modules/events/sounds/news_notification.ogg b/modular_darkpack/modules/events/sounds/news_notification.ogg
new file mode 100644
index 000000000000..571fecf098e1
Binary files /dev/null and b/modular_darkpack/modules/events/sounds/news_notification.ogg differ
diff --git a/modular_darkpack/modules/external_organs/code/gargoyle_wings.dm b/modular_darkpack/modules/external_organs/code/gargoyle_wings.dm
index 5f287aa8bc52..2757626ddb7d 100644
--- a/modular_darkpack/modules/external_organs/code/gargoyle_wings.dm
+++ b/modular_darkpack/modules/external_organs/code/gargoyle_wings.dm
@@ -4,11 +4,90 @@
restyle_flags = EXTERNAL_RESTYLE_FLESH
bodypart_overlay = /datum/bodypart_overlay/mutant/wings/functional/gargoyle
sprite_accessory_override = /datum/sprite_accessory/wings/gargoyle
+ var/datum/action/innate/toggle_gargoyle_wings/toggle
/datum/bodypart_overlay/mutant/wings/functional/gargoyle
+ var/hidden = FALSE
+
+//using parent's example with open or closed wings
+/datum/bodypart_overlay/mutant/wings/functional/gargoyle/generate_icon_cache()
+ . = ..()
+ . += hidden ? "hidden" : "visible"
/datum/bodypart_overlay/mutant/wings/functional/gargoyle/get_image(image_layer, obj/item/bodypart/limb)
+ if(hidden)
+ var/mutable_appearance/appearance = ..()
+ appearance.alpha = 0
+ return appearance
// parent handles appearance we just need to offset
var/mutable_appearance/appearance = ..()
appearance.pixel_x = -16
return appearance
+
+/obj/item/organ/wings/functional/gargoyle/can_fly()
+ var/datum/bodypart_overlay/mutant/wings/functional/gargoyle/overlay = bodypart_overlay
+ if(overlay.hidden)
+ to_chat(owner, span_warning("Your wings are tucked away!"))
+ return FALSE
+ return ..()
+
+/obj/item/organ/wings/functional/gargoyle/open_wings()
+ . = ..()
+ flap_sound_loop()
+
+/obj/item/organ/wings/functional/gargoyle/proc/flap_sound_loop()
+ if(!wings_open) // a little weird here but since garg wings can be tucked/untucked/flapping we're using parent type's wings_open and wings_closed for flapping and 'hidden' for tucked/untucked...
+ return
+ playsound(owner, 'modular_darkpack/modules/external_organs/sounds/wing_flap_flying.ogg', 50, TRUE)
+ addtimer(CALLBACK(src, PROC_REF(flap_sound_loop)), 2 SECONDS)
+
+/obj/item/organ/wings/functional/gargoyle/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags)
+ . = ..()
+ if(!toggle)
+ toggle = new
+ toggle.Grant(organ_owner)
+
+/obj/item/organ/wings/functional/gargoyle/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
+ . = ..()
+ if(wings_open)
+ toggle_flight(organ_owner)
+ toggle?.Remove(organ_owner)
+
+/obj/item/organ/wings/functional/gargoyle/Destroy()
+ QDEL_NULL(toggle)
+ return ..()
+
+/datum/action/innate/toggle_gargoyle_wings
+ name = "Toggle Wings"
+ check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_IMMOBILE|AB_CHECK_INCAPACITATED
+ button_icon = 'modular_darkpack/master_files/icons/hud/actions.dmi'
+ button_icon_state = "wings"
+
+/datum/action/innate/toggle_gargoyle_wings/Activate()
+ var/mob/living/carbon/human/human = owner
+ var/obj/item/organ/wings/functional/gargoyle/wings = human.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
+ if(!wings)
+ return
+
+ if(wings.wings_open) // if flying
+ to_chat(human, span_warning("You can't fold your wings while flying!"))
+ return
+
+ var/datum/bodypart_overlay/mutant/wings/functional/gargoyle/overlay = wings.bodypart_overlay
+
+ if(overlay.hidden) // if tucked
+ to_chat(human, span_notice("You slowly unfurl your wings..."))
+ if(!do_after(human, 4 SECONDS, human))
+ return
+ playsound(human, 'modular_darkpack/modules/external_organs/sounds/wing_close_open_wings.ogg', 50, TRUE)
+ overlay.hidden = FALSE
+ to_chat(human, span_notice("Your wings spread open!"))
+ else // if untucked
+ to_chat(human, span_notice("You slowly fold your wings away..."))
+ if(!do_after(human, 4 SECONDS, human))
+ return
+ playsound(human, 'modular_darkpack/modules/external_organs/sounds/wing_close_open_wings.ogg', 50, TRUE)
+ overlay.hidden = TRUE
+ to_chat(human, span_notice("Your wings tuck neatly against your back."))
+
+ human.update_body_parts()
diff --git a/modular_darkpack/modules/external_organs/sounds/attributions.txt b/modular_darkpack/modules/external_organs/sounds/attributions.txt
new file mode 100644
index 000000000000..5208b2af7fd3
--- /dev/null
+++ b/modular_darkpack/modules/external_organs/sounds/attributions.txt
@@ -0,0 +1,6 @@
+sound credits -
+
+thank you to ani_music on freesound.org https://freesound.org/people/ani_music/sounds/244982/ for wing_flap_flying.ogg
+
+and thank you to amberbeata on freesound.org https://freesound.org/people/amberbeata/sounds/837042/ for wing_close_open_wings.ogg
+
diff --git a/modular_darkpack/modules/external_organs/sounds/wing_close_open_wings.ogg b/modular_darkpack/modules/external_organs/sounds/wing_close_open_wings.ogg
new file mode 100644
index 000000000000..399fdc7eb22c
Binary files /dev/null and b/modular_darkpack/modules/external_organs/sounds/wing_close_open_wings.ogg differ
diff --git a/modular_darkpack/modules/external_organs/sounds/wing_flap_flying.ogg b/modular_darkpack/modules/external_organs/sounds/wing_flap_flying.ogg
new file mode 100644
index 000000000000..bcf589bfddf8
Binary files /dev/null and b/modular_darkpack/modules/external_organs/sounds/wing_flap_flying.ogg differ
diff --git a/modular_darkpack/modules/food/code/drinks.dm b/modular_darkpack/modules/food/code/drinks.dm
index a3f61e975801..64cefd75bf16 100644
--- a/modular_darkpack/modules/food/code/drinks.dm
+++ b/modular_darkpack/modules/food/code/drinks.dm
@@ -1,10 +1,3 @@
-//---------VENDORS---------//
-/obj/machinery/vending/boozeomat/Initialize()
- . = ..()
- all_products_free = TRUE
- product_slogans = null
- product_ads = null
-
//---------DRINKS---------//
/obj/item/reagent_containers/cup/glass/coffee/vampire
diff --git a/modular_darkpack/modules/frenzy/code/frenzy.dm b/modular_darkpack/modules/frenzy/code/frenzy.dm
index 5328394ba324..ebc982584ce3 100644
--- a/modular_darkpack/modules/frenzy/code/frenzy.dm
+++ b/modular_darkpack/modules/frenzy/code/frenzy.dm
@@ -1,160 +1,143 @@
-//Here's things for future madness
-
-//add_client_colour(/datum/client_colour/glass_colour/red)
-//remove_client_colour(/datum/client_colour/glass_colour/red)
-/client/Click(object,location,control,params)
- if(isatom(object))
- if(ishuman(mob))
- var/mob/living/carbon/human/H = mob
- if(H.in_frenzy)
- return
- ..()
-
-/mob/living/carbon/proc/rollfrenzy()
- if(client)
- if(get_garou_splat(src))
- to_chat(src, "I'm full of [span_danger("ANGER")], and I'm about to flare up in [span_danger("RAGE")]. Rolling...")
- else if(get_kindred_splat(src))
- to_chat(src, "I need [span_danger("BLOOD")]. The [span_danger("BEAST")] is calling. Rolling...")
- else
- to_chat(src, "I'm too [span_danger("AFRAID")] to continue doing this. Rolling...")
- SEND_SOUND(src, sound('modular_darkpack/modules/deprecated/sounds/bloodneed.ogg', volume = 50))
-
- var/check = SSroll.storyteller_roll(max(1, round(humanity/2)), min(frenzy_chance_boost, frenzy_hardness), src)
-
- // Modifier for frenzy duration
- var/length_modifier = HAS_TRAIT(src, TRAIT_LONGER_FRENZY) ? 2 : 1
-
- switch(check)
- if (DICE_CRIT_FAILURE)
- enter_frenzymod()
- addtimer(CALLBACK(src, PROC_REF(exit_frenzymod)), 20 SECONDS * length_modifier)
- frenzy_hardness = 1
- if (DICE_FAILURE)
- enter_frenzymod()
- addtimer(CALLBACK(src, PROC_REF(exit_frenzymod)), 10 SECONDS * length_modifier)
- frenzy_hardness = 1
- if (DICE_CRIT_WIN)
- frenzy_hardness = max(1, frenzy_hardness - 1)
- else
- frenzy_hardness = min(10, frenzy_hardness + 1)
-
-/mob/living/carbon/proc/enter_frenzymod()
- if (in_frenzy)
+// V20 p.298 + W20 p.261
+
+// Fleeing is used for either fox frenzies, or rotschreck
+/mob/living/proc/enter_frenzy_mode(atom/target, fleeing = FALSE, source = "Unknown cause")
+ if(HAS_TRAIT(src, TRAIT_IN_FRENZY))
+ return
+ if(HAS_TRAIT(src, TRAIT_KNOCKEDOUT))
return
+ add_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA), FRENZY_TRAIT)
+ message_admins("[ADMIN_LOOKUPFLW(src)] has entered frenzy[target ? " targeting [ADMIN_LOOKUPFLW(src)]": ""]. ([source])")
+ log_message("entered frenzy.", LOG_GAME)
- SEND_SOUND(src, sound('modular_darkpack/modules/frenzy/sounds/frenzy.ogg', volume = 50))
- in_frenzy = TRUE
- add_client_colour(/datum/client_colour/glass_colour/red)
- demon_chi = 0
- GLOB.frenzy_list += src
-
-/mob/living/carbon/proc/exit_frenzymod()
- if (!in_frenzy)
- return
-
- in_frenzy = FALSE
- remove_client_colour(/datum/client_colour/glass_colour/red)
- GLOB.frenzy_list -= src
-
-/mob/living/carbon/proc/CheckFrenzyMove()
- if(stat >= SOFT_CRIT)
- return TRUE
- if(IsSleeping())
- return TRUE
- if(IsUnconscious())
- return TRUE
- if(IsParalyzed())
- return TRUE
- if(IsKnockdown())
- return TRUE
- if(IsStun())
- return TRUE
- if(HAS_TRAIT(src, TRAIT_RESTRAINED))
- return TRUE
-
-/mob/living/carbon/proc/frenzystep()
- if(!isturf(loc) || CheckFrenzyMove())
- return
- if(move_intent == MOVE_INTENT_WALK)
- toggle_move_intent(src)
- set_glide_size(DELAY_TO_GLIDE_SIZE(cached_multiplicative_slowdown))
-
- var/atom/fear = get_closest_atom(/obj/effect/abstract/turf_fire, view(7, src), src)
-
-// if(!fear && !frenzy_target)
-// return
-
- if(get_kindred_splat(src))
- if(fear)
- step_away(src,fear,99)
- if(prob(25))
- emote("scream")
- else
- var/mob/living/carbon/human/H = src
- if(get_dist(frenzy_target, src) <= 1)
- if(isliving(frenzy_target))
- var/mob/living/L = frenzy_target
- if(L.bloodpool && L.stat != DEAD && last_drinkblood_use+95 <= world.time)
- L.grabbedby(src)
- if(ishuman(L))
- L.emote("scream")
- var/mob/living/carbon/human/BT = L
- BT.add_bite_animation()
- if(CheckEyewitness(L, src, 7, FALSE))
- H.adjust_masquerade(-1)
- playsound(src, 'modular_darkpack/modules/deprecated/sounds/drinkblood1.ogg', 50, TRUE)
- L.visible_message(span_warning("[src] bites [L]'s neck!"), span_warning("[src] bites your neck!"))
- face_atom(L)
- H.vamp_bite()
- else
- step_to(src,frenzy_target,0)
- face_atom(frenzy_target)
- else
- if(get_dist(frenzy_target, src) <= 1)
- if(isliving(frenzy_target))
- var/mob/living/L = frenzy_target
- if(L.stat != DEAD)
- a_intent = INTENT_HARM
- if(last_rage_hit+5 < world.time)
- last_rage_hit = world.time
- UnarmedAttack(L)
- else
- step_to(src,frenzy_target,0)
- face_atom(frenzy_target)
-
-/mob/living/carbon/proc/get_frenzy_targets()
- var/list/targets = list()
- if(get_kindred_splat(src))
- for(var/mob/living/L in oviewers(DEFAULT_SIGHT_DISTANCE, src))
- if(!get_kindred_splat(L) && L.bloodpool && L.stat != DEAD)
- targets += L
- if(L == frenzy_target)
- return L
+ if(fleeing)
+ to_chat(src, span_danger("FLEE."))
else
- for(var/mob/living/L in oviewers(DEFAULT_SIGHT_DISTANCE, src))
- if(L.stat != DEAD)
- targets += L
- if(L == frenzy_target)
- return L
- if(length(targets) > 0)
- return pick(targets)
- else
- return null
-
-/mob/living/carbon/proc/handle_automated_frenzy()
- for(var/mob/living/carbon/human/npc/NPC in viewers(5, src))
- NPC.Aggro(src)
- if(isturf(loc))
- frenzy_target = get_frenzy_targets()
- if(frenzy_target)
- var/datum/cb = CALLBACK(src, PROC_REF(frenzystep))
- var/reqsteps = SSfrenzypool.wait/cached_multiplicative_slowdown
- for(var/i in 1 to reqsteps)
- addtimer(cb, (i - 1)*cached_multiplicative_slowdown)
- else
- if(!CheckFrenzyMove())
- if(isturf(loc))
- var/turf/T = get_step(loc, pick(NORTH, SOUTH, WEST, EAST))
- face_atom(T)
- Move(T)
+ to_chat(src, span_bolddanger("FRENZY."))
+
+ SEND_SOUND(src, sound('modular_darkpack/modules/frenzy/sounds/frenzy.ogg', volume = 50))
+
+ apply_status_effect(/datum/status_effect/frenzy, target)
+
+ // This is assuming no other interaction happens to remove it before this.
+ addtimer(CALLBACK(src, PROC_REF(exit_frenzy_mode)), 1 SCENES)
+
+/mob/living/proc/exit_frenzy_mode()
+ if(!HAS_TRAIT(src, TRAIT_IN_FRENZY))
+ return
+ remove_traits(list(TRAIT_IN_FRENZY, TRAIT_NOSOFTCRIT, TRAIT_ANALGESIA), FRENZY_TRAIT)
+ log_message("exited frenzy.", LOG_GAME)
+
+ remove_status_effect(/datum/status_effect/frenzy)
+
+/datum/storyteller_roll/frenzy
+ abstract_type = /datum/storyteller_roll/frenzy
+ bumper_text = "frenzy"
+ numerical = TRUE
+
+/datum/storyteller_roll/frenzy/rotschreck
+ applicable_stats = list(STAT_COURAGE)
+
+/datum/storyteller_roll/frenzy/kindred
+
+// Specificly kindred as I dont really think brujah are meant to rotschreck easier.
+/datum/storyteller_roll/frenzy/kindred/calculate_used_difficulty(mob/living/roller)
+ . = ..()
+ // V20 p.51
+ if(HAS_TRAIT(roller, TRAIT_DIFFICULT_FRENZY))
+ . += 2
+
+/datum/storyteller_roll/frenzy/rage
+
+/datum/storyteller_roll/frenzy/rage/calculate_used_difficulty(mob/living/roller)
+ . = ..()
+ if(HAS_TRAIT(roller, TRAIT_DIFFICULT_RAGE))
+ . += 1
+
+
+/mob/living/proc/trigger_rotschreck(atom/fire, difficulty = 6, successes = 0)
+ if(HAS_TRAIT(src, TRAIT_KNOCKEDOUT))
+ return
+ if(!get_kindred_splat(src))
+ return
+
+ var/datum/storyteller_roll/frenzy/rotschreck/frenzy_roll = new()
+ frenzy_roll.difficulty = difficulty
+ var/frenzy_result = frenzy_roll.st_roll(src, fire)
+ if(frenzy_result <= 0)
+ enter_frenzy_mode(fire, TRUE, "Rotshreck")
+ return
+ successes += frenzy_result
+ if(successes >= 5)
+ return
+
+ addtimer(CALLBACK(src, PROC_REF(trigger_rotschreck), fire, difficulty, successes), 1 TURNS)
+
+
+/mob/living/proc/trigger_kindred_frenzy(atom/target, difficulty = 6, successes = 0, flavor_text = "Something")
+ if(HAS_TRAIT(src, TRAIT_KNOCKEDOUT))
+ return
+ if(!get_kindred_splat(src))
+ return
+
+ var/stat_to_roll = is_enlightenment() ? STAT_INSTINCT : STAT_SELF_CONTROL
+ var/datum/storyteller_roll/frenzy/kindred/frenzy_roll = new()
+ frenzy_roll.applicable_stats = list(stat_to_roll)
+ frenzy_roll.difficulty = difficulty
+ var/frenzy_result = frenzy_roll.st_roll(src, target)
+ if(frenzy_result <= 0)
+ to_chat(src, span_userdanger("[flavor_text] sends you into a frenzy!"))
+ var/victim = get_closest_atom(/atom, get_frenzy_victims(), src)
+ enter_frenzy_mode(victim, source = "Kindred")
+ return
+
+ successes += frenzy_result
+ if(successes >= 5)
+ to_chat(src, span_green("[flavor_text] almost drives you into frenzy but you steel your nerves and it subsides!"))
+ return
+
+ addtimer(CALLBACK(src, PROC_REF(trigger_kindred_frenzy), target, difficulty, successes, flavor_text), 1 TURNS)
+
+
+/mob/living/proc/trigger_rage_frenzy(atom/target, difficulty = 6, successes = 0)
+ if(HAS_TRAIT(src, TRAIT_KNOCKEDOUT))
+ return
+ var/datum/splat/werewolf/shifter/shifter_splat = get_shifter_splat(src)
+ if(!shifter_splat)
+ return
+
+ var/datum/storyteller_roll/frenzy/rage/frenzy_roll = new()
+ frenzy_roll.difficulty = difficulty
+ var/frenzy_result = frenzy_roll.st_roll(src, target, shifter_splat.rage)
+ if(frenzy_result >= 5)
+ enter_frenzy_mode(target, TRUE, "Rage")
+ return frenzy_result
+
+
+/mob/living/carbon/human/verb/manual_frenzy_roll(atom/movable/AM as mob|obj in oview(DEFAULT_SIGHT_DISTANCE))
+ set name = "Manual Frenzy Roll"
+ set desc = "Trigger a roll for a frenzy"
+ set category = "Object"
+
+ if(!istype(AM))
+ return
+ if(!issupernatural(src))
+ return
+
+ if(get_shifter_splat(src))
+ trigger_rage_frenzy(AM)
+ else if(get_vampire_splat(src))
+ trigger_kindred_frenzy(AM)
+
+// Used by the berserker merit. or possibly even for that one vampire thing of riding the frenzy in future?
+/mob/living/carbon/human/proc/manual_frenzy(atom/movable/AM as mob|obj in oview(DEFAULT_SIGHT_DISTANCE))
+ set name = "Manual Frenzy"
+ set desc = "Enter a frenzy at will"
+ set category = "Object"
+
+ if(!istype(AM))
+ return
+ if(!issupernatural(src))
+ return
+
+ enter_frenzy_mode(AM, source = "Manual")
diff --git a/modular_darkpack/modules/frenzy/code/frenzy_helpers.dm b/modular_darkpack/modules/frenzy/code/frenzy_helpers.dm
new file mode 100644
index 000000000000..e087b03e8466
--- /dev/null
+++ b/modular_darkpack/modules/frenzy/code/frenzy_helpers.dm
@@ -0,0 +1,47 @@
+/mob/living/proc/get_blood_frenzy_targets(range = DEFAULT_SIGHT_DISTANCE)
+ var/list/blood = list()
+
+ for(var/obj/effect/decal/cleanable/blood/blood_spot in view(range, src))
+ blood += blood_spot
+ for(var/mob/living/carbon/human/possible_blood_bag in view(range, src))
+ if(possible_blood_bag.is_bloodied())
+ blood += possible_blood_bag
+
+ return blood
+
+
+/atom/proc/is_bloodied()
+ return GET_ATOM_BLOOD_DECAL_LENGTH(src)
+
+/mob/living/carbon/is_bloodied()
+ if(GET_ATOM_BLOOD_DECAL_LENGTH(src) && num_hands) // Blood decals only actually show up if we have hands as its seperate from blood soles..
+ return TRUE
+
+ for(var/obj/item/visible_item in get_visible_items())
+ if(visible_item.is_bloodied())
+ return TRUE
+
+
+/// Find targets to ATTACK while frenzying
+/mob/living/proc/get_frenzy_victims(range = DEFAULT_SIGHT_DISTANCE)
+ var/list/victims = list()
+
+ for(var/mob/living/carbon/human/victim in oview(range, src))
+ if(victim.stat == DEAD)
+ continue
+ victims += victim
+
+ return victims
+
+
+/mob/living/proc/get_fire_frenzy_targets(range = DEFAULT_SIGHT_DISTANCE)
+ var/list/fire = list()
+
+ for(var/obj/effect/abstract/turf_fire/flames in view(range, src))
+ fire += flames
+
+ for(var/mob/living/carbon/human/guy in view(range, src))
+ if(guy.on_fire)
+ fire += guy
+
+ return fire
diff --git a/modular_darkpack/modules/frenzy/code/status_effect.dm b/modular_darkpack/modules/frenzy/code/status_effect.dm
new file mode 100644
index 000000000000..4d321f53b2b9
--- /dev/null
+++ b/modular_darkpack/modules/frenzy/code/status_effect.dm
@@ -0,0 +1,61 @@
+/datum/client_colour/frenzy
+ priority = CLIENT_COLOR_IMPORTANT_PRIORITY
+ color = COLOR_LIGHT_GRAYISH_RED
+
+/datum/status_effect/frenzy
+ id = "frenzy"
+ duration = STATUS_EFFECT_PERMANENT
+ status_type = STATUS_EFFECT_REFRESH
+ alert_type = /atom/movable/screen/alert/status_effect/frenzy
+ var/datum/weakref/frenzy_target_ref
+ var/datum/weakref/frenzy_overlay_ref
+ var/seconds_alone = 0
+
+/datum/status_effect/frenzy/on_creation(mob/living/new_owner, atom/frenzy_target)
+ . = ..()
+ if(!.)
+ return
+ new_owner.add_client_colour(/datum/client_colour/frenzy, FRENZY_TRAIT)
+
+ if(frenzy_target)
+ frenzy_overlay_ref = WEAKREF(frenzy_target.add_alt_appearance(
+ /datum/atom_hud/alternate_appearance/basic/one_person,
+ "frenzy_target",
+ image(icon = 'modular_darkpack/modules/frenzy/icons/frenzy_overlay.dmi', icon_state = "frenzy_overlay", loc = frenzy_target),
+ null,
+ new_owner,
+ ))
+ frenzy_target_ref = WEAKREF(frenzy_target)
+
+/datum/status_effect/frenzy/on_remove()
+ var/datum/atom_hud/hud = frenzy_overlay_ref.resolve()
+ if(hud)
+ qdel(hud)
+ QDEL_NULL(frenzy_overlay_ref)
+ owner.remove_client_colour(FRENZY_TRAIT)
+ var/mob/living/carbon/carbon_owner = astype(owner)
+ carbon_owner?.exit_frenzy_mode()
+ return ..()
+
+/datum/status_effect/frenzy/tick(seconds_between_ticks)
+ . = ..()
+
+ // If left alone for an extended time, frenzies can end on their own
+ if(locate(/mob/living/carbon/human) in oview(DEFAULT_SIGHT_DISTANCE, owner))
+ seconds_alone = 0
+ // If our target is nearby, keep frenzying (a human or even a fire)
+ else if(frenzy_target_ref?.resolve() in view(DEFAULT_SIGHT_DISTANCE, owner))
+ seconds_alone = 0
+ else
+ seconds_alone += seconds_between_ticks
+
+ if(seconds_alone >= 15)
+ qdel(src)
+
+
+/atom/movable/screen/alert/status_effect/frenzy
+ name = "Frenzy"
+ desc = "FRENZY."
+ icon = 'modular_darkpack/modules/deprecated/icons/hud/screen_alert.dmi'
+ icon_state = "fear"
+
diff --git a/modular_darkpack/modules/frenzy/icons/frenzy_overlay.dmi b/modular_darkpack/modules/frenzy/icons/frenzy_overlay.dmi
new file mode 100644
index 000000000000..229075cd7c69
Binary files /dev/null and b/modular_darkpack/modules/frenzy/icons/frenzy_overlay.dmi differ
diff --git a/modular_darkpack/modules/jobs/code/_departments.dm b/modular_darkpack/modules/jobs/code/_departments.dm
index 8e7ff562f174..323beef07c9e 100644
--- a/modular_darkpack/modules/jobs/code/_departments.dm
+++ b/modular_darkpack/modules/jobs/code/_departments.dm
@@ -128,4 +128,13 @@
department_experience_type = EXP_TYPE_SPIRAL
display_order = 1
label_class = "pentex"
- ui_color = COLOR_ENDRON_GREEN
+ ui_color = COLOR_CORP_ENDRON
+
+/datum/job_department/society_of_leopold
+ department_name = DEPARTMENT_SOCIETY_OF_LEOPOLD
+ department_bitflags = DEPARTMENT_BITFLAG_SOCIETY_OF_LEOPOLD
+ department_head = /datum/job/vampire/abbe
+ department_experience_type = EXP_TYPE_CHURCH
+ display_order = 1
+ label_class = "society"
+ ui_color = "#fff022"
diff --git a/modular_darkpack/modules/jobs/code/_job_assignment.dm b/modular_darkpack/modules/jobs/code/_job_assignment.dm
index 5588cc73c85b..d73b23cacffc 100644
--- a/modular_darkpack/modules/jobs/code/_job_assignment.dm
+++ b/modular_darkpack/modules/jobs/code/_job_assignment.dm
@@ -39,13 +39,25 @@
return JOB_UNAVAILABLE_WHITELIST
*/
- if(player_splat_id != SPLAT_KINDRED)
- return JOB_AVAILABLE
- // Beyond this point, we know our splat is a kindred.
+ var/splat_checks
+ switch(player_splat_id)
+ if(SPLAT_KINDRED)
+ splat_checks = check_kindred_prefs(player_client, player, possible_job, debug_prefix, add_job_to_log)
+ if(SPLAT_GAROU)
+ splat_checks = check_garou_prefs(player_client, player, possible_job, debug_prefix, add_job_to_log)
+ if(splat_checks)
+ return splat_checks
+ return JOB_AVAILABLE
+
+/datum/controller/subsystem/job/proc/check_kindred_prefs(client/player_client, mob/dead/new_player/player, datum/job/possible_job, debug_prefix = "", add_job_to_log = FALSE)
if((player_client.prefs.read_preference(/datum/preference/numeric/immortal_age) < possible_job.minimum_immortal_age))
- job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_KINDRED_AGE, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]")
- return JOB_UNAVAILABLE_KINDRED_AGE
+ job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_KINDRED_AGE_MIN, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]")
+ return JOB_UNAVAILABLE_KINDRED_AGE_MIN
+
+ if((!isnull(possible_job.maximum_immortal_age) && (player_client.prefs.read_preference(/datum/preference/numeric/immortal_age) > possible_job.maximum_immortal_age)))
+ job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_KINDRED_AGE_MAX, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]")
+ return JOB_UNAVAILABLE_KINDRED_AGE_MAX
if((player_client.prefs.read_preference(/datum/preference/numeric/generation) > possible_job.minimal_generation))
job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_KINDRED_GENERATION, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]")
@@ -59,5 +71,19 @@
job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_KINDRED_CLAN, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]")
return JOB_UNAVAILABLE_KINDRED_CLAN
- return JOB_AVAILABLE
+/datum/controller/subsystem/job/proc/check_garou_prefs(client/player_client, mob/dead/new_player/player, datum/job/possible_job, debug_prefix = "", add_job_to_log = FALSE)
+ var/datum/subsplat/werewolf/auspice/auspice = get_fera_auspice(player_client.prefs.read_preference(/datum/preference/choiced/subsplat/garou_auspice))
+ if(possible_job.allowed_auspice && !(auspice.name in possible_job.allowed_auspice))
+ job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_FERA_AUSPICE, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]")
+ return JOB_UNAVAILABLE_FERA_AUSPICE
+ if(possible_job.disallowed_auspice && (auspice.name in possible_job.disallowed_auspice))
+ job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_FERA_AUSPICE, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]")
+ return JOB_UNAVAILABLE_FERA_AUSPICE
+ var/datum/subsplat/werewolf/tribe/tribe = get_fera_tribe(player_client.prefs.read_preference(/datum/preference/choiced/subsplat/garou_tribe))
+ if(possible_job.allowed_tribes && !(tribe.name in possible_job.allowed_tribes))
+ job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_FERA_TRIBE, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]")
+ return JOB_UNAVAILABLE_FERA_TRIBE
+ if(possible_job.disallowed_tribes && (tribe.name in possible_job.disallowed_tribes))
+ job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_FERA_TRIBE, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]")
+ return JOB_UNAVAILABLE_FERA_TRIBE
diff --git a/modular_darkpack/modules/jobs/code/_jobs.dm b/modular_darkpack/modules/jobs/code/_jobs.dm
index bcfbf0abe6e9..0ef1d9bb4443 100644
--- a/modular_darkpack/modules/jobs/code/_jobs.dm
+++ b/modular_darkpack/modules/jobs/code/_jobs.dm
@@ -1,12 +1,5 @@
// Default vampire base type.
/datum/job
- ///Minimum vampire Generation necessary to do this job.
- var/minimal_generation = HIGHEST_GENERATION_LIMIT
- ///Minimum Masquerade level necessary to do this job.
- var/minimal_masquerade = 0
- /// Character must be at least this age (in years) since embrace (chronological_age - age) to join as role.
- var/minimum_immortal_age = 0
-
/// The list of alternative job titles people can pick from, null by default.
var/list/alt_titles = null // ALTERNATIVE_JOB_TITLES
@@ -14,13 +7,34 @@
var/list/allowed_splats
///List of species that are limited to a certain amount of that species doing this job. e.g: list(SPLAT_NONE = -1, SPLAT_GHOUL = -1, SPLAT_KINDRED = -1)
var/list/splat_slots
+
+ // VTM
+ ///Minimum vampire Generation necessary to do this job.
+ var/minimal_generation = HIGHEST_GENERATION_LIMIT
+ ///Minimum Masquerade level necessary to do this job.
+ var/minimal_masquerade = 0
+ /// Character must be at least this age (in years) since embrace (chronological_age - age) to join as role.
+ var/minimum_immortal_age = 0
+ /// Character must not be over this age (in years) since embrace (chronological_age - age) to join as role. (Defaults null, set to desired age.)
+ var/maximum_immortal_age = null
///List of Clans that are allowed to do this job.
var/list/allowed_clans
///List of Clans that are disallowed to do this job.
var/list/disallowed_clans
+
+ // WTA
+ ///Minimum Renown Rank necessary to do this job.
+ var/minimal_renown_rank
+ ///List of Tribes that are allowed to do this job.
+ var/list/allowed_tribes
+ var/list/disallowed_tribes
+ ///List of Auspices that are allowed to do this job.
+ var/list/allowed_auspice
+ var/list/disallowed_auspice
+
+
///If this job requires whitelisting before it can be selected for characters.
var/whitelisted = FALSE
-
// Only for display in memories
var/list/known_contacts = null
@@ -106,3 +120,7 @@
/// Returns information pertaining to this job's radio.
/datum/job/vampire/get_radio_information()
return
+
+/datum/job/vampire/after_spawn(mob/living/spawned, client/player_client)
+ . = ..()
+ spawned.add_faction(faction)
diff --git a/modular_darkpack/modules/jobs/code/anarchs/baron.dm b/modular_darkpack/modules/jobs/code/anarchs/baron.dm
index 0768e305e90c..ad9e055b1461 100644
--- a/modular_darkpack/modules/jobs/code/anarchs/baron.dm
+++ b/modular_darkpack/modules/jobs/code/anarchs/baron.dm
@@ -1,6 +1,6 @@
/datum/job/vampire/baron
title = JOB_BARON
- faction = FACTION_CITY
+ faction = FACTION_ANARCHS
total_positions = 1
spawn_positions = 1
supervisors = "the Anarchs and the Traditions"
diff --git a/modular_darkpack/modules/jobs/code/anarchs/bruiser.dm b/modular_darkpack/modules/jobs/code/anarchs/bruiser.dm
index 3c1917b568f6..f6a459625b9d 100644
--- a/modular_darkpack/modules/jobs/code/anarchs/bruiser.dm
+++ b/modular_darkpack/modules/jobs/code/anarchs/bruiser.dm
@@ -1,6 +1,6 @@
/datum/job/vampire/bruiser
title = JOB_BRUISER
- faction = FACTION_CITY
+ faction = FACTION_ANARCHS
total_positions = 7
spawn_positions = 7
supervisors = SUPERVISOR_BARON
diff --git a/modular_darkpack/modules/jobs/code/anarchs/emissary.dm b/modular_darkpack/modules/jobs/code/anarchs/emissary.dm
index 57a6ac94b996..f2387584403c 100644
--- a/modular_darkpack/modules/jobs/code/anarchs/emissary.dm
+++ b/modular_darkpack/modules/jobs/code/anarchs/emissary.dm
@@ -1,6 +1,6 @@
/datum/job/vampire/emissary
title = JOB_EMISSARY
- faction = FACTION_CITY
+ faction = FACTION_ANARCHS
total_positions = 1
spawn_positions = 1
supervisors = SUPERVISOR_BARON
diff --git a/modular_darkpack/modules/jobs/code/anarchs/sweeper.dm b/modular_darkpack/modules/jobs/code/anarchs/sweeper.dm
index a62af86285c7..bf4db7ce0b42 100644
--- a/modular_darkpack/modules/jobs/code/anarchs/sweeper.dm
+++ b/modular_darkpack/modules/jobs/code/anarchs/sweeper.dm
@@ -1,6 +1,6 @@
/datum/job/vampire/sweeper
title = JOB_SWEEPER
- faction = FACTION_CITY
+ faction = FACTION_ANARCHS
total_positions = 3
spawn_positions = 3
supervisors = SUPERVISOR_BARON
diff --git a/modular_darkpack/modules/jobs/code/anarchs/tapster.dm b/modular_darkpack/modules/jobs/code/anarchs/tapster.dm
index 43de0489b85a..942a0a345751 100644
--- a/modular_darkpack/modules/jobs/code/anarchs/tapster.dm
+++ b/modular_darkpack/modules/jobs/code/anarchs/tapster.dm
@@ -1,6 +1,6 @@
/datum/job/vampire/tapster
title = JOB_TAPSTER
- faction = FACTION_CITY
+ faction = FACTION_ANARCHS
total_positions = 2
spawn_positions = 2
supervisors = SUPERVISOR_BARON_PUBLIC
diff --git a/modular_darkpack/modules/jobs/code/camarilla/harpy.dm b/modular_darkpack/modules/jobs/code/camarilla/harpy.dm
index 190f8d83a680..304562163cbb 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/harpy.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/harpy.dm
@@ -2,7 +2,7 @@
title = JOB_HARPY
description = "You are an expert on the nightlife of Cainite society. Acting as one of the chief advisors on all things related to boons and diplomacy, the Prince defers quite the amount of judgement to you. Don't squander it."
auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
- faction = FACTION_CITY
+ faction = FACTION_CAMARILLA
total_positions = 3
spawn_positions = 3
supervisors = SUPERVISOR_PRINCE
diff --git a/modular_darkpack/modules/jobs/code/camarilla/hound.dm b/modular_darkpack/modules/jobs/code/camarilla/hound.dm
index dd12e0ecada3..06f306df194f 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/hound.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/hound.dm
@@ -2,7 +2,7 @@
title = JOB_HOUND
description = "You are the Prince's enforcer. You report to the Sheriff and uphold the Traditions."
auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY
- faction = FACTION_CITY
+ faction = FACTION_CAMARILLA
total_positions = 7
spawn_positions = 7
supervisors = SUPERVISOR_SHERIFF
diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/banu_haqim.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/banu_haqim.dm
index e5b3f9e56a07..f183f410efcf 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/primogens/banu_haqim.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/banu_haqim.dm
@@ -2,7 +2,7 @@
title = JOB_PRIMOGEN_BANU_HAQIM
description = "Offer your infinite knowledge to Prince of the City, while overseeing the Banu Haqim in the city. Monitor their contracts and ensure they remain true to the ways of the Clan. You have an official cover with the Police Department as a local civilian consultant, ensure things run smoothly, on either end."
auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
- faction = FACTION_CITY
+ faction = FACTION_CAMARILLA
total_positions = 1
spawn_positions = 1
supervisors = SUPERVISOR_TRADITIONS
diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/lasombra.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/lasombra.dm
index 82310cef4481..53a4ca093ca8 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/primogens/lasombra.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/lasombra.dm
@@ -2,7 +2,7 @@
title = JOB_PRIMOGEN_LASOMBRA
description = "Offer your infinite knowledge to Prince of the City. Monitor those of your Clan and your lesser cousins, while holding a Court of Blood as need be, for all it takes for the Camarilla to turn on you is one mistake. You and Your Clan were given a domain in the local Church and in the vicinity of a swarm of Lupines, keep matters under control."
auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
- faction = FACTION_CITY
+ faction = FACTION_CAMARILLA
total_positions = 1
spawn_positions = 1
supervisors = SUPERVISOR_TRADITIONS
diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/malkavian.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/malkavian.dm
index b966cd9b3868..aa3e5e18cad1 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/primogens/malkavian.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/malkavian.dm
@@ -2,7 +2,7 @@
title = JOB_PRIMOGEN_MALKAVIAN
description = "Offer your infinite knowledge to Prince of the City. You likely have a hold over the local hospital, make good use of it and ensure the blood bags remain available."
auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
- faction = FACTION_CITY
+ faction = FACTION_CAMARILLA
total_positions = 1
spawn_positions = 1
supervisors = SUPERVISOR_TRADITIONS
diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/nosferatu.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/nosferatu.dm
index 60404c0b73e0..d00204daa570 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/primogens/nosferatu.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/nosferatu.dm
@@ -2,7 +2,7 @@
title = JOB_PRIMOGEN_NOSFERATU
description = "Offer your infinite knowledge to Prince of the City, and run the warren, your domain watches over the sewers."
auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
- faction = FACTION_CITY
+ faction = FACTION_CAMARILLA
total_positions = 1
spawn_positions = 1
supervisors = SUPERVISOR_TRADITIONS
diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/toreador.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/toreador.dm
index 0372f8ec92d8..5449b28f3e1a 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/primogens/toreador.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/toreador.dm
@@ -2,7 +2,7 @@
title = JOB_PRIMOGEN_TOREADOR
description = "Offer your infinite knowledge to Prince of the City. Take care of the Strip Club and its Elysium, for it is your domain and a social center within the city."
auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
- faction = FACTION_CITY
+ faction = FACTION_CAMARILLA
total_positions = 1
spawn_positions = 1
supervisors = SUPERVISOR_TRADITIONS
diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/ventrue.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/ventrue.dm
index 4708250a66d0..8e76e5182a4d 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/primogens/ventrue.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/ventrue.dm
@@ -2,7 +2,7 @@
title = JOB_PRIMOGEN_VENTRUE
description = "Offer your infinite knowledge to Prince of the City. Maintain the local Jazz Club, in front of the Tower, and its Elysium."
auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
- faction = FACTION_CITY
+ faction = FACTION_CAMARILLA
total_positions = 1
spawn_positions = 1
supervisors = SUPERVISOR_TRADITIONS
diff --git a/modular_darkpack/modules/jobs/code/camarilla/prince.dm b/modular_darkpack/modules/jobs/code/camarilla/prince.dm
index c2b242e6f3c3..8aa3c468e128 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/prince.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/prince.dm
@@ -2,7 +2,7 @@
title = JOB_PRINCE
description = "You are the top dog of this city. You hold Praxis over " + CITY_NAME + ", and your word is law. Make sure the Masquerade is upheld, and your status is respected."
auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
- faction = FACTION_CITY
+ faction = FACTION_CAMARILLA
total_positions = 1
spawn_positions = 1
supervisors = SUPERVISOR_TRADITIONS
diff --git a/modular_darkpack/modules/jobs/code/camarilla/seneschal.dm b/modular_darkpack/modules/jobs/code/camarilla/seneschal.dm
index d1b76c6eed27..ac1d8d33f2d8 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/seneschal.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/seneschal.dm
@@ -2,7 +2,7 @@
title = JOB_SENESCHAL
description = "You are the right hand man or woman of the most powerful vampire in the city. The Camarilla trusts you to run the city, even in their stead."
auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
- faction = FACTION_CITY
+ faction = FACTION_CAMARILLA
total_positions = 1
spawn_positions = 1
supervisors = SUPERVISOR_PRINCE
diff --git a/modular_darkpack/modules/jobs/code/camarilla/sheriff.dm b/modular_darkpack/modules/jobs/code/camarilla/sheriff.dm
index fad3ab398fce..f4fe96127eb5 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/sheriff.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/sheriff.dm
@@ -2,7 +2,7 @@
title = JOB_SHERIFF
description = "Protect the Prince and the Masquerade. You are their sword."
auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY
- faction = FACTION_CITY
+ faction = FACTION_CAMARILLA
total_positions = 1
spawn_positions = 1
supervisors = SUPERVISOR_PRINCE
diff --git a/modular_darkpack/modules/jobs/code/camarilla/tower_employee.dm b/modular_darkpack/modules/jobs/code/camarilla/tower_employee.dm
index 0510ed61b6c5..a0bc69b9c7cf 100644
--- a/modular_darkpack/modules/jobs/code/camarilla/tower_employee.dm
+++ b/modular_darkpack/modules/jobs/code/camarilla/tower_employee.dm
@@ -1,6 +1,6 @@
/datum/job/vampire/towerwork
title = JOB_TOWERWORK
- faction = FACTION_CITY
+ faction = FACTION_CAMARILLA
total_positions = 4
spawn_positions = 4
supervisors = SUPERVISOR_SENESCHAL_PUBLIC
diff --git a/modular_darkpack/modules/jobs/code/garou/councillor.dm b/modular_darkpack/modules/jobs/code/garou/councillor.dm
index daee2add5385..976372ccf28c 100644
--- a/modular_darkpack/modules/jobs/code/garou/councillor.dm
+++ b/modular_darkpack/modules/jobs/code/garou/councillor.dm
@@ -2,7 +2,7 @@
title = JOB_GAROU_COUNCIL
description = "Veterans of the Garou Nation with the highest esteem, your word within the " + SEPT_NAME + " is law. Make sure the Litany is upheld, and that your caern does not fall prey to the Wyrm."
auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
- faction = FACTION_CITY
+ faction = FACTION_GAIA
total_positions = 3
spawn_positions = 3
supervisors = SUPERVISOR_LITANY
@@ -17,7 +17,7 @@
outfit = /datum/outfit/job/vampire/councillor
allowed_splats = list(SPLAT_GAROU)
-// allowed_tribes = list(TRIBE_GAIA)
+ allowed_tribes = TRIBE_LIST_GAIA
display_order = JOB_DISPLAY_ORDER_COUNCIL
department_for_prefs = /datum/job_department/gaia
diff --git a/modular_darkpack/modules/jobs/code/garou/guardian.dm b/modular_darkpack/modules/jobs/code/garou/guardian.dm
index ec80d3ea46d7..464107009dd8 100644
--- a/modular_darkpack/modules/jobs/code/garou/guardian.dm
+++ b/modular_darkpack/modules/jobs/code/garou/guardian.dm
@@ -2,7 +2,7 @@
title = JOB_GAROU_GUARDIAN
description = "You are the bottom of the Sept's pecking order, but also the frontline offense and defense, serving directly under the Warder and Wyrmfoe to ensure the caern's safety and well-being."
auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY
- faction = FACTION_CITY
+ faction = FACTION_GAIA
total_positions = 3
spawn_positions = 3
supervisors = /datum/job/vampire/warder
@@ -17,7 +17,7 @@
outfit = /datum/outfit/job/vampire/guardian
allowed_splats = list(SPLAT_GAROU)
-// allowed_tribes = list(TRIBE_GAIA)
+ allowed_tribes = TRIBE_LIST_GAIA
display_order = JOB_DISPLAY_ORDER_GUARDIAN
department_for_prefs = /datum/job_department/gaia
diff --git a/modular_darkpack/modules/jobs/code/garou/truthcatcher.dm b/modular_darkpack/modules/jobs/code/garou/truthcatcher.dm
index 10980a2c525c..65c4b9dfb0b0 100644
--- a/modular_darkpack/modules/jobs/code/garou/truthcatcher.dm
+++ b/modular_darkpack/modules/jobs/code/garou/truthcatcher.dm
@@ -2,7 +2,7 @@
title = JOB_GAROU_TRUTHCATCHER
description = "You are the most highly regarded Philodox within the Sept, granted the honor of being the ultimate arbitrator. It is your duty to meditate matters within the Sept. Enact your judgement upon anyone who violates the Litany."
auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY
- faction = FACTION_CITY
+ faction = FACTION_GAIA
total_positions = 1
spawn_positions = 1
supervisors = SUPERVISOR_LITANY
@@ -17,8 +17,8 @@
outfit = /datum/outfit/job/vampire/trutchcatcher
allowed_splats = list(SPLAT_GAROU)
-// allowed_tribes = list(TRIBE_GAIA)
-// allowed_auspice = list(AUSPICE_PHILODOX)
+ allowed_tribes = TRIBE_LIST_GAIA
+ allowed_auspice = list(AUSPICE_PHILODOX)
display_order = JOB_DISPLAY_ORDER_TRUTHCATCHER
department_for_prefs = /datum/job_department/gaia
diff --git a/modular_darkpack/modules/jobs/code/garou/warder.dm b/modular_darkpack/modules/jobs/code/garou/warder.dm
index f95c6b69ce2a..ce3662b1bca4 100644
--- a/modular_darkpack/modules/jobs/code/garou/warder.dm
+++ b/modular_darkpack/modules/jobs/code/garou/warder.dm
@@ -2,7 +2,7 @@
title = JOB_GAROU_WARDER
description = "You are the most respected Ahroun within the" + SEPT_NAME + ", granted the honor of coordinating the caern's security. The Wyrmfoe and Guardians answer to you."
auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY
- faction = FACTION_CITY
+ faction = FACTION_GAIA
total_positions = 1
spawn_positions = 1
supervisors = SUPERVISOR_LITANY
@@ -17,8 +17,8 @@
outfit = /datum/outfit/job/vampire/warder
allowed_splats = list(SPLAT_GAROU)
-// allowed_tribes = list(TRIBE_GAIA)
-// allowed_auspice = list(AUSPICE_AHROUN)
+ allowed_tribes = TRIBE_LIST_GAIA
+ allowed_auspice = list(AUSPICE_AHROUN)
display_order = JOB_DISPLAY_ORDER_WARDER
department_for_prefs = /datum/job_department/gaia
diff --git a/modular_darkpack/modules/jobs/code/garou/wyrmfoe.dm b/modular_darkpack/modules/jobs/code/garou/wyrmfoe.dm
index 94977b06c35e..0424c932a150 100644
--- a/modular_darkpack/modules/jobs/code/garou/wyrmfoe.dm
+++ b/modular_darkpack/modules/jobs/code/garou/wyrmfoe.dm
@@ -2,7 +2,7 @@
title = JOB_GAROU_WYRMFOE
description = "You are the Warder's right hand, a promising tactician in your own right, granted the honor of coordinating the Sept's more offensive actions. "
auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY
- faction = FACTION_CITY
+ faction = FACTION_GAIA
total_positions = 1
spawn_positions = 1
supervisors = SUPERVISOR_LITANY
@@ -17,7 +17,7 @@
outfit = /datum/outfit/job/vampire/wyrmfoe
allowed_splats = list(SPLAT_GAROU)
-// allowed_tribes = list(TRIBE_GAIA)
+ allowed_tribes = TRIBE_LIST_GAIA
display_order = JOB_DISPLAY_ORDER_WYRMFOE
department_for_prefs = /datum/job_department/gaia
diff --git a/modular_darkpack/modules/jobs/code/giovanni/capo.dm b/modular_darkpack/modules/jobs/code/giovanni/capo.dm
index 6042dab9a823..04c235cf13aa 100644
--- a/modular_darkpack/modules/jobs/code/giovanni/capo.dm
+++ b/modular_darkpack/modules/jobs/code/giovanni/capo.dm
@@ -1,6 +1,6 @@
/datum/job/vampire/capo
title = JOB_CAPO
- faction = FACTION_CITY
+ faction = FACTION_GIOVANNI
total_positions = 1
spawn_positions = 1
supervisors = "the Family and the Traditions"
@@ -30,3 +30,30 @@
l_pocket = /obj/item/smartphone/giovanni_capo
r_pocket = /obj/item/vamp/keys/capo
backpack_contents = list(/obj/item/card/credit/giovanniboss=1, /obj/item/ritual_tome/necromancy=1)
+
+/datum/memory/key/bank_vault_code
+ var/remembered_code
+
+/datum/memory/key/bank_vault_code/New(
+ datum/mind/memorizer_mind,
+ atom/protagonist,
+ atom/deuteragonist,
+ atom/antagonist,
+ remembered_code,
+)
+ src.remembered_code = remembered_code
+ return ..()
+
+/datum/memory/key/bank_vault_code/get_names()
+ return list("The bank vault code is [remembered_code].")
+
+/datum/memory/key/bank_vault_code/get_starts()
+ return list(
+ "[protagonist_name] blurts out [remembered_code], then looks nervous. Were they supposed to say that...?"
+ )
+
+/datum/job/vampire/capo/after_spawn(mob/living/spawned, client/player_client)
+ . = ..()
+ var/obj/structure/vaultdoor/pincode/bank/door = locate() in GLOB.vault_doors
+ if(door)
+ spawned.mind.add_memory(/datum/memory/key/bank_vault_code, remembered_code = door.pincode)
diff --git a/modular_darkpack/modules/jobs/code/giovanni/la_famiglia.dm b/modular_darkpack/modules/jobs/code/giovanni/la_famiglia.dm
index d71ac326a20f..c700f65802f7 100644
--- a/modular_darkpack/modules/jobs/code/giovanni/la_famiglia.dm
+++ b/modular_darkpack/modules/jobs/code/giovanni/la_famiglia.dm
@@ -1,6 +1,6 @@
/datum/job/vampire/famiglia
title = JOB_LA_FAMIGLIA
- faction = FACTION_CITY
+ faction = FACTION_GIOVANNI
total_positions = 10
spawn_positions = 10
supervisors = "the Family"
diff --git a/modular_darkpack/modules/jobs/code/giovanni/la_squadra.dm b/modular_darkpack/modules/jobs/code/giovanni/la_squadra.dm
index 5cdf8adc54b0..8a3fd7223806 100644
--- a/modular_darkpack/modules/jobs/code/giovanni/la_squadra.dm
+++ b/modular_darkpack/modules/jobs/code/giovanni/la_squadra.dm
@@ -1,6 +1,6 @@
/datum/job/vampire/squadra
title = JOB_LA_SQUADRA
- faction = FACTION_CITY
+ faction = FACTION_GIOVANNI
total_positions = 10
spawn_positions = 10
supervisors = "the Family and the Traditions"
@@ -30,3 +30,11 @@
l_pocket = /obj/item/smartphone/giovanni_squadra
r_pocket = /obj/item/vamp/keys/giovanni
backpack_contents = list(/obj/item/card/credit/rich=1, /obj/item/ritual_tome/necromancy=1)
+
+
+/datum/job/vampire/squadra/after_spawn(mob/living/spawned, client/player_client)
+ . = ..()
+ var/obj/structure/vaultdoor/pincode/bank/door = locate() in GLOB.vault_doors
+ if(door)
+ spawned.mind.add_memory(/datum/memory/key/bank_vault_code, remembered_code = door.pincode)
+
diff --git a/modular_darkpack/modules/jobs/code/hunters/abbe.dm b/modular_darkpack/modules/jobs/code/hunters/abbe.dm
new file mode 100644
index 000000000000..52ee3a11bd5b
--- /dev/null
+++ b/modular_darkpack/modules/jobs/code/hunters/abbe.dm
@@ -0,0 +1,33 @@
+/datum/job/vampire/abbe
+ title = JOB_ABBE
+ description = "You are an Abbé for the Society of Leopold who answers to the Provincial of this region, and who serves the local Cenacle of Inquisitors beneath you. You're tasked by the Inquisition in ensuring the Cenaculum are well-supplied and accounted for, as well as rooting out any heresy or infiltration. Act as the leaders of the Inquisitors, as your Lord has commanded you to be your brother's keeper."
+ auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY
+ faction = FACTION_CITY
+ total_positions = 1
+ spawn_positions = 1
+ supervisors = SUPERVISOR_SOCIETY_OF_LEOPOLD
+ minimal_player_age = 7
+ config_tag = "ABBE"
+ job_flags = CITY_JOB_FLAGS
+ outfit = /datum/outfit/job/vampire/abbe
+
+ display_order = JOB_DISPLAY_ORDER_ABBE
+ department_for_prefs = /datum/job_department/society_of_leopold
+ departments_list = list(
+ /datum/job_department/society_of_leopold,
+ )
+ allowed_splats = list(SPLAT_NONE)
+
+/datum/outfit/job/vampire/abbe
+ name = "Abbe"
+ jobtype = /datum/job/vampire/abbe
+
+ id = /obj/item/card/hunter
+ uniform = /obj/item/clothing/under/vampire/suit
+ gloves = /obj/item/clothing/gloves/vampire/work
+ suit = /obj/item/clothing/suit/vampire/orthodox
+ shoes = /obj/item/clothing/shoes/vampire
+ glasses = /obj/item/clothing/glasses/vampire/perception
+ r_pocket = /obj/item/vamp/keys/hunter
+ l_pocket = /obj/item/smartphone/abbe
+ backpack_contents = list(/obj/item/vampire_stake=1, /obj/item/vampirebook/bible=1, /obj/item/card/credit=1)
diff --git a/modular_darkpack/modules/jobs/code/hunters/condottieri.dm b/modular_darkpack/modules/jobs/code/hunters/condottieri.dm
new file mode 100644
index 000000000000..5bafb5d99c3c
--- /dev/null
+++ b/modular_darkpack/modules/jobs/code/hunters/condottieri.dm
@@ -0,0 +1,36 @@
+/datum/job/vampire/condottieri
+ title = JOB_CONDOTTIERI
+ description = "You are a Condottieri for the Society of Leopold - assigned to this Cenacle to protect the Inquisitors and the Novices undergoing their Novitiate. Your role is closer to defense than it is the actual completion of offensive missions undertaken by the other Inquisitors - however, the Condottieri remain highly respected as an elite and deadly subdivision of the Society of Leopold."
+ auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY
+ faction = FACTION_CITY
+ total_positions = 2
+ spawn_positions = 2
+ supervisors = SUPERVISOR_SHERIFF
+ minimal_player_age = 7
+
+ config_tag = "CONDOTTIERI"
+ job_flags = CITY_JOB_FLAGS
+ outfit = /datum/outfit/job/vampire/condottieri
+
+ display_order = JOB_DISPLAY_ORDER_CONDOTTIERI
+ department_for_prefs = /datum/job_department/society_of_leopold
+ departments_list = list(
+ /datum/job_department/society_of_leopold,
+ )
+
+ allowed_splats = list(SPLAT_NONE)
+
+/datum/outfit/job/vampire/condottieri
+ name = "Condottieri"
+ jobtype = /datum/job/vampire/condottieri
+
+ id = /obj/item/card/hunter
+ uniform = /obj/item/clothing/under/vampire/black
+ gloves = /obj/item/clothing/gloves/vampire/leather
+ suit = /obj/item/clothing/suit/vampire/vest/medieval
+ head = /obj/item/clothing/head/vampire/helmet/spain
+ shoes = /obj/item/clothing/shoes/jackboots
+ glasses = /obj/item/clothing/glasses/vampire/sun
+ r_pocket = /obj/item/vamp/keys/hunter
+ l_pocket = /obj/item/smartphone/condottieri
+ backpack_contents = list(/obj/item/vampire_stake=1, /obj/item/card/credit=1, /obj/item/vampirebook/bible=1)
diff --git a/modular_darkpack/modules/jobs/code/hunters/inquisitor.dm b/modular_darkpack/modules/jobs/code/hunters/inquisitor.dm
new file mode 100644
index 000000000000..093d4a29182a
--- /dev/null
+++ b/modular_darkpack/modules/jobs/code/hunters/inquisitor.dm
@@ -0,0 +1,35 @@
+/datum/job/vampire/inquisitor
+ title = JOB_INQUISITOR
+ description = "You are a seasoned member of the Society of Leopold, having passed your Novitiate and becoming a Councilor after many hard years of careful study of the supernatural. Now your task is simple - root out any emergence of the supernatural which threaten God's kingdom and it's Children - do not suffer even one to exist, for God makes it clear who these 'Kindred' or 'Garou' really serve."
+ auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY
+ faction = FACTION_CITY
+ total_positions = 3
+ spawn_positions = 3
+ supervisors = SUPERVISOR_SOCIETY_OF_LEOPOLD
+ minimal_player_age = 7
+ config_tag = "INQUISITOR"
+ job_flags = CITY_JOB_FLAGS
+ outfit = /datum/outfit/job/vampire/inquisitor
+
+ display_order = JOB_DISPLAY_ORDER_INQUISITOR
+ department_for_prefs = /datum/job_department/society_of_leopold
+ departments_list = list(
+ /datum/job_department/society_of_leopold,
+ )
+ splat_slots = list(SPLAT_GHOUL = 1, SPLAT_KINFOLK = 1, SPLAT_NONE = 3)
+ allowed_splats = list(SPLAT_NONE, SPLAT_GHOUL, SPLAT_KINFOLK) // infiltrators and betrayal arcs
+
+/datum/outfit/job/vampire/inquisitor
+ name = "Inquisitor"
+ jobtype = /datum/job/vampire/inquisitor
+
+ id = /obj/item/card/hunter
+ head = /obj/item/clothing/head/vampire/cowboy
+ uniform = /obj/item/clothing/under/vampire/brujah
+ gloves = /obj/item/clothing/gloves/vampire/leather
+ suit = /obj/item/clothing/suit/vampire/trench/alt/armored
+ shoes = /obj/item/clothing/shoes/vampire/jackboots
+ glasses = /obj/item/clothing/glasses/vampire/sun
+ r_pocket = /obj/item/vamp/keys/hunter
+ l_pocket = /obj/item/smartphone/inquisitor
+ backpack_contents = list(/obj/item/vampire_stake=2, /obj/item/vampirebook/bible=1, /obj/item/masquerade_contract=1, /obj/item/card/credit=1)
diff --git a/modular_darkpack/modules/jobs/code/hunters/novice.dm b/modular_darkpack/modules/jobs/code/hunters/novice.dm
new file mode 100644
index 000000000000..624363a2836f
--- /dev/null
+++ b/modular_darkpack/modules/jobs/code/hunters/novice.dm
@@ -0,0 +1,33 @@
+/datum/job/vampire/novice
+ title = JOB_NOVICE
+ description = "You are Novice who is undergoing, or a Tertiary who has just passed, their Novitiate in the Inquisition's organization The Society of Saint Leopold. Whether you were a lay-person or undergoing official clerical or religious training, your main task in the Society is now to study, scout, document, and be educated on the various supernatural creatures that threaten God's kingdom and it's balance - as well as remaining prepared for when your name is called."
+ faction = FACTION_CITY
+ total_positions = 3
+ spawn_positions = 3
+ supervisors = SUPERVISOR_SOCIETY_OF_LEOPOLD
+ minimal_player_age = 7
+
+ config_tag = "NOVICE"
+ job_flags = CITY_JOB_FLAGS
+ outfit = /datum/outfit/job/vampire/novice
+
+ display_order = JOB_DISPLAY_ORDER_NOVICE
+ department_for_prefs = /datum/job_department/society_of_leopold
+ departments_list = list(
+ /datum/job_department/society_of_leopold,
+ )
+
+ allowed_splats = list(SPLAT_NONE)
+
+
+/datum/outfit/job/vampire/novice
+ name = "Novice"
+ jobtype = /datum/job/vampire/novice
+
+ id = /obj/item/card/hunter
+ uniform = /obj/item/clothing/under/vampire/turtleneck_white
+ suit = /obj/item/clothing/suit/vampire/labcoat
+ shoes = /obj/item/clothing/shoes/vampire/jackboots
+ r_pocket = /obj/item/vamp/keys/hunter
+ l_pocket = /obj/item/smartphone/novice
+ backpack_contents = list(/obj/item/camera=1, /obj/item/vampirebook/bible=1, /obj/item/card/credit=1)
diff --git a/modular_darkpack/modules/jobs/code/landmarks.dm b/modular_darkpack/modules/jobs/code/landmarks.dm
index 8529c79c62ae..7bb104aca0c2 100644
--- a/modular_darkpack/modules/jobs/code/landmarks.dm
+++ b/modular_darkpack/modules/jobs/code/landmarks.dm
@@ -140,4 +140,13 @@ JOB_START_HELPER(voivode/voivode, JOB_VOIVODE)
JOB_START_HELPER(voivode/bogatyr, JOB_BOGATYR)
JOB_START_HELPER(voivode/zadruga, JOB_ZADRUGA)
+/* Society of Leopold */
+/obj/effect/landmark/start/darkpack/society_of_leopold
+ name = "generic hunter start"
+
+JOB_START_HELPER(society_of_leopold/abbe, JOB_ABBE)
+JOB_START_HELPER(society_of_leopold/condittieri, JOB_CONDOTTIERI)
+JOB_START_HELPER(society_of_leopold/inquisitor, JOB_INQUISITOR)
+JOB_START_HELPER(society_of_leopold/novice, JOB_NOVICE)
+
#undef JOB_START_HELPER
diff --git a/modular_darkpack/modules/jobs/code/miscelllaneous/club_worker.dm b/modular_darkpack/modules/jobs/code/miscelllaneous/club_worker.dm
index 55085d985f5f..60bd7199fb67 100644
--- a/modular_darkpack/modules/jobs/code/miscelllaneous/club_worker.dm
+++ b/modular_darkpack/modules/jobs/code/miscelllaneous/club_worker.dm
@@ -3,7 +3,7 @@
faction = FACTION_CITY
total_positions = 4
spawn_positions = 4
- supervisors = "Rosebud Night Club Owner"
+ supervisors = SUPERVISOR_CLUB_DIRECTOR
job_flags = CITY_JOB_FLAGS
outfit = /datum/outfit/job/vampire/club_worker
config_tag = "CLUB_WORKER"
diff --git a/modular_darkpack/modules/jobs/code/pentex/affairs.dm b/modular_darkpack/modules/jobs/code/pentex/affairs.dm
index 5461e352d0fc..95e727c35109 100644
--- a/modular_darkpack/modules/jobs/code/pentex/affairs.dm
+++ b/modular_darkpack/modules/jobs/code/pentex/affairs.dm
@@ -2,7 +2,7 @@
title = JOB_PENTEX_AFFAIRS
description = "You are the internal affairs agent operating for " + MAIN_EVIL_COMPANY + ". You know the bloody and vile needs commanded of destruction will lead to jeopardy, and your duty is to see excellence on task rewarded and acknowledged, and curb the invariable atrocities that could endanger the greater plans of Pentex."
auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
- faction = FACTION_CITY
+ faction = FACTION_PENTEX
total_positions = 1
spawn_positions = 1
supervisors = "the Board and the Branch Lead"
@@ -17,8 +17,9 @@
outfit = /datum/outfit/job/vampire/affairs
allowed_splats = list(SPLAT_GAROU)
-// allowed_tribes = list(TRIBE_WYRM, TRIBE_RONIN)
minimal_masquerade = 5
+ // minimal_renown_rank = 3
+ allowed_tribes = list(TRIBE_BLACK_SPIRAL_DANCERS, TRIBE_RONIN)
display_order = JOB_DISPLAY_ORDER_AFFAIRS
department_for_prefs = /datum/job_department/pentex
@@ -32,7 +33,6 @@
JOB_PENTEX_SEC_CHIEF
)
-// minimal_renownrank = 3
paycheck = PAYCHECK_COMMAND
paycheck_department = ACCOUNT_SEC
diff --git a/modular_darkpack/modules/jobs/code/pentex/branch_lead.dm b/modular_darkpack/modules/jobs/code/pentex/branch_lead.dm
index 4d575aa2f24e..c2f73d53cfd7 100644
--- a/modular_darkpack/modules/jobs/code/pentex/branch_lead.dm
+++ b/modular_darkpack/modules/jobs/code/pentex/branch_lead.dm
@@ -2,7 +2,7 @@
title = JOB_PENTEX_LEAD
description = "You are the current branch leader for " + MAIN_EVIL_COMPANY + " , operating out of San Francisco. Your job is to fuel production and keep your clowns in line."
auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
- faction = FACTION_CITY
+ faction = FACTION_PENTEX
total_positions = 1
spawn_positions = 1
supervisors = "the Board"
@@ -23,8 +23,9 @@
"Endron Operations Director"
)
-// allowed_tribes = list(TRIBE_WYRM, TRIBE_RONIN)
minimal_masquerade = 5
+ // minimal_renown_rank = 4
+ allowed_tribes = list(TRIBE_BLACK_SPIRAL_DANCERS, TRIBE_RONIN)
display_order = JOB_DISPLAY_ORDER_BRANCH_LEAD
department_for_prefs = /datum/job_department/pentex
@@ -38,7 +39,6 @@
JOB_PENTEX_SEC_CHIEF
)
-// minimal_renownrank = 4
paycheck = PAYCHECK_COMMAND
paycheck_department = ACCOUNT_SEC
diff --git a/modular_darkpack/modules/jobs/code/pentex/employee.dm b/modular_darkpack/modules/jobs/code/pentex/employee.dm
index 348b9f273fd7..f588b1369558 100644
--- a/modular_darkpack/modules/jobs/code/pentex/employee.dm
+++ b/modular_darkpack/modules/jobs/code/pentex/employee.dm
@@ -2,7 +2,7 @@
title = JOB_PENTEX_EMPLOYEE
description = "You are an employee for " + MAIN_EVIL_COMPANY + ", operating out of San Francisco. Your bosses can be a little strange; give credence to the security team and executives for tasks on the night shift, and avoid getting negative attention from the branch manager or internal affairs."
auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
- faction = FACTION_CITY
+ faction = FACTION_PENTEX
total_positions = 3
spawn_positions = 3
supervisors = "the Board and the Branch Lead"
@@ -24,7 +24,7 @@
"Endron Labourer"
)
-// allowed_tribes = list(TRIBE_WYRM, TRIBE_RONIN)
+ allowed_tribes = list(TRIBE_BLACK_SPIRAL_DANCERS, TRIBE_RONIN)
minimal_masquerade = 3
display_order = JOB_DISPLAY_ORDER_EMPLOYEE
diff --git a/modular_darkpack/modules/jobs/code/pentex/executive.dm b/modular_darkpack/modules/jobs/code/pentex/executive.dm
index 87b7241d91bf..17ea59a3265a 100644
--- a/modular_darkpack/modules/jobs/code/pentex/executive.dm
+++ b/modular_darkpack/modules/jobs/code/pentex/executive.dm
@@ -2,7 +2,7 @@
title = JOB_PENTEX_EXEC
description = "You are an acting executive for " + MAIN_EVIL_COMPANY + " operating out of San Francisco. With discretion to the Branch Leader, a position you may aim for, your job is to fuel production and expand operations."
auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
- faction = FACTION_CITY
+ faction = FACTION_PENTEX
total_positions = 1
spawn_positions = 1
supervisors = "the Board and the Branch Lead"
@@ -29,8 +29,9 @@
)
allowed_splats = list(SPLAT_GAROU, SPLAT_KINDRED)
-// allowed_tribes = list(TRIBE_WYRM, TRIBE_RONIN)
minimal_masquerade = 4
+ // minimal_renown_rank = 3
+ allowed_tribes = list(TRIBE_BLACK_SPIRAL_DANCERS, TRIBE_RONIN)
display_order = JOB_DISPLAY_ORDER_EXECUTIVE
department_for_prefs = /datum/job_department/pentex
@@ -44,7 +45,6 @@
JOB_PENTEX_SEC_CHIEF
)
-// minimal_renownrank = 3
paycheck = PAYCHECK_COMMAND
paycheck_department = ACCOUNT_SEC
diff --git a/modular_darkpack/modules/jobs/code/pentex/sec.dm b/modular_darkpack/modules/jobs/code/pentex/sec.dm
index 979e3729f0e3..86b6cf3a3925 100644
--- a/modular_darkpack/modules/jobs/code/pentex/sec.dm
+++ b/modular_darkpack/modules/jobs/code/pentex/sec.dm
@@ -2,7 +2,7 @@
title = JOB_PENTEX_SEC
description = "You are an acting security for " + MAIN_EVIL_COMPANY + ", operating out of San Francisco. Under the chief of security's direction, your job is to keep the complex free of nosy meddlers, pick up contract violators, and to assist the chief in tackling threats to corporate assets."
auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
- faction = FACTION_CITY
+ faction = FACTION_PENTEX
total_positions = 2
spawn_positions = 2
supervisors = "the Board, Branch Lead, and Chief of Security"
@@ -16,7 +16,7 @@
job_flags = CITY_JOB_FLAGS
outfit = /datum/outfit/job/vampire/pentex_sec
-// allowed_tribes = list(TRIBE_WYRM, TRIBE_RONIN)
+ allowed_tribes = list(TRIBE_BLACK_SPIRAL_DANCERS, TRIBE_RONIN)
minimal_masquerade = 3
display_order = JOB_DISPLAY_ORDER_PENTEX_SEC
diff --git a/modular_darkpack/modules/jobs/code/pentex/secchief.dm b/modular_darkpack/modules/jobs/code/pentex/secchief.dm
index 6dc7b76ddee0..d5d740e9ee29 100644
--- a/modular_darkpack/modules/jobs/code/pentex/secchief.dm
+++ b/modular_darkpack/modules/jobs/code/pentex/secchief.dm
@@ -2,7 +2,7 @@
title = JOB_PENTEX_SEC_CHIEF
description = "You are an acting chief of security for the Endron Oil Refinery, operating out of San Francisco. With discretion to the Branch Leader, your job is to keep the complex and it's proprietary information with the help of your security team, and to turn over contract violators to internal affairs or the executives."
auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
- faction = FACTION_CITY
+ faction = FACTION_PENTEX
total_positions = 1
spawn_positions = 1
supervisors = "the Board and the Branch Lead"
@@ -17,8 +17,9 @@
outfit = /datum/outfit/job/vampire/secchief
allowed_splats = list(SPLAT_GAROU, SPLAT_KINDRED)
-// allowed_tribes = list(TRIBE_WYRM, TRIBE_RONIN)
minimal_masquerade = 4
+ // minimal_renown_rank = 3
+ allowed_tribes = list(TRIBE_BLACK_SPIRAL_DANCERS, TRIBE_RONIN)
display_order = JOB_DISPLAY_ORDER_SECCHIEF
department_for_prefs = /datum/job_department/pentex
@@ -32,7 +33,6 @@
JOB_PENTEX_AFFAIRS
)
-// minimal_renownrank = 3
paycheck = PAYCHECK_COMMAND
paycheck_department = ACCOUNT_SEC
diff --git a/modular_darkpack/modules/jobs/code/police/fbi.dm b/modular_darkpack/modules/jobs/code/police/fbi.dm
index dab4b04796be..32e67b90eb1a 100644
--- a/modular_darkpack/modules/jobs/code/police/fbi.dm
+++ b/modular_darkpack/modules/jobs/code/police/fbi.dm
@@ -24,7 +24,7 @@
name = "Federal Investigator"
jobtype = /datum/job/vampire/fbi
- ears = /obj/item/radio/headset/darkpack
+ ears = /obj/item/radio/headset/darkpack/police
uniform = /obj/item/clothing/under/vampire/office
shoes = /obj/item/clothing/shoes/vampire
suit = /obj/item/clothing/suit/vampire/jacket/fbi
@@ -32,8 +32,8 @@
id = /obj/item/card/police/fbi
gloves = /obj/item/clothing/gloves/vampire/investigator
l_pocket = /obj/item/smartphone
- l_hand = /obj/item/vamp/keys/police/federal
- backpack_contents = list(/obj/item/card/police/sergeant=1, /obj/item/camera/detective=1, /obj/item/camera_film=1, /obj/item/taperecorder=1, /obj/item/tape=1, /obj/item/card/credit=1, /obj/item/ammo_box/darkpack/c45acp=1, /obj/item/storage/medkit/darkpack/ifak=1)
+ r_pocket = /obj/item/vamp/keys/police/federal
+ backpack_contents = list(/obj/item/card/police/sergeant=1, /obj/item/camera/detective=1, /obj/item/camera_film=1, /obj/item/taperecorder=1, /obj/item/tape=1, /obj/item/card/credit=1, /obj/item/ammo_box/darkpack/c45acp/hp=1, /obj/item/storage/medkit/darkpack/ifak=1)
/datum/outfit/job/vampire/fbi/post_equip(mob/living/carbon/human/agent)
..()
diff --git a/modular_darkpack/modules/jobs/code/sabbat/ductus.dm b/modular_darkpack/modules/jobs/code/sabbat/ductus.dm
index c8bdbf80a59d..510f4f10c5fe 100644
--- a/modular_darkpack/modules/jobs/code/sabbat/ductus.dm
+++ b/modular_darkpack/modules/jobs/code/sabbat/ductus.dm
@@ -1,6 +1,6 @@
/datum/job/vampire/sabbatductus
title = JOB_SABBAT_DUCTUS
- faction = FACTION_CITY
+ faction = FACTION_SABBAT
total_positions = 1
spawn_positions = 1
supervisors = "Caine"
diff --git a/modular_darkpack/modules/jobs/code/sabbat/pack.dm b/modular_darkpack/modules/jobs/code/sabbat/pack.dm
index 033c93338d2f..86b3fa345637 100644
--- a/modular_darkpack/modules/jobs/code/sabbat/pack.dm
+++ b/modular_darkpack/modules/jobs/code/sabbat/pack.dm
@@ -1,6 +1,6 @@
/datum/job/vampire/sabbatpack
title = JOB_SABBAT_PACK
- faction = FACTION_CITY
+ faction = FACTION_SABBAT
total_positions = 5
spawn_positions = 5
supervisors = "Caine"
diff --git a/modular_darkpack/modules/jobs/code/sabbat/priest.dm b/modular_darkpack/modules/jobs/code/sabbat/priest.dm
index cef77bc70de7..c6c070bd476e 100644
--- a/modular_darkpack/modules/jobs/code/sabbat/priest.dm
+++ b/modular_darkpack/modules/jobs/code/sabbat/priest.dm
@@ -1,6 +1,6 @@
/datum/job/vampire/sabbatpriest
title = JOB_SABBAT_PRIEST
- faction = FACTION_CITY
+ faction = FACTION_SABBAT
total_positions = 2
spawn_positions = 2
supervisors = "Caine"
diff --git a/modular_darkpack/modules/jobs/code/tremere/archivist.dm b/modular_darkpack/modules/jobs/code/tremere/archivist.dm
index 4b4c9172b8e6..4d6b9d801257 100644
--- a/modular_darkpack/modules/jobs/code/tremere/archivist.dm
+++ b/modular_darkpack/modules/jobs/code/tremere/archivist.dm
@@ -1,6 +1,6 @@
/datum/job/vampire/archivist
title = JOB_CHANTRY_ARCHIVIST
- faction = FACTION_CITY
+ faction = FACTION_CAMARILLA
total_positions = 4
spawn_positions = 4
supervisors = SUPERVISOR_REGENT
diff --git a/modular_darkpack/modules/jobs/code/tremere/gargoyle.dm b/modular_darkpack/modules/jobs/code/tremere/gargoyle.dm
index e4063e029936..ff958291fee0 100644
--- a/modular_darkpack/modules/jobs/code/tremere/gargoyle.dm
+++ b/modular_darkpack/modules/jobs/code/tremere/gargoyle.dm
@@ -1,6 +1,6 @@
/datum/job/vampire/gargoyle
title = JOB_CHANTRY_GARGOYLE
- faction = FACTION_CITY
+ faction = FACTION_CAMARILLA
total_positions = 5
spawn_positions = 5
supervisors = SUPERVISOR_REGENT
diff --git a/modular_darkpack/modules/jobs/code/tremere/regent.dm b/modular_darkpack/modules/jobs/code/tremere/regent.dm
index da5eda4b66ca..95a8c6a66126 100644
--- a/modular_darkpack/modules/jobs/code/tremere/regent.dm
+++ b/modular_darkpack/modules/jobs/code/tremere/regent.dm
@@ -1,6 +1,6 @@
/datum/job/vampire/regent
title = JOB_CHANTRY_REGENT
- faction = FACTION_CITY
+ faction = FACTION_CAMARILLA
total_positions = 1
spawn_positions = 1
supervisors = SUPERVISOR_CAMARILLA
diff --git a/modular_darkpack/modules/jobs/code/tzimisce/bogatyr.dm b/modular_darkpack/modules/jobs/code/tzimisce/bogatyr.dm
index 6eb746c9987d..580828b43968 100644
--- a/modular_darkpack/modules/jobs/code/tzimisce/bogatyr.dm
+++ b/modular_darkpack/modules/jobs/code/tzimisce/bogatyr.dm
@@ -1,7 +1,7 @@
/datum/job/vampire/bogatyr
title = JOB_BOGATYR
- faction = FACTION_CITY
+ faction = FACTION_SABBAT
total_positions = 4
spawn_positions = 4
supervisors = " the Laws of Hospitality"
diff --git a/modular_darkpack/modules/jobs/code/tzimisce/voivode.dm b/modular_darkpack/modules/jobs/code/tzimisce/voivode.dm
index 10f3359806d0..27402ed33a77 100644
--- a/modular_darkpack/modules/jobs/code/tzimisce/voivode.dm
+++ b/modular_darkpack/modules/jobs/code/tzimisce/voivode.dm
@@ -1,6 +1,6 @@
/datum/job/vampire/voivode
title = JOB_VOIVODE
- faction = FACTION_CITY
+ faction = FACTION_SABBAT
total_positions = 1
spawn_positions = 1
supervisors = " the Laws of Hospitality"
diff --git a/modular_darkpack/modules/jobs/code/tzimisce/zadruga.dm b/modular_darkpack/modules/jobs/code/tzimisce/zadruga.dm
index 6584fda472de..97c768db2384 100644
--- a/modular_darkpack/modules/jobs/code/tzimisce/zadruga.dm
+++ b/modular_darkpack/modules/jobs/code/tzimisce/zadruga.dm
@@ -1,6 +1,6 @@
/datum/job/vampire/zadruga
title = JOB_ZADRUGA
- faction = FACTION_CITY
+ faction = FACTION_SABBAT
total_positions = 2
spawn_positions = 2
supervisors = " the Laws of Hospitality"
diff --git a/modular_darkpack/modules/jobs/icons/landmarks.dmi b/modular_darkpack/modules/jobs/icons/landmarks.dmi
index 6ca55a600355..0b7a01cff0e1 100644
Binary files a/modular_darkpack/modules/jobs/icons/landmarks.dmi and b/modular_darkpack/modules/jobs/icons/landmarks.dmi differ
diff --git a/modular_darkpack/modules/jumping/code/jumper_component.dm b/modular_darkpack/modules/jumping/code/jumper_component.dm
index c67c9c3721ea..3ed0ef927323 100644
--- a/modular_darkpack/modules/jumping/code/jumper_component.dm
+++ b/modular_darkpack/modules/jumping/code/jumper_component.dm
@@ -56,6 +56,9 @@
if(HAS_TRAIT(jumper, TRAIT_FLOORED))
return
+ if(jumper.body_position == LYING_DOWN)
+ return
+
if(jumper.buckled)
return
diff --git a/modular_darkpack/modules/merits_flaws/code/config.dm b/modular_darkpack/modules/merits_flaws/code/config.dm
new file mode 100644
index 000000000000..a65fdfca9719
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/config.dm
@@ -0,0 +1,3 @@
+/datum/config_entry/flag/roleplay_only_merits
+ default = TRUE
+ protection = CONFIG_ENTRY_LOCKED // Config does nothing after initlize. dont trick people into thinking they can edit
diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/amnesia.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/amnesia.dm
index 336bd10a02e6..5ead71367ba8 100644
--- a/modular_darkpack/modules/merits_flaws/code/negative_quirks/amnesia.dm
+++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/amnesia.dm
@@ -6,3 +6,4 @@
lose_text = span_notice("Oh, I remember now.")
icon = FA_ICON_BRAIN
failure_message = "Oh, I remember now."
+ roleplay_only = TRUE
diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/animal_musk.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/animal_musk.dm
index 0f683a469923..e74c921fbec8 100644
--- a/modular_darkpack/modules/merits_flaws/code/negative_quirks/animal_musk.dm
+++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/animal_musk.dm
@@ -2,10 +2,13 @@
/datum/quirk/darkpack/animal_musk
name = "Animal Musk"
// A little unsure who to do the logic on the social roll rn.
- desc = {"(This is roleplay/flavor text at the moment) You have the odor of an animal, even in Homid form.
+ desc = {"You have the odor of an animal, even in Homid form."}
+ /*
+ desc = {"You have the odor of an animal, even in Homid form.
Whenever you are indoors or in a crowd of people, you make all Social rolls at a +2 difficulty.
Outdoors or in situations where you can distance yourself from humans, your odor is not noticeable.
Wolves (and lupus-born Garou) take little notice of this Flaw.."}
+ */
value = -1
mob_trait = TRAIT_ANIMAL_MUSK
icon = FA_ICON_SPRAY_CAN_SPARKLES // icon = FA_ICON_BUGS
diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/horrific_appearance_quirk.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/horrific_appearance_quirk.dm
index 44c0ac503f1e..b440d0ecbb70 100644
--- a/modular_darkpack/modules/merits_flaws/code/negative_quirks/horrific_appearance_quirk.dm
+++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/horrific_appearance_quirk.dm
@@ -10,15 +10,15 @@
icon = FA_ICON_SKULL
failure_message = "The skin on your corpsely flesh returns to normal."
-/datum/quirk/darkpack/horrific_appearance/add_to_holder(mob/living/new_holder, quirk_transfer, client/client_source, unique, announce)
- . = ..()
- if(ishuman(new_holder))
- var/mob/living/carbon/human/human_holder = new_holder
- var/years_undead = human_holder.chronological_age - human_holder.age
- switch(years_undead)
- if (-INFINITY to 500)
- human_holder.rot_body(3)
- if (500 to INFINITY)
- human_holder.rot_body(4)
- if(human_holder.st_get_stat(STAT_APPEARANCE) > 0)
- human_holder.st_add_stat_mod(STAT_APPEARANCE, -(STAT_APPEARANCE), "Monstrous")
+/datum/quirk/darkpack/horrific_appearance/add(client/client_source)
+ var/mob/living/carbon/human/human_holder = astype(quirk_holder)
+ if(!human_holder)
+ return
+ var/years_undead = human_holder.chronological_age - human_holder.age
+ switch(years_undead)
+ if (-INFINITY to 500)
+ human_holder.rot_body(3)
+ if (500 to INFINITY)
+ human_holder.rot_body(4)
+ if(human_holder.st_get_stat(STAT_APPEARANCE) > 0)
+ human_holder.st_add_stat_mod(STAT_APPEARANCE, -(STAT_APPEARANCE), "Monstrous")
diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/mage_blood.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/mage_blood.dm
index 9faffbd7d074..3a81f8eca09e 100644
--- a/modular_darkpack/modules/merits_flaws/code/negative_quirks/mage_blood.dm
+++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/mage_blood.dm
@@ -6,8 +6,7 @@
allowed_splats = list(SPLAT_KINDRED)
included_clans = list(VAMPIRE_CLAN_TREMERE)
-/datum/quirk/darkpack/mage_blood/add_to_holder(mob/living/new_holder, quirk_transfer, client/client_source, unique, announce)
- . = ..()
+/datum/quirk/darkpack/mage_blood/add(client/client_source)
var/datum/splat/vampire/kindred/kindred_splat = get_kindred_splat(quirk_holder)
if(!kindred_splat)
return
diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/monstrous_quirk.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/monstrous_quirk.dm
index 7c390703f1e6..31250e037bf7 100644
--- a/modular_darkpack/modules/merits_flaws/code/negative_quirks/monstrous_quirk.dm
+++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/monstrous_quirk.dm
@@ -10,11 +10,11 @@
icon = FA_ICON_FACE_ANGRY
failure_message = "Your appearance softens, as though a great weight is lifted - you may bare your face again."
-/datum/quirk/darkpack/monstrous/add_to_holder(mob/living/new_holder, quirk_transfer, client/client_source, unique, announce)
- . = ..()
- if(ishuman(new_holder))
- var/mob/living/carbon/human/human_holder = new_holder
- human_holder.rot_body(1)
- ADD_TRAIT(human_holder, TRAIT_MASQUERADE_VIOLATING_FACE, "Monstrous")
- if(human_holder.st_get_stat(STAT_APPEARANCE) > 0)
- human_holder.st_add_stat_mod(STAT_APPEARANCE, -(STAT_APPEARANCE), "Monstrous")
+/datum/quirk/darkpack/monstrous/add(client/client_source)
+ var/mob/living/carbon/human/human_holder = astype(quirk_holder)
+ if(!human_holder)
+ return
+ human_holder.rot_body(1)
+ ADD_TRAIT(human_holder, TRAIT_MASQUERADE_VIOLATING_FACE, "Monstrous")
+ if(human_holder.st_get_stat(STAT_APPEARANCE) > 0)
+ human_holder.st_add_stat_mod(STAT_APPEARANCE, -human_holder.st_get_stat(STAT_APPEARANCE), "Monstrous")
diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/thaumaturgically_inept.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/thaumaturgically_inept.dm
index a28dd948d995..a5bbe779b9bd 100644
--- a/modular_darkpack/modules/merits_flaws/code/negative_quirks/thaumaturgically_inept.dm
+++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/thaumaturgically_inept.dm
@@ -6,9 +6,8 @@
allowed_splats = list(SPLAT_KINDRED)
included_clans = list(VAMPIRE_CLAN_TREMERE)
-/datum/quirk/darkpack/thaumaturgically_inept/add_to_holder(mob/living/new_holder, quirk_transfer, client/client_source, unique, announce)
- . = ..()
- var/datum/splat/vampire/kindred/kindred_splat = get_kindred_splat(new_holder)
+/datum/quirk/darkpack/thaumaturgically_inept/add(client/client_source)
+ var/datum/splat/vampire/kindred/kindred_splat = get_kindred_splat(quirk_holder)
if(!kindred_splat)
return
kindred_splat.remove_power(/datum/discipline/thaumaturgy)
diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/third_eye.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/third_eye.dm
new file mode 100644
index 000000000000..53efc1ac75fd
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/third_eye.dm
@@ -0,0 +1,27 @@
+/datum/quirk/darkpack/permanent_third_eye
+ name = "Permanent Third Eye"
+ desc = "While most third eyes can be closed and appear on the forehead as if it were a scar of some sort, your third eye is almost always wide-open on your forehead. For Salubri, this is a dangerous proposition, exposing you to Kindred who believe the Tremere's stories of your clan being rife with infernal diablerists. For Tremere, this flaw manifests as a miraculous inheritance of the Diablerie of Saulot, almost certainly dooming your standing in Clan Tremere to be mistrusted at best, and immediately killed at worse. Your permanent third eye can be covered with a hat. This flaw is only available to Tremere and Salubri."
+ value = -2
+ mob_trait = TRAIT_THIRD_EYE
+ gain_text = span_notice("Saulot curses you for your forefather's crime. Your third eye opens to never close again.")
+ lose_text = span_notice("Your third eye shuts once again.")
+ allowed_splats = list(SPLAT_KINDRED)
+ included_clans = list(VAMPIRE_CLAN_TREMERE)
+ icon = FA_ICON_EYE
+ failure_message = "Your blood resists the urge to open the third eye."
+
+/datum/quirk/darkpack/permanent_third_eye/add_to_holder(mob/living/new_holder, quirk_transfer, client/client_source, unique, announce)
+ . = ..()
+ if(iscarbon(new_holder))
+ var/mob/living/carbon/carbon_holder = new_holder
+ var/obj/item/organ/eyes/salubri/three_eyes = new()
+ three_eyes.Insert(carbon_holder, TRUE, DELETE_IF_REPLACED)
+
+/datum/quirk/darkpack/permanent_third_eye/remove_from_current_holder(quirk_transfer)
+ . = ..()
+ // replace eyes
+ var/eye_type = /obj/item/organ/eyes
+ var/obj/item/organ/eyes/new_eyes = new eye_type()
+ new_eyes.Insert(quirk_holder, TRUE, DELETE_IF_REPLACED)
+
+
diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/vengeful.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/vengeful.dm
index 5c7b5657267d..4f9c46d4e14c 100644
--- a/modular_darkpack/modules/merits_flaws/code/negative_quirks/vengeful.dm
+++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/vengeful.dm
@@ -6,3 +6,4 @@
lose_text = span_notice("You don't really care about vengeance anymore.")
icon = FA_ICON_FACE_ANGRY
failure_message = "You don't really care about vengeance anymore."
+ roleplay_only = TRUE
diff --git a/modular_darkpack/modules/merits_flaws/code/neutral_quirks/illegal_identity.dm b/modular_darkpack/modules/merits_flaws/code/neutral_quirks/illegal_identity.dm
index 7011d373b5b4..e798c18f029b 100644
--- a/modular_darkpack/modules/merits_flaws/code/neutral_quirks/illegal_identity.dm
+++ b/modular_darkpack/modules/merits_flaws/code/neutral_quirks/illegal_identity.dm
@@ -14,9 +14,10 @@
/datum/quirk/darkpack/illegal_identity/add()
. = ..()
- if(!ishuman(quirk_holder))
+ var/mob/living/carbon/human/criminal = astype(quirk_holder)
+ if(!criminal)
return
- var/mob/living/carbon/human/criminal = quirk_holder
+
var/obj/item/passport/passport = locate() in criminal // In pockets
if(!passport && criminal.back)
passport = locate() in criminal.back // In backpack
diff --git a/modular_darkpack/modules/merits_flaws/code/old_quirks.dm b/modular_darkpack/modules/merits_flaws/code/old_quirks.dm
index 932adc99a81a..b7868645b0bc 100644
--- a/modular_darkpack/modules/merits_flaws/code/old_quirks.dm
+++ b/modular_darkpack/modules/merits_flaws/code/old_quirks.dm
@@ -271,7 +271,7 @@ Dancer
medical_record_text = "Patient has aggressive flesh eating bacteria in their boody."
allowed_splats = list("Vampire", "Ghoul", "Human", "Kuei-Jin")
-/datum/quirk/consumption/on_process(delta_time)
+/datum/quirk/consumption/on_process(seconds_per_tick)
if(prob(5))
quirk_holder.adjust_brute_loss(5, TRUE)
diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/beserk.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/beserker.dm
similarity index 70%
rename from modular_darkpack/modules/merits_flaws/code/positive_quirks/beserk.dm
rename to modular_darkpack/modules/merits_flaws/code/positive_quirks/beserker.dm
index debce1198337..bd74f3d98208 100644
--- a/modular_darkpack/modules/merits_flaws/code/positive_quirks/beserk.dm
+++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/beserker.dm
@@ -1,7 +1,6 @@
-/* DARKPACK TODO - FRENZY
-// W20 p. 473
-/datum/quirk/darkpack/metamorph
- name = "Metamorph"
+// W20 p. 476
+/datum/quirk/darkpack/beserker
+ name = "Berserker"
desc = {"You have uncanny control over your inner anger, and can use your Rage as most Garou cannot.
You can enter a berserk frenzy at will, ignoring your wound penalties.
You still suffer the consequences of any actions committed in the throes of frenzy.
@@ -10,14 +9,10 @@
icon = FA_ICON_ANGRY
allowed_splats = SPLAT_SHIFTERS
-/datum/quirk/darkpack/metamorph/add(client/client_source)
+/datum/quirk/darkpack/beserker/add(client/client_source)
. = ..()
add_verb(quirk_holder, /mob/living/carbon/human/proc/manual_frenzy)
-/datum/quirk/darkpack/metamorph/remove()
+/datum/quirk/darkpack/beserker/remove()
. = ..()
remove_verb(quirk_holder, /mob/living/carbon/human/proc/manual_frenzy)
-
-/mob/living/carbon/human/proc/manual_frenzy()
- return
-*/
diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/blush_of_health_quirk.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/blush_of_health_quirk.dm
new file mode 100644
index 000000000000..c0f8c98e1765
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/blush_of_health_quirk.dm
@@ -0,0 +1,10 @@
+/datum/quirk/darkpack/blush_of_health
+ name = "Blush of Health"
+ desc = "Some Kindred are capable of maintaining the illusion of life more convincingly than their peers. With minimal effort, you can appear flushed, warm, and breathing, making it significantly harder for others to identify you as one of the Undead. While active, you seem more alive than before."
+ value = 1
+ mob_trait = TRAIT_BLUSH_OF_HEALTH
+ gain_text = span_notice("A faint warmth spreads across your skin as the blush of health settles over you.")
+ lose_text = span_notice("The warmth fades from your skin, leaving you pallid and cold once more.")
+ allowed_splats = list(SPLAT_KINDRED)
+ icon = FA_ICON_HEART
+
diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/eat_food_quirk.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/eat_food_quirk.dm
new file mode 100644
index 000000000000..d6733ff44ca0
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/eat_food_quirk.dm
@@ -0,0 +1,18 @@
+/datum/quirk/darkpack/eat_food
+ name = "Eat Food"
+ desc = "Unlike most of the Undead, you retain the ability to eat and digest food normally, a semblance of your mortal life. While you gain no nourishment from it, you can consume food without the usual revulsion Kindred experience. Be warned: what goes down must come up, eventually."
+ value = 1
+ mob_trait = TRAIT_EAT_FOOD
+ gain_text = span_notice("Your stomach stirs as you feel the organ come to life. You can now eat food.")
+ lose_text = span_notice("The ability to eat food fades from you.")
+ allowed_splats = list(SPLAT_KINDRED)
+ icon = FA_ICON_UTENSILS
+
+/datum/quirk/darkpack/eat_food/add(client/client_source)
+ var/mob/living/carbon/human/human_holder = astype(quirk_holder)
+ if(!human_holder)
+ return
+ var/obj/item/organ/tongue/tongue = human_holder.get_organ_by_type(/obj/item/organ/tongue)
+ tongue?.liked_foodtypes = initial(tongue.liked_foodtypes)
+ tongue?.disliked_foodtypes = initial(tongue.disliked_foodtypes)
+ tongue?.toxic_foodtypes = initial(tongue.toxic_foodtypes)
diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/giovanni_sanguine_incongruity.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/giovanni_sanguine_incongruity.dm
index 7060fab2a8ce..f0d55034d7ea 100644
--- a/modular_darkpack/modules/merits_flaws/code/positive_quirks/giovanni_sanguine_incongruity.dm
+++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/giovanni_sanguine_incongruity.dm
@@ -10,12 +10,11 @@
icon = FA_ICON_SKULL_CROSSBONES
failure_message = "Somehow the Giovanni's Curse of Lamia returns, and your bite becomes far more painful. At least now your skin is more flush with life."
-/datum/quirk/darkpack/giovanni_sanguine_incongruity/add_to_holder(mob/living/new_holder, quirk_transfer, client/client_source, unique, announce)
- . = ..()
- if(!ishuman(new_holder))
+/datum/quirk/darkpack/giovanni_sanguine_incongruity/add(client/client_source)
+ var/mob/living/carbon/human/human_holder = astype(quirk_holder)
+ if(!human_holder)
return
-
- var/mob/living/carbon/human/human_holder = new_holder
+
var/datum/splat/vampire/kindred/kindred = get_kindred_splat(human_holder)
if(kindred)
if(istype(kindred.clan, /datum/subsplat/vampire_clan/giovanni))
diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/stillness_of_death.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/stillness_of_death.dm
index 84f7913cef77..1fe2b40148ce 100644
--- a/modular_darkpack/modules/merits_flaws/code/positive_quirks/stillness_of_death.dm
+++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/stillness_of_death.dm
@@ -10,10 +10,9 @@
icon = FA_ICON_MOUNTAIN
failure_message = "You don't want to hide as a statue anymore."
-/datum/quirk/darkpack/stillness_of_death/add_to_holder(mob/living/new_holder, quirk_transfer, client/client_source, unique, announce)
- . = ..()
+/datum/quirk/darkpack/stillness_of_death/add(client/client_source)
var/datum/action/gargoyle_statue_form/statue_action = new()
- statue_action.Grant(new_holder)
+ statue_action.Grant(quirk_holder)
/datum/action/gargoyle_statue_form
name = "Statue Form"
diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/wolf_sight.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/wolf_sight.dm
new file mode 100644
index 000000000000..6c07e73e1c1c
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/wolf_sight.dm
@@ -0,0 +1,21 @@
+/datum/quirk/darkpack/wolf_sight
+ name = "Wolf Sight"
+ desc = {"In all your forms, you see colors and intensities of light as a wolf does.
+ Your color vision is slightly less distinct than that of humans, though you embrace the full spectrum of colors.
+ Your night vision, however, far surpasses human nocturnal vision."}
+ // Perception is not real yet.
+ // You also notice movement more readily. You gain an extra die to all visually-based Perception rolls that involve movement or take place at night."}
+ value = 1
+ mob_trait = TRAIT_TRUE_NIGHT_VISION
+ icon = FA_ICON_DOG
+ allowed_splats = list(SPLAT_GAROU)
+
+/datum/quirk/darkpack/wolf_sight/add(client/client_source)
+ quirk_holder.add_client_colour(/datum/client_colour/wolf_sight, REF(src))
+
+/datum/quirk/darkpack/wolf_sight/remove()
+ quirk_holder.remove_client_colour(REF(src))
+
+
+/datum/client_colour/wolf_sight
+ color = "#e6e6e6"
diff --git a/modular_darkpack/modules/merits_flaws/merits_flaws.md b/modular_darkpack/modules/merits_flaws/readme.md
similarity index 100%
rename from modular_darkpack/modules/merits_flaws/merits_flaws.md
rename to modular_darkpack/modules/merits_flaws/readme.md
diff --git a/modular_darkpack/modules/npc/code/human/__npc.dm b/modular_darkpack/modules/npc/code/human/__npc.dm
index 75475e576b89..d537417ff6e2 100644
--- a/modular_darkpack/modules/npc/code/human/__npc.dm
+++ b/modular_darkpack/modules/npc/code/human/__npc.dm
@@ -167,15 +167,17 @@
return
is_talking = TRUE
- addtimer(CALLBACK(src, PROC_REF(start_talking), message), 2 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(start_talking), message), 1 SECONDS)
/mob/living/carbon/human/npc/proc/start_talking(message)
+ ADD_TRAIT(src, TRAIT_THINKING_IN_CHARACTER, CURRENTLY_TYPING_TRAIT)
create_typing_indicator()
var/typing_delay = round(length_char(message) * 0.5)
addtimer(CALLBACK(src, PROC_REF(finish_talking), message), max(3 SECONDS, typing_delay))
/mob/living/carbon/human/npc/proc/finish_talking(message)
remove_typing_indicator()
+ REMOVE_TRAIT(src, TRAIT_THINKING_IN_CHARACTER, CURRENTLY_TYPING_TRAIT)
say(message)
is_talking = 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
index 4b0b1227923b..3b10be765343 100644
--- a/modular_darkpack/modules/npc/code/human/npc_types/garden.dm
+++ b/modular_darkpack/modules/npc/code/human/npc_types/garden.dm
@@ -1,6 +1,5 @@
/mob/living/carbon/human/npc/garden
staying = TRUE
- is_talking = TRUE
/mob/living/carbon/human/npc/garden/Initialize(mapload)
. = ..()
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/gunstore.dm b/modular_darkpack/modules/npc/code/human/npc_types/gunstore.dm
new file mode 100644
index 000000000000..ea19b80c2153
--- /dev/null
+++ b/modular_darkpack/modules/npc/code/human/npc_types/gunstore.dm
@@ -0,0 +1,7 @@
+/mob/living/carbon/human/npc/gunstore
+ staying = TRUE
+
+/mob/living/carbon/human/npc/gunstore/Initialize(mapload)
+ . = ..()
+
+ AssignSocialRole(/datum/socialrole/shop/gunstore)
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/hardwarestore.dm b/modular_darkpack/modules/npc/code/human/npc_types/hardwarestore.dm
new file mode 100644
index 000000000000..947aee85c158
--- /dev/null
+++ b/modular_darkpack/modules/npc/code/human/npc_types/hardwarestore.dm
@@ -0,0 +1,7 @@
+/mob/living/carbon/human/npc/hardwarestore
+ staying = TRUE
+
+/mob/living/carbon/human/npc/hardwarestore/Initialize(mapload)
+ . = ..()
+
+ AssignSocialRole(/datum/socialrole/shop/hardwarestore)
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/huntingstore.dm b/modular_darkpack/modules/npc/code/human/npc_types/huntingstore.dm
new file mode 100644
index 000000000000..4bb604f0d7e7
--- /dev/null
+++ b/modular_darkpack/modules/npc/code/human/npc_types/huntingstore.dm
@@ -0,0 +1,7 @@
+/mob/living/carbon/human/npc/campingstore
+ staying = TRUE
+
+/mob/living/carbon/human/npc/campingstore/Initialize(mapload)
+ . = ..()
+
+ AssignSocialRole(/datum/socialrole/shop/campingstore)
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/illegal.dm b/modular_darkpack/modules/npc/code/human/npc_types/illegal.dm
index 25f5ef547e89..2f0598f70bb6 100644
--- a/modular_darkpack/modules/npc/code/human/npc_types/illegal.dm
+++ b/modular_darkpack/modules/npc/code/human/npc_types/illegal.dm
@@ -1,6 +1,5 @@
/mob/living/carbon/human/npc/illegal
staying = TRUE
- is_talking = TRUE
/mob/living/carbon/human/npc/illegal/Initialize(mapload)
. = ..()
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/pharmacystore.dm b/modular_darkpack/modules/npc/code/human/npc_types/pharmacystore.dm
new file mode 100644
index 000000000000..55967597de12
--- /dev/null
+++ b/modular_darkpack/modules/npc/code/human/npc_types/pharmacystore.dm
@@ -0,0 +1,7 @@
+/mob/living/carbon/human/npc/pharmacystore
+ staying = TRUE
+
+/mob/living/carbon/human/npc/pharmacystore/Initialize(mapload)
+ . = ..()
+
+ AssignSocialRole(/datum/socialrole/shop/pharmacystore)
diff --git a/modular_darkpack/modules/npc/code/human/npc_types/shop.dm b/modular_darkpack/modules/npc/code/human/npc_types/shop.dm
index 4d2459c23756..eac9a1085ab2 100644
--- a/modular_darkpack/modules/npc/code/human/npc_types/shop.dm
+++ b/modular_darkpack/modules/npc/code/human/npc_types/shop.dm
@@ -1,6 +1,5 @@
/mob/living/carbon/human/npc/shop
staying = TRUE
- is_talking = TRUE
/mob/living/carbon/human/npc/shop/Initialize(mapload)
. = ..()
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/shop/__shop.dm b/modular_darkpack/modules/npc/code/human/socialroles/shop/__shop.dm
index 1643a2ec8587..417b83f06474 100644
--- a/modular_darkpack/modules/npc/code/human/socialroles/shop/__shop.dm
+++ b/modular_darkpack/modules/npc/code/human/socialroles/shop/__shop.dm
@@ -78,7 +78,17 @@
/obj/item/clothing/shoes/vampire,
/obj/item/clothing/shoes/vampire/brown
)
- uniforms = list(/obj/item/clothing/under/vampire/mechanic)
+ uniforms = list(
+ /obj/item/clothing/under/vampire/mechanic,
+ /obj/item/clothing/under/vampire/brujah,
+ /obj/item/clothing/under/vampire/emo,
+ /obj/item/clothing/under/vampire/suit,
+ /obj/item/clothing/under/vampire/turtleneck_black,
+ /obj/item/clothing/under/vampire/office,
+ /obj/item/clothing/under/vampire/gangrel,
+ /obj/item/clothing/under/vampire/tremere,
+ /obj/item/clothing/under/vampire/supply,
+ )
pockets = list(
/obj/item/vamp/keys/npc,
// /obj/item/stack/dollar/rand
@@ -95,9 +105,23 @@
"Hey, wanna buy it?"
)
random_phrases = list(
- "Check this!",
- "Can I help?",
- "Hey, wanna buy it?"
+ "Can I help you find something?",
+ "Let me know if you need anything.",
+ "Take your time.",
+ "Good eye, that one's popular.",
+ "Cash or card, don't matter to me.",
+ "We just got a new shipment in.",
+ "You look like you know what you want.",
+ "That one's on sale. Don't ask why.",
+ "Been a slow day. Glad you stopped in.",
+ "I've been running this place twelve years. Feels like thirty.",
+ "My last employee quit without notice. Hence... this.",
+ "Everything's priced fair. Mostly.",
+ "Take a look around, no pressure.",
+ "The owner's never here. I basically run this place.",
+ "We don't do refunds.",
+ "You need a bag? Bags are five cents. City law. Don't blame me!",
+ "Holler if you need me, I'll be pretending to do inventory.",
)
answer_phrases = list("I just work here...")
help_phrases = list(
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/shop/bacotell.dm b/modular_darkpack/modules/npc/code/human/socialroles/shop/bacotell.dm
index 62ad3f067a0d..ef745ac96ead 100644
--- a/modular_darkpack/modules/npc/code/human/socialroles/shop/bacotell.dm
+++ b/modular_darkpack/modules/npc/code/human/socialroles/shop/bacotell.dm
@@ -1,2 +1,16 @@
/datum/socialrole/shop/bacotell
uniforms = list(/obj/item/clothing/under/vampire/bacotell)
+ hats = list(/obj/item/clothing/head/vampire/baseballcap)
+ random_phrases = list(
+ "Welcome to Bacotell.",
+ "We're not legally responsible for what you do with our food - especially if you eat it.",
+ "The beef is seasoned. With what? How am I supposed to know?",
+ "Yes it's supposed to look like that.",
+ "I've eaten here every day for two years. My doctor is baffled.",
+ "Emergency room? Not again...",
+ "Our nacho cheese was recently approved by the FDA!",
+ "I went to college you know.",
+ "Health Inspector? Phew...",
+ "No, you can't use the bathroom, it's employees only.",
+ "You get what you pay for.",
+ )
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/shop/bubway.dm b/modular_darkpack/modules/npc/code/human/socialroles/shop/bubway.dm
index 39c5b4cb95cc..18ba70488d3d 100644
--- a/modular_darkpack/modules/npc/code/human/socialroles/shop/bubway.dm
+++ b/modular_darkpack/modules/npc/code/human/socialroles/shop/bubway.dm
@@ -1,2 +1,17 @@
/datum/socialrole/shop/bubway
uniforms = list(/obj/item/clothing/under/vampire/bubway)
+ random_phrases = list(
+ "Welcome to Bubway. Please move down the line.",
+ "Yes we have that. No you can't have extra.",
+ "Six inches or twelve?",
+ "I've made ten thousand sandwiches. I feel nothing anymore.",
+ "The bread is fresh. Or, was fresh...",
+ "Ugh, you want it toasted?",
+ "Sir this is a Bubway.",
+ "The veggie patty is technically food.",
+ "Please don't read the reviews...",
+ "Everything is fresh. The meat is from... earlier.",
+ "I'm something of an artist myself! A sandwich artist.",
+ "Health inspector? Phew...",
+ "I've been employee of the month six times. Theres only two of us.",
+ )
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/shop/campingstore.dm b/modular_darkpack/modules/npc/code/human/socialroles/shop/campingstore.dm
new file mode 100644
index 000000000000..737bab1a1000
--- /dev/null
+++ b/modular_darkpack/modules/npc/code/human/socialroles/shop/campingstore.dm
@@ -0,0 +1,17 @@
+/datum/socialrole/shop/campingstore
+ uniforms = list(/obj/item/clothing/under/vampire/military_fatigues)
+ shoes = list(/obj/item/clothing/shoes/vampire/jackboots)
+ hats = list(/obj/item/clothing/head/vampire/baseballcap)
+ gloves = list(/obj/item/clothing/gloves/vampire/leather)
+ random_phrases = list(
+ "Going camping? No? Fishing? No? ...just here for the camoflage clothes?",
+ "That fishing rod - my buddy has one. He hates it.",
+ "Tent stakes? Sure, we got those... you don't want the tent? Weirdo.",
+ "The encampment is under the bridge. I have tents on sale, don't worry.",
+ "Background check? You look trustworthy enough.",
+ "Three day waiting period? That some new law?",
+ "Youre looking for a shovel? Right...",
+ "Just a reminder, the binoculars are for birdwatching, creep.",
+ "You're looking for a chainsaw? ... should I even ask?",
+
+ )
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/shop/garden.dm b/modular_darkpack/modules/npc/code/human/socialroles/shop/garden.dm
index 2ed7bfed9370..a4aade682e18 100644
--- a/modular_darkpack/modules/npc/code/human/socialroles/shop/garden.dm
+++ b/modular_darkpack/modules/npc/code/human/socialroles/shop/garden.dm
@@ -7,6 +7,15 @@
random_phrases = list(
"Just let me know when you're ready.",
"Next, here, please!",
+ "The tomatoes came in early this year, can you believe it?",
+ "We compost everything. Everything.",
+ "My hands haven't been clean in ten years.",
+ "The bees have been very cooperative lately.",
+ "I've named all the plants...",
+ "We don't use pesticides. The bugs are part of the community.",
+ "This one grew a little funny...",
+ "I've been here since six this morning.",
+ "My therapist says I spend too much time here...",
)
help_phrases = list(
"Why would you do that?!",
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/shop/gummaguts.dm b/modular_darkpack/modules/npc/code/human/socialroles/shop/gummaguts.dm
index 01c69491f038..5070a4020744 100644
--- a/modular_darkpack/modules/npc/code/human/socialroles/shop/gummaguts.dm
+++ b/modular_darkpack/modules/npc/code/human/socialroles/shop/gummaguts.dm
@@ -1,2 +1,23 @@
/datum/socialrole/shop/gummaguts
uniforms = list(/obj/item/clothing/under/vampire/gummaguts)
+ hats = list(/obj/item/clothing/head/vampire/baseballcap)
+
+ random_phrases = list(
+ "Welcome to Gummaguts.",
+ "You want fries with that?",
+ "Our beef is 100% beef-adjacent.",
+ "Freshly microwaved just for you.",
+ "The FDA said we have to post that sign.",
+ "No, that smell is normal.",
+ "We're legally required to tell you this contains allergens. All of them.",
+ "Sir this is a Gummaguts.",
+ "The health inspector called it 'aggressively edible.'",
+ "Voted #1 in the city! ...for value.",
+ "Made fresh. 'Fresh' is a legally flexible term.",
+ "Health inspector? Phew...",
+ "Our shake machine is broken.",
+ "You want the combo?",
+ "No, we don't do salads.",
+ "Some people eat here every day.",
+ "Gummaguts - because cooking is for people with time!",
+ )
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/shop/gunstore.dm b/modular_darkpack/modules/npc/code/human/socialroles/shop/gunstore.dm
new file mode 100644
index 000000000000..93ef1ae44585
--- /dev/null
+++ b/modular_darkpack/modules/npc/code/human/socialroles/shop/gunstore.dm
@@ -0,0 +1,36 @@
+/datum/socialrole/shop/gunstore
+ uniforms = list(/obj/item/clothing/under/vampire/military_fatigues)
+ shoes = list(/obj/item/clothing/shoes/vampire/jackboots)
+ hats = list(/obj/item/clothing/head/vampire/baseballcap)
+ gloves = list(/obj/item/clothing/gloves/vampire/leather)
+ glasses = list(/obj/item/clothing/glasses/vampire/sun)
+ suits = list(/obj/item/clothing/suit/vampire/vest)
+ random_phrases = list(
+ "You again.",
+ "First gun? Yeah. I can tell.",
+ "I'm legally obligated to ask if you're okay. Are you okay?",
+ "Background check? You look trustworthy.",
+ "You look nervous. That concerns me. Not my problem...",
+ "That's the safety. Please stop pulling it.",
+ "I've been doing this fifteen years. You're in the bottom ten percent of people I feel good about.",
+ "You sure you don't want something smaller?",
+ "I don't judge. I mean I do, but professionally I don't.",
+ "Three day waiting period? That some new law?",
+ "You seem angry. Not my problem...",
+ "Silver? Whatre you doing, hunting vampires or something?",
+ "Last guy who bought that model came back two weeks later for a second one. I must be a great businessman!",
+ "I'm going to write down your name. Just... just so I have it.",
+ "The police come by every Tuesday. Just so you know.",
+ "Whatever's chasing you, I hope this helps.",
+ "I sleep fine at night. Mostly.",
+ "Sign here. And here. And here. This one absolves me of any legal liability.",
+ "You got somewhere to be after this? You seem like you got somewhere to be.",
+ "God bless America. And god help whoever you're mad at.",
+ "The second amendment - God I love this country!",
+ "This is America, pal. You want it, you can have it.",
+ "The founding fathers intended this.",
+ "Technically legal in all fifty states.",
+ "The constitution doesn't specify caliber.",
+ "Some people call this dangerous - can you believe that?",
+ "There's no law against buying three of them.",
+ )
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/shop/hardwarestore.dm b/modular_darkpack/modules/npc/code/human/socialroles/shop/hardwarestore.dm
new file mode 100644
index 000000000000..3ec8107a8a1e
--- /dev/null
+++ b/modular_darkpack/modules/npc/code/human/socialroles/shop/hardwarestore.dm
@@ -0,0 +1,18 @@
+/datum/socialrole/shop/hardwarestore
+ uniforms = list(/obj/item/clothing/under/vampire/mechanic)
+ shoes = list(/obj/item/clothing/shoes/vampire/jackboots)
+ hats = list(/obj/item/clothing/head/vampire/baseballcap)
+ gloves = list(/obj/item/clothing/gloves/vampire/work)
+ suits = list(/obj/item/clothing/suit/hazardvest)
+ random_phrases = list(
+ "You need help or are you just looking?",
+ "You measured twice, right?",
+ "We got the metric and the imperial. Pick a side.",
+ "That'll fix it... probably...",
+ "Duct tape? We ran out.",
+ "Are you building something or pretending to build something?",
+ "You a contractor? Of course not...",
+ "The cheap version will work... I hope.",
+ "Online tutorial got you here, huh?",
+ "I don't know what you're building and I've decided not to ask.",
+ )
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/shop/illegal.dm b/modular_darkpack/modules/npc/code/human/socialroles/shop/illegal.dm
index a7657a396225..61b8957d215e 100644
--- a/modular_darkpack/modules/npc/code/human/socialroles/shop/illegal.dm
+++ b/modular_darkpack/modules/npc/code/human/socialroles/shop/illegal.dm
@@ -2,6 +2,13 @@
masks = list(/obj/item/clothing/mask/vampire/balaclava)
shoes = list(/obj/item/clothing/shoes/vampire/sneakers)
uniforms = list(/obj/item/clothing/under/vampire/emo)
+ suits = list(
+ /obj/item/clothing/suit/vampire/trench/alt,
+ /obj/item/clothing/suit/vampire/trench,
+ /obj/item/clothing/suit/vampire/jacket,
+ /obj/item/clothing/suit/vampire/coat,
+ /obj/item/clothing/suit/vampire/coat/winter)
+ gloves = list(/obj/item/clothing/gloves/vampire/work)
// pockets = list(/obj/item/stack/dollar/rand)
male_phrases = list(
@@ -15,9 +22,29 @@
"Check this shit..."
)
random_phrases = list(
- "Pss... wanna try some weed?",
+ "Psst... wanna try some weed?",
"Hey, vagabond...",
- "Check this shit..."
+ "Check this shit out...",
+ "You didn't get this from me kid...",
+ "Are you wearin' a wire?",
+ "Eh? Whaddaya want?",
+ "No return policy, no fine print.",
+ "I'm just a businessman, Officer.",
+ "Keep walkin' if you ain't buyin.",
+ "Land of the free, baby!",
+ "I got a guy who knows a guy, don't worry!",
+ "This here fell off a truck. Several trucks...",
+ "What are you, a cop? You gotta tell me if you're a cop.",
+ "My parole officer thinks I sell hot dogs.",
+ "You look like someone who appreciates a good deal!",
+ "Shh... just, shh.",
+ "I got the best prices around. Don't ask why.",
+ "Don't read the label.",
+ "I'm what you call an unlicensed entrepeneur.",
+ "Technically legal in three countries!",
+ "Money up front, man!",
+ "I'm self-employed. Very self-employed.",
+ "Act natural! You're blowing my cover."
)
answer_phrases = list("Nothing personal...")
help_phrases = list(
diff --git a/modular_darkpack/modules/npc/code/human/socialroles/shop/pharmacystore.dm b/modular_darkpack/modules/npc/code/human/socialroles/shop/pharmacystore.dm
new file mode 100644
index 000000000000..a1cefa40f624
--- /dev/null
+++ b/modular_darkpack/modules/npc/code/human/socialroles/shop/pharmacystore.dm
@@ -0,0 +1,22 @@
+/datum/socialrole/shop/pharmacystore
+ uniforms = list(/obj/item/clothing/under/vampire/nurse)
+ shoes = list(/obj/item/clothing/shoes/vampire/white)
+ glasses = list(/obj/item/clothing/glasses/vampire/perception)
+ suits = list(/obj/item/clothing/suit/vampire/labcoat)
+ random_phrases = list(
+ "Do you have a prescription for that?",
+ "I'm not a doctor by the way.",
+ "That one interacts badly with alcohol. Found that one out the hard way...",
+ "Side effects may include sudden death.",
+ "You look like you've been self-medicating...",
+ "The pharmacist is in the back. You can't see him now.",
+ "Insurance? Uhh...",
+ "We're fully licensed. I hope...",
+ "The expiration date is more of a guideline.",
+ "You want the strong stuff or the stuff that just makes you not care?",
+ "We had a health inspection last month. Several products were... discussed.",
+ "Not that kind of drug store pal!",
+ "You seem stressed. We have something for that. And that. And the thing caused by that.",
+ "Double the dose if it's not working.",
+ "Everyone in this city eventually ends up at this counter...",
+ )
diff --git a/modular_darkpack/modules/npc/code/nonhuman/beastmaster/shadow_guard.dm b/modular_darkpack/modules/npc/code/nonhuman/beastmaster/shadow_guard.dm
index 8de13c532654..8c63b12a78bf 100644
--- a/modular_darkpack/modules/npc/code/nonhuman/beastmaster/shadow_guard.dm
+++ b/modular_darkpack/modules/npc/code/nonhuman/beastmaster/shadow_guard.dm
@@ -1,6 +1,6 @@
/mob/living/basic/shadow_guard
name = "heart of silence"
- desc = "A shadow given life, creature of fathomless..."
+ desc = "A shadow given life, fathomless creature..."
icon = 'modular_darkpack/modules/npc/icons/shadow_guard.dmi'
icon_state = "shadow2"
icon_living = "shadow2"
@@ -8,12 +8,12 @@
basic_mob_flags = DEL_ON_DEATH
speed = 0
- maxHealth = 150
- health = 150
+ maxHealth = 100
+ health = 100
obj_damage = 50
- melee_damage_lower = 20
- melee_damage_upper = 20
+ melee_damage_lower = 15
+ melee_damage_upper = 15
attack_verb_continuous = "gouges"
attack_verb_simple = "gouge"
attack_sound = 'sound/mobs/non-humanoids/venus_trap/venus_trap_hit.ogg'
@@ -26,5 +26,19 @@
/mob/living/basic/shadow_guard/Initialize(mapload)
. = ..()
+ if(prob(50) && icon_state == "shadow2")
+ icon_state = "shadow"
+ icon_living = "shadow"
AddElement(/datum/element/ai_retaliate)
+/mob/living/basic/shadow_guard/hungry_shade
+ name = "hungry shade"
+ desc = "A shade from the furthest reaches of the underworld made manifest."
+ maxHealth = 150
+ health = 150
+ melee_damage_upper = 25
+ melee_damage_lower = 25
+ icon_state = "shade"
+ icon_living = "shade"
+ alpha = 160
+ attack_sound = 'sound/mobs/humanoids/shadow/shadow_wail.ogg'
diff --git a/modular_darkpack/modules/npc/code/nonhuman/friendly/bird_ai.dm b/modular_darkpack/modules/npc/code/nonhuman/friendly/bird_ai.dm
index c2858c2c4a87..1573ea48bb87 100644
--- a/modular_darkpack/modules/npc/code/nonhuman/friendly/bird_ai.dm
+++ b/modular_darkpack/modules/npc/code/nonhuman/friendly/bird_ai.dm
@@ -24,7 +24,7 @@
target_key = BB_LOW_PRIORITY_HUNTING_TARGET
hunting_behavior = /datum/ai_behavior/hunt_target/find_shiney
finding_behavior = /datum/ai_behavior/find_hunt_target/find_shiney
- hunt_targets = list(/obj/item/ammo_casing, /obj/item/watch, /obj/item/vamp/keys, /obj/item/vtm_artifact, /obj/item/knife)
+ hunt_targets = list(/obj/item/ammo_casing, /obj/item/watch, /obj/item/vamp/keys, /obj/item/occult_artifact, /obj/item/knife)
hunt_range = 10
/datum/ai_behavior/find_hunt_target/find_shiney
diff --git a/modular_darkpack/modules/npc/code/nonhuman/hostile/abyss_tentacle.dm b/modular_darkpack/modules/npc/code/nonhuman/hostile/abyss_tentacle.dm
index 2e3d60060485..cb28a7a75525 100644
--- a/modular_darkpack/modules/npc/code/nonhuman/hostile/abyss_tentacle.dm
+++ b/modular_darkpack/modules/npc/code/nonhuman/hostile/abyss_tentacle.dm
@@ -23,6 +23,7 @@ GLOBAL_LIST_EMPTY(global_tentacle_grabs)
speak_emote = list("writhes")
basic_mob_flags = DEL_ON_DEATH
mobility_flags = NONE
+ move_resist = MOVE_FORCE_EXTREMELY_STRONG
environment_smash = ENVIRONMENT_SMASH_NONE
@@ -47,7 +48,7 @@ GLOBAL_LIST_EMPTY(global_tentacle_grabs)
/datum/ai_planning_subtree/tentacle_grab_and_crush
-/datum/ai_planning_subtree/tentacle_grab_and_crush/SelectBehaviors(datum/ai_controller/controller, delta_time)
+/datum/ai_planning_subtree/tentacle_grab_and_crush/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
var/mob/living/basic/abyss_tentacle/tentacle = controller.pawn
if(!istype(tentacle))
return
@@ -128,14 +129,20 @@ GLOBAL_LIST_EMPTY(global_tentacle_grabs)
. = ..()
if(summoner)
owner = summoner
- if(owner?.tentacle_aggro_mode)
- aggro_mode = owner.tentacle_aggro_mode
+ if(owner)
+ var/datum/splat/vampire/vampire = get_splat_with_discipline(owner)
+ var/datum/discipline_power/obtenebration/arms_of_the_abyss/abyss_power = vampire?.get_discipline_power(/datum/discipline_power/obtenebration/arms_of_the_abyss)
+ if(abyss_power)
+ aggro_mode = abyss_power.aggro_mode
/mob/living/basic/abyss_tentacle/Destroy(force)
if(owner)
var/datum/splat/vampire/vampire = get_splat_with_discipline(owner)
- var/datum/discipline_power/obtenebration/arms_of_the_abyss/power = vampire.get_discipline_power(/datum/discipline_power/obtenebration/arms_of_the_abyss)
- power.active_tentacles -= src
+ var/datum/discipline_power/obtenebration/arms_of_the_abyss/abyss_power = vampire?.get_discipline_power(/datum/discipline_power/obtenebration/arms_of_the_abyss)
+ if(abyss_power)
+ abyss_power.active_tentacles -= src
+ if(grabbed_mob)
+ release_grabbed_mob()
. = ..()
@@ -198,8 +205,8 @@ GLOBAL_LIST_EMPTY(global_tentacle_grabs)
return
if(get_dist(source, src) > 0)
- if(world.time >= source.escape_attempt)
- source.escape_attempt = world.time + 1 TURNS
+ if(world.time >= source.tentacle_escape_attempt)
+ source.tentacle_escape_attempt = world.time + 1 TURNS
var/rollcheck = SSroll.storyteller_roll(source.st_get_stat(STAT_STRENGTH), 6, source)
switch(rollcheck)
if(ROLL_SUCCESS)
@@ -218,8 +225,7 @@ GLOBAL_LIST_EMPTY(global_tentacle_grabs)
. = ..()
/mob/living/proc/set_tentacle_grab(obj/tentacle)
- grabbed_by_tentacle = tentacle
+ return
/mob/living/proc/clear_tentacle_grab()
- grabbed_by_tentacle = null
- escape_attempt = 0
+ tentacle_escape_attempt = 0
diff --git a/modular_darkpack/modules/npc/icons/shadow_guard.dmi b/modular_darkpack/modules/npc/icons/shadow_guard.dmi
index 59d0b5d6b302..5cf5d220c912 100644
Binary files a/modular_darkpack/modules/npc/icons/shadow_guard.dmi and b/modular_darkpack/modules/npc/icons/shadow_guard.dmi differ
diff --git a/modular_darkpack/modules/occult_artifacts/code/_artifact.dm b/modular_darkpack/modules/occult_artifacts/code/_artifact.dm
new file mode 100644
index 000000000000..b68d7037b54e
--- /dev/null
+++ b/modular_darkpack/modules/occult_artifacts/code/_artifact.dm
@@ -0,0 +1,132 @@
+/obj/item/occult_artifact/pickup(mob/user)
+ . = ..()
+ if(identified)
+ bind(user)
+
+/obj/item/occult_artifact/dropped(mob/user, silent = FALSE)
+ . = ..()
+ if(identified)
+ if(isturf(loc))
+ unbind(user)
+
+
+/obj/item/occult_artifact/process(seconds_per_tick)
+ if(owner && !in_contents_of(owner))
+ unbind(owner)
+
+/obj/item/occult_artifact
+ name = "unidentified occult fetish"
+ desc = "Who knows what secrets it could contain..."
+ icon_state = "arcane"
+ icon = 'modular_darkpack/modules/occult_artifacts/icons/artifacts.dmi'
+ ONFLOOR_ICON_HELPER('modular_darkpack/modules/occult_artifacts/icons/artifacts_onfloor.dmi')
+ abstract_type = /obj/item/occult_artifact
+ w_class = WEIGHT_CLASS_SMALL
+ var/mob/living/owner
+ var/true_name = "artifact"
+ var/true_desc = "Debug"
+ var/identified = FALSE
+ var/research_value = 0
+ var/can_be_identified_without_ritual = TRUE
+
+ var/grant_sound // = 'sound/effects/magic/swap.ogg'
+ var/ungrant_sound // = 'sound/effects/magic/teleport_diss.ogg'
+
+ var/datum/controller/subsystem/processing/subsystem_type = /datum/controller/subsystem/processing/obj
+
+ var/datum/storyteller_roll/identify_occult/identify_roll
+
+/obj/item/occult_artifact/proc/identify(mob/living/artifact_identifier)
+ if(!identified)
+ name = true_name
+ desc = true_desc
+ identified = TRUE
+ if(src in artifact_identifier?.get_all_contents())
+ bind(artifact_identifier)
+
+/obj/item/occult_artifact/proc/bind(mob/user)
+ if(!identified)
+ return
+ if(owner) // Dont bind twice
+ return
+ owner = user
+
+ var/datum/controller/subsystem/processing/subsystem = locate(subsystem_type) in Master.subsystems
+ START_PROCESSING(subsystem, src)
+
+ grant_powers()
+
+/obj/item/occult_artifact/proc/unbind(mob/user)
+ var/datum/controller/subsystem/processing/subsystem = locate(subsystem_type) in Master.subsystems
+ STOP_PROCESSING(subsystem, src)
+
+ if(owner)
+ ungrant_powers()
+ owner = null
+
+/obj/item/occult_artifact/proc/grant_powers()
+ SHOULD_CALL_PARENT(TRUE)
+
+ if(grant_sound)
+ playsound(owner, grant_sound, 5)
+ return
+
+/obj/item/occult_artifact/proc/ungrant_powers()
+ SHOULD_CALL_PARENT(TRUE)
+
+ if(ungrant_sound)
+ playsound(owner, ungrant_sound, 5)
+ return
+
+
+/obj/item/occult_artifact/attack_self(mob/user, modifiers)
+ . = ..()
+ if(!isliving(user))
+ return
+
+ if(identified)
+ to_chat(user, span_notice("This artifact is already identified."))
+ return
+
+ var/mob/living/artifact_identifier = user
+ if(artifact_identifier.st_get_stat(STAT_OCCULT) < 3)
+ to_chat(artifact_identifier, span_warning("What is this thing? Some kind of yard sale item?"))
+ return
+
+ if(!can_be_identified_without_ritual)
+ to_chat(artifact_identifier, span_warning("You've seen some occult artifacts, trinkets, and powerful relics, but this, you've either never seen it before, or it's power can only be awakened by few..."))
+ return
+
+ to_chat(artifact_identifier, span_cult("You might have seen this before in an occult text. You start identifying it..."))
+ if(!do_after(artifact_identifier, 1 TURNS, src))
+ return
+
+ if(!identify_roll)
+ identify_roll = new()
+ var/roll = identify_roll.st_roll(user, src)
+ if(roll == ROLL_SUCCESS)
+ identify(artifact_identifier)
+ to_chat(artifact_identifier, span_cult("You successfully identify [src]!"))
+ else
+ to_chat(artifact_identifier, span_warning("You stop examining [src]."))
+
+/obj/effect/spawner/random/occult
+ name = "occult spawner"
+ icon = 'modular_darkpack/modules/occult_artifacts/icons/artifacts.dmi'
+ icon_state = "art_rand"
+
+/obj/effect/spawner/random/occult/artifact
+ name = "random occult artifact"
+ loot_subtype_path = /obj/item/occult_artifact
+
+/obj/effect/spawner/random/occult/artifact/Initialize(mapload)
+ spawn_loot_chance = CONFIG_GET(number/artifact_random_probability)
+ . = ..()
+
+/obj/effect/spawner/random/occult/artifact/vampire_only
+ name = "random vampire artifact"
+ loot_subtype_path = /obj/item/occult_artifact/vampire
+
+/obj/effect/spawner/random/occult/artifact/werewolf_only
+ name = "random garou fetish"
+ loot_subtype_path = /obj/item/occult_artifact/werewolf
diff --git a/modular_darkpack/modules/occult_artifacts/code/artifacts/_artifact_config.dm b/modular_darkpack/modules/occult_artifacts/code/_artifact_config.dm
similarity index 51%
rename from modular_darkpack/modules/occult_artifacts/code/artifacts/_artifact_config.dm
rename to modular_darkpack/modules/occult_artifacts/code/_artifact_config.dm
index 88ad397bbe66..464bf8b5a3a4 100644
--- a/modular_darkpack/modules/occult_artifacts/code/artifacts/_artifact_config.dm
+++ b/modular_darkpack/modules/occult_artifacts/code/_artifact_config.dm
@@ -1,9 +1,9 @@
/datum/config_entry/number/artifact_crate_probability
- default = 20
- min_val = 0
- max_val = 100
+ default = 20
+ min_val = 0
+ max_val = 100
/datum/config_entry/number/artifact_random_probability
- default = 50
- min_val = 0
- max_val = 100
+ default = 50
+ min_val = 0
+ max_val = 100
diff --git a/modular_darkpack/modules/occult_artifacts/code/_vampire.dm b/modular_darkpack/modules/occult_artifacts/code/_vampire.dm
new file mode 100644
index 000000000000..7b803e33bc5f
--- /dev/null
+++ b/modular_darkpack/modules/occult_artifacts/code/_vampire.dm
@@ -0,0 +1,2 @@
+/obj/item/occult_artifact/vampire
+ abstract_type = /obj/item/occult_artifact/vampire
diff --git a/modular_darkpack/modules/occult_artifacts/code/_werewolf.dm b/modular_darkpack/modules/occult_artifacts/code/_werewolf.dm
new file mode 100644
index 000000000000..945b57b1091d
--- /dev/null
+++ b/modular_darkpack/modules/occult_artifacts/code/_werewolf.dm
@@ -0,0 +1,33 @@
+GLOBAL_LIST_INIT(night_spirits, world.file2list("modular_darkpack/modules/occult_artifacts/strings/night_spirits.txt"))
+GLOBAL_LIST_INIT(darkness_spirits, world.file2list("modular_darkpack/modules/occult_artifacts/strings/darkness_spirits.txt"))
+GLOBAL_LIST_INIT(vengeance_spirits, world.file2list("modular_darkpack/modules/occult_artifacts/strings/vengeance_spirits.txt"))
+
+/obj/item/occult_artifact/werewolf
+ icon = 'modular_darkpack/modules/occult_artifacts/icons/fetishes.dmi'
+ worn_icon = 'modular_darkpack/modules/occult_artifacts/icons/fetishes_worn.dmi'
+ lefthand_file = 'modular_darkpack/modules/occult_artifacts/icons/fetishes_lefthand.dmi'
+ righthand_file = 'modular_darkpack/modules/occult_artifacts/icons/fetishes_righthand.dmi'
+ ONFLOOR_ICON_HELPER('modular_darkpack/modules/occult_artifacts/icons/fetishes_onfloor.dmi')
+ icon_state = "dagger"
+ abstract_type = /obj/item/occult_artifact/werewolf
+ var/spirit_name = "Glitchimus"
+ var/spirit_type = "ahelp"
+
+/proc/generate_spirit_name(spirit_type) // TODO: make this better. there are 50+ spirits in WoD, and that's not condusive to this format.
+ var/spirit_name
+ var/spirit_table
+ var/spirit_desc
+
+ switch(spirit_type)
+ if(SPIRIT_NIGHT)
+ spirit_table = GLOB.night_spirits
+ if(SPIRIT_DARKNESS)
+ spirit_table = GLOB.darkness_spirits
+ if(SPIRIT_VENGEANCE)
+ spirit_table = GLOB.vengeance_spirits
+
+ if(length(spirit_table))
+ spirit_name = pick(spirit_table)
+ spirit_desc = "[spirit_name], a spirit of [spirit_type]"
+
+ return spirit_desc
diff --git a/modular_darkpack/modules/occult_artifacts/code/artifacts/_artifact.dm b/modular_darkpack/modules/occult_artifacts/code/artifacts/_artifact.dm
deleted file mode 100644
index 693b72bbfcb4..000000000000
--- a/modular_darkpack/modules/occult_artifacts/code/artifacts/_artifact.dm
+++ /dev/null
@@ -1,98 +0,0 @@
-/obj/item/vtm_artifact/pickup(mob/user)
- . = ..()
- if(identified)
- owner = user
- START_PROCESSING(SSobj, src)
- get_powers()
-
-/obj/item/vtm_artifact/dropped(mob/user)
- . = ..()
- if(identified)
- if(isturf(loc))
- STOP_PROCESSING(SSobj, src)
- if(owner)
- remove_powers()
- owner = null
-
-/obj/item/vtm_artifact/process(delta_time)
- if(owner != loc && owner != loc.loc)
- forceMove(get_turf(src))
- STOP_PROCESSING(SSobj, src)
- if(owner)
- remove_powers()
- owner = null
-
-/obj/item/vtm_artifact
- name = "unidentified occult fetish"
- desc = "Who knows what secrets it could contain..."
- icon_state = "arcane"
- icon = 'modular_darkpack/modules/occult_artifacts/icons/artifacts.dmi'
- ONFLOOR_ICON_HELPER('modular_darkpack/modules/occult_artifacts/icons/artifacts_onfloor.dmi')
- w_class = WEIGHT_CLASS_SMALL
- var/mob/living/owner
- var/true_name = "artifact"
- var/true_desc = "Debug"
- var/identified = FALSE
- var/gained_boosts = FALSE
- var/research_value = 0
- var/can_be_identified_without_ritual = TRUE
-
- var/datum/storyteller_roll/identify_occult/identify_roll
-
-/obj/item/vtm_artifact/proc/identify()
- if(!identified)
- name = true_name
- desc = true_desc
- identified = TRUE
-
-/obj/item/vtm_artifact/proc/get_powers()
- if(!identified)
- return
-
-/obj/item/vtm_artifact/proc/remove_powers()
- if(!identified)
- return
-
-/obj/item/vtm_artifact/attack_self(mob/user, modifiers)
- . = ..()
- if(!isliving(user))
- return
-
- if(identified)
- to_chat(user, span_notice("This artifact is already identified."))
- return
-
- var/mob/living/artifact_identifier = user
- if(artifact_identifier.st_get_stat(STAT_OCCULT) < 3)
- to_chat(artifact_identifier, span_warning("What is this thing? Some kind of yard sale item?"))
- return
-
- if(can_be_identified_without_ritual == FALSE)
- to_chat(artifact_identifier, span_warning("You've seen some occult artifacts, trinkets, and powerful relics, but this, you've either never seen it before, or it's power can only be awakened by few..."))
- return
-
- to_chat(artifact_identifier, span_cult("You might have seen this before in an occult text. You start identifying it..."))
- if(do_after(artifact_identifier, 1 TURNS, src))
- if(!identify_roll)
- identify_roll = new()
- identify_roll.difficulty = 8
- var/roll = identify_roll.st_roll(user, src)
- if(roll == ROLL_SUCCESS)
- identify()
- to_chat(artifact_identifier, span_cult("You successfully identify [src]!"))
- else
- to_chat(artifact_identifier, span_warning("You stop examining [src]."))
-
-/obj/effect/spawner/random/occult
- name = "occult spawner"
- icon = 'modular_darkpack/modules/occult_artifacts/icons/artifacts.dmi'
- icon_state = "art_rand"
-
-/obj/effect/spawner/random/occult/artifact
- name = "random occult fetish"
- //spawn_loot_chance = CONFIG_GET(number/artifact_random_probability)
- loot_subtype_path = /obj/item/vtm_artifact
-
-/obj/effect/spawner/random/occult/artifact/Initialize(mapload)
- spawn_loot_chance = CONFIG_GET(number/artifact_random_probability)
- . = ..()
diff --git a/modular_darkpack/modules/occult_artifacts/code/artifacts/bloodstar.dm b/modular_darkpack/modules/occult_artifacts/code/artifacts/bloodstar.dm
index f8f5e58d45ec..bc69b137dcdf 100644
--- a/modular_darkpack/modules/occult_artifacts/code/artifacts/bloodstar.dm
+++ b/modular_darkpack/modules/occult_artifacts/code/artifacts/bloodstar.dm
@@ -1,13 +1,13 @@
-/obj/item/vtm_artifact/bloodstar
+/obj/item/occult_artifact/vampire/bloodstar
true_name = "Bloodstar"
true_desc = "Increases Bloodpower efficiency."
icon_state = "bloodstar"
research_value = 10
-/obj/item/vtm_artifact/bloodstar/get_powers()
+/obj/item/occult_artifact/vampire/bloodstar/grant_powers()
. = ..()
owner.blood_efficiency = 0.8
-/obj/item/vtm_artifact/bloodstar/remove_powers()
+/obj/item/occult_artifact/vampire/bloodstar/ungrant_powers()
. = ..()
owner.blood_efficiency = 1
diff --git a/modular_darkpack/modules/occult_artifacts/code/artifacts/bloodstone.dm b/modular_darkpack/modules/occult_artifacts/code/artifacts/bloodstone.dm
index 82d0b1103c0a..32d489a1e46a 100644
--- a/modular_darkpack/modules/occult_artifacts/code/artifacts/bloodstone.dm
+++ b/modular_darkpack/modules/occult_artifacts/code/artifacts/bloodstone.dm
@@ -1,4 +1,4 @@
-/obj/item/vtm_artifact/bloodstone
+/obj/item/occult_artifact/vampire/bloodstone
true_name = "bloodstone"
true_desc = "A pulsing crimson stone that creates a mystical bond with its identifier."
icon = 'modular_darkpack/modules/paths/icons/bloodstone_artifact.dmi'
@@ -9,7 +9,7 @@
var/datum/action/bloodstone_track/tracking_action
research_value = 15
-/obj/item/vtm_artifact/bloodstone/identify()
+/obj/item/occult_artifact/vampire/bloodstone/identify()
. = ..()
if(identified && !bound_identifier)
var/mob/living/carbon/human/user = usr
@@ -20,7 +20,7 @@
tracking_action = new /datum/action/bloodstone_track(user, src)
tracking_action.Grant(user)
-/obj/item/vtm_artifact/bloodstone/Destroy()
+/obj/item/occult_artifact/vampire/bloodstone/Destroy()
if(tracking_action)
var/mob/living/carbon/human/user = bound_identifier.resolve()
if(user)
@@ -37,7 +37,7 @@
check_flags = AB_CHECK_CONSCIOUS
var/datum/weakref/tracked_stone
-/datum/action/bloodstone_track/New(Target, obj/item/vtm_artifact/bloodstone/stone)
+/datum/action/bloodstone_track/New(Target, obj/item/occult_artifact/vampire/bloodstone/stone)
. = ..()
tracked_stone = WEAKREF(stone)
@@ -46,7 +46,7 @@
if(!.)
return
- var/obj/item/vtm_artifact/bloodstone/bloodstone = tracked_stone.resolve()
+ var/obj/item/occult_artifact/vampire/bloodstone/bloodstone = tracked_stone.resolve()
if(!bloodstone)
to_chat(owner, span_warning("The bloodstone bond has been severed."))
Remove(owner)
diff --git a/modular_darkpack/modules/occult_artifacts/code/artifacts/daimonori.dm b/modular_darkpack/modules/occult_artifacts/code/artifacts/daimonori.dm
index 80eefc379d88..27bd2c9f4114 100644
--- a/modular_darkpack/modules/occult_artifacts/code/artifacts/daimonori.dm
+++ b/modular_darkpack/modules/occult_artifacts/code/artifacts/daimonori.dm
@@ -1,13 +1,13 @@
-/obj/item/vtm_artifact/daimonori
+/obj/item/occult_artifact/vampire/daimonori
true_name = "Daimonori"
true_desc = "Increases thaumaturgy damage."
icon_state = "daimonori"
research_value = 20
-/obj/item/vtm_artifact/daimonori/get_powers()
+/obj/item/occult_artifact/vampire/daimonori/grant_powers()
. = ..()
owner.thaum_damage_plus = 20
-/obj/item/vtm_artifact/daimonori/remove_powers()
+/obj/item/occult_artifact/vampire/daimonori/ungrant_powers()
. = ..()
owner.thaum_damage_plus = 0
diff --git a/modular_darkpack/modules/occult_artifacts/code/artifacts/fae_charm.dm b/modular_darkpack/modules/occult_artifacts/code/artifacts/fae_charm.dm
index 776d2a7b1ebe..40a7898f1012 100644
--- a/modular_darkpack/modules/occult_artifacts/code/artifacts/fae_charm.dm
+++ b/modular_darkpack/modules/occult_artifacts/code/artifacts/fae_charm.dm
@@ -1,16 +1,13 @@
-/obj/item/vtm_artifact/fae_charm
+/obj/item/occult_artifact/vampire/fae_charm
true_name = "Fae Charm"
true_desc = "Dexterity boost."
icon_state = "fae_charm"
research_value = 35
-/obj/item/vtm_artifact/fae_charm/get_powers()
+/obj/item/occult_artifact/vampire/fae_charm/grant_powers()
. = ..()
owner.st_add_stat_mod(STAT_DEXTERITY, 1, type)
-/obj/item/vtm_artifact/fae_charm/remove_powers()
+/obj/item/occult_artifact/vampire/fae_charm/ungrant_powers()
. = ..()
owner.st_remove_stat_mod(STAT_DEXTERITY, 1, type)
-
-/datum/movespeed_modifier/fae_charm
- multiplicative_slowdown = -0.20
diff --git a/modular_darkpack/modules/occult_artifacts/code/artifacts/galdjum.dm b/modular_darkpack/modules/occult_artifacts/code/artifacts/galdjum.dm
index 9b3cd310b289..d54e646bf84b 100644
--- a/modular_darkpack/modules/occult_artifacts/code/artifacts/galdjum.dm
+++ b/modular_darkpack/modules/occult_artifacts/code/artifacts/galdjum.dm
@@ -1,13 +1,13 @@
-/obj/item/vtm_artifact/galdjum
+/obj/item/occult_artifact/vampire/galdjum
true_name = "Galdjum"
true_desc = "Increases disciplines duration."
icon_state = "galdjum"
research_value = 10
-/obj/item/vtm_artifact/galdjum/get_powers()
+/obj/item/occult_artifact/vampire/galdjum/grant_powers()
. = ..()
owner.discipline_time_plus = 25
-/obj/item/vtm_artifact/galdjum/remove_powers()
+/obj/item/occult_artifact/vampire/galdjum/ungrant_powers()
. = ..()
owner.discipline_time_plus = 0
diff --git a/modular_darkpack/modules/occult_artifacts/code/artifacts/heart_of_eliza.dm b/modular_darkpack/modules/occult_artifacts/code/artifacts/heart_of_eliza.dm
index cc14745e5782..f84fa5fb8ba6 100644
--- a/modular_darkpack/modules/occult_artifacts/code/artifacts/heart_of_eliza.dm
+++ b/modular_darkpack/modules/occult_artifacts/code/artifacts/heart_of_eliza.dm
@@ -1,13 +1,13 @@
-/obj/item/vtm_artifact/heart_of_eliza
+/obj/item/occult_artifact/vampire/heart_of_eliza
true_name = "Heart of Eliza"
true_desc = "Melee damage boost."
icon_state = "h_eliza"
research_value = 30
-/obj/item/vtm_artifact/heart_of_eliza/get_powers()
+/obj/item/occult_artifact/vampire/heart_of_eliza/grant_powers()
. = ..()
owner.st_add_stat_mod(STAT_STRENGTH, 1, type)
-/obj/item/vtm_artifact/heart_of_eliza/remove_powers()
+/obj/item/occult_artifact/vampire/heart_of_eliza/ungrant_powers()
. = ..()
owner.st_remove_stat_mod(STAT_STRENGTH, 1, type)
diff --git a/modular_darkpack/modules/occult_artifacts/code/artifacts/key_of_alamut.dm b/modular_darkpack/modules/occult_artifacts/code/artifacts/key_of_alamut.dm
index 43557a4f24bc..914bf9fbebe4 100644
--- a/modular_darkpack/modules/occult_artifacts/code/artifacts/key_of_alamut.dm
+++ b/modular_darkpack/modules/occult_artifacts/code/artifacts/key_of_alamut.dm
@@ -1,10 +1,10 @@
-/obj/item/vtm_artifact/key_of_alamut
+/obj/item/occult_artifact/vampire/key_of_alamut
true_name = "Key of Alamut"
true_desc = "Decreases incoming damage."
icon_state = "k_alamut"
research_value = 30
-/obj/item/vtm_artifact/key_of_alamut/get_powers()
+/obj/item/occult_artifact/vampire/key_of_alamut/grant_powers()
. = ..()
var/mob/living/carbon/human/H = owner
if(H.dna.species.damage_modifier >= 70)
@@ -12,7 +12,7 @@
if(H.dna)
H.dna.species.damage_modifier = H.dna.species.damage_modifier+20
-/obj/item/vtm_artifact/key_of_alamut/remove_powers()
+/obj/item/occult_artifact/vampire/key_of_alamut/ungrant_powers()
. = ..()
var/mob/living/carbon/human/H = owner
if(H.dna.species.damage_modifier >= 50)
diff --git a/modular_darkpack/modules/occult_artifacts/code/artifacts/mummywrap_fetish.dm b/modular_darkpack/modules/occult_artifacts/code/artifacts/mummywrap_fetish.dm
index 086912eee32a..6e2c5f3be540 100644
--- a/modular_darkpack/modules/occult_artifacts/code/artifacts/mummywrap_fetish.dm
+++ b/modular_darkpack/modules/occult_artifacts/code/artifacts/mummywrap_fetish.dm
@@ -1,11 +1,11 @@
-/obj/item/vtm_artifact/mummywrap_fetish
+/obj/item/occult_artifact/vampire/mummywrap_fetish
true_name = "Mummywrap Fetish"
true_desc = "Passive health regeneration."
icon_state = "m_fetish"
var/last_regen = 0
research_value = 10
-/obj/item/vtm_artifact/mummywrap_fetish/process(delta_time)
+/obj/item/occult_artifact/vampire/mummywrap_fetish/process(seconds_per_tick)
. = ..()
if(identified && owner)
if(last_regen+60 < world.time)
diff --git a/modular_darkpack/modules/occult_artifacts/code/artifacts/odious_chalice.dm b/modular_darkpack/modules/occult_artifacts/code/artifacts/odious_chalice.dm
index b1a491dfb394..ac6a05228d28 100644
--- a/modular_darkpack/modules/occult_artifacts/code/artifacts/odious_chalice.dm
+++ b/modular_darkpack/modules/occult_artifacts/code/artifacts/odious_chalice.dm
@@ -1,15 +1,15 @@
-/obj/item/vtm_artifact/odious_chalice
+/obj/item/occult_artifact/vampire/odious_chalice
true_name = "Odious Chalice"
true_desc = "Stores blood from every attack."
icon_state = "o_chalice"
var/stored_blood = 0
research_value = 30
-/obj/item/vtm_artifact/odious_chalice/examine(mob/user)
+/obj/item/occult_artifact/vampire/odious_chalice/examine(mob/user)
. = ..()
. += "[src] contains [stored_blood] blood points..."
-/obj/item/vtm_artifact/odious_chalice/attack(mob/living/M, mob/living/user)
+/obj/item/occult_artifact/vampire/odious_chalice/attack(mob/living/M, mob/living/user)
. = ..()
if(!get_kindred_splat(M))
return
diff --git a/modular_darkpack/modules/occult_artifacts/code/artifacts/tarulfang.dm b/modular_darkpack/modules/occult_artifacts/code/artifacts/tarulfang.dm
new file mode 100644
index 000000000000..80ddaac33023
--- /dev/null
+++ b/modular_darkpack/modules/occult_artifacts/code/artifacts/tarulfang.dm
@@ -0,0 +1,13 @@
+// DARKPACK TODO - FRENZY - (This never did FUCK anything.)
+/obj/item/occult_artifact/vampire/tarulfang
+ true_name = "Tarulfang"
+ true_desc = "Decreases chance of frenzy."
+ icon_state = "tarulfang"
+
+/obj/item/occult_artifact/vampire/tarulfang/grant_powers()
+ . = ..()
+ owner.frenzy_chance_boost = 5
+
+/obj/item/occult_artifact/vampire/tarulfang/ungrant_powers()
+ . = ..()
+ owner.frenzy_chance_boost = 10
diff --git a/modular_darkpack/modules/occult_artifacts/code/artifacts/weekapaug_thistle.dm b/modular_darkpack/modules/occult_artifacts/code/artifacts/weekapaug_thistle.dm
index e5bfdd8a594e..406bd60fe0fb 100644
--- a/modular_darkpack/modules/occult_artifacts/code/artifacts/weekapaug_thistle.dm
+++ b/modular_darkpack/modules/occult_artifacts/code/artifacts/weekapaug_thistle.dm
@@ -2,31 +2,22 @@
melee = 10
bullet = 10
-/obj/item/vtm_artifact/weekapaug_thistle
+/obj/item/occult_artifact/vampire/weekapaug_thistle
true_name = "Weekapaug Thistle"
true_desc = "Increases combat defense."
icon_state = "w_thistle"
research_value = 10
-/obj/item/vtm_artifact/weekapaug_thistle/get_powers()
+/obj/item/occult_artifact/vampire/weekapaug_thistle/grant_powers()
. = ..()
- var/mob/living/carbon/human/H = owner
- H.physiology.armor = H.physiology.armor.add_other_armor(/datum/armor/weekapaug_thistle)
+ var/mob/living/carbon/human/human_owner = astype(owner)
+ if(!human_owner)
+ return
+ human_owner.physiology.armor = human_owner.physiology.armor.add_other_armor(/datum/armor/weekapaug_thistle)
-/obj/item/vtm_artifact/weekapaug_thistle/remove_powers()
+/obj/item/occult_artifact/vampire/weekapaug_thistle/ungrant_powers()
. = ..()
- var/mob/living/carbon/human/H = owner
- H.physiology.armor = H.physiology.armor.subtract_other_armor(/datum/armor/weekapaug_thistle)
-
-/obj/item/vtm_artifact/tarulfang
- true_name = "Tarulfang"
- true_desc = "Decreases chance of frenzy."
- icon_state = "tarulfang"
-
-/obj/item/vtm_artifact/weekapaug_thistle/get_powers()
- . = ..()
- owner.frenzy_chance_boost = 5
-
-/obj/item/vtm_artifact/weekapaug_thistle/remove_powers()
- . = ..()
- owner.frenzy_chance_boost = 10
+ var/mob/living/carbon/human/human_owner = astype(owner)
+ if(!human_owner)
+ return
+ human_owner.physiology.armor = human_owner.physiology.armor.subtract_other_armor(/datum/armor/weekapaug_thistle)
diff --git a/modular_darkpack/modules/occult_artifacts/code/fetishes/dagger_of_retribution.dm b/modular_darkpack/modules/occult_artifacts/code/fetishes/dagger_of_retribution.dm
new file mode 100644
index 000000000000..5e2c55097ac8
--- /dev/null
+++ b/modular_darkpack/modules/occult_artifacts/code/fetishes/dagger_of_retribution.dm
@@ -0,0 +1,160 @@
+/obj/item/occult_artifact/werewolf/dagger_of_retribution
+ name = "iron knife"
+ desc = "A crude knife wrought from iron."
+ true_name = "dagger of retribution"
+ true_desc = "An ugly iron dagger imbued with a vengeance-spirit."
+ worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi'
+ worn_icon_state = "knife"
+ icon_state = "dagger"
+ force = 30
+ wound_bonus = -5
+ throwforce = 15
+ attack_verb_continuous = list("slashes", "cuts")
+ attack_verb_simple = list("slash", "cut")
+ hitsound = 'sound/items/weapons/slash.ogg'
+ armour_penetration = 35
+ block_chance = 5
+ sharpness = SHARP_EDGED
+ w_class = WEIGHT_CLASS_SMALL
+ slot_flags = ITEM_SLOT_BELT
+ resistance_flags = FIRE_PROOF
+ subsystem_type = /datum/controller/subsystem/processing/fastprocess
+
+ spirit_type = SPIRIT_VENGEANCE
+
+ var/obj/bound_item
+ var/spinning = FALSE
+
+
+/obj/item/occult_artifact/werewolf/dagger_of_retribution/Initialize(mapload)
+ . = ..()
+ spirit_name = generate_spirit_name(spirit_type)
+
+/obj/item/occult_artifact/werewolf/dagger_of_retribution/Destroy(force)
+ stop_live_tracking()
+ . = ..()
+
+/obj/item/occult_artifact/werewolf/dagger_of_retribution/identify()
+ . = ..()
+ say("I am [spirit_name]... That which is lost will be found...")
+
+/obj/item/occult_artifact/werewolf/dagger_of_retribution/examine(mob/user)
+ . = ..()
+ if(identified)
+ . += span_nicegreen("Concentrate on a lost item while holding the dagger; the weapon will gently tug in the direction of the item until you reclaim it.")
+ . += span_purple("Imbued with [spirit_name].")
+ if(bound_item)
+ . += span_purple("Bound to [bound_item].")
+ if(iscarbon(loc))
+ var/mob/living/carbon/C = loc
+
+ var/obj/item/mainhand = C.get_active_held_item()
+ var/obj/item/offhand = C.get_inactive_held_item()
+
+ if(mainhand == src || offhand == src)
+ . += span_notice("It's tugging you to the [angle2text(targets_angle())]")
+
+ . += span_notice(" Bind an item by CLICKing on it with [src]. Unbind [src] by right clicking it.")
+
+
+
+/obj/item/occult_artifact/werewolf/dagger_of_retribution/pickup(mob/user)
+ . = ..()
+ if(bound_item)
+ start_live_tracking(user)
+
+
+/obj/item/occult_artifact/werewolf/dagger_of_retribution/dropped(mob/user, silent = FALSE)
+ . = ..()
+ stop_live_tracking(user)
+
+
+
+/obj/item/occult_artifact/werewolf/dagger_of_retribution/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
+ if(!identified)
+ return NONE
+
+ if(user.combat_mode)
+ return NONE
+
+ if(!istype(interacting_with, /obj)) // is it an object?
+ if(!istype(interacting_with, /turf))
+ to_chat(user, span_warning("[src] refuses to be bound to [interacting_with]!"))
+ return ITEM_INTERACT_BLOCKING
+ return NONE
+
+ if(bound_item) // do we have an item bound to us already?
+ to_chat(user, span_warning("[src] is already bound to [bound_item]!"))
+ return ITEM_INTERACT_BLOCKING
+
+ // We are clicking on an object, we're on the right intent, and we're not bound.
+ bound_item = interacting_with
+ start_live_tracking(user)
+ return ITEM_INTERACT_SUCCESS
+
+
+/obj/item/occult_artifact/werewolf/dagger_of_retribution/proc/start_live_tracking(mob/user)
+ RegisterSignal(bound_item, COMSIG_QDELETING, PROC_REF(stop_live_tracking))
+
+ if(bound_item && user)
+ to_chat(user, span_notice("[src] starts tugging you towards [bound_item]."))
+
+/obj/item/occult_artifact/werewolf/dagger_of_retribution/proc/stop_live_tracking(mob/user)
+ if(!bound_item)
+ return
+
+ UnregisterSignal(bound_item, COMSIG_QDELETING)
+
+ if(QDELING(bound_item))
+ bound_item = null
+
+ if(user)
+ to_chat(user, span_warning("[src] stops tugging."))
+
+ var/matrix/M = matrix(0, MATRIX_ROTATE)
+ animate(src, transform = M, time = 5, loop = 0)
+
+/obj/item/occult_artifact/werewolf/dagger_of_retribution/process(seconds_per_tick)
+ . = ..()
+ if(!bound_item)
+ return
+
+ var/turf/our_turf = get_turf(src)
+ var/turf/bound_item_turf = get_turf(bound_item)
+
+ if(our_turf.z == bound_item_turf.z)
+ point_to_target()
+ spinning = FALSE
+ else if(!spinning)
+ SpinAnimation(5, -1)
+ spinning = TRUE
+
+/obj/item/occult_artifact/werewolf/dagger_of_retribution/proc/point_to_target()
+ if(iscarbon(loc))
+ var/mob/living/carbon/C = loc
+
+ var/obj/item/mainhand = C.get_active_held_item()
+ var/obj/item/offhand = C.get_inactive_held_item()
+
+ if(mainhand == src || offhand == src)
+ var/bound_dir = targets_angle()-135
+ if(bound_item)
+ var/matrix/M = matrix(bound_dir, MATRIX_ROTATE)
+ animate(src, transform = M, time = 5, loop = 0)
+ else
+ stop_live_tracking(C)
+
+/obj/item/occult_artifact/werewolf/dagger_of_retribution/proc/targets_angle()
+ var/datum/point/point_a = RETURN_PRECISE_POINT(get_turf(src))
+ var/datum/point/point_b = RETURN_PRECISE_POINT(get_turf(bound_item))
+
+ return angle_between_points(point_a, point_b)
+
+/obj/item/occult_artifact/werewolf/dagger_of_retribution/attack_self_secondary(mob/user, modifiers)
+ . = ..()
+ if(bound_item)
+ to_chat(user, span_warning("You start to unbind [bound_item] from [src]."))
+
+ if(do_after(user, 3 SECONDS, src))
+ stop_live_tracking(user)
+ bound_item = null
diff --git a/modular_darkpack/modules/occult_artifacts/code/fetishes/nyxs_bangle.dm b/modular_darkpack/modules/occult_artifacts/code/fetishes/nyxs_bangle.dm
new file mode 100644
index 000000000000..ebef20658b84
--- /dev/null
+++ b/modular_darkpack/modules/occult_artifacts/code/fetishes/nyxs_bangle.dm
@@ -0,0 +1,62 @@
+/* Nyx's Bangle */
+/obj/item/occult_artifact/werewolf/nyxs_bangle
+ name = "silver bracelet"
+ desc = "A chain bracelet made of silver."
+ true_name = "Nyx's Bangle"
+ true_desc = "A silver bracelet with numerous glyphs."
+ icon_state = "bangle"
+ worn_icon_state = "bangle"
+ slot_flags = ITEM_SLOT_GLOVES | ITEM_SLOT_ID
+
+ subsystem_type = /datum/controller/subsystem/processing/fastprocess
+
+ ungrant_sound = 'sound/effects/hallucinations/growl1.ogg'
+
+/obj/item/occult_artifact/werewolf/nyxs_bangle/identify()
+ . = ..()
+ say("I am [spirit_name]... Hide now, in shadow.")
+
+/obj/item/occult_artifact/werewolf/nyxs_bangle/ungrant_powers()
+ . = ..()
+
+ owner.alpha = 255
+
+
+/obj/item/occult_artifact/werewolf/nyxs_bangle/process(seconds_per_tick)
+ . = ..()
+
+ var/mob/living/carbon/carbon_owner = astype(owner)
+ if(identified && carbon_owner)
+ var/turf/owner_turf = get_turf(owner)
+ var/light_amount = owner_turf.get_lumcount()
+
+ if(light_amount <= 0.2)
+ if(src == carbon_owner.gloves || src == carbon_owner.get_active_held_item() || src == carbon_owner.get_inactive_held_item())
+ carbon_owner.alpha = max(carbon_owner.alpha-12.75, 25.5)
+ else
+ carbon_owner.alpha = min (carbon_owner.alpha+25.5, 255)
+ else
+ carbon_owner.alpha = min (carbon_owner.alpha+25.5, 255)
+
+/obj/item/occult_artifact/werewolf/nyxs_bangle/proc/get_held_mob()
+ if(isnull(loc))
+ return null
+ if(isliving(loc))
+ return loc
+ var/nested_loc = loc.loc
+ if (isliving(nested_loc))
+ return nested_loc
+ return null
+
+/obj/item/occult_artifact/werewolf/nyxs_bangle/Initialize(mapload)
+ . = ..()
+ spirit_type = pick(SPIRIT_NIGHT, SPIRIT_DARKNESS)
+ spirit_name = generate_spirit_name(spirit_type)
+
+
+/obj/item/occult_artifact/werewolf/nyxs_bangle/examine(mob/user)
+ . = ..()
+ if(identified)
+ . += span_nicegreen("Hide everything but your bestial eyes in shadow.")
+ . += span_notice("EQUIP [src] in the ID slot or GLOVES slot or HOLD it in your hand to become partially invisible in shadow.")
+ . += span_purple("Imbued with [spirit_name].")
diff --git a/modular_darkpack/modules/occult_artifacts/icons/fetishes.dmi b/modular_darkpack/modules/occult_artifacts/icons/fetishes.dmi
new file mode 100644
index 000000000000..38ff0797477a
Binary files /dev/null and b/modular_darkpack/modules/occult_artifacts/icons/fetishes.dmi differ
diff --git a/modular_darkpack/modules/occult_artifacts/icons/fetishes_lefthand.dmi b/modular_darkpack/modules/occult_artifacts/icons/fetishes_lefthand.dmi
new file mode 100644
index 000000000000..6c5c6c0aebd8
Binary files /dev/null and b/modular_darkpack/modules/occult_artifacts/icons/fetishes_lefthand.dmi differ
diff --git a/modular_darkpack/modules/occult_artifacts/icons/fetishes_onfloor.dmi b/modular_darkpack/modules/occult_artifacts/icons/fetishes_onfloor.dmi
new file mode 100644
index 000000000000..fdeba6ce2516
Binary files /dev/null and b/modular_darkpack/modules/occult_artifacts/icons/fetishes_onfloor.dmi differ
diff --git a/modular_darkpack/modules/occult_artifacts/icons/fetishes_righthand.dmi b/modular_darkpack/modules/occult_artifacts/icons/fetishes_righthand.dmi
new file mode 100644
index 000000000000..ef812a97539f
Binary files /dev/null and b/modular_darkpack/modules/occult_artifacts/icons/fetishes_righthand.dmi differ
diff --git a/modular_darkpack/modules/occult_artifacts/icons/fetishes_worn.dmi b/modular_darkpack/modules/occult_artifacts/icons/fetishes_worn.dmi
new file mode 100644
index 000000000000..38aefa65d71d
Binary files /dev/null and b/modular_darkpack/modules/occult_artifacts/icons/fetishes_worn.dmi differ
diff --git a/modular_darkpack/modules/occult_artifacts/strings/darkness_spirits.txt b/modular_darkpack/modules/occult_artifacts/strings/darkness_spirits.txt
new file mode 100644
index 000000000000..dba5931b56e2
--- /dev/null
+++ b/modular_darkpack/modules/occult_artifacts/strings/darkness_spirits.txt
@@ -0,0 +1,69 @@
+Aethra’s Hollow
+Blackmere
+Crepharion
+Crepusar
+Crepuscar
+Crepusculus, Dark Traveller
+Darkwave
+Duskrine
+Duskvein
+Duskwalker
+Ebonhollow
+Ebonstride
+Eclipsera
+Eclipthra
+Gloamrend
+Mireveil
+Morvaith
+Mourncurrent
+Mournveil
+Nethrael
+Nightrender
+Nocthalis
+Noctherin
+Noctheros
+Noctirion
+Nyxfen
+Obscuran
+Obsidra
+Ombryl
+Sableheart
+Shadeborne
+Shadewarden
+Shadowborne
+Shadowstep
+Silthra
+Tenebralis
+Tenebreth
+Tenebrus
+The Ashen Silence
+The Black Flow
+The Dark Water
+The Dim Path
+The Drowned Night
+The Fading Tide
+The Gloaming Wanderer
+The Gray Hunger
+The Hollow Shade
+The Murkway
+The Murmuring Dark
+The Night Below
+The Obsidian Wane
+The Pale Gloom
+The Silent Depth
+The Silent Eclipse
+The Veiled Flow
+Thorn of Night
+Thraen of Dusk
+Umbracend
+Umbraeth
+Umbrathis
+Umbravine
+Velastra
+Velkyn
+Velmourn
+Velquor
+Veyloth
+Veythar
+Voidwender
+Vorynth
diff --git a/modular_darkpack/modules/occult_artifacts/strings/night_spirits.txt b/modular_darkpack/modules/occult_artifacts/strings/night_spirits.txt
new file mode 100644
index 000000000000..0671a0621ea7
--- /dev/null
+++ b/modular_darkpack/modules/occult_artifacts/strings/night_spirits.txt
@@ -0,0 +1,105 @@
+Noctyss
+Velunara
+Mirethyn
+Shadow Muse
+Dreamveil
+Eclipsera
+Whisperlune
+Lunathis
+Velnara
+Duskweaver
+Moonglint
+Nocthera
+Selenithra
+Aurevelle
+Threnody of Stars
+Nightbloom
+Veylune
+Somnara
+Nightrill
+Ombryn
+Eclipshade
+Nytheris
+Vaymera
+Moonstray
+Lunacendre
+Astrellia
+Viorneth
+Noctilisse
+Dreamesse
+Nightrhyme
+Mournveil
+Shadowdawn
+Nyxthara
+Velastra
+Phantomine
+Eclipsine
+Moonriven
+Sablelune
+Nostravelle
+Lunareign
+Thaluneth
+Dream’s Hollow
+Night’s Embrace
+Umbraelle
+Velnisse
+Phantyra
+Celuneth
+Noctharra
+Whisperveil
+Moonraith
+Lunaclaire
+Velunith
+Astrethra
+Dreamrend
+Nightborn
+Selunara
+Veythral
+Nocthyra
+Eclissara
+Vairenne
+Mournshade
+Duskwraith
+Velunethra
+Umbrylisse
+Phanthera
+Noctelle
+Moonweft
+Somnithra
+Lunysse
+Nightcaller
+Whisperthorn
+Velastrae
+Starveil
+Lunavryn
+Nytherelle
+Moondrift
+Velnarae
+Umbrosyne
+Selithra
+Dreamveil Daughter
+Nightwither
+Nocturne’s Bloom
+Virella
+Lunacendreth
+Phasmerra
+Thalynne of the Eclipse
+Shadowlight
+Vesperyn
+Lunaraith
+Astrevelle
+Noctura
+Mournsong
+Velunisse
+Lunethra
+Duskworn
+Moon’s Memory
+Nyxaelle
+Somnielle
+Umbrelith
+Phantyssa
+Dreamlorn
+Noctvale
+Lunathra
+Veythrae
+Starlorn
diff --git a/modular_darkpack/modules/occult_artifacts/strings/vengeance_spirits.txt b/modular_darkpack/modules/occult_artifacts/strings/vengeance_spirits.txt
new file mode 100644
index 000000000000..e287875d49cb
--- /dev/null
+++ b/modular_darkpack/modules/occult_artifacts/strings/vengeance_spirits.txt
@@ -0,0 +1,121 @@
+Ashen Pact
+Ashen Sovereign
+Ashen Veil
+Ashfall Covenant
+Ashveil
+Blood of the Forgotten
+Bloodharrow
+Bloodmourn
+Bloodsong of the Lost
+Crown of Ruin
+Grave of the Faithless
+Graveblight
+Gravebloom
+Gravetide
+Harrowlight
+Harrowmire
+Hollowwind
+Mournspire
+Mournveil
+Night of the Unmourned
+Oathbreaker’s Dawn
+Oathbreaker’s Rest
+Oathfire
+Oathless Dawn
+Ruinveil
+Ruin’s Choir
+Ruin’s Embrace
+Shadeborn
+Storm Upon the Barrow
+Storm of the Faithless
+The Ashen Reign
+The Ashen Revenant
+The Banished King
+The Banshee’s Gift
+The Bitter End
+The Bitter Promise
+The Black Eulogy
+The Black Lament
+The Black Rebirth
+The Black Sermon
+The Bladed Choir
+The Bleak Ascendant
+The Bleeding Hunt
+The Bleeding Moon
+The Blight of Kings
+The Bloodlit Exile
+The Bone Lantern
+The Bone Sunder
+The Broken Host
+The Broken Pyre
+The Burning Quiet
+The Cinder Choir
+The Crimson Reproach
+The Crimson Wake
+The Crimson Weald
+The Cursed Benediction
+The Deathlight Covenant
+The Dread Covenant
+The Eclipsed Throne
+The Endless Hunt
+The Endless Woe
+The Eternal Lament
+The Final Benediction
+The Forgotten Banquet
+The Forgotten Legion
+The Forgotten Warden
+The Frosted Grin
+The Frozen Hymn
+The Gilded Scourge
+The Gloomfeast
+The Grave Hymnal
+The Graven Host
+The Graven Oath
+The Hollow Feast
+The Hollow Glory
+The Hollow Monarch
+The Hollow Vow
+The Iron Dirge
+The Iron Wail
+The Last Benediction
+The Last Oathkeeper
+The Last Winter’s Oath
+The Long Mourning
+The Lost Crusade
+The Mourner’s Wake
+The Mourning Gale
+The Mourning Throne
+The Nameless Howl
+The Nameless Rite
+The Pale Confessor
+The Pale Dominion
+The Pale Dread
+The Pale Maw
+The Pale Reckoner
+The Pale Reclaiming
+The Pale Requiem
+The Pale Resurgence
+The Pale Supplicant
+The Red Pilgrimage
+The Sable Pilgrimage
+The Shadow’s Debt
+The Shadow’s Triumph
+The Shattered Crown
+The Shattered Hymn
+The Silent Dominion
+The Silent Herald
+The Silent Hunt
+The Silent Reckoning
+The Sorrow’s Feast
+The Waking Grief
+The Weeping Hunt
+The Whispered End
+The Widow’s Cry
+The Withered Hunt
+The Withering Crown
+The Wraith’s Vow
+Thornwake
+Vowrend
+Whisper of the Gallows
+Wraithbound
+Wraithspire
diff --git a/modular_darkpack/modules/paths/code/conjured_items.dm b/modular_darkpack/modules/paths/code/conjured_items.dm
index f82620658754..7b3b937a13a7 100644
--- a/modular_darkpack/modules/paths/code/conjured_items.dm
+++ b/modular_darkpack/modules/paths/code/conjured_items.dm
@@ -54,7 +54,7 @@
desc = "Your hand burns with supernatural fire."
icon_state = "flame"
inhand_icon_state = "flame"
- force = 25
+ force = 15
fancy = FALSE
// Levinbolt items
@@ -63,7 +63,7 @@
desc = "Your arm surges with electricity!"
icon_state = "illuminate"
inhand_icon_state = "illuminate"
- force = 15
+ force = 10
light_range = 2
light_power = 1
light_color = COLOR_WHITE
diff --git a/modular_darkpack/modules/paths/code/thaumaturgy_archives.dm b/modular_darkpack/modules/paths/code/thaumaturgy_archives.dm
index 1f37c3cbb39a..21b820333996 100644
--- a/modular_darkpack/modules/paths/code/thaumaturgy_archives.dm
+++ b/modular_darkpack/modules/paths/code/thaumaturgy_archives.dm
@@ -19,20 +19,20 @@
// ARTIFACTS
// Lower tier artifacts
- new /datum/data/vending_product("Weekapaug Thistle", /obj/item/vtm_artifact/weekapaug_thistle, 75),
- new /datum/data/vending_product("Mummywrap Fetish", /obj/item/vtm_artifact/mummywrap_fetish, 70),
- new /datum/data/vending_product("Galdjum", /obj/item/vtm_artifact/galdjum, 70),
- new /datum/data/vending_product("Bloodstar", /obj/item/vtm_artifact/bloodstar, 70),
+ new /datum/data/vending_product("Weekapaug Thistle", /obj/item/occult_artifact/vampire/weekapaug_thistle, 75),
+ new /datum/data/vending_product("Mummywrap Fetish", /obj/item/occult_artifact/vampire/mummywrap_fetish, 70),
+ new /datum/data/vending_product("Galdjum", /obj/item/occult_artifact/vampire/galdjum, 70),
+ new /datum/data/vending_product("Bloodstar", /obj/item/occult_artifact/vampire/bloodstar, 70),
// Mid tier artifacts
- new /datum/data/vending_product("Fae Charm", /obj/item/vtm_artifact/fae_charm, 120),
- new /datum/data/vending_product("Daimonori", /obj/item/vtm_artifact/daimonori, 120),
- new /datum/data/vending_product("Key of Alamut", /obj/item/vtm_artifact/key_of_alamut, 130),
- new /datum/data/vending_product("Heart of Eliza", /obj/item/vtm_artifact/heart_of_eliza, 140),
- new /datum/data/vending_product("Bloodstone", /obj/item/vtm_artifact/bloodstone, 140),
+ new /datum/data/vending_product("Fae Charm", /obj/item/occult_artifact/vampire/fae_charm, 120),
+ new /datum/data/vending_product("Daimonori", /obj/item/occult_artifact/vampire/daimonori, 120),
+ new /datum/data/vending_product("Key of Alamut", /obj/item/occult_artifact/vampire/key_of_alamut, 130),
+ new /datum/data/vending_product("Heart of Eliza", /obj/item/occult_artifact/vampire/heart_of_eliza, 140),
+ new /datum/data/vending_product("Bloodstone", /obj/item/occult_artifact/vampire/bloodstone, 140),
// High tier artifacts
- new /datum/data/vending_product("Odious Chalice", /obj/item/vtm_artifact/odious_chalice, 180),
+ new /datum/data/vending_product("Odious Chalice", /obj/item/occult_artifact/vampire/odious_chalice, 180),
)
@@ -262,8 +262,8 @@
//offer artifacts to the shop for research points AND increment stock
/obj/structure/retail/occult/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
. = ..()
- if(istype(tool, /obj/item/vtm_artifact))
- var/obj/item/vtm_artifact/artifact = tool
+ if(istype(tool, /obj/item/occult_artifact))
+ var/obj/item/occult_artifact/artifact = tool
if(!ishuman(user))
return ITEM_INTERACT_BLOCKING
diff --git a/modular_darkpack/modules/phones/code/phone_subsystem.dm b/modular_darkpack/modules/phones/code/phone_subsystem.dm
index 9965aee04640..dab078bed12d 100644
--- a/modular_darkpack/modules/phones/code/phone_subsystem.dm
+++ b/modular_darkpack/modules/phones/code/phone_subsystem.dm
@@ -40,9 +40,11 @@ SUBSYSTEM_DEF(phones)
// Returns a valid frequency for a phone to use for a phone call.
/datum/controller/subsystem/phones/proc/establish_secure_frequency()
var/frequency_to_use = USABLE_RADIO_FREQUENCY_FOR_PHONE_RANGE
- for(var/i in length(frequencies_in_use))
- if(frequency_to_use == (USABLE_RADIO_FREQUENCY_FOR_PHONE_RANGE + i))
- frequency_to_use++
+ while(frequency_to_use in frequencies_in_use)
+ if(frequency_to_use >= MAX_RADIO_FREQUENCY_FOR_PHONE_RANGE)
+ stack_trace("Phones have somehow connected over [MAX_RADIO_FREQUENCY_FOR_PHONE_RANGE - USABLE_RADIO_FREQUENCY_FOR_PHONE_RANGE] connections without being freed up. Something is wrong.")
+ break
+ frequency_to_use++
frequencies_in_use += frequency_to_use
return frequency_to_use
diff --git a/modular_darkpack/modules/phones/code/phone_subtypes.dm b/modular_darkpack/modules/phones/code/phone_subtypes.dm
index e8c32b6da124..88c6051078bf 100644
--- a/modular_darkpack/modules/phones/code/phone_subtypes.dm
+++ b/modular_darkpack/modules/phones/code/phone_subtypes.dm
@@ -52,7 +52,7 @@
/obj/item/smartphone/toreador_primo
important_contact_of = VAMPIRE_CLAN_TOREADOR
contact_networks_pre_init = list(
- alist(NETWORK_ID = VAMPIRE_LEADER_NETWORK, OUR_ROLE = "Rosebud Night Club Owner", USE_JOB_TITLE = FALSE)
+ alist(NETWORK_ID = VAMPIRE_LEADER_NETWORK, OUR_ROLE = (PRIMARY_NIGHTCLUB_COMPANY + " Night Club Owner"), USE_JOB_TITLE = FALSE)
)
// NOSFERATU
@@ -229,6 +229,27 @@
alist(NETWORK_ID = ENDRON_NETWORK, OUR_ROLE = "Endron Employee", USE_JOB_TITLE = TRUE)
)
+/obj/item/smartphone/novice
+ contact_networks_pre_init = list(
+ alist(NETWORK_ID = SOCIETY_OF_LEOPOLD_NETWORK, OUR_ROLE = "Novice", USE_JOB_TITLE = TRUE)
+ )
+
+/obj/item/smartphone/condottieri
+ contact_networks_pre_init = list(
+ alist(NETWORK_ID = SOCIETY_OF_LEOPOLD_NETWORK, OUR_ROLE = "Condottieri", USE_JOB_TITLE = TRUE)
+ )
+
+/obj/item/smartphone/inquisitor
+ contact_networks_pre_init = list(
+ alist(NETWORK_ID = SOCIETY_OF_LEOPOLD_NETWORK, OUR_ROLE = "Inquisitor", USE_JOB_TITLE = TRUE)
+ )
+
+/obj/item/smartphone/abbe
+ contact_networks_pre_init = list(
+ alist(NETWORK_ID = SOCIETY_OF_LEOPOLD_NETWORK, OUR_ROLE = "Abbé", USE_JOB_TITLE = TRUE)
+ )
+
+
#undef NETWORK_ID
#undef OUR_ROLE
#undef USE_JOB_TITLE
diff --git a/modular_darkpack/modules/powers/code/admin_discipline_editor.dm b/modular_darkpack/modules/powers/code/admin_discipline_editor.dm
index 8f8a2b3b8af1..3ff603e799c7 100644
--- a/modular_darkpack/modules/powers/code/admin_discipline_editor.dm
+++ b/modular_darkpack/modules/powers/code/admin_discipline_editor.dm
@@ -163,7 +163,6 @@
target_prefs.discipline_levels -= disc_path
else
target_prefs.discipline_levels[disc_path] = new_level
- target_prefs.save_character()
var/client/target_client = GLOB.directory[target_ckey]
if(target_client?.mob && ishuman(target_client.mob))
var/mob/living/carbon/human/target_mob = target_client.mob
@@ -173,6 +172,7 @@
else if(!target_mob.change_st_power_level(discipline_path, new_level))
target_mob.give_st_power(discipline_path, new_level) // and add them immediately, too
var/character_name = target_prefs.read_preference(/datum/preference/name/real_name)
+ target_prefs.save_character()
message_admins("[key_name_admin(ui.user)] set [disc_path] to level [new_level] for [ADMIN_LOOKUPFLW(target_ckey)]'s character [character_name]).")
log_admin("[key_name_admin(ui.user)] set [disc_path] to level [new_level] for [ADMIN_LOOKUPFLW(target_ckey)]'s character [character_name]).")
return TRUE
diff --git a/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm b/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm
index 4fb7bcb7b075..f750a363bcef 100644
--- a/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm
+++ b/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm
@@ -77,7 +77,6 @@
cooldown_timer = null
QDEL_LIST(duration_timers)
grouped_powers = null
- discipline = null
owner = null
return ..()
diff --git a/modular_darkpack/modules/powers/code/discipline/animalism.dm b/modular_darkpack/modules/powers/code/discipline/animalism.dm
index 34d3e8605213..a018c19e8287 100644
--- a/modular_darkpack/modules/powers/code/discipline/animalism.dm
+++ b/modular_darkpack/modules/powers/code/discipline/animalism.dm
@@ -138,6 +138,7 @@
melee_damage_lower = 3
melee_damage_upper = 8
obj_damage = 10
+ bloodpool = 2
/mob/living/basic/mouse/vampire/summoned/Initialize(mapload)
AddElement(/datum/element/ai_retaliate)
@@ -153,6 +154,7 @@
melee_damage_lower = 5
melee_damage_upper = 12
obj_damage = 15
+ bloodpool = 2
/mob/living/basic/pet/cat/darkpack/summoned/Initialize(mapload)
. = ..()
@@ -176,6 +178,7 @@
attack_verb_simple = "bite"
attack_sound = 'modular_darkpack/modules/deprecated/sounds/dog.ogg'
random_wolf_color = FALSE
+ bloodpool = 2
/mob/living/basic/pet/dog/wolf/summoned/Initialize(mapload)
. = ..()
@@ -192,6 +195,7 @@
obj_damage = 10
attack_verb_continuous = "bites"
attack_verb_simple = "bite"
+ bloodpool = 2
/mob/living/basic/bat/summoned/Initialize(mapload)
. = ..()
diff --git a/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm b/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm
index 1d29e834edd3..46becb5f60d8 100644
--- a/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm
+++ b/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm
@@ -23,7 +23,7 @@
/datum/component/aura
// A list of currently selected emotions by the player
var/current_aura = AURA_INNOCENT
- var/current_emotion_name = "Innocent"
+ var/current_emotion_name = ""
var/obj/effect/abstract/shared_particle_holder/aura_smoke
var/examine_message = ""
var/obj/effect/aura_overlay/aura_glow_image
@@ -39,7 +39,7 @@
target_hud.add_atom_to_hud(parent_mob)
RegisterSignal(parent_mob, COMSIG_MOB_EMOTION_CHANGED, PROC_REF(update_emotions))
- RegisterSignal(parent_mob, COMSIG_MOB_UPDATE_AURA, PROC_REF(update_aura))
+ RegisterSignals(parent_mob, list(COMSIG_MOB_UPDATE_AURA, COMSIG_LIVING_GAINED_SPLAT, COMSIG_LIVING_LOSE_SPLAT, SIGNAL_ADDTRAIT(TRAIT_IN_FRENZY), SIGNAL_REMOVETRAIT(TRAIT_IN_FRENZY)), PROC_REF(update_aura))
RegisterSignal(parent_mob, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
if(isnpc(parent_mob))
RegisterSignal(parent_mob, COMSIG_COMBAT_MODE_TOGGLED, PROC_REF(on_combat_mode_toggled))
@@ -51,7 +51,7 @@
var/datum/atom_hud/data/auspex_aura/target_hud = GLOB.huds[DATA_HUD_AUSPEX_AURAS]
target_hud.remove_atom_from_hud(parent_mob)
examine_message = ""
- UnregisterSignal(parent_mob, list(COMSIG_MOB_EMOTION_CHANGED, COMSIG_MOB_UPDATE_AURA, COMSIG_ATOM_EXAMINE))
+ UnregisterSignal(parent_mob, list(COMSIG_MOB_EMOTION_CHANGED, COMSIG_MOB_UPDATE_AURA, COMSIG_LIVING_GAINED_SPLAT, COMSIG_LIVING_LOSE_SPLAT, SIGNAL_ADDTRAIT(TRAIT_IN_FRENZY), SIGNAL_REMOVETRAIT(TRAIT_IN_FRENZY)), COMSIG_ATOM_EXAMINE)
if(isnpc(parent_mob))
UnregisterSignal(parent_mob, list(COMSIG_COMBAT_MODE_TOGGLED))
QDEL_NULL(aura_smoke)
@@ -83,11 +83,12 @@
/datum/component/aura/proc/on_examine(datum/source, mob/user, list/examine_list)
SIGNAL_HANDLER
- if(!examine_message)
- return
var/datum/atom_hud/data/auspex_aura/auspex_hud = GLOB.huds[DATA_HUD_AUSPEX_AURAS]
if(!(user in auspex_hud.hud_users_all_z_levels))
return
+ update_examine_message(null)
+ if(!examine_message)
+ return
examine_list += examine_message
/datum/component/aura/proc/update_examine_message(mutable_appearance/aura_appearance)
@@ -156,13 +157,12 @@
examine_message += "Black veins pulse through [parent_mob.p_their()] aura."
if(HAS_TRAIT(parent_mob, TRAIT_FRENETIC_AURA))
examine_message += "[parent_mob.p_Their()] aura appears especially energetic."
- if(!HAS_TRAIT(parent, TRAIT_PALE_AURA) && get_ghoul_splat(parent_mob))
+
+ if(has_pale_aura(parent_mob))
+ examine_message += "[parent_mob.p_Their()] aura colors appear pale."
+ else if(has_pale_blotches(parent_mob))
examine_message += "Pale blotches mark [parent_mob.p_their()] aura."
- if(get_kindred_splat(parent_mob))
- var/mob/living/carbon/human/lick = parent_mob
- var/datum/st_stat/morality_path/morality/stat_morality = lick.storyteller_stats[STAT_MORALITY]
- if(!stat_morality.morality_path.alignment == MORALITY_HUMANITY) // non-humanity licks have standard kindred auras that give them away
- examine_message += "[parent_mob.p_Their()] aura colors appear pale."
+
if(isavatar(parent_mob) || isobserver(parent_mob))
examine_message += "[parent_mob.p_Their()] aura is weak and intermittent, fading in and out."
@@ -179,6 +179,14 @@
aura_smoke.blend_mode = 2
aura_smoke.add_filter("particle_blur", 1, gauss_blur_filter(8))
var/mutable_appearance/aura_appearance = mutable_appearance('modular_darkpack/modules/powers/icons/auras.dmi', "aura", ABOVE_MOB_LAYER, parent_mob, ABOVE_GAME_PLANE)
+ // high humanity kindred OR kindred with blush of health avoid getting the still heart. in auspex, their hearts will instead show like humans; beating!
+ if(get_kindred_splat(parent_mob))
+ var/mob/living/carbon/human/lick = parent_mob
+ var/datum/st_stat/morality_path/morality/stat_morality = lick?.storyteller_stats[STAT_MORALITY]
+ if((stat_morality?.morality_path?.alignment != MORALITY_HUMANITY || stat_morality?.get_score() < 5) && !HAS_TRAIT(parent_mob, TRAIT_BLUSH_OF_HEALTH))
+ aura_appearance = mutable_appearance('modular_darkpack/modules/powers/icons/auras.dmi', "aura_dead", ABOVE_MOB_LAYER, parent_mob, ABOVE_GAME_PLANE)
+ if(parent_mob.stat == DEAD)
+ aura_appearance = mutable_appearance('modular_darkpack/modules/powers/icons/auras.dmi', "aura_dead", ABOVE_MOB_LAYER, parent_mob, ABOVE_GAME_PLANE)
update_aura_colors(aura_appearance, holder)
update_aura_overlays(aura_appearance, holder)
update_aura_filters(aura_appearance, holder)
@@ -206,13 +214,10 @@
holder.color = null
var/mob/parent_mob = parent
- if(HAS_TRAIT(parent, TRAIT_PALE_AURA) && !HAS_TRAIT(parent, TRAIT_DECEPTIVE_AURA) && output_color)
- var/mob/living/carbon/human/lick = parent_mob
- var/datum/st_stat/morality_path/morality/stat_morality = lick.storyteller_stats[STAT_MORALITY]
- if(!stat_morality?.morality_path.alignment == MORALITY_HUMANITY) // non-humanity licks have standard kindred auras that give them away
- var/list/hsv_color_value = rgb2hsv(output_color)
- hsv_color_value[2] = hsv_color_value[2] * 0.7 // Reduce saturation for kindred
- aura_appearance.color = hsv2rgb(hsv_color_value)
+ if(output_color && has_pale_aura(parent_mob))
+ var/list/hsv_color_value = rgb2hsv(output_color)
+ hsv_color_value[2] = hsv_color_value[2] * 0.7 // Reduce saturation for kindred
+ aura_appearance.color = hsv2rgb(hsv_color_value)
if(HAS_TRAIT(parent_mob, TRAIT_FRENETIC_AURA))
var/list/hsv_color_value = rgb2hsv(aura_appearance.color || "#ffffff")
@@ -232,6 +237,7 @@
aura_glow_image.plane = ABOVE_LIGHTING_PLANE
aura_glow_image.add_filter("ambient_blur", 1, gauss_blur_filter(12))
aura_glow_image.color = aura_appearance.color
+ aura_glow_image.icon_state = aura_appearance.icon_state || "aura"
aura_glow_image.alpha = 20
holder.vis_contents += aura_glow_image
@@ -284,7 +290,7 @@
static_image.alpha = 150
holder.vis_contents += static_image
- if(!HAS_TRAIT(parent, TRAIT_PALE_AURA) && get_ghoul_splat(parent_mob))
+ if(has_pale_blotches(parent_mob))
var/list/hsv_color_value = rgb2hsv(aura_appearance.color)
hsv_color_value[2] = hsv_color_value[2] * 0.7 // Reduce saturation for ghouls
aura_smoke_image.color = hsv2rgb(hsv_color_value)
@@ -309,3 +315,18 @@
remove_wibbly_filters(holder)
apply_wibbly_filters(holder)
holder.add_filter("aura_glow", 1, gauss_blur_filter(2))
+
+/datum/component/aura/proc/has_pale_aura(mob/parent_mob)
+ if(HAS_TRAIT(parent, TRAIT_PALE_AURA) && !HAS_TRAIT(parent, TRAIT_DECEPTIVE_AURA))
+ if(get_kindred_splat(parent_mob))
+ var/mob/living/carbon/human/lick = parent_mob
+ var/datum/st_stat/morality_path/morality/stat_morality = lick.storyteller_stats[STAT_MORALITY]
+ var/alignment = stat_morality?.morality_path?.alignment
+ if(alignment != MORALITY_HUMANITY) // non-humanity licks have standard kindred auras that give them away // Also catches a null value.
+ return TRUE
+
+ return TRUE
+
+/datum/component/aura/proc/has_pale_blotches(mob/parent_mob)
+ if(!HAS_TRAIT(parent_mob, TRAIT_PALE_AURA) && get_ghoul_splat(parent_mob))
+ return TRUE
diff --git a/modular_darkpack/modules/powers/code/discipline/auspex/auspex.dm b/modular_darkpack/modules/powers/code/discipline/auspex/auspex.dm
index bfa5eebab85a..61560dd4f30f 100644
--- a/modular_darkpack/modules/powers/code/discipline/auspex/auspex.dm
+++ b/modular_darkpack/modules/powers/code/discipline/auspex/auspex.dm
@@ -135,7 +135,7 @@
var/datum/atom_hud/data/auspex_aura/target_hud = GLOB.huds[DATA_HUD_AUSPEX_AURAS]
target_hud.show_to(owner)
- var/list/heard = orange(DEFAULT_MESSAGE_RANGE, owner)
+ var/list/heard = orange(DEFAULT_SIGHT_DISTANCE, owner)
for(var/mob/living/hearer in heard)
if(!HAS_TRAIT(src, TRAIT_FORCED_EMOTION))
hearer.apply_status_effect(/datum/status_effect/question_emotion)
diff --git a/modular_darkpack/modules/powers/code/discipline/auspex/heartbeat_sensing_component.dm b/modular_darkpack/modules/powers/code/discipline/auspex/heartbeat_sensing_component.dm
index f35a3be780ce..b9b83db738a8 100644
--- a/modular_darkpack/modules/powers/code/discipline/auspex/heartbeat_sensing_component.dm
+++ b/modular_darkpack/modules/powers/code/discipline/auspex/heartbeat_sensing_component.dm
@@ -44,7 +44,7 @@
receivers -= list(echolocate_receiver)
return ..()
-/datum/component/heartbeat_sensing/process()
+/datum/component/heartbeat_sensing/process(seconds_per_tick)
var/mob/living/parent_mob = parent
if(parent_mob.stat == DEAD)
return
diff --git a/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion_hallucination.dm b/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion_hallucination.dm
index 60f787b29e3d..129ad9a7fe3d 100644
--- a/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion_hallucination.dm
+++ b/modular_darkpack/modules/powers/code/discipline/daimonion/daimonion_hallucination.dm
@@ -23,7 +23,7 @@
target = null
return ..()
-/obj/effect/client_image_holder/baali_demon/process()
+/obj/effect/client_image_holder/baali_demon/process(seconds_per_tick)
if(QDELETED(target) || target.stat == DEAD)
qdel(src)
return
diff --git a/modular_darkpack/modules/powers/code/discipline/dementation.dm b/modular_darkpack/modules/powers/code/discipline/dementation.dm
index 198e1e29bd71..08b1d99d8b2a 100644
--- a/modular_darkpack/modules/powers/code/discipline/dementation.dm
+++ b/modular_darkpack/modules/powers/code/discipline/dementation.dm
@@ -72,7 +72,7 @@ Presence powers, etc
/datum/discipline_power/dementation/passion/activate(mob/living/carbon/human/target)
. = ..()
target.remove_overlay(MUTATIONS_LAYER)
- var/mutable_appearance/dementation_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "dementation", -MUTATIONS_LAYER)
+ var/mutable_appearance/dementation_overlay = mutable_appearance('modular_darkpack/modules/powers/icons/dementation.dmi', "dementation", -MUTATIONS_LAYER)
dementation_overlay.pixel_z = 1
target.overlays_standing[MUTATIONS_LAYER] = dementation_overlay
target.apply_overlay(MUTATIONS_LAYER)
@@ -155,7 +155,7 @@ pools for a turn or two after the manifestation.
/datum/discipline_power/dementation/the_haunting/activate(mob/living/carbon/human/target)
. = ..()
target.remove_overlay(MUTATIONS_LAYER)
- var/mutable_appearance/dementation_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "dementation", -MUTATIONS_LAYER)
+ var/mutable_appearance/dementation_overlay = mutable_appearance('modular_darkpack/modules/powers/icons/dementation.dmi', "dementation", -MUTATIONS_LAYER)
dementation_overlay.pixel_z = 1
target.overlays_standing[MUTATIONS_LAYER] = dementation_overlay
target.apply_overlay(MUTATIONS_LAYER)
@@ -338,7 +338,7 @@ frenzy or Rötschreck response is automatic.
var/successes
-//DARKPACK TODO - frenzy. this power requires it
+// DARKPACK TODO - frenzy. this power requires it
/*
Affected victims fly immediately into frenzy or a
@@ -386,7 +386,7 @@ frenzy or Rötschreck response is automatic.
GLOB.move_manager.move_away(moving = chosen, chasing = owner, max_dist = 10, timeout = (duration_length * 2), delay = chosen.cached_multiplicative_slowdown)
chosen.remove_overlay(MUTATIONS_LAYER)
- var/mutable_appearance/dementation_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "dementation", -MUTATIONS_LAYER)
+ var/mutable_appearance/dementation_overlay = mutable_appearance('modular_darkpack/modules/powers/icons/dementation.dmi', "dementation", -MUTATIONS_LAYER)
dementation_overlay.pixel_z = 1
chosen.overlays_standing[MUTATIONS_LAYER] = dementation_overlay
chosen.apply_overlay(MUTATIONS_LAYER)
@@ -455,7 +455,7 @@ determines the duration.
. = ..()
attack_target = target
attack_target.remove_overlay(MUTATIONS_LAYER)
- var/mutable_appearance/dementation_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "dementation", -MUTATIONS_LAYER)
+ var/mutable_appearance/dementation_overlay = mutable_appearance('modular_darkpack/modules/powers/icons/dementation.dmi', "dementation", -MUTATIONS_LAYER)
dementation_overlay.pixel_z = 1
attack_target.overlays_standing[MUTATIONS_LAYER] = dementation_overlay
attack_target.apply_overlay(MUTATIONS_LAYER)
diff --git a/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm b/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm
index d697d3379d11..ffa34066a7dc 100644
--- a/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm
+++ b/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm
@@ -476,7 +476,7 @@
/datum/discipline_power/dominate/possession/pre_activation_checks(mob/living/carbon/human/target)
- if(get_kindred_splat(target) || get_garou_splat(target)) //DARKPACK TODO: reimplement Kuei-Jin
+ if(get_kindred_splat(target) || get_garou_splat(target)) // DARKPACK TODO: reimplement Kuei-Jin
to_chat(owner, span_warning("You cannot possess [get_kindred_splat(target) ? "another kindred" : "this creature - the beast within resists"]!"))
return FALSE
diff --git a/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm b/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm
index 4fa1b1d240cf..e5498e13b7dd 100644
--- a/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm
+++ b/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm
@@ -269,9 +269,9 @@
owner.set_body_sprite(target_splat.clan.alt_sprite, target_splat.clan.alt_sprite_greyscale, TRUE)
else
if(owner_splat.clan && (TRAIT_MASQUERADE_VIOLATING_FACE in owner_splat.clan.clan_traits))
- REMOVE_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, MAGIC_TRAIT)
+ REMOVE_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, CLAN_TRAIT)
if(owner_splat.clan && (TRAIT_MASQUERADE_VIOLATING_EYES in owner_splat.clan.clan_traits))
- REMOVE_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_EYES, MAGIC_TRAIT)
+ REMOVE_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_EYES, CLAN_TRAIT)
owner.set_body_sprite(SPECIES_HUMAN, TRUE, TRUE)
owner.updateappearance(mutcolor_update = TRUE)
@@ -287,9 +287,9 @@
owner.name = original_name
if(owner_splat.clan && (TRAIT_MASQUERADE_VIOLATING_FACE in owner_splat.clan.clan_traits))
- ADD_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, MAGIC_TRAIT)
+ ADD_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, CLAN_TRAIT)
if(owner_splat.clan && (TRAIT_MASQUERADE_VIOLATING_EYES in owner_splat.clan.clan_traits))
- ADD_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_EYES, MAGIC_TRAIT)
+ ADD_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_EYES, CLAN_TRAIT)
owner.set_body_sprite(original_sprite, original_sprite_greyscale, TRUE)
owner.updateappearance(mutcolor_update = TRUE)
diff --git a/modular_darkpack/modules/powers/code/discipline/obtenebration/obtenebration.dm b/modular_darkpack/modules/powers/code/discipline/obtenebration/obtenebration.dm
index 5f9de064b498..f08828f82ca8 100644
--- a/modular_darkpack/modules/powers/code/discipline/obtenebration/obtenebration.dm
+++ b/modular_darkpack/modules/powers/code/discipline/obtenebration/obtenebration.dm
@@ -119,6 +119,7 @@
cooldown_length = 1 TURNS
var/list/active_tentacles = list()
+ var/aggro_mode = "Aggressive"
/datum/discipline_power/obtenebration/arms_of_the_abyss/activate(atom/target)
. = ..()
@@ -137,7 +138,7 @@
var/has_action = !!(locate(/datum/action/aggro_mode) in owner.actions)
if(!has_action)
- var/datum/action/aggro_mode/A = new()
+ var/datum/action/aggro_mode/A = new(src)
A.Grant(owner)
// Create tentacles based on successes
@@ -155,8 +156,9 @@
if(open_turfs.len)
new_tentacle = new /mob/living/basic/abyss_tentacle(pick(open_turfs), owner)
- // if we ended up making a new tentacle add it to our list
+ // if we ended up making a new tentacle add it to our list and inherit set aggro_mode
if(new_tentacle)
+ new_tentacle.aggro_mode = aggro_mode
active_tentacles += new_tentacle
else
to_chat(usr, span_warning("The area is too bright for the shadows to manifest!"))
@@ -284,8 +286,8 @@
ADD_TRAIT(owner, TRAIT_NOBLOOD, MAGIC_TRAIT)
ADD_TRAIT(owner, TRAIT_PACIFISM, MAGIC_TRAIT) // Can't physically attack while in this form
//ADD_TRAIT(owner, TRAIT_MOVE_FLYING, MAGIC_TRAIT) // Flying to simulate being unaffected by gravity
- ADD_TRAIT(owner, TRAIT_PASSDOOR, MAGIC_TRAIT) // Trait to phase through doors
- owner.pass_flags |= PASSTABLE
+ owner.pass_flags |= (PASSDOORS | PASSTABLE | PASSSTRUCTURE) // Phase through doors & fences / tables / machines, dumpsters, barrels, lampposts
+
saved_density = owner.density
owner.density = FALSE
@@ -305,8 +307,7 @@
REMOVE_TRAIT(owner, TRAIT_NOBLOOD, MAGIC_TRAIT)
REMOVE_TRAIT(owner, TRAIT_PACIFISM, MAGIC_TRAIT)
//REMOVE_TRAIT(owner, TRAIT_MOVE_FLYING, MAGIC_TRAIT)
- REMOVE_TRAIT(owner, TRAIT_PASSDOOR, MAGIC_TRAIT)
- owner.pass_flags &= ~PASSTABLE
+ owner.pass_flags &= ~(PASSDOORS | PASSTABLE | PASSSTRUCTURE)
owner.density = saved_density
@@ -319,6 +320,12 @@
button_icon = 'icons/hud/screen_glass.dmi'
button_icon_state = "harm"
var/current_mode = "Aggressive"
+ var/datum/discipline_power/obtenebration/arms_of_the_abyss/abyss_power
+
+/datum/action/aggro_mode/New(Target)
+ . = ..()
+ abyss_power = Target
+ current_mode = abyss_power.aggro_mode
/datum/action/aggro_mode/Trigger(mob/clicker, trigger_flags)
. = ..()
@@ -342,13 +349,10 @@
var/select = tgui_input_list(tentacle_owner, "Select tentacle behaviour", "Tentacle Mode", options)
if(!select || !tentacle_owner)
return
-
+ if(!abyss_power)
+ return
+ abyss_power.aggro_mode = select
current_mode = select
- tentacle_owner.tentacle_aggro_mode = select
-
- // need to access the discipline_power so we can grab the list
- var/datum/splat/vampire/vampire = get_splat_with_discipline(tentacle_owner)
- var/datum/discipline_power/obtenebration/arms_of_the_abyss/abyss_power = vampire?.get_discipline_power(/datum/discipline_power/obtenebration/arms_of_the_abyss)
var/tentacles = 0
for(var/mob/living/basic/abyss_tentacle/T in abyss_power?.active_tentacles)
diff --git a/modular_darkpack/modules/powers/code/discipline/potence/potence.dm b/modular_darkpack/modules/powers/code/discipline/potence/potence.dm
index 28b85b44c42d..11e318c84ce1 100644
--- a/modular_darkpack/modules/powers/code/discipline/potence/potence.dm
+++ b/modular_darkpack/modules/powers/code/discipline/potence/potence.dm
@@ -7,10 +7,35 @@
/datum/discipline_power/potence
name = "Potence power name"
desc = "Potence power description"
+ abstract_type = /datum/discipline_power/potence
activate_sound = 'modular_darkpack/modules/powers/sounds/potence_activate.ogg'
deactivate_sound = 'modular_darkpack/modules/powers/sounds/potence_deactivate.ogg'
+ check_flags = DISC_CHECK_CAPABLE
+
+ toggled = TRUE
+ duration_length = 1 TURNS
+
+/datum/discipline_power/potence/post_gain()
+ owner.st_add_stat_mod(STAT_STRENGTH, level, "Potence")
+
+/datum/discipline_power/potence/post_loss()
+ owner.st_remove_stat_mod(STAT_STRENGTH, "Potence")
+
+/datum/discipline_power/potence/activate()
+ . = ..()
+
+ if(level <= 5)
+ var/max_level = min(discipline.level, 5)
+ owner.apply_status_effect(/datum/status_effect/potence, max_level)
+
+/datum/discipline_power/potence/deactivate()
+ . = ..()
+ if(level <= 5)
+ owner.remove_status_effect(/datum/status_effect/potence)
+
+
//POTENCE 1
/datum/discipline_power/potence/one
name = "Potence 1"
@@ -18,11 +43,6 @@
level = 1
- check_flags = DISC_CHECK_CAPABLE
-
- toggled = TRUE
- duration_length = 2 TURNS
-
grouped_powers = list(
/datum/discipline_power/potence/two,
/datum/discipline_power/potence/three,
@@ -30,18 +50,6 @@
/datum/discipline_power/potence/five
)
-/datum/discipline_power/potence/one/activate()
- . = ..()
-
- owner.apply_status_effect(/datum/status_effect/potence/one)
-
-/datum/discipline_power/potence/one/deactivate()
- . = ..()
-
- owner.remove_status_effect(/datum/status_effect/potence/one)
-
-/datum/discipline_power/potence/one/post_gain()
- owner.st_add_stat_mod(STAT_STRENGTH, 1, "Potence")
//POTENCE 2
/datum/discipline_power/potence/two
@@ -50,11 +58,6 @@
level = 2
- check_flags = DISC_CHECK_CAPABLE
-
- toggled = TRUE
- duration_length = 2 TURNS
-
grouped_powers = list(
/datum/discipline_power/potence/one,
/datum/discipline_power/potence/three,
@@ -62,16 +65,6 @@
/datum/discipline_power/potence/five
)
-/datum/discipline_power/potence/two/activate()
- . = ..()
- owner.apply_status_effect(/datum/status_effect/potence/two)
-
-/datum/discipline_power/potence/two/deactivate()
- . = ..()
- owner.remove_status_effect(/datum/status_effect/potence/two)
-
-/datum/discipline_power/potence/two/post_gain()
- owner.st_add_stat_mod(STAT_STRENGTH, 2, "Potence")
//POTENCE 3
/datum/discipline_power/potence/three
@@ -80,11 +73,6 @@
level = 3
- check_flags = DISC_CHECK_CAPABLE
-
- toggled = TRUE
- duration_length = 2 TURNS
-
grouped_powers = list(
/datum/discipline_power/potence/one,
/datum/discipline_power/potence/two,
@@ -92,16 +80,6 @@
/datum/discipline_power/potence/five
)
-/datum/discipline_power/potence/three/activate()
- . = ..()
- owner.apply_status_effect(/datum/status_effect/potence/three)
-
-/datum/discipline_power/potence/three/deactivate()
- . = ..()
- owner.remove_status_effect(/datum/status_effect/potence/three)
-
-/datum/discipline_power/potence/three/post_gain()
- owner.st_add_stat_mod(STAT_STRENGTH, 3, "Potence")
//POTENCE 4
/datum/discipline_power/potence/four
@@ -110,11 +88,6 @@
level = 4
- check_flags = DISC_CHECK_CAPABLE
-
- toggled = TRUE
- duration_length = 2 TURNS
-
grouped_powers = list(
/datum/discipline_power/potence/one,
/datum/discipline_power/potence/two,
@@ -122,16 +95,6 @@
/datum/discipline_power/potence/five
)
-/datum/discipline_power/potence/four/activate()
- . = ..()
- owner.apply_status_effect(/datum/status_effect/potence/four)
-
-/datum/discipline_power/potence/four/deactivate()
- . = ..()
- owner.remove_status_effect(/datum/status_effect/potence/four)
-
-/datum/discipline_power/potence/four/post_gain()
- owner.st_add_stat_mod(STAT_STRENGTH, 4, "Potence")
//POTENCE 5
/datum/discipline_power/potence/five
@@ -140,25 +103,9 @@
level = 5
- check_flags = DISC_CHECK_CAPABLE
-
- toggled = TRUE
- duration_length = 2 TURNS
-
grouped_powers = list(
/datum/discipline_power/potence/one,
/datum/discipline_power/potence/two,
/datum/discipline_power/potence/three,
/datum/discipline_power/potence/four
)
-
-/datum/discipline_power/potence/five/activate()
- . = ..()
- owner.apply_status_effect(/datum/status_effect/potence/five)
-
-/datum/discipline_power/potence/five/deactivate()
- . = ..()
- owner.remove_status_effect(/datum/status_effect/potence/five)
-
-/datum/discipline_power/potence/five/post_gain()
- owner.st_add_stat_mod(STAT_STRENGTH, 5, "Potence")
diff --git a/modular_darkpack/modules/powers/code/discipline/potence/potence_status_effect.dm b/modular_darkpack/modules/powers/code/discipline/potence/potence_status_effect.dm
index 8037974b58ff..6b8e073a45ef 100644
--- a/modular_darkpack/modules/powers/code/discipline/potence/potence_status_effect.dm
+++ b/modular_darkpack/modules/powers/code/discipline/potence/potence_status_effect.dm
@@ -3,15 +3,22 @@
status_type = STATUS_EFFECT_REPLACE
alert_type = null
- var/level
+ var/level = 1
var/datum/component/tackler/tackler
var/list/obj/item/bodypart/affected_bodyparts
+/datum/status_effect/potence/on_creation(mob/living/new_owner, level)
+ src.level = level
+ . = ..()
+
/datum/status_effect/potence/on_apply()
. = ..()
if (!.)
return
+ owner.st_remove_stat_mod(STAT_STRENGTH, "Potence")
+ owner.st_add_auto_successes(STAT_STRENGTH, level, "Potence")
+
if (iscarbon(owner))
var/mob/living/carbon/carbon_owner = owner
for (var/obj/item/bodypart/limb as anything in carbon_owner.bodyparts)
@@ -19,15 +26,9 @@
continue
LAZYADD(affected_bodyparts, limb)
-
- limb.unarmed_damage_low += 8 * level
- limb.unarmed_damage_high += 8 * level
limb.unarmed_attack_sound = 'modular_darkpack/modules/powers/sounds/heavypunch.ogg'
else if (isbasicmob(owner))
var/mob/living/basic/basic_owner = owner
-
- basic_owner.melee_damage_lower += 8 * level
- basic_owner.melee_damage_upper += 8 * level
basic_owner.attack_sound = 'modular_darkpack/modules/powers/sounds/heavypunch.ogg'
RegisterSignal(owner, COMSIG_MOB_ITEM_ATTACK, PROC_REF(apply_melee_modifier))
@@ -37,16 +38,14 @@
/datum/status_effect/potence/on_remove()
. = ..()
+ owner.st_remove_auto_successes(STAT_STRENGTH, "Potence")
+ owner.st_add_stat_mod(STAT_STRENGTH, level, "Potence")
+
if (iscarbon(owner))
for (var/obj/item/bodypart/limb in affected_bodyparts)
- limb.unarmed_damage_low -= 8 * level
- limb.unarmed_damage_high -= 8 * level
limb.unarmed_attack_sound = initial(limb.unarmed_attack_sound)
else if (isbasicmob(owner))
var/mob/living/basic/basic_owner = owner
-
- basic_owner.melee_damage_lower -= 8 * level
- basic_owner.melee_damage_upper -= 8 * level
basic_owner.attack_sound = initial(basic_owner.attack_sound)
LAZYCLEARLIST(affected_bodyparts)
@@ -55,23 +54,7 @@
qdel(tackler)
+// This is bad and bypasses it being a strength dice thing. Remove the second melee has any usage of strength for damage
/datum/status_effect/potence/proc/apply_melee_modifier(mob/source, mob/M, mob/user, list/modifiers, list/attack_modifiers)
SIGNAL_HANDLER
-
- attack_modifiers[FORCE_MULTIPLIER] += 0.4 * level
-
-// Status effect ranks
-/datum/status_effect/potence/one
- level = 1
-
-/datum/status_effect/potence/two
- level = 2
-
-/datum/status_effect/potence/three
- level = 3
-
-/datum/status_effect/potence/four
- level = 4
-
-/datum/status_effect/potence/five
- level = 5
+ MODIFY_ATTACK_FORCE_MULTIPLIER(attack_modifiers, 1 + (0.4 * level))
diff --git a/modular_darkpack/modules/powers/code/discipline/protean/beast_form.dm b/modular_darkpack/modules/powers/code/discipline/protean/beast_form.dm
index c691fce46dce..df92bd580470 100644
--- a/modular_darkpack/modules/powers/code/discipline/protean/beast_form.dm
+++ b/modular_darkpack/modules/powers/code/discipline/protean/beast_form.dm
@@ -55,7 +55,7 @@
icon_state = "gangrel_f"
icon_living = "gangrel_f"
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
- mob_size = MOB_SIZE_HUGE
+ mob_size = MOB_SIZE_LARGE
speed = -0.4
maxHealth = 275
health = 275
diff --git a/modular_darkpack/modules/powers/code/discipline/serpentis.dm b/modular_darkpack/modules/powers/code/discipline/serpentis.dm
index 8c5ddc6b9bd6..937a2e6e2ecf 100644
--- a/modular_darkpack/modules/powers/code/discipline/serpentis.dm
+++ b/modular_darkpack/modules/powers/code/discipline/serpentis.dm
@@ -28,9 +28,31 @@
violates_masquerade = TRUE
multi_activate = TRUE
- duration_length = 0.5 SECONDS
+ duration_length = 5 SECONDS
cooldown_length = 5 SECONDS
+/datum/discipline_power/serpentis/the_eyes_of_the_serpent/proc/immobilize_target(mob/living/target, duration = 5 SECONDS)
+ ADD_TRAIT(target, TRAIT_IMMOBILIZED, DISCIPLINE_TRAIT(type))
+ RegisterSignals(target, list(COMSIG_ATOM_ATTACKBY, COMSIG_MOB_ITEM_ATTACK, COMSIG_PROJECTILE_PREHIT), PROC_REF(on_target_attacked))
+ if(do_after(owner, duration, target))
+ release_target(target)
+ return TRUE
+ else
+ release_target(target)
+ return FALSE
+
+/datum/discipline_power/serpentis/the_eyes_of_the_serpent/proc/on_target_attacked(datum/source)
+ SIGNAL_HANDLER
+ var/mob/living/target = source
+ release_target(target)
+ to_chat(owner, span_warning("Your concentration is broken as [target] is attacked!"))
+ to_chat(target, span_warning("The mental hold on you breaks as you're attacked!"))
+
+/datum/discipline_power/serpentis/the_eyes_of_the_serpent/proc/release_target(mob/living/target)
+ UnregisterSignal(target, list(COMSIG_ATOM_ATTACKBY, COMSIG_MOB_ITEM_ATTACK, COMSIG_PROJECTILE_PREHIT))
+ to_chat(target, span_danger("You feel your concentration become your own once more, able to look away from the commanding gaze."))
+ REMOVE_TRAIT(target, TRAIT_IMMOBILIZED, DISCIPLINE_TRAIT(type))
+
/datum/discipline_power/serpentis/the_eyes_of_the_serpent/can_activate_untargeted(alert)
. = ..()
if (owner?.is_eyes_covered())
@@ -41,7 +63,6 @@
/datum/discipline_power/serpentis/the_eyes_of_the_serpent/activate(mob/living/target)
. = ..()
- target.Immobilize(2 SECONDS)
target.face_atom(owner)
target.visible_message(span_hypnophrase("[owner] hypnotizes [target] with [owner.p_their()] eyes!"), span_warning("[owner] hypnotizes you! Their words seem to become more convincing and hypnotic..."))
if(ishuman(target))
@@ -50,9 +71,11 @@
var/mutable_appearance/serpentis_overlay = mutable_appearance('modular_darkpack/modules/powers/icons/serpentis.dmi', "serpentis", -MUTATIONS_LAYER)
H.overlays_standing[MUTATIONS_LAYER] = serpentis_overlay
H.apply_overlay(MUTATIONS_LAYER)
+ immobilize_target(target)
/datum/discipline_power/serpentis/the_eyes_of_the_serpent/deactivate(mob/living/target)
. = ..()
+ release_target(target)
if (ishuman(target))
var/mob/living/carbon/human/human_target = target
human_target.remove_overlay(MUTATIONS_LAYER)
diff --git a/modular_darkpack/modules/powers/code/discipline/thaumaturgy/path_of_blood.dm b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/path_of_blood.dm
index 90c78bcc3fc7..57439072b188 100644
--- a/modular_darkpack/modules/powers/code/discipline/thaumaturgy/path_of_blood.dm
+++ b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/path_of_blood.dm
@@ -239,7 +239,7 @@
level = 4
- vitae_cost = 0 //Since 1 success should give one vitae, balancing.
+ vitae_cost = 1
effect_sound = 'sound/effects/magic/enter_blood.ogg'
range = 8 // Within 50 feet (15 meters).
check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_TORPORED | DISC_CHECK_SEE | DISC_CHECK_DIRECT_SEE // The subject must be visible to the thaumaturge
@@ -267,6 +267,8 @@
var/blood_gained = blood_taken * max(1, target.bloodquality-1)
owner.adjust_blood_pool(blood_gained)
else
+ if(!target.bloodpool || !target.blood_volume)
+ return
var/blood_coefficient = (5 / target.bloodpool)
// DARKPACK TODO - reimplement quirks -- potent blood
/*
@@ -277,6 +279,7 @@
target.blood_volume = max (0, (target.blood_volume - (blood_taken * (70*blood_coefficient))))
var/blood_gained = blood_taken * max(1, target.bloodquality - 1)
+ target.adjust_blood_pool(-blood_gained)
owner.adjust_blood_pool(blood_gained)
//------------------------------------------------------------------------------------------------
@@ -287,7 +290,7 @@
desc = "Boil your target's blood in their body, killing almost anyone."
level = 5
- range = 1 //The Kindred must touch the subject
+ range = 1
check_flags = DISC_CHECK_FREE_HAND | DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_TORPORED
target_type = TARGET_MOB | TARGET_SELF
aggravating = TRUE
diff --git a/modular_darkpack/modules/powers/code/discipline/thaumaturgy/paths/levinbolt.dm b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/paths/levinbolt.dm
index aef105534047..07ecc504117b 100644
--- a/modular_darkpack/modules/powers/code/discipline/thaumaturgy/paths/levinbolt.dm
+++ b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/paths/levinbolt.dm
@@ -106,8 +106,8 @@
var/obj/fusebox/fuse = target
// Break the fusebox
- fuse.damaged += 101
- fuse.check_damage(owner, TRUE)
+ fuse.take_damage(101)
+ fuse.power_off()
var/datum/effect_system/basic/spark_spread/spark_system = new(get_turf(target), 5, 1)
spark_system.start()
diff --git a/modular_darkpack/modules/powers/code/discipline/valeren.dm b/modular_darkpack/modules/powers/code/discipline/valeren.dm
index 16765801fbcf..239c3a7e2553 100644
--- a/modular_darkpack/modules/powers/code/discipline/valeren.dm
+++ b/modular_darkpack/modules/powers/code/discipline/valeren.dm
@@ -472,13 +472,9 @@
if (!istype(limb, /obj/item/bodypart/arm) && !istype(limb, /obj/item/bodypart/leg))
continue
LAZYADD(affected_bodyparts, limb)
- limb.unarmed_damage_low += 8 * bonus
- limb.unarmed_damage_high += 8 * bonus
limb.unarmed_attack_sound = pick(list('sound/items/weapons/cqchit2.ogg', 'sound/items/weapons/cqchit1.ogg')) // i know kung fu
else if (isbasicmob(owner))
var/mob/living/basic/basic_owner = owner
- basic_owner.melee_damage_lower += 8 * bonus
- basic_owner.melee_damage_upper += 8 * bonus
basic_owner.attack_sound = pick(list('sound/items/weapons/cqchit2.ogg', 'sound/items/weapons/cqchit1.ogg'))
RegisterSignal(owner, COMSIG_MOB_ITEM_ATTACK, PROC_REF(apply_melee_modifier))
tackler = owner.AddComponent(/datum/component/tackler, stamina_cost=0, base_knockdown = 1 SECONDS, range = 2 + bonus, speed = 1, skill_mod = 0, min_distance = 0)
@@ -490,13 +486,9 @@
owner.st_remove_stat_mod(STAT_BRAWL, bonus, "vengeance_of_samiel")
if (iscarbon(owner))
for (var/obj/item/bodypart/limb in affected_bodyparts)
- limb.unarmed_damage_low -= 8 * bonus
- limb.unarmed_damage_high -= 8 * bonus
limb.unarmed_attack_sound = initial(limb.unarmed_attack_sound)
else if (isbasicmob(owner))
var/mob/living/basic/basic_owner = owner
- basic_owner.melee_damage_lower -= 8 * bonus
- basic_owner.melee_damage_upper -= 8 * bonus
basic_owner.attack_sound = initial(basic_owner.attack_sound)
LAZYCLEARLIST(affected_bodyparts)
UnregisterSignal(owner, COMSIG_MOB_ITEM_ATTACK)
@@ -504,4 +496,4 @@
/datum/status_effect/vengeance_of_samiel/proc/apply_melee_modifier(mob/source, mob/M, mob/user, list/modifiers, list/attack_modifiers)
SIGNAL_HANDLER
- attack_modifiers[FORCE_MULTIPLIER] += 0.4 * bonus
+ MODIFY_ATTACK_FORCE_MULTIPLIER(attack_modifiers, 1 + (0.4 * bonus))
diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/blood_form.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/blood_form.dm
index 670e11686028..693816759640 100644
--- a/modular_darkpack/modules/powers/code/discipline/vicissitude/blood_form.dm
+++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/blood_form.dm
@@ -1,7 +1,7 @@
#define SPECIES_BLOODFORM "bloodform"
/datum/species/tzimisce_blood_form
- // Entirely alien beings that seem to be made entirely out of gel. They have three eyes and a skeleton visible within them.
+ // A living puddle of Vitae, immune to Bashing and Lethal damage.
name = "\improper Bloodform"
plural_form = "Bloodforms"
id = SPECIES_BLOODFORM
@@ -11,7 +11,18 @@
TRAIT_MUTE,
TRAIT_NO_EYE_CONTACT,
TRAIT_MUTANT_COLORS,
- )
+ TRAIT_NEVER_WOUNDED,
+ TRAIT_STAKE_IMMUNE,
+ TRAIT_PIERCEIMMUNE,
+ TRAIT_NOBREATH,
+ TRAIT_PACIFISM,
+ TRAIT_PUSHIMMUNE,
+ TRAIT_MARTIAL_ARTS_IMMUNE,
+ TRAIT_NO_SLIP_ALL,
+ TRAIT_PULL_BLOCKED,
+ TRAIT_MASQUERADE_VIOLATING_FACE,
+ TRAIT_NO_CUFF,
+ ) //Made of blood and can't be staked or wounded, but also has no actual ability to attack, per-se.
exotic_bloodtype = BLOOD_TYPE_KINDRED
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
bodypart_overrides = list(
@@ -37,11 +48,13 @@
regenerate_limbs = new
regenerate_limbs.Grant(new_jellyperson)
new_jellyperson.AddElement(/datum/element/soft_landing)
+ new_jellyperson.pass_flags = PASSTABLE | PASSMOB | PASSDOORS //A moving pool of blood, it can slip through and around most things.
/datum/species/tzimisce_blood_form/on_species_loss(mob/living/carbon/former_jellyperson, datum/species/new_species, pref_load)
if(regenerate_limbs)
regenerate_limbs.Remove(former_jellyperson)
former_jellyperson.RemoveElement(/datum/element/soft_landing)
+ former_jellyperson.pass_flags = NONE //Resets it to default for humans after loss.
return ..()
/datum/action/innate/regenerate_blood_limbs
@@ -95,6 +108,7 @@
head_flags = HEAD_EYECOLOR | HEAD_EYESPRITES | HEAD_HAIR | HEAD_FACIAL_HAIR
butcher_replacement = null
is_dimorphic = FALSE
+ brute_modifier = 0 //Immune to non-burning, magical, or blood drinking damage.
/obj/item/bodypart/chest/blood_form
biological_state = (BIO_INORGANIC)
@@ -102,6 +116,7 @@
dmg_overlay_type = null
butcher_replacement = null
is_dimorphic = TRUE
+ brute_modifier = 0 //Immune to non-burning, magical, or blood drinking damage.
/obj/item/bodypart/chest/blood_form/get_butt_sprite()
return icon('icons/mob/butts.dmi', BUTT_SPRITE_SLIME)
@@ -112,6 +127,7 @@
dmg_overlay_type = null
butcher_replacement = null
is_dimorphic = FALSE
+ brute_modifier = 0 //Immune to non-burning, magical, or blood drinking damage.
/obj/item/bodypart/arm/right/blood_form
biological_state = (BIO_INORGANIC)
@@ -119,6 +135,7 @@
dmg_overlay_type = null
butcher_replacement = null
is_dimorphic = FALSE
+ brute_modifier = 0 //Immune to non-burning, magical, or blood drinking damage.
/obj/item/bodypart/leg/left/blood_form
biological_state = (BIO_INORGANIC)
@@ -126,6 +143,7 @@
dmg_overlay_type = null
butcher_replacement = null
is_dimorphic = FALSE
+ brute_modifier = 0 //Immune to non-burning, magical, or blood drinking damage.
/obj/item/bodypart/leg/right/blood_form
biological_state = (BIO_INORGANIC)
@@ -133,6 +151,7 @@
dmg_overlay_type = null
butcher_replacement = null
is_dimorphic = FALSE
+ brute_modifier = 0 //Immune to non-burning, magical, or blood drinking damage.
/// Organs
/obj/item/organ/eyes/bloodform
@@ -142,15 +161,21 @@
iris_overlay = null
eye_color_left = "#990000a9"
eye_color_right = "#990000a9"
+ organ_flags = ORGAN_HIDDEN | ORGAN_UNREMOVABLE //Shouldn't come up, but just in case someone tries surgery on Bloodform for some reason.
+ maxHealth = INFINITY //Pseudo-organs, shouldn't technically be damageable.
/obj/item/organ/ears/bloodform
name = "bloody ears"
desc = "Development bug! Report this to github if you see this!"
zone = BODY_ZONE_CHEST
+ organ_flags = ORGAN_HIDDEN | ORGAN_UNREMOVABLE //Shouldn't come up, but just in case someone tries surgery on Bloodform for some reason.
+ maxHealth = INFINITY //Pseudo-organs, shouldn't technically be damageable.
/obj/item/organ/brain/bloodform
name = "bloody... brain?"
desc = "Development bug! Report this to github if you see this!"
zone = BODY_ZONE_CHEST
+ organ_flags = ORGAN_HIDDEN | ORGAN_UNREMOVABLE //Shouldn't come up, but just in case someone tries surgery on Bloodform for some reason.
+ maxHealth = INFINITY //Pseudo-organs, shouldn't technically be damageable.
#undef SPECIES_BLOODFORM
diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm
index dabc53419709..91a1725a9746 100644
--- a/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm
+++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm
@@ -8,6 +8,14 @@
clan_restricted = TRUE
power_type = /datum/discipline_power/vicissitude
+/datum/discipline/vicissitude/post_gain()
+ . = ..()
+ ADD_TRAIT(owner, TRAIT_SELF_SURGERY, /datum/discipline/vicissitude) //Allows people with Vicissitude to perform operations on themselves.
+
+/datum/discipline/vicissitude/post_loss()
+ . = ..()
+ REMOVE_TRAIT(owner, TRAIT_SELF_SURGERY, /datum/discipline/vicissitude) //Removes the trait if you lose Vicissitude.
+
/datum/discipline_power/vicissitude
name = "Vicissitude power name"
desc = "Vicissitude power description"
@@ -19,6 +27,7 @@
shapeshift_ability = new(owner)
shapeshift_ability.Grant(owner)
+
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/datum/discipline_power/vicissitude/malleable_visage
@@ -168,7 +177,7 @@
desc = "Liquify into a shifting mass of sentient Vitae."
level = 5
- check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_FREE_HAND
+ check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE
target_type = NONE
violates_masquerade = TRUE
cooldown_length = 1 TURNS
@@ -185,6 +194,7 @@
/datum/discipline_power/vicissitude/bloodform/activate()
. = ..()
owner.set_species(mrace = /datum/species/tzimisce_blood_form, icon_update = TRUE, pref_load = TRUE, replace_missing = FALSE)
+ owner.uncuff() //Avoids any issues with existing cuffs, and you can't handcuff a selectively solid pool of blood.
/datum/discipline_power/vicissitude/bloodform/deactivate()
. = ..()
diff --git a/modular_darkpack/modules/powers/code/discipline_actions.dm b/modular_darkpack/modules/powers/code/discipline_actions.dm
index bfa304a34d44..4e6d0af95f42 100644
--- a/modular_darkpack/modules/powers/code/discipline_actions.dm
+++ b/modular_darkpack/modules/powers/code/discipline_actions.dm
@@ -26,6 +26,10 @@
register_to_availability_signals()
+/datum/action/discipline/Destroy()
+ QDEL_NULL(discipline)
+ return ..()
+
/datum/action/discipline/Remove(mob/owner)
if(discipline)
discipline.post_loss()
@@ -49,7 +53,6 @@
SIGNAL_ADDTRAIT(TRAIT_PACIFISM),
SIGNAL_REMOVETRAIT(TRAIT_PACIFISM),
))
- QDEL_NULL(discipline)
return ..()
/datum/action/discipline/proc/register_to_availability_signals()
diff --git a/modular_darkpack/modules/powers/code/discipline_pref_middleware.dm b/modular_darkpack/modules/powers/code/discipline_pref_middleware.dm
index c883d7aff07e..c6359f727e9e 100644
--- a/modular_darkpack/modules/powers/code/discipline_pref_middleware.dm
+++ b/modular_darkpack/modules/powers/code/discipline_pref_middleware.dm
@@ -299,7 +299,7 @@ var/global/list/RARE_DISCIPLINE_TYPES = list(
var/discipline = text2path(disc_path)
if(!discipline)
continue
- var/level = discipline_levels[disc_path]
+ var/level = character.get_splat(/datum/splat/vampire/ghoul) ? 1 : discipline_levels[disc_path]
if(!level)
continue // prevent removing the disc by stopping here if they put 0 in it
var/result = character.change_st_power_level(discipline, level)
diff --git a/modular_darkpack/modules/powers/icons/auras.dmi b/modular_darkpack/modules/powers/icons/auras.dmi
index 5959c225952a..039ee135a6df 100644
Binary files a/modular_darkpack/modules/powers/icons/auras.dmi and b/modular_darkpack/modules/powers/icons/auras.dmi differ
diff --git a/modular_darkpack/modules/radios/code/transceiver.dm b/modular_darkpack/modules/radios/code/transceiver.dm
index 14d836426413..f07221c7bd74 100644
--- a/modular_darkpack/modules/radios/code/transceiver.dm
+++ b/modular_darkpack/modules/radios/code/transceiver.dm
@@ -107,6 +107,9 @@
if(!COOLDOWN_FINISHED(src, crime_reporting_cooldown))
return
+ var/area/vtm/crime_area = astype(get_area(location))
+ if(!crime_area || crime_area.zone_type != ZONE_MASQUERADE) // prevents sewer rats from reporting crime
+ return
COOLDOWN_START(src, crime_reporting_cooldown, 10 SECONDS)
switch(crime)
if(CRIME_GUNSHOTS)
diff --git a/modular_darkpack/modules/retail/code/_retail.dm b/modular_darkpack/modules/retail/code/_retail.dm
index 5572e7788357..d5fc1c016cba 100644
--- a/modular_darkpack/modules/retail/code/_retail.dm
+++ b/modular_darkpack/modules/retail/code/_retail.dm
@@ -12,7 +12,6 @@
anchored_tabletop_offset = 6
var/owner_needed = TRUE //Does an npc need to be here for this
var/mob/living/carbon/human/npc/my_owner //tracks existence of owner
- var/is_gun_store = FALSE
var/payment_department = ACCOUNT_SRV
var/list/datum/data/vending_product/products_list = list()
@@ -45,6 +44,8 @@
if(owner_needed == TRUE && (!my_owner || (get_dist(src, my_owner) > 4) || (my_owner.stat >= HARD_CRIT)))
to_chat(user, span_alert("There's no teller here to sell you things..."))
return
+ else if(owner_needed == TRUE && my_owner && get_dist(src, my_owner) <= 4)
+ my_owner.say(pick(my_owner.socialrole.random_phrases))
ui_interact(user)
/obj/structure/retail/proc/build_inventory()
@@ -70,6 +71,9 @@
return
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
+ if(owner_needed && my_owner)
+ my_owner.face_atom(user)
+ my_owner.realistic_say(pick(my_owner.socialrole.random_phrases))
ui = new(user, src, "RetailVendor", name)
ui.open()
diff --git a/modular_darkpack/modules/retail/code/stores/hardware_store.dm b/modular_darkpack/modules/retail/code/stores/hardware_store.dm
index 641e8a7bca33..377f29af4f2a 100644
--- a/modular_darkpack/modules/retail/code/stores/hardware_store.dm
+++ b/modular_darkpack/modules/retail/code/stores/hardware_store.dm
@@ -8,6 +8,7 @@
new /datum/data/vending_product("knife", /obj/item/knife/vamp, 100),
new /datum/data/vending_product("stake", /obj/item/vampire_stake, 100),
new /datum/data/vending_product("box of light bulbs", /obj/item/storage/box/lights/mixed, 80),
+ new /datum/data/vending_product("construction vest", /obj/item/clothing/suit/hazardvest, 80)
)
product_types = list(
/obj/item/fishing_rod,
diff --git a/modular_darkpack/modules/retail/code/stores/pharmacy.dm b/modular_darkpack/modules/retail/code/stores/pharmacy.dm
index 4703fc297a74..203746976b9b 100644
--- a/modular_darkpack/modules/retail/code/stores/pharmacy.dm
+++ b/modular_darkpack/modules/retail/code/stores/pharmacy.dm
@@ -13,5 +13,10 @@
new /datum/data/vending_product("inhaler canister", /obj/item/reagent_containers/inhaler_canister/albuterol/asthma, 150),
new /datum/data/vending_product("ephedrine pill bottle", /obj/item/storage/pill_bottle/ephedrine),
new /datum/data/vending_product("box of syringes", /obj/item/storage/box/syringes, 300),
- new /datum/data/vending_product("inhaler", /obj/item/inhaler/albuterol/asthma, 400)
+ new /datum/data/vending_product("inhaler", /obj/item/inhaler/albuterol/asthma, 400),
+ new /datum/data/vending_product("cane", /obj/item/cane),
+ new /datum/data/vending_product("white cane", /obj/item/cane/white),
+ new /datum/data/vending_product("crutch", /obj/item/cane/crutch),
+ new /datum/data/vending_product("wooden crutch", /obj/item/cane/crutch/wood),
+ new /datum/data/vending_product("empty blood bag", /obj/item/reagent_containers/blood/empty)
)
diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/__abyssrune.dm b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/__abyssrune.dm
index 5094c7f5e5ed..c6e3d0abe4d9 100644
--- a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/__abyssrune.dm
+++ b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/__abyssrune.dm
@@ -5,3 +5,15 @@
word = "IDI NAH"
required_discipline = /datum/discipline/obtenebration
activation_color = rgb(50, 50, 50)
+
+/obj/ritual_rune/abyss/complete()
+ . = ..()
+ playsound(loc, 'sound/effects/magic/voidblink.ogg', 50, FALSE)
+
+/obj/ritual_rune/abyss/ritual_failure()
+ . = ..()
+ playsound(loc, 'sound/effects/magic/voidblink.ogg', 50, FALSE)
+
+/obj/ritual_rune/abyss/ritual_botch()
+ . = ..()
+ playsound(loc, 'sound/effects/magic/voidblink.ogg', 50, FALSE)
diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/artifact_identification.dm b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/artifact_identification.dm
index abf83ef17c4e..5b49f112cc7b 100644
--- a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/artifact_identification.dm
+++ b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/artifact_identification.dm
@@ -6,8 +6,12 @@
cost = 1
/obj/ritual_rune/abyss/identification/complete()
- for(var/obj/item/vtm_artifact/VA in loc)
+ . = ..()
+ for(var/obj/item/occult_artifact/VA in loc)
+ var/mob/living/carbon/human/identifier = usr
+ if(VA.identified)
+ to_chat(identifier, span_warning("You have already identified this artifact."))
+ return
VA.identify()
- playsound(loc, 'sound/effects/magic/voidblink.ogg', 50, FALSE)
qdel(src)
return
diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/blackout.dm b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/blackout.dm
index 85a16f6b737e..2f6b2cb43c93 100644
--- a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/blackout.dm
+++ b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/blackout.dm
@@ -8,8 +8,8 @@
//actual function of the rune
/obj/ritual_rune/abyss/blackout/complete()
+ . = ..()
for(var/obj/machinery/light/light_to_kill in range(7, src)) //for every light in a range of 7 (called i)
if(light_to_kill != LIGHT_BROKEN) //if it aint broke
light_to_kill.break_light_tube(0) //break it
- playsound(get_turf(src), 'sound/effects/magic/voidblink.ogg', 50, FALSE) //make the funny void sound
qdel(src) //delete the rune
diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/calling_the_hungry_shade.dm b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/calling_the_hungry_shade.dm
new file mode 100644
index 000000000000..207c5311bd66
--- /dev/null
+++ b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/calling_the_hungry_shade.dm
@@ -0,0 +1,37 @@
+/obj/ritual_rune/abyss/calling_the_hungry_shade
+ name = "calling the hungry shade"
+ desc = "call forth a hungry, and furious, shade of the Abyss, and seek to tame it. Beware if you fail - it will attack you instead!"
+ icon_state = "rune8"
+ word = "Spirit of Hunger."
+ level = 3
+ cost = 1
+ difficulty = 9
+
+/obj/ritual_rune/abyss/calling_the_hungry_shade/complete()
+ . = ..()
+ if(ishuman(last_activator))
+ var/mob/living/carbon/human/human_activator = last_activator
+ human_activator.add_beastmaster_minion(/mob/living/basic/shadow_guard/hungry_shade)
+ if(length(human_activator.beastmaster_minions) > human_activator.st_get_stat(STAT_OCCULT))
+ var/mob/living/beastmaster_minion = pick(human_activator.beastmaster_minions)
+ beastmaster_minion.death()
+ qdel(src)
+
+/obj/ritual_rune/abyss/calling_the_hungry_shade/ritual_failure()
+ . = ..()
+ var/mob/living/basic/shadow_guard/hungry_shade/shade = new(get_turf(src))
+ shade.ai_controller = new /datum/ai_controller/basic_controller/simple/simple_hostile(shade)
+ shade.ai_controller.set_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET, last_activator)
+ shade.remove_faction(VAMPIRE_CLAN_LASOMBRA)
+ to_chat(last_activator, span_warning("The ritual slips from your grasp - something answers the call regardless!"))
+ qdel(src)
+
+/obj/ritual_rune/abyss/calling_the_hungry_shade/ritual_botch()
+ . = ..()
+ var/mob/living/basic/shadow_guard/hungry_shade/shade = new(get_turf(src))
+ shade.ai_controller = new /datum/ai_controller/basic_controller/simple/simple_hostile(shade)
+ shade.ai_controller.set_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET, last_activator)
+ shade.remove_faction(VAMPIRE_CLAN_LASOMBRA)
+ to_chat(last_activator, span_warning("You lose control over the ritual!"))
+ last_activator.apply_damage(30, AGGRAVATED)
+ qdel(src)
diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/comforting_darkness.dm b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/comforting_darkness.dm
index 9328d2ef108b..416ca937b1be 100644
--- a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/comforting_darkness.dm
+++ b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/comforting_darkness.dm
@@ -8,6 +8,7 @@
var/static/list/roll_cache = list()
/obj/ritual_rune/abyss/comforting_darkness/complete()
+ . = ..()
var/list/heal_targets = list()
var/turf/rune_location = get_turf(src)
var/mob/living/carbon/human/invoker = last_activator
diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/pierce_the_veil.dm b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/pierce_the_veil.dm
new file mode 100644
index 000000000000..35be72cadeae
--- /dev/null
+++ b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/pierce_the_veil.dm
@@ -0,0 +1,35 @@
+/obj/ritual_rune/abyss/pierce_the_veil
+ name = "pierce the veil"
+ desc = "Through the use of this ritual and by creating orbs of shadow in your hand and staring into them, your eyes turn a deep, abyssal black, giving you Darksight."
+ icon_state = "rune9"
+ word = "Shadow encase my sight."
+ cost = 1
+ level = 1
+
+/obj/ritual_rune/abyss/pierce_the_veil/complete()
+ . = ..()
+ var/mob/living/carbon/human/H = last_activator
+ ADD_TRAIT(H, TRAIT_TRUE_NIGHT_VISION, "pierce_the_veil")
+ ADD_TRAIT(H, TRAIT_MASQUERADE_VIOLATING_EYES, "pierce_the_veil")
+ to_chat(H, span_notice("Darkness floods your vision, then recedes - you can see clearly through the shadows now."))
+ H.update_sight()
+ qdel(src)
+
+/obj/ritual_rune/abyss/pierce_the_veil/ritual_failure()
+ . = ..()
+ to_chat(last_activator, span_warning("The shadows slip through your fingers..."))
+ qdel(src)
+
+/obj/ritual_rune/abyss/pierce_the_veil/ritual_botch()
+ . = ..()
+ var/mob/living/carbon/human/H = last_activator
+ H.become_blind("pierce_the_veil_botch")
+ to_chat(H, span_userdanger("Darkness overwhelmes your vision as you mess up the ritual, causing temporary blindness!"))
+ addtimer(CALLBACK(src, PROC_REF(cure_botch), H), 2 MINUTES)
+ qdel(src)
+
+/obj/ritual_rune/abyss/pierce_the_veil/proc/cure_botch(mob/living/carbon/human/H)
+ if(QDELETED(H))
+ return
+ H.cure_blind("pierce_the_veil_botch")
+ to_chat(H, span_notice("Your vision slowly returns."))
diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/reflections_of_hollow_revelation.dm b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/reflections_of_hollow_revelation.dm
index 70d8f31e8a20..bad64445fa68 100644
--- a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/reflections_of_hollow_revelation.dm
+++ b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/reflections_of_hollow_revelation.dm
@@ -12,6 +12,7 @@
var/isactive = FALSE
/obj/ritual_rune/abyss/reflections_of_hollow_revelation/complete()
+ . = ..()
var/mob/living/user = usr
if(!user)
return
diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/self_destruction.dm b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/self_destruction.dm
index 81e723b88e96..dad7d4db8648 100644
--- a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/self_destruction.dm
+++ b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/self_destruction.dm
@@ -6,4 +6,5 @@
cost = 1
/obj/ritual_rune/abyss/selfgib/complete()
+ . = ..()
last_activator.death()
diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/shadow_guardian.dm b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/shadow_guardian.dm
index c4d10c611a62..099d588a7bc9 100644
--- a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/shadow_guardian.dm
+++ b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/shadow_guardian.dm
@@ -7,25 +7,24 @@
cost = 1
/obj/ritual_rune/abyss/heart_that_beats_in_silence/complete()
+ . = ..()
var/mob/living/carbon/human/H = last_activator
-
- var/roll = SSroll.storyteller_roll(last_activator.st_get_stat(STAT_INTELLIGENCE) + last_activator.st_get_stat(STAT_OCCULT), 6, last_activator)
last_activator.apply_damage(30, AGGRAVATED)
+ H.add_beastmaster_minion(/mob/living/basic/shadow_guard)
+ //BG.melee_damage_lower = BG.melee_damage_lower+activator_bonus
+ //BG.melee_damage_upper = BG.melee_damage_upper+activator_bonus
+ if(length(H.beastmaster_minions) > H.st_get_stat(STAT_OCCULT))
+ var/mob/living/beastmaster_minion = pick(H.beastmaster_minions)
+ beastmaster_minion.death()
+ qdel(src)
+
+/obj/ritual_rune/abyss/heart_that_beats_in_silence/ritual_failure()
+ . = ..()
+ qdel(src)
- switch(roll)
- if(ROLL_SUCCESS)
- H.add_beastmaster_minion(/mob/living/basic/shadow_guard)
- //BG.melee_damage_lower = BG.melee_damage_lower+activator_bonus
- //BG.melee_damage_upper = BG.melee_damage_upper+activator_bonus
- playsound(loc, 'sound/effects/magic/voidblink.ogg', 50, FALSE)
- //if(length(H.beastmaster) > H.st_get_stat(STAT_OCCULT))
- //var/mob/living/simple_animal/hostile/beastmaster/B = pick(H.beastmaster)
- //B.death()
- qdel(src)
- if(ROLL_FAILURE)
- qdel(src)
- if(ROLL_BOTCH)
- to_chat(last_activator, span_warning("You lose control over the ritual!"))
- last_activator.apply_damage(30, AGGRAVATED)
- qdel(src)
+/obj/ritual_rune/abyss/heart_that_beats_in_silence/ritual_botch()
+ . = ..()
+ to_chat(last_activator, span_warning("You lose control over the ritual!"))
+ last_activator.apply_damage(30, AGGRAVATED)
+ qdel(src)
diff --git a/modular_darkpack/modules/ritual_thaumaturgy/arcane_tome.dm b/modular_darkpack/modules/ritual_thaumaturgy/arcane_tome.dm
index 12d44edce637..a15e5c6adea9 100644
--- a/modular_darkpack/modules/ritual_thaumaturgy/arcane_tome.dm
+++ b/modular_darkpack/modules/ritual_thaumaturgy/arcane_tome.dm
@@ -11,7 +11,7 @@
if(!living_user || !living_user.get_discipline(/datum/discipline/thaumaturgy))
to_chat(user, span_cult("A book whose title is inscribed in latin and coated with various sigils and shapes. You'll need a teacher if you want to learn more. For some reason it wont open."))
return
- .=..()
+ . = ..()
/datum/crafting_recipe/arctome
name = "Arcane Tome"
diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/__thaumaturgyrune.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/__thaumaturgyrune.dm
index bd2e5d88e13e..f4bfdfbb5f0c 100644
--- a/modular_darkpack/modules/ritual_thaumaturgy/rituals/__thaumaturgyrune.dm
+++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/__thaumaturgyrune.dm
@@ -5,3 +5,20 @@
word = "IDI NAH"
required_discipline = /datum/discipline/thaumaturgy
activation_color = rgb(255, 64, 64)
+
+/obj/ritual_rune/thaumaturgy/Initialize(mapload)
+ . = ..()
+ difficulty = level + 3
+
+/obj/ritual_rune/thaumaturgy/complete()
+ . = ..()
+ playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE)
+
+/obj/ritual_rune/thaumaturgy/ritual_failure()
+ . = ..()
+ playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE)
+
+/obj/ritual_rune/thaumaturgy/ritual_botch()
+ . = ..()
+ playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE)
+
diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/artifact_identification.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/artifact_identification.dm
index 27f50e9a29a8..6bb2a7190a5c 100644
--- a/modular_darkpack/modules/ritual_thaumaturgy/rituals/artifact_identification.dm
+++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/artifact_identification.dm
@@ -5,14 +5,14 @@
word = "IN'DAR"
/obj/ritual_rune/thaumaturgy/identification/complete()
- for(var/obj/item/vtm_artifact/VA in loc)
+ . = ..()
+ for(var/obj/item/occult_artifact/VA in loc)
var/mob/living/carbon/human/identifier = usr
if(VA.identified)
to_chat(identifier, span_warning("You have already identified this artifact."))
return
VA.identify()
identifier.research_points += VA.research_value
- playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE)
qdel(src)
return
diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_curse_rune.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_curse_rune.dm
index 1671c0a58b0a..f79ce2478dfa 100644
--- a/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_curse_rune.dm
+++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_curse_rune.dm
@@ -10,8 +10,8 @@
var/curse_target = null
/obj/ritual_rune/thaumaturgy/curse/complete()
+ . = ..()
if(!activated)
- playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE)
color = rgb(255,0,0)
activated = TRUE
diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_guardian_ritual.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_guardian_ritual.dm
index 966250f6791c..fbd6c8eaa381 100644
--- a/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_guardian_ritual.dm
+++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_guardian_ritual.dm
@@ -7,9 +7,9 @@
cost = 5
/obj/ritual_rune/thaumaturgy/blood_guardian/complete()
+ . = ..()
var/mob/living/carbon/human/H = last_activator
H.add_beastmaster_minion(/mob/living/basic/blood_guard)
- playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE)
if(length(H.beastmaster_minions) > 3+H.st_get_stat(STAT_LEADERSHIP))
var/mob/living/basic/blood_guard/B = pick(H.beastmaster_minions)
B.death()
diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_to_water.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_to_water.dm
index 81b9ab0746fd..d9657ca4f3d1 100644
--- a/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_to_water.dm
+++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_to_water.dm
@@ -5,6 +5,7 @@
word = "CL-ENE"
/obj/ritual_rune/thaumaturgy/blood_to_water/complete()
+ . = ..()
for(var/atom/A in range(7, src))
A.wash(CLEAN_WASH)
qdel(src)
diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_trap.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_trap.dm
index c00140fe912b..1f191bf5cfe2 100644
--- a/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_trap.dm
+++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_trap.dm
@@ -5,8 +5,8 @@
word = "DUH'K-A'U"
/obj/ritual_rune/thaumaturgy/blood_trap/complete()
+ . = ..()
if(!activated)
- playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE)
activated = TRUE
alpha = 28
AddElement(/datum/element/connect_loc, list(COMSIG_ATOM_ENTERED = PROC_REF(on_crossed)))
diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_wall.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_wall.dm
index f994c00773b2..f00c759d6d62 100644
--- a/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_wall.dm
+++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_wall.dm
@@ -6,8 +6,8 @@
level = 2
/obj/ritual_rune/thaumaturgy/blood_wall/complete()
+ . = ..()
new /obj/structure/bloodwall(loc)
- playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE)
qdel(src)
/obj/structure/bloodwall
diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/bloodwalk.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/bloodwalk.dm
index c879f943b097..efdb33afc94c 100644
--- a/modular_darkpack/modules/ritual_thaumaturgy/rituals/bloodwalk.dm
+++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/bloodwalk.dm
@@ -5,7 +5,8 @@
word = "Reveal thy bloodline for mine eyes."
level = 2
-/obj/ritual_rune/thaumaturgy/bloodwalk/attack_hand(mob/living/user)
+/obj/ritual_rune/thaumaturgy/bloodwalk/complete()
+ . = ..()
for(var/obj/item/reagent_containers/syringe/S in loc)
for(var/datum/reagent/blood/B in S.reagents.reagent_list)
var/blood_data = B.data
@@ -14,14 +15,12 @@
var/clan = blood_data["clan"]
var/real_name = blood_data["real_name"]
var/message = generate_message(generation, clan, real_name)
- to_chat(user, "[message]")
+ to_chat(last_activator, "[message]")
// Process blood collection for research points
- if(ishuman(user))
- SSoccult_research.process_blood_collection(user, B)
-
+ if(ishuman(last_activator))
+ SSoccult_research.process_blood_collection(last_activator, B)
else
- to_chat(user, "The blood speaks not; it is empty of power!")
- playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE)
+ to_chat(last_activator, "The blood speaks not; it is empty of power!")
color = rgb(255,0,0)
activated = TRUE
qdel(src)
diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/chime_of_the_unseen_spirits.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/chime_of_the_unseen_spirits.dm
index 52b81019740e..121128d171d5 100644
--- a/modular_darkpack/modules/ritual_thaumaturgy/rituals/chime_of_the_unseen_spirits.dm
+++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/chime_of_the_unseen_spirits.dm
@@ -7,8 +7,8 @@
level = 1
/obj/ritual_rune/thaumaturgy/chime_of_unseen_spirits/complete()
+ . = ..()
new /obj/item/spirit_chime(loc)
- playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE)
qdel(src)
// The spirit chime item itself
@@ -89,7 +89,7 @@
STOP_PROCESSING(SSprocessing, src)
return ..()
-/obj/item/spirit_chime/process(delta_time)
+/obj/item/spirit_chime/process(seconds_per_tick)
var/valid_targets = FALSE
if(!ringing || !anchored || !chime_field)
ringing = FALSE
diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/deflection_wooden_doom.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/deflection_wooden_doom.dm
index dff9cc439b6c..a96c0fa4b445 100644
--- a/modular_darkpack/modules/ritual_thaumaturgy/rituals/deflection_wooden_doom.dm
+++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/deflection_wooden_doom.dm
@@ -11,10 +11,10 @@
sacrifices = list(/obj/item/vampire_stake)
/obj/ritual_rune/thaumaturgy/deflection_stake/complete()
+ . = ..()
for(var/mob/living/carbon/human/H in loc)
if(!HAS_TRAIT(H, TRAIT_STAKE_RESISTANT))
ADD_TRAIT(H, TRAIT_STAKE_RESISTANT, MAGIC_TRAIT)
qdel(src)
- playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE)
color = rgb(255,0,0)
activated = TRUE
diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/gargoyle_transformation.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/gargoyle_transformation.dm
index 73563a0d39c1..74033389dbd2 100644
--- a/modular_darkpack/modules/ritual_thaumaturgy/rituals/gargoyle_transformation.dm
+++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/gargoyle_transformation.dm
@@ -22,7 +22,6 @@
valid_bodies += H
else
H.adjust_agg_loss(50)
- playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 10, FALSE)
to_chat(usr, "Your specimen must be incapacitated! The ritual has merely hurt them!")
return
@@ -36,7 +35,6 @@
to_chat(usr, span_notice("You begin invoking the ritual of Gargoyle Creation with [body_count] vampire bod[body_count == 1 ? "y" : "ies"]..."))
usr.visible_message(span_notice("[usr] begins invoking a ritual with [body_count] vampire bod[body_count == 1 ? "y" : "ies"]..."))
- playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE)
playsound(loc, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, FALSE)
// Apply stun so that they cant just crawl away in crit - caster must also stay still
diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/question_to_the_ancestors.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/question_to_the_ancestors.dm
index d51f253c754c..4e8b688aeb7e 100644
--- a/modular_darkpack/modules/ritual_thaumaturgy/rituals/question_to_the_ancestors.dm
+++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/question_to_the_ancestors.dm
@@ -17,6 +17,7 @@
icon_living = "ghost_animated"
/obj/ritual_rune/thaumaturgy/question/complete()
+ . = ..()
var/text_question = tgui_input_text(usr, "Enter your question to the Ancestors:", "Question to Ancestors")
if(!text_question)
return
@@ -35,7 +36,6 @@
after_assumed_control = CALLBACK(src, PROC_REF(ghost_name_prompt), TR)\
)
- playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE)
qdel(src)
/obj/ritual_rune/thaumaturgy/question/proc/ghost_name_prompt(mob/living/basic/ghost/tremere/ghost_mob)
diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/self_gib.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/self_gib.dm
index 7ae180644481..d1a0c082e978 100644
--- a/modular_darkpack/modules/ritual_thaumaturgy/rituals/self_gib.dm
+++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/self_gib.dm
@@ -5,5 +5,6 @@
word = "CHNGE DA'WORD, GDBE"
/obj/ritual_rune/thaumaturgy/selfgib/complete()
+ . = ..()
last_activator.death()
diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/teleport.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/teleport.dm
index a46e499ae86c..21d2a3c37f5d 100644
--- a/modular_darkpack/modules/ritual_thaumaturgy/rituals/teleport.dm
+++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/teleport.dm
@@ -7,13 +7,14 @@
sacrifices = list(/obj/item/reagent_containers/blood)
/obj/ritual_rune/thaumaturgy/teleport/complete()
+ . = ..()
if(!activated)
activated = TRUE
color = rgb(255,255,255)
icon_state = "teleport"
/obj/ritual_rune/thaumaturgy/teleport/attack_hand(mob/user)
- ..()
+ . = ..()
if(activated)
if(last_activator != user)
to_chat(user, span_warning("You are not the one who activated this rune!"))
diff --git a/modular_darkpack/modules/splats/code/gaining_splats.dm b/modular_darkpack/modules/splats/code/gaining_splats.dm
index ef1318f31f2c..78b932c6b86c 100644
--- a/modular_darkpack/modules/splats/code/gaining_splats.dm
+++ b/modular_darkpack/modules/splats/code/gaining_splats.dm
@@ -29,7 +29,6 @@
var/signal_return = SEND_SIGNAL(owner, COMSIG_LIVING_GAINING_SPLAT, src)
if (signal_return & SPLAT_PREVENT_GAIN)
return
- SEND_SIGNAL(owner, COMSIG_LIVING_GAINED_SPLAT, src)
src.owner = owner
LAZYADD(owner.splats, src)
@@ -43,6 +42,7 @@
if(owner.hud_used)
add_relevent_huds(owner.hud_used)
+ SEND_SIGNAL(owner, COMSIG_LIVING_GAINED_SPLAT, src)
return src
/**
diff --git a/modular_darkpack/modules/splats/code/losing_splats.dm b/modular_darkpack/modules/splats/code/losing_splats.dm
index 356105d72b10..602518303668 100644
--- a/modular_darkpack/modules/splats/code/losing_splats.dm
+++ b/modular_darkpack/modules/splats/code/losing_splats.dm
@@ -38,7 +38,6 @@
clear_powers()
return
- SEND_SIGNAL(owner, COMSIG_LIVING_LOSE_SPLAT, src)
on_lose()
@@ -49,6 +48,7 @@
remove_biotypes()
LAZYREMOVE(owner.splats, src)
+ SEND_SIGNAL(owner, COMSIG_LIVING_LOSE_SPLAT, src)
owner = null
/datum/splat/Destroy()
diff --git a/modular_darkpack/modules/stock_market/code/stockexchange.dm b/modular_darkpack/modules/stock_market/code/stockexchange.dm
index 7caee042f5b8..defbe463af44 100644
--- a/modular_darkpack/modules/stock_market/code/stockexchange.dm
+++ b/modular_darkpack/modules/stock_market/code/stockexchange.dm
@@ -12,4 +12,4 @@
light_color = LIGHT_COLOR_GREEN
//i just removed all the stupid flavcode shit that was here. it was not worth looking at.
-//DARKPACK TODO - Stock market rework
+// DARKPACK TODO - Stock market rework
diff --git a/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm b/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm
index 861bec77bfd9..0fabf7e4701e 100644
--- a/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm
+++ b/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm
@@ -48,15 +48,20 @@
return ROLL_FAILURE
var/dice_amount = calculate_used_dice(roller, bonus)
+ var/auto_success_amount = calculate_auto_successes(roller)
+ var/used_difficulty = calculate_used_difficulty(roller)
- var/list/rolled_dice = roll_dice(dice_amount)
+ var/list/rolled_dice = roll_dice(dice_amount, auto_success_amount)
- var/first_line = "[span_tooltip(show_rolling_with(roller, bonus), "[dice_amount] dice")] vs. difficulty [difficulty]."
+ var/dice_used_text = "[dice_amount] dice"
+ if(auto_success_amount)
+ dice_used_text += " + [auto_success_amount] auto successes"
+ var/first_line = "[span_tooltip(show_rolling_with(roller, bonus), dice_used_text)] vs. difficulty [used_difficulty]."
if(successes_needed > 1)
first_line += " [successes_needed] successes needed."
last_output_text += span_notice(first_line)
- last_sucess_amount = count_success(rolled_dice, difficulty, last_output_text)
+ last_sucess_amount = count_success(rolled_dice, used_difficulty, last_output_text)
var/output = roll_result(last_sucess_amount)
var/title
@@ -72,12 +77,10 @@
if(!spammy_roll && (player_mob == roller || target))
roll_important_to_me = TRUE
- var/output_pref = player_mob.client?.prefs.read_preference(/datum/preference/choiced/dice_output)
-
- if(!spammy_roll && output_pref == DICE_OUTPUT_CHAT)
+ if(!spammy_roll)
to_chat(player_mob, output_combined, MESSAGE_TYPE_INFO, trailing_newline = FALSE)
SEND_SOUND(player_mob, sound('sound/items/dice_roll.ogg', volume = roll_important_to_me ? 5 : 20))
- else if(spammy_roll || (output_pref == DICE_OUTPUT_BALLOON))
+ else
if(last_sucess_amount > 0)
roller.balloon_alert(player_mob, "[last_sucess_amount]", TRUE)
else
@@ -92,7 +95,7 @@
/datum/storyteller_roll/proc/get_mobs_to_show(mob/living/roller, atom/target)
switch(roll_output_type)
if(ROLL_PUBLIC)
- return viewers(DEFAULT_MESSAGE_RANGE, roller)
+ return viewers(DEFAULT_SIGHT_DISTANCE, roller)
if(ROLL_PRIVATE)
return list(roller)
if(ROLL_PRIVATE_AND_TARGET)
@@ -110,9 +113,16 @@
/datum/storyteller_roll/proc/calculate_used_dice(mob/living/roller, bonus = 0)
var/dice_amount = 0
for(var/stat_type in using_stats(roller))
- dice_amount += roller.st_get_stat(stat_type)
+ dice_amount += roller.st_get_stat(stat_type, include_auto_successes = FALSE)
return dice_amount + bonus
+/datum/storyteller_roll/proc/calculate_auto_successes(mob/living/roller)
+ var/dice_amount = 0
+ for(var/stat_type in using_stats(roller))
+ var/datum/st_stat/given_stat = roller?.storyteller_stats[stat_type]
+ dice_amount += given_stat?.get_auto_success_score()
+ return dice_amount
+
// Unused rn but can be used for overides of `using_stats()`
/datum/storyteller_roll/proc/return_higher_stat(mob/living/roller, list/stats)
var/stat_to_use
@@ -127,6 +137,9 @@
/datum/storyteller_roll/proc/using_stats(mob/living/roller)
return applicable_stats
+/datum/storyteller_roll/proc/calculate_used_difficulty(mob/living/roller)
+ return difficulty
+
/datum/storyteller_roll/proc/show_rolling_with(mob/living/roller, bonus = 0)
var/output = ""
var/stuff = list()
@@ -137,7 +150,7 @@
output += "+[bonus]"
return "Rolling [output]"
-/datum/storyteller_roll/proc/roll_dice(dice, sides = 10)
+/datum/storyteller_roll/proc/roll_dice(dice, auto_successes, sides = 10)
dice = max(dice, 1)
var/list/rolled_dice = list()
for(var/i in 1 to dice)
@@ -149,6 +162,8 @@
extra_dice++
for(var/i in 1 to extra_dice)
rolled_dice += rand(1, sides)
+ for(var/i in 1 to auto_successes)
+ rolled_dice += 11
return rolled_dice
//Count the number of successes.
@@ -166,7 +181,7 @@
sucess_amount--
else
dice_text += span_danger("[get_dice_char(roll)]")
- last_output_text += "[roll_result_text(roll_result(sucess_amount))] [dice_text]"
+ last_output_text += "[roll_result_text(roll_result(sucess_amount))] [span_slightly_larger(dice_text)]"
return sucess_amount
/datum/storyteller_roll/proc/roll_result(sucess_amount)
@@ -193,7 +208,8 @@
return span_bold(span_danger(("Botch -")))
/datum/storyteller_roll/proc/get_dice_char(input)
- var/static/list/dice_output = list("❶", "❷", "❸", "❹", "❺", "❻", "❼", "❽", "❾", "❿")
+ // "11" represents automatic successes
+ var/static/list/dice_output = list("❶", "❷", "❸", "❹", "❺", "❻", "❼", "❽", "❾", "❿", "☥")
return dice_output[input]
/* // This would require making it an assoc list and we dont every expect outside our given range.
// So if someone faces a runtime because of this just make it an actual assoc and deal with the micro preformace hit
diff --git a/modular_darkpack/modules/storyteller_dice/code/roll_subtypes.dm b/modular_darkpack/modules/storyteller_dice/code/roll_subtypes.dm
index 1f0119040caf..1f94e682f3f5 100644
--- a/modular_darkpack/modules/storyteller_dice/code/roll_subtypes.dm
+++ b/modular_darkpack/modules/storyteller_dice/code/roll_subtypes.dm
@@ -44,6 +44,11 @@
/datum/storyteller_roll/damage/punch
bumper_text = "damage (punch)"
+/datum/storyteller_roll/damage/punch/calculate_used_dice(mob/living/roller, bonus)
+ . = ..()
+ if(HAS_TRAIT(roller, TRAIT_RAZOR_CLAWS)) // Your still using claws. A bit homebrew tho.
+ . += 1
+
/datum/storyteller_roll/damage/bite
bumper_text = "damage (bite)"
// + 1
@@ -56,6 +61,24 @@
bumper_text = "damage (claw)"
// + 2
+/datum/storyteller_roll/damage/claw/calculate_used_dice(mob/living/roller, bonus)
+ . = ..()
+ if(HAS_TRAIT(roller, TRAIT_RAZOR_CLAWS))
+ . += 2
+
+/* DARKPACK TODO - (Requires https://github.com/DarkPack13/SecondCity/pull/683)
+/datum/storyteller_roll/damage/claw/calculate_used_difficulty(mob/living/roller)
+ . = ..()
+ if(HAS_TRAIT(roller, TRAIT_RAZOR_CLAWS))
+ . -= 1
+*/
+
+/datum/storyteller_roll/shooting
+ bumper_text = "shooting"
+ applicable_stats = list(STAT_DEXTERITY, STAT_FIREARMS)
+ reroll_cooldown = 1 TURNS
+ numerical = TRUE
+
// Physical Feats
/datum/storyteller_roll/lockpick
bumper_text = "lockpicking"
@@ -83,24 +106,6 @@
bumper_text = "climbing"
applicable_stats = list(STAT_DEXTERITY, STAT_ATHLETICS)
-/datum/storyteller_roll/shooting
- bumper_text = "shooting"
- applicable_stats = list(STAT_DEXTERITY, STAT_FIREARMS)
- reroll_cooldown = 1 TURNS
- numerical = TRUE
-
-// DARKPACK TODO - (Attacks need a rework on how they calcuate landing a hit.)
-/datum/storyteller_roll/punch
- bumper_text = "punch"
- applicable_stats = list(STAT_DEXTERITY, STAT_BRAWL)
- spammy_roll = TRUE
-
-/datum/storyteller_roll/damage
- bumper_text = "damage"
- applicable_stats = list(STAT_STRENGTH)
- numerical = TRUE
- spammy_roll = TRUE
-
// Mental Feats
/datum/storyteller_roll/investigation
bumper_text = "investigation"
@@ -112,3 +117,4 @@
bumper_text = "identify"
applicable_stats = list(STAT_INTELLIGENCE, STAT_OCCULT)
reroll_cooldown = 1 SCENES
+ difficulty = 8
diff --git a/modular_darkpack/modules/storyteller_dice/code/rolling_pref.dm b/modular_darkpack/modules/storyteller_dice/code/rolling_pref.dm
deleted file mode 100644
index 3f63c53ed498..000000000000
--- a/modular_darkpack/modules/storyteller_dice/code/rolling_pref.dm
+++ /dev/null
@@ -1,10 +0,0 @@
-/datum/preference/choiced/dice_output
- category = PREFERENCE_CATEGORY_GAME_PREFERENCES
- savefile_key = "dice_output"
- savefile_identifier = PREFERENCE_PLAYER
-
-/datum/preference/choiced/dice_output/init_possible_values()
- return list(DICE_OUTPUT_BALLOON, DICE_OUTPUT_CHAT)
-
-/datum/preference/choiced/dice_output/create_default_value()
- return DICE_OUTPUT_CHAT
diff --git a/modular_darkpack/modules/storyteller_stats/code/_st_stats.dm b/modular_darkpack/modules/storyteller_stats/code/_st_stats.dm
index 52c583e1d66c..b7cd90e076fa 100644
--- a/modular_darkpack/modules/storyteller_stats/code/_st_stats.dm
+++ b/modular_darkpack/modules/storyteller_stats/code/_st_stats.dm
@@ -13,6 +13,8 @@
VAR_PROTECTED/score = 0
/// Temporary bonus score applied to this stat from various ingame sources.
VAR_PROTECTED/bonus_score = 0
+ /// Temporary bonus score applied to this stat from various ingame sources. These are directly added to results rather then added to dice pool
+ VAR_PROTECTED/auto_success_score = 0
/// The minimum score this stat can be.
var/min_score = 0
/// The maximum score this stat can be.
@@ -26,6 +28,8 @@
var/editable = TRUE
/// A dictionary of modifiers to this attribute.
var/list/modifiers = list()
+ /// A dictionary of auto success scores to this attribute.
+ var/list/auto_successes = list()
/// What score does this stat start out with at character creation.
var/starting_score = 0
/// How many points are in this stat category that the player can use. Used in abstract classes only.
@@ -35,10 +39,13 @@
// Score
-/datum/st_stat/proc/get_score(include_bonus = TRUE)
+/datum/st_stat/proc/get_score(include_bonus = TRUE, include_auto_sucesses = TRUE)
SHOULD_NOT_OVERRIDE(TRUE)
if(include_bonus)
- return score + bonus_score
+ if(include_auto_sucesses)
+ return score + bonus_score + auto_success_score
+ else
+ return score + bonus_score
else
return score
@@ -46,6 +53,10 @@
SHOULD_NOT_OVERRIDE(TRUE)
return bonus_score
+/datum/st_stat/proc/get_auto_success_score()
+ SHOULD_NOT_OVERRIDE(TRUE)
+ return auto_success_score
+
/datum/st_stat/proc/can_set_score(amount)
SHOULD_NOT_OVERRIDE(TRUE)
if((amount < min_score) || (amount > max_score))
@@ -106,7 +117,25 @@
bonus_score = initial(bonus_score)
for(var/source in modifiers)
bonus_score += modifiers[source]
- bonus_score = clamp(bonus_score, 0, 10)
+ bonus_score = clamp(bonus_score, -max_score, 10)
+
+
+/datum/st_stat/proc/add_auto_successes(amount, source)
+ SHOULD_NOT_OVERRIDE(TRUE)
+ LAZYSET(auto_successes, source, amount)
+ update_auto_successes()
+
+/datum/st_stat/proc/remove_auto_successes(source)
+ SHOULD_NOT_OVERRIDE(TRUE)
+ LAZYREMOVE(auto_successes, source)
+ update_auto_successes()
+
+/datum/st_stat/proc/update_auto_successes()
+ SHOULD_NOT_OVERRIDE(TRUE)
+ auto_success_score = initial(auto_success_score)
+ for(var/source in auto_successes)
+ auto_success_score += auto_successes[source]
+ auto_success_score = clamp(auto_success_score, 0, 10)
// Points
diff --git a/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/mob_procs.dm b/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/mob_procs.dm
index fcafd17fa869..4f7ff1e5b93e 100644
--- a/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/mob_procs.dm
+++ b/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/mob_procs.dm
@@ -1,14 +1,14 @@
/// Get a specific mob's stat from its stats list.
-/mob/living/proc/st_get_stat(stat_path, include_bonus)
+/mob/living/proc/st_get_stat(stat_path, include_bonus, include_auto_successes)
var/datum/st_stat/given_stat = storyteller_stats[stat_path]
- return given_stat?.get_score(include_bonus)
+ return given_stat?.get_score(include_bonus, include_auto_successes)
/// Wrapper for st_get_stat to reduce copypaste. Get a specific mob's stat from its stats list.
-/mob/living/proc/st_get_stats(list/stat_list, include_bonus)
+/mob/living/proc/st_get_stats(list/stat_list, include_bonus, include_auto_successes)
var/total_score = 0
for(var/stat_path in stat_list)
var/datum/st_stat/given_stat = storyteller_stats[stat_path]
- total_score += given_stat?.get_score(include_bonus)
+ total_score += given_stat?.get_score(include_bonus, include_auto_successes)
return total_score
/// Set a specific mob's stat from its stats list.
@@ -42,6 +42,19 @@
return score
+/mob/living/proc/st_add_auto_successes(stat_path, amount, source)
+ var/datum/st_stat/given_stat = storyteller_stats[stat_path]
+ var/score = given_stat?.add_auto_successes(amount, source)
+ update_modifiers_from_stats()
+ return score
+
+/mob/living/proc/st_remove_auto_successes(stat_path, source)
+ var/datum/st_stat/given_stat = storyteller_stats[stat_path]
+ var/score = given_stat?.remove_auto_successes(source)
+ update_modifiers_from_stats()
+ return score
+
+
/mob/living/proc/update_modifiers_from_stats(initial = FALSE)
for(var/stat_typepath in storyteller_stats)
var/datum/st_stat/stat_datum = storyteller_stats[stat_typepath]
diff --git a/modular_darkpack/modules/unit_tests/apply_all_clans.dm b/modular_darkpack/modules/unit_tests/apply_all_clans.dm
index 0bd3148e4ef6..889941a10f27 100644
--- a/modular_darkpack/modules/unit_tests/apply_all_clans.dm
+++ b/modular_darkpack/modules/unit_tests/apply_all_clans.dm
@@ -1,4 +1,3 @@
-// DARKPACK EDIT ADD START
/datum/unit_test/apply_all_clans
/datum/unit_test/apply_all_clans/Run()
@@ -17,4 +16,3 @@
human.set_clan(type)
TEST_ASSERT(human.is_clan(type), "[type] was somehow not applied to the human without a client")
-// DARKPACK EDIT ADD END
diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/splats/ghoul_splat/ghoul_splat.dm b/modular_darkpack/modules/vampire_the_masquerade/code/splats/ghoul_splat/ghoul_splat.dm
index 8f4f711b17ad..e1662ce508e1 100644
--- a/modular_darkpack/modules/vampire_the_masquerade/code/splats/ghoul_splat/ghoul_splat.dm
+++ b/modular_darkpack/modules/vampire_the_masquerade/code/splats/ghoul_splat/ghoul_splat.dm
@@ -25,6 +25,7 @@
/datum/splat/vampire/ghoul/on_gain()
owner.give_st_power(/datum/discipline/bloodheal, 1)
+ owner.give_st_power(/datum/discipline/potence, 1)
// the below only runs if they have just been ghouled and domitor isnt null
// ghouls who join from the menu have their discs handled by the disc pref middleware
@@ -37,3 +38,7 @@
owner.give_st_power(discipline, 1)
if(ispath(discipline, /datum/discipline/dementation))
owner.add_quirk(/datum/quirk/darkpack/derangement)
+
+/datum/splat/vampire/ghoul/on_lose_or_destroy()
+ owner.remove_st_power(/datum/discipline/bloodheal)
+ owner.remove_st_power(/datum/discipline/potence)
diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/kindred_splat.dm b/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/kindred_splat.dm
index b1c83a8c5c3a..c03fec37ced6 100644
--- a/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/kindred_splat.dm
+++ b/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/kindred_splat.dm
@@ -42,6 +42,11 @@
/// Timer tracking how long before the Kindred can wake up from torpor
COOLDOWN_DECLARE(torpor_timer)
+ /// Cooldown for seeing blood or fire which will trigger a frenzy
+ COOLDOWN_DECLARE(frenzy_target_check_cooldown)
+ /// Cooldown for acctaully rolling from seeing blood or fire
+ COOLDOWN_DECLARE(frenzy_roll_cooldown)
+
/datum/splat/vampire/kindred/New(generation, clan, mob/living/sire)
src.generation = generation
src.clan = clan
@@ -80,11 +85,14 @@
RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(on_kindred_death))
- // Make all food except raw meat repulsive
var/obj/item/organ/tongue/tongue = owner.get_organ_by_type(/obj/item/organ/tongue)
- tongue?.liked_foodtypes = NONE
- tongue?.disliked_foodtypes = NONE
- tongue?.toxic_foodtypes = ~(GORE | MEAT | RAW)
+ if(!HAS_TRAIT(owner, TRAIT_EAT_FOOD))
+ var/mob/living/carbon/human/lick = owner
+ var/datum/st_stat/morality_path/morality/stat_morality = lick?.storyteller_stats[STAT_MORALITY]
+ if(stat_morality?.morality_path?.alignment != MORALITY_HUMANITY || stat_morality?.get_score() < 5)
+ tongue?.liked_foodtypes = NONE
+ tongue?.disliked_foodtypes = NONE
+ tongue?.toxic_foodtypes = ~(GORE | MEAT | RAW) // nagarajas?
// Set blood type
owner.set_blood_type(BLOOD_TYPE_KINDRED)
@@ -93,6 +101,7 @@
owner.physiology.heat_mod *= 2
owner.physiology.cold_mod *= 0.25
+
/datum/splat/vampire/kindred/on_lose()
owner.set_clan(null)
@@ -127,6 +136,24 @@
GLOB.kindred_list -= owner
+/datum/splat/vampire/kindred/splat_life(seconds_per_tick)
+ . = ..()
+
+ if(COOLDOWN_FINISHED(src, frenzy_roll_cooldown) && COOLDOWN_FINISHED(src, frenzy_target_check_cooldown))
+ var/atom/nearby_fire = get_closest_atom(/atom, owner.get_fire_frenzy_targets(), owner)
+ if(nearby_fire)
+ owner.trigger_rotschreck(nearby_fire)
+ COOLDOWN_START(src, frenzy_roll_cooldown, 1 SCENES)
+
+ else if(HAS_TRAIT(owner, TRAIT_NEEDS_BLOOD))
+ var/atom/nearby_blood = get_closest_atom(/atom, owner.get_blood_frenzy_targets(), owner)
+ if(nearby_blood)
+ owner.trigger_kindred_frenzy(nearby_blood, 4, 0, "The hunger")
+ COOLDOWN_START(src, frenzy_roll_cooldown, 1 SCENES)
+
+ COOLDOWN_START(src, frenzy_target_check_cooldown, 1 TURNS)
+
+
/datum/splat/vampire/kindred/proc/damage_resistance(datum/source, list/damage_mods, damage_amount, damagetype, def_zone, sharpness, attack_direction, obj/item/attacking_item)
SIGNAL_HANDLER
diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/brujah.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/brujah.dm
index e16580134eae..01f98e1eb5b2 100644
--- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/brujah.dm
+++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/brujah.dm
@@ -11,7 +11,7 @@
/datum/discipline/presence
)
clan_traits = list(
- TRAIT_LONGER_FRENZY
+ TRAIT_DIFFICULT_FRENZY
)
male_clothes = /obj/item/clothing/under/vampire/brujah
female_clothes = /obj/item/clothing/under/vampire/brujah/female
diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/setite.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/setite.dm
index 592dc6306065..b2ec5fbdc427 100644
--- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/setite.dm
+++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/setite.dm
@@ -15,6 +15,7 @@
)
male_clothes = /obj/item/clothing/under/vampire/slickback
female_clothes = /obj/item/clothing/under/vampire/burlesque
+ subsplat_keys = /obj/item/vamp/keys/setite
/datum/subsplat/vampire_clan/setite/tlacique
name = "Tlacique"
diff --git a/modular_darkpack/modules/vaults/code/keypad.dm b/modular_darkpack/modules/vaults/code/keypad.dm
index c3cb6ccc5cc2..6a5fb13bdc82 100644
--- a/modular_darkpack/modules/vaults/code/keypad.dm
+++ b/modular_darkpack/modules/vaults/code/keypad.dm
@@ -1,3 +1,5 @@
+GLOBAL_LIST_EMPTY(vault_doors)
+
/proc/create_unique_pincode()
var/pincode = ""
for(var/i in 1 to 5)
diff --git a/modular_darkpack/modules/vaults/code/vaultdoors.dm b/modular_darkpack/modules/vaults/code/vaultdoors.dm
index 0285d72eccdb..f908f3f04799 100644
--- a/modular_darkpack/modules/vaults/code/vaultdoors.dm
+++ b/modular_darkpack/modules/vaults/code/vaultdoors.dm
@@ -36,11 +36,16 @@
desc = "A massive reinforced vault door protecting the bank's reserves."
lock_id = "bank_vault"
-/obj/structure/vaultdoor/New()
- ..()
+/obj/structure/vaultdoor/Initialize(mapload)
+ . = ..()
pincode = create_unique_pincode()
+ GLOB.vault_doors += src
is_locked = TRUE
+/obj/structure/vaultdoor/Destroy()
+ GLOB.vault_doors -= src
+ return ..()
+
/obj/structure/vaultdoor/attack_hand(mob/user)
. = ..()
if(is_broken)
@@ -135,8 +140,3 @@
playsound(src, 'sound/machines/terminal/terminal_error.ogg', 50, TRUE)
. = TRUE
-/proc/find_door_pin(door_type)
- for(var/obj/structure/vaultdoor/vdoor in world)
- if(istype(vdoor, door_type))
- return vdoor
- return null
diff --git a/modular_darkpack/modules/vitae/code/blood_pack.dm b/modular_darkpack/modules/vitae/code/blood_pack.dm
index f53ece7db5fc..2bf9c779363b 100644
--- a/modular_darkpack/modules/vitae/code/blood_pack.dm
+++ b/modular_darkpack/modules/vitae/code/blood_pack.dm
@@ -46,6 +46,7 @@
/obj/item/reagent_containers/blood/empty
blood_type = null
+ custom_price = 5
/obj/item/reagent_containers/blood/ab_plus
blood_type = BLOOD_TYPE_AB_PLUS
diff --git a/modular_darkpack/modules/walls/code/floors/water.dm b/modular_darkpack/modules/walls/code/floors/water.dm
index baec80ea8191..071baae6b100 100644
--- a/modular_darkpack/modules/walls/code/floors/water.dm
+++ b/modular_darkpack/modules/walls/code/floors/water.dm
@@ -78,7 +78,7 @@
SSsupermatter_cascade.can_fire = TRUE
SSsupermatter_cascade.cascade_initiated = TRUE
-/turf/open/water/bloodwave/process()
+/turf/open/water/bloodwave/process(seconds_per_tick)
if(!COOLDOWN_FINISHED(src, wave_cooldown))
return
diff --git a/modular_darkpack/modules/weapons/code/ammo_boxes.dm b/modular_darkpack/modules/weapons/code/ammo_boxes.dm
index 436f0cac7886..8ea75e5c6215 100644
--- a/modular_darkpack/modules/weapons/code/ammo_boxes.dm
+++ b/modular_darkpack/modules/weapons/code/ammo_boxes.dm
@@ -39,7 +39,7 @@
ammo_type = /obj/item/ammo_casing/vampire/c45acp
max_ammo = 100
-/obj/item/ammo_box/darkpack/c45acp/HP
+/obj/item/ammo_box/darkpack/c45acp/hp
name = "ammo box (.45 ACP HP)"
ammo_type = /obj/item/ammo_casing/vampire/c45acp/HP
max_ammo = 100
diff --git a/modular_darkpack/modules/weapons/code/guns.dm b/modular_darkpack/modules/weapons/code/guns.dm
index ff89af271053..03371c00eb56 100644
--- a/modular_darkpack/modules/weapons/code/guns.dm
+++ b/modular_darkpack/modules/weapons/code/guns.dm
@@ -170,6 +170,9 @@
max_ammo = 12
multiple_sprites = AMMO_BOX_FULL_EMPTY
+/obj/item/ammo_box/magazine/glock45acp/hp
+ ammo_type = /obj/item/ammo_casing/vampire/c45acp/HP
+
/obj/item/gun/ballistic/automatic/pistol/darkpack/glock21
name = "\improper Brokk 21"
desc = "Very fast 45 ACP handgun."
diff --git a/modular_darkpack/modules/weapons/code/melee.dm b/modular_darkpack/modules/weapons/code/melee.dm
index 0c9cfeedbaeb..0e21ffffadc3 100644
--- a/modular_darkpack/modules/weapons/code/melee.dm
+++ b/modular_darkpack/modules/weapons/code/melee.dm
@@ -386,6 +386,7 @@
lefthand_file = 'modular_darkpack/modules/weapons/icons/melee_lefthand.dmi'
righthand_file = 'modular_darkpack/modules/weapons/icons/melee_righthand.dmi'
worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi'
+ ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi')
force = 45
throwforce = 10
w_class = WEIGHT_CLASS_BULKY
@@ -400,7 +401,6 @@
resistance_flags = FIRE_PROOF
masquerade_violating = FALSE
custom_price = 1200
- ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') // DARKPACK EDIT ADD
/obj/item/darkpack/spear/Initialize()
. = ..()
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/delirium.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/delirium.dm
new file mode 100644
index 000000000000..21cc0c806757
--- /dev/null
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/delirium.dm
@@ -0,0 +1,130 @@
+/datum/status_effect/delirium
+ id = "delirium"
+ status_type = STATUS_EFFECT_REFRESH
+ duration = 10 SECONDS
+ alert_type = /atom/movable/screen/alert/status_effect/delirium
+ COOLDOWN_DECLARE(message_cooldown)
+ var/static/list/willpower_levels = list(
+ "catatonic fear",
+ "panic",
+ "disbelief",
+ "beserk",
+ "terror",
+ "conciliatory",
+ "controlled fear",
+ "curiosity",
+ "bloodlust",
+ "no reaction"
+ )
+ var/willpower_dots = 1
+ var/datum/weakref/scary_wolf_ref
+ var/image/scary_static
+
+/datum/status_effect/delirium/on_creation(mob/living/new_owner, mob/big_wolf)
+ scary_wolf_ref = WEAKREF(big_wolf)
+ . = ..()
+ linked_alert.desc += " You are filled with [willpower_levels[willpower_dots]]."
+
+/datum/status_effect/delirium/on_apply()
+ . = ..()
+ var/mob/living/carbon/human/human_owner = astype(owner)
+ if(!human_owner)
+ return FALSE
+ if(!human_owner.affected_by_delirium())
+ return FALSE
+ var/mob/living/wolf = scary_wolf_ref?.resolve()
+ if(!wolf)
+ return FALSE
+
+ to_chat(owner, span_boldwarning("Something DEEP inside you fill you with [willpower_levels[willpower_dots]] at the sight of [wolf]"))
+ willpower_dots = clamp(human_owner.st_get_stat(STAT_PERMANENT_WILLPOWER), 1, 10)
+
+ if(owner.client)
+ // dir SOUTH is admitting i compeletly lost the fight against this stupid bullshit and cant get the image to properly mimmic the direction of the mob.
+ var/image/overlay_image = image(loc = wolf, dir = SOUTH)
+ overlay_image.appearance = wolf.appearance
+ overlay_image.override = TRUE
+ overlay_image.name = "Unknown"
+ overlay_image.pixel_y = 0
+ overlay_image.pixel_x = 0
+ overlay_image.pixel_w = 0
+ overlay_image.pixel_z = 0
+ SET_PLANE_EXPLICIT(overlay_image, ABOVE_GAME_PLANE, wolf)
+
+ var/mutable_appearance/static_effect = mutable_appearance('modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/big_static.dmi', "static_base")
+ static_effect.color = "#373642"
+ static_effect.blend_mode = BLEND_INSET_OVERLAY
+ overlay_image.overlays += static_effect
+
+ owner.client.images += overlay_image
+ scary_static = overlay_image
+
+/datum/status_effect/delirium/on_remove()
+ . = ..()
+ to_chat(owner, span_notice("Your heightened emotions subside and you begin to calm."))
+ owner.client?.images -= scary_static
+ QDEL_NULL(scary_static)
+
+/datum/status_effect/delirium/tick(seconds_between_ticks)
+ . = ..()
+ var/mob/living/carbon/human/human_owner = astype(owner)
+ if(!human_owner)
+ return
+ if(!human_owner.affected_by_delirium())
+ return
+ if(COOLDOWN_FINISHED(src, message_cooldown))
+ COOLDOWN_START(src, message_cooldown, rand(10, 15) SECONDS)
+ var/message = get_message()
+ if(message)
+ to_chat(owner, span_boldwarning(message))
+
+
+/datum/status_effect/delirium/proc/get_message()
+ switch(willpower_dots)
+ // Catatonic Fear
+ if(1)
+ return pick("FEAR", "FAINT", "COLLAPSE")
+ // Panic
+ if(2)
+ return pick("RUN", "RUN NOW", "GET DISTANCE")
+ // Disbelief
+ if(3)
+ return pick("HIDE", "COWER")
+ // Beserk
+ if(4)
+ return pick("FIGHT", "KICK", "PUNCH", "BITE", "SWING")
+ // Terror
+ if(5)
+ return pick("RUN", "RUN NOW", "GET DISTANCE", "THINK")
+ // Conciliatory
+ if(6)
+ return pick("PLEAD", "BARGIN", "WHIMPER")
+ // Controlled Fear
+ if(7)
+ return "fear"
+ // Curiosity
+ if(8)
+ return pick("learn", "discover")
+ // Bloodlust
+ if(9)
+ return "anger"
+ // No reaction
+ if(10)
+ return
+
+
+/atom/movable/screen/alert/status_effect/delirium
+ name = "The Delirium"
+ desc = "A supernatural fear."
+ icon_state = "fear"
+ icon = 'modular_darkpack/modules/deprecated/icons/hud/screen_alert.dmi'
+
+
+/mob/living/carbon/human/proc/affected_by_delirium()
+ if(issupernatural(src))
+ return FALSE
+
+ if(st_get_stat(STAT_PERMANENT_WILLPOWER) >= 10)
+ return FALSE
+
+ return TRUE
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/black_furies.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/black_furies.dm
index 4e0e445bbc13..07e9f048bf3e 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/black_furies.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/black_furies.dm
@@ -56,6 +56,7 @@
owner.st_add_stat_mod(STAT_PERCEPTION, 1, type)
owner.st_add_stat_mod(STAT_INTELLIGENCE, 1, type)
owner.st_add_stat_mod(STAT_WITS, 1, type)
+ ADD_TRAIT(owner, TRAIT_DIFFICULT_RAGE, type)
to_chat(owner, span_notice("You feel a sense of heightened lucidity."))
return TRUE
@@ -63,10 +64,11 @@
owner.st_remove_stat_mod(STAT_PERCEPTION, type)
owner.st_remove_stat_mod(STAT_INTELLIGENCE, type)
owner.st_remove_stat_mod(STAT_WITS, type)
+ REMOVE_TRAIT(owner, TRAIT_DIFFICULT_RAGE, type)
to_chat(owner, span_warning("Your mind settles, returning to it's normal state of lucidity."))
/atom/movable/screen/alert/status_effect/breath_of_the_wyld
name = "Breath of the Wyld"
- desc = "Gain an additional die to all mental checks, but suffer a penalty to rage check difficulty." // TODO: rage difficulty code
+ desc = "Gain an additional die to all mental checks, but suffer a penalty to rage check difficulty."
icon = 'modular_darkpack/modules/deprecated/icons/hud/screen_alert.dmi'
icon_state = "riddle" // TODO: get an icon for this
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/species/garou_organs.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/garou_organs.dm
index d956c2c45b63..b9622e53a320 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/species/garou_organs.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/garou_organs.dm
@@ -6,11 +6,15 @@
head_flags = NONE
unarmed_attack_sound = 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/werewolf_bite.ogg'
+/obj/item/bodypart/head/fera/aggravated
+ attack_type = AGGRAVATED
+
/obj/item/bodypart/chest/fera
// limb_id = SPECIES_FERA
/obj/item/bodypart/arm/left/fera
// limb_id = SPECIES_FERA
+ unarmed_sharpness = SHARP_EDGED
unarmed_attack_verbs = list("claw")
unarmed_attack_verbs_continuous = list("claws")
appendage_noun = "paw"
@@ -18,8 +22,12 @@
unarmed_attack_sound = 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/werewolf_bite.ogg'
unarmed_miss_sound = 'sound/items/weapons/slashmiss.ogg'
+/obj/item/bodypart/arm/left/fera/aggravated
+ attack_type = AGGRAVATED
+
/obj/item/bodypart/arm/right/fera
// limb_id = SPECIES_FERA
+ unarmed_sharpness = SHARP_EDGED
unarmed_attack_verbs = list("claw")
unarmed_attack_verbs_continuous = list("claws")
appendage_noun = "paw"
@@ -27,10 +35,15 @@
unarmed_attack_sound = 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/werewolf_bite.ogg'
unarmed_miss_sound = 'sound/items/weapons/slashmiss.ogg'
+/obj/item/bodypart/arm/right/fera/aggravated
+ attack_type = AGGRAVATED
+
/obj/item/bodypart/leg/left/fera
+ unarmed_sharpness = SHARP_EDGED
// limb_id = SPECIES_FERA
/obj/item/bodypart/leg/right/fera
+ unarmed_sharpness = SHARP_EDGED
// limb_id = SPECIES_FERA
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_species.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_species.dm
index 40b7cee7e220..650ba44d65d8 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_species.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_species.dm
@@ -24,6 +24,8 @@
species_language_holder = /datum/language_holder/garou
var/mob_pixel_w
var/mob_pixel_z
+ /// If declared will override the mob size.
+ var/mob_size_override
/// Stats added and removed upon gaining the species
var/list/form_bonus_stats = list()
/// Dice roll difficulty required to shift into this form
@@ -36,8 +38,8 @@
var/fallback_icon
/// Speed mod applied and removed upon gaining this species
var/speed_mod
- /// Causes delerium, which if the user is affected by, does not cause breaches
- var/causes_delerium
+ /// Causes delirium, which if the user is affected by, does not cause breaches
+ var/causes_delirium
/// IF this form can be witnessed, causes masqurade breaches
var/veil_breaching_form = FALSE
@@ -48,6 +50,9 @@
human_who_gained_species.add_offsets(type, w_add = mob_pixel_w, z_add = mob_pixel_z)
+ if(mob_size_override)
+ human_who_gained_species.mob_size = mob_size_override
+
add_buffs(human_who_gained_species)
/datum/species/human/shifter/on_species_loss(mob/living/carbon/human/human, datum/species/new_species, pref_load)
@@ -55,6 +60,9 @@
if(speed_mod)
human.remove_movespeed_modifier(speed_mod)
+ if(mob_size_override)
+ human.mob_size = human::mob_size
+
human.remove_offsets(type)
clear_buffs(human)
@@ -198,14 +206,14 @@
TRAIT_NO_LYING_ANGLE,
TRAIT_TRANSFORM_UPDATES_ICON,
)
- causes_delerium = TRUE
+ causes_delirium = TRUE
veil_breaching_form = TRUE
mutanttongue = /obj/item/organ/tongue/fera
bodypart_overrides = list(
- BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/fera,
- BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/fera,
- BODY_ZONE_HEAD = /obj/item/bodypart/head/fera,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/fera/aggravated,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/fera/aggravated,
+ BODY_ZONE_HEAD = /obj/item/bodypart/head/fera/aggravated,
BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/fera,
BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/fera,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/fera,
@@ -215,6 +223,8 @@
visible_gender_override = "beast"
+ mob_pixel_w = -8
+ mob_size_override = MOB_SIZE_LARGE
form_bonus_stats = list(
STAT_STRENGTH = 4,
STAT_STAMINA = 3,
@@ -222,11 +232,9 @@
STAT_MANIPULATION = -3,
// STAT_APPEARANCE = 0 // NOT YET SUPPORTED
)
- mob_pixel_w = -8
custom_body_render = TRUE
custom_damage_render = TRUE
fallback_icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/crinos.dmi'
- speed_mod = /datum/movespeed_modifier/shifter/war
/datum/species/human/shifter/dire
name = "dire form"
@@ -238,15 +246,16 @@
TRAIT_TRANSFORM_UPDATES_ICON,
TRAIT_FERAL_BITER,
TRAIT_SMALL_HANDS,
+ TRAIT_NO_CUFF,
)
veil_breaching_form = TRUE
mutantbrain = /obj/item/organ/brain/fera
mutanttongue = /obj/item/organ/tongue/fera
bodypart_overrides = list(
- BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/fera,
- BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/fera,
- BODY_ZONE_HEAD = /obj/item/bodypart/head/fera,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/fera/aggravated,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/fera/aggravated,
+ BODY_ZONE_HEAD = /obj/item/bodypart/head/fera/aggravated,
BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/fera,
BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/fera,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/fera,
@@ -256,6 +265,8 @@
visible_gender_override = "beast"
+ mob_pixel_w = -16
+ mob_pixel_z = -8
form_bonus_stats = list(
STAT_STRENGTH = 3,
STAT_STAMINA = 3,
@@ -263,8 +274,6 @@
STAT_MANIPULATION = -3,
)
shift_difficulty = 7
- mob_pixel_w = -16
- mob_pixel_z = -8
custom_body_render = TRUE
custom_damage_render = TRUE
fallback_icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/hispo.dmi'
@@ -280,6 +289,7 @@
TRAIT_TRANSFORM_UPDATES_ICON,
TRAIT_FERAL_BITER,
TRAIT_SMALL_HANDS,
+ TRAIT_NO_CUFF,
)
mutantbrain = /obj/item/organ/brain/fera
@@ -287,7 +297,7 @@
bodypart_overrides = list(
BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/fera,
BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/fera,
- BODY_ZONE_HEAD = /obj/item/bodypart/head/fera,
+ BODY_ZONE_HEAD = /obj/item/bodypart/head/fera/aggravated,
BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/fera,
BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/fera,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/fera,
@@ -312,12 +322,8 @@
abstract_type = /datum/movespeed_modifier/shifter
movetypes = GROUND
-// Verify these nums are ttrpg accurate.
-/datum/movespeed_modifier/shifter/war
- multiplicative_slowdown = -0.1
-
/datum/movespeed_modifier/shifter/dire
- multiplicative_slowdown = -0.3
+ multiplicative_slowdown = -0.2
/datum/movespeed_modifier/shifter/feral
- multiplicative_slowdown = -0.5
+ multiplicative_slowdown = -0.35
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm
index 1eb5bb01851f..1327bf4e11d3 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm
@@ -146,8 +146,13 @@
COOLDOWN_START(src, passive_healing_cd, 1 TURNS)
var/datum/species/human/shifter/shifter_species = owner.dna.species
if(istype(shifter_species))
- if(shifter_species.is_veil_breaching_form(owner) && (!shifter_species.causes_delerium || HAS_TRAIT(owner, TRAIT_PIERCED_VEIL)))
+ if(shifter_species.is_veil_breaching_form(owner) && (!shifter_species.causes_delirium || HAS_TRAIT(owner, TRAIT_PIERCED_VEIL)))
SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION)
+ if(shifter_species.causes_delirium)
+ for(var/mob/living/carbon/human/guy in oviewers(owner, DEFAULT_SIGHT_DISTANCE))
+ if(!guy.affected_by_delirium())
+ continue
+ guy.apply_status_effect(STATUS_EFFECT_DELIRIUM, owner)
// Being used to represent meditating in your caern
/datum/splat/werewolf/shifter/proc/regain_gnosis_process(seconds_per_tick)
@@ -156,7 +161,7 @@
for(var/obj/structure/werewolf_totem/totem in GLOB.totems)
if(totem.broken)
continue
- if(!(tribe.name in totem.tribes))
+ if(!(tribe?.name in totem.tribes))
continue
if(get_area(totem) != get_area(owner))
continue
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/transformation.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/transformation.dm
index 966652e34c66..a11ab096902d 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/transformation.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/transformation.dm
@@ -13,7 +13,8 @@
return
if(!(form_to_transform in transformation_list))
return
- if(owner?.dna?.species?.type == form_to_transform)
+ var/datum/species/human/shifter/current_form = owner?.dna?.species
+ if(istype(current_form, form_to_transform))
return
if(!force && !COOLDOWN_FINISHED(src, transform_cd))
to_chat(owner, span_warning("Your shifting is on cooldown for one turn."))
@@ -37,7 +38,9 @@
// TODO: should accctually require an amount of successes equal to the forms your shifting through
if(requires_roll)
var/datum/storyteller_roll/fera_trans/transform_roll = new()
- transform_roll.difficulty = form_to_transform::shift_difficulty
+ if(current_form)
+ transform_roll.difficulty = current_form.shift_difficulty
+ transform_roll.successes_needed = steps_between_forms(current_form.type, form_to_transform)
switch(transform_roll.st_roll(owner, owner, PRIMAL_URGE_PLACEHOLDER))
if(ROLL_SUCCESS)
pass()
@@ -53,6 +56,9 @@
// owner.Stun(time_to_transform, ignore_canstun = TRUE)
+ for(var/obj/item/clothing/equipped in owner.get_equipped_items(INCLUDE_ABSTRACT))
+ equipped.take_damage(rand(25, 50), sound_effect = FALSE)
+
var/matrix/ntransform = matrix(owner.transform)
ntransform.Scale(1.1, 1.1)
animate(owner, transform = ntransform, color = "#000000", time = time_to_transform * 0.9)
@@ -61,6 +67,11 @@
addtimer(CALLBACK(src, PROC_REF(transform_finish), form_to_transform, time_to_transform), time_to_transform * 0.9)
+/datum/splat/werewolf/shifter/proc/steps_between_forms(datum/species/human/shifter/first_form, datum/species/human/shifter/second_form)
+ var/first_index = transformation_list.Find(first_form)
+ var/second_index = transformation_list.Find(second_form)
+ return abs(first_index - second_index)
+
/datum/splat/werewolf/shifter/proc/revert_to_breed_form()
if(HAS_TRAIT(owner, TRAIT_METAMORPH))
var/datum/storyteller_roll/metamorph/roll_datum = new()
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/tribes/_tribe.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/tribes/_tribe.dm
index 3d94fec0d898..51ba4e11911e 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/tribes/_tribe.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/tribes/_tribe.dm
@@ -70,7 +70,7 @@
target.playsound_local(target, "modular_darkpack/modules/powers/sounds/daimonion_laughs/demonlaugh1.ogg", 50, FALSE)
to_chat(target, span_cult("THE WYRMFOE IS ALL AROUND ME"))
new /datum/hallucination/delusion(target, TRUE, "dancer", 200, 0)
- //target.rollfrenzy() DARKPACK TODO: Frenzy
+ target.trigger_rage_frenzy()
else
to_chat(target, span_cult("I can feel a overwhelming presence.. I NEED TO RUN!!"))
new /obj/effect/client_image_holder/baali_demon/wyrm(get_turf(target), list(target))
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm
index 1fdf8f886ee8..42b0e365caf9 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm
@@ -197,27 +197,27 @@
/obj/structure/werewolf_totem/generic
light_color = "#81ff4f"
- tribes = TRIBE_GAIA
+ tribes = TRIBE_LIST_GAIA
/obj/structure/werewolf_totem/generic/wyld
light_color = "#81ff4f"
- tribes = TRIBE_WYLD
+ tribes = TRIBE_LIST_WYLD
/obj/structure/werewolf_totem/generic/weaver
icon_state = "glassw"
base_icon_state = "glassw"
light_color = "#35b0ff"
- tribes = TRIBE_WEAVER
+ tribes = TRIBE_LIST_WEAVER
/obj/structure/werewolf_totem/generic/wyrm
icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/spiral_totem.dmi'
icon_state = "spiral"
base_icon_state = "spiral"
light_color = "#ff5235"
- tribes = TRIBE_WYRM
+ tribes = TRIBE_LIST_WYRM
/obj/structure/werewolf_totem/generic/alltribes
- tribes = TRIBE_ALL
+ tribes = TRIBE_LIST_ALL
// This things type path sucks
@@ -227,16 +227,16 @@
var/tribes = list()
/obj/effect/landmark/teleport_mark/gaia
- tribes = TRIBE_GAIA
+ tribes = TRIBE_LIST_GAIA
/obj/effect/landmark/teleport_mark/wyld
- tribes = TRIBE_WYLD
+ tribes = TRIBE_LIST_WYLD
/obj/effect/landmark/teleport_mark/weaver
- tribes = TRIBE_WEAVER
+ tribes = TRIBE_LIST_WEAVER
/obj/effect/landmark/teleport_mark/wyrm
- tribes = TRIBE_WYRM
+ tribes = TRIBE_LIST_WYRM
/obj/effect/landmark/teleport_mark/alltribes
- tribes = TRIBE_ALL
+ tribes = TRIBE_LIST_ALL
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/big_static.dmi b/modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/big_static.dmi
new file mode 100644
index 000000000000..aff62d6d2b3b
Binary files /dev/null and b/modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/big_static.dmi differ
diff --git a/strings/quotes/bible.txt b/strings/quotes/bible.txt
new file mode 100644
index 000000000000..b94e6340dea1
--- /dev/null
+++ b/strings/quotes/bible.txt
@@ -0,0 +1,55 @@
+He that is unjust, let him be unjust still: and he which is filthy, let him be filthy still: and he that is righteous, let him be righteous still: and he that is holy, let him be holy still.
+And, behold, I come quickly; and my reward is with me, to give every man according as his work shall be. I am Alpha and Omega, the beginning and the end, the first and the last.
+He that hath an ear, let him hear what the Spirit saith unto the churches.
+Yea, though I walk through the valley of the shadow of death, I will fear no evil: for thou art with me.
+Deliver my soul from the sword; my darling from the power of the dog. Save me from the lion’s mouth: for thou hast heard me from the horns of the unicorns. I will declare thy name unto my brethren: in the midst of the congregation will I praise thee.
+For in much wisdom is much grief: and he that increaseth knowledge increaseth sorrow.
+Fear them not therefore: for there is nothing covered, that shall not be revealed; and hid, that shall not be known.
+To every thing there is a season, and a time to every purpose under the heaven: A time to be born, and a time to die; a time to plant, and a time to pluck up that which is planted; A time to kill, and a time to heal; a time to break down, and a time to build up; A time to weep, and a time to laugh; a time to mourn, and a time to dance; A time to cast away stones, and a time to gather stones together; a time to embrace, and a time to refrain from embracing; A time to get, and a time to lose; a time to keep, and a time to cast away; A time to rend, and a time to sew; a time to keep silence, and a time to speak; A time to love, and a time to hate; a time of war, and a time of peace.
+Then I saw that wisdom excelleth folly, as far as light excelleth darkness.
+Woe unto them that call evil good, and good evil; that put darkness for light, and light for darkness; that put bitter for sweet, and sweet for bitter! Woe unto them that are wise in their own eyes, and prudent in their own sight! Woe unto them that are mighty to drink wine, and men of strength to mingle strong drink: Which justify the wicked for reward, and take away the righteousness of the righteous from him! Therefore as the fire devoureth the stubble, and the flame consumeth the chaff, so their root shall be as rottenness, and their blossom shall go up as dust: because they have cast away the law of the LORD of hosts, and despised the word of the Holy One of Israel. Therefore is the anger of the LORD kindled against his people, and he hath stretched forth his hand against them, and hath smitten them: and the hills did tremble, and their carcases were torn in the midst of the streets. For all this his anger is not turned away, but his hand is stretched out still.
+Your new moons and your appointed feasts my soul hateth: they are a trouble unto me; I am weary to bear them. And when ye spread forth your hands, I will hide mine eyes from you: yea, when ye make many prayers, I will not hear: your hands are full of blood.
+Why should ye be stricken any more? ye will revolt more and more: the whole head is sick, and the whole heart faint. From the sole of the foot even unto the head there is no soundness in it; but wounds, and bruises, and putrifying sores: they have not been closed, neither bound up, neither mollified with ointment. Your country is desolate, your cities are burned with fire: your land, strangers devour it in your presence, and it is desolate, as overthrown by strangers. And the daughter of Zion is left as a cottage in a vineyard, as a lodge in a garden of cucumbers, as a besieged city. Except the LORD of hosts had left unto us a very small remnant, we should have been as Sodom, and we should have been like unto Gomorrah.
+But we are all as an unclean thing, and all our righteousnesses are as filthy rags; and we all do fade as a leaf; and our iniquities, like the wind, have taken us away. And there is none that calleth upon thy name, that stirreth up himself to take hold of thee: for thou hast hid thy face from us, and hast consumed us, because of our iniquities. But now, O LORD, thou art our father; we are the clay, and thou our potter; and we all are the work of thy hand.
+Blessed are the poor in spirit: for theirs is the kingdom of heaven. Blessed are they that mourn: for they shall be comforted. Blessed are the meek: for they shall inherit the earth. Blessed are they which do hunger and thirst after righteousness: for they shall be filled. Blessed are the merciful: for they shall obtain mercy. Blessed are the pure in heart: for they shall see God. Blessed are the peacemakers: for they shall be called the children of God. Blessed are they which are persecuted for righteousness sake: for theirs is the kingdom of heaven. Blessed are ye, when men shall revile you, and persecute you, and shall say all manner of evil against you falsely, for my sake. Rejoice, and be exceeding glad: for great is your reward in heaven: for so persecuted they the prophets which were before you.
+Ye are the salt of the earth: but if the salt have lost his savour, wherewith shall it be salted? it is thenceforth good for nothing, but to be cast out, and to be trodden under foot of men. Ye are the light of the world. A city that is set on an hill cannot be hid. Neither do men light a candle, and put it under a bushel, but on a candlestick; and it giveth light unto all that are in the house. Let your light so shine before men, that they may see your good works, and glorify your Father which is in heaven.
+Think not that I am come to destroy the law, or the prophets: I am not come to destroy, but to fulfil.
+But I say unto you, That whosoever looketh on a woman to lust after her hath committed adultery with her already in his heart. And if thy right eye offend thee, pluck it out, and cast it from thee: for it is profitable for thee that one of thy members should perish, and not that thy whole body should be cast into hell. And if thy right hand offend thee, cut if off, and cast it from thee: for it is profitable for thee that one of thy members should perish, and not that thy whole body should be cast into hell.
+Ye have heard that it hath been said, An eye for an eye, and a tooth for a tooth: But I say unto you, That ye resist not evil: but whosoever shall smite thee on thy right cheek, turn to him the other also. And if any man will sue thee at the law, and take away thy coat, let him have thy cloke also. And whosoever shall compel thee to go a mile, go with him twain. Give to him that asketh thee, and from him that would borrow of thee turn not thou away.
+Take heed that ye do not your alms before men, to be seen of them: otherwise ye have no reward of your Father which is in heaven. Therefore when thou doest thine alms, do not sound a trumpet before thee, as the hypocrites do in the synagogues and in the streets, that they may have glory of men. Verily I say unto you, They have their reward. But when thou doest alms, let not thy left hand know what thy right hand doeth: That thine alms may be in secret: and thy Father which seeth in secret himself shall reward thee openly.
+Ye have heard that it hath been said, Thou shalt love thy neighbour, and hate thine enemy. But I say unto you, Love your enemies, bless them that curse you, do good to them that hate you, and pray for them which despitefully use you, and persecute you; That ye may be the children of your Father which is in heaven: for he maketh his sun to rise on the evil and on the good, and sendeth rain on the just and on the unjust. For if ye love them which love you, what reward have ye? do not even the publicans the same? And if ye salute your brethren only, what do ye more than others? do not even the publicans so? Be ye therefore perfect, even as your Father which is in heaven is perfect.
+Our Father which art in heaven, Hallowed be thy name. Thy kingdom come. Thy will be done in earth, as it is in heaven. Give us this day our daily bread. And forgive us our debts, as we forgive our debtors. And lead us not into temptation, but deliver us from evil: For thine is the kingdom, and the power, and the glory, for ever. Amen.
+Lay not up for yourselves treasures upon earth, where moth and rust doth corrupt, and where thieves break through and steal: But lay up for yourselves treasures in heaven, where neither moth nor rust doth corrupt, and where thieves do not break through nor steal: For where your treasure is, there will your heart be also.
+For if ye forgive men their trespasses, your heavenly Father will also forgive you: But if ye forgive not men their trespasses, neither will your Father forgive your trespasses.
+Judge not, that ye be not judged. For with what judgment ye judge, ye shall be judged: and with what measure ye mete, it shall be measured to you again. And why beholdest thou the mote that is in thy brother’s eye, but considerest not the beam that is in thine own eye? Or how wilt thou say to thy brother, Let me pull out the mote out of thine eye; and, behold, a beam is in thine own eye? Thou hypocrite, first cast out the beam out of thine own eye; and then shalt thou see clearly to cast out the mote out of thy brother’s eye.
+Ask, and it shall be given you; seek, and ye shall find; knock, and it shall be opened unto you: For every one that asketh receiveth; and he that seeketh findeth; and to him that knocketh it shall be opened. Or what man is there of you, whom if his son ask bread, will he give him a stone? Or if he ask a fish, will he give him a serpent? If ye then, being evil, know how to give good gifts unto your children, how much more shall your Father which is in heaven give good things to them that ask him? Therefore all things whatsoever ye would that men should do to you, do ye even so to them: for this is the law and the prophets.
+Beware of false prophets, which come to you in sheep’s clothing, but inwardly they are ravening wolves. Ye shall know them by their fruits.
+And when they had platted a crown of thorns, they put it upon his head, and a reed in his right hand: and they bowed the knee before him, and mocked him, saying, Hail, King of the Jews! And they spit upon him, and took the reed, and smote him on the head. And after that they had mocked him, they took the robe off from him, and put his own raiment on him, and led him away to crucify him.
+And they that passed by reviled him, wagging their heads, And saying, Thou that destroyest the temple, and buildest it in three days, save thyself. If thou be the Son of God, come down from the cross. Likewise also the chief priests mocking him, with the scribes and elders, said, He saved others; himself he cannot save. If he be the King of Israel, let him now come down from the cross, and we will believe him. He trusted in God; let him deliver him now, if he will have him: for he said, I am the Son of God. The thieves also, which were crucified with him, cast the same in his teeth.
+Then said Jesus, Father, forgive them; for they know not what they do.
+And one of the malefactors which were crucified next to him, saying, If thou be Christ, save thyself and us. But the other answering rebuked him, saying, Dost not thou fear God, seeing thou art in the same condemnation? And we indeed justly; for we receive the due reward of our deeds: but this man hath done nothing amiss. And he said unto Jesus, Lord, remember me when thou comest into thy kingdom. And Jesus said unto him, Verily I say unto thee, To day shalt thou be with me in paradise. And it was about the sixth hour, and there was a darkness over all the earth until the ninth hour. And the sun was darkened, and the veil of the temple was rent in the midst.
+And when Jesus had cried with a loud voice, he said, Father, into thy hands I commit my spirit: and having said thus, he gave up the ghost. Now when the centurion saw what was done, he glorified God, saying, Certainly this was a righteous man.
+And said unto them, Thus it is written, and thus it behoved Christ to suffer, and to rise from the dead the third day: And that repentance and remission of sins should be preached in his name among all nations, beginning at Jerusalem. And ye are witnesses of these things.
+And I saw heaven opened, and behold a white horse; and he that sat upon him was called Faithful and True, and in righteousness he doth judge and make war. His eyes were as a flame of fire, and on his head were many crowns; and he had a name written, that no man knew, but he himself. And he was clothed with a vesture dipped in blood: and his name is called The Word of God. And the armies which were in heaven followed him upon white horses, clothed in fine linen, white and clean. And out of his mouth goeth a sharp sword, that with it he should smite the nations: and he shall rule them with a rod of iron: and he treadeth the winepress of the fierceness and wrath of Almighty God.
+And when he had opened the seventh seal, there was silence in heaven about the space of half an hour.
+And I saw the seven angels which stood before God; and to them were given seven trumpets.
+And another angel came and stood at the altar, having a golden censer; and there was given unto him much incense, that he should offer it with the prayers of all saints upon the golden altar which was before the throne.
+And the smoke of the incense, which came with the prayers of the saints, ascended up before God out of the angel's hand. And the angel took the censer, and filled it with fire of the altar, and cast it into the earth: and there were voices, and thunderings, and lightnings, and an earthquake. And the seven angels which had the seven trumpets prepared themselves to sound.
+The first angel sounded, and there followed hail and fire mingled with blood, and they were cast upon the earth: and the third part of trees was burnt up, and all green grass was burnt up.
+And the second angel sounded, and as it were a great mountain burning with fire was cast into the sea: and the third part of the sea became blood; And the third part of the creatures which were in the sea, and had life, died; and the third part of the ships were destroyed.
+And the third angel sounded, and there fell a great star from heaven, burning as it were a lamp, and it fell upon the third part of the rivers, and upon the fountains of waters; And the name of the star is called Wormwood: and the third part of the waters became wormwood; and many men died of the waters, because they were made bitter.
+And the fourth angel sounded, and the third part of the sun was smitten, and the third part of the moon, and the third part of the stars; so as the third part of them was darkened, and the day shone not for a third part of it, and the night likewise.
+And the devil that deceived them was cast into the lake of fire and brimstone, where the beast and the false prophet are, and shall be tormented day and night for ever and ever.
+And death and hell were cast into the lake of fire. This is the second death.
+And God shall wipe away all tears from their eyes; and there shall be no more death, neither sorrow, nor crying, neither shall there be any more pain: for the former things are passed away.
+And he said unto me, It is done. I am Alpha and Omega, the beginning and the end. I will give unto him that is athirst of the fountain of the water of life freely.
+For, behold, the Lord will come with fire, and with his chariots like a whirlwind, to render his anger with fury, and his rebuke with flames of fire.
+For by fire and by his sword will the Lord plead with all flesh: and the slain of the Lord shall be many.
+The eyes of the Lord are in every place, beholding the evil and the good.
+Thou shalt not be afraid for the terror by night; nor for the arrow that flieth by day.
+Submit yourselves therefore to God. Resist the devil, and he will flee from you.
+A thousand shall fall at thy side, and ten thousand at thy right hand; but it shall not come nigh thee.
+Dearly beloved, avenge not yourselves, but rather give place unto wrath: for it is written, Vengeance is mine; I will repay, saith the Lord.
+Come unto me, all ye that labour and are heavy laden, and I will give you rest.
+The sun shall be turned into darkness, and the moon into blood, before the great and terrible day of the Lord come.
+And it shall come to pass, that whosoever shall call on the name of the Lord shall be delivered: for in mount Zion and in Jerusalem shall be deliverance, as the Lord hath said, and in the remnant whom the Lord shall call.
diff --git a/tgstation.dme b/tgstation.dme
index 24082dcf8b89..933ee50ae287 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -431,6 +431,7 @@
#include "code\__DEFINES\~darkpack\auras.dm"
#include "code\__DEFINES\~darkpack\banning.dm"
#include "code\__DEFINES\~darkpack\beastmaster.dm"
+#include "code\__DEFINES\~darkpack\blooper.dm"
#include "code\__DEFINES\~darkpack\branding.dm"
#include "code\__DEFINES\~darkpack\colors.dm"
#include "code\__DEFINES\~darkpack\combat.dm"
@@ -463,6 +464,7 @@
#include "code\__DEFINES\~darkpack\sight.dm"
#include "code\__DEFINES\~darkpack\signals_kindred.dm"
#include "code\__DEFINES\~darkpack\sound.dm"
+#include "code\__DEFINES\~darkpack\spirit_defines.dm"
#include "code\__DEFINES\~darkpack\splats.dm"
#include "code\__DEFINES\~darkpack\status_effects_debuffs.dm"
#include "code\__DEFINES\~darkpack\storyteller_dice.dm"
@@ -6993,11 +6995,17 @@
#include "modular_darkpack\master_files\code\datums\mapgen\woods_generator.dm"
#include "modular_darkpack\master_files\code\datums\mind\_mind.dm"
#include "modular_darkpack\master_files\code\datums\quirks\_quirk.dm"
+#include "modular_darkpack\master_files\code\datums\quirks\negative_quirks\blind.dm"
+#include "modular_darkpack\master_files\code\datums\quirks\negative_quirks\deaf.dm"
+#include "modular_darkpack\master_files\code\datums\quirks\negative_quirks\illiterate.dm"
+#include "modular_darkpack\master_files\code\datums\quirks\negative_quirks\mute.dm"
#include "modular_darkpack\master_files\code\datums\station_traits\_station_trait.dm"
#include "modular_darkpack\master_files\code\datums\storage\subtypes\bags.dm"
#include "modular_darkpack\master_files\code\datums\storage\subtypes\dufflebags.dm"
+#include "modular_darkpack\master_files\code\game\atoms_movable.dm"
#include "modular_darkpack\master_files\code\game\area\areas.dm"
#include "modular_darkpack\master_files\code\game\objects\items.dm"
+#include "modular_darkpack\master_files\code\game\objects\objs.dm"
#include "modular_darkpack\master_files\code\game\objects\items\trash.dm"
#include "modular_darkpack\master_files\code\game\objects\items\weaponry.dm"
#include "modular_darkpack\master_files\code\game\objects\items\devices\radio\radio.dm"
@@ -7030,6 +7038,7 @@
#include "modular_darkpack\master_files\code\modules\mob\living\living.dm"
#include "modular_darkpack\master_files\code\modules\mob\living\living_defines.dm"
#include "modular_darkpack\master_files\code\modules\mob\living\living_movement.dm"
+#include "modular_darkpack\master_files\code\modules\mob\living\living_say.dm"
#include "modular_darkpack\master_files\code\modules\mob\living\basic\farm_animals\deer\deer.dm"
#include "modular_darkpack\master_files\code\modules\mob\living\basic\space_fauna\ghost.dm"
#include "modular_darkpack\master_files\code\modules\mob\living\basic\vermin\space_bat.dm"
@@ -7045,6 +7054,7 @@
#include "modular_darkpack\master_files\code\modules\mob\living\carbon\human\life.dm"
#include "modular_darkpack\master_files\code\modules\mob\living\carbon\human\physiology.dm"
#include "modular_darkpack\master_files\code\modules\mob\living\carbon\human\species_types\zombies.dm"
+#include "modular_darkpack\master_files\code\modules\mob\living\silicon\silicon.dm"
#include "modular_darkpack\master_files\code\modules\mob\living\simple_animal\hostile\hostile.dm"
#include "modular_darkpack\master_files\code\modules\paperwork\fax.dm"
#include "modular_darkpack\master_files\code\modules\power\lighting\lighting_mapping_helpers.dm"
@@ -7109,6 +7119,11 @@
#include "modular_darkpack\modules\blood_drinking\code\overfeeding\diablerie\adjust_generation.dm"
#include "modular_darkpack\modules\blood_drinking\code\overfeeding\diablerie\handle_diablerie.dm"
#include "modular_darkpack\modules\blood_drinking\code\overfeeding\diablerie\make_diablerist.dm"
+#include "modular_darkpack\modules\blooper\code\blooper.dm"
+#include "modular_darkpack\modules\blooper\code\blooper_subsystem.dm"
+#include "modular_darkpack\modules\blooper\code\changeling.dm"
+#include "modular_darkpack\modules\blooper\code\preferences\preferences.dm"
+#include "modular_darkpack\modules\blooper\code\preferences\middleware\blooper.dm"
#include "modular_darkpack\modules\books\code\bookcases.dm"
#include "modular_darkpack\modules\books\code\books.dm"
#include "modular_darkpack\modules\brain_damage\code\phobia.dm"
@@ -7144,6 +7159,8 @@
#include "modular_darkpack\modules\clothes\code\neck.dm"
#include "modular_darkpack\modules\clothes\code\suit.dm"
#include "modular_darkpack\modules\clothes\code\under.dm"
+#include "modular_darkpack\modules\company_logos\code\company_logos.dm"
+#include "modular_darkpack\modules\company_logos\code\pentex.dm"
#include "modular_darkpack\modules\curtains\code\curtains.dm"
#include "modular_darkpack\modules\dancing\code\dancing.dm"
#include "modular_darkpack\modules\decor\code\bench.dm"
@@ -7213,6 +7230,8 @@
#include "modular_darkpack\modules\ert\code\outfits\first_team_outfits.dm"
#include "modular_darkpack\modules\ert\code\outfits\national_guard_outfits.dm"
#include "modular_darkpack\modules\ert\code\outfits\swat_outfits.dm"
+#include "modular_darkpack\modules\events\code\_darkpack_event.dm"
+#include "modular_darkpack\modules\events\code\blackout_event.dm"
#include "modular_darkpack\modules\external_organs\code\gargoyle_wings.dm"
#include "modular_darkpack\modules\external_organs\code\gargoyle_wings_sprite_accessory_datum.dm"
#include "modular_darkpack\modules\fire\code\fire.dm"
@@ -7242,6 +7261,9 @@
#include "modular_darkpack\modules\forensics\code\forensic_gatherer.dm"
#include "modular_darkpack\modules\forensics\code\serial_number_log.dm"
#include "modular_darkpack\modules\forensics\code\serial_numbering.dm"
+#include "modular_darkpack\modules\frenzy\code\frenzy.dm"
+#include "modular_darkpack\modules\frenzy\code\frenzy_helpers.dm"
+#include "modular_darkpack\modules\frenzy\code\status_effect.dm"
#include "modular_darkpack\modules\government\code\carry_permit.dm"
#include "modular_darkpack\modules\government\code\drivers_license.dm"
#include "modular_darkpack\modules\government\code\passport.dm"
@@ -7287,6 +7309,10 @@
#include "modular_darkpack\modules\jobs\code\giovanni\capo.dm"
#include "modular_darkpack\modules\jobs\code\giovanni\la_famiglia.dm"
#include "modular_darkpack\modules\jobs\code\giovanni\la_squadra.dm"
+#include "modular_darkpack\modules\jobs\code\hunters\abbe.dm"
+#include "modular_darkpack\modules\jobs\code\hunters\condottieri.dm"
+#include "modular_darkpack\modules\jobs\code\hunters\inquisitor.dm"
+#include "modular_darkpack\modules\jobs\code\hunters\novice.dm"
#include "modular_darkpack\modules\jobs\code\miscelllaneous\citizen.dm"
#include "modular_darkpack\modules\jobs\code\miscelllaneous\club_worker.dm"
#include "modular_darkpack\modules\jobs\code\miscelllaneous\graveyard_keeper.dm"
@@ -7372,20 +7398,17 @@
#include "modular_darkpack\modules\matrix\code\job.dm"
#include "modular_darkpack\modules\matrix\code\matrix.dm"
#include "modular_darkpack\modules\merits_flaws\code\_darkpack_quirk.dm"
+#include "modular_darkpack\modules\merits_flaws\code\config.dm"
#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\amnesia.dm"
#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\animal_musk.dm"
#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\bad_sight.dm"
#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\betrayers_mark.dm"
-#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\blind.dm"
-#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\deaf.dm"
#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\derangement.dm"
#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\dulled_bite.dm"
#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\grip_of_the_damned.dm"
#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\horrific_appearance_quirk.dm"
-#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\illiterate.dm"
#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\mage_blood.dm"
#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\monstrous_quirk.dm"
-#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\mute.dm"
#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\one_armed.dm"
#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\organovore.dm"
#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\permanent_fangs.dm"
@@ -7394,12 +7417,15 @@
#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\territorial.dm"
#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\thaumaturgically_inept.dm"
#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\the_largest_maw.dm"
+#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\third_eye.dm"
#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\vengeful.dm"
#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\victim_of_the_masquerade.dm"
#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\weak_willed.dm"
#include "modular_darkpack\modules\merits_flaws\code\neutral_quirks\illegal_identity.dm"
-#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\beserk.dm"
+#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\beserker.dm"
+#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\blush_of_health_quirk.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\deceptive_aura.dm"
+#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\eat_food_quirk.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\efficient_digestion.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\fair_glabro.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\giovanni_sanguine_incongruity.dm"
@@ -7408,6 +7434,7 @@
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\stillness_of_death.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\time_sense.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\untamable.dm"
+#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\wolf_sight.dm"
#include "modular_darkpack\modules\mob_spawners\code\citizen.dm"
#include "modular_darkpack\modules\movie_theatre\code\areas.dm"
#include "modular_darkpack\modules\movie_theatre\code\fluff.dm"
@@ -7425,9 +7452,13 @@
#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\gunstore.dm"
+#include "modular_darkpack\modules\npc\code\human\npc_types\hardwarestore.dm"
#include "modular_darkpack\modules\npc\code\human\npc_types\hobo.dm"
+#include "modular_darkpack\modules\npc\code\human\npc_types\huntingstore.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\pharmacystore.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"
@@ -7452,9 +7483,13 @@
#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\campingstore.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\gunstore.dm"
+#include "modular_darkpack\modules\npc\code\human\socialroles\shop\hardwarestore.dm"
#include "modular_darkpack\modules\npc\code\human\socialroles\shop\illegal.dm"
+#include "modular_darkpack\modules\npc\code\human\socialroles\shop\pharmacystore.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"
@@ -7469,8 +7504,10 @@
#include "modular_darkpack\modules\npc\code\nonhuman\hostile\baali_guard.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\hostile\bear.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\hostile\werewolf.dm"
-#include "modular_darkpack\modules\occult_artifacts\code\artifacts\_artifact.dm"
-#include "modular_darkpack\modules\occult_artifacts\code\artifacts\_artifact_config.dm"
+#include "modular_darkpack\modules\occult_artifacts\code\_artifact.dm"
+#include "modular_darkpack\modules\occult_artifacts\code\_artifact_config.dm"
+#include "modular_darkpack\modules\occult_artifacts\code\_vampire.dm"
+#include "modular_darkpack\modules\occult_artifacts\code\_werewolf.dm"
#include "modular_darkpack\modules\occult_artifacts\code\artifacts\bloodstar.dm"
#include "modular_darkpack\modules\occult_artifacts\code\artifacts\bloodstone.dm"
#include "modular_darkpack\modules\occult_artifacts\code\artifacts\daimonori.dm"
@@ -7480,7 +7517,10 @@
#include "modular_darkpack\modules\occult_artifacts\code\artifacts\key_of_alamut.dm"
#include "modular_darkpack\modules\occult_artifacts\code\artifacts\mummywrap_fetish.dm"
#include "modular_darkpack\modules\occult_artifacts\code\artifacts\odious_chalice.dm"
+#include "modular_darkpack\modules\occult_artifacts\code\artifacts\tarulfang.dm"
#include "modular_darkpack\modules\occult_artifacts\code\artifacts\weekapaug_thistle.dm"
+#include "modular_darkpack\modules\occult_artifacts\code\fetishes\dagger_of_retribution.dm"
+#include "modular_darkpack\modules\occult_artifacts\code\fetishes\nyxs_bangle.dm"
#include "modular_darkpack\modules\onfloor_icons\code\apply_onfloor_icon_element.dm"
#include "modular_darkpack\modules\onfloor_icons\code\dynamic_item_icon.dm"
#include "modular_darkpack\modules\onfloor_icons\code\gags_configs.dm"
@@ -7629,7 +7669,9 @@
#include "modular_darkpack\modules\ritual_abyss_mysticism\code\rituals\__abyssrune.dm"
#include "modular_darkpack\modules\ritual_abyss_mysticism\code\rituals\artifact_identification.dm"
#include "modular_darkpack\modules\ritual_abyss_mysticism\code\rituals\blackout.dm"
+#include "modular_darkpack\modules\ritual_abyss_mysticism\code\rituals\calling_the_hungry_shade.dm"
#include "modular_darkpack\modules\ritual_abyss_mysticism\code\rituals\comforting_darkness.dm"
+#include "modular_darkpack\modules\ritual_abyss_mysticism\code\rituals\pierce_the_veil.dm"
#include "modular_darkpack\modules\ritual_abyss_mysticism\code\rituals\reflections_of_hollow_revelation.dm"
#include "modular_darkpack\modules\ritual_abyss_mysticism\code\rituals\self_destruction.dm"
#include "modular_darkpack\modules\ritual_abyss_mysticism\code\rituals\shadow_guardian.dm"
@@ -7689,7 +7731,6 @@
#include "modular_darkpack\modules\storyteller_dice\code\roll_datum.dm"
#include "modular_darkpack\modules\storyteller_dice\code\roll_subsystem.dm"
#include "modular_darkpack\modules\storyteller_dice\code\roll_subtypes.dm"
-#include "modular_darkpack\modules\storyteller_dice\code\rolling_pref.dm"
#include "modular_darkpack\modules\storyteller_dice\code\verbs.dm"
#include "modular_darkpack\modules\storyteller_stats\code\_st_stats.dm"
#include "modular_darkpack\modules\storyteller_stats\code\global_procs.dm"
@@ -7815,6 +7856,7 @@
#include "modular_darkpack\modules\weapons\code\sheath.dm"
#include "modular_darkpack\modules\weapons\code\stake.dm"
#include "modular_darkpack\modules\weather\code\effects.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\delirium.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\emotes.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\garou_languages.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gauntlet.dm"
diff --git a/tgui/packages/tgui-panel/chat/constants.ts b/tgui/packages/tgui-panel/chat/constants.ts
index aa9764af7e08..f910853732b6 100644
--- a/tgui/packages/tgui-panel/chat/constants.ts
+++ b/tgui/packages/tgui-panel/chat/constants.ts
@@ -66,14 +66,14 @@ export const MESSAGE_TYPES: MessageType[] = [
type: MESSAGE_TYPE_LOCALCHAT,
name: 'Local',
description: 'In-character local messages (say, emote, etc)',
- selector: '.say, .emote, .looc, .do', // DARKPACK EDIT, ORIGINAL: selector: '.say, .emote',
+ selector: '.say, .emote, .looc, .do', // DARKPACK EDIT CHANGE - ORIGINAL: selector: '.say, .emote',
},
{
type: MESSAGE_TYPE_RADIO,
name: 'Radio',
description: 'All departments of radio messages',
selector:
- '.alert, .minorannounce, .syndradio, .centcomradio, .aiprivradio, .comradio, .secradio, .gangradio, .engradio, .medradio, .sciradio, .suppradio, .servradio, .radio, .deptradio, .binarysay, .resonate, .abductor, .alien, .changeling, .policeradio, .clinicradio, .militaryradio, .camarillaradio, .anarchradio, .endronradio', // DARKPACK EDIT, ORIGINAL: '.alert, .minorannounce, .syndradio, .centcomradio, .aiprivradio, .comradio, .secradio, .gangradio, .engradio, .medradio, .sciradio, .suppradio, .servradio, .radio, .deptradio, .binarysay, .resonate, .abductor, .alien, .changeling',
+ '.alert, .minorannounce, .syndradio, .centcomradio, .aiprivradio, .comradio, .secradio, .gangradio, .engradio, .medradio, .sciradio, .suppradio, .servradio, .radio, .deptradio, .binarysay, .resonate, .abductor, .alien, .changeling, .policeradio, .clinicradio, .militaryradio, .camarillaradio, .anarchradio, .endronradio', // DARKPACK EDIT CHANGE - ORIGINAL: '.alert, .minorannounce, .syndradio, .centcomradio, .aiprivradio, .comradio, .secradio, .gangradio, .engradio, .medradio, .sciradio, .suppradio, .servradio, .radio, .deptradio, .binarysay, .resonate, .abductor, .alien, .changeling',
},
{
type: MESSAGE_TYPE_ENTERTAINMENT,
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
index 75dcac469ffb..e85ad03be6dd 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
@@ -1306,6 +1306,144 @@ $border-width-px: $border-width * 1px;
color: #b09448;
}
+.boxed_message .icon {
+ width: 1.5em;
+ height: 1.5em;
+ margin: 0;
+ padding: 0;
+
+ &.corplogo {
+ width: 300px !important;
+ height: 110px !important;
+ }
+}
+
+.corp_label_pentex {
+ color: hsl(317.78, 29.67%, 17.84%);
+ text-shadow: 0 0 8px #3b2033;
+ font-weight: bold;
+}
+
+.corp_label_ardus {
+ color: hsl(201.43, 16.28%, 66.27%);
+ text-shadow: 0 0 8px #9badb7;
+ font-weight: bold;
+}
+
+.corp_label_avalon {
+ color: hsl(245.96, 80.75%, 63.33%);
+ text-shadow: 0 0 8px #6556ed;
+ font-weight: bold;
+}
+
+.corp_label_circinus {
+ color: hsl(29.28, 100%, 75.49%);
+ text-shadow: 0 0 8px #ffbf82;
+ font-weight: bold;
+}
+
+.corp_label_consolidex {
+ color: hsl(290.51, 100%, 57.84%);
+ text-shadow: 0 0 8px #dd28ff;
+ font-weight: bold;
+}
+
+.corp_label_endron {
+ color: hsl(157.32, 97.62%, 16.47%);
+ text-shadow: 0 0 8px #015334;
+ font-weight: bold;
+}
+
+.corp_label_harold_harold {
+ color: hsl(8.97, 42.44%, 40.2%);
+ text-shadow: 0 0 8px #92483b;
+ font-weight: bold;
+}
+
+.corp_label_good_house {
+ color: hsl(285, 20.93%, 66.27%);
+ text-shadow: 0 0 8px #b297bb;
+ font-weight: bold;
+}
+
+.corp_label_hallahan {
+ color: hsl(257.45, 88.29%, 43.53%);
+ text-shadow: 0 0 8px #460dd1;
+ font-weight: bold;
+}
+
+.corp_label_herculean {
+ color: hsl(0, 100%, 53.14%);
+ text-shadow: 0 0 8px #ff1010;
+ font-weight: bold;
+}
+
+.corp_label_herricks {
+ color: hsl(285.51, 90.82%, 38.43%);
+ text-shadow: 0 0 8px #9009bb;
+ font-weight: bold;
+}
+
+.corp_label_king {
+ color: hsl(44.62, 53.92%, 57.45%);
+ text-shadow: 0 0 8px #cdaf58;
+ font-weight: bold;
+}
+
+.corp_label_megadon {
+ color: hsl(182.58, 100%, 63.53%);
+ text-shadow: 0 0 8px #45f7ff;
+ font-weight: bold;
+}
+
+.corp_label_nastrum {
+ color: hsl(342.92, 100%, 74.51%);
+ text-shadow: 0 0 8px #ff7da2;
+ font-weight: bold;
+}
+
+.corp_label_omni_tv {
+ color: hsl(11.33, 79.89%, 64.9%);
+ text-shadow: 0 0 8px #ed795e;
+ font-weight: bold;
+}
+
+.corp_label_otolleys {
+ color: hsl(154.47, 72.31%, 74.51%);
+ text-shadow: 0 0 8px #8fedc5;
+ font-weight: bold;
+}
+
+.corp_label_black_dog {
+ color: hsl(222.86, 100%, 94.51%);
+ text-shadow: 0 0 8px #e3ebff;
+ font-weight: bold;
+}
+
+.corp_label_rainbow_inc {
+ color: hsl(313.97, 100%, 85.69%);
+ text-shadow: 0 0 8px #ffb6ee;
+ font-weight: bold;
+}
+
+.corp_label_tellus {
+ color: hsl(102.7, 100%, 57.84%);
+ text-shadow: 0 0 8px #66ff28;
+ font-weight: bold;
+}
+
+.corp_label_vesuvius {
+ color: hsl(61.82, 41.77%, 84.51%);
+ text-shadow: 0 0 8px #e7e8c7;
+ font-weight: bold;
+}
+
+.corp_label_young_smith {
+ color: hsl(96.67, 20.93%, 66.27%);
+ text-shadow: 0 0 8px #a5bb97;
+ font-weight: bold;
+}
+
.subtle {
color: #abc6ec;
}
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
index 4808c4e49a30..8076e62204f8 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
@@ -1289,6 +1289,144 @@ $border-width-px: $border-width * 1px;
font-weight: bold;
}
+.boxed_message .icon {
+ width: 1.5em;
+ height: 1.5em;
+ margin: 0;
+ padding: 0;
+
+ &.corplogo {
+ width: 300px !important;
+ height: 110px !important;
+ }
+}
+
+.corp_label_pentex {
+ color: hsl(317.78, 29.67%, 17.84%);
+ text-shadow: 0 0 8px #3b2033;
+ font-weight: bold;
+}
+
+.corp_label_ardus {
+ color: hsl(201.43, 16.28%, 66.27%);
+ text-shadow: 0 0 8px #9badb7;
+ font-weight: bold;
+}
+
+.corp_label_avalon {
+ color: hsl(245.96, 80.75%, 63.33%);
+ text-shadow: 0 0 8px #6556ed;
+ font-weight: bold;
+}
+
+.corp_label_circinus {
+ color: hsl(29.28, 100%, 75.49%);
+ text-shadow: 0 0 8px #ffbf82;
+ font-weight: bold;
+}
+
+.corp_label_consolidex {
+ color: hsl(290.51, 100%, 57.84%);
+ text-shadow: 0 0 8px #dd28ff;
+ font-weight: bold;
+}
+
+.corp_label_endron {
+ color: hsl(157.32, 97.62%, 16.47%);
+ text-shadow: 0 0 8px #015334;
+ font-weight: bold;
+}
+
+.corp_label_harold_harold {
+ color: hsl(8.97, 42.44%, 40.2%);
+ text-shadow: 0 0 8px #92483b;
+ font-weight: bold;
+}
+
+.corp_label_good_house {
+ color: hsl(285, 20.93%, 66.27%);
+ text-shadow: 0 0 8px #b297bb;
+ font-weight: bold;
+}
+
+.corp_label_hallahan {
+ color: hsl(257.45, 88.29%, 43.53%);
+ text-shadow: 0 0 8px #460dd1;
+ font-weight: bold;
+}
+
+.corp_label_herculean {
+ color: hsl(0, 100%, 53.14%);
+ text-shadow: 0 0 8px #ff1010;
+ font-weight: bold;
+}
+
+.corp_label_herricks {
+ color: hsl(285.51, 90.82%, 38.43%);
+ text-shadow: 0 0 8px #9009bb;
+ font-weight: bold;
+}
+
+.corp_label_king {
+ color: hsl(44.62, 53.92%, 57.45%);
+ text-shadow: 0 0 8px #cdaf58;
+ font-weight: bold;
+}
+
+.corp_label_megadon {
+ color: hsl(182.58, 100%, 63.53%);
+ text-shadow: 0 0 8px #45f7ff;
+ font-weight: bold;
+}
+
+.corp_label_nastrum {
+ color: hsl(342.92, 100%, 74.51%);
+ text-shadow: 0 0 8px #ff7da2;
+ font-weight: bold;
+}
+
+.corp_label_omni_tv {
+ color: hsl(11.33, 79.89%, 64.9%);
+ text-shadow: 0 0 8px #ed795e;
+ font-weight: bold;
+}
+
+.corp_label_otolleys {
+ color: hsl(154.47, 72.31%, 74.51%);
+ text-shadow: 0 0 8px #8fedc5;
+ font-weight: bold;
+}
+
+.corp_label_black_dog {
+ color: hsl(222.86, 100%, 94.51%);
+ text-shadow: 0 0 8px #e3ebff;
+ font-weight: bold;
+}
+
+.corp_label_rainbow_inc {
+ color: hsl(313.97, 100%, 85.69%);
+ text-shadow: 0 0 8px #ffb6ee;
+ font-weight: bold;
+}
+
+.corp_label_tellus {
+ color: hsl(102.7, 100%, 57.84%);
+ text-shadow: 0 0 8px #66ff28;
+ font-weight: bold;
+}
+
+.corp_label_vesuvius {
+ color: hsl(61.82, 41.77%, 84.51%);
+ text-shadow: 0 0 8px #e7e8c7;
+ font-weight: bold;
+}
+
+.corp_label_young_smith {
+ color: hsl(96.67, 20.93%, 66.27%);
+ text-shadow: 0 0 8px #a5bb97;
+ font-weight: bold;
+}
+
.subtle {
color: #000099;
}
diff --git a/tgui/packages/tgui-say/ChannelIterator.ts b/tgui/packages/tgui-say/ChannelIterator.ts
index 14fac7f285e9..67d40d9b399f 100644
--- a/tgui/packages/tgui-say/ChannelIterator.ts
+++ b/tgui/packages/tgui-say/ChannelIterator.ts
@@ -1,4 +1,4 @@
-export type Channel = 'Say' | 'Radio' | 'Me' | 'OOC' | 'Admin' | 'LOOC' | 'Do'; // DARKPACK EDIT, ORIGINAL: export type Channel = 'Say' | 'Radio' | 'Me' | 'OOC' | 'Admin';
+export type Channel = 'Say' | 'Radio' | 'Me' | 'OOC' | 'Admin' | 'LOOC' | 'Do'; // DARKPACK EDIT CHANGE - ORIGINAL: export type Channel = 'Say' | 'Radio' | 'Me' | 'OOC' | 'Admin';
/**
* ### ChannelIterator
@@ -8,9 +8,9 @@ export type Channel = 'Say' | 'Radio' | 'Me' | 'OOC' | 'Admin' | 'LOOC' | 'Do';
*/
export class ChannelIterator {
private index: number = 0;
- private readonly channels: Channel[] = ['Say', 'Radio', 'Me', 'Do', 'LOOC', 'OOC', 'Admin']; // DARKPACK EDIT, ORIGINAL: private readonly channels: Channel[] = ['Say', 'Radio', 'Me', 'OOC', 'Admin'];
+ private readonly channels: Channel[] = ['Say', 'Radio', 'Me', 'Do', 'LOOC', 'OOC', 'Admin']; // DARKPACK EDIT CHANGE - ORIGINAL: private readonly channels: Channel[] = ['Say', 'Radio', 'Me', 'OOC', 'Admin'];
private readonly blacklist: Channel[] = ['Admin'];
- private readonly quiet: Channel[] = ['OOC', 'LOOC', 'Admin']; // DARKPACK EDIT, ORIGINAL: private readonly quiet: Channel[] = ['OOC', 'Admin'];
+ private readonly quiet: Channel[] = ['OOC', 'LOOC', 'Admin']; // DARKPACK EDIT CHANGE - ORIGINAL: private readonly quiet: Channel[] = ['OOC', 'Admin'];
public next(): Channel {
if (this.blacklist.includes(this.channels[this.index])) {
diff --git a/tgui/packages/tgui/interfaces/JobSelection.tsx b/tgui/packages/tgui/interfaces/JobSelection.tsx
index c3500c833e4c..623b1ffcf7b3 100644
--- a/tgui/packages/tgui/interfaces/JobSelection.tsx
+++ b/tgui/packages/tgui/interfaces/JobSelection.tsx
@@ -202,7 +202,7 @@ export function JobSelection(props) {
<>
{shuttle_status && {shuttle_status}}
- It is currently {round_duration} into the night. {/* DARKPACK EDIT, ORIGINAL: It is currently {round_duration} into the shift. */}
+ It is currently {round_duration} into the night. {/* DARKPACK EDIT CHANGE - ORIGINAL: It is currently {round_duration} into the shift. */}
>
}
diff --git a/tgui/packages/tgui/interfaces/Orbit/index.tsx b/tgui/packages/tgui/interfaces/Orbit/index.tsx
index add7b6e7bd89..561f679f6c7a 100644
--- a/tgui/packages/tgui/interfaces/Orbit/index.tsx
+++ b/tgui/packages/tgui/interfaces/Orbit/index.tsx
@@ -16,7 +16,7 @@ import type { ViewMode } from './types';
export function Orbit(props) {
const [autoObserve, setAutoObserve] = useState(false);
const [bladeOpen, setBladeOpen] = useState(false);
- const [realNameDisplay, setRealNameDisplay] = useState(true); // DARKPACK EDIT, ORIGINAL: const [realNameDisplay, setRealNameDisplay] = useState(false);
+ const [realNameDisplay, setRealNameDisplay] = useState(true); // DARKPACK EDIT CHANGE - ORIGINAL: const [realNameDisplay, setRealNameDisplay] = useState(false);
const [searchQuery, setSearchQuery] = useState('');
const [viewMode, setViewMode] = useState(VIEWMODE.Health);
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/JobsPage.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/JobsPage.tsx
index e45208733d69..dae4f19b92ec 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/JobsPage.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/JobsPage.tsx
@@ -402,6 +402,7 @@ export function JobsPage() {
+
{
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/MainPage.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/MainPage.tsx
index 9806dec7946e..df6248910953 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/MainPage.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/MainPage.tsx
@@ -13,11 +13,11 @@ import {
Section,
Stack,
} from 'tgui-core/components';
-import { exhaustiveCheck } from 'tgui-core/exhaustive'; // DARKPACK EDIT ADDITION
+import { exhaustiveCheck } from 'tgui-core/exhaustive'; // DARKPACK EDIT ADD
import { classes } from 'tgui-core/react';
import { createSearch } from 'tgui-core/string';
import { CharacterPreview } from '../../common/CharacterPreview';
-import { PageButton } from '../components/PageButton'; // DARKPACK EDIT ADDITION
+import { PageButton } from '../components/PageButton'; // DARKPACK EDIT ADD
import { RandomizationButton } from '../components/RandomizationButton';
import { features } from '../preferences/features';
import {
@@ -35,9 +35,10 @@ import { useRandomToggleState } from '../useRandomToggleState';
import { useServerPrefs } from '../useServerPrefs';
import { DeleteCharacterPopup } from './DeleteCharacterPopup';
import { MultiNameInput, NameInput } from './names';
+import { VocalsInput, VoiceInput } from './darkpack_vocals'; // DARKPACK EDIT ADDITION
const CLOTHING_CELL_SIZE = 48;
-const CLOTHING_SIDEBAR_ROWS = 12; // DARKPACK EDIT, ORIGINAL: 9;
+const CLOTHING_SIDEBAR_ROWS = 12; // DARKPACK EDIT CHANGE - ORIGINAL: 9;
const CLOTHING_SELECTION_CELL_SIZE = 48;
const CLOTHING_SELECTION_WIDTH = 5.4;
@@ -353,7 +354,7 @@ type PreferenceListProps = {
randomizations: Record;
maxHeight: string;
children?: ReactNode;
- overrides?: Record; // DARKPACK EDIT ADDITION
+ overrides?: Record; // DARKPACK EDIT ADD
};
export function PreferenceList(props: PreferenceListProps) {
@@ -391,7 +392,7 @@ export function PreferenceList(props: PreferenceListProps) {
key={featureId}
label={feature.name}
tooltip={feature.description}
- tooltipPosition="right" // DARKPACK EDIT ADDITION - Swappable pref menus
+ tooltipPosition="right" // DARKPACK EDIT ADD - Swappable pref menus
verticalAlign="middle"
>
@@ -460,6 +461,7 @@ export function MainPage(props: MainPageProps) {
const [deleteCharacterPopupOpen, setDeleteCharacterPopupOpen] =
useState(false);
const [multiNameInputOpen, setMultiNameInputOpen] = useState(false);
+ const [vocalsInputOpen, setVocalsInputOpen] = useState(false); // DARKPACK EDIT ADDITION
const [randomToggleEnabled] = useRandomToggleState();
const [pendingConfirm, setPendingConfirm] = useState<(() => void) | null>(null); // DARKPACK EDIT ADD - for popups
@@ -503,7 +505,7 @@ export function MainPage(props: MainPageProps) {
delete nonContextualPreferences.random_name;
}
- // DARKPACK EDIT ADDITION BEGIN: SWAPPABLE PREF MENUS
+ // DARKPACK EDIT ADD START - SWAPPABLE PREF MENUS
enum PrefPage {
Visual, // The visual parts
Profile, // Flavor Text, Age, Records, PDA ringtone, etc
@@ -558,7 +560,7 @@ export function MainPage(props: MainPageProps) {
default:
exhaustiveCheck(currentPrefPage);
}
- // DARKPACK EDIT ADDITION END
+ // DARKPACK EDIT ADD END
return (
<>
@@ -579,6 +581,14 @@ export function MainPage(props: MainPageProps) {
names={data.character_preferences.names}
/>
)}
+ {/* DARKPACK EDIT ADDITION START */}
+ {vocalsInputOpen && (
+ setVocalsInputOpen(false)}
+ vocals={data.character_preferences.vocals}
+ />
+ )}
+ {/* DARKPACK EDIT ADDITION END */}
{deleteCharacterPopupOpen && (
+
+ {/* DARKPACK EDIT ADDITION START */}
+
+ {
+ setVocalsInputOpen(true);
+ }}
+ />
+
+ {/* DARKPACK EDIT ADDITION END */}
@@ -761,7 +781,7 @@ export function MainPage(props: MainPageProps) {
*/
// DARKPACK EDIT REMOVAL END
}
- {/* DARKPACK EDIT ADDITION BEGIN: Swappable pref menus */}
+ {/* DARKPACK EDIT ADD START - Swappable pref menus */}
- {/* DARKPACK EDIT ADDITION END: Swappable pref menus */}
+ {/* DARKPACK EDIT ADD END: Swappable pref menus */}
>
);
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/QuirksPage.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/QuirksPage.tsx
index a88883149ec1..865a12d44847 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/QuirksPage.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/QuirksPage.tsx
@@ -343,7 +343,7 @@ function QuirkPage() {
}
});
- const balance = data.freebie_points ?? 0; // DARKPACK EDIT CHANGE - Original : let balance = -data.default_quirk_balance;
+ const balance = data.freebie_points ?? 0; // DARKPACK EDIT CHANGE - ORIGINAL: let balance = -data.default_quirk_balance;
let positiveQuirks = 0;
for (const selectedQuirkName of selectedQuirks) {
@@ -356,7 +356,7 @@ function QuirkPage() {
positiveQuirks += 1;
}
- //balance += selectedQuirk.value; DARKPACK EDIT REMOVAL - Merits/Flaws
+ //balance += selectedQuirk.value; DARKPACK EDIT REMOVAL - MERITS_FLAWS
}
function getReasonToNotAdd(quirkName: string) {
@@ -369,11 +369,11 @@ function QuirkPage() {
return 'You need a negative quirk to balance this out!';
}
}
- //DARKPACK EDIT ADD - Merits/Flaws
+ // DARKPACK EDIT ADD - MERITS_FLAWS
if (balance - quirk.value < 0) {
return 'You need more freebie points to take this quirk!';
}
- //DARKPACK EDIT ADD - Merits/Flaws
+ // DARKPACK EDIT ADD - MERITS_FLAWS
const selectedQuirkNames = selectedQuirks.map((quirkKey) => {
return quirkInfo[quirkKey].name;
@@ -393,8 +393,8 @@ function QuirkPage() {
}
}
}
- if (data.clan_disallowed_quirks.includes(quirk.name)) { // DARKPACK EDIT ADD - MERITS/FLAWS
- return 'This quirk is incompatible with your selected clan.'; // DARKPACK EDIT END - MERITS/FLAWS
+ if (data.clan_disallowed_quirks.includes(quirk.name)) { // DARKPACK EDIT ADD - MERITS_FLAWS
+ return 'This quirk is incompatible with your selected clan.'; // DARKPACK EDIT END - MERITS_FLAWS
}
if (data.splat_disallowed_quirks.includes(quirk.name)) { // DARKPACK EDIT CHANGE - SPLATS
return 'This quirk is incompatible with your selected splats.'; // DARKPACK EDIT CHANGE - SPLATS
@@ -492,14 +492,14 @@ function QuirkPage() {
{(
- // DARKPACK EDIT CHANGE START -- Removed pointsEnabled ? checks
- Freebie Points // DARKPACK EDIT CHANGE -- Changed 'Quirk Balance' to 'Freebie Points'
+ // DARKPACK EDIT CHANGE START - (Removed pointsEnabled ? checks)
+ Freebie Points // DARKPACK EDIT CHANGE - (Changed 'Quirk Balance' to 'Freebie Points')
)}
{(
{balance}
- // DARKPACK EDIT CHANGE END -- Removed pointsEnabled ? checks
+ // DARKPACK EDIT CHANGE END
)}
@@ -549,7 +549,7 @@ function QuirkPage() {
}
export function QuirkPersonalityPage() {
- const [contentPage, setContentPage] = useState<'quirks'>( // DARKPACK EDIT, ORIGINAL: const [contentPage, setContentPage] = useState<'quirks' | 'personality'>(
+ const [contentPage, setContentPage] = useState<'quirks'>( // DARKPACK EDIT CHANGE - ORIGINAL: const [contentPage, setContentPage] = useState<'quirks' | 'personality'>(
'quirks',
);
@@ -588,9 +588,9 @@ export function QuirkPersonalityPage() {
{contentPage === 'personality' ? : }
// DARKPACK EDIT REMOVAL END */}
- {/* DARKPACK EDIT ADDITION START */}
+ {/* DARKPACK EDIT ADD START */}
- {/* DARKPACK EDIT ADDITION END */}
+ {/* DARKPACK EDIT ADD END */}
);
}
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/darkpack_vocals.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/darkpack_vocals.tsx
new file mode 100644
index 000000000000..530fe8295206
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/darkpack_vocals.tsx
@@ -0,0 +1,138 @@
+import { filter } from 'es-toolkit/compat';
+import {
+ Box,
+ Button,
+ FitText,
+ Icon,
+ Modal,
+ Section,
+ Stack,
+} from 'tgui-core/components';
+
+import { getRandomization, PreferenceList } from './MainPage';
+
+type VocalsProps = {
+ handleClose: () => void;
+ vocals: Record;
+};
+
+type VocalFeature = {
+ id: string;
+ label: string;
+ type: string;
+};
+
+const vocalFeatures: VocalFeature[] = [
+ { id: 'blooper_choice', label: 'Voice Type', type: 'string' },
+ { id: 'blooper_speed', label: 'Blooper Speed', type: 'number' },
+ { id: 'blooper_pitch', label: 'Blooper Pitch', type: 'number' },
+ { id: 'blooper_pitch_range', label: 'Blooper Range', type: 'number' },
+];
+
+type FeatureValueInputProps = {
+ feature: VocalFeature;
+ value: string | number | boolean;
+};
+
+function getCorrespondingPreferences(
+ customization_options: string[],
+ relevant_preferences: Record,
+) {
+ return Object.fromEntries(
+ filter(Object.entries(relevant_preferences), ([key, value]) =>
+ customization_options.includes(key),
+ ),
+ );
+}
+
+function FeatureValueInput({ feature, value }: FeatureValueInputProps) {
+ return (
+
+
+
+ );
+}
+
+export function VocalsInput(props: VocalsProps) {
+ const { vocals, handleClose } = props;
+
+ return (
+
+
+
+ Close
+
+ }
+ >
+
+ {vocalFeatures.map((feature) => {
+ if (vocals === undefined) return null;
+ const value = vocals[feature.id];
+ return (
+
+
+
+ );
+ })}
+
+
+
+
+ );
+}
+
+type VoiceInputProps = {
+ openVocalsInput: () => void;
+};
+
+export function VoiceInput(props: VoiceInputProps) {
+ return (
+
+ );
+}
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/names.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/names.tsx
index ceced01d8a07..32237601aa0f 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/names.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/names.tsx
@@ -181,6 +181,7 @@ export function NameInput(props: NameInputProps) {
{/* We only know other names when the server tells us */}
{data?.names && (
+ {/* // DARKPACK EDIT REMOVAL START
+ // DARKPACK EDIT REMOVAL END */}
)}
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/base.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/base.tsx
index 3e67664c7f3a..a5dd91ae9ebd 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/base.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/base.tsx
@@ -15,7 +15,7 @@ import {
NumberInput,
Slider,
Stack,
- TextArea, // DARKPACK EDIT ADDITION
+ TextArea, // DARKPACK EDIT ADD
} from 'tgui-core/components';
import type { BooleanLike } from 'tgui-core/react';
@@ -267,7 +267,7 @@ export function FeatureShortTextInput(
);
}
-// DARKPACK EDIT ADDITION START - FLAVOR TEXT
+// DARKPACK EDIT ADD START - FLAVOR TEXT
export const FeatureTextInput = (
props: FeatureValueProps,
) => {
@@ -284,7 +284,7 @@ export const FeatureTextInput = (
/>
);
};
-// DARKPACK EDIT ADDITION END
+// DARKPACK EDIT ADD END
export const FeatureExternalInput = (props: FeatureValueProps,) => {
const {featureId, value } = props;
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/darkpack_blooper.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/darkpack_blooper.tsx
new file mode 100644
index 000000000000..029c4388e75c
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/darkpack_blooper.tsx
@@ -0,0 +1,59 @@
+// THIS IS A DARKPACK UI FILE
+import { useBackend } from 'tgui/backend';
+import { Button, Stack } from 'tgui-core/components';
+import {
+ type FeatureChoiced,
+ type FeatureChoicedServerData,
+ type FeatureNumeric,
+ FeatureSliderInput,
+ type FeatureValueProps,
+} from '../base';
+import { FeatureDropdownInput } from '../dropdowns';
+
+const FeatureBlooperDropdownInput = (
+ props: FeatureValueProps,
+) => {
+ const { act, data } = useBackend();
+
+ return (
+
+
+
+
+
+
+
+ );
+};
+
+export const blooper_choice: FeatureChoiced = {
+ name: 'Character Voice',
+ component: FeatureBlooperDropdownInput,
+};
+
+export const blooper_speed: FeatureNumeric = {
+ name: 'Character Voice Speed %',
+ description: 'Lower number, slower voice. Higher number, faster voice.',
+ component: FeatureSliderInput,
+};
+
+export const blooper_pitch: FeatureNumeric = {
+ name: 'Character Voice Pitch %',
+ description: 'Lower number, deeper pitch. Higher number, higher pitch.',
+ component: FeatureSliderInput,
+};
+
+export const blooper_pitch_range: FeatureNumeric = {
+ name: 'Character Voice Range %',
+ description:
+ 'Lower number, less pitch range. Higher number, more pitch range.',
+ component: FeatureSliderInput,
+};
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkpack_blooper.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkpack_blooper.tsx
new file mode 100644
index 000000000000..cb7a902b426c
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkpack_blooper.tsx
@@ -0,0 +1,16 @@
+// THIS IS A DARKPACK UI FILE
+import { CheckboxInput, type FeatureToggle, FeatureSliderInput, type FeatureNumeric } from '../base';
+
+export const blooper_hear: FeatureToggle = {
+ name: 'Enable hearing vocal bloopers',
+ category: 'SOUND',
+ description: `When enabled, allows you to hear other character's speech sounds.`,
+ component: CheckboxInput,
+};
+
+export const sound_blooper_volume: FeatureNumeric = {
+ name: 'Vocal Blooper Volume',
+ category: 'SOUND',
+ description: 'The volume that the Vocal Barks sounds will play at.',
+ component: FeatureSliderInput,
+};
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkpack_dice.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkpack_dice.tsx
deleted file mode 100644
index 86fc16261107..000000000000
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkpack_dice.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import type { Feature } from '../base';
-import { FeatureDropdownInput } from '../dropdowns';
-
-export const dice_output: Feature = {
- name: 'Dice output',
- category: 'GAMEPLAY',
- description: 'How the results of storyteller dice rolls are output to you.',
- component: FeatureDropdownInput,
-};
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/types.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/types.ts
index 9fc8a06520f5..1a16498b64d6 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/types.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/types.ts
@@ -191,6 +191,7 @@ export type CharacterPreferencesData = {
manually_rendered_features: Record;
names: Record;
+ vocals: Record; // DARKPACK EDIT ADD - BLOOPERS
misc: {
gender: Gender;
diff --git a/tgui/packages/tgui/styles/interfaces/PreferencesMenu.scss b/tgui/packages/tgui/styles/interfaces/PreferencesMenu.scss
index d7830cc3972f..dc52ec8de8cf 100644
--- a/tgui/packages/tgui/styles/interfaces/PreferencesMenu.scss
+++ b/tgui/packages/tgui/styles/interfaces/PreferencesMenu.scss
@@ -30,7 +30,8 @@ $department_map: (
'Citizen': var(--color-light-grey),
'City_Services': var(--color-white),
'Garou_Nation': var(--color-olive),
- 'Pentex': var(--color-green), // DARKPACK EDIT ADD END
+ 'Pentex': var(--color-green),
+ 'Society_of_Leopold': var(--color-yellow), // DARKPACK EDIT ADD END
);
.ChoicedSelection {
diff --git a/tools/UpdatePaths/Scripts/DarkPack/999_door_helpers.txt b/tools/UpdatePaths/Scripts/DarkPack/545_door_helpers.txt
similarity index 100%
rename from tools/UpdatePaths/Scripts/DarkPack/999_door_helpers.txt
rename to tools/UpdatePaths/Scripts/DarkPack/545_door_helpers.txt
diff --git a/tools/UpdatePaths/Scripts/DarkPack/908_artifact_refactor.txt b/tools/UpdatePaths/Scripts/DarkPack/908_artifact_refactor.txt
new file mode 100644
index 000000000000..7fa52e8c6d76
--- /dev/null
+++ b/tools/UpdatePaths/Scripts/DarkPack/908_artifact_refactor.txt
@@ -0,0 +1 @@
+/obj/item/vtm_artifact/@SUBTYPES : /obj/item/occult_artifact/vampire/@SUBTYPES {@OLD}
diff --git a/tools/build/build.ts b/tools/build/build.ts
index 52cba46a518c..76bcac1b91f2 100644
--- a/tools/build/build.ts
+++ b/tools/build/build.ts
@@ -180,7 +180,7 @@ export const DmTarget = new Juke.Target({
'interface/**',
'sound/**',
'tgui/public/tgui.html',
- 'modular_darkpack/**', // DARKPACK EDIT ADDITION
+ 'modular_darkpack/**', // DARKPACK EDIT ADD
`${DME_NAME}.dme`,
NamedVersionFile,
],
diff --git a/tools/define_sanity/check.py b/tools/define_sanity/check.py
index 4b3b59b83d63..02b8c6cea729 100644
--- a/tools/define_sanity/check.py
+++ b/tools/define_sanity/check.py
@@ -4,7 +4,7 @@
import re
import sys
-parent_directory = "**/*.dm" # DARKPACK EDIT, ORIGINAL: parent_directory = "code/**/*.dm"
+parent_directory = "**/*.dm" # DARKPACK EDIT CHANGE - ORIGINAL: parent_directory = "code/**/*.dm"
output_file_name = "define_sanity_output.txt"
how_to_fix_message = "Please #undef the above defines or remake them as global defines in the code/__DEFINES directory."
@@ -36,8 +36,8 @@ def post_error(define_name, file, github_error_style):
"code/_globalvars/*.dm",
# TGS files come from another repository so lets not worry about them.
"code/modules/tgs/**/*.dm",
- "tools/**/*.dm", ## DARKPACK EDIT ADDITION
- "DMCompiler_linux-x64/**/*.dm" ## DARKPACK EDIT ADDITION
+ "tools/**/*.dm", ## DARKPACK EDIT ADD
+ "DMCompiler_linux-x64/**/*.dm" ## DARKPACK EDIT ADD
]
define_regex = re.compile(r"(\s+)?#define\s?([A-Z0-9_]+)\(?(.+)\)?")
diff --git a/tools/deploy.sh b/tools/deploy.sh
index facbdd0491c3..3df61e0e54b1 100755
--- a/tools/deploy.sh
+++ b/tools/deploy.sh
@@ -23,12 +23,12 @@ if [ -d ".git" ]; then
mkdir -p $1/.git/logs
cp -r .git/logs/* $1/.git/logs/
fi
-# DARKPACK EDIT ADDITION START - Get all the .dmis from modular_darkpack
+# DARKPACK EDIT ADD START - Get all the .dmis from modular_darkpack
mkdir -p \
$1/modular_darkpack \
find modular_darkpack/ -name \*.dmi -exec cp --parents {} $1 \;
-# DARKPACK EDIT ADDITION END
+# DARKPACK EDIT ADD END
cp tgstation.dmb tgstation.rsc $1/
cp -r _maps/* $1/_maps/