G2ar4sd@Ie9CpfP~m{
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
literal 0
HcmV?d00001
diff --git a/tgstation.dme b/tgstation.dme
index d56d8489cc..b557a75627 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -415,6 +415,7 @@
#include "code\datums\components\stationloving.dm"
#include "code\datums\components\summoning.dm"
#include "code\datums\components\swarming.dm"
+#include "code\datums\components\tackle.dm"
#include "code\datums\components\tactical.dm"
#include "code\datums\components\thermite.dm"
#include "code\datums\components\uplink.dm"
@@ -1722,6 +1723,7 @@
#include "code\modules\clothing\gloves\color.dm"
#include "code\modules\clothing\gloves\miscellaneous.dm"
#include "code\modules\clothing\gloves\ring.dm"
+#include "code\modules\clothing\gloves\tacklers.dm"
#include "code\modules\clothing\head\_head.dm"
#include "code\modules\clothing\head\beanie.dm"
#include "code\modules\clothing\head\cit_hats.dm"
From 1ffea14ee88288e99c24ab97436f03252a0ff0be Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Thu, 9 Apr 2020 19:53:14 +0100
Subject: [PATCH 012/131] makes descriptions work
---
code/modules/food_and_drinks/food/snacks.dm | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 92f8d104a6..889ec42185 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -153,6 +153,12 @@ All foods are distributed among various categories. Use common sense.
/obj/item/reagent_containers/food/snacks/examine(mob/user)
. = ..()
+ if(food_quality >= 70)
+ . += "It is of a high quality."
+ else
+ if(food_quality <= 30)
+ . += "It is of a low quality."
+
if(bitecount == 0)
return
else if(bitecount == 1)
@@ -162,13 +168,6 @@ All foods are distributed among various categories. Use common sense.
else
. += "[src] was bitten multiple times!"
- //examine text for quality
- if(food_quality >= 70)
- . += "It is of a high quality."
- else
- if(food_quality <= 30)
- . += "It is of a low quality."
-
/obj/item/reagent_containers/food/snacks/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/storage))
From 951732c36132490ac7b6e9f0813b1149300bac7d Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Thu, 9 Apr 2020 20:12:02 +0100
Subject: [PATCH 013/131] make secret sauce work on customizables
---
code/modules/reagents/chemistry/reagents/food_reagents.dm | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index c555609992..cf6c3789ec 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -782,7 +782,11 @@
if(reac_volume >= 1 && istype(O, /obj/item/reagent_containers/food))
var/obj/item/reagent_containers/food/splashed_food = O
splashed_food.adjust_food_quality(100)
-
+ // if it's a customisable food, we need to edit its total quality too, to prevent its quality resetting from adding more ingredients!
+ if(istype(O, obj/item/reagent_containers/food/customizable))
+ var/obj/item/reagent_containers/food/customizable/splashed_custom_food = O
+ splashed_custom_food.total_quality += 10000
+r
/datum/reagent/consumable/char
name = "Char"
description = "Essence of the grill. Has strange properties when overdosed."
From 4c4e11037522b6eb04dd635b6d354145bedb3d4a Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Thu, 9 Apr 2020 20:16:55 +0100
Subject: [PATCH 014/131] imagine making it compile
---
code/modules/reagents/chemistry/reagents/food_reagents.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index cf6c3789ec..654d69a599 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -783,8 +783,8 @@
var/obj/item/reagent_containers/food/splashed_food = O
splashed_food.adjust_food_quality(100)
// if it's a customisable food, we need to edit its total quality too, to prevent its quality resetting from adding more ingredients!
- if(istype(O, obj/item/reagent_containers/food/customizable))
- var/obj/item/reagent_containers/food/customizable/splashed_custom_food = O
+ if(istype(O, /obj/item/reagent_containers/food/snacks/customizable))
+ var/obj/item/reagent_containers/food/snacks/customizable/splashed_custom_food = O
splashed_custom_food.total_quality += 10000
r
/datum/reagent/consumable/char
From ea8d43281ebf2c788cfe43446854810598de504d Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Fri, 10 Apr 2020 03:21:06 +0100
Subject: [PATCH 015/131] swap & for &&
woops
Co-Authored-By: Lin
---
code/modules/food_and_drinks/food.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm
index beaf5ed1ba..203eb3eef6 100644
--- a/code/modules/food_and_drinks/food.dm
+++ b/code/modules/food_and_drinks/food.dm
@@ -40,7 +40,7 @@
to_chat(H,"That didn't taste very good...")
H.adjust_disgust(11 + 15 * fraction)
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food)
- else if((foodtype & H.dna.species.liked_food & food_quality >= 50) || food_quality >= 70) //you like food of high quality, and food of regular quality you have a preference for
+ else if(((foodtype & H.dna.species.liked_food) && food_quality >= 50) || food_quality >= 70) //you like food of high quality, and food of regular quality you have a preference for
to_chat(H,"I love this taste!")
H.adjust_disgust(-5 + (-2.5 * food_quality/50) + -2.5 * fraction)
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food)
@@ -52,4 +52,4 @@
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast)
last_check_time = world.time
-#undef STOP_SERVING_BREAKFAST
\ No newline at end of file
+#undef STOP_SERVING_BREAKFAST
From f481be14968a80330ea50debef067a91563d369e Mon Sep 17 00:00:00 2001
From: Artur
Date: Fri, 10 Apr 2020 20:53:28 +0300
Subject: [PATCH 016/131] Makin stuff nice and dandy
---
code/__DEFINES/dcs/signals.dm | 2 +-
code/datums/components/tackle.dm | 40 ++++++++-----------
.../antagonists/bloodsucker/powers/lunge.dm | 28 ++++++++-----
code/modules/mob/living/carbon/carbon.dm | 4 +-
.../mob/living/carbon/carbon_defines.dm | 1 +
5 files changed, 41 insertions(+), 34 deletions(-)
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index 70c2425f48..5f08bd21a1 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -214,7 +214,7 @@
// /mob/living/carbon signals
#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity))
#define COMSIG_CARBON_IDENTITY_TRANSFERRED_TO "carbon_id_transferred_to" //from datum/dna/transfer_identity(): (datum/dna, transfer_SE)
-
+#define COMSIG_CARBON_TACKLED "carbon_tackled" //sends from tackle.dm on tackle completion
// /mob/living/simple_animal/hostile signals
#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget"
#define COMPONENT_HOSTILE_NO_ATTACK 1
diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm
index 28dd469041..17d2773b60 100644
--- a/code/datums/components/tackle.dm
+++ b/code/datums/components/tackle.dm
@@ -14,9 +14,6 @@
*/
/datum/component/tackler
dupe_mode = COMPONENT_DUPE_UNIQUE
-
- ///If we're currently tackling or are on cooldown. Actually, shit, if I use this to handle cooldowns, then getting thrown by something while on cooldown will count as a tackle..... whatever, i'll fix that next commit
- var/tackling = TRUE
///How much stamina it takes to launch a tackle
var/stamina_cost
///Launching a tackle calls Knockdown on you for this long, so this is your cooldown. Once you stand back up, you can tackle again.
@@ -43,14 +40,15 @@
src.skill_mod = skill_mod
src.min_distance = min_distance
- var/mob/P = parent
+ var/mob/living/carbon/P = parent
to_chat(P, "You are now able to launch tackles! You can do so by activating throw intent, and clicking on your target with an empty hand.")
-
+ P.tackling = TRUE
addtimer(CALLBACK(src, .proc/resetTackle), base_knockdown, TIMER_STOPPABLE)
/datum/component/tackler/Destroy()
- var/mob/P = parent
+ var/mob/living/carbon/P = parent
to_chat(P, "You can no longer tackle.")
+ P.tackling = FALSE
..()
/datum/component/tackler/RegisterWithParent()
@@ -82,12 +80,12 @@
to_chat(user, "You must be standing to tackle!")
return
- if(tackling)
+ if(user.tackling)
to_chat(user, "You're not ready to tackle!")
return
- if(user.has_movespeed_modifier(MOVESPEED_ID_SHOVE)) // can't tackle if you just got shoved
- to_chat(user, "You're too off balance to tackle!")
+ if(user.has_status_effect(STATUS_EFFECT_TASED)) // can't tackle if you just got shoved
+ to_chat(user, "You cant tackle while you are tased!")
return
user.face_atom(A)
@@ -96,7 +94,7 @@
if(modifiers["alt"] || modifiers["shift"] || modifiers["ctrl"] || modifiers["middle"])
return
- tackling = TRUE
+ user.tackling = TRUE
RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/checkObstacle)
playsound(user, 'sound/weapons/thudswoosh.ogg', 40, TRUE, -1)
@@ -136,7 +134,7 @@
* Finally, we return a bitflag to [COMSIG_MOVABLE_IMPACT] that forces the hitpush to false so that we don't knock them away.
*/
/datum/component/tackler/proc/sack(mob/living/carbon/user, atom/hit)
- if(!tackling || !tackle)
+ if(!user.tackling || !tackle)
return
if(!iscarbon(hit))
@@ -149,13 +147,12 @@
var/mob/living/carbon/human/S = user
var/roll = rollTackle(target)
- tackling = FALSE
+ user.tackling = FALSE
switch(roll)
if(-INFINITY to -5)
user.visible_message("[user] botches [user.p_their()] tackle and slams [user.p_their()] head into [target], knocking [user.p_them()]self silly!", "You botch your tackle and slam your head into [target], knocking yourself silly!", target)
to_chat(target, "[user] botches [user.p_their()] tackle and slams [user.p_their()] head into you, knocking [user.p_them()]self silly!")
-
user.Paralyze(30)
var/obj/item/bodypart/head/hed = user.get_bodypart(BODY_ZONE_HEAD)
if(hed)
@@ -165,11 +162,8 @@
if(-4 to -2) // glancing blow at best
user.visible_message("[user] lands a weak tackle on [target], briefly knocking [target.p_them()] off-balance!", "You land a weak tackle on [target], briefly knocking [target.p_them()] off-balance!", target)
to_chat(target, "[user] lands a weak tackle on you, briefly knocking you off-balance!")
-
user.Knockdown(30)
- if(ishuman(target) && !T.has_movespeed_modifier(MOVESPEED_ID_SHOVE))
- T.add_movespeed_modifier(MOVESPEED_ID_SHOVE, multiplicative_slowdown = SHOVE_SLOWDOWN_STRENGTH) // maybe define a slightly more severe/longer slowdown for this
- addtimer(CALLBACK(T, /mob/living/carbon/human/proc/clear_shove_slowdown), SHOVE_SLOWDOWN_LENGTH)
+ target.apply_status_effect(STATUS_EFFECT_TASED_WEAK, 6 SECONDS)
if(-1 to 0) // decent hit, both parties are about equally inconvenienced
user.visible_message("[user] lands a passable tackle on [target], sending them both tumbling!", "You land a passable tackle on [target], sending you both tumbling!", target)
@@ -183,7 +177,6 @@
if(1 to 2) // solid hit, tackler has a slight advantage
user.visible_message("[user] lands a solid tackle on [target], knocking them both down hard!", "You land a solid tackle on [target], knocking you both down hard!", target)
to_chat(target, "[user] lands a solid tackle on you, knocking you both down hard!")
-
target.adjustStaminaLoss(30)
target.Paralyze(5)
user.Knockdown(10)
@@ -192,8 +185,8 @@
if(3 to 4) // really good hit, the target is definitely worse off here. Without positive modifiers, this is as good a tackle as you can land
user.visible_message("[user] lands an expert tackle on [target], knocking [target.p_them()] down hard while landing on [user.p_their()] feet with a passive grip!", "You land an expert tackle on [target], knocking [target.p_them()] down hard while landing on your feet with a passive grip!", target)
to_chat(target, "[user] lands an expert tackle on you, knocking you down hard and maintaining a passive grab!")
-
user.SetKnockdown(0)
+ user.set_resting(FALSE, TRUE, FALSE)
user.forceMove(get_turf(target))
target.adjustStaminaLoss(40)
target.Paralyze(5)
@@ -205,8 +198,8 @@
if(5 to INFINITY) // absolutely BODIED
user.visible_message("[user] lands a monster tackle on [target], knocking [target.p_them()] senseless and applying an aggressive pin!", "You land a monster tackle on [target], knocking [target.p_them()] senseless and applying an aggressive pin!", target)
to_chat(target, "[user] lands a monster tackle on you, knocking you senseless and aggressively pinning you!")
-
user.SetKnockdown(0)
+ user.set_resting(FALSE, TRUE, FALSE)
user.forceMove(get_turf(target))
target.adjustStaminaLoss(40)
target.Paralyze(5)
@@ -215,7 +208,7 @@
S.dna.species.grab(S, T)
S.setGrabState(GRAB_AGGRESSIVE)
-
+ SEND_SIGNAL(user, COMSIG_CARBON_TACKLED, "tackle completed")
return COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH
/**
@@ -405,7 +398,8 @@
/datum/component/tackler/proc/resetTackle()
- tackling = FALSE
+ var/mob/living/carbon/P = parent
+ P.tackling = FALSE
QDEL_NULL(tackle)
UnregisterSignal(parent, COMSIG_MOVABLE_MOVED)
@@ -441,7 +435,7 @@
///Check to see if we hit a table, and if so, make a big mess!
/datum/component/tackler/proc/checkObstacle(mob/living/carbon/owner)
- if(!tackling)
+ if(!owner.tackling)
return
var/turf/T = get_turf(owner)
diff --git a/code/modules/antagonists/bloodsucker/powers/lunge.dm b/code/modules/antagonists/bloodsucker/powers/lunge.dm
index e1e8f4363a..d40627f493 100644
--- a/code/modules/antagonists/bloodsucker/powers/lunge.dm
+++ b/code/modules/antagonists/bloodsucker/powers/lunge.dm
@@ -2,27 +2,37 @@
/datum/action/bloodsucker/lunge
name = "Predatory Lunge"
- desc = "Spring at your target and aggressively grapple them without warning. Attacks from concealment or the rear may even knock them down."
+ desc = "Prepare the strenght to grapple your prey."
button_icon_state = "power_lunge"
bloodcost = 10
cooldown = 30
bloodsucker_can_buy = TRUE
warn_constant_cost = TRUE
amToggle = TRUE
+ var/leap_skill_mod = 5
+
+/datum/action/bloodsucker/lunge/New()
+ . = ..()
+ RegisterSignal(owner, COMSIG_CARBON_TACKLED, .proc/Delayed_DeactivatePower)
/datum/action/bloodsucker/lunge/ActivatePower()
var/mob/living/user = owner
var/datum/antagonist/bloodsucker/B = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
- user.LoadComponent(/datum/component/tackler, stamina_cost = 50, base_knockdown = 3 SECONDS, range = 4, speed = 0.8, skill_mod = 5, min_distance = 2)
+ var/datum/component/tackler/T = user.LoadComponent(/datum/component/tackler)
+ T.stamina_cost = 50
+ T.base_knockdown = 3 SECONDS
+ T.range = 4
+ T.speed = 0.8
+ T.skill_mod = 5
+ T.min_distance = 2
active = TRUE
- while(B && ContinueActive(user) && CHECK_MOBILITY(user, MOBILITY_STAND))
+ while(B && ContinueActive(user))
B.AddBloodVolume(-0.1)
sleep(5)
-
-/datum/action/bloodsucker/lunge/ContinueActive(mob/living/user)
- return ..()
+
+/datum/action/bloodsucker/lunge/proc/Delayed_DeactivatePower()
+ addtimer(CALLBACK(src, .proc/DeactivatePower), 1 SECONDS, TIMER_UNIQUE)
/datum/action/bloodsucker/lunge/DeactivatePower(mob/living/user = owner)
- ..() // activate = FALSE
- var/datum/component/tackler
- tackler.RemoveComponent()
+ . = ..()
+ qdel(user.GetComponent(/datum/component/tackler))
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index cb3833b7f6..dcaa1e5b8c 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -98,6 +98,8 @@
/mob/living/carbon/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
. = ..()
var/hurt = TRUE
+ if(src.GetComponent(/datum/component/tackler))
+ return
if(throwingdatum?.thrower && iscyborg(throwingdatum.thrower))
var/mob/living/silicon/robot/R = throwingdatum.thrower
if(!R.emagged)
@@ -110,7 +112,7 @@
var/mob/living/carbon/victim = hit_atom
if(victim.movement_type & FLYING)
return
- if(hurt && !GetComponent(/datum/component/tackler))
+ if(hurt)
victim.take_bodypart_damage(10)
take_bodypart_damage(10)
victim.DefaultCombatKnockdown(20)
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index 689ab56842..15413f76d4 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -63,3 +63,4 @@
var/damageoverlaytemp = 0
var/drunkenness = 0 //Overall drunkenness - check handle_alcohol() in life.dm for effects
+ var/tackling = FALSE //Whether or not we are tackling, this will prevent the knock into effects for carbons
From 38d1634e13905096dac34764da7026822901c286 Mon Sep 17 00:00:00 2001
From: Artur
Date: Fri, 10 Apr 2020 21:07:15 +0300
Subject: [PATCH 017/131] Weh
---
code/datums/components/tackle.dm | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm
index 17d2773b60..0af2d8f78c 100644
--- a/code/datums/components/tackle.dm
+++ b/code/datums/components/tackle.dm
@@ -168,7 +168,6 @@
if(-1 to 0) // decent hit, both parties are about equally inconvenienced
user.visible_message("[user] lands a passable tackle on [target], sending them both tumbling!", "You land a passable tackle on [target], sending you both tumbling!", target)
to_chat(target, "[user] lands a passable tackle on you, sending you both tumbling!")
-
target.adjustStaminaLoss(stamina_cost)
target.Paralyze(5)
user.Knockdown(20)
@@ -205,8 +204,8 @@
target.Paralyze(5)
target.Knockdown(30)
if(ishuman(target) && ishuman(user))
- S.dna.species.grab(S, T)
- S.setGrabState(GRAB_AGGRESSIVE)
+ target.grabbedby(user)
+ target.grippedby(user, instant = TRUE) //instant aggro grab
SEND_SIGNAL(user, COMSIG_CARBON_TACKLED, "tackle completed")
return COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH
From e02439396266570b1e64fe2d4b41148c2c0a5526 Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Mon, 13 Apr 2020 17:12:40 +0100
Subject: [PATCH 018/131] secret sauce doesn't give a second moodlet because
that's dumb
---
code/modules/reagents/chemistry/reagents/food_reagents.dm | 3 ---
1 file changed, 3 deletions(-)
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 654d69a599..b3ca6a720d 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -32,8 +32,6 @@
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "quality_drink", /datum/mood_event/quality_verygood)
if (DRINK_FANTASTIC)
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "quality_drink", /datum/mood_event/quality_fantastic)
- if (FOOD_AMAZING)
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "quality_food", /datum/mood_event/amazingtaste)
return ..()
/datum/reagent/consumable/nutriment
@@ -772,7 +770,6 @@
nutriment_factor = 2 * REAGENTS_METABOLISM
color = "#792300"
taste_description = "indescribable"
- quality = FOOD_AMAZING
taste_mult = 100
can_synth = FALSE
pH = 6.1
From 1e8fffbf0b1c24c5f77ea8907ea9479749d0e839 Mon Sep 17 00:00:00 2001
From: Putnam
Date: Mon, 13 Apr 2020 16:47:43 -0700
Subject: [PATCH 019/131] Replaced all the extraneous flags with bitflags
---
code/__DEFINES/voreconstants.dm | 13 +++
.../objects/items/devices/dogborg_sleeper.dm | 10 +-
code/modules/client/preferences.dm | 5 +-
code/modules/client/preferences_savefile.dm | 45 +++++---
code/modules/holodeck/holo_effect.dm | 4 +-
code/modules/mob/living/carbon/human/dummy.dm | 1 -
.../carbon/human/species_types/furrypeople.dm | 6 +-
code/modules/mob/living/login.dm | 2 +-
code/modules/mob/living/silicon/silicon.dm | 2 +-
.../living/simple_animal/hostile/hostile.dm | 5 +-
.../hostile/megafauna/dragon_vore.dm | 1 -
.../hostile/megafauna/megafauna.dm | 2 +-
.../living/simple_animal/simple_animal_vr.dm | 6 +-
.../simple_animal/simplemob_vore_values.dm | 102 ++++--------------
code/modules/vore/eating/belly_obj.dm | 16 +--
code/modules/vore/eating/bellymodes.dm | 12 +--
code/modules/vore/eating/living.dm | 42 ++++----
code/modules/vore/eating/vorepanel.dm | 62 +++++------
18 files changed, 146 insertions(+), 190 deletions(-)
diff --git a/code/__DEFINES/voreconstants.dm b/code/__DEFINES/voreconstants.dm
index 9c91de0be2..d2eb034813 100644
--- a/code/__DEFINES/voreconstants.dm
+++ b/code/__DEFINES/voreconstants.dm
@@ -7,6 +7,19 @@
#define DM_ABSORB "Absorb"
#define DM_UNABSORB "Un-absorb"
+#define DIGESTABLE (1<<0)
+#define SHOW_VORE_PREFS (1<<1)
+#define DEVOURABLE (1<<2)
+#define FEEDING (1<<3)
+#define NO_VORE (1<<4)
+#define OPEN_PANEL (1<<5)
+#define ABSORBED (1<<6)
+#define VORE_INIT (1<<7)
+#define VOREPREF_INIT (1<<8)
+#define LICKABLE (1<<9)
+
+#define MAX_VORE_FLAG (1<<10)-1 // change this whenever you add a vore flag, must be largest vore flag*2-1
+
#define isbelly(A) istype(A, /obj/belly)
#define QDEL_NULL_LIST(x) if(x) { for(var/y in x) { qdel(y) } ; x = null }
diff --git a/code/game/objects/items/devices/dogborg_sleeper.dm b/code/game/objects/items/devices/dogborg_sleeper.dm
index 748c494737..2614775906 100644
--- a/code/game/objects/items/devices/dogborg_sleeper.dm
+++ b/code/game/objects/items/devices/dogborg_sleeper.dm
@@ -324,7 +324,7 @@
cleaning_cycles--
cleaning = TRUE
for(var/mob/living/carbon/C in (touchable_items))
- if((C.status_flags & GODMODE) || !C.digestable)
+ if((C.status_flags & GODMODE) || !CHECK_BITFIELD(C.vore_flags, DIGESTABLE))
items_preserved += C
else
C.adjustBruteLoss(2)
@@ -333,7 +333,7 @@
var/atom/target = pick(touchable_items)
if(iscarbon(target)) //Handle the target being a mob
var/mob/living/carbon/T = target
- if(T.stat == DEAD && T.digestable) //Mob is now dead
+ if(T.stat == DEAD && CHECK_BITFIELD(T.vore_flags, DIGESTABLE)) //Mob is now dead
message_admins("[key_name(hound)] has digested [key_name(T)] as a dogborg. ([hound ? "JMP" : "null"])")
to_chat(hound,"You feel your belly slowly churn around [T], breaking them down into a soft slurry to be used as power for your systems.")
to_chat(T,"You feel [hound]'s belly slowly churn around your form, breaking you down into a soft slurry to be used as power for [hound]'s systems.")
@@ -445,7 +445,7 @@
var/mob/living/silicon/robot/hound = get_host()
if(!hound || !istype(target) || !proximity || target.anchored)
return
- if (!target.devourable)
+ if (!CHECK_BITFIELD(target.vore_flags,DEVOURABLE))
to_chat(user, "The target registers an error code. Unable to insert into [src].")
return
if(patient)
@@ -509,7 +509,7 @@
if(iscarbon(target) || issilicon(target))
var/mob/living/trashman = target
- if(!trashman.devourable)
+ if(!CHECK_BITFIELD(trashman.vore_flags,DEVOURABLE))
to_chat(user, "[target] registers an error code to your [src]")
return
if(patient)
@@ -528,4 +528,4 @@
/obj/item/dogborg/sleeper/K9/flavour
name = "Recreational Sleeper"
- desc = "A mounted, underslung sleeper, intended for holding willing occupants for leisurely purposes."
\ No newline at end of file
+ desc = "A mounted, underslung sleeper, intended for holding willing occupants for leisurely purposes."
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index adfcd547bc..b8885be99b 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -195,10 +195,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/action_buttons_screen_locs = list()
//bad stuff
- var/digestable = FALSE
- var/devourable = FALSE
- var/feeding = FALSE
- var/lickable = FALSE
+ var/vore_flags = 0
var/list/belly_prefs = list()
var/vore_taste = "nothing in particular"
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index ca51a27dae..a6fdf9a671 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -120,10 +120,14 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(fexists(vr_path))
var/list/json_from_file = json_decode(file2text(vr_path))
if(json_from_file)
- digestable = json_from_file["digestable"]
- devourable = json_from_file["devourable"]
- feeding = json_from_file["feeding"]
- lickable = json_from_file["lickable"]
+ if(json_from_file["digestable"])
+ ENABLE_BITFIELD(vore_flags,DIGESTABLE)
+ if(json_from_file["devourable"])
+ ENABLE_BITFIELD(vore_flags,DEVOURABLE)
+ if(json_from_file["feeding"])
+ ENABLE_BITFIELD(vore_flags,FEEDING)
+ if(json_from_file["lickable"])
+ ENABLE_BITFIELD(vore_flags,LICKABLE)
belly_prefs = json_from_file["belly_prefs"]
vore_taste = json_from_file["vore_taste"]
@@ -158,6 +162,24 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(malformed_hockeys[hockey])
features["cock_shape"] = malformed_hockeys[hockey]
features["cock_taur"] = TRUE
+
+ if(current_version < 29)
+ var/digestable
+ var/devourable
+ var/feeding
+ var/lickable
+ S["digestable"] >> digestable
+ S["devourable"] >> devourable
+ S["feeding"] >> feeding
+ S["lickable"] >> lickable
+ if(digestable)
+ ENABLE_BITFIELD(vore_flags,DIGESTABLE)
+ if(devourable)
+ ENABLE_BITFIELD(vore_flags,DEVOURABLE)
+ if(feeding)
+ ENABLE_BITFIELD(vore_flags,FEEDING)
+ if(lickable)
+ ENABLE_BITFIELD(vore_flags,LICKABLE)
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
if(!ckey)
@@ -497,11 +519,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
else //We have no old flavortext, default to new
S["feature_flavor_text"] >> features["flavor_text"]
- S["digestable"] >> digestable
- S["devourable"] >> devourable
- S["feeding"] >> feeding
+ S["vore_flags"] >> vore_flags
S["vore_taste"] >> vore_taste
- S["lickable"] >> lickable
S["belly_prefs"] >> belly_prefs
//try to fix any outdated data if necessary
@@ -609,10 +628,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
all_quirks = SANITIZE_LIST(all_quirks)
- lickable = sanitize_integer(lickable, FALSE, TRUE, initial(lickable))
- devourable = sanitize_integer(devourable, FALSE, TRUE, initial(devourable))
- digestable = sanitize_integer(digestable, FALSE, TRUE, initial(digestable))
- feeding = sanitize_integer(feeding, FALSE, TRUE, initial(feeding))
+ vore_flags = sanitize_integer(vore_flags, 0, MAX_VORE_FLAG, 0)
vore_taste = copytext(vore_taste, 1, MAX_TASTE_LEN)
belly_prefs = SANITIZE_LIST(belly_prefs)
@@ -720,11 +736,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//Quirks
WRITE_FILE(S["all_quirks"] , all_quirks)
- WRITE_FILE(S["digestable"] , digestable)
- WRITE_FILE(S["devourable"] , devourable)
- WRITE_FILE(S["feeding"] , feeding)
+ WRITE_FILE(S["vore_flags"] , vore_flags)
WRITE_FILE(S["vore_taste"] , vore_taste)
- WRITE_FILE(S["lickable"] , lickable)
WRITE_FILE(S["belly_prefs"] , belly_prefs)
cit_character_pref_save(S)
diff --git a/code/modules/holodeck/holo_effect.dm b/code/modules/holodeck/holo_effect.dm
index 308cec1cbd..7c3754b616 100644
--- a/code/modules/holodeck/holo_effect.dm
+++ b/code/modules/holodeck/holo_effect.dm
@@ -81,9 +81,7 @@
ENABLE_BITFIELD(mob.flags_1, HOLOGRAM_1)
if(isliving(mob))
var/mob/living/L = mob
- L.feeding = FALSE
- L.devourable = FALSE
- L.digestable = FALSE
+ L.vore_flags = 0
return mob
/obj/effect/holodeck_effect/mobspawner/deactivate(var/obj/machinery/computer/holodeck/HC)
diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm
index 95746afb73..7918e303e8 100644
--- a/code/modules/mob/living/carbon/human/dummy.dm
+++ b/code/modules/mob/living/carbon/human/dummy.dm
@@ -4,7 +4,6 @@
status_flags = GODMODE|CANPUSH
mouse_drag_pointer = MOUSE_INACTIVE_POINTER
var/in_use = FALSE
- no_vore = TRUE
INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy)
diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
index d4b8ea7897..b6d56b8e5d 100644
--- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
@@ -74,9 +74,7 @@
//misc
/mob/living/carbon/human/dummy
- no_vore = TRUE
+ vore_flags = NO_VORE
/mob/living/carbon/human/vore
- devourable = TRUE
- digestable = TRUE
- feeding = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm
index e0bd8a16b3..931f87eb7c 100644
--- a/code/modules/mob/living/login.dm
+++ b/code/modules/mob/living/login.dm
@@ -23,5 +23,5 @@
if(ranged_ability)
ranged_ability.add_ranged_ability(src, "You currently have [ranged_ability] active!")
- if(vore_init && !vorepref_init) //Vore's been initialized, voreprefs haven't. If this triggers then that means that voreprefs failed to load due to the client being missing.
+ if((vore_flags & VORE_INIT) && !(vore_flags & VOREPREF_INIT)) //Vore's been initialized, voreprefs haven't. If this triggers then that means that voreprefs failed to load due to the client being missing.
copy_from_prefs_vr()
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 7ebd11319d..a4aeeb2ffc 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -14,7 +14,7 @@
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
speech_span = SPAN_ROBOT
flags_1 = PREVENT_CONTENTS_EXPLOSION_1 | HEAR_1
- no_vore = TRUE
+ vore_flags = NO_VORE
/// Enable sprint system but not stamina
combat_flags = COMBAT_FLAGS_STAMEXEMPT_YESSPRINT
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index e496d007a2..cae8948fdd 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -347,10 +347,11 @@
/mob/living/simple_animal/hostile/proc/AttackingTarget()
SEND_SIGNAL(src, COMSIG_HOSTILE_ATTACKINGTARGET, target)
in_melee = TRUE
+ /* sorry for the simplemob vore fans
if(vore_active)
if(isliving(target))
var/mob/living/L = target
- if(!client && L.Adjacent(src) && L.devourable) // aggressive check to ensure vore attacks can be made
+ if(!client && L.Adjacent(src) && CHECK_BITFIELD(L.vore_flags,DEVOURABLE)) // aggressive check to ensure vore attacks can be made
if(prob(voracious_chance))
vore_attack(src,L,src)
else
@@ -361,6 +362,8 @@
return target.attack_animal(src)
else
return target.attack_animal(src)
+ */
+ return target.attack_animal(src)
/mob/living/simple_animal/hostile/proc/Aggro()
vision_range = aggro_vision_range
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm
index 8c06b01402..a2d18c508e 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm
@@ -1,6 +1,5 @@
/mob/living/simple_animal/hostile/megafauna/dragon
vore_active = TRUE
- no_vore = FALSE
isPredator = TRUE
/mob/living/simple_animal/hostile/megafauna/dragon/Initialize()
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
index 8aed1ede30..8958916880 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -87,7 +87,7 @@
if(!client && ranged && ranged_cooldown <= world.time)
OpenFire()
if(L.Adjacent(src) && (L.stat != CONSCIOUS))
- if(vore_active && L.devourable == TRUE)
+ if(vore_active && CHECK_BITFIELD(L.vore_flags,DEVOURABLE))
vore_attack(src,L,src)
LoseTarget()
else
diff --git a/code/modules/mob/living/simple_animal/simple_animal_vr.dm b/code/modules/mob/living/simple_animal/simple_animal_vr.dm
index 700ee3b7ce..4a3ad39919 100644
--- a/code/modules/mob/living/simple_animal/simple_animal_vr.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal_vr.dm
@@ -49,10 +49,10 @@
// Simple animals have only one belly. This creates it (if it isn't already set up)
/mob/living/simple_animal/init_vore()
- vore_init = TRUE
+ ENABLE_BITFIELD(vore_flags, VORE_INIT)
if(CHECK_BITFIELD(flags_1, HOLOGRAM_1))
return
- if(!vore_active || no_vore) //If it can't vore, let's not give it a stomach.
+ if(!vore_active || CHECK_BITFIELD(vore_flags, NO_VORE)) //If it can't vore, let's not give it a stomach.
return
if(vore_active && !IsAdvancedToolUser()) //vore active, but doesn't have thumbs to grab people with.
verbs |= /mob/living/simple_animal/proc/animal_nom
@@ -134,6 +134,6 @@
if (stat != CONSCIOUS)
return
- if(!T.devourable)
+ if(!CHECK_BITFIELD(T.vore_flags,DEVOURABLE))
return
return vore_attack(src,T,src)
diff --git a/code/modules/mob/living/simple_animal/simplemob_vore_values.dm b/code/modules/mob/living/simple_animal/simplemob_vore_values.dm
index 22ed5e3ab4..58b08db801 100644
--- a/code/modules/mob/living/simple_animal/simplemob_vore_values.dm
+++ b/code/modules/mob/living/simple_animal/simplemob_vore_values.dm
@@ -1,13 +1,9 @@
//CARBON MOBS
/mob/living/carbon/alien
- devourable = TRUE
- digestable = TRUE
- feeding = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
/mob/living/carbon/monkey
- devourable = TRUE
- digestable = TRUE
- feeding = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
/*
@@ -17,121 +13,65 @@
//NUETRAL MOBS
/mob/living/simple_animal/crab
- devourable = TRUE
- digestable = TRUE
- feeding = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
/mob/living/simple_animal/cow
- devourable = TRUE
- digestable = TRUE
- feeding = TRUE
- vore_active = TRUE
- isPredator = TRUE
- vore_default_mode = DM_HOLD
+ vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
/mob/living/simple_animal/chick
- devourable = TRUE
- digestable = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE
/mob/living/simple_animal/chicken
- devourable = TRUE
- digestable = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE
/mob/living/simple_animal/mouse
- devourable = TRUE
- digestable = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE
/mob/living/simple_animal/kiwi
- devourable = TRUE
- digestable = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE
//STATION PETS
/mob/living/simple_animal/pet
- devourable = TRUE
- digestable = TRUE
- feeding = TRUE
-
-/mob/living/simple_animal/pet/fox
- vore_active = TRUE
- isPredator = TRUE
- vore_default_mode = DM_HOLD
-
-/mob/living/simple_animal/pet/cat
- vore_active = TRUE
- isPredator = TRUE
- vore_default_mode = DM_HOLD
-
-/mob/living/simple_animal/pet/dog
- vore_active = TRUE
- isPredator = TRUE
- vore_default_mode = DM_HOLD
+ vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
/mob/living/simple_animal/sloth
- devourable = TRUE
- digestable = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE
/mob/living/simple_animal/parrot
- devourable = TRUE
- digestable = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE
//HOSTILE MOBS
/mob/living/simple_animal/hostile/retaliate/goat
- devourable = TRUE
- digestable = TRUE
- feeding = TRUE
- vore_active = TRUE
- isPredator = TRUE
- vore_stomach_flavor = "You find yourself squeezed into the hollow of the goat, the smell of oats and hay thick in the tight space, all of which grinds in on you. Harmless for now..."
- vore_default_mode = DM_HOLD
+ vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
+
/mob/living/simple_animal/hostile/lizard
- devourable = TRUE
- digestable = TRUE
- feeding = TRUE
- vore_active = TRUE
- isPredator = TRUE
- vore_default_mode = DM_DIGEST
+ vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
/mob/living/simple_animal/hostile/alien
- feeding = TRUE
- vore_active = TRUE
- isPredator = TRUE
+ vore_flags = FEEDING
vore_default_mode = DM_DIGEST
/mob/living/simple_animal/hostile/bear
- feeding = TRUE
- vore_active = TRUE
- isPredator = TRUE
+ vore_flags = FEEDING
vore_default_mode = DM_DIGEST
/mob/living/simple_animal/hostile/poison/giant_spider
- feeding = TRUE
- vore_active = TRUE
- isPredator = TRUE
+ vore_flags = FEEDING
vore_default_mode = DM_DIGEST
/mob/living/simple_animal/hostile/retaliate/poison/snake
- feeding = TRUE
- vore_active = TRUE
- isPredator = TRUE
+ vore_flags = FEEDING
vore_default_mode = DM_DIGEST
/mob/living/simple_animal/hostile/gorilla
- feeding = TRUE
- vore_active = TRUE
- isPredator = TRUE
+ vore_flags = FEEDING
vore_default_mode = DM_DIGEST
/mob/living/simple_animal/hostile/asteroid/goliath
- feeding = TRUE //for pet Goliaths I guess or something.
- vore_active = TRUE
- isPredator = TRUE
+ vore_flags = FEEDING
vore_default_mode = DM_DIGEST
/mob/living/simple_animal/hostile/carp
- devourable = TRUE
- digestable = TRUE
- feeding = TRUE
- vore_active = TRUE
- isPredator = TRUE
+ vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
vore_default_mode = DM_DIGEST
diff --git a/code/modules/vore/eating/belly_obj.dm b/code/modules/vore/eating/belly_obj.dm
index 4917bd3dba..06735e2d5c 100644
--- a/code/modules/vore/eating/belly_obj.dm
+++ b/code/modules/vore/eating/belly_obj.dm
@@ -221,9 +221,9 @@
if(isliving(AM))
var/mob/living/L = AM
var/mob/living/OW = owner
- if(L.absorbed && !include_absorbed)
+ if(L.vore_flags & ABSORBED && !include_absorbed)
continue
- L.absorbed = FALSE
+ L.vore_flags &= ~ABSORBED
L.stop_sound_channel(CHANNEL_PREYLOOP)
SEND_SIGNAL(OW, COMSIG_CLEAR_MOOD_EVENT, "fedpred", /datum/mood_event/fedpred)
SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "fedprey", /datum/mood_event/fedprey)
@@ -277,14 +277,14 @@
SEND_SIGNAL(OW, COMSIG_ADD_MOOD_EVENT, "emptypred", /datum/mood_event/emptypred)
SEND_SIGNAL(ML, COMSIG_ADD_MOOD_EVENT, "emptyprey", /datum/mood_event/emptyprey)
- if(ML.absorbed)
- ML.absorbed = FALSE
+ if(CHECK_BITFIELD(ML.vore_flags,ABSORBED))
+ DISABLE_BITFIELD(ML.vore_flags,ABSORBED)
if(ishuman(M) && ishuman(OW))
var/mob/living/carbon/human/Prey = M
var/mob/living/carbon/human/Pred = OW
var/absorbed_count = 2 //Prey that we were, plus the pred gets a portion
for(var/mob/living/P in contents)
- if(P.absorbed)
+ if(CHECK_BITFIELD(P.vore_flags,ABSORBED))
absorbed_count++
Pred.reagents.trans_to(Prey, Pred.reagents.total_volume / absorbed_count)
@@ -389,7 +389,7 @@
formatted_message = replacetext(formatted_message,"%pred",owner)
formatted_message = replacetext(formatted_message,"%prey",english_list(contents))
for(var/mob/living/P in contents)
- if(!P.absorbed) //This is required first, in case there's a person absorbed and not absorbed in a stomach.
+ if(!CHECK_BITFIELD(P.vore_flags, ABSORBED)) //This is required first, in case there's a person absorbed and not absorbed in a stomach.
total_bulge += P.mob_size
if(total_bulge >= bulge_size && bulge_size != 0)
return("[formatted_message]
")
@@ -484,7 +484,7 @@
// Handle a mob being absorbed
/obj/belly/proc/absorb_living(var/mob/living/M)
- M.absorbed = TRUE
+ ENABLE_BITFIELD(M.vore_flags, ABSORBED)
to_chat(M,"[owner]'s [lowertext(name)] absorbs your body, making you part of them.")
to_chat(owner,"Your [lowertext(name)] absorbs [M]'s body, making them part of you.")
@@ -498,7 +498,7 @@
for(var/belly in M.vore_organs)
var/obj/belly/B = belly
for(var/mob/living/Mm in B)
- if(Mm.absorbed)
+ if(CHECK_BITFIELD(Mm.vore_flags, ABSORBED))
absorb_living(Mm)
//Update owner
diff --git a/code/modules/vore/eating/bellymodes.dm b/code/modules/vore/eating/bellymodes.dm
index 965648eb5a..121dc9f75c 100644
--- a/code/modules/vore/eating/bellymodes.dm
+++ b/code/modules/vore/eating/bellymodes.dm
@@ -27,7 +27,7 @@
var/list/EL = emote_lists[digest_mode]
if(LAZYLEN(EL))
for(var/mob/living/M in contents)
- if(M.digestable || !(digest_mode == DM_DIGEST)) // don't give digesty messages to indigestible people
+ if((M.vore_flags & DIGESTABLE) || !(digest_mode == DM_DIGEST)) // don't give digesty messages to indigestible people
to_chat(M,"[pick(EL)]")
///////////////////// Prey Loop Refresh/hack //////////////////////
@@ -51,7 +51,7 @@
//////////////////////// Absorbed Handling ////////////////////////
for(var/mob/living/M in contents)
- if(M.absorbed)
+ if(M.vore_flags & ABSORBED)
M.Stun(5)
////////////////////////// Sound vars /////////////////////////////
@@ -76,7 +76,7 @@
play_sound = pick(pred_digest)
//Pref protection!
- if (!M.digestable || M.absorbed)
+ if (!M.vore_flags & DIGESTABLE || M.vore_flags & ABSORBED)
continue
//Person just died in guts!
@@ -150,7 +150,7 @@
SEND_SOUND(M,prey_digest)
play_sound = pick(pred_digest)
- if(M.absorbed)
+ if(M.vore_flags & ABSORBED)
continue
if(M.nutrition >= 100) //Drain them until there's no nutrients left. Slowly "absorb" them.
@@ -164,8 +164,8 @@
if(DM_UNABSORB)
for (var/mob/living/M in contents)
- if(M.absorbed && owner.nutrition >= 100)
- M.absorbed = FALSE
+ if(M.vore_flags & ABSORBED && owner.nutrition >= 100)
+ DISABLE_BITFIELD(M.vore_flags, ABSORBED)
to_chat(M,"You suddenly feel solid again ")
to_chat(owner,"You feel like a part of you is missing.")
owner.nutrition -= 100
diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm
index c59662d5b6..1f4a4e3909 100644
--- a/code/modules/vore/eating/living.dm
+++ b/code/modules/vore/eating/living.dm
@@ -1,18 +1,11 @@
///////////////////// Mob Living /////////////////////
/mob/living
- var/digestable = FALSE // Can the mob be digested inside a belly?
+ var/vore_flags = 0
var/showvoreprefs = TRUE // Determines if the mechanical vore preferences button will be displayed on the mob or not.
var/obj/belly/vore_selected // Default to no vore capability.
var/list/vore_organs = list() // List of vore containers inside a mob
- var/devourable = FALSE // Can the mob be vored at all?
- var/feeding = FALSE // Are we going to feed someone else?
var/vore_taste = null // What the character tastes like
- var/no_vore = FALSE // If the character/mob can vore.
- var/openpanel = FALSE // Is the vore panel open?
- var/absorbed = FALSE //are we absorbed?
var/next_preyloop
- var/vore_init = FALSE //Has this mob's vore been initialized yet?
- var/vorepref_init = FALSE //Has this mob's voreprefs been initialized?
//
// Hook for generic creation of stuff on new creatures
@@ -22,7 +15,7 @@
M.verbs += /mob/living/proc/lick
M.verbs += /mob/living/proc/escapeOOC
- if(M.no_vore) //If the mob isn't supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach.
+ if(M.vore_flags & NO_VORE) //If the mob isn't supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach.
return TRUE
M.verbs += /mob/living/proc/insidePanel
@@ -35,7 +28,7 @@
return TRUE
/mob/living/proc/init_vore()
- vore_init = TRUE
+ ENABLE_BITFIELD(vore_flags, VORE_INIT)
//Something else made organs, meanwhile.
if(LAZYLEN(vore_organs))
return TRUE
@@ -75,7 +68,7 @@
return
if(pred == prey) //you click your target
- if(!pred.feeding)
+ if(!CHECK_BITFIELD(pred.vore_flags,FEEDING))
to_chat(user, "They aren't able to be fed.")
to_chat(pred, "[user] tried to feed you themselves, but you aren't voracious enough to be fed.")
return
@@ -91,11 +84,11 @@
feed_grabbed_to_self(user, prey)
else // click someone other than you/prey
- if(!pred.feeding)
+ if(!CHECK_BITFIELD(pred.vore_flags,FEEDING))
to_chat(user, "They aren't voracious enough to be fed.")
to_chat(pred, "[user] tried to feed you [prey], but you aren't voracious enough to be fed.")
return
- if(!prey.feeding)
+ if(!CHECK_BITFIELD(prey.vore_flags,FEEDING))
to_chat(user, "They aren't able to be fed to someone.")
to_chat(prey, "[user] tried to feed you to [pred], but you aren't able to be fed to them.")
return
@@ -128,7 +121,7 @@
testing("[user] attempted to feed [prey] to [pred], via [lowertext(belly.name)] but it went wrong.")
return
- if (!prey.devourable)
+ if (!prey.vore_flags & DEVOURABLE)
to_chat(user, "This can't be eaten!")
return FALSE
@@ -267,9 +260,7 @@
to_chat(src,"You attempted to save your vore prefs but somehow you're in this character without a client.prefs variable. Tell a dev.")
return FALSE
- client.prefs.digestable = digestable
- client.prefs.devourable = devourable
- client.prefs.feeding = feeding
+ client.prefs.vore_flags = vore_flags // there's garbage data in here, but it doesn't matter
client.prefs.vore_taste = vore_taste
var/list/serialized = list()
@@ -288,12 +279,17 @@
if(!client || !client.prefs)
to_chat(src,"You attempted to apply your vore prefs but somehow you're in this character without a client.prefs variable. Tell a dev.")
return FALSE
- vorepref_init = TRUE
+ ENABLE_BITFIELD(vore_flags,VOREPREF_INIT)
+ // garbage data coming back the other way or breaking absorbed would be bad, so instead we do this
+ vore_flags |= CHECK_BITFIELD(client.prefs.vore_flags,DIGESTABLE) // set to 1 if prefs is 1
+ vore_flags |= CHECK_BITFIELD(client.prefs.vore_flags,DEVOURABLE)
+ vore_flags |= CHECK_BITFIELD(client.prefs.vore_flags,FEEDING)
+
+ vore_flags &= CHECK_BITFIELD(client.prefs.vore_flags,DIGESTABLE) // set to 0 if prefs is 0
+ vore_flags &= CHECK_BITFIELD(client.prefs.vore_flags,DEVOURABLE)
+ vore_flags &= CHECK_BITFIELD(client.prefs.vore_flags,FEEDING)
- digestable = client.prefs.digestable
- devourable = client.prefs.devourable
- feeding = client.prefs.feeding
vore_taste = client.prefs.vore_taste
release_vore_contents(silent = TRUE)
@@ -361,7 +357,7 @@
var/list/choices
for(var/mob/living/L in view(1))
- if(L != src && (!L.ckey || L.client?.prefs.lickable) && Adjacent(L))
+ if(L != src && (!L.ckey || L.client?.prefs.vore_flags & LICKABLE) && Adjacent(L))
LAZYADD(choices, L)
if(!choices)
@@ -369,7 +365,7 @@
var/mob/living/tasted = input(src, "Who would you like to lick? (Excluding yourself and those with the preference disabled)", "Licking") as null|anything in choices
- if(QDELETED(tasted) || (tasted.ckey && !(tasted.client?.prefs.lickable)) || !Adjacent(tasted) || incapacitated(ignore_restraints = TRUE))
+ if(QDELETED(tasted) || (tasted.ckey && !(tasted.client?.prefs.vore_flags & LICKABLE)) || !Adjacent(tasted) || incapacitated(ignore_restraints = TRUE))
return
setClickCooldown(100)
diff --git a/code/modules/vore/eating/vorepanel.dm b/code/modules/vore/eating/vorepanel.dm
index 9c1ff4a84e..1adf5ef6e7 100644
--- a/code/modules/vore/eating/vorepanel.dm
+++ b/code/modules/vore/eating/vorepanel.dm
@@ -20,10 +20,10 @@
picker_holder.popup = new(src, "insidePanel","Vore Panel", 450, 700, picker_holder)
picker_holder.popup.set_content(dat)
picker_holder.popup.open()
- src.openpanel = TRUE
+ vore_flags |= OPEN_PANEL
/mob/living/proc/updateVRPanel() //Panel popup update call from belly events.
- if(src.openpanel == TRUE)
+ if(vore_flags & OPEN_PANEL)
var/datum/vore_look/picker_holder = new()
picker_holder.loop = picker_holder
picker_holder.selected = vore_selected
@@ -65,7 +65,7 @@
//Don't display this part if we couldn't find the belly since could be held in hand.
if(inside_belly)
- dat += "You are currently [user.absorbed ? "absorbed into " : "inside "] [eater]'s [inside_belly]!
"
+ dat += "You are currently [(user.vore_flags & ABSORBED) ? "absorbed into " : "inside "] [eater]'s [inside_belly]!
"
if(inside_belly.desc)
dat += "[inside_belly.desc]
"
@@ -80,8 +80,8 @@
continue
//That's an absorbed person you're checking
- if(M.absorbed)
- if(user.absorbed)
+ if(M.vore_flags & ABSORBED)
+ if(user.vore_flags & ABSORBED)
dat += "[O]"
continue
else
@@ -139,7 +139,7 @@
var/mob/living/M = O
//Absorbed gets special color OOoOOOOoooo
- if(M.absorbed)
+ if(M.vore_flags & ABSORBED)
dat += "[O]"
continue
@@ -243,11 +243,11 @@
dat += "
"
var/pref_on = "#173d15"
var/pref_off = "#990000"
- dat += "
Toggle Digestable (Currently: [user.digestable ? "ON" : "OFF"])"
- dat += "
Toggle Devourable (Currently: [user.devourable ? "ON" : "OFF"])"
- dat += "
Toggle Feeding (Currently: [user.feeding ? "ON" : "OFF"])"
+ dat += "
Toggle Digestable (Currently: [(user.vore_flags & DIGESTABLE) ? "ON" : "OFF"])"
+ dat += "
Toggle Devourable (Currently: [(user.vore_flags & DEVOURABLE) ? "ON" : "OFF"])"
+ dat += "
Toggle Feeding (Currently: [(user.vore_flags & FEEDING) ? "ON" : "OFF"])"
if(user.client.prefs)
- dat += "
Toggle Licking (Currently: [user.client.prefs.lickable ? "ON" : "OFF"])"
+ dat += "
Toggle Licking (Currently: [(user.client.prefs.vore_flags & LICKABLE) ? "ON" : "OFF"])"
//Returns the dat html to the vore_look
return dat
@@ -257,7 +257,7 @@
if(href_list["close"])
qdel(src) // Cleanup
- user.openpanel = FALSE
+ user.vore_flags &= ~OPEN_PANEL
return
if(href_list["show_int"])
@@ -287,7 +287,7 @@
M.examine(user)
if("Help Out") //Help the inside-mob out
- if(user.stat || user.absorbed || M.absorbed)
+ if(user.stat || user.vore_flags & ABSORBED || M.vore_flags & ABSORBED)
to_chat(user,"You can't do that in your state!")
return TRUE
@@ -306,7 +306,7 @@
to_chat(OB.owner,"Your body efficiently shoves [M] back where they belong.")
if("Devour") //Eat the inside mob
- if(user.absorbed || user.stat)
+ if(user.vore_flags & ABSORBED || user.stat)
to_chat(user,"You can't do that in your state!")
return TRUE
@@ -687,58 +687,58 @@
user.vore_taste = new_flavor
if(href_list["toggledg"])
- var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable to all mobs. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion")
+ var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable to all mobs. Digesting you is currently: [(user.vore_flags & DIGESTABLE) ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion")
if(!user || !user.client)
return
switch(choice)
if("Cancel")
return FALSE
if("Allow Digestion")
- user.digestable = TRUE
+ user.vore_flags |= DIGESTABLE
+ user.client.prefs.vore_flags |= DIGESTABLE
if("Prevent Digestion")
- user.digestable = FALSE
-
- user.client.prefs.digestable = user.digestable
+ user.vore_flags &= ~DIGESTABLE
+ user.client.prefs.vore_flags &= ~DIGESTABLE
if(href_list["toggledvor"])
- var/choice = alert(user, "This button is for those who don't like vore at all. Devouring you is currently: [user.devourable ? "Allowed" : "Prevented"]", "", "Allow Devourment", "Cancel", "Prevent Devourment")
+ var/choice = alert(user, "This button is for those who don't like vore at all. Devouring you is currently: [(user.vore_flags & DEVOURABLE) ? "Allowed" : "Prevented"]", "", "Allow Devourment", "Cancel", "Prevent Devourment")
if(!user || !user.client)
return
switch(choice)
if("Cancel")
return FALSE
if("Allow Devourment")
- user.devourable = TRUE
+ user.vore_flags |= DEVOURABLE
+ user.client.prefs.vore_flags |= DEVOURABLE
if("Prevent Devourment")
- user.devourable = FALSE
-
- user.client.prefs.devourable = user.devourable
+ user.vore_flags &= ~DEVOURABLE
+ user.client.prefs.vore_flags &= ~DEVOURABLE
if(href_list["toggledfeed"])
- var/choice = alert(user, "This button is to toggle your ability to be fed to others. Feeding predators is currently: [user.feeding ? "Allowed" : "Prevented"]", "", "Allow Feeding", "Cancel", "Prevent Feeding")
+ var/choice = alert(user, "This button is to toggle your ability to be fed to others. Feeding predators is currently: [(user.vore_flags & FEEDING) ? "Allowed" : "Prevented"]", "", "Allow Feeding", "Cancel", "Prevent Feeding")
if(!user || !user.client)
return
switch(choice)
if("Cancel")
return FALSE
if("Allow Feeding")
- user.feeding = TRUE
+ user.vore_flags |= FEEDING
+ user.client.prefs.vore_flags |= FEEDING
if("Prevent Feeding")
- user.feeding = FALSE
-
- user.client.prefs.feeding = user.feeding
+ user.vore_flags &= ~FEEDING
+ user.client.prefs.vore_flags &= ~FEEDING
if(href_list["toggledlickable"])
- var/choice = alert(user, "This button is to toggle your ability to be licked. Being licked is currently: [user.client.prefs.lickable ? "Allowed" : "Prevented"]", "", "Allow Licking", "Cancel", "Prevent Licking")
+ var/choice = alert(user, "This button is to toggle your ability to be licked. Being licked is currently: [(user.client.prefs.vore_flags & LICKABLE) ? "Allowed" : "Prevented"]", "", "Allow Licking", "Cancel", "Prevent Licking")
if(!user || !user.client)
return
switch(choice)
if("Cancel")
return FALSE
if("Allow Licking")
- user.client.prefs.lickable = TRUE
+ user.client.prefs.vore_flags |= LICKABLE
if("Prevent Licking")
- user.client.prefs.lickable = FALSE
+ user.client.prefs.vore_flags &= ~LICKABLE
//Refresh when interacted with, returning 1 makes vore_look.Topic update
return TRUE
From 70b771a8f2b473b557fb245d38bdf71c78652f2a Mon Sep 17 00:00:00 2001
From: Putnam
Date: Mon, 13 Apr 2020 17:04:09 -0700
Subject: [PATCH 020/131] Also made bellies only generate when needed.
---
.../living/simple_animal/simple_animal_vr.dm | 79 +++++++++----------
code/modules/vore/eating/living.dm | 8 +-
2 files changed, 45 insertions(+), 42 deletions(-)
diff --git a/code/modules/mob/living/simple_animal/simple_animal_vr.dm b/code/modules/mob/living/simple_animal/simple_animal_vr.dm
index 4a3ad39919..de5bb578b8 100644
--- a/code/modules/mob/living/simple_animal/simple_animal_vr.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal_vr.dm
@@ -57,46 +57,45 @@
if(vore_active && !IsAdvancedToolUser()) //vore active, but doesn't have thumbs to grab people with.
verbs |= /mob/living/simple_animal/proc/animal_nom
- if(LAZYLEN(vore_organs))
- return
-
- LAZYINITLIST(vore_organs)
- var/obj/belly/B = new (src)
- vore_selected = B
- B.immutable = TRUE
- B.name = vore_stomach_name ? vore_stomach_name : "stomach"
- B.desc = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]."
- B.digest_mode = vore_default_mode
- B.vore_sound = vore_default_sound
- B.release_sound = vore_default_release
- B.is_wet = vore_wetness
- B.escapable = vore_escape_chance > 0
- B.escapechance = vore_escape_chance
- B.digestchance = vore_digest_chance
- B.absorbchance = vore_absorb_chance
- B.human_prey_swallow_time = swallowTime
- B.nonhuman_prey_swallow_time = swallowTime
- B.vore_verb = "swallow"
- B.emote_lists[DM_HOLD] = list( // We need more that aren't repetitive. I suck at endo. -Ace
- "The insides knead at you gently for a moment.",
- "The guts glorp wetly around you as some air shifts.",
- "The predator takes a deep breath and sighs, shifting you somewhat.",
- "The stomach squeezes you tight for a moment, then relaxes harmlessly.",
- "The predator's calm breathing and thumping heartbeat pulses around you.",
- "The warm walls kneads harmlessly against you.",
- "The liquids churn around you, though there doesn't seem to be much effect.",
- "The sound of bodily movements drown out everything for a moment.",
- "The predator's movements gently force you into a different position.")
- B.emote_lists[DM_DIGEST] = list(
- "The burning acids eat away at your form.",
- "The muscular stomach flesh grinds harshly against you.",
- "The caustic air stings your chest when you try to breathe.",
- "The slimy guts squeeze inward to help the digestive juices soften you up.",
- "The onslaught against your body doesn't seem to be letting up; you're food now.",
- "The predator's body ripples and crushes against you as digestive enzymes pull you apart.",
- "The juices pooling beneath you sizzle against your sore skin.",
- "The churning walls slowly pulverize you into meaty nutrients.",
- "The stomach glorps and gurgles as it tries to work you into slop.")
+/mob/living/simple_animal/lazy_init_belly()
+ if(!LAZYLEN(vore_organs))
+ LAZYINITLIST(vore_organs)
+ var/obj/belly/B = new (src)
+ vore_selected = B
+ B.immutable = TRUE
+ B.name = vore_stomach_name ? vore_stomach_name : "stomach"
+ B.desc = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]."
+ B.digest_mode = vore_default_mode
+ B.vore_sound = vore_default_sound
+ B.release_sound = vore_default_release
+ B.is_wet = vore_wetness
+ B.escapable = vore_escape_chance > 0
+ B.escapechance = vore_escape_chance
+ B.digestchance = vore_digest_chance
+ B.absorbchance = vore_absorb_chance
+ B.human_prey_swallow_time = swallowTime
+ B.nonhuman_prey_swallow_time = swallowTime
+ B.vore_verb = "swallow"
+ B.emote_lists[DM_HOLD] = list( // We need more that aren't repetitive. I suck at endo. -Ace
+ "The insides knead at you gently for a moment.",
+ "The guts glorp wetly around you as some air shifts.",
+ "The predator takes a deep breath and sighs, shifting you somewhat.",
+ "The stomach squeezes you tight for a moment, then relaxes harmlessly.",
+ "The predator's calm breathing and thumping heartbeat pulses around you.",
+ "The warm walls kneads harmlessly against you.",
+ "The liquids churn around you, though there doesn't seem to be much effect.",
+ "The sound of bodily movements drown out everything for a moment.",
+ "The predator's movements gently force you into a different position.")
+ B.emote_lists[DM_DIGEST] = list(
+ "The burning acids eat away at your form.",
+ "The muscular stomach flesh grinds harshly against you.",
+ "The caustic air stings your chest when you try to breathe.",
+ "The slimy guts squeeze inward to help the digestive juices soften you up.",
+ "The onslaught against your body doesn't seem to be letting up; you're food now.",
+ "The predator's body ripples and crushes against you as digestive enzymes pull you apart.",
+ "The juices pooling beneath you sizzle against your sore skin.",
+ "The churning walls slowly pulverize you into meaty nutrients.",
+ "The stomach glorps and gurgles as it tries to work you into slop.")
//
// Simple proc for animals to have their digestion toggled on/off externally
diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm
index 1f4a4e3909..33f8d78300 100644
--- a/code/modules/vore/eating/living.dm
+++ b/code/modules/vore/eating/living.dm
@@ -42,8 +42,8 @@
vore_selected = vore_organs[1]
return TRUE
- //Or, we can create a basic one for them
- if(!LAZYLEN(vore_organs))
+/mob/living/proc/lazy_init_belly()
+ if(!length(vore_organs))
LAZYINITLIST(vore_organs)
var/obj/belly/B = new /obj/belly(src)
vore_selected = B
@@ -61,6 +61,7 @@
// Critical adjustments due to TG grab changes - Poojawa
/mob/living/proc/vore_attack(var/mob/living/user, var/mob/living/prey, var/mob/living/pred)
+ lazy_init_belly()
if(!user || !prey || !pred)
return
@@ -100,14 +101,17 @@
// Eating procs depending on who clicked what
//
/mob/living/proc/feed_grabbed_to_self(var/mob/living/user, var/mob/living/prey)
+ user.lazy_init_belly()
var/belly = user.vore_selected
return perform_the_nom(user, prey, user, belly)
/mob/living/proc/feed_self_to_grabbed(var/mob/living/user, var/mob/living/pred)
+ pred.lazy_init_belly()
var/belly = input("Choose Belly") in pred.vore_organs
return perform_the_nom(user, user, pred, belly)
/mob/living/proc/feed_grabbed_to_other(var/mob/living/user, var/mob/living/prey, var/mob/living/pred)
+ pred.lazy_init_belly()
var/belly = input("Choose Belly") in pred.vore_organs
return perform_the_nom(user, prey, pred, belly)
From 75bb0cfab25eb5c8fcb42bd51bc3032e414a8802 Mon Sep 17 00:00:00 2001
From: Putnam
Date: Mon, 13 Apr 2020 17:15:18 -0700
Subject: [PATCH 021/131] Lowered vore priority
---
code/__DEFINES/subsystems.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 5aa0301bf6..c4d87bc63d 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -90,12 +90,12 @@
// Subsystem fire priority, from lowest to highest priority
// If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child)
+#define FIRE_PRIORITY_VORE 5
#define FIRE_PRIORITY_PING 10
#define FIRE_PRIORITY_IDLE_NPC 10
#define FIRE_PRIORITY_SERVER_MAINT 10
#define FIRE_PRIORITY_RESEARCH 10
#define FIRE_PRIORITY_VIS 10
-#define FIRE_PRIORITY_VORE 10
#define FIRE_PRIORITY_GARBAGE 15
#define FIRE_PRIORITY_WET_FLOORS 20
#define FIRE_PRIORITY_AIR 20
From d0cea0d84a24e75b0fe33865658fc109e899054e Mon Sep 17 00:00:00 2001
From: Putnam
Date: Mon, 13 Apr 2020 17:19:39 -0700
Subject: [PATCH 022/131] Replaced a .len with a length() just in case
---
code/modules/vore/eating/bellymodes.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/vore/eating/bellymodes.dm b/code/modules/vore/eating/bellymodes.dm
index 121dc9f75c..2caaae401e 100644
--- a/code/modules/vore/eating/bellymodes.dm
+++ b/code/modules/vore/eating/bellymodes.dm
@@ -1,6 +1,6 @@
// Process the predator's effects upon the contents of its belly (i.e digestion/transformation etc)
/obj/belly/proc/process_belly(var/times_fired,var/wait) //Passed by controller
- if((times_fired < next_process) || !contents.len)
+ if((times_fired < next_process) || !length(contents))
recent_sound = FALSE
return SSBELLIES_IGNORED
From 325c011142eee40dcafd914d006974731106910a Mon Sep 17 00:00:00 2001
From: Artur
Date: Tue, 14 Apr 2020 09:07:37 +0300
Subject: [PATCH 023/131] Comsigs are hard...
---
code/datums/components/tackle.dm | 14 ++++++--------
.../antagonists/bloodsucker/powers/lunge.dm | 12 +++++++++---
2 files changed, 15 insertions(+), 11 deletions(-)
diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm
index 0af2d8f78c..754be9d817 100644
--- a/code/datums/components/tackle.dm
+++ b/code/datums/components/tackle.dm
@@ -143,8 +143,6 @@
return
var/mob/living/carbon/target = hit
- var/mob/living/carbon/human/T = target
- var/mob/living/carbon/human/S = user
var/roll = rollTackle(target)
user.tackling = FALSE
@@ -190,9 +188,9 @@
target.adjustStaminaLoss(40)
target.Paralyze(5)
target.Knockdown(30)
- if(ishuman(target) && ishuman(user))
- S.dna.species.grab(S, T)
- S.setGrabState(GRAB_PASSIVE)
+ if(ishuman(target) && iscarbon(user))
+ target.grabbedby(user)
+ target.grippedby(user, instant = TRUE)
if(5 to INFINITY) // absolutely BODIED
user.visible_message("[user] lands a monster tackle on [target], knocking [target.p_them()] senseless and applying an aggressive pin!", "You land a monster tackle on [target], knocking [target.p_them()] senseless and applying an aggressive pin!", target)
@@ -203,11 +201,11 @@
target.adjustStaminaLoss(40)
target.Paralyze(5)
target.Knockdown(30)
- if(ishuman(target) && ishuman(user))
+ if(ishuman(target) && iscarbon(user))
target.grabbedby(user)
- target.grippedby(user, instant = TRUE) //instant aggro grab
+ target.grippedby(user, instant = TRUE)
- SEND_SIGNAL(user, COMSIG_CARBON_TACKLED, "tackle completed")
+ SEND_SIGNAL(user, COMSIG_CARBON_TACKLED, roll)
return COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH
/**
diff --git a/code/modules/antagonists/bloodsucker/powers/lunge.dm b/code/modules/antagonists/bloodsucker/powers/lunge.dm
index d40627f493..b8dcc29022 100644
--- a/code/modules/antagonists/bloodsucker/powers/lunge.dm
+++ b/code/modules/antagonists/bloodsucker/powers/lunge.dm
@@ -13,7 +13,11 @@
/datum/action/bloodsucker/lunge/New()
. = ..()
- RegisterSignal(owner, COMSIG_CARBON_TACKLED, .proc/Delayed_DeactivatePower)
+
+
+/datum/action/bloodsucker/lunge/Destroy()
+ . = ..()
+ UnregisterSignal(owner, COMSIG_CARBON_TACKLED)
/datum/action/bloodsucker/lunge/ActivatePower()
var/mob/living/user = owner
@@ -26,13 +30,15 @@
T.skill_mod = 5
T.min_distance = 2
active = TRUE
+ RegisterSignal(user, COMSIG_CARBON_TACKLED, .proc/DeactivatePower)
while(B && ContinueActive(user))
B.AddBloodVolume(-0.1)
sleep(5)
-/datum/action/bloodsucker/lunge/proc/Delayed_DeactivatePower()
+/*/datum/action/bloodsucker/lunge/proc/Delayed_DeactivatePower()
addtimer(CALLBACK(src, .proc/DeactivatePower), 1 SECONDS, TIMER_UNIQUE)
-
+*/
/datum/action/bloodsucker/lunge/DeactivatePower(mob/living/user = owner)
. = ..()
qdel(user.GetComponent(/datum/component/tackler))
+ UnregisterSignal(user, COMSIG_CARBON_TACKLED)
From 6c977f347d634034d29ffcb45098d8ded0a6b635 Mon Sep 17 00:00:00 2001
From: Ghom <42542238+Ghommie@users.noreply.github.com>
Date: Tue, 14 Apr 2020 20:40:59 +0200
Subject: [PATCH 024/131] Update game_options.dm
---
code/controllers/configuration/entries/game_options.dm | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm
index f11093cba7..85aec2e67b 100644
--- a/code/controllers/configuration/entries/game_options.dm
+++ b/code/controllers/configuration/entries/game_options.dm
@@ -455,10 +455,12 @@
config_entry_value = RESIZE_DEFAULT_SIZE
min_val = 0.1 //to avoid issues with zeros and negative values.
max_val = RESIZE_DEFAULT_SIZE
+ integer = FALSE
/datum/config_entry/number/body_size_max
config_entry_value = RESIZE_DEFAULT_SIZE
min_val = RESIZE_DEFAULT_SIZE
+ integer = FALSE
//Pun-Pun movement slowdown given to characters with a body size smaller than this value,
//to compensate for their smaller hitbox.
@@ -467,9 +469,11 @@
config_entry_value = RESIZE_DEFAULT_SIZE * 0.85
min_val = 0
max_val = RESIZE_DEFAULT_SIZE
+ integer = FALSE
//multiplicative slowdown multiplier. See 'dna.update_body_size' for the operation.
//doesn't apply to floating or crawling mobs
/datum/config_entry/number/body_size_slowdown_multiplier
config_entry_value = 0.25
min_val = 0.1 //To encourage folks to disable the slowdown through the above config instead.
+ integer = FALSE
From 3b79d6085b8b634df1f204ac4d3a93d3c66ba08c Mon Sep 17 00:00:00 2001
From: Putnam
Date: Tue, 14 Apr 2020 20:10:32 -0700
Subject: [PATCH 025/131] WHOOPS GOTTA UPDATE SAVEFILE VERSION
---
code/modules/client/preferences_savefile.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index a6fdf9a671..4590653a96 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -5,7 +5,7 @@
// You do not need to raise this if you are adding new values that have sane defaults.
// Only raise this value when changing the meaning/format/name/layout of an existing value
// where you would want the updater procs below to run
-#define SAVEFILE_VERSION_MAX 28
+#define SAVEFILE_VERSION_MAX 29
/*
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
From 20c3c648ce3262538efcea7f4f0739567963880d Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Tue, 14 Apr 2020 21:50:39 -0700
Subject: [PATCH 026/131] Update living.dm
---
code/modules/mob/living/living.dm | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 5fa64e5ab5..4e1f37fdf7 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -646,6 +646,11 @@
// Return as we should only resist one thing at a time. Give clickdelay if the grab wasn't passive.
return old_gs? TRUE : FALSE
+ if(CHECK_MOBILITY(src, MOBILITY_USE) && resist_embedded()) //Citadel Change for embedded removal memes - requires being able to use items.
+ // DO NOT GIVE DEFAULT CLICKDELAY - This is a combat action.
+ changeNext_move(CLICK_CD_MELEE)
+ return FALSE
+
// unbuckling yourself. stops the chain if you try it.
if(buckled && last_special <= world.time)
log_combat(src, buckled, "resisted buckle")
@@ -676,10 +681,7 @@
resist_restraints() //trying to remove cuffs.
// DO NOT GIVE CLICKDELAY - last_special handles this.
return FALSE
- if(CHECK_MOBILITY(src, MOBILITY_USE) && resist_embedded()) //Citadel Change for embedded removal memes - requires being able to use items.
- // DO NOT GIVE DEFAULT CLICKDELAY - This is a combat action.
- changeNext_move(CLICK_CD_MELEE)
- return FALSE
+
/// Proc to resist a grab. moving_resist is TRUE if this began by someone attempting to move. Return FALSE if still grabbed/failed to break out. Use this instead of resist_grab() directly.
/mob/proc/attempt_resist_grab(moving_resist, forced, log = TRUE)
From 375c62175f6ec75c4f2da473fea1c7101e6220c2 Mon Sep 17 00:00:00 2001
From: Artur
Date: Wed, 15 Apr 2020 12:04:25 +0300
Subject: [PATCH 027/131] Finishing touches, fixes icons
---
code/datums/components/tackle.dm | 1 -
.../antagonists/bloodsucker/powers/lunge.dm | 12 +++++++-----
code/modules/clothing/gloves/tacklers.dm | 4 ++--
icons/mob/clothing/hands.dmi | Bin 11008 -> 11611 bytes
icons/obj/clothing/gloves.dmi | Bin 15403 -> 16341 bytes
5 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm
index 754be9d817..8ffa6c5452 100644
--- a/code/datums/components/tackle.dm
+++ b/code/datums/components/tackle.dm
@@ -190,7 +190,6 @@
target.Knockdown(30)
if(ishuman(target) && iscarbon(user))
target.grabbedby(user)
- target.grippedby(user, instant = TRUE)
if(5 to INFINITY) // absolutely BODIED
user.visible_message("[user] lands a monster tackle on [target], knocking [target.p_them()] senseless and applying an aggressive pin!", "You land a monster tackle on [target], knocking [target.p_them()] senseless and applying an aggressive pin!", target)
diff --git a/code/modules/antagonists/bloodsucker/powers/lunge.dm b/code/modules/antagonists/bloodsucker/powers/lunge.dm
index b8dcc29022..88e39920d4 100644
--- a/code/modules/antagonists/bloodsucker/powers/lunge.dm
+++ b/code/modules/antagonists/bloodsucker/powers/lunge.dm
@@ -20,7 +20,7 @@
UnregisterSignal(owner, COMSIG_CARBON_TACKLED)
/datum/action/bloodsucker/lunge/ActivatePower()
- var/mob/living/user = owner
+ var/mob/living/carbon/user = owner
var/datum/antagonist/bloodsucker/B = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
var/datum/component/tackler/T = user.LoadComponent(/datum/component/tackler)
T.stamina_cost = 50
@@ -30,14 +30,16 @@
T.skill_mod = 5
T.min_distance = 2
active = TRUE
- RegisterSignal(user, COMSIG_CARBON_TACKLED, .proc/DeactivatePower)
+ user.toggle_throw_mode()
+ RegisterSignal(user, COMSIG_CARBON_TACKLED, .proc/DelayedDeactivatePower)
while(B && ContinueActive(user))
B.AddBloodVolume(-0.1)
sleep(5)
-
-/*/datum/action/bloodsucker/lunge/proc/Delayed_DeactivatePower()
+
+//Without this, the leap component would get removed too early, causing the normal crash into effects.
+/datum/action/bloodsucker/lunge/proc/DelayedDeactivatePower()
addtimer(CALLBACK(src, .proc/DeactivatePower), 1 SECONDS, TIMER_UNIQUE)
-*/
+
/datum/action/bloodsucker/lunge/DeactivatePower(mob/living/user = owner)
. = ..()
qdel(user.GetComponent(/datum/component/tackler))
diff --git a/code/modules/clothing/gloves/tacklers.dm b/code/modules/clothing/gloves/tacklers.dm
index 95c7739bd8..f11c7ccd6b 100644
--- a/code/modules/clothing/gloves/tacklers.dm
+++ b/code/modules/clothing/gloves/tacklers.dm
@@ -21,7 +21,7 @@
/// See: [/datum/component/tackler/var/speed]
var/tackle_speed = 1
/// See: [/datum/component/tackler/var/skill_mod]
- var/skill_mod = 0
+ var/skill_mod = 1
/obj/item/clothing/gloves/tackler/equipped(mob/user, slot)
. = ..()
@@ -61,7 +61,7 @@
tackle_stam_cost = 35
base_knockdown = 1.5 SECONDS
tackle_range = 5
- skill_mod = 2
+ skill_mod = 3
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi
index cb4251fd3c6240b89b7d7340c5c03331577990d9..f1ae2afed728e482394121a41faf6a3c66ac7679 100644
GIT binary patch
literal 11611
zcmbt)2UJtp)<5cuI;b#?q9ScZK}1B9-ZP4dbfroc=^&s|0)ZrBg8>wzlOUi}si7l*
z5ETKbk(N*s5ebG60)Y^dkmP^kH*em&`G4zM>%GTX;hwYaJ!S3vJA3c5_fEKKWwKB7
zsHljD$Uf667i~mDw!IeqcJBlznhLMNfX*F=-SzN`K4D&W18#>0gocQSL_K>lHW>2u
z>|T+N>d?g9Ll)e*ss8VfIs~aJ_gRgaC*n{6+BA_+zeF~nf;+*Vi3L#XT*?!;<0i6xX
zEHsm^Li_yg>3+R&EKlXcUoG-p
z$hwoaV>~zEAMt5@s#@c#KXpF8_cbxDbazw+di@>D^?El>B+TYQwLraeGR1rMg`ayM
z`^^r$3d7hVo?D!i#9uP`*t4sp`dX31%JnCkdu-5B)w_PU)tGakv3rl+ox1#({&)9p
zewI<5SU>KbHtg%!gun16CC+m7##`7$%}@DC;)2kPC;HD=A#gn{Qte|``2(^__eDg0
z7BRhe-Y)7HZ8|2(Eh3M;h9kDpmNDrXgfy*S;}QMF7nbI!JMTM`Uhc{=-WK04ooa$8
zdRcVx_|V2#wZ3PF`7dXEa`sE;nn058uS-{4i8wNR>Vk`NplaZYj8ZVtTs7c~K7qtO
z?shIaZ@I|<-$&d>C#-+XFolumi(D7|S!~s~;ZFb-{*Axak1TVwXlJ{ZC(sepWMRA3
zr6Gcfm+3w-tyzww`))^(@gAVSXT<%levQGEzAoJ~{y7v~-6IO5m^oM*O~O|N14I
zF%#B(#H%@EHc%^g%Da+PYMDELuXcHIt~=7Qg4~AaO&O?zh!g47`7uMI%loK47D)qO
ztZhgKFKWzz9tx7xB=M|T poJ%j*BGNlr
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
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index e937842275bc88367426079b90389858133d04e6..166da38adc5ea097eb5d0f7716e3931b1afa9490 100644
GIT binary patch
literal 16341
zcma*O1yCK&vj&PKKp?ogdvJGm2?W>R5D4y0aDuyg0t5^08raDcb`{&MfD
zdiCm7v9Rpy%=Yy3^z?l5b;L(ynfLDq-a$b@y_b`fR0IBQ0#_HpTi`cwp#1_A6tu3F
zy0(j?xwEO0wS$Yby&V*kM^^N#fZZQfWT?p{;gGn|4-b0nScs9xL)b97KdI*<%_d#4
zRy%@LY~M7?bp?&(Ho4|LR{a?|iwS#(6jU9mbR?Z%ajpMIJH>VWR8dKx7G7gW11+}D
zq?Fl(n%Qz3PP@>w&~l8=+>}E)oT`9SPy_dkN5dTBXYemQiik=)CoSfKxM6HsjSaRR
zHHQ&ovXYu>H%avVL38GevjP}+=UxO@1$Fv3PXpY0##m%)6>GdKyI<%!*3Eos755HjTvVnxuQr7w#D)v1P5b1@aN
z+RZQ$nA})v8t?td=Q({yKA{jb$bEUvjZ?eS?op^|0I@x2NUn
zmw(hZtW|c+ptk7MH-snIeeJ_xI<%8Yyi73Tgd0R75Z`mOA;Zh+d{vSP1WSj5__=(f$8~zTY8v*?(DNmbHEpQ)9Y^$;EvY
zy#zOUt_11_88!YK0D)RVF^ig-v=PWBIX~=Du`n=TEG;cb3y}x&I_(aY_#;eh7ytMH
zJvlusuBtkf*4vnPIxcX*)OpeIII1x+ATBO2WbtyGmzK$8{d>C#C9*nhQn}{#Wa0bX
zNNQ#o@UO$;SR-N@Oj5Pe072nX=EW-WzH%Cpb3oJ5sR8&JgQ2wg)Nkr)Nv^^BQ=4{2
z6Kzq>Cq!Z-D_R{#$LhiHaT*SePbq{NP|^y)1qBr3!JoH#Bl;)UJEE2ViL6W6hPZx#
z&ZrXizTbHr9HsO|o%jmvZDCBkR7SHR<{E2=NUj5A*{RW6MJJ=V|#i8;_|9v4VNnPS79S`w~
z69ckN7>47Zk+Q04{3K^|>8Ij^S3RE_}yRi>z4^2
zY+YR)6dEqBjJ-We0C{edk%56yQ4}AM*?cRYLhUApd{sjoouQNudaNVxTLYb5w_iT*
zQVf?{CXX)6g|!~}Xg4Pd(ZY5ON+s!BEZbC>gSNXRN=iyTPvi(0?`d+|ts+F}_xd+^
zwx+@QJWMMzn^`b?e3R9;BiD6?qu6}I{*A+O8~WRlC?e#rJGpJlWs@j-ouRTQ0yFtQ
z8p|lsEIBIj-QT2vuvERp+U9q^ai{(&VPj(>2GrEBlTp8^@$9LXKzDH600upP=7RG81>fJOSQoz
zbUB@FcT(PZ>nOYlZv?Y356J}F>NyEcIT*RV%UTqxEB5(Tb3LXLju$n{6yFu{)b8wI
zyN5CWdJob}UD8UxkS^os${Eu@r;b{D^8qmHpOsmT7}gm$Zcgbh%L?TyA!tcSNxUS4
z!{w=IX|g6J6mxTPz!SW$$;ruEAdkc2WAT|fw0qH1-)XA$)|9w7plb`iw>LZwviGKX
z2_t0(L?&|ztG7;#h_RH52v9~W&4AV_jXDi^RsslI&qvil5$g@v^V^02bEr$s}+GyT|1dU%!1=Nx)^Y6}w>Pzc6lG%DJu
zDldm~pxV+Nq;;go|8)QPaKcDURTY{y@v`BJ=R2Wh5_GY#lkjMyluO`5F;ZGUzuCJ0
zWzGtmOU$5LefFcbEkO=5T&RvSFMbG-0ZmXO6NE%J9@;e~Z$wsOvmCiglC)^Pe14De*nZRgROGn3Ab_dS$n-oJ8FeA2lLTs06LWYOsxxX%B
zv1fjf9zHlZ{pZ?A4d(o+ei9HY!%xUk!AB28Ko>uA3Mi}6>9jJ4dJuNMmBN8Vn
zFcXL`ss_Iq_~3i%alArDryaWD8}mehO3kQw3A91k&$C-r!dm1AM*7WCRT3ceeen|s
zDmJzk4d>WT0vN!df1jRKg9(H(tV)fFLIwt;Lf@~GG(`3?>wEEGY8@S&{s<#o
z-N=O#YBU5%EPgeg+F-Tb{B281OXvMj{P8S432W=p9k9iHgY8mJPY60{(|C9+@f-LS8@w>Z1vV|HVxZ%dm-VKekXL}DX0jmKgRlLw6}dFdSGTK65FWf
zOnAiKThN1|muIB0SkN$6JA!6gwEblM#>#tmM`HLr6CjHPGIR)9|B#WUrbX6fjSYOh
z(@^5ZLx+zrDKKB94d??mE@)|K2i!zj!A}0U6Jhu4vUT79)dg!Gyrf}<0?$^-Vau!XFd|NeH|>5sE3#3^>j7G!Y9OZ~l&Odg^rZ
zw;r7wbFk-N{_~WaW9e#dq!cjuF`f-h3m!%WhQ%gF%6-Lyq7P-kQ`+~ZC}U4XcKhZN
z)Q2F4t*5(Y*FL9BDv}93h}}h5Q|l@#amFMyky(SF(sp<+pu;;&{T7(J
z)`7qy*q5I8bX%YkmrG;7B4b-gK{X@QJs7EpNQuV&Hpze^-IJ`Y%o6vbVFIgZvSGB9yf7Tt}u^VSSk9B)n1*{
zQ0|c3X#$KVcrN*j4;}CGUIX#+Uk|ucQC*hs8ItkVwNuuXDB(fq*cFLMmroxF5u4V&
zHm%K-uYx{Nju#4Oeu=FyAaZG4sy5w=1MOvh_z4@$WF+NA%`on<<|4GRuUP|XIno_h*X_fv%B*a(Z_{DL)LbXv
zH*EEMv=CFFneC3bl~CYPJGG-GJW^WtS7`h12>1W|$EOXizG{|*o?_S0^f5N-;^CU~
z??Zt98Az)_*Sy#Ny!oJC=y}IT`%AC?4eldwzlL-j1!hs_=8X|4=lPN{%Cwk3At}v3
zMSUoedlj~T|GuCCbur!%EmSHrwYj;a
zr!c0J*>!S0vVtcM?P5_?6nI!&xQVXDhRS(_Flm$ma>$BkdXAi1f)i=FW?f{Xf}Z`X
zI-u@#9P$ZUyj&0`kOeW_s3?{zRGK;+1%?7CYHDlw)>|jg9Q=3OcDSO>AA)humu0#M
zgB(w{RodYT*RA@E?ki(`bD0U*pDE!Zqr7kljVy!&hRXLe*F6u2{}o))rq{0yuh<`=
zRuh(nv!5)emaqS{7s;n)mcCa3f)-Hx#8hy
zpmn0eO7moe<(~#+1Ic0x-33~>r`;Bc1DqY`j;VQCpM^&TKzRgZf*M*{u~xp~OAQC1
zXIY*km4nS8m^>Zw-Gq#Pw!Q5ZmH)ZPZ31a5=Q4KyJ0znrlbvsr`ti<4BYs+A9V)3I
zeMS$u*pI>nI5_@G7r*ZBAX{>DeXUo+j9>p1LbhFx3;ap=80kLt{;!H(5)kuIdOk*9
z83S)I=H%Mz$;jhX#1#FVj0nf**G5XgB2P&rzpBkM3uT_2jff*cnId<+GD~lMfUo#?2LCgcnY|^1P%tvnow)Ogo@_afFoJN@N{v>g9)EcFMLBUu<%?
zA3uIHlu<}U=004;$ARx#?TqEllOYC;aaSg1zqdsuMP(uF
zjPg1OtIlL0zFKN6
zNOEtls=29WpzIiRnA%oAyyLO6+$bJd+-lDeCF^Q|kjQ|3_!P>Sno
z!cyN0JOg3?WddyrwHGtyq2U(y1%0X8TwGk$%$);{KJ>X*{q%0G<^s*l&77Q^$n^P1
zD(`l%T3c$e<)~{*g?;^G0a4ZPiWdQAPK9N*V|^4uXN)W=PqO_aoW{nQa(Xn^nl&&k
z`l*aLF}c#v_gf!!p~_&^)kzN*`1WbM;TV4cyX^ZxhG$1JM_huPoCK0YJD1
z#K7#O6!@{Xh@VIdLpLsXB#D$E-)OZAT_CRaLf|JqiQcVV|1YY`zqd2@Y^brSl^VJKYME!U8MeVlmKtMp?aggmE)nWm<
zy1FVbq~uijl_te$pSoypQYP%1)3`y$bDYt~n9WUp%q4zZ6saS5?G~|CFAVt8`Y>fY
z*RgGEMMZ=ambaqLVk)#ZE~1{OaBv=aH}BG|ADU3}7V79!6yRq$k;kq2TgaFVbLoYS
zLzbn5u9Xx+t#vMo-44G5^{OA*grFE5+8#R0)7Dw^RvYHB+WJb4Y>SE`uvYBw&VybC
z+$orzHI{;QQsR44)0tRUSZv*DtE=PP*FE8#e|`_O9bqu$G^2SH)7I_UXH0e7uaL<3
zr}K1*Mvv8?q9!XFIZ$C`r||D2;%NG~91xsQqQg3DVd+|YWI=;r$Z$cgEf)92oy~>5
zlM~ueQl5Irwjs5pI{dbg8+0~ydH#lX8ENmpI1Jv;kzgHJ+?L4&OuqP@joX=4c>z9Y
zX}oQt9BfW*ZrUQeRdD&FMncjFwpiNrJGt^^=I`ib$W0W`D>qR1C$37RD8J%suI*c{
zual=+ado2a`QODh0{ssGy2v-TqV_z!)S~ilA^q^(eupRDYHzJLn57^%hs{uiGff{)
zLdG>k0}#Y@nLJeTl+t3XY`#4UA0mk}ZGH)(vEQ``1mw!X?nKVDj_3yg3fuk#NF
zE$rO|mw)8beT`|ZECuc9GK6bQq~-e{n1#|lZ&~NQyu>By
zY55(p^cqo#1Ea28d5eFxqz?->5&|B&4_~))Pzo-RoAe}MZ`mr5snSvpKOCJhw-G@y
zuzY)`lJzT>x7yK5I(hGi11(#~YrfV^pb%tSg$iCEF^aUpwrsO&Nul^xg!Cg^(^1-M
zrk)s`P>M1PPqI8Fn%vcF<~IvZTP(^w
zR^NyLS%_k;WS}s18o8s123SoV2cCCL~$-B3O{Urfg=`W
z|BYn@+kuP){eoomh6aiSrZynEkjQ^o1nHYED;v7SDtrd&GZ<=@DU|UUeVI9Aord=k
zHZ2`d<3xt*In`dq#ZBA^WA!(lGFNxiOA(9m<0f%jJR*qgGP5yHA?Q{l#t&j#Mv0%a
zYBG4x;_?BIw~7?sr>O)B)#YCF!prb5mX`S$3Ftsz8s9?U51az?2@~-pOX0t!J%7Sb
zks4RVT3k<%fvqTs$0jsXgWX!>${9+TGaCe|xAPk>A_Vv0f#4;SnY2rBleSBf%sa0Q
z+9Ogm1I-(*TLNJm8a|-5OQ4G&58j|*16D~?=u&QTqU(Jj)=SL=f;$g3tgKvf$AifA-G8>B3`@08c
zw+)vdZfHO7_29ro4Gxp`Z&9M`QiWNbvdAVd%cQ^wF5Jcox$a-47;s*RMykW(V-MOF
zVCIVtyXT9LeDNFZO@NQe#RcD~>UbuFAmN5@$scN$@TDT9_{12sU0MzLCB(m@-+S04
zcK>}FN_cpBDrq4w)aH3z_X@qklXwJ#kvs^d9`wvWoT#>tJKk(Z)_9nhY^QAy48&I&
z`g{=bf%Pr9-7B+XCFjdYD}5W5H0)f@kL`}OJJcKfK<6+|(IkMf=#q-b|eZZ1yr
zVeFvv>(oSTa|CEtMVZ<{mw&A^qIZ0ltg+hy{
zjj{7T$=br07l`Nv<;UqH|(Kgl}wI{?M_Tn%dzx%NN-c
znHQM(+p-P>NVwxaYp&>0c^0++j|V8<_etaCR*T%ie8%Vwe#OpgH0$IDRWmU`APA97
zsCTqEr>Di$=R~hm@UJ!@lc<*kp7fWlLJlv6)oJh~IG{O~b?
znm?)yUS>f^T|vCwADdaV<53ZLQjq9)Psl9^A+}xoE#}<1rh39_OdtMsQ(M5L;m)a?
z*e~dLU%-iGT8KJg98XLPQIebwH&3D`rrKsoAa_C_{b8v`Q*SZ?Gf^17
zZ?yaP+@GNhQ7;(92zdUyMhzn#@(v{Z51Yr|;Bd>ENNK1g;!34NTy`4!%Txnv0nn>((Uus(BBW6
zyCqhI{SrvPvoHzx(aa24C*fcArc->YYkW0}sL#%oo))bAuBg22
zH^Un&sYXO{gE%}e8D{oJTJ)5b1C(_V*yK0(=7C&jNJ`;L+~0Fyi(aa!$z=&OMJ5>=
z0bZw;#H?VCL4~c$DYvG#9ss8PE0oZvYkQ(6gd2fV%z}J#8aHe7LvV`Q&2v|me9ge{
ztrs({nGrO|Pu4m_#1Dz4m|!lez?!vF(ukvPV^#e3j15ye51WP&DMvo8*J06FP~%}<
z5{(hzQaU2mSbBe1r;w7s?>n?2No{Lg69nyD{xNh?MJAn*@$B2vRm9|EndaMh@tpOV
z%r-`YE5b54B%yWBf^5wdK8c6&{t9uts#5-ZlR8>fGQpnMN_qkFEp@Hw
zZ*PXCN5^XBnqW#3&R(Zs>&=Z=m&^Nz2f0fJ4kj7WjUVv*X*d(
zq)!(-Y|h7UmGHW1+xPO`sNVx$@P^nP^DY+rOoUU#{1sUQVVT~>z(Vs1wG%FreLy9c
zxN&@-JursG!lgOkC>RJJ&6{|8MkogP3>-O&q`Aimr(Zq7=U>)N9)yM7k$ZF3k%WPX
zc->%7>_R!LA8N)%DnlAX{@A04_uKN`LVoYKyZ(7e`r|s%<^Dh=;@_OCV0luT`}|Wg
zIAE~@Ydq_ejF~#oGFN1rx>jHj`aygf
zwC3yVF{C2OLl2K>H}^(~UVqww7+|I22o@g2${F$q{`<9R`ftCc+qr&M{3fTGlO>dc
z#Ic;v~+@HWLQc|PPM^V|eLL6I=Lasi-T4xVTX;g?x%*zxIL`9)WFrbT#ZC&L35@o=*o
z#bD6j$G(bXtORWaHlzr9>2~{`!+dxVkR3TEyJ*q7U78pPxV9o9I3jJke(-Z-wgN#_
zqY)NXoi96)=qgL-VsIJ-fFt6n-wM8zE=1%aKczys5(I9<(sew-={jM!)HSL(H{n1j
z9VS+GSnwWM|5)Gov9uy~5rTp57Be5a8Ag~x|0%rKW
zlor}RawyumxaoBCtxPI93K4JK*=loFlg8Mpg|F{Z+~dkH4_5rKHWks>2*yq~)6I|0
zoy5(N#4V9Pq%)ye!^0o!lf#eEUp)v{N`!p+)9lw)*Z;f-IR`GC390J34Z0i(tx2l+
zQ24NYA`Sitt+dHE*|!yRMpSlTVN&&dKNsE_1#U~zYK=H}`#WlE3aZR)Vs57=+;PJ(
zl9Crn7bxhX(R;Rvk1x=tzWB0X_adR$s1g=KQehXE4^)c!g8J@Ur@k_{zo+2CV#M$B
zHFaCb98eg_HuYz$rxTY;`7?%#=+?&LBcSA{mJ>l(Y4u%RTD`Sb#i^9e6)gu}eSPE-edvskxrz*8*4BT=#;mQL(XV$=uciiLUOP=EGC3UU?~C48
z5Uown*TjY{$>Ko&8%kC_>fq{}gamDpn
z$POk8&najXNpk+O2{sLQc8u-ZRSQN#BSp0*)l{bczwSBzOH08j>@V^4Zft5=1Z%o|
z{d(5q&j{|*GmQqjw@>q&gF5XWG#~l|9~_DVRcnUAUx1UM9TNY!9n5I(gwQhk^TxZ4
z%d5>#(DShn>s?CoqRtoN_Nnb{6Y^kD;5>XN@*l7~Ms?!k79fbktG-Y#%KhE0s5aTk
z>INsfuKxqdUjz+u%-MXlrK)?3%cWbQ8cx8$zx~C}*e?n2MKpzkRY!HO>}Si$4)F;Q
z&!|=|Yd-IeSLit0s<@AS)UNZ$k4h@ZegM_!rc;v
zt`wY9@K=PbvXsrUN&M?1>k<`Hj4YPj96k#~<^1!4e)Zzwd`a@BIUQ(#_3>JcJ5K8J
z3;{_P%xWCQN)d7WgVv{WyluQ!IbJcokzBp30gu_gP1X4Q_{8D|X+!td7(FJB^&jNX
zQdg(qR5CrDEj2SY$KL}0yQ&2RH#axg=Fzx*!irz-M$-O>{TpOATrR6ZVpT&opRY|E
z)wPonHgGMX818IwOVAmqI6YoQj?$M*zdfa@O$qDUSbnD;{2%=NYMuG%1wFFq7!;QR1LV
za;36B-17tQ%zqH^1NO%s0R3X>Sk`cvP=E>XhlfAzkAJZ&?D28{+65t|*2;W5tymp@
zf`LJ17`+i(069Bti+_)mE|
zl2A9V`947b#1V#qV07GZdVppDK;r!qY7|N{J-h6d0uipQXx|bNFoMx~tllKi#hV7mQ<4tVSUnB(i4*hcm$ya^6}Mtb7a
z|7=|m-ntRXHvK~sYKhwGVrjR8Hux2efx(c4Pfyx)HD}%i9tbi%FiH!Ml9DPYFK1F@
zzUNm*GJ7Fy)0#iZHX%6Cl5%UYap*E<*
zrooBhSjMMMT-;$Iz=^XP&F)-3Ql{{5ac$i_4h;@=9bDs6ER*j&<~g>IM`NBI54$lB
z2}zk}r=k+v8h!KRo{LJlAPbu2?XIk}Jz&47JQj07?6j|yjY_IgW#lPx{AOUVq+F@3
zsA2ggT9=Q9rV=H6jDvDdz^`N^t{?FgxemF;EG;|S0_QW^wefr~(H72x>nyMwH*j<@&P8|LJQ37#CzuIZe$JazlW3z-Enky9wX#n!1}4$xu-4
zzQE|4kp)WH!zlB(a-|x*;>uINR03E8#8&T9oFX*Z-kz>-jA+g2h*fG6X-Jx4x_-{ia
zNN5bHNfTaV0ObTYPcO6sNHoH^sGS?JKdn#KS{JypGiWtNDKZ)rPAhLU<~=>F?aND7
z_~_Pq`1n+-(EnE5gCH@7!F!q8z!&g8&C8)h=z7qt5o-
zYMr^dbzVzr>Q7}w1^JpX{d$%ZXzH~=uK#>(uJslX*SYaiB#*P*tW7XH`7Xr!s8riP
zGD5CWXb;q16nPQrdufji{IuPuGqJ3>eVix=&hdAwx(V@pCWo1ypZ~(g$EU8P^~w*S
z)VqK3`&CxPX35VX9*)Lmu9;*Gu+&=r{3D^^psXx5ST(g}WUYe`N{~uJF+fvnM@pK>XtEbD$k$f|J)&L5wZbp;I
z$K&HR<*$}HoOP5{2Q=~SisL(nx!4Zmu^->CLkZ-#%#Z;mpOzYmD-J0^sAV9GYGxEN|
zO6}Z+K(0Hc2O8k>&&8g&4i7eLRB}vKf`V=-e4o)-B%q|Vsv8>S=?LRw(+tCGIToVT
zE$MCq^xFEN=FT@=OT{^Kfw?@~GHK&mBV^M|d^L`9Uz_a{-|zSy{olZLdECE&ZNU1m
z^Igro=bZ$0|BHYhGkCos;6&eF5%9%-0PqWxD#jIOx}4kVjlX1^4#VKnwyGP|yU6Ez
zZ^W?x$|s0OjRO5px_lY$j_XW4gsi-?>GiPxef3IVo?jNf~p!$r2E$-DmZAV=-{9TW24{k6T)Swf7
zCwM)JEA>U5NUHXxxT=`;q~olL|IxUkLY49~9_wA7Oo(O9LxF5A8baa)3nF#iHsufx
zNsGqK+x5t%ie`z)`E`Nu3oBc^dS)wW=}?fylPDSMx&JSmz4U0dMhK-%
z-Y}ZFMd2K!pqO?V%N=Tq3JjTfii?XcdIwI8gt`G7Qx$o|%}CP$=tY6A8R-6X%Du4?
zkkrn)_W=`6mlx7P9qB8yy^;5Fj;HDVTpN$;cZV%|x;cZA`sKk+qYJC?Hc@xu+)e2T
zJgGY}Wl>&Zxa|EB9b!k37mu_90tNg$325NnvI}%7&dDA
z%J{SCL@vLVl~jr2UUMHOMHV5vE9{NCo6n`^s+WuTaV?cP*OYa?2W8Gu{E5NF8y_*2
zEkx-Jy}Z17&(vCCVq!{QGX9ckHmc`%IKQ)m3C`NoA`%#Ht$mjch+o<-U8o%ObBYCS
zzmw64@Xu+A@9cKw8}ECCm8PAgm7Z-GlOhnM<0ITtd|Vj6w~pILz2M7nrr-V~aB`!-RR*fN$>G47z_o!VCSH4s=pN*MrQ@uaOy<;e$z2`z+bhh!h
z3rscihBr3>;Sz3gl<(5w;aLCNiLuvyp!FK%*w5pUEXugTcsAe=J`c#5qgxjEnSr8Q-b?8
z=V(Q=HZ49s?G89peA#xNqNdX(<0hE&E>yL4=d#`+RCvoCrdLyBZa+R-moQtW1(=c>
zxx4dhDvGxz+LvJJ&qqjFrjl$7$$?d)MUp;G4ToWFL}JX5uHkXQ|6;
z`o>Vc%=^b5%PiZ;3}&;cF_itA@z)&_gOZV%DbWI~>btvUD^H&K``|3s
z)Rt1pb8~W(ot-&SPQuBNv#?CO?Cb_35Q1oF&|Ldj)bs!)jM8UWyL7Ajc-!ToF?M9d
z+lJF}tU!vIe%o55I0LeXptuCf()A^-j2X;*-vhkcZX@L=1_|H1S=MB3iysba8(Y2`
zBK9_Hp4-T0_o+RvWxrSl{ez$nQ!PcB6zfO?avk{=EENU{OI)rATosc1_n`!}+O3*3
zHv3dIC1C#R#BF3pzzo?$=*Qy@1_Dw3x*h6(2B4o}tK0Tzsgqs(hz?nMlYRIo`O0mJ
zeD034I8VM>$;5DNVFV!!{-m{8y>DLna~?yGJ}F+rTuQ9g6Zc?II_5eilE#6%I0767
zFHB9LYiczds0-ew>OI@Kzw+${k&P>D>?VdHUVvj<3;OgodrivYRvC>iyp!ncwe*(4
zKeE_uGDbe%*y%i;&s14``g!O+-nAKFo6}`|j@F;%K!wR6mU?2naQ|7sA;G4Ai6i!U
z)K!Y_ATT08b>pz-_)4mcj?@jmhf032!c0?)@)Wb*;Ua)7o6eXv<`ypcw@Te#bqG0l
zE=2e&VpP&N1py(E1;bmwE86ZjAgy0AX0)Kt(Q$ngSUjE2(u+Ir{#Hb&`0mHVRhF(b
zG7xPdDLX+Ax@3N>vmUmaug+z}o2^~z+Ji4xMdz?sP{bm&2UaPpni0Ca_{Mx_WAXIH
zAtqW{eQ7;G#@B_}@!-IMP$U!B0Mtd+zPBS;I>ev%Mrb9)LTJ&CKS$&$LPlo`8NfRn
zmTtwAMl8X@*`c0uh{w>~gO#QtlY|hc9X3)Z@>uKH8#uoSdWj73786nHlnmK6iQD+e
zN;wcri9Q)M<_=Tnt7JWR3NJ6(XM`8u9}KX?sj__J+?$NXHU4kGM2N&}BRQ5o+p6<|
zL4PWAu0NL8V?0a$lp~Pd7uT27sV7w6ONlQ##vW1Y6b0&845Gyq3Y
z`krFuj*^k#l??t5JW&qh;FwujCZ?w&2B3WtB@0+Md4u-~QMB@KYZh5E@AvH|tewGk
zrN#}dbie(4Qv)_FO@x&$J&DD7bJfFbngS+}rc$V5MHNE6p})EsCS|8`y@`_X{XTWfa)^sh
zaVTR{L>N@Ymi*D8-6|pED@V0u?X!Mde5CgO0z=;CnEk)NkOUz6<@Z0?EsQY{h2>hf
zlYqQi9n!i|Xut-2^t^k3ZI;$-a`xg!gOPv6k}QzaGNH_F)0|uj9Q#W%7mV_++f;UE
z?4f9B;G17r24F%z<+r243qjlsh*_P`%^^HURg{#J-&wL3I(OHPZq=67V>E<0jQEY%
z%pmz2Nz{+&djcyiF;Dj115}s<+ZD{URh(qTv;459OZr?)hyc?QPIRfu$cS9rdo$xF
zKE^OVM(uwxTdZ(c7-?uFE0u%Ew@RN4&(Cs2e;pMfqd<&uiMQ7%IJ>Owgc^J*JTPxhlB|sC}j*qY2%3rE5
z$l9BDYnED9&J&}+84VyIG9b%|PCdnRzYxmmEOzq;>{t4rkC2FwzK~^%;Xi|f&N*Xft
zjxrqFut8eMI9_zWOG>F>nLawHi&z{rztM&HyL=k_~cVotz@2Mz1~FD79e}X(2#WM%~l@mZm#Exa#gBw)k1vm
zJ{XX9H$AP}`BCA3Q5^2EJBgb7ad`+J2et<+@kIE1;8N^(p|5%$Z_mj#LOb9dBUx9*
zK}PZ&=jiPH)ch}vvfkx-8_(0~fs)eF{FW91JYCNJNm_}WD6Z1kbZgaVb*rcd268nh
zgoLsIVToc;)d0I8?1`(w6!R5-8@3Y!sbt+)WWhtes_hY9ceuUGDGO=|Muu8^423g#NI#I~U$LGfyO
z+0AVRF1g{M{F-)OS;PtuxxP38?guohNV<*VnSrAlufqP=4Csn0VxcK4nvIBHNv|~#
zymnBor@kf5)X#NS8?U-Jel>m|^8v8C#|FHli8Hran+4{EuPgngu|gKIR#K4~|6o4C
z0EAFlS;=iyURk+6n$7|C5e5z=*$Zz6_t57P!mrduL6
z8{@BVCy4vaBoY7s!8KiTl=@tEd%j-A|Kz9SLXywUsP=a8V5BfEX5dk$Z%%9b%S$99
zVS}^5SM@VswO(0_;q-A@m8{8EFSlrivmgfvx9LsvO{9|@L&Cq78up=;B%HNRdG1%0rR6Ap`NF`=ni8s@q(sfdHRmSM1#A|!la915
z$KY?PKl=I#aafM;M&uI3cvM_uqK@w{zCbvjI$HMmJMK3H0dkCBtu>F4firQYVb&0!
z#TDiLGyqeo8e7?mGBx)Wcy+CeEPTkXi&Iz&zp2~RF`qN|qJ&$Y5=7!+I?fEZ)!ihbT1#54zjx4FV}6QDx1%%DV_z9M
z#f>fuGn~v>s>|%1O*g)pTUfYG_J78ouw6c*>#!~B=*Y1b=A9VyvpJ7!>*YC|xpC6n
z@VavMY6ljPY(J+=kLNzzdRg3MbD*`sQ_SeC-qf1+b18}7Ef|Xps%<^OxR+;8esRy9
zjeQiIk(?YNR8{9Q|LX+>NF=T4((^iL(9q${kmCo~QxbcIZ2acgoimkLM`+E^t6nCES>Mha>gVYh&US*3WY5|i9~^oL#ja>
zlH0+8UajyKen)a6lp@qTzkEamdCU-K>FMba>09?w^n`JE0!CgTseOD!TD52_
zzE9TJ1A;+ElE309EEy`cqi&TJFzCMlsVYZG6Qpxs^fy^K?n2L^6{_qE&&DN9z0fByFW0C6I6m;e9(
literal 15403
zcmb8WbyOTd*FHEn1ef3v+%0Hu4Xz1p3GNac1}C_?yCe`?!{8d+-95OwZIk!i?{{|3
z{_*Xck)EpVu3NWm-ManUr$Ut#rBL4xz5#(is4~(Ls=)6W@M%Yc2fj)C>}EkAC@GK6
znobfXjz-@s?42y^Y(XHmjL4~B+fFtVgi{W$FvOAcYv&^qXa(Z6w=wBWp;FQeeTApj
z{7#$P^9>UBKO3aZcOV%F(a&xfN12}B&(ke`+xS!ENvZr|VBM{2fY~e_1orCpN8$q
z>Rhj(zl-H6)8V}NZm2shbcmj#9P$1IY6&y