diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index b783d2c981..7bcca68713 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -36,16 +36,23 @@
#define CAN_CLIMAX_WITH (1<<7)
#define GENITAL_CAN_AROUSE (1<<8)
+
+#define DEF_VAGINA_SHAPE "Human"
+
#define COCK_SIZE_MIN 1
+#define COCK_SIZE_DEF 6
#define COCK_SIZE_MAX 20
#define COCK_DIAMETER_RATIO_MAX 0.42
#define COCK_DIAMETER_RATIO_DEF 0.25
#define COCK_DIAMETER_RATIO_MIN 0.15
+#define DEF_COCK_SHAPE "Human"
#define BALLS_VOLUME_BASE 25
#define BALLS_VOLUME_MULT 1
+#define DEF_BALLS_SHAPE "Single"
+
#define BALLS_SIZE_MIN 1
#define BALLS_SIZE_DEF 2
#define BALLS_SIZE_MAX 3
@@ -57,6 +64,10 @@
#define BREASTS_VOLUME_BASE 50 //base volume for the reagents in the breasts, multiplied by the size then multiplier. 50u for A cups, 850u for HH cups.
#define BREASTS_VOLUME_MULT 1 //global multiplier for breast volume.
+#define BREASTS_SIZE_DEF "c" //lowercase cause those sprite accessory don't use uppercased letters.
+
+#define DEF_BREASTS_SHAPE "Pair"
+
#define MILK_RATE 5
#define MILK_RATE_MULT 1
#define MILK_EFFICIENCY 1
@@ -78,14 +89,6 @@
#define XENOBIO_UPGRADE_SLIMEBASIC 2
#define XENOBIO_UPGRADE_SLIMEADV 4
-//stamina stuff
-#define STAMINA_SOFTCRIT 100 //softcrit for stamina damage. prevents standing up, prevents performing actions that cost stamina, etc, but doesn't force a rest or stop movement
-#define STAMINA_CRIT 140 //crit for stamina damage. forces a rest, and stops movement until stamina goes back to stamina softcrit
-#define STAMINA_SOFTCRIT_TRADITIONAL 0 //same as STAMINA_SOFTCRIT except for the more traditional health calculations
-#define STAMINA_CRIT_TRADITIONAL -40 //ditto, but for STAMINA_CRIT
-
-#define CRAWLUNDER_DELAY 30 //Delay for crawling under a standing mob
-
//Citadel toggles because bitflag memes
#define MEDIHOUND_SLEEPER (1<<0)
#define EATING_NOISES (1<<1)
@@ -103,8 +106,6 @@
#define TOGGLES_CITADEL (EATING_NOISES|DIGESTION_NOISES|BREAST_ENLARGEMENT|PENIS_ENLARGEMENT)
//component stuff
-#define COMSIG_COMBAT_TOGGLED "combatmode_toggled" //called by combat mode toggle on all equipped items. args: (mob/user, combatmode)
-
#define COMSIG_VORE_TOGGLED "voremode_toggled" // totally not copypasta
//belly sound pref things
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 33fc0c543d..fb361364d4 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -29,7 +29,54 @@
#define EFFECT_DROWSY "drowsy"
#define EFFECT_JITTER "jitter"
+// /mob/living/combat_flags
+#define CAN_TOGGLE_COMBAT_MODE(mob) FORCE_BOOLEAN((mob.stat == CONSCIOUS) && !(mob.combat_flags & COMBAT_FLAG_HARD_STAMCRIT))
+
+/// Default combat flags for those affected by ((stamina combat))
+#define COMBAT_FLAGS_DEFAULT NONE
+/// Default combat flags for everyone else (so literally everyone but humans)
+#define COMBAT_FLAGS_STAMSYSTEM_EXEMPT (COMBAT_FLAG_SPRINT_ACTIVE | COMBAT_FLAG_COMBAT_ACTIVE | COMBAT_FLAG_SPRINT_TOGGLED | COMBAT_FLAG_COMBAT_TOGGLED)
+/// Default combat flags for those only affected by sprint (so just silicons)
+#define COMBAT_FLAGS_STAMEXEMPT_YESSPRINT (COMBAT_FLAG_COMBAT_ACTIVE | COMBAT_FLAG_COMBAT_TOGGLED)
+
+/// The user wants combat mode on
+#define COMBAT_FLAG_COMBAT_TOGGLED (1<<0)
+/// The user wants sprint mode on
+#define COMBAT_FLAG_SPRINT_TOGGLED (1<<1)
+/// Combat mode is currently active
+#define COMBAT_FLAG_COMBAT_ACTIVE (1<<2)
+/// Sprint is currently active
+#define COMBAT_FLAG_SPRINT_ACTIVE (1<<3)
+/// Currently attempting to crawl under someone
+#define COMBAT_FLAG_ATTEMPTING_CRAWL (1<<4)
+/// Currently stamcritted
+#define COMBAT_FLAG_HARD_STAMCRIT (1<<5)
+/// Currently attempting to resist up from the ground
+#define COMBAT_FLAG_RESISTING_REST (1<<6)
+/// Intentionally resting
+#define COMBAT_FLAG_INTENTIONALLY_RESTING (1<<7)
+/// Currently stamcritted but not as violently
+#define COMBAT_FLAG_SOFT_STAMCRIT (1<<8)
+
+// Helpers for getting someone's stamcrit state. Cast to living.
+#define NOT_STAMCRIT 0
+#define SOFT_STAMCRIT 1
+#define HARD_STAMCRIT 2
+
+// Stamcrit check helpers
+#define IS_STAMCRIT(mob) (CHECK_STAMCRIT(mob) != NOT_STAMCRIT)
+#define CHECK_STAMCRIT(mob) ((mob.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)? HARD_STAMCRIT : ((mob.combat_flags & COMBAT_FLAG_SOFT_STAMCRIT)? SOFT_STAMCRIT : NOT_STAMCRIT))
+
+//stamina stuff
+#define STAMINA_SOFTCRIT 100 //softcrit for stamina damage. prevents standing up, prevents performing actions that cost stamina, etc, but doesn't force a rest or stop movement
+#define STAMINA_CRIT 140 //crit for stamina damage. forces a rest, and stops movement until stamina goes back to stamina softcrit
+#define STAMINA_SOFTCRIT_TRADITIONAL 0 //same as STAMINA_SOFTCRIT except for the more traditional health calculations
+#define STAMINA_CRIT_TRADITIONAL -40 //ditto, but for STAMINA_CRIT
+
+#define CRAWLUNDER_DELAY 30 //Delay for crawling under a standing mob
+
//Bitflags defining which status effects could be or are inflicted on a mob
+// This is a bit out of date/inaccurate in light of all the new status effects and is probably pending rework.
#define CANSTUN (1<<0)
#define CANKNOCKDOWN (1<<1)
#define CANUNCONSCIOUS (1<<2)
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index f844f4d4b2..469627e226 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -188,6 +188,8 @@
#define COMSIG_LIVING_GUN_PROCESS_FIRE "living_gun_process_fire" //from base of /obj/item/gun/proc/process_fire(): (atom/target, params, zone_override)
// This returns flags as defined for block in __DEFINES/combat.dm!
#define COMSIG_LIVING_RUN_BLOCK "living_do_run_block" //from base of mob/living/do_run_block(): (real_attack, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone)
+#define COMSIG_LIVING_COMBAT_ENABLED "combatmode_enabled" //from base of mob/living/enable_combat_mode() (was_forced)
+#define COMSIG_LIVING_COMBAT_DISABLED "combatmode_disabled" //from base of mob/living/disable_combat_mode() (was_forced)
//ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS!
#define COMSIG_LIVING_STATUS_STUN "living_stun" //from base of mob/living/Stun() (amount, update, ignore)
@@ -197,6 +199,7 @@
#define COMSIG_LIVING_STATUS_UNCONSCIOUS "living_unconscious" //from base of mob/living/Unconscious() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_SLEEP "living_sleeping" //from base of mob/living/Sleeping() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_DAZE "living_daze" //from base of mob/living/Daze() (amount, update, ignore)
+#define COMSIG_LIVING_STATUS_STAGGER "living_stagger" //from base of mob/living/Stagger() (amount, update, ignore)
#define COMPONENT_NO_STUN 1 //For all of them
// /mob/living/carbon signals
diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm
index 939f6698cb..6d263473b0 100644
--- a/code/__DEFINES/maths.dm
+++ b/code/__DEFINES/maths.dm
@@ -201,4 +201,7 @@
#define RULE_OF_THREE(a, b, x) ((a*x)/b)
// )
-#define MANHATTAN_DISTANCE(a, b) (abs(a.x - b.x) + abs(a.y - b.y))
\ No newline at end of file
+#define MANHATTAN_DISTANCE(a, b) (abs(a.x - b.x) + abs(a.y - b.y))
+
+/// Make sure something is a boolean TRUE/FALSE 1/0 value, since things like bitfield & bitflag doesn't always give 1s and 0s.
+#define FORCE_BOOLEAN(x) ((x)? TRUE : FALSE)
diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index ef86db07cb..a7ffd1c543 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -53,6 +53,9 @@
#define STATUS_EFFECT_SLEEPING /datum/status_effect/incapacitating/sleeping //the affected is asleep
+/// Blocks sprint
+#define STATUS_EFFECT_STAGGERED /datum/status_effect/staggered
+
#define STATUS_EFFECT_TASED_WEAK /datum/status_effect/electrode //not as crippling, just slows down
#define STATUS_EFFECT_TASED /datum/status_effect/electrode/no_combat_mode //the affected has been tased, preventing fine muscle control
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 343b96c283..4f4b7c6baa 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -131,6 +131,8 @@
#define TRAIT_UNINTELLIGIBLE_SPEECH "unintelligible-speech"
#define TRAIT_SOOTHED_THROAT "soothed-throat"
#define TRAIT_LAW_ENFORCEMENT_METABOLISM "law-enforcement-metabolism"
+#define TRAIT_QUICK_CARRY "quick-carry"
+#define TRAIT_QUICKER_CARRY "quicker-carry"
#define TRAIT_STRONG_GRABBER "strong_grabber"
#define TRAIT_CALCIUM_HEALER "calcium_healer"
#define TRAIT_MAGIC_CHOKE "magic_choke"
@@ -160,6 +162,15 @@
#define TRAIT_SWIMMING "swimming" //only applied by /datum/element/swimming, for checking
+/**
+ * COMBAT MODE/SPRINT MODE TRAITS
+ */
+
+/// Prevents combat mode from being active.
+#define TRAIT_COMBAT_MODE_LOCKED "combatmode_locked"
+/// Prevents sprinting from being active.
+#define TRAIT_SPRINT_LOCKED "sprint_locked"
+
//non-mob traits
#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it
@@ -224,6 +235,7 @@
#define GHOSTROLE_TRAIT "ghostrole"
#define APHRO_TRAIT "aphro"
#define BLOODSUCKER_TRAIT "bloodsucker"
+#define CLOTHING_TRAIT "clothing" //used for quirky carrygloves
// unique trait sources, still defines
#define STATUE_MUTE "statue"
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 511996276a..d847423853 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -181,21 +181,21 @@
"genitals_use_skintone" = FALSE,
"has_cock" = FALSE,
"cock_shape" = pick(GLOB.cock_shapes_list),
- "cock_length" = 6,
+ "cock_length" = COCK_SIZE_DEF,
"cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF,
"cock_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"has_balls" = FALSE,
"balls_internal" = FALSE,
"balls_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"balls_size" = BALLS_SIZE_DEF,
- "balls_shape" = "Single",
+ "balls_shape" = DEF_BALLS_SHAPE,
"balls_cum_rate" = CUM_RATE,
"balls_cum_mult" = CUM_RATE_MULT,
"balls_efficiency" = CUM_EFFICIENCY,
"has_breasts" = FALSE,
"breasts_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"breasts_size" = pick(GLOB.breasts_size_list),
- "breasts_shape" = "Pair",
+ "breasts_shape" = DEF_BREASTS_SHAPE,
"breasts_producing" = FALSE,
"has_vag" = FALSE,
"vag_shape" = pick(GLOB.vagina_shapes_list),
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index b4cc682075..5367322d8e 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -238,5 +238,16 @@ GLOBAL_LIST_INIT(bitfields, list(
"MOBILITY_PULL" = MOBILITY_PULL,
"MOBILITY_HOLD" = MOBILITY_HOLD,
"MOBILITY_RESIST" = MOBILITY_RESIST
+ ),
+ "combat_flags" = list(
+ "COMBAT_FLAG_COMBAT_TOGGLED" = COMBAT_FLAG_COMBAT_TOGGLED,
+ "COMBAT_FLAG_SPRINT_TOGGLED" = COMBAT_FLAG_SPRINT_TOGGLED,
+ "COMBAT_FLAG_COMBAT_ACTIVE" = COMBAT_FLAG_COMBAT_ACTIVE,
+ "COMBAT_FLAG_SPRINT_ACTIVE" = COMBAT_FLAG_SPRINT_ACTIVE,
+ "COMBAT_FLAG_ATTEMPTING_CRAWL" = COMBAT_FLAG_ATTEMPTING_CRAWL,
+ "COMBAT_FLAG_HARD_STAMCRIT" = COMBAT_FLAG_HARD_STAMCRIT,
+ "COMBAT_FLAG_SOFT_STAMCRIT" = COMBAT_FLAG_SOFT_STAMCRIT,
+ "COMBAT_FLAG_INTENTIONALLY_RESTING" = COMBAT_FLAG_INTENTIONALLY_RESTING,
+ "COMBAT_FLAG_RESISTING_REST" = COMBAT_FLAG_RESISTING_REST
)
))
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index a6d7286e80..490f0aa0f0 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -128,7 +128,7 @@
//CITADEL CHANGES - sprint button
using = new /obj/screen/sprintbutton
using.icon = tg_ui_icon_to_cit_ui(ui_style)
- using.icon_state = (owner.sprinting ? "act_sprint_on" : "act_sprint")
+ using.icon_state = ((owner.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) ? "act_sprint_on" : "act_sprint")
using.screen_loc = ui_movi
using.hud = src
static_inventory += using
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index d78cc01963..08852da6d6 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -11,7 +11,7 @@
if(item_flags & NO_ATTACK_CHAIN_SOFT_STAMCRIT)
if(isliving(user))
var/mob/living/L = user
- if(L.getStaminaLoss() >= STAMINA_SOFTCRIT)
+ if(IS_STAMCRIT(L))
to_chat(L, "You are too exhausted to swing [src]!")
return
if(tool_behaviour && target.tool_act(user, src, tool_behaviour))
@@ -58,7 +58,7 @@
if(item_flags & NOBLUDGEON)
return
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) // CIT CHANGE - makes it impossible to attack in stamina softcrit
+ if(IS_STAMCRIT(user)) // CIT CHANGE - makes it impossible to attack in stamina softcrit
to_chat(user, "You're too exhausted.") // CIT CHANGE - ditto
return // CIT CHANGE - ditto
@@ -88,7 +88,7 @@
return
if(item_flags & NOBLUDGEON)
return
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) // CIT CHANGE - makes it impossible to attack in stamina softcrit
+ if(IS_STAMCRIT(user)) // CIT CHANGE - makes it impossible to attack in stamina softcrit
to_chat(user, "You're too exhausted.") // CIT CHANGE - ditto
return // CIT CHANGE - ditto
user.adjustStaminaLossBuffered(getweight()*1.2)//CIT CHANGE - makes attacking things cause stamina loss
@@ -109,10 +109,8 @@
/mob/living/attacked_by(obj/item/I, mob/living/user)
//CIT CHANGES START HERE - combatmode and resting checks
var/totitemdamage = I.force
- if(iscarbon(user))
- var/mob/living/carbon/tempcarb = user
- if(!tempcarb.combatmode)
- totitemdamage *= 0.5
+ if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ totitemdamage *= 0.5
if(!CHECK_MOBILITY(user, MOBILITY_STAND))
totitemdamage *= 0.5
//CIT CHANGES END HERE
diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm
index 52d2fe45cd..13facc7666 100644
--- a/code/controllers/subsystem/air.dm
+++ b/code/controllers/subsystem/air.dm
@@ -257,8 +257,7 @@ SUBSYSTEM_DEF(air)
T.add_atom_colour("#00ff00", TEMPORARY_COLOUR_PRIORITY)
#endif
T.excited = TRUE
- active_turfs |= T
- SSair_turfs.currentrun |= T
+ active_turfs[T] = SSair_turfs.currentrun[T] = TRUE
if(blockchanges && T.excited_group)
T.excited_group.garbage_collect()
add_to_react_queue(T)
@@ -274,10 +273,9 @@ SUBSYSTEM_DEF(air)
/datum/controller/subsystem/air/proc/add_to_react_queue(turf/open/T)
if(istype(T) && T.air)
- turf_react_queue |= T
+ turf_react_queue[T] = TRUE
if(currentpart == SSAIR_REACTQUEUE)
- currentrun |= T
- return
+ currentrun[T] = TRUE
/datum/controller/subsystem/air/proc/remove_from_react_queue(turf/open/T)
turf_react_queue -= T
diff --git a/code/controllers/subsystem/processing/status_effects.dm b/code/controllers/subsystem/processing/status_effects.dm
new file mode 100644
index 0000000000..e8984a44cb
--- /dev/null
+++ b/code/controllers/subsystem/processing/status_effects.dm
@@ -0,0 +1,3 @@
+PROCESSING_SUBSYSTEM_DEF(status_effects)
+ wait = 1
+ flags = SS_TICKER
diff --git a/code/datums/components/phantomthief.dm b/code/datums/components/phantomthief.dm
index 7afe64994f..ede222d001 100644
--- a/code/datums/components/phantomthief.dm
+++ b/code/datums/components/phantomthief.dm
@@ -2,7 +2,7 @@
/datum/component/wearertargeting/phantomthief
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
- signals = list(COMSIG_COMBAT_TOGGLED)
+ signals = list(COMSIG_LIVING_COMBAT_ENABLED)
proctype = .proc/handlefilterstuff
var/filter_x
var/filter_y
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index edd5c25e2e..57b9a25904 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -95,8 +95,7 @@
SStgui.on_transfer(current, new_character)
if(iscarbon(current))
var/mob/living/carbon/C = current
- if(C.combatmode)
- C.toggle_combat_mode(TRUE, TRUE)
+ C.disable_intentional_combat_mode(TRUE)
if(!language_holder)
var/datum/language_holder/mob_holder = new_character.get_language_holder(shadow = FALSE)
language_holder = mob_holder.copy(src)
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index 43afcdd807..f9f9e22685 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -20,11 +20,11 @@
owner.adjustFireLoss(-15)
/datum/status_effect/shadow_mend/on_remove()
+ . = ..()
owner.visible_message("The violet light around [owner] glows black!", "The tendrils around you cinch tightly and reap their toll...")
playsound(owner, 'sound/magic/teleport_diss.ogg', 50, 1)
owner.apply_status_effect(STATUS_EFFECT_VOID_PRICE)
-
/datum/status_effect/void_price
id = "void_price"
duration = 300
@@ -84,6 +84,7 @@
progbar.update(duration - world.time)
/datum/status_effect/vanguard_shield/on_remove()
+ . = ..()
var/vanguard = owner.stun_absorption["vanguard"]
var/stuns_blocked = 0
if(vanguard)
@@ -107,7 +108,6 @@
owner.visible_message("[owner]'s glowing aura fades!", message_to_owner)
owner.log_message("lost Vanguard stun immunity[stuns_blocked ? "and was stunned for [stuns_blocked]":""]", LOG_ATTACK)
-
/datum/status_effect/inathneqs_endowment
id = "inathneqs_endowment"
duration = 150
@@ -133,12 +133,12 @@
return ..()
/datum/status_effect/inathneqs_endowment/on_remove()
+ . = ..()
owner.log_message("lost Inath-neq's invulnerability", LOG_ATTACK)
owner.visible_message("The light around [owner] flickers and dissipates!", "You feel Inath-neq's power fade from your body!")
owner.status_flags &= ~GODMODE
playsound(owner, 'sound/magic/ethereal_exit.ogg', 50, 1)
-
/datum/status_effect/cyborg_power_regen
id = "power_regen"
duration = 100
@@ -210,11 +210,11 @@
owner.adjustStaminaLoss(-(grace_heal * 25))
/datum/status_effect/his_grace/on_remove()
+ . = ..()
owner.log_message("lost His Grace's stun immunity", LOG_ATTACK)
if(islist(owner.stun_absorption) && owner.stun_absorption["hisgrace"])
owner.stun_absorption -= "hisgrace"
-
/datum/status_effect/wish_granters_gift //Fully revives after ten seconds.
id = "wish_granters_gift"
duration = 50
@@ -225,6 +225,7 @@
return ..()
/datum/status_effect/wish_granters_gift/on_remove()
+ . = ..()
owner.revive(full_heal = TRUE, admin_revive = TRUE)
owner.visible_message("[owner] appears to wake from the dead, having healed all wounds!", "You have regenerated.")
@@ -366,6 +367,7 @@
last_health = owner.health
/datum/status_effect/blooddrunk/on_remove()
+ . = ..()
tick()
owner.maxHealth *= 0.1
owner.bruteloss *= 0.1
@@ -404,7 +406,6 @@
playsound(owner, 'sound/weapons/fwoosh.wav', 75, 0)
return ..()
-
/datum/status_effect/sword_spin/tick()
playsound(owner, 'sound/weapons/fwoosh.wav', 75, 0)
var/obj/item/slashy
@@ -413,9 +414,9 @@
slashy.attack(M, owner)
/datum/status_effect/sword_spin/on_remove()
+ . = ..()
owner.visible_message("[owner]'s inhuman strength dissipates and the sword's runes grow cold!")
-
//Used by changelings to rapidly heal
//Heals 10 brute and oxygen damage every second, and 5 fire
//Being on fire will suppress this healing
@@ -472,6 +473,7 @@
return ..()
/datum/status_effect/hippocraticOath/on_remove()
+ . = ..()
REMOVE_TRAIT(owner, TRAIT_PACIFISM, "hippocraticOath")
var/datum/atom_hud/H = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
H.remove_hud_from(owner)
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index b46dd58555..cf10244890 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -17,6 +17,7 @@
owner.update_stat()
/datum/status_effect/incapacitating/on_remove()
+ . = ..()
owner.update_mobility()
if(needs_update_stat || issilicon(owner)) //silicons need stat updates in addition to normal canmove updates
owner.update_stat()
@@ -86,6 +87,15 @@
if(prob(10) && owner.health > owner.crit_threshold)
owner.emote("snore")
+/datum/status_effect/staggered
+ id = "staggered"
+ blocks_sprint = TRUE
+
+/datum/status_effect/staggered/on_creation(mob/living/new_owner, set_duration)
+ if(isnum(set_duration))
+ duration = set_duration
+ return ..()
+
/obj/screen/alert/status_effect/asleep
name = "Asleep"
desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are."
@@ -101,10 +111,6 @@
if(isnum(set_duration))
duration = set_duration
. = ..()
- if(iscarbon(owner))
- var/mob/living/carbon/C = owner
- if(C.combatmode)
- C.toggle_combat_mode(TRUE)
/datum/status_effect/no_combat_mode/mesmerize
id = "Mesmerize"
@@ -143,8 +149,6 @@
last_tick = world.time
if(iscarbon(owner))
var/mob/living/carbon/C = owner
- if(C.combatmode)
- C.toggle_combat_mode(TRUE)
C.add_movespeed_modifier("[MOVESPEED_ID_TASED_STATUS]_[id]", TRUE, priority = slowdown_priority, override = TRUE, multiplicative_slowdown = slowdown, blacklisted_movetypes = affect_crawl? NONE : CRAWLING)
/datum/status_effect/electrode/on_remove()
@@ -174,15 +178,6 @@
blocks_combatmode = TRUE
stamdmg_per_ds = 1
-/datum/status_effect/electrode/no_combat_mode/on_creation(mob/living/new_owner, set_duration)
- . = ..()
- if(iscarbon(owner))
- var/mob/living/carbon/C = owner
- if(HAS_TRAIT(C, TRAIT_TASED_RESISTANCE))
- return
- if(C.combatmode)
- C.toggle_combat_mode(TRUE)
-
//OTHER DEBUFFS
/datum/status_effect/his_wrath //does minor damage over time unless holding His Grace
id = "his_wrath"
@@ -220,6 +215,7 @@
alerttooltipstyle = "clockcult"
/datum/status_effect/belligerent/on_apply()
+ . = ..()
return do_movement_toggle(TRUE)
/datum/status_effect/belligerent/tick()
@@ -250,6 +246,7 @@
/datum/status_effect/belligerent/on_remove()
if(owner.m_intent == MOVE_INTENT_WALK)
owner.toggle_move_intent()
+ return ..()
/datum/status_effect/maniamotor
id = "maniamotor"
@@ -349,6 +346,7 @@
alert_type = null
/datum/status_effect/cultghost/on_apply()
+ . = ..()
owner.see_invisible = SEE_INVISIBLE_OBSERVER
owner.see_in_dark = 2
@@ -370,6 +368,7 @@
hammer_synced = new_hammer_synced
/datum/status_effect/crusher_mark/on_apply()
+ . = ..()
if(owner.mob_size >= MOB_SIZE_LARGE)
marked_underlay = mutable_appearance('icons/effects/effects.dmi', "shield2")
marked_underlay.pixel_x = -owner.pixel_x
@@ -451,6 +450,7 @@
qdel(src)
/datum/status_effect/saw_bleed/on_remove()
+ . = ..()
if(needs_to_bleed)
var/turf/T = get_turf(owner)
new /obj/effect/temp_visual/bleed/explode(T)
@@ -509,6 +509,7 @@
return ..()
/datum/status_effect/necropolis_curse/on_remove()
+ . = ..()
remove_curse(curse_flags)
/datum/status_effect/necropolis_curse/proc/apply_curse(set_curse)
@@ -598,6 +599,7 @@
old_oxyloss = owner.getOxyLoss()
/datum/status_effect/kindle/on_remove()
+ . = ..()
owner.visible_message("The light in [owner]'s eyes fades!", \
"You snap out of your daze!")
@@ -617,11 +619,13 @@
alert_type = /obj/screen/alert/status_effect/ichorial_stain
/datum/status_effect/ichorial_stain/on_apply()
+ . = ..()
owner.visible_message("[owner] gets back up, [owner.p_their()] body dripping blue ichor!", \
"Thick blue ichor covers your body; you can't be revived like this again until it dries!")
return TRUE
/datum/status_effect/ichorial_stain/on_remove()
+ . = ..()
owner.visible_message("The blue ichor on [owner]'s body dries out!", \
"The ichor on your body is dry - you can now be revived by vitality matrices again!")
@@ -643,6 +647,7 @@
owner.add_movespeed_modifier(MOVESPEED_ID_ELECTROSTAFF, multiplicative_slowdown = 1, movetypes = GROUND)
/datum/status_effect/electrostaff/on_remove()
+ . = ..()
owner.remove_movespeed_modifier(MOVESPEED_ID_ELECTROSTAFF)
//GOLEM GANG
@@ -694,6 +699,7 @@ datum/status_effect/pacify
/datum/status_effect/pacify/on_remove()
REMOVE_TRAIT(owner, TRAIT_PACIFISM, "status_effect")
+ return ..()
/datum/status_effect/trance
id = "trance"
@@ -715,6 +721,7 @@ datum/status_effect/pacify
owner.dizziness = 20
/datum/status_effect/trance/on_apply()
+ . = ..()
if(!iscarbon(owner))
return FALSE
RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/hypnotize)
@@ -735,6 +742,7 @@ datum/status_effect/pacify
owner.dizziness = 0
owner.remove_client_colour(/datum/client_colour/monochrome/trance)
to_chat(owner, "You snap out of your trance!")
+ return ..()
/datum/status_effect/trance/proc/hypnotize(datum/source, list/hearing_args)
if(!owner.can_hear())
@@ -820,8 +828,9 @@ datum/status_effect/pacify
return
var/mob/living/carbon/human/H = owner
H.something_horrible(kill_either_way)
+ return ..()
/obj/screen/alert/status_effect/dna_melt
name = "Genetic Breakdown"
desc = "I don't feel so good. Your body can't handle the mutations! You have one minute to remove your mutations, or you will be met with a horrible fate."
- icon_state = "dna_melt"
\ No newline at end of file
+ icon_state = "dna_melt"
diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm
index 608dbb2d7a..d3d39e625a 100644
--- a/code/datums/status_effects/gas.dm
+++ b/code/datums/status_effects/gas.dm
@@ -40,6 +40,7 @@
owner.adjust_bodytemperature(100)
owner.update_mobility()
UnregisterSignal(owner, COMSIG_LIVING_RESIST)
+ return ..()
/datum/status_effect/freon/watcher
duration = 8
diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm
index cb2b4174b5..5f59359193 100644
--- a/code/datums/status_effects/neutral.dm
+++ b/code/datums/status_effects/neutral.dm
@@ -46,7 +46,7 @@
/datum/status_effect/syphon_mark/on_remove()
get_kill()
- . = ..()
+ return ..()
/obj/screen/alert/status_effect/in_love
name = "In Love"
@@ -81,5 +81,5 @@
ADD_TRAIT(owner, TRAIT_SOOTHED_THROAT, "[STATUS_EFFECT_TRAIT]_[id]")
/datum/status_effect/throat_soothed/on_remove()
- . = ..()
- REMOVE_TRAIT(owner, TRAIT_SOOTHED_THROAT, "[STATUS_EFFECT_TRAIT]_[id]")
\ No newline at end of file
+ REMOVE_TRAIT(owner, TRAIT_SOOTHED_THROAT, "[STATUS_EFFECT_TRAIT]_[id]")
+ return ..()
diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm
index 0d84aab763..e2114f0778 100644
--- a/code/datums/status_effects/status_effect.dm
+++ b/code/datums/status_effects/status_effect.dm
@@ -11,7 +11,10 @@
var/on_remove_on_mob_delete = FALSE //if we call on_remove() when the mob is deleted
var/examine_text //If defined, this text will appear when the mob is examined - to use he, she etc. use "SUBJECTPRONOUN" and replace it in the examines themselves
var/alert_type = /obj/screen/alert/status_effect //the alert thrown by the status effect, contains name and description
- var/blocks_combatmode //Does this status effect prevent the user from toggling combat mode?
+ /// If this is TRUE, the user will have combt mode forcefully disabled while this is active.
+ var/blocks_combatmode = FALSE
+ /// If this is TRUE, the user will have sprint forcefully disabled while this is active.
+ var/blocks_sprint = FALSE
var/obj/screen/alert/status_effect/linked_alert = null //the alert itself, if it exists
/datum/status_effect/New(list/arguments)
@@ -32,11 +35,11 @@
var/obj/screen/alert/status_effect/A = owner.throw_alert(id, alert_type)
A.attached_effect = src //so the alert can reference us, if it needs to
linked_alert = A //so we can reference the alert, if we need to
- START_PROCESSING(SSfastprocess, src)
+ START_PROCESSING(SSstatus_effects, src)
return TRUE
/datum/status_effect/Destroy()
- STOP_PROCESSING(SSfastprocess, src)
+ STOP_PROCESSING(SSstatus_effects, src)
if(owner)
owner.clear_alert(id)
LAZYREMOVE(owner.status_effects, src)
@@ -55,9 +58,21 @@
qdel(src)
/datum/status_effect/proc/on_apply() //Called whenever the buff is applied; returning FALSE will cause it to autoremove itself.
+ SHOULD_CALL_PARENT(TRUE)
+ if(blocks_combatmode)
+ ADD_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src)
+ if(blocks_sprint)
+ ADD_TRAIT(owner, TRAIT_SPRINT_LOCKED, src)
return TRUE
+
/datum/status_effect/proc/tick() //Called every tick.
+
/datum/status_effect/proc/on_remove() //Called whenever the buff expires or is removed; do note that at the point this is called, it is out of the owner's status_effects but owner is not yet null
+ SHOULD_CALL_PARENT(TRUE)
+ REMOVE_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src)
+ REMOVE_TRAIT(owner, TRAIT_SPRINT_LOCKED, src)
+ return TRUE
+
/datum/status_effect/proc/be_replaced() //Called instead of on_remove when a status effect is replaced by itself or when a status effect with on_remove_on_mob_delete = FALSE has its mob deleted
owner.clear_alert(id)
LAZYREMOVE(owner.status_effects, src)
diff --git a/code/datums/weather/weather_types/ash_storm.dm b/code/datums/weather/weather_types/ash_storm.dm
index 3247b890c6..b44778054e 100644
--- a/code/datums/weather/weather_types/ash_storm.dm
+++ b/code/datums/weather/weather_types/ash_storm.dm
@@ -94,7 +94,7 @@
if(is_ash_immune(L))
return
if(is_species(L, /datum/species/lizard/ashwalker))
- if(L.getStaminaLoss() <= STAMINA_SOFTCRIT)
+ if(!IS_STAMCRIT(L))
L.adjustStaminaLossBuffered(4)
return
L.adjustFireLoss(4)
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 632d59c84d..48a298984c 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -165,7 +165,7 @@
/datum/outfit/syndicate/full
name = "Syndicate Operative - Full Kit"
- glasses = /obj/item/clothing/glasses/night
+ glasses = /obj/item/clothing/glasses/night/syndicate
mask = /obj/item/clothing/mask/gas/syndicate
suit = /obj/item/clothing/suit/space/hardsuit/syndi
r_pocket = /obj/item/tank/internals/emergency_oxygen/engi
@@ -180,7 +180,7 @@
/datum/outfit/syndicate/lone
name = "Syndicate Operative - Lone"
- glasses = /obj/item/clothing/glasses/night
+ glasses = /obj/item/clothing/glasses/night/syndicate
mask = /obj/item/clothing/mask/gas/syndicate
suit = /obj/item/clothing/suit/space/syndicate/black/red
head = /obj/item/clothing/head/helmet/space/syndicate/black/red
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index bab5c4d93e..ff79038a96 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -409,7 +409,7 @@
if(iscarbon(A))
var/mob/living/carbon/C = A
//If not emagged, only target non downed carbons
- if(mode != TURRET_LETHAL && (C.stat || C.handcuffed || C.recoveringstam))//CIT CHANGE - replaces check for lying with check for recoveringstam
+ if(mode != TURRET_LETHAL && (C.stat || C.handcuffed || (C.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)))//CIT CHANGE - replaces check for lying with check for recoveringstam
continue
//If emagged, target all but dead carbons
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 62d26e1946..ed08386f81 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -390,7 +390,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
//If this were before the above checks, then trying to click on items would act a little funky and signal overrides wouldn't work.
if(iscarbon(usr))
var/mob/living/carbon/C = usr
- if(C.combatmode && ((C.CanReach(src) || (src in directaccess)) && (C.CanReach(over) || (over in directaccess))))
+ if((C.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) && ((C.CanReach(src) || (src in directaccess)) && (C.CanReach(over) || (over in directaccess))))
if(!C.get_active_held_item())
C.UnarmedAttack(src, TRUE)
if(C.get_active_held_item() == src)
@@ -484,7 +484,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
to_chat(user, "You cannot locate any organic eyes on this brain!")
return
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes eyestabbing impossible if you're in stamina softcrit
+ if(IS_STAMCRIT(user))//CIT CHANGE - makes eyestabbing impossible if you're in stamina softcrit
to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto
return //CIT CHANGE - ditto
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index 1e101c3fac..011837d48b 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -267,7 +267,7 @@
if(!on)
return ..()
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes batons unusuable in stamina softcrit
+ if(IS_STAMCRIT(user))//CIT CHANGE - makes batons unusuable in stamina softcrit
to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto
return //CIT CHANGE - ditto
diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm
index 233eabd4ca..3a06c7d7fe 100644
--- a/code/game/objects/items/mop.dm
+++ b/code/game/objects/items/mop.dm
@@ -42,7 +42,7 @@
var/mob/living/L = user
- if(istype(L) && L.getStaminaLoss() >= STAMINA_SOFTCRIT)
+ if(istype(L) && IS_STAMCRIT(L))
to_chat(user, "You're too exhausted for that.")
return
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index 6997e64868..318753e4ad 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -80,7 +80,7 @@
else
user.visible_message("[user] hugs [M] to make [M.p_them()] feel better!", \
"You hug [M] to make [M.p_them()] feel better!")
- if(M.resting && !M.recoveringstam)
+ if(M.resting && !(M.combat_flags & COMBAT_FLAG_HARD_STAMCRIT))
M.set_resting(FALSE, TRUE)
else
user.visible_message("[user] pets [M]!", \
@@ -99,7 +99,7 @@
else
user.visible_message("[user] hugs [M] in a firm bear-hug! [M] looks uncomfortable...", \
"You hug [M] firmly to make [M.p_them()] feel better! [M] looks uncomfortable...")
- if(!CHECK_MOBILITY(M, MOBILITY_STAND) && !M.recoveringstam)
+ if(!CHECK_MOBILITY(M, MOBILITY_STAND) && !(M.combat_flags & COMBAT_FLAG_HARD_STAMCRIT))
M.set_resting(FALSE, TRUE)
else
user.visible_message("[user] bops [M] on the head!", \
diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm
index c9c686414d..01193d0e21 100644
--- a/code/game/objects/items/storage/firstaid.dm
+++ b/code/game/objects/items/storage/firstaid.dm
@@ -189,7 +189,7 @@
new /obj/item/reagent_containers/medspray/silver_sulf(src)
new /obj/item/healthanalyzer/advanced(src)
new /obj/item/reagent_containers/syringe/lethal/choral(src) // what the fuck does anyone use this piece of shit for
- new /obj/item/clothing/glasses/hud/health/night(src)
+ new /obj/item/clothing/glasses/hud/health/night/syndicate(src)
/obj/item/storage/firstaid/tactical/nukeop
name = "improved combat medical kit"
@@ -204,7 +204,7 @@
new /obj/item/reagent_containers/medspray/silver_sulf(src)
new /obj/item/healthanalyzer/advanced(src)
new /obj/item/reagent_containers/syringe/lethal/choral(src) // what the fuck does anyone use this piece of shit for
- new /obj/item/clothing/glasses/hud/health/night(src)
+ new /obj/item/clothing/glasses/hud/health/night/syndicate(src)
/*
* Pill Bottles
diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm
index 4f7948c738..68db9b4807 100644
--- a/code/game/objects/items/storage/toolbox.dm
+++ b/code/game/objects/items/storage/toolbox.dm
@@ -259,6 +259,42 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
new /obj/item/ammo_box/a762(src)
new /obj/item/ammo_box/a762(src)
+/obj/item/storage/toolbox/infiltrator
+ name = "insidious case"
+ desc = "Bearing the emblem of the Syndicate, this case contains a full infiltrator stealth suit, and has enough room to fit weaponry if necessary while being quite the heavy bludgeoning implement when in a pinch."
+ icon_state = "infiltrator_case"
+ item_state = "infiltrator_case"
+ force = 12
+ throwforce = 16
+ w_class = WEIGHT_CLASS_NORMAL
+ has_latches = FALSE
+
+/obj/item/storage/toolbox/infiltrator/ComponentInitialize()
+ . = ..()
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ STR.silent = TRUE
+ STR.max_items = 10
+ STR.max_w_class = WEIGHT_CLASS_NORMAL
+ STR.can_hold = typecacheof(list(
+ /obj/item/clothing/head/helmet/infiltrator,
+ /obj/item/clothing/suit/armor/vest/infiltrator,
+ /obj/item/clothing/under/syndicate/bloodred,
+ /obj/item/clothing/gloves/color/latex/nitrile/infiltrator,
+ /obj/item/clothing/mask/infiltrator,
+ /obj/item/clothing/shoes/combat/sneakboots,
+ /obj/item/gun/ballistic/automatic/pistol,
+ /obj/item/gun/ballistic/revolver,
+ /obj/item/ammo_box
+ ))
+
+/obj/item/storage/toolbox/infiltrator/PopulateContents()
+ new /obj/item/clothing/head/helmet/infiltrator(src)
+ new /obj/item/clothing/suit/armor/vest/infiltrator(src)
+ new /obj/item/clothing/under/syndicate/bloodred(src)
+ new /obj/item/clothing/gloves/color/latex/nitrile/infiltrator(src)
+ new /obj/item/clothing/mask/infiltrator(src)
+ new /obj/item/clothing/shoes/combat/sneakboots(src)
+
/obj/item/storage/toolbox/plastitanium/gold_real
name = "golden toolbox"
desc = "A larger then normal toolbox made of gold plated plastitanium."
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index d4d45b603c..aeb7bc8f59 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -374,6 +374,12 @@
for(var/i in 1 to 3)
new /obj/item/grenade/spawnergrenade/buzzkill(src)
+/obj/item/storage/box/syndie_kit/sleepytime/PopulateContents()
+ new /obj/item/clothing/under/syndicate/bloodred/sleepytime(src)
+ new /obj/item/reagent_containers/food/drinks/mug/coco(src)
+ new /obj/item/toy/plush/carpplushie(src)
+ new /obj/item/bedsheet/syndie(src)
+
/obj/item/storage/box/syndie_kit/kitchen_gun
name = "Kitchen Gun (TM) package"
diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm
index 0e0ff3638f..bdb9879d5b 100644
--- a/code/game/objects/items/stunbaton.dm
+++ b/code/game/objects/items/stunbaton.dm
@@ -153,7 +153,7 @@
return FALSE
if(status && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
clowning_around(user)
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) //CIT CHANGE - makes it impossible to baton in stamina softcrit
+ if(IS_STAMCRIT(user)) //CIT CHANGE - makes it impossible to baton in stamina softcrit
to_chat(user, "You're too exhausted for that.")
return TRUE
if(ishuman(M))
diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm
index dee0e3707b..ff20aa0e00 100644
--- a/code/game/objects/items/twohanded.dm
+++ b/code/game/objects/items/twohanded.dm
@@ -248,7 +248,7 @@
/obj/item/twohanded/fireaxe/afterattack(atom/A, mob/living/user, proximity)
. = ..()
- if(!proximity || (user.getStaminaLoss() > STAMINA_SOFTCRIT))
+ if(!proximity || IS_STAMCRIT(user)) //don't make stamcrit message they'll already have gotten one from the primary attack.
return
if(wielded) //destroys windows and grilles in one hit (or more if it has a ton of health like plasmaglass)
if(istype(A, /obj/structure/window))
@@ -1173,7 +1173,7 @@
turn_off()
/obj/item/twohanded/electrostaff/attack(mob/living/target, mob/living/user)
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes it impossible to baton in stamina softcrit
+ if(IS_STAMCRIT(user))//CIT CHANGE - makes it impossible to baton in stamina softcrit
to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto
return //CIT CHANGE - ditto
if(on && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index 49ca5013ac..c593451c24 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -101,7 +101,7 @@
if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
to_chat(user, "You can't do that right now!")
return TRUE
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
+ if(IS_STAMCRIT(user))
to_chat(user, "You're too exhausted for that.")
return TRUE
var/mob/living/poordude = buckled_mobs[1]
diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
index b967b4efe1..da11f858f8 100644
--- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm
+++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
@@ -15,7 +15,7 @@
new /obj/item/ammo_box/magazine/m10mm(src)
new /obj/item/storage/belt/military(src)
new /obj/item/crowbar/red(src)
- new /obj/item/clothing/glasses/night(src)
+ new /obj/item/clothing/glasses/night/syndicate(src)
/obj/structure/closet/syndicate/nuclear
desc = "It's a storage unit for a Syndicate boarding party."
diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm
index 066249505d..d5b5cfc695 100644
--- a/code/game/turfs/open.dm
+++ b/code/game/turfs/open.dm
@@ -260,7 +260,7 @@
return FALSE
if(ishuman(C) && !(lube & SLIP_WHEN_JOGGING))
var/mob/living/carbon/human/H = C
- if(!H.sprinting && H.getStaminaLoss() <= 20)
+ if(!(H.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) && H.getStaminaLoss() <= 20)
return FALSE
if(!(lube&SLIDE_ICE))
to_chat(C, "You slipped[ O ? " on the [O.name]" : ""]!")
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index d29945508f..4629ed5c35 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -121,25 +121,25 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"taur" = "None",
"genitals_use_skintone" = FALSE,
"has_cock" = FALSE,
- "cock_shape" = "Human",
- "cock_length" = 6,
+ "cock_shape" = DEF_COCK_SHAPE,
+ "cock_length" = COCK_SIZE_DEF,
"cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF,
"cock_color" = "fff",
"has_balls" = FALSE,
"balls_internal" = FALSE,
"balls_color" = "fff",
- "balls_shape" = "Single",
+ "balls_shape" = DEF_BALLS_SHAPE,
"balls_size" = BALLS_SIZE_DEF,
"balls_cum_rate" = CUM_RATE,
"balls_cum_mult" = CUM_RATE_MULT,
"balls_efficiency" = CUM_EFFICIENCY,
"has_breasts" = FALSE,
"breasts_color" = "fff",
- "breasts_size" = "C",
- "breasts_shape" = "Pair",
+ "breasts_size" = BREASTS_SIZE_DEF,
+ "breasts_shape" = DEF_BREASTS_SHAPE,
"breasts_producing" = FALSE,
"has_vag" = FALSE,
- "vag_shape" = "Human",
+ "vag_shape" = DEF_VAGINA_SHAPE,
"vag_color" = "fff",
"vag_clits" = 1,
"vag_clit_diam" = 0.25,
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 4c9733e97e..63a9ca40e9 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -544,6 +544,18 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list)
features["insect_markings"] = sanitize_inlist(features["insect_markings"], GLOB.insect_markings_list, "None")
features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list)
+
+ features["breasts_size"] = sanitize_inlist(features["breasts_size"], GLOB.breasts_size_list, BREASTS_SIZE_DEF)
+ features["breasts_shape"] = sanitize_inlist(features["breasts_shape"], GLOB.breasts_shapes_list, DEF_BREASTS_SHAPE)
+ features["cock_shape"] = sanitize_inlist(features["cock_shape"], GLOB.cock_shapes_list, DEF_COCK_SHAPE)
+ features["cock_length"] = sanitize_integer(features["cock_length"], COCK_SIZE_MIN, COCK_SIZE_MAX, COCK_SIZE_DEF)
+ features["balls_shape"] = sanitize_inlist(features["balls_shape"], GLOB.balls_shapes_list, DEF_BALLS_SHAPE)
+ features["vag_shape"] = sanitize_inlist(features["vag_shape"], GLOB.vagina_shapes_list, DEF_VAGINA_SHAPE)
+ features["breasts_color"] = sanitize_hexcolor(features["breasts_color"], 3, FALSE, "FFF")
+ features["cock_color"] = sanitize_hexcolor(features["cock_color"], 3, FALSE, "FFF")
+ features["balls_color"] = sanitize_hexcolor(features["balls_color"], 3, FALSE, "FFF")
+ features["vag_color"] = sanitize_hexcolor(features["vag_color"], 3, FALSE, "FFF")
+
features["flavor_text"] = copytext(features["flavor_text"], 1, MAX_FLAVOR_LEN)
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index b67fe2b462..cbd1fcff87 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -447,7 +447,7 @@
permeability_coefficient = 0.01
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
- var/vchange = 1
+ var/voice_change = 1 ///This determines if the voice changer is on or off.
var/datum/action/item_action/chameleon/change/chameleon_action
@@ -470,15 +470,14 @@
chameleon_action.emp_randomise(INFINITY)
/obj/item/clothing/mask/chameleon/attack_self(mob/user)
- vchange = !vchange
- to_chat(user, "The voice changer is now [vchange ? "on" : "off"]!")
-
+ voice_change = !voice_change
+ to_chat(user, "The voice changer is now [voice_change ? "on" : "off"]!")
/obj/item/clothing/mask/chameleon/drone
//Same as the drone chameleon hat, undroppable and no protection
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
// Can drones use the voice changer part? Let's not find out.
- vchange = 0
+ voice_change = 0
/obj/item/clothing/mask/chameleon/drone/Initialize()
. = ..()
diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm
index d3ecccfcf8..66dcf89a7a 100644
--- a/code/modules/clothing/glasses/_glasses.dm
+++ b/code/modules/clothing/glasses/_glasses.dm
@@ -82,6 +82,7 @@
icon_state = "nvgmeson"
item_state = "nvgmeson"
darkness_view = 8
+ flash_protect = -2
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
glass_colour_type = /datum/client_colour/glass_colour/green
@@ -119,10 +120,11 @@
/obj/item/clothing/glasses/night
name = "night vision goggles"
- desc = "You can totally see in the dark now!"
+ desc = "You can totally see in the dark now! Just don't look too closely at bright lights. This lacks any flash correction."
icon_state = "night"
item_state = "glasses"
darkness_view = 8
+ flash_protect = -2
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
glass_colour_type = /datum/client_colour/glass_colour/green
@@ -130,6 +132,12 @@
name = "prescription night vision goggles"
desc = "NVGs but for those with nearsightedness."
vision_correction = 1
+
+/obj/item/clothing/glasses/night/syndicate
+ name = "combat night vision goggles"
+ desc = "See everything, without fear."
+ flash_protect = 1
+ vision_correction = 1
/obj/item/clothing/glasses/science/suicide_act(mob/living/carbon/user)
user.visible_message("[user] is tightening \the [src]'s straps around [user.p_their()] neck! It looks like [user.p_theyre()] trying to commit suicide!")
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index 5c0bb33a29..c745cd74f0 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -63,12 +63,19 @@
/obj/item/clothing/glasses/hud/health/night
name = "night vision health scanner HUD"
- desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness."
+ desc = "An advanced medical heads-up display that allows doctors to find patients in complete darkness."
icon_state = "healthhudnight"
item_state = "glasses"
darkness_view = 8
+ flash_protect = -2
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
glass_colour_type = /datum/client_colour/glass_colour/green
+
+/obj/item/clothing/glasses/hud/health/night/syndicate
+ name = "combat night vision health scanner HUD"
+ desc = "An advanced shielded medical heads-up display that allows soldiers to approximate how much lead poisoning their allies have suffered in complete darkness."
+ flash_protect = 1
+ vision_correction = 1
/obj/item/clothing/glasses/hud/health/sunglasses
name = "medical HUDSunglasses"
@@ -126,6 +133,7 @@
icon_state = "diagnostichudnight"
item_state = "glasses"
darkness_view = 8
+ flash_protect = -2
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
glass_colour_type = /datum/client_colour/glass_colour/green
@@ -199,6 +207,7 @@
desc = "An advanced heads-up display which provides id data and vision in complete darkness."
icon_state = "securityhudnight"
darkness_view = 8
+ flash_protect = -2 //You either are flashproof or you can see in the dark, pick one.
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
glass_colour_type = /datum/client_colour/glass_colour/green
diff --git a/code/modules/clothing/glasses/phantomthief.dm b/code/modules/clothing/glasses/phantomthief.dm
index 96f5cfc201..1c9afcfd6f 100644
--- a/code/modules/clothing/glasses/phantomthief.dm
+++ b/code/modules/clothing/glasses/phantomthief.dm
@@ -35,10 +35,10 @@
return
if(slot != SLOT_GLASSES)
return
- RegisterSignal(user, COMSIG_COMBAT_TOGGLED, .proc/injectadrenaline)
+ RegisterSignal(user, COMSIG_LIVING_COMBAT_ENABLED, .proc/injectadrenaline)
/obj/item/clothing/glasses/phantomthief/syndicate/dropped(mob/user)
. = ..()
if(!istype(user))
return
- UnregisterSignal(user, COMSIG_COMBAT_TOGGLED)
+ UnregisterSignal(user, COMSIG_LIVING_COMBAT_ENABLED)
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index f4b04f5bfe..cf3541fd89 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -194,7 +194,7 @@
/obj/item/clothing/gloves/color/latex
name = "latex gloves"
- desc = "Cheap sterile gloves made from latex."
+ desc = "Cheap sterile gloves made from latex. Transfers basic paramedical knowledge to the wearer via the use of nanochips."
icon_state = "latex"
item_state = "lgloves"
siemens_coefficient = 0.3
@@ -202,14 +202,34 @@
item_color="mime"
transfer_prints = TRUE
resistance_flags = NONE
+ var/carrytrait = TRAIT_QUICK_CARRY
+
+/obj/item/clothing/gloves/color/latex/equipped(mob/user, slot)
+ ..()
+ if(slot == SLOT_GLOVES)
+ ADD_TRAIT(user, carrytrait, CLOTHING_TRAIT)
+
+/obj/item/clothing/gloves/color/latex/dropped(mob/user)
+ ..()
+ REMOVE_TRAIT(user, carrytrait, CLOTHING_TRAIT)
/obj/item/clothing/gloves/color/latex/nitrile
name = "nitrile gloves"
- desc = "Pricy sterile gloves that are stronger than latex."
+ desc = "Pricy sterile gloves that are stronger than latex. Transfers advanced paramedical knowledge to the wearer via the use of nanochips."
icon_state = "nitrile"
item_state = "nitrilegloves"
item_color = "cmo"
transfer_prints = FALSE
+ carrytrait = TRAIT_QUICKER_CARRY
+
+/obj/item/clothing/gloves/color/latex/nitrile/infiltrator
+ name = "insidious combat gloves"
+ desc = "Specialized combat gloves for carrying people around. Transfers tactical kidnapping knowledge to the user via the use of nanochips."
+ icon_state = "infiltrator"
+ item_state = "infiltrator"
+ siemens_coefficient = 0
+ permeability_coefficient = 0.3
+ resistance_flags = FIRE_PROOF | ACID_PROOF
/obj/item/clothing/gloves/color/white
name = "white gloves"
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 3b1b92ea78..6e2e655c1b 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -256,6 +256,21 @@
strip_delay = 100
mutantrace_variation = STYLE_MUZZLE
+/obj/item/clothing/head/helmet/infiltrator
+ name = "insidious helmet"
+ desc = "An insidious armored combat helmet signed with Syndicate insignia. The visor is coated with a resistant paste guaranteed to withstand bright flashes perfectly."
+ icon_state = "infiltrator"
+ item_state = "infiltrator"
+ armor = list("melee" = 40, "bullet" = 40, "laser" = 30, "energy" = 40, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ flash_protect = 2
+ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
+ dynamic_hair_suffix = ""
+ dynamic_fhair_suffix = ""
+ strip_delay = 80
+ mutantrace_variation = STYLE_MUZZLE
+
//LightToggle
/obj/item/clothing/head/helment/ComponentInitialize()
diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm
index dc151cdd42..a87c1cf82b 100644
--- a/code/modules/clothing/masks/boxing.dm
+++ b/code/modules/clothing/masks/boxing.dm
@@ -12,6 +12,20 @@
/obj/item/clothing/mask/balaclava/attack_self(mob/user)
adjustmask(user)
+/obj/item/clothing/mask/infiltrator
+ name = "insidious balaclava"
+ desc = "An incredibly suspicious balaclava made with Syndicate nanofibers to absorb impacts slightly while obfuscating the voice and face using a garbled vocoder."
+ icon_state = "syndicate_balaclava"
+ item_state = "syndicate_balaclava"
+ clothing_flags = ALLOWINTERNALS
+ flags_cover = HEADCOVERSEYES
+ flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
+ visor_flags_inv = HIDEFACE|HIDEFACIALHAIR
+ w_class = WEIGHT_CLASS_SMALL
+ armor = list("melee" = 10, "bullet" = 5, "laser" = 5,"energy" = 5, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 100, "acid" = 40)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ var/voice_unknown = TRUE ///This makes it so that your name shows up as unknown when wearing the mask.
+
/obj/item/clothing/mask/luchador
name = "Luchador Mask"
desc = "Worn by robust fighters, flying high to defeat their foes!"
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index c0e566cc0e..519e4e7fcd 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -19,6 +19,14 @@
permeability_coefficient = 0.05 //Thick soles, and covers the ankle
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
+/obj/item/clothing/shoes/combat/sneakboots
+ name = "insidious sneakboots"
+ desc = "A pair of insidious boots with special noise muffling soles which very slightly drown out your footsteps. They would be absolutely perfect for stealth operations were it not for the iconic Syndicate flairs."
+ icon_state = "sneakboots"
+ item_state = "sneakboots"
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ clothing_flags = TRAIT_SILENT_STEP
+
/obj/item/clothing/shoes/combat/swat //overpowered boots for death squads
name = "\improper SWAT boots"
desc = "High speed, no drag combat boots."
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 2be7e4f545..148837d999 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -192,6 +192,15 @@
. = ..()
allowed = GLOB.detective_vest_allowed
+/obj/item/clothing/suit/armor/vest/infiltrator
+ name = "insidious combat vest"
+ desc = "An insidious combat vest designed using Syndicate nanofibers to absorb the supreme majority of kinetic blows. Although it doesn't look like it'll do too much for energy impacts."
+ icon_state = "infiltrator"
+ item_state = "infiltrator"
+ armor = list("melee" = 30, "bullet" = 40, "laser" = 20, "energy" = 30, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ strip_delay = 80
+
//All of the armor below is mostly unused
/obj/item/clothing/suit/armor/centcom
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index 5208903a39..fe0bbb3ede 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -13,6 +13,7 @@
var/can_adjust = TRUE
var/adjusted = NORMAL_STYLE
var/alt_covers_chest = FALSE // for adjusted/rolled-down jumpsuits, FALSE = exposes chest and arms, TRUE = exposes arms only
+ var/dummy_thick = FALSE // is able to hold accessories on its item
var/obj/item/clothing/accessory/attached_accessory
var/mutable_appearance/accessory_overlay
mutantrace_variation = STYLE_DIGITIGRADE
@@ -83,6 +84,10 @@
if(user)
to_chat(user, "[src] already has an accessory.")
return
+ if(dummy_thick)
+ if(user)
+ to_chat(user, "[src] is too bulky and cannot have accessories attached to it!")
+ return
else
if(user && !user.temporarilyRemoveItemFromInventory(I))
return
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index 37d2dcffbc..1250f4ed19 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -19,6 +19,25 @@
alt_covers_chest = TRUE
fitted = FEMALE_UNIFORM_TOP
+/obj/item/clothing/under/syndicate/bloodred
+ name = "blood-red sneaksuit"
+ desc = "An insidious armored jumpsuit lined with Syndicate nanofibers and prototype platings, slightly resistant to most forms of damage, but is far too bulky to have anything attached to it. It still counts as stealth if there are no witnesses."
+ icon_state = "bloodred_pajamas"
+ item_state = "bl_suit"
+ item_color = "bloodred_pajamas"
+ dummy_thick = TRUE
+ armor = list("melee" = 10, "bullet" = 10, "laser" = 10,"energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 50, "acid" = 40)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ can_adjust = FALSE
+
+/obj/item/clothing/under/syndicate/bloodred/sleepytime
+ name = "blood-red pajamas"
+ desc = "Do operatives dream of nuclear sheep?"
+ icon_state = "bloodred_pajamas"
+ item_state = "bl_suit"
+ item_color = "bloodred_pajamas"
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
+
/obj/item/clothing/under/syndicate/tacticool
name = "tacticool turtleneck"
desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-."
@@ -75,7 +94,7 @@
item_color = "rus_under"
can_adjust = FALSE
armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
- resistance_flags = NONE
+ resistance_flags = NONE
/obj/item/clothing/under/syndicate/baseball
name = "major league, number unknown"
diff --git a/code/modules/keybindings/bindings_carbon.dm b/code/modules/keybindings/bindings_carbon.dm
index eef170cea9..e344bc9d20 100644
--- a/code/modules/keybindings/bindings_carbon.dm
+++ b/code/modules/keybindings/bindings_carbon.dm
@@ -4,6 +4,6 @@
toggle_throw_mode()
return
if("C")
- toggle_combat_mode()
+ user_toggle_intentional_combat_mode()
return
return ..()
\ No newline at end of file
diff --git a/code/modules/keybindings/bindings_human.dm b/code/modules/keybindings/bindings_human.dm
index ed033935b2..9569de338c 100644
--- a/code/modules/keybindings/bindings_human.dm
+++ b/code/modules/keybindings/bindings_human.dm
@@ -59,11 +59,11 @@
switch(_key)
if("Shift")
if(!user.prefs.sprint_spacebar)
- user.prefs.sprint_toggle ? togglesprint() : sprint_hotkey(TRUE) //Yes, this looks hacky. Yes, this works.
+ user.prefs.sprint_toggle ? default_toggle_sprint() : sprint_hotkey(TRUE) //Yes, this looks hacky. Yes, this works.
return
if("Space")
if(user.prefs.sprint_spacebar)
- user.prefs.sprint_toggle ? togglesprint() : sprint_hotkey(TRUE)
+ user.prefs.sprint_toggle ? default_toggle_sprint() : sprint_hotkey(TRUE)
return
return ..()
diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm
index fda136df0b..cdb8aff2c6 100644
--- a/code/modules/mob/living/carbon/alien/alien_defense.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defense.dm
@@ -21,7 +21,7 @@ In all, this is a lot like the monkey code. /N
return
switch(M.a_intent)
if (INTENT_HELP)
- if(!recoveringstam)
+ if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT))
set_resting(FALSE, TRUE, FALSE)
AdjustAllImmobility(-60, FALSE)
AdjustUnconscious(-60, FALSE)
diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm
index 4d362ca554..00d929a1e0 100644
--- a/code/modules/mob/living/carbon/alien/larva/life.dm
+++ b/code/modules/mob/living/carbon/alien/larva/life.dm
@@ -27,7 +27,7 @@
else
if(stat == UNCONSCIOUS)
stat = CONSCIOUS
- if(!recoveringstam)
+ if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT))
set_resting(FALSE, TRUE)
adjust_blindness(-1)
update_mobility()
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 5bb1e6d17d..f5f9a734ae 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -153,7 +153,7 @@
return
//CIT CHANGES - makes it impossible to throw while in stamina softcrit
- if(getStaminaLoss() >= STAMINA_SOFTCRIT)
+ if(IS_STAMCRIT(src))
to_chat(src, "You're too exhausted.")
return
var/random_turn = a_intent == INTENT_HARM
@@ -448,7 +448,7 @@
modifier -= 40 //Clumsy people are more likely to hit themselves -Honk!
//CIT CHANGES START HERE
- else if(combatmode)
+ else if(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)
modifier += 50
if(modifier < 100)
@@ -820,15 +820,13 @@
return
if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (HAS_TRAIT(src, TRAIT_DEATHCOMA)) || (health <= HEALTH_THRESHOLD_FULLCRIT && !HAS_TRAIT(src, TRAIT_NOHARDCRIT)))
stat = UNCONSCIOUS
+ disable_intentional_combat_mode(FALSE, FALSE)
if(!eye_blind)
blind_eyes(1)
- if(combatmode)
- toggle_combat_mode(TRUE, TRUE)
else
if(health <= crit_threshold && !HAS_TRAIT(src, TRAIT_NOSOFTCRIT))
stat = SOFT_CRIT
- if(combatmode)
- toggle_combat_mode(TRUE, TRUE)
+ disable_intentional_combat_mode(FALSE, FALSE)
else
stat = CONSCIOUS
adjust_blindness(-1)
@@ -1011,8 +1009,7 @@
return TRUE
/mob/living/carbon/transfer_ckey(mob/new_mob, send_signal = TRUE)
- if(combatmode)
- toggle_combat_mode(TRUE, TRUE)
+ disable_intentional_combat_mode(TRUE, FALSE)
return ..()
/mob/living/carbon/can_see_reagents()
diff --git a/code/modules/mob/living/carbon/carbon_combat.dm b/code/modules/mob/living/carbon/carbon_combat.dm
new file mode 100644
index 0000000000..f43d850401
--- /dev/null
+++ b/code/modules/mob/living/carbon/carbon_combat.dm
@@ -0,0 +1,6 @@
+/mob/living/carbon/enable_intentional_combat_mode()
+ . = ..()
+ if(.)
+ if(voremode)
+ toggle_vore_mode()
+
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 385dfc15ff..b3671bbdf3 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -79,13 +79,11 @@
/mob/living/carbon/attacked_by(obj/item/I, mob/living/user)
//CIT CHANGES START HERE - combatmode and resting checks
var/totitemdamage = I.force
- if(iscarbon(user))
- var/mob/living/carbon/tempcarb = user
- if(!tempcarb.combatmode)
- totitemdamage *= 0.5
+ if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ totitemdamage *= 0.5
if(!CHECK_MOBILITY(user, MOBILITY_STAND))
totitemdamage *= 0.5
- if(!combatmode)
+ if(!(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
totitemdamage *= 1.5
//CIT CHANGES END HERE
var/impacting_zone = (user == src)? check_zone(user.zone_selected) : ran_zone(user.zone_selected)
@@ -345,7 +343,7 @@
AdjustAllImmobility(-60, FALSE)
AdjustUnconscious(-60, FALSE)
AdjustSleeping(-100, FALSE)
- if(recoveringstam)
+ if(combat_flags & COMBAT_FLAG_HARD_STAMCRIT)
adjustStaminaLoss(-15)
else
set_resting(FALSE, FALSE)
diff --git a/code/modules/mob/living/carbon/carbon_sprint.dm b/code/modules/mob/living/carbon/carbon_sprint.dm
new file mode 100644
index 0000000000..63d3e03356
--- /dev/null
+++ b/code/modules/mob/living/carbon/carbon_sprint.dm
@@ -0,0 +1,18 @@
+/// Sprint buffer ///
+/mob/living/carbon/doSprintLossTiles(tiles)
+ doSprintBufferRegen(FALSE) //first regen.
+ if(sprint_buffer)
+ var/use = min(tiles, sprint_buffer)
+ sprint_buffer -= use
+ tiles -= use
+ update_hud_sprint_bar()
+ if(!tiles) //we had enough, we're done!
+ return
+ adjustStaminaLoss(tiles * sprint_stamina_cost) //use stamina to cover deficit.
+
+/mob/living/carbon/proc/doSprintBufferRegen(updating = TRUE)
+ var/diff = world.time - sprint_buffer_regen_last
+ sprint_buffer_regen_last = world.time
+ sprint_buffer = min(sprint_buffer_max, sprint_buffer + sprint_buffer_regen_ds * diff)
+ if(updating)
+ update_hud_sprint_bar()
diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm
index e0c394b2e0..28e0f2028d 100644
--- a/code/modules/mob/living/carbon/death.dm
+++ b/code/modules/mob/living/carbon/death.dm
@@ -7,8 +7,8 @@
if(!gibbed)
emote("deathgasp")
- if(combatmode)
- toggle_combat_mode(TRUE, TRUE)
+
+ disable_intentional_combat_mode(TRUE, FALSE)
. = ..()
@@ -67,6 +67,5 @@
BP.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
/mob/living/carbon/ghostize(can_reenter_corpse = TRUE, special = FALSE, penalize = FALSE, voluntary = FALSE)
- if(combatmode)
- toggle_combat_mode(TRUE, TRUE)
+ disable_intentional_combat_mode(TRUE, FALSE)
return ..()
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index efd81c1744..1ee3369701 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -90,7 +90,7 @@
if(digitalcamo)
. += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly unsimian manner."
- if(combatmode)
+ if(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)
. += "[t_He] [t_is] visibly tense[CHECK_MOBILITY(src, MOBILITY_STAND) ? "." : ", and [t_is] standing in combative stance."]"
var/trait_exam = common_trait_examine()
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 41f8283ab9..3c064d9525 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -29,7 +29,7 @@
. = ..()
if(CONFIG_GET(flag/disable_stambuffer))
- togglesprint()
+ enable_intentional_sprint_mode()
RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /atom.proc/clean_blood)
@@ -880,10 +880,20 @@
return (ishuman(target) && !CHECK_MOBILITY(target, MOBILITY_STAND))
/mob/living/carbon/human/proc/fireman_carry(mob/living/carbon/target)
- if(can_be_firemanned(target))
- visible_message("[src] starts lifting [target] onto their back...",
- "You start lifting [target] onto your back...")
- if(do_after(src, 30, TRUE, target))
+ var/carrydelay = 50 //if you have latex you are faster at grabbing
+ var/skills_space = "" //cobby told me to do this
+ if(HAS_TRAIT(src, TRAIT_QUICKER_CARRY))
+ carrydelay = 30
+ skills_space = "expertly"
+ else if(HAS_TRAIT(src, TRAIT_QUICK_CARRY))
+ carrydelay = 40
+ skills_space = "quickly"
+ if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE))
+ visible_message("[src] starts [skills_space] lifting [target] onto their back..",
+ //Joe Medic starts quickly/expertly lifting Grey Tider onto their back..
+ "[carrydelay < 35 ? "Using your gloves' nanochips, you" : "You"] [skills_space] start to lift [target] onto your back[carrydelay == 40 ? ", while assisted by the nanochips in your gloves.." : "..."]")
+ //(Using your gloves' nanochips, you/You) ( /quickly/expertly) start to lift Grey Tider onto your back(, while assisted by the nanochips in your gloves../...)
+ if(do_after(src, carrydelay, TRUE, target))
//Second check to make sure they're still valid to be carried
if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE))
target.set_resting(FALSE, TRUE)
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 63c7d8f668..2e5efa3105 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -6,6 +6,9 @@
can_buckle = TRUE
buckle_lying = FALSE
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
+ /// Enable stamina combat
+ combat_flags = COMBAT_FLAGS_DEFAULT
+
//Hair colour and style
var/hair_color = "000"
var/hair_style = "Bald"
diff --git a/code/modules/mob/living/carbon/human/human_mobility.dm b/code/modules/mob/living/carbon/human/human_mobility.dm
index 61ceb42336..dc498c4153 100644
--- a/code/modules/mob/living/carbon/human/human_mobility.dm
+++ b/code/modules/mob/living/carbon/human/human_mobility.dm
@@ -1,5 +1,5 @@
/mob/living/carbon/human/resist_a_rest(automatic = FALSE, ignoretimer = FALSE)
- if(!resting || stat || attemptingstandup)
+ if(!resting || stat || (combat_flags & COMBAT_FLAG_RESISTING_REST))
return FALSE
if(ignoretimer)
set_resting(FALSE, FALSE)
@@ -13,10 +13,10 @@
return FALSE
else
var/totaldelay = 3 //A little bit less than half of a second as a baseline for getting up from a rest
- if(getStaminaLoss() >= STAMINA_SOFTCRIT)
+ if(IS_STAMCRIT(src))
to_chat(src, "You're too exhausted to get up!")
return FALSE
- attemptingstandup = TRUE
+ combat_flags |= COMBAT_FLAG_RESISTING_REST
var/health_deficiency = max((maxHealth - (health - getStaminaLoss()))*0.5, 0)
if(!has_gravity())
health_deficiency = health_deficiency*0.2
@@ -37,10 +37,11 @@
visible_message("[standupwarning]", usernotice, vision_distance = 5)
if(do_after(src, totaldelay, target = src, required_mobility_flags = MOBILITY_RESIST))
set_resting(FALSE, TRUE)
- attemptingstandup = FALSE
+
+ combat_flags &= ~COMBAT_FLAG_RESISTING_REST
return TRUE
else
- attemptingstandup = FALSE
+ combat_flags &= ~COMBAT_FLAG_RESISTING_REST
if(resting) //we didn't shove ourselves up or something
visible_message("[src] falls right back down.", "You fall right back down.")
if(has_gravity())
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 608ad76128..b6cf0f5a82 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -9,6 +9,13 @@
/mob/living/carbon/human/movement_delay()
. = ..()
+ if(CHECK_MOBILITY(src, MOBILITY_STAND) && m_intent == MOVE_INTENT_RUN && (combat_flags & COMBAT_FLAG_SPRINT_ACTIVE))
+ var/static/datum/config_entry/number/movedelay/sprint_speed_increase/SSI
+ if(!SSI)
+ SSI = CONFIG_GET_ENTRY(number/movedelay/sprint_speed_increase)
+ . -= SSI.config_entry_value
+ if(wrongdirmovedelay)
+ . += 1
if (m_intent == MOVE_INTENT_WALK && HAS_TRAIT(src, TRAIT_SPEEDY_STEP))
. -= 1.5
@@ -42,10 +49,18 @@
return ((shoes && shoes.negates_gravity()) || (dna.species.negates_gravity(src)))
/mob/living/carbon/human/Move(NewLoc, direct)
+ var/oldpseudoheight = pseudo_z_axis
. = ..()
for(var/datum/mutation/human/HM in dna.mutations)
HM.on_move(src, NewLoc)
-
+ if(. && (combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) && !(movement_type & FLYING) && CHECK_ALL_MOBILITY(src, MOBILITY_MOVE|MOBILITY_STAND) && m_intent == MOVE_INTENT_RUN && has_gravity(loc) && !pulledby)
+ if(!HAS_TRAIT(src, TRAIT_FREESPRINT))
+ doSprintLossTiles(1)
+ if((oldpseudoheight - pseudo_z_axis) >= 8)
+ to_chat(src, "You trip off of the elevated surface!")
+ for(var/obj/item/I in held_items)
+ accident(I)
+ DefaultCombatKnockdown(80)
if(shoes)
if(!lying && !buckled)
if(loc == NewLoc)
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 1079c48bf9..d703f6a4e2 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -13,7 +13,7 @@
/mob/living/carbon/human/GetVoice()
if(istype(wear_mask, /obj/item/clothing/mask/chameleon))
var/obj/item/clothing/mask/chameleon/V = wear_mask
- if(V.vchange && wear_id)
+ if(V.voice_change && wear_id)
var/obj/item/card/id/idcard = wear_id.GetID()
if(istype(idcard))
return idcard.registered_name
@@ -21,6 +21,12 @@
return real_name
else
return real_name
+ if(istype(wear_mask, /obj/item/clothing/mask/infiltrator))
+ var/obj/item/clothing/mask/infiltrator/V = wear_mask
+ if(V.voice_unknown)
+ return ("Unknown")
+ else
+ return real_name
if(mind)
var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling)
if(changeling && changeling.mimicing )
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index c7444425aa..b5453598ee 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1450,15 +1450,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
target.grabbedby(user)
return 1
-
-
-
-
/datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(!attacker_style && HAS_TRAIT(user, TRAIT_PACIFISM))
to_chat(user, "You don't want to harm [target]!")
return FALSE
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) //CITADEL CHANGE - makes it impossible to punch while in stamina softcrit
+ if(IS_STAMCRIT(user)) //CITADEL CHANGE - makes it impossible to punch while in stamina softcrit
to_chat(user, "You're too exhausted.") //CITADEL CHANGE - ditto
return FALSE //CITADEL CHANGE - ditto
if(target.check_martial_melee_block())
@@ -1487,11 +1483,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/damage = rand(user.dna.species.punchdamagelow, user.dna.species.punchdamagehigh)
//CITADEL CHANGES - makes resting and disabled combat mode reduce punch damage, makes being out of combat mode result in you taking more damage
- if(!target.combatmode && damage < user.dna.species.punchstunthreshold)
+ if(!(target.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) && damage < user.dna.species.punchstunthreshold)
damage = user.dna.species.punchstunthreshold - 1
if(!CHECK_MOBILITY(user, MOBILITY_STAND))
damage *= 0.5
- if(!user.combatmode)
+ if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
damage *= 0.25
//END OF CITADEL CHANGES
@@ -1542,10 +1538,13 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(target.check_martial_melee_block()) //END EDIT
target.visible_message("[target] blocks [user]'s disarm attempt!")
- return 0
- else if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
+ return FALSE
+ if(IS_STAMCRIT(user))
to_chat(user, "You're too exhausted!")
return FALSE
+ else if(target.check_block())
+ target.visible_message("[target] blocks [user]'s disarm attempt!")
+ return FALSE
else if(aim_for_mouth && ( target_on_help || target_restrained || target_aiming_for_mouth))
playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1)
@@ -1605,11 +1604,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
target.forcesay(GLOB.hit_appends)
log_combat(user, target, "pushed over")
return*/
- if(!target.combatmode) // CITADEL CHANGE
+ if(!(target.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) // CITADEL CHANGE
randn += -10 //CITADEL CHANGE - being out of combat mode makes it easier for you to get disarmed
if(!CHECK_MOBILITY(user, MOBILITY_STAND)) //CITADEL CHANGE
randn += 100 //CITADEL CHANGE - No kosher disarming if you're resting
- if(!user.combatmode) //CITADEL CHANGE
+ if(!(target.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) //CITADEL CHANGE
randn += 25 //CITADEL CHANGE - Makes it harder to disarm outside of combat mode
if(user.pulling == target)
randn += -20 //If you have the time to get someone in a grab, you should have a greater chance at snatching the thing in their hand. Will be made completely obsolete by the grab rework but i've got a poor track record for releasing big projects on time so w/e i guess
@@ -1686,14 +1685,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords)
//CIT CHANGES START HERE - combatmode and resting checks
var/totitemdamage = I.force
- if(iscarbon(user))
- var/mob/living/carbon/tempcarb = user
- if(!tempcarb.combatmode)
- totitemdamage *= 0.5
+ if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ totitemdamage *= 0.5
if(!CHECK_MOBILITY(user, MOBILITY_STAND))
totitemdamage *= 0.5
if(istype(H))
- if(!H.combatmode)
+ if(!(H.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
totitemdamage *= 1.5
//CIT CHANGES END HERE
var/weakness = H.check_weakness(I, user)
@@ -1803,9 +1800,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
/datum/species/proc/althelp(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(user == target && istype(user))
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
+ if(IS_STAMCRIT(user))
to_chat(user, "You're too exhausted for that.")
return
+ if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ to_chat(user, "You need combat mode to be active to that!")
+ return
if(user.IsKnockdown() || user.IsParalyzed() || user.IsStun())
to_chat(user, "You can't seem to force yourself up right now!")
return
@@ -1818,7 +1818,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
playsound(user, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
/datum/species/proc/altdisarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
+ if(IS_STAMCRIT(user))
to_chat(user, "You're too exhausted.")
return FALSE
if(target.check_martial_melee_block())
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 4aae10c444..ebb5a3dd31 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -507,10 +507,10 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
//this updates all special effects: stun, sleeping, knockdown, druggy, stuttering, etc..
/mob/living/carbon/handle_status_effects()
..()
- if(getStaminaLoss() && !combatmode)//CIT CHANGE - prevents stamina regen while combat mode is active
- adjustStaminaLoss(!CHECK_MOBILITY(src, MOBILITY_STAND) ? (recoveringstam ? -7.5 : -6) : -3)//CIT CHANGE - decreases adjuststaminaloss to stop stamina damage from being such a joke
+ if(getStaminaLoss() && !(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) //CIT CHANGE - prevents stamina regen while combat mode is active
+ adjustStaminaLoss(!CHECK_MOBILITY(src, MOBILITY_STAND) ? ((combat_flags & COMBAT_FLAG_HARD_STAMCRIT) ? -7.5 : -6) : -3)//CIT CHANGE - decreases adjuststaminaloss to stop stamina damage from being such a joke
- if(!recoveringstam && incomingstammult != 1)
+ if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && incomingstammult != 1)
incomingstammult = max(0.01, incomingstammult)
incomingstammult = min(1, incomingstammult*2)
diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm
index 3d567b0eff..edbd1562b3 100644
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ b/code/modules/mob/living/carbon/monkey/life.dm
@@ -35,7 +35,7 @@
gorillize()
return
if(radiation > RAD_MOB_KNOCKDOWN && prob(RAD_MOB_KNOCKDOWN_PROB))
- if(!recoveringstam)
+ if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT))
emote("collapse")
DefaultCombatKnockdown(RAD_MOB_KNOCKDOWN_AMOUNT)
to_chat(src, "You feel weak.")
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 3544f1b82f..265d520749 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -118,22 +118,22 @@
if(!CHECK_MOBILITY(src, MOBILITY_STAND) && CHECK_MOBILITY(L, MOBILITY_STAND))
var/origtargetloc = L.loc
if(!pulledby)
- if(attemptingcrawl)
+ if(combat_flags & COMBAT_FLAG_ATTEMPTING_CRAWL)
return TRUE
- if(getStaminaLoss() >= STAMINA_SOFTCRIT)
+ if(IS_STAMCRIT(src))
to_chat(src, "You're too exhausted to crawl under [L].")
return TRUE
- attemptingcrawl = TRUE
+ ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_ATTEMPTING_CRAWL)
visible_message("[src] is attempting to crawl under [L].", "You are now attempting to crawl under [L].")
if(!do_after(src, CRAWLUNDER_DELAY, target = src) || CHECK_MOBILITY(src, MOBILITY_STAND))
- attemptingcrawl = FALSE
+ DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_ATTEMPTING_CRAWL)
return TRUE
var/src_passmob = (pass_flags & PASSMOB)
pass_flags |= PASSMOB
Move(origtargetloc)
if(!src_passmob)
pass_flags &= ~PASSMOB
- attemptingcrawl = FALSE
+ DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_ATTEMPTING_CRAWL)
return TRUE
//END OF CIT CHANGES
@@ -368,9 +368,8 @@
to_chat(src, "You have given up life and succumbed to death.")
death()
-
/mob/living/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, check_immobilized = FALSE)
- if(stat || IsUnconscious() || IsStun() || IsParalyzed() || recoveringstam || (check_immobilized && IsImmobilized()) || (!ignore_restraints && restrained(ignore_grab)))
+ if(stat || IsUnconscious() || IsStun() || IsParalyzed() || (combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (check_immobilized && IsImmobilized()) || (!ignore_restraints && restrained(ignore_grab)))
return TRUE
/mob/living/canUseStorage()
diff --git a/code/modules/mob/living/living_combat.dm b/code/modules/mob/living/living_combat.dm
new file mode 100644
index 0000000000..4cd2def5a8
--- /dev/null
+++ b/code/modules/mob/living/living_combat.dm
@@ -0,0 +1,88 @@
+/mob/living/ComponentInitialize()
+ . = ..()
+ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_COMBAT_MODE_LOCKED), .proc/update_combat_lock)
+
+/mob/living/proc/update_combat_lock()
+ var/locked = HAS_TRAIT(src, TRAIT_COMBAT_MODE_LOCKED)
+ var/desired = (combat_flags & COMBAT_FLAG_COMBAT_TOGGLED)
+ var/actual = (combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)
+ if(actual)
+ if(locked)
+ disable_combat_mode(FALSE, TRUE, FALSE, FALSE)
+ else if(!desired)
+ disable_combat_mode(TRUE, TRUE, FALSE, FALSE)
+ else
+ if(desired && !locked)
+ enable_combat_mode(FALSE, TRUE, FALSE, FALSE)
+ update_combat_mode_icon()
+
+/mob/living/proc/disable_combat_mode(silent = TRUE, was_forced = FALSE, visible = FALSE, update_icon = TRUE)
+ if(!(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ return
+ DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_COMBAT_ACTIVE)
+ SEND_SIGNAL(src, COMSIG_LIVING_COMBAT_DISABLED, was_forced)
+ if(visible)
+ visible_message("[src] goes limp.", "Your muscles are forcibly relaxed!")
+ else if(!silent)
+ to_chat(src, was_forced? "Your muscles are forcibly relaxed!" : "You relax your muscles.")
+ if(update_icon)
+ update_combat_mode_icon()
+
+/mob/living/proc/enable_combat_mode(silent = TRUE, was_forced = FALSE, visible = FALSE, update_icon = TRUE)
+ if(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)
+ return
+ ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_COMBAT_ACTIVE)
+ SEND_SIGNAL(src, COMSIG_LIVING_COMBAT_ENABLED, was_forced)
+ if(visible)
+ visible_message("[src] drops into a combative stance!", "You drop into a combative stance!")
+ else if(!silent)
+ to_chat(src, was_forced? "Your muscles reflexively tighten!" : "You tighten your muscles.")
+ if(update_icon)
+ update_combat_mode_icon()
+
+/// Updates the combat mode HUD icon.
+/mob/living/proc/update_combat_mode_icon()
+ var/obj/screen/combattoggle/T = locate() in hud_used?.static_inventory
+ T?.update_icon_state()
+
+/// Enables intentionally being in combat mode. Please try not to use this proc for feedback whenever possible.
+/mob/living/proc/enable_intentional_combat_mode(silent = TRUE, visible = FALSE)
+ if((combat_flags & COMBAT_FLAG_COMBAT_TOGGLED) && (combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ return
+ ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_COMBAT_TOGGLED)
+ if(!HAS_TRAIT(src, TRAIT_COMBAT_MODE_LOCKED) && !(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ enable_combat_mode(silent, FALSE, visible, FALSE)
+ update_combat_mode_icon()
+ client?.show_popup_menus = FALSE
+ return TRUE
+
+/// Disables intentionally being in combat mode. Please try not to use this proc for feedback whenever possible.
+/mob/living/proc/disable_intentional_combat_mode(silent = TRUE, visible = FALSE)
+ if(!(combat_flags & COMBAT_FLAG_COMBAT_TOGGLED) && !(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ return
+ DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_COMBAT_TOGGLED)
+ if(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)
+ disable_combat_mode(silent, FALSE, visible, FALSE)
+ update_combat_mode_icon()
+ client?.show_popup_menus = TRUE
+ return TRUE
+
+/// Toggles whether the user is intentionally in combat mode. THIS should be the proc you generally use! Has built in visual/to other player feedback, as well as an audible cue to ourselves.
+/mob/living/proc/user_toggle_intentional_combat_mode(visible = TRUE)
+ var/old = (combat_flags & COMBAT_FLAG_COMBAT_TOGGLED)
+ if(old)
+ disable_intentional_combat_mode()
+ playsound_local(src, 'sound/misc/ui_toggleoff.ogg', 50, FALSE, pressure_affected = FALSE) //Slightly modified version of the above!
+ else if(CAN_TOGGLE_COMBAT_MODE(src))
+ enable_intentional_combat_mode()
+ var/current = (combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) //because we could be locked
+ if(current != old) //only sound effect if you succeeded. Could have the feedback system be better but shrug, someone else can do it.
+ if(current)
+ playsound_local(src, 'sound/misc/ui_toggle.ogg', 50, FALSE, pressure_affected = FALSE) //Sound from interbay!
+ if(visible)
+ if(world.time >= combatmessagecooldown)
+ combatmessagecooldown = world.time + 10 SECONDS
+ if(a_intent != INTENT_HELP)
+ visible_message("[src] [resting ? "tenses up" : (prob(95)? "drops into a combative stance" : (prob(95)? "poses aggressively" : "asserts dominance with their pose"))].")
+ else
+ visible_message("[src] [pick("looks","seems","goes")] [pick("alert","attentive","vigilant")].")
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index ed46568489..0b4be7d463 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -118,3 +118,22 @@
/// Next world.time when we can get the "you can't move while buckled to [thing]" message.
var/buckle_message_cooldown = 0
+
+ //// CITADEL STATION COMBAT ////
+ /// See __DEFINES/combat.dm
+ var/combat_flags = COMBAT_FLAGS_STAMSYSTEM_EXEMPT
+ /// Next world.time when we will show a visible message on entering combat mode voluntarily again.
+ var/combatmessagecooldown = 0
+
+ var/incomingstammult = 1
+ var/bufferedstam = 0
+ var/stambuffer = 20
+ var/stambufferregentime
+
+ //Sprint buffer---
+ var/sprint_buffer = 42 //Tiles
+ var/sprint_buffer_max = 42
+ var/sprint_buffer_regen_ds = 0.3 //Tiles per world.time decisecond
+ var/sprint_buffer_regen_last = 0 //last world.time this was regen'd for math.
+ var/sprint_stamina_cost = 0.70 //stamina loss per tile while insufficient sprint buffer.
+ //---End
diff --git a/code/modules/mob/living/living_mobility.dm b/code/modules/mob/living/living_mobility.dm
index 8829e3a7f2..938a2355b4 100644
--- a/code/modules/mob/living/living_mobility.dm
+++ b/code/modules/mob/living/living_mobility.dm
@@ -33,9 +33,9 @@
set name = "Rest"
set category = "IC"
if(client?.prefs?.autostand)
- intentionalresting = !intentionalresting
- to_chat(src, "You are now attempting to [intentionalresting ? "[!resting ? "lay down and ": ""]stay down" : "[resting ? "get up and ": ""]stay up"].")
- if(intentionalresting && !resting)
+ TOGGLE_BITFIELD(combat_flags, COMBAT_FLAG_INTENTIONALLY_RESTING)
+ to_chat(src, "You are now attempting to [(combat_flags & COMBAT_FLAG_INTENTIONALLY_RESTING) ? "[!resting ? "lay down and ": ""]stay down" : "[resting ? "get up and ": ""]stay up"].")
+ if((combat_flags & COMBAT_FLAG_INTENTIONALLY_RESTING) && !resting)
set_resting(TRUE, FALSE)
else
resist_a_rest()
@@ -71,8 +71,8 @@
var/restrained = restrained()
var/pinned = resting && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE // Cit change - adds pinning for aggressive-grabbing people on the ground
var/has_limbs = has_arms || ignore_legs || has_legs
- var/canmove = !immobilize && !stun && conscious && !paralyze && (!stat_softcrit || !pulledby) && !chokehold && !IsFrozen() && has_limbs && !pinned && !recoveringstam
- var/canresist = !stun && conscious && !stat_softcrit && !paralyze && has_limbs && !recoveringstam
+ var/canmove = !immobilize && !stun && conscious && !paralyze && (!stat_softcrit || !pulledby) && !chokehold && !IsFrozen() && has_limbs && !pinned && !(combat_flags & COMBAT_FLAG_HARD_STAMCRIT)
+ var/canresist = !stun && conscious && !stat_softcrit && !paralyze && has_limbs && !(combat_flags & COMBAT_FLAG_HARD_STAMCRIT)
if(canmove)
mobility_flags |= MOBILITY_MOVE
@@ -84,7 +84,7 @@
else
mobility_flags &= ~MOBILITY_RESIST
- var/canstand_involuntary = conscious && !stat_softcrit && !knockdown && !chokehold && !paralyze && (ignore_legs || has_legs) && !(buckled && buckled.buckle_lying) && !recoveringstam
+ var/canstand_involuntary = conscious && !stat_softcrit && !knockdown && !chokehold && !paralyze && (ignore_legs || has_legs) && !(buckled && buckled.buckle_lying) && !(combat_flags & COMBAT_FLAG_HARD_STAMCRIT)
var/canstand = canstand_involuntary && !resting
var/should_be_lying = !canstand
@@ -107,7 +107,7 @@
else
mobility_flags |= MOBILITY_UI|MOBILITY_PULL
- var/canitem_general = !paralyze && !stun && conscious && !(stat_softcrit) && !chokehold && !restrained && has_arms && !recoveringstam
+ var/canitem_general = !paralyze && !stun && conscious && !(stat_softcrit) && !chokehold && !restrained && has_arms && !(combat_flags & COMBAT_FLAG_HARD_STAMCRIT)
if(canitem_general)
mobility_flags |= (MOBILITY_USE | MOBILITY_PICKUP | MOBILITY_STORAGE | MOBILITY_HOLD)
else
@@ -149,7 +149,7 @@
lying_prev = lying
//Handle citadel autoresist
- if(CHECK_MOBILITY(src, MOBILITY_MOVE) && !intentionalresting && canstand_involuntary && iscarbon(src) && client?.prefs?.autostand)//CIT CHANGE - adds autostanding as a preference
+ if(CHECK_MOBILITY(src, MOBILITY_MOVE) && !(combat_flags & COMBAT_FLAG_INTENTIONALLY_RESTING) && canstand_involuntary && iscarbon(src) && client?.prefs?.autostand)//CIT CHANGE - adds autostanding as a preference
addtimer(CALLBACK(src, .proc/resist_a_rest, TRUE), 0) //CIT CHANGE - ditto
// Movespeed mods based on arms/legs quantity
diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm
index 410e5b28db..ec291094fe 100644
--- a/code/modules/mob/living/living_movement.dm
+++ b/code/modules/mob/living/living_movement.dm
@@ -31,8 +31,16 @@
/mob/living/update_config_movespeed()
update_move_intent_slowdown()
+ sprint_buffer_max = CONFIG_GET(number/movedelay/sprint_buffer_max)
+ sprint_buffer_regen_ds = CONFIG_GET(number/movedelay/sprint_buffer_regen_per_ds)
+ sprint_stamina_cost = CONFIG_GET(number/movedelay/sprint_stamina_cost)
return ..()
+/mob/living/movement_delay(ignorewalk = 0)
+ . = ..()
+ if(!CHECK_MOBILITY(src, MOBILITY_STAND))
+ . += 6
+
/// whether or not we can slide under another living mob. defaults to if we're not dense. CanPass should check "overriding circumstances" like buckled mobs/having PASSMOB flag, etc.
/mob/living/proc/can_move_under_living(mob/living/other)
return !density
diff --git a/code/modules/mob/living/living_sprint.dm b/code/modules/mob/living/living_sprint.dm
new file mode 100644
index 0000000000..66aa3ebc6f
--- /dev/null
+++ b/code/modules/mob/living/living_sprint.dm
@@ -0,0 +1,79 @@
+/mob/living/ComponentInitialize()
+ . = ..()
+ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_SPRINT_LOCKED), .proc/update_sprint_lock)
+
+/mob/living/proc/update_sprint_icon()
+ var/obj/screen/sprintbutton/S = locate() in hud_used?.static_inventory
+ S?.update_icon_state()
+
+/mob/living/proc/update_hud_sprint_bar()
+ hud_used?.sprint_buffer?.update_to_mob(src)
+
+/mob/living/proc/update_sprint_lock()
+ var/locked = HAS_TRAIT(src, TRAIT_SPRINT_LOCKED)
+ var/current = (combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)
+ var/desired = (combat_flags & COMBAT_FLAG_SPRINT_TOGGLED)
+ if(locked)
+ if(current)
+ disable_sprint_mode(FALSE)
+ else
+ if(current)
+ if(!desired)
+ disable_sprint_mode(FALSE)
+ else
+ if(desired)
+ enable_sprint_mode(FALSE)
+ update_sprint_icon()
+
+/mob/living/proc/enable_sprint_mode(update_icon = TRUE)
+ if(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)
+ return
+ ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_SPRINT_ACTIVE)
+ if(update_icon)
+ update_sprint_icon()
+
+/mob/living/proc/disable_sprint_mode(update_icon = TRUE)
+ if(!(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE))
+ return
+ DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_SPRINT_ACTIVE)
+ if(update_icon)
+ update_sprint_icon()
+
+/mob/living/proc/enable_intentional_sprint_mode()
+ if((combat_flags & COMBAT_FLAG_SPRINT_TOGGLED) && (combat_flags & COMBAT_FLAG_SPRINT_ACTIVE))
+ return
+ ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_SPRINT_TOGGLED)
+ if(!HAS_TRAIT(src, TRAIT_SPRINT_LOCKED) && !(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE))
+ enable_sprint_mode(FALSE)
+ update_sprint_icon()
+ return TRUE
+
+/mob/living/proc/disable_intentional_sprint_mode()
+ if(!(combat_flags & COMBAT_FLAG_SPRINT_TOGGLED) && !(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE))
+ return
+ DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_SPRINT_TOGGLED)
+ if(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)
+ disable_sprint_mode(FALSE)
+ update_sprint_icon()
+
+/mob/living/proc/user_toggle_intentional_sprint_mode()
+ var/old = (combat_flags & COMBAT_FLAG_SPRINT_TOGGLED)
+ if(old)
+ disable_intentional_sprint_mode()
+ if((m_intent == MOVE_INTENT_RUN) && CHECK_ALL_MOBILITY(src, MOBILITY_STAND|MOBILITY_MOVE))
+ playsound_local(src, 'sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE)
+ else
+ enable_intentional_sprint_mode()
+ if((m_intent == MOVE_INTENT_RUN) && CHECK_ALL_MOBILITY(src, MOBILITY_STAND|MOBILITY_MOVE))
+ playsound_local(src, 'sound/misc/sprintactivate.ogg', 50, FALSE, pressure_affected = FALSE)
+
+/mob/living/proc/sprint_hotkey(targetstatus)
+ if(targetstatus != FORCE_BOOLEAN(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE))
+ default_toggle_sprint()
+
+/mob/living/proc/doSprintLossTiles(amount)
+ return
+
+// Silicons have snowflake behavior.
+/mob/living/proc/default_toggle_sprint()
+ return user_toggle_intentional_sprint_mode()
diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm
index 623174157b..e3a640bca0 100644
--- a/code/modules/mob/living/silicon/robot/robot_movement.dm
+++ b/code/modules/mob/living/silicon/robot/robot_movement.dm
@@ -12,3 +12,15 @@
/mob/living/silicon/robot/experience_pressure_difference(pressure_difference, direction)
if(!magpulse)
return ..()
+
+/mob/living/silicon/robot/Move(NewLoc, direct)
+ . = ..()
+ if(. && (combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) && !(movement_type & FLYING) && CHECK_ALL_MOBILITY(src, MOBILITY_STAND | MOBILITY_MOVE))
+ if(!(cell?.use(25)))
+ default_toggle_sprint(TRUE)
+
+/mob/living/silicon/robot/movement_delay()
+ . = ..()
+ if(!resting && !(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE))
+ . += 1
+ . += speed
diff --git a/code/modules/mob/living/silicon/robot/robot_sprint.dm b/code/modules/mob/living/silicon/robot/robot_sprint.dm
new file mode 100644
index 0000000000..dff0d9dd0d
--- /dev/null
+++ b/code/modules/mob/living/silicon/robot/robot_sprint.dm
@@ -0,0 +1,12 @@
+/mob/living/silicon/robot/default_toggle_sprint(shutdown = FALSE)
+ var/current = (combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)
+ if(current || shutdown || !cell || (cell.charge < 25) || !cansprint)
+ disable_intentional_sprint_mode()
+ if(CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE))
+ if(shutdown)
+ playsound_local(src, 'sound/effects/light_flicker.ogg', 50, FALSE, pressure_affected = FALSE)
+ playsound_local(src, 'sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE)
+ else
+ enable_intentional_sprint_mode()
+ if(CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE))
+ playsound_local(src, 'sound/misc/sprintactivate.ogg', 50, FALSE, pressure_affected = FALSE)
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 531faff056..aae020beb0 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -15,6 +15,8 @@
speech_span = SPAN_ROBOT
flags_1 = PREVENT_CONTENTS_EXPLOSION_1 | HEAR_1
no_vore = TRUE
+ /// Enable sprint system but not stamina
+ combat_flags = COMBAT_FLAGS_STAMEXEMPT_YESSPRINT
var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS
var/last_lawchange_announce = 0
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index 2ab0f1721c..469a395169 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -276,7 +276,7 @@ Auto Patrol[]"},
if(BOT_PREP_ARREST) // preparing to arrest target
// see if he got away. If he's no no longer adjacent or inside a closet or about to get up, we hunt again.
- if(!Adjacent(target) || !isturf(target.loc) || !target.recoveringstam || target.getStaminaLoss() <= 120) // CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss checks
+ if(!Adjacent(target) || !isturf(target.loc) || !(target.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || target.getStaminaLoss() <= 120) // CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss checks
back_to_hunt()
return
@@ -303,7 +303,7 @@ Auto Patrol[]"},
back_to_idle()
return
- if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && !target.recoveringstam && target.getStaminaLoss() <= 120)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss checks
+ if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && !(target.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && target.getStaminaLoss() <= 120)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss checks
back_to_hunt()
return
else
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index 3ff97f2cc0..5754f8c3b2 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -312,7 +312,7 @@ Auto Patrol: []"},
if(BOT_PREP_ARREST) // preparing to arrest target
// see if he got away. If he's no no longer adjacent or inside a closet or about to get up, we hunt again.
- if( !Adjacent(target) || !isturf(target.loc) || target.getStaminaLoss() <= 120 || !target.recoveringstam) //CIT CHANGE - replaces amountknockdown with checks for stamina so secbots dont run into an infinite loop
+ if( !Adjacent(target) || !isturf(target.loc) || target.getStaminaLoss() <= 120 || !(target.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)) //CIT CHANGE - replaces amountknockdown with checks for stamina so secbots dont run into an infinite loop
back_to_hunt()
return
@@ -339,7 +339,7 @@ Auto Patrol: []"},
back_to_idle()
return
- if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && !target.recoveringstam && target.getStaminaLoss() <= 120)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss check
+ if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && !(target.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && target.getStaminaLoss() <= 120)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss check
back_to_hunt()
return
else //Try arresting again if the target escapes.
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
index fd3221d900..39b66fbdc2 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
@@ -39,7 +39,8 @@
animal_species = /mob/living/simple_animal/hostile/asteroid/gutlunch
childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck = 45, /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen = 55)
- wanted_objects = list(/obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/)
+ wanted_objects = list(/obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/, /obj/item/bodypart, /obj/item/organ/appendix, /obj/item/organ/ears, /obj/item/organ/eyes, /obj/item/organ/heart, /obj/item/organ/liver, \
+ /obj/item/organ/lungs, /obj/item/organ/stomach, /obj/item/organ/tongue) // So we dont eat implants or brains. Still can eat robotic stuff thats subtyped of base line but thats a issue for a nother day.
var/obj/item/udder/gutlunch/udder = null
/mob/living/simple_animal/hostile/asteroid/gutlunch/Initialize()
diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm
index 40b4212aac..5cdeaecd37 100644
--- a/code/modules/mob/living/status_procs.dm
+++ b/code/modules/mob/living/status_procs.dm
@@ -30,45 +30,48 @@
/mob/living/proc/Stun(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- if(absorb_stun(amount, ignore_canstun))
- return
- var/datum/status_effect/incapacitating/stun/S = IsStun()
- if(S)
- S.duration = max(world.time + amount, S.duration)
- else if(amount > 0)
- S = apply_status_effect(STATUS_EFFECT_STUN, amount, updating)
- return S
+ if(!ignore_canstun && (!(status_flags & CANSTUN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/stun/S = IsStun()
+ if(S)
+ S.duration = max(world.time + amount, S.duration)
+ else if(amount > 0)
+ S = apply_status_effect(STATUS_EFFECT_STUN, amount, updating)
+ return S
/mob/living/proc/SetStun(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- var/datum/status_effect/incapacitating/stun/S = IsStun()
- if(amount <= 0)
- if(S)
- qdel(S)
+ if(!ignore_canstun && (!(status_flags & CANSTUN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ var/datum/status_effect/incapacitating/stun/S = IsStun()
+ if(amount <= 0)
+ if(S)
+ qdel(S)
+ else
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ if(S)
+ S.duration = world.time + amount
else
- if(absorb_stun(amount, ignore_canstun))
- return
- if(S)
- S.duration = world.time + amount
- else
- S = apply_status_effect(STATUS_EFFECT_STUN, amount, updating)
- return S
+ S = apply_status_effect(STATUS_EFFECT_STUN, amount, updating)
+ return S
/mob/living/proc/AdjustStun(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- if(absorb_stun(amount, ignore_canstun))
- return
- var/datum/status_effect/incapacitating/stun/S = IsStun()
- if(S)
- S.duration += amount
- else if(amount > 0)
- S = apply_status_effect(STATUS_EFFECT_STUN, amount, updating)
- return S
+ if(!ignore_canstun && (!(status_flags & CANSTUN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/stun/S = IsStun()
+ if(S)
+ S.duration += amount
+ else if(amount > 0)
+ S = apply_status_effect(STATUS_EFFECT_STUN, amount, updating)
+ return S
///////////////////////////////// KNOCKDOWN /////////////////////////////////////
@@ -84,45 +87,48 @@
/mob/living/proc/Knockdown(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- if(absorb_stun(amount, ignore_canstun))
- return
- var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
- if(K)
- K.duration = max(world.time + amount, K.duration)
- else if(amount > 0)
- K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
- return K
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
+ if(K)
+ K.duration = max(world.time + amount, K.duration)
+ else if(amount > 0)
+ K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
+ return K
/mob/living/proc/SetKnockdown(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
- if(amount <= 0)
- if(K)
- qdel(K)
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
+ if(amount <= 0)
+ if(K)
+ qdel(K)
+ else
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ if(K)
+ K.duration = world.time + amount
else
- if(absorb_stun(amount, ignore_canstun))
- return
- if(K)
- K.duration = world.time + amount
- else
- K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
- return K
+ K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
+ return K
/mob/living/proc/AdjustKnockdown(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- if(absorb_stun(amount, ignore_canstun))
- return
- var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
- if(K)
- K.duration += amount
- else if(amount > 0)
- K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
- return K
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
+ if(K)
+ K.duration += amount
+ else if(amount > 0)
+ K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
+ return K
///////////////////////////////// IMMOBILIZED ////////////////////////////////////
/mob/living/proc/IsImmobilized() //If we're immobilized
@@ -137,45 +143,48 @@
/mob/living/proc/Immobilize(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- if(absorb_stun(amount, ignore_canstun))
- return
- var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized()
- if(I)
- I.duration = max(world.time + amount, I.duration)
- else if(amount > 0)
- I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating)
- return I
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized()
+ if(I)
+ I.duration = max(world.time + amount, I.duration)
+ else if(amount > 0)
+ I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating)
+ return I
/mob/living/proc/SetImmobilized(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized()
- if(amount <= 0)
- if(I)
- qdel(I)
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized()
+ if(amount <= 0)
+ if(I)
+ qdel(I)
+ else
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ if(I)
+ I.duration = world.time + amount
else
- if(absorb_stun(amount, ignore_canstun))
- return
- if(I)
- I.duration = world.time + amount
- else
- I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating)
- return I
+ I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating)
+ return I
/mob/living/proc/AdjustImmobilized(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- if(absorb_stun(amount, ignore_canstun))
- return
- var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized()
- if(I)
- I.duration += amount
- else if(amount > 0)
- I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating)
- return I
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized()
+ if(I)
+ I.duration += amount
+ else if(amount > 0)
+ I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating)
+ return I
///////////////////////////////// PARALYZED //////////////////////////////////
/mob/living/proc/IsParalyzed() //If we're immobilized
@@ -190,45 +199,48 @@
/mob/living/proc/Paralyze(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- if(absorb_stun(amount, ignore_canstun))
- return
- var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE)
- if(P)
- P.duration = max(world.time + amount, P.duration)
- else if(amount > 0)
- P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating)
- return P
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE)
+ if(P)
+ P.duration = max(world.time + amount, P.duration)
+ else if(amount > 0)
+ P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating)
+ return P
/mob/living/proc/SetParalyzed(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE)
- if(amount <= 0)
- if(P)
- qdel(P)
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE)
+ if(amount <= 0)
+ if(P)
+ qdel(P)
+ else
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ if(P)
+ P.duration = world.time + amount
else
- if(absorb_stun(amount, ignore_canstun))
- return
- if(P)
- P.duration = world.time + amount
- else
- P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating)
- return P
+ P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating)
+ return P
/mob/living/proc/AdjustParalyzed(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- if(absorb_stun(amount, ignore_canstun))
- return
- var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE)
- if(P)
- P.duration += amount
- else if(amount > 0)
- P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating)
- return P
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE)
+ if(P)
+ P.duration += amount
+ else if(amount > 0)
+ P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating)
+ return P
///////////////////////////////// DAZED ////////////////////////////////////
/mob/living/proc/IsDazed() //If we're Dazed
@@ -243,45 +255,104 @@
/mob/living/proc/Daze(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_DAZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- if(absorb_stun(amount, ignore_canstun))
- return
- var/datum/status_effect/incapacitating/dazed/I = IsDazed()
- if(I)
- I.duration = max(world.time + amount, I.duration)
- else if(amount > 0)
- I = apply_status_effect(STATUS_EFFECT_DAZED, amount, updating)
- return I
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/dazed/I = IsDazed()
+ if(I)
+ I.duration = max(world.time + amount, I.duration)
+ else if(amount > 0)
+ I = apply_status_effect(STATUS_EFFECT_DAZED, amount, updating)
+ return I
/mob/living/proc/SetDazed(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_DAZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
- var/datum/status_effect/incapacitating/dazed/I = IsDazed()
- if(amount <= 0)
- if(I)
- qdel(I)
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ var/datum/status_effect/incapacitating/dazed/I = IsDazed()
+ if(amount <= 0)
+ if(I)
+ qdel(I)
+ else
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ if(I)
+ I.duration = world.time + amount
else
- if(absorb_stun(amount, ignore_canstun))
- return
- if(I)
- I.duration = world.time + amount
- else
- I = apply_status_effect(STATUS_EFFECT_DAZED, amount, updating)
- return I
+ I = apply_status_effect(STATUS_EFFECT_DAZED, amount, updating)
+ return I
/mob/living/proc/AdjustDazed(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_DAZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
return
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/dazed/I = IsDazed()
+ if(I)
+ I.duration += amount
+ else if(amount > 0)
+ I = apply_status_effect(STATUS_EFFECT_DAZED, amount, updating)
+ return I
+
+///////////////////////////////// STAGGERED ////////////////////////////////////
+/mob/living/proc/IsStaggered() //If we're Staggered
+ return has_status_effect(STATUS_EFFECT_STAGGERED)
+
+/mob/living/proc/AmountStaggered() //How many deciseconds remain in our Staggered status effect
+ var/datum/status_effect/staggered/I = IsStaggered()
+ if(I)
+ return I.duration - world.time
+ return 0
+
+/mob/living/proc/Stagger(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STAGGER, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/staggered/I = IsStaggered()
+ if(I)
+ I.duration = max(world.time + amount, I.duration)
+ else if(amount > 0)
+ I = apply_status_effect(STATUS_EFFECT_STAGGERED, amount, updating)
+ return I
+
+/mob/living/proc/SetStaggered(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STAGGER, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ var/datum/status_effect/staggered/I = IsStaggered()
+ if(amount <= 0)
+ if(I)
+ qdel(I)
+ else
if(absorb_stun(amount, ignore_canstun))
return
- var/datum/status_effect/incapacitating/dazed/I = IsDazed()
if(I)
- I.duration += amount
- else if(amount > 0)
- I = apply_status_effect(STATUS_EFFECT_DAZED, amount, updating)
- return I
+ I.duration = world.time + amount
+ else
+ I = apply_status_effect(STATUS_EFFECT_STAGGERED, amount, updating)
+ return I
+
+/mob/living/proc/AdjustStaggered(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STAGGER, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)))
+ return
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/staggered/I = IsStaggered()
+ if(I)
+ I.duration += amount
+ else if(amount > 0)
+ I = apply_status_effect(STATUS_EFFECT_STAGGERED, amount, updating)
+ return I
//Blanket
/mob/living/proc/AllImmobility(amount, updating, ignore_canstun = FALSE)
@@ -290,6 +361,7 @@
Stun(amount, FALSE, ignore_canstun)
Immobilize(amount, FALSE, ignore_canstun)
Daze(amount, FALSE, ignore_canstun)
+ Stagger(amount, FALSE, ignore_canstun)
if(updating)
update_mobility()
@@ -299,6 +371,7 @@
SetStun(amount, FALSE, ignore_canstun)
SetImmobilized(amount, FALSE, ignore_canstun)
SetDazed(amount, FALSE, ignore_canstun)
+ SetStaggered(amount, FALSE, ignore_canstun)
if(updating)
update_mobility()
@@ -308,6 +381,7 @@
AdjustStun(amount, FALSE, ignore_canstun)
AdjustImmobilized(amount, FALSE, ignore_canstun)
AdjustDazed(amount, FALSE, ignore_canstun)
+ AdjustStaggered(amount, FALSE, ignore_canstun)
if(updating)
update_mobility()
@@ -323,11 +397,13 @@
SetImmobilized(amount, FALSE, ignore_canstun)
if(AmountDazed() > amount)
SetImmobilized(amount, FALSE, ignore_canstun)
+ if(AmountStaggered() > amount)
+ SetStaggered(amount, FALSE, ignore_canstun)
if(updating)
update_mobility()
/mob/living/proc/HighestImmobilityAmount()
- return max(max(max(max(AmountStun(), AmountKnockdown()), AmountParalyzed()), AmountImmobilized()), AmountDazed())
+ return max(AmountStun(), AmountKnockdown(), AmountParalyzed(), AmountImmobilized(), AmountDazed(), AmountStaggered())
//////////////////UNCONSCIOUS
/mob/living/proc/IsUnconscious() //If we're unconscious
diff --git a/code/modules/ninja/outfit.dm b/code/modules/ninja/outfit.dm
index 323deed5c4..983ef0585a 100644
--- a/code/modules/ninja/outfit.dm
+++ b/code/modules/ninja/outfit.dm
@@ -2,7 +2,7 @@
name = "Space Ninja"
uniform = /obj/item/clothing/under/color/black/trackless
suit = /obj/item/clothing/suit/space/space_ninja
- glasses = /obj/item/clothing/glasses/night
+ glasses = /obj/item/clothing/glasses/night/syndicate
mask = /obj/item/clothing/mask/gas/space_ninja
head = /obj/item/clothing/head/helmet/space/space_ninja
ears = /obj/item/radio/headset
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 1f9f211154..d06ad972e6 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -168,7 +168,7 @@
return
if(firing)
return
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) //respect stamina softcrit
+ if(IS_STAMCRIT(user)) //respect stamina softcrit
to_chat(user, "You are too exhausted to fire [src]!")
return
if(flag) //It's adjacent, is the user, or is on the user's person
@@ -562,11 +562,11 @@
update_icon()
/obj/item/gun/proc/getinaccuracy(mob/living/user)
- if(!iscarbon(user))
+ if(!isliving(user))
return FALSE
else
- var/mob/living/carbon/holdingdude = user
- if(istype(holdingdude) && holdingdude.combatmode)
- return (max((holdingdude.lastdirchange + weapon_weight * 25) - world.time,0) * inaccuracy_modifier)
+ var/mob/living/holdingdude = user
+ if(istype(holdingdude) && (holdingdude.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ return 0
else
return ((weapon_weight * 25) * inaccuracy_modifier)
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 7f01db466f..56aebc891d 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -37,7 +37,7 @@
/obj/item/gun/ballistic/shotgun/attack_self(mob/living/user)
if(recentpump > world.time)
return
- if(istype(user) && user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes pumping shotguns impossible in stamina softcrit
+ if(IS_STAMCRIT(user))//CIT CHANGE - makes pumping shotguns impossible in stamina softcrit
to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto
return//CIT CHANGE - ditto
pump(user, TRUE)
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index 2c8be10ace..15842299e3 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -114,9 +114,12 @@
/datum/chemical_reaction/emp_pulse/on_reaction(datum/reagents/holder, multiplier)
var/location = get_turf(holder.my_atom)
- // 100 multiplier = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes.
- // 200 multiplier = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades.
- empulse(location, round(multiplier / 12), round(multiplier / 7), 1)
+ // 50 multiplier = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes.
+ // 100 multiplier = 5 heavy range & 10 light range.
+ // 200 multiplier = 7 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades.
+ // 300 multiplier = 8 heavy range & 17 light range. Still rather significant, considering that you can get dozens of bluespace beakers 30 minutes in with a competent crew.
+ // 900 multiplier = 12 heavy range & 30 light range. Still less than 300 before this commit.
+ empulse(location, round(multiplier ** (3/8)), round(multiplier ** (1/2)), 1)
holder.clear_reagents()
diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
index 9efbe58a29..b9897db303 100644
--- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
@@ -27,6 +27,7 @@
REMOVE_TRAIT(owner, TRAIT_PACIFISM, "slimestatus")
owner.visible_message("[owner] stops glowing, the rainbow light fading away.",
"You no longer feel protected...")
+ return ..()
/obj/screen/alert/status_effect/slimeskin
name = "Adamantine Slimeskin"
@@ -56,6 +57,7 @@
H.physiology.damage_resistance -= 10
owner.visible_message("[owner]'s gel coating liquefies and dissolves away.",
"Your gel second-skin dissolves!")
+ return ..()
/datum/status_effect/slimerecall
id = "slime_recall"
@@ -87,6 +89,7 @@
"The unknown force snatches briefly you from reality, and deposits you next to [target]!")
do_sparks(3, TRUE, owner)
owner.forceMove(target.loc)
+ return ..()
/obj/screen/alert/status_effect/freon/stasis
desc = "You're frozen inside of a protective ice cube! While inside, you can't do anything, but are immune to harm! Resist to get out."
@@ -117,6 +120,7 @@
qdel(cube)
owner.status_flags &= ~GODMODE
UnregisterSignal(owner, COMSIG_LIVING_RESIST)
+ return ..()
/datum/status_effect/slime_clone
id = "slime_cloned"
@@ -156,6 +160,7 @@
if(clone)
clone.unequip_everything()
qdel(clone)
+ return ..()
/obj/screen/alert/status_effect/clone_decay
name = "Clone Decay"
@@ -195,6 +200,7 @@
/datum/status_effect/bloodchill/on_remove()
owner.remove_movespeed_modifier("bloodchilled")
+ return ..()
/obj/screen/alert/status_effect/bloodchill
name = "Bloodchilled"
@@ -218,6 +224,7 @@
/datum/status_effect/bonechill/on_remove()
owner.remove_movespeed_modifier("bonechilled")
+ return ..()
/obj/screen/alert/status_effect/bonechill
name = "Bonechilled"
@@ -249,6 +256,7 @@ datum/status_effect/rebreathing/tick()
/datum/status_effect/firecookie/on_remove()
REMOVE_TRAIT(owner, TRAIT_RESISTCOLD,"firecookie")
+ return ..()
/datum/status_effect/watercookie
id = "watercookie"
@@ -266,6 +274,7 @@ datum/status_effect/rebreathing/tick()
/datum/status_effect/watercookie/on_remove()
REMOVE_TRAIT(owner, TRAIT_NOSLIPWATER,"watercookie")
+ return ..()
/datum/status_effect/metalcookie
id = "metalcookie"
@@ -283,6 +292,7 @@ datum/status_effect/rebreathing/tick()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.brute_mod /= 0.9
+ return ..()
/datum/status_effect/sparkcookie
id = "sparkcookie"
@@ -302,6 +312,7 @@ datum/status_effect/rebreathing/tick()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.siemens_coeff = original_coeff
+ return ..()
/datum/status_effect/toxincookie
id = "toxincookie"
@@ -315,6 +326,7 @@ datum/status_effect/rebreathing/tick()
/datum/status_effect/toxincookie/on_remove()
REMOVE_TRAIT(owner, TRAIT_TOXINLOVER,"toxincookie")
+ return ..()
/datum/status_effect/timecookie
id = "timecookie"
@@ -332,6 +344,7 @@ datum/status_effect/rebreathing/tick()
if(ishuman(owner))
var/mob/living/carbon/human/H
H.physiology.do_after_speed /= 0.95
+ return ..()
/datum/status_effect/lovecookie
id = "lovecookie"
@@ -377,6 +390,7 @@ datum/status_effect/rebreathing/tick()
/datum/status_effect/tarfoot/on_remove()
owner.remove_movespeed_modifier(MOVESPEED_ID_TARFOOT)
+ return ..()
/datum/status_effect/spookcookie
id = "spookcookie"
@@ -392,6 +406,7 @@ datum/status_effect/rebreathing/tick()
/datum/status_effect/spookcookie/on_remove()
owner.remove_alt_appearance("spookyscary")
+ return ..()
/datum/status_effect/peacecookie
id = "peacecookie"
@@ -415,6 +430,7 @@ datum/status_effect/rebreathing/tick()
/datum/status_effect/plur/on_remove()
REMOVE_TRAIT(owner, TRAIT_PACIFISM, "peacecookie")
+ return ..()
/datum/status_effect/adamantinecookie
id = "adamantinecookie"
@@ -432,6 +448,7 @@ datum/status_effect/rebreathing/tick()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.burn_mod /= 0.9
+ return ..()
///////////////////////////////////////////////////////
//////////////////STABILIZED EXTRACTS//////////////////
@@ -513,6 +530,7 @@ datum/status_effect/rebreathing/tick()
datum/status_effect/stabilized/blue/on_remove()
REMOVE_TRAIT(owner, TRAIT_NOSLIPWATER, "slimestatus")
+ return ..()
/datum/status_effect/stabilized/metal
id = "stabilizedmetal"
@@ -536,7 +554,6 @@ datum/status_effect/stabilized/blue/on_remove()
to_chat(owner, "[linked_extract] adds a layer of slime to [S], which metamorphosizes into another sheet of material!")
return ..()
-
/datum/status_effect/stabilized/yellow
id = "stabilizedyellow"
colour = "yellow"
@@ -591,6 +608,7 @@ datum/status_effect/stabilized/blue/on_remove()
/datum/status_effect/stabilized/darkpurple/on_remove()
REMOVE_TRAIT(owner, TRAIT_RESISTHEATHANDS, "slimestatus")
qdel(fire)
+ return ..()
/datum/status_effect/stabilized/darkblue
id = "stabilizeddarkblue"
@@ -638,6 +656,7 @@ datum/status_effect/stabilized/blue/on_remove()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.hunger_mod /= 0.8
+ return ..()
//Bluespace has an icon because it's kinda active.
/obj/screen/alert/status_effect/bluespaceslime
@@ -697,6 +716,7 @@ datum/status_effect/stabilized/blue/on_remove()
/datum/status_effect/stabilized/sepia/on_remove()
owner.remove_movespeed_modifier(MOVESPEED_ID_SEPIA)
+ return ..()
/datum/status_effect/stabilized/cerulean
id = "stabilizedcerulean"
@@ -733,6 +753,7 @@ datum/status_effect/stabilized/blue/on_remove()
clone.visible_message("[clone] dissolves into a puddle of goo!")
clone.unequip_everything()
qdel(clone)
+ return ..()
/datum/status_effect/stabilized/pyrite
id = "stabilizedpyrite"
@@ -749,6 +770,7 @@ datum/status_effect/stabilized/blue/on_remove()
/datum/status_effect/stabilized/pyrite/on_remove()
owner.color = originalcolor
+ return ..()
/datum/status_effect/stabilized/red
id = "stabilizedred"
@@ -760,6 +782,7 @@ datum/status_effect/stabilized/blue/on_remove()
/datum/status_effect/stabilized/red/on_remove()
owner.unignore_slowdown("slimestatus")
+ return ..()
/datum/status_effect/stabilized/green
id = "stabilizedgreen"
@@ -791,6 +814,7 @@ datum/status_effect/stabilized/blue/on_remove()
originalDNA.transfer_identity(H)
H.real_name = originalname
H.updateappearance(mutcolor_update=1)
+ return ..()
/datum/status_effect/brokenpeace
id = "brokenpeace"
@@ -854,6 +878,7 @@ datum/status_effect/stabilized/blue/on_remove()
for(var/i in owner.faction)
if(i == faction_name)
owner.faction -= faction_name
+ return ..()
/datum/status_effect/stabilized/oil
id = "stabilizedoil"
@@ -947,6 +972,7 @@ datum/status_effect/stabilized/blue/on_remove()
/datum/status_effect/stabilized/gold/on_remove()
if(familiar)
qdel(familiar)
+ return ..()
/datum/status_effect/stabilized/adamantine/on_apply()
if(ishuman(owner))
@@ -958,6 +984,7 @@ datum/status_effect/stabilized/blue/on_remove()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.damage_resistance -= 5
+ return ..()
/datum/status_effect/stabilized/rainbow
id = "stabilizedrainbow"
diff --git a/code/modules/uplink/uplink_items/uplink_badass.dm b/code/modules/uplink/uplink_items/uplink_badass.dm
index 74be111346..681efea5b3 100644
--- a/code/modules/uplink/uplink_items/uplink_badass.dm
+++ b/code/modules/uplink/uplink_items/uplink_badass.dm
@@ -76,6 +76,15 @@
cost = 2
illegal_tech = FALSE
+/datum/uplink_item/badass/tactical_naptime
+ name = "Sleepy Time Pajama Bundle"
+ desc = "Even soldiers need to get a good nights rest. Comes with some cozy as heck sleeping wear, a blankie to keep yourself warm in deep space, a hot mug of cocoa for you and your fuzzy friend."
+ item = /obj/item/storage/box/syndie_kit/sleepytime
+ cost = 4
+ limited_stock = 1
+ cant_discount = TRUE
+ include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
+
/datum/uplink_item/badass/shades
name = "Big Sunglasses"
desc = "Prevents flashes and looks badbass with some Smokes."
diff --git a/code/modules/uplink/uplink_items/uplink_clothing.dm b/code/modules/uplink/uplink_items/uplink_clothing.dm
index fcbe0fb9a6..2a3fd9b8bd 100644
--- a/code/modules/uplink/uplink_items/uplink_clothing.dm
+++ b/code/modules/uplink/uplink_items/uplink_clothing.dm
@@ -9,18 +9,28 @@
/datum/uplink_item/suits/turtlenck
name = "Tactical Turtleneck"
- desc = "A slightly armored suit that has no sensor on them, if someone sees you in this hope they think its a fake."
+ desc = "A slightly armored conspicious jumpsuit that has no suit sensors attached to them, if someone sees you in this hope they think its a fake."
item = /obj/item/clothing/under/syndicate
cost = 1
exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) //They already get these
/datum/uplink_item/suits/turtlenck_skirt
name = "Tactical Skirtleneck"
- desc = "A slightly armored suit that has no sensor on them, if someone sees you in this hope they think its a fake."
+ desc = "A slightly armored conspicious jumpsuit that has no suit sensors attached to them, if someone sees you in this hope they think its a fake."
item = /obj/item/clothing/under/syndicate/skirt
cost = 1
exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) //They already get these
+/datum/uplink_item/suits/infiltrator_bundle
+ name = "Insidious Infiltration Gear Case"
+ desc = "Developed by Roseus Galactic in conjunction with the Gorlex Marauders to produce a functional suit for urban operations, \
+ this suit proves to be cheaper than your standard issue hardsuit, with none of the movement restrictions (or the space proofing) of the outdated spacesuits employed by the company. \
+ Comes with an armored vest, helmet, blood-red sneaksuit, sneakboots, specialized combat gloves and a high-tech balaclava which obfuscates both your voice and your face. The case is also rather useful as a storage container and bludgeoning implement."
+ item = /obj/item/storage/toolbox/infiltrator
+ cost = 3
+ limited_stock = 1 //you only get one so you don't end up with too many gun cases
+ exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
+
/datum/uplink_item/suits/padding
name = "Soft Padding"
desc = "An inconspicious soft padding meant to be worn underneath jumpsuits, will cushion the user from melee harm."
diff --git a/code/modules/uplink/uplink_items/uplink_devices.dm b/code/modules/uplink/uplink_items/uplink_devices.dm
index 05731722f7..06fd9aab43 100644
--- a/code/modules/uplink/uplink_items/uplink_devices.dm
+++ b/code/modules/uplink/uplink_items/uplink_devices.dm
@@ -139,7 +139,7 @@
name = "Headset Upgrader"
desc = "A device that can be used to make one headset immune to flashbangs."
item = /obj/item/headsetupgrader
- cost = 3
+ cost = 1
/datum/uplink_item/device_tools/medgun
name = "Medbeam Gun"
diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm
index 114a6373f4..868610a149 100644
--- a/code/modules/vehicles/secway.dm
+++ b/code/modules/vehicles/secway.dm
@@ -27,9 +27,9 @@
/obj/vehicle/ridden/secway/relaymove(mob/user, direction)
var/new_speed = normalspeed
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- if(H.sprinting && charge)
+ if(isliving(user))
+ var/mob/living/L = user
+ if((L.combat_flags & COMBAT_FLAG_SPRINT_TOGGLED) && charge)
charge--
new_speed = chargespeed
var/datum/component/riding/D = GetComponent(/datum/component/riding)
diff --git a/html/changelogs/AutoChangeLog-pr-11375.yml b/html/changelogs/AutoChangeLog-pr-11375.yml
new file mode 100644
index 0000000000..3e1fd45ac7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11375.yml
@@ -0,0 +1,4 @@
+author: "Auris456852"
+delete-after: True
+changes:
+ - balance: "Made EMP reaction growth logarithmic."
diff --git a/html/changelogs/AutoChangeLog-pr-11376.yml b/html/changelogs/AutoChangeLog-pr-11376.yml
new file mode 100644
index 0000000000..fbb37ff40e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11376.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - refactor: "combat mode/sprint/resisting lying down/attempting to crawl under all refactored, added combat/sprint mode lockouts, being locked out of combat mode no longer disables it and allows right click interactions etc etc"
diff --git a/html/changelogs/AutoChangeLog-pr-11540.yml b/html/changelogs/AutoChangeLog-pr-11540.yml
new file mode 100644
index 0000000000..12aa207a93
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11540.yml
@@ -0,0 +1,7 @@
+author: "NecromancerAnne and zawo and zeroisthebiggay and carlarctg"
+delete-after: True
+changes:
+ - rscadd: "The Infiltrator Bundle, an armor kit for 3TC. Murder people in style!"
+ - rscadd: "Some pajamas for nukies to get plenty of bed rest."
+ - rscadd: "halved firefight carry delay with latex or nitrile gloves"
+ - tweak: "headset upgrade is cheaper"
diff --git a/html/changelogs/AutoChangeLog-pr-11545.yml b/html/changelogs/AutoChangeLog-pr-11545.yml
new file mode 100644
index 0000000000..7a08ec08bb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11545.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Gutlunches have gotten teeth now and will eat legs, arms, and organs! - Tho are picky and will not eat the brain just laying about!"
diff --git a/html/changelogs/AutoChangeLog-pr-11548.yml b/html/changelogs/AutoChangeLog-pr-11548.yml
new file mode 100644
index 0000000000..542da5792c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11548.yml
@@ -0,0 +1,5 @@
+author: "necromanceranne"
+delete-after: True
+changes:
+ - balance: "Nightvision goggles are nerfed all-round. Flashes have actual use against people using nightvision, as do flashbangs."
+ - balance: "Syndicate nuclear agents get to live peacefully knowing their eyes are well protected by their special night vision goggles. Spider clan also get these goggles."
diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi
index b3960f4db6..578970a21c 100644
Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ
diff --git a/icons/mob/feet_digi.dmi b/icons/mob/feet_digi.dmi
index 78f50519fa..fbc105b634 100644
Binary files a/icons/mob/feet_digi.dmi and b/icons/mob/feet_digi.dmi differ
diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi
index 63263b835c..e7068a1854 100644
Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index be8f7c6c94..c499c236e3 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/head_muzzled.dmi b/icons/mob/head_muzzled.dmi
index f1fb09651f..16cc63a13e 100644
Binary files a/icons/mob/head_muzzled.dmi and b/icons/mob/head_muzzled.dmi differ
diff --git a/icons/mob/inhands/equipment/toolbox_lefthand.dmi b/icons/mob/inhands/equipment/toolbox_lefthand.dmi
index 06cdd60168..b7907d5bac 100644
Binary files a/icons/mob/inhands/equipment/toolbox_lefthand.dmi and b/icons/mob/inhands/equipment/toolbox_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/toolbox_righthand.dmi b/icons/mob/inhands/equipment/toolbox_righthand.dmi
index acb93257c9..100c065ba3 100644
Binary files a/icons/mob/inhands/equipment/toolbox_righthand.dmi and b/icons/mob/inhands/equipment/toolbox_righthand.dmi differ
diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi
index a4ff676bd0..da61ca93be 100644
Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ
diff --git a/icons/mob/mask_muzzled.dmi b/icons/mob/mask_muzzled.dmi
index 92e6149bb1..ed74796c03 100644
Binary files a/icons/mob/mask_muzzled.dmi and b/icons/mob/mask_muzzled.dmi differ
diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi
index c1912d74cc..a65ac3f926 100644
Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 40ebcaeb4c..195e4ecd67 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/suit_digi.dmi b/icons/mob/suit_digi.dmi
index 0d34d379a8..67ad9f7e1a 100644
Binary files a/icons/mob/suit_digi.dmi and b/icons/mob/suit_digi.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index e675a8d647..2e8fde527a 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/mob/uniform_digi.dmi b/icons/mob/uniform_digi.dmi
index 82dc09e43e..80e8f80b94 100644
Binary files a/icons/mob/uniform_digi.dmi and b/icons/mob/uniform_digi.dmi differ
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index 515d6212c0..e937842275 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 2afeb5f19b..07d9c8cee6 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi
index 245b44e56b..64e165213d 100644
Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index 1105e30ae7..bd8d52a1e6 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index ebd0e725e8..530cd61e6f 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 090003011b..66f3811a81 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 33cb08b738..a719356804 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/modular_citadel/code/_onclick/hud/screen_objects.dm b/modular_citadel/code/_onclick/hud/screen_objects.dm
index 6ad0603c49..bcb44af84b 100644
--- a/modular_citadel/code/_onclick/hud/screen_objects.dm
+++ b/modular_citadel/code/_onclick/hud/screen_objects.dm
@@ -16,14 +16,16 @@
/obj/screen/combattoggle/Click()
if(iscarbon(usr))
var/mob/living/carbon/C = usr
- C.toggle_combat_mode()
+ C.user_toggle_intentional_combat_mode()
/obj/screen/combattoggle/update_icon_state()
var/mob/living/carbon/user = hud?.mymob
if(!istype(user))
return
- if(user.combatmode)
+ if((user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
icon_state = "combat"
+ else if(HAS_TRAIT(user, TRAIT_COMBAT_MODE_LOCKED))
+ icon_state = "combat_locked"
else
icon_state = "combat_off"
@@ -41,7 +43,7 @@
var/mob/living/carbon/user = hud?.mymob
if(!istype(user))
return
- if(user.voremode && !user.combatmode)
+ if(user.voremode && !(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
icon_state = "nom"
else
icon_state = "nom_off"
diff --git a/modular_citadel/code/_onclick/hud/sprint.dm b/modular_citadel/code/_onclick/hud/sprint.dm
index c1c81b6d5b..7199f0286e 100644
--- a/modular_citadel/code/_onclick/hud/sprint.dm
+++ b/modular_citadel/code/_onclick/hud/sprint.dm
@@ -10,14 +10,16 @@
/obj/screen/sprintbutton/Click()
if(ishuman(usr))
var/mob/living/carbon/human/H = usr
- H.togglesprint()
+ H.default_toggle_sprint()
/obj/screen/sprintbutton/update_icon_state()
var/mob/living/user = hud?.mymob
if(!istype(user))
return
- if(user.sprinting)
+ if(user.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)
icon_state = "act_sprint_on"
+ else if(HAS_TRAIT(user, TRAIT_SPRINT_LOCKED))
+ icon_state = "act_sprint_locked"
else
icon_state = "act_sprint"
diff --git a/modular_citadel/code/_onclick/hud/stamina.dm b/modular_citadel/code/_onclick/hud/stamina.dm
index 0515b9d762..a7b9a79ecd 100644
--- a/modular_citadel/code/_onclick/hud/stamina.dm
+++ b/modular_citadel/code/_onclick/hud/stamina.dm
@@ -17,7 +17,7 @@
var/mob/living/carbon/user = hud?.mymob
if(!user)
return
- if(user.stat == DEAD || user.recoveringstam || (user.hal_screwyhud in 1 to 2))
+ if(user.stat == DEAD || (user.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (user.hal_screwyhud in 1 to 2))
icon_state = "staminacrit"
else if(user.hal_screwyhud == 5)
icon_state = "stamina0"
@@ -37,7 +37,7 @@
var/mob/living/carbon/user = hud?.mymob
if(!user)
return
- if(user.stat == DEAD || user.recoveringstam || (user.hal_screwyhud in 1 to 2))
+ if(user.stat == DEAD || (user.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (user.hal_screwyhud in 1 to 2))
icon_state = "stambuffer7"
else if(user.hal_screwyhud == 5)
icon_state = "stambuffer0"
diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm
index e32d226595..82b3c39bb6 100644
--- a/modular_citadel/code/datums/status_effects/chems.dm
+++ b/modular_citadel/code/datums/status_effects/chems.dm
@@ -29,6 +29,7 @@
to_chat(owner, "Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. Curiously, you find that you memories are blank after you ingested the synthetic serum, leaving you to wonder where the other you is.")
to_chat(M, "Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. Curiously, you find that you memories are blank after you ingested the synthetic serum, leaving you to wonder where the other you is.")
fermi_Clone = null
+ return ..()
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -95,6 +96,7 @@
to_chat(owner, "Your expansive chest has become a more managable size, liberating your movements.")
owner.remove_movespeed_modifier(BREAST_MOVEMENT_SPEED)
sizeMoveMod(1)
+ return ..()
/datum/status_effect/chem/breast_enlarger/proc/sizeMoveMod(var/value)
if(cachedmoveCalc == value)
@@ -164,6 +166,7 @@
log_game("FERMICHEM: [owner]'s dick has reduced to an acceptable size. ID: [owner.key]")
owner.remove_movespeed_modifier(DICK_MOVEMENT_SPEED)
owner.ResetBloodVol()
+ return ..()
///////////////////////////////////////////////
// Astral INSURANCE
@@ -192,15 +195,14 @@
/datum/status_effect/chem/astral_insurance/on_remove(mob/living/carbon/M) //God damnit get them home!
if(owner.mind == originalmind) //If they're home, HOORAY
- return
+ return ..()
if(owner.mind)
var/mob/living/simple_animal/astral/G = new(get_turf(M.loc))
owner.mind.transfer_to(G)//Just in case someone else is inside of you, it makes them a ghost and should hopefully bring them home at the end.
to_chat(G, "[M]'s conciousness snaps back to them as their astrogen runs out, kicking your projected mind out!'")
log_game("FERMICHEM: [M]'s possesser has been booted out into a astral ghost!")
originalmind.transfer_to(original)
-
-
+ return ..()
/*//////////////////////////////////////////
Mind control functions!
@@ -603,7 +605,7 @@
REMOVE_TRAIT(owner, TRAIT_PACIFISM, "MKUltra")
to_chat(owner, "You're now free of [master]'s influence, and fully independent!'")
UnregisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL)
-
+ return ..()
/datum/status_effect/chem/enthrall/proc/owner_hear(datum/source, list/hearing_args)
if(lewd == FALSE)
diff --git a/modular_citadel/code/game/objects/effects/temporary_visuals/souldeath.dm b/modular_citadel/code/game/objects/effects/temporary_visuals/souldeath.dm
index 1ebf6fb2a6..bd5bd06df7 100644
--- a/modular_citadel/code/game/objects/effects/temporary_visuals/souldeath.dm
+++ b/modular_citadel/code/game/objects/effects/temporary_visuals/souldeath.dm
@@ -2,4 +2,4 @@
name = "soul death"
icon = 'modular_citadel/icons/effects/souldeath.dmi'
icon_state = "souldeath"
- duration = 30
\ No newline at end of file
+ duration = 30
diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm
index 9aa4a26065..6f0588f76e 100644
--- a/modular_citadel/code/modules/arousal/genitals.dm
+++ b/modular_citadel/code/modules/arousal/genitals.dm
@@ -1,7 +1,7 @@
/obj/item/organ/genital
color = "#fcccb3"
w_class = WEIGHT_CLASS_NORMAL
- var/shape = "human"
+ var/shape
var/sensitivity = 1 // wow if this were ever used that'd be cool but it's not but i'm keeping it for my unshit code
var/genital_flags //see citadel_defines.dm
var/masturbation_verb = "masturbate"
diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm
index f3ce834838..bfa506da6d 100644
--- a/modular_citadel/code/modules/arousal/organs/breasts.dm
+++ b/modular_citadel/code/modules/arousal/organs/breasts.dm
@@ -8,10 +8,10 @@
icon = 'modular_citadel/icons/obj/genitals/breasts.dmi'
zone = BODY_ZONE_CHEST
slot = ORGAN_SLOT_BREASTS
- size = "c" //refer to the breast_values static list below for the cups associated number values
+ size = BREASTS_SIZE_DEF // "c". Refer to the breast_values static list below for the cups associated number values
fluid_id = /datum/reagent/consumable/milk
fluid_rate = MILK_RATE
- shape = "pair"
+ shape = DEF_BREASTS_SHAPE
genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_FUID_PRODUCTION|GENITAL_CAN_AROUSE
masturbation_verb = "massage"
arousal_verb = "Your breasts start feeling sensitive"
diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm
index c9eb0769cf..294ac6c877 100644
--- a/modular_citadel/code/modules/arousal/organs/penis.dm
+++ b/modular_citadel/code/modules/arousal/organs/penis.dm
@@ -11,6 +11,7 @@
genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE
linked_organ_slot = ORGAN_SLOT_TESTICLES
fluid_transfer_factor = 0.5
+ shape = DEF_COCK_SHAPE
size = 2 //arbitrary value derived from length and diameter for sprites.
layer_index = PENIS_LAYER_INDEX
var/length = 6 //inches
diff --git a/modular_citadel/code/modules/arousal/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm
index 0c9a8fb86f..cf4480ff1f 100644
--- a/modular_citadel/code/modules/arousal/organs/testicles.dm
+++ b/modular_citadel/code/modules/arousal/organs/testicles.dm
@@ -11,7 +11,7 @@
linked_organ_slot = ORGAN_SLOT_PENIS
genital_flags = CAN_MASTURBATE_WITH|MASTURBATE_LINKED_ORGAN|GENITAL_FUID_PRODUCTION
var/size_name = "average"
- shape = "Single"
+ shape = DEF_BALLS_SHAPE
fluid_id = /datum/reagent/consumable/semen
masturbation_verb = "massage"
layer_index = TESTICLES_LAYER_INDEX
diff --git a/modular_citadel/code/modules/arousal/organs/vagina.dm b/modular_citadel/code/modules/arousal/organs/vagina.dm
index 311afe75b0..91c3b8b8e9 100644
--- a/modular_citadel/code/modules/arousal/organs/vagina.dm
+++ b/modular_citadel/code/modules/arousal/organs/vagina.dm
@@ -6,6 +6,7 @@
zone = BODY_ZONE_PRECISE_GROIN
slot = "vagina"
size = 1 //There is only 1 size right now
+ shape = DEF_VAGINA_SHAPE
genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE
masturbation_verb = "finger"
arousal_verb = "You feel wetness on your crotch"
diff --git a/modular_citadel/code/modules/mob/living/carbon/carbon.dm b/modular_citadel/code/modules/mob/living/carbon/carbon.dm
index 44512ac0c7..e95948e562 100644
--- a/modular_citadel/code/modules/mob/living/carbon/carbon.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/carbon.dm
@@ -1,73 +1,29 @@
/mob/living/carbon
- var/combatmode = FALSE //literally lifeweb
var/lastmousedir
var/wrongdirmovedelay
- var/lastdirchange
- var/combatmessagecooldown
//oh no vore time
var/voremode = FALSE
-/mob/living/carbon/proc/toggle_combat_mode(forced, silent)
- if(!forced)
- if(recoveringstam || stat != CONSCIOUS)
- return TRUE
- for(var/i in status_effects)
- var/datum/status_effect/S = i
- if(S.blocks_combatmode)
- return TRUE
- combatmode = !combatmode
- if(voremode)
- toggle_vore_mode()
- if(!silent)
- if(combatmode)
- if(world.time >= combatmessagecooldown)
- if(a_intent != INTENT_HELP)
- visible_message("[src] [resting ? "tenses up" : (prob(95)? "drops into a combative stance" : (prob(95)? "poses aggressively" : "asserts dominance with their pose"))].")
- else
- visible_message("[src] [pick("looks","seems","goes")] [pick("alert","attentive","vigilant")].")
- playsound_local(src, 'sound/misc/ui_toggle.ogg', 50, FALSE, pressure_affected = FALSE) //Sound from interbay!
- else
- playsound_local(src, 'sound/misc/ui_toggleoff.ogg', 50, FALSE, pressure_affected = FALSE) //Slightly modified version of the above!
- if(client)
- client.show_popup_menus = !combatmode // So we can right-click for alternate actions and all that other good shit. Also moves examine to shift+rightclick to make it possible to attack while sprinting
- var/obj/screen/combattoggle/T = locate() in hud_used?.static_inventory
- T?.update_icon_state()
- combatmessagecooldown = 10 SECONDS + world.time //This is set 100% of the time to make sure squeezing regen out of process cycles doesn't result in the combat mode message getting spammed
- SEND_SIGNAL(src, COMSIG_COMBAT_TOGGLED, src, combatmode)
- return TRUE
-
-mob/living/carbon/proc/toggle_vore_mode()
+/mob/living/carbon/proc/toggle_vore_mode()
voremode = !voremode
var/obj/screen/voretoggle/T = locate() in hud_used?.static_inventory
T?.update_icon_state()
- if(combatmode)
+ if(combat_flags & COMBAT_FLAG_COMBAT_TOGGLED)
return FALSE //let's not override the main draw of the game these days
SEND_SIGNAL(src, COMSIG_VORE_TOGGLED, src, voremode)
return TRUE
/mob/living/carbon/Move(atom/newloc, direct = 0)
- var/currentdirection = dir
. = ..()
wrongdirmovedelay = FALSE
- if(combatmode && client && lastmousedir)
+ if((combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) && client && lastmousedir)
if(lastmousedir != dir)
wrongdirmovedelay = TRUE
setDir(lastmousedir, ismousemovement = TRUE)
- if(currentdirection != dir)
- lastdirchange = world.time
-
/mob/living/carbon/onMouseMove(object, location, control, params)
- if(!combatmode)
+ if(!(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
return
mouse_face_atom(object)
lastmousedir = dir
-
-/mob/living/carbon/setDir(newdir, ismousemovement = FALSE)
- if(!combatmode || ismousemovement)
- if(dir != newdir)
- lastdirchange = world.time
- . = ..()
- else
- return
diff --git a/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm b/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm
index eaf5899d82..a2b9c601dc 100644
--- a/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm
@@ -15,24 +15,6 @@
if(!forced && (status_flags & GODMODE))
return FALSE
apply_damage(amount > 0 ? amount*incomingstammult : amount, STAMINA, affected_zone)
- if(recoveringstam && amount > 20)
+ if((combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && amount > 20)
incomingstammult = max(0.01, incomingstammult/(amount*0.05))
return amount
-
-/mob/living/carbon/doSprintLossTiles(tiles)
- doSprintBufferRegen(FALSE) //first regen.
- if(sprint_buffer)
- var/use = min(tiles, sprint_buffer)
- sprint_buffer -= use
- tiles -= use
- update_hud_sprint_bar()
- if(!tiles) //we had enough, we're done!
- return
- adjustStaminaLoss(tiles * sprint_stamina_cost) //use stamina to cover deficit.
-
-/mob/living/carbon/proc/doSprintBufferRegen(updating = TRUE)
- var/diff = world.time - sprint_buffer_regen_last
- sprint_buffer_regen_last = world.time
- sprint_buffer = min(sprint_buffer_max, sprint_buffer + sprint_buffer_regen_ds * diff)
- if(updating)
- update_hud_sprint_bar()
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm b/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm
deleted file mode 100644
index 2223b0816a..0000000000
--- a/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm
+++ /dev/null
@@ -1,37 +0,0 @@
-/mob/living/carbon/human/Move(NewLoc, direct)
- var/oldpseudoheight = pseudo_z_axis
- . = ..()
- if(. && sprinting && !(movement_type & FLYING) && CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_MOVE|MOBILITY_STAND) && m_intent == MOVE_INTENT_RUN && has_gravity(loc) && !pulledby)
- if(!HAS_TRAIT(src, TRAIT_FREESPRINT))
- doSprintLossTiles(1)
- if((oldpseudoheight - pseudo_z_axis) >= 8)
- to_chat(src, "You trip off of the elevated surface!")
- for(var/obj/item/I in held_items)
- accident(I)
- DefaultCombatKnockdown(80)
-
-/mob/living/carbon/human/movement_delay()
- . = 0
- if((mobility_flags & MOBILITY_STAND) && m_intent == MOVE_INTENT_RUN && sprinting)
- var/static/datum/config_entry/number/movedelay/sprint_speed_increase/SSI
- if(!SSI)
- SSI = CONFIG_GET_ENTRY(number/movedelay/sprint_speed_increase)
- . -= SSI.config_entry_value
- if(wrongdirmovedelay)
- . += 1
- . += ..()
-
-/mob/living/carbon/human/proc/togglesprint() // If you call this proc outside of hotkeys or clicking the HUD button, I'll be disappointed in you.
- sprinting = !sprinting
- if((m_intent == MOVE_INTENT_RUN) && CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE))
- if(sprinting)
- playsound_local(src, 'sound/misc/sprintactivate.ogg', 50, FALSE, pressure_affected = FALSE)
- else
- playsound_local(src, 'sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE)
- var/obj/screen/sprintbutton/S = locate() in hud_used?.static_inventory
- S?.update_icon_state()
- return TRUE
-
-/mob/living/carbon/human/proc/sprint_hotkey(targetstatus)
- if(targetstatus ? !sprinting : sprinting)
- togglesprint()
diff --git a/modular_citadel/code/modules/mob/living/damage_procs.dm b/modular_citadel/code/modules/mob/living/damage_procs.dm
index c2ce8fd24c..a399c17c71 100644
--- a/modular_citadel/code/modules/mob/living/damage_procs.dm
+++ b/modular_citadel/code/modules/mob/living/damage_procs.dm
@@ -1,5 +1,2 @@
/mob/living/proc/adjustStaminaLossBuffered(amount, updating_health = TRUE, forced = FALSE)
return
-
-/mob/living/proc/doSprintLossTiles(amount)
- return
diff --git a/modular_citadel/code/modules/mob/living/living.dm b/modular_citadel/code/modules/mob/living/living.dm
index c0e045365f..3baab2ad86 100644
--- a/modular_citadel/code/modules/mob/living/living.dm
+++ b/modular_citadel/code/modules/mob/living/living.dm
@@ -1,32 +1,4 @@
/mob/living
- var/sprinting = FALSE
- var/recoveringstam = FALSE
- var/incomingstammult = 1
- var/bufferedstam = 0
- var/stambuffer = 20
- var/stambufferregentime
- var/attemptingstandup = FALSE
- var/intentionalresting = FALSE
- var/attemptingcrawl = FALSE
-
- //Sprint buffer---
- var/sprint_buffer = 42 //Tiles
- var/sprint_buffer_max = 42
- var/sprint_buffer_regen_ds = 0.3 //Tiles per world.time decisecond
- var/sprint_buffer_regen_last = 0 //last world.time this was regen'd for math.
- var/sprint_stamina_cost = 0.70 //stamina loss per tile while insufficient sprint buffer.
- //---End
-
-/mob/living/update_config_movespeed()
- . = ..()
- sprint_buffer_max = CONFIG_GET(number/movedelay/sprint_buffer_max)
- sprint_buffer_regen_ds = CONFIG_GET(number/movedelay/sprint_buffer_regen_per_ds)
- sprint_stamina_cost = CONFIG_GET(number/movedelay/sprint_stamina_cost)
-
-/mob/living/movement_delay(ignorewalk = 0)
- . = ..()
- if(!CHECK_MOBILITY(src, MOBILITY_STAND))
- . += 6
/atom
var/pseudo_z_axis
@@ -55,22 +27,23 @@
/mob/living/carbon/update_stamina()
var/total_health = getStaminaLoss()
+ if(total_health >= STAMINA_SOFTCRIT)
+ if(!(combat_flags & COMBAT_FLAG_SOFT_STAMCRIT))
+ ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_SOFT_STAMCRIT)
+ else
+ if(combat_flags & COMBAT_FLAG_SOFT_STAMCRIT)
+ DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_SOFT_STAMCRIT)
if(total_health)
- if(!recoveringstam && total_health >= STAMINA_CRIT && !stat)
+ if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && total_health >= STAMINA_CRIT && !stat)
to_chat(src, "You're too exhausted to keep going...")
set_resting(TRUE, FALSE, FALSE)
- if(combatmode)
- toggle_combat_mode(TRUE)
- recoveringstam = TRUE
+ disable_intentional_combat_mode(TRUE, FALSE)
+ ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_HARD_STAMCRIT)
filters += CIT_FILTER_STAMINACRIT
update_mobility()
- if(recoveringstam && total_health <= STAMINA_SOFTCRIT)
+ if((combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && total_health <= STAMINA_SOFTCRIT)
to_chat(src, "You don't feel nearly as exhausted anymore.")
- recoveringstam = FALSE
+ DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_HARD_STAMCRIT | COMBAT_FLAG_SOFT_STAMCRIT)
filters -= CIT_FILTER_STAMINACRIT
update_mobility()
update_health_hud()
-
-/mob/living/proc/update_hud_sprint_bar()
- if(hud_used && hud_used.sprint_buffer)
- hud_used.sprint_buffer.update_to_mob(src)
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm
deleted file mode 100644
index 526ea497c4..0000000000
--- a/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm
+++ /dev/null
@@ -1,30 +0,0 @@
-/mob/living/silicon/robot/Move(NewLoc, direct)
- . = ..()
- if(. && sprinting && !(movement_type & FLYING) && CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND | MOBILITY_MOVE))
- if(!(cell?.use(25)))
- togglesprint(TRUE)
-
-/mob/living/silicon/robot/movement_delay()
- . = ..()
- if(!resting && !sprinting)
- . += 1
- . += speed
-
-/mob/living/silicon/robot/proc/togglesprint(shutdown = FALSE) //Basically a copypaste of the proc from /mob/living/carbon/human
- if(!shutdown && (!cell || cell.charge < 25) || !cansprint)
- return FALSE
- sprinting = shutdown ? FALSE : !sprinting
- if(CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE))
- if(sprinting)
- playsound_local(src, 'sound/misc/sprintactivate.ogg', 50, FALSE, pressure_affected = FALSE)
- else
- if(shutdown)
- playsound_local(src, 'sound/effects/light_flicker.ogg', 50, FALSE, pressure_affected = FALSE)
- playsound_local(src, 'sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE)
- var/obj/screen/sprintbutton/S = locate() in hud_used?.static_inventory
- S?.update_icon_state()
- return TRUE
-
-/mob/living/silicon/robot/proc/sprint_hotkey(targetstatus)
- if(targetstatus ? !sprinting : sprinting)
- togglesprint()
diff --git a/modular_citadel/icons/ui/screen_clockwork.dmi b/modular_citadel/icons/ui/screen_clockwork.dmi
index 2b70d37f1e..3a7ba8338f 100644
Binary files a/modular_citadel/icons/ui/screen_clockwork.dmi and b/modular_citadel/icons/ui/screen_clockwork.dmi differ
diff --git a/modular_citadel/icons/ui/screen_midnight.dmi b/modular_citadel/icons/ui/screen_midnight.dmi
index 396fd4a36e..a730c591ba 100644
Binary files a/modular_citadel/icons/ui/screen_midnight.dmi and b/modular_citadel/icons/ui/screen_midnight.dmi differ
diff --git a/modular_citadel/icons/ui/screen_operative.dmi b/modular_citadel/icons/ui/screen_operative.dmi
index a2c9420b77..cb08f08ceb 100644
Binary files a/modular_citadel/icons/ui/screen_operative.dmi and b/modular_citadel/icons/ui/screen_operative.dmi differ
diff --git a/modular_citadel/icons/ui/screen_plasmafire.dmi b/modular_citadel/icons/ui/screen_plasmafire.dmi
index abbb8f0cd1..5f8cd9d93c 100644
Binary files a/modular_citadel/icons/ui/screen_plasmafire.dmi and b/modular_citadel/icons/ui/screen_plasmafire.dmi differ
diff --git a/modular_citadel/icons/ui/screen_slimecore.dmi b/modular_citadel/icons/ui/screen_slimecore.dmi
index 15651808ec..f2f0c88782 100644
Binary files a/modular_citadel/icons/ui/screen_slimecore.dmi and b/modular_citadel/icons/ui/screen_slimecore.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 9fd7f92fea..d8564ba307 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -312,6 +312,7 @@
#include "code\controllers\subsystem\processing\processing.dm"
#include "code\controllers\subsystem\processing\projectiles.dm"
#include "code\controllers\subsystem\processing\quirks.dm"
+#include "code\controllers\subsystem\processing\status_effects.dm"
#include "code\controllers\subsystem\processing\weather.dm"
#include "code\controllers\subsystem\processing\wet_floors.dm"
#include "code\datums\action.dm"
@@ -2195,10 +2196,12 @@
#include "code\modules\mob\living\life.dm"
#include "code\modules\mob\living\living.dm"
#include "code\modules\mob\living\living_block.dm"
+#include "code\modules\mob\living\living_combat.dm"
#include "code\modules\mob\living\living_defense.dm"
#include "code\modules\mob\living\living_defines.dm"
#include "code\modules\mob\living\living_mobility.dm"
#include "code\modules\mob\living\living_movement.dm"
+#include "code\modules\mob\living\living_sprint.dm"
#include "code\modules\mob\living\login.dm"
#include "code\modules\mob\living\logout.dm"
#include "code\modules\mob\living\say.dm"
@@ -2216,9 +2219,11 @@
#include "code\modules\mob\living\brain\say.dm"
#include "code\modules\mob\living\brain\status_procs.dm"
#include "code\modules\mob\living\carbon\carbon.dm"
+#include "code\modules\mob\living\carbon\carbon_combat.dm"
#include "code\modules\mob\living\carbon\carbon_defense.dm"
#include "code\modules\mob\living\carbon\carbon_defines.dm"
#include "code\modules\mob\living\carbon\carbon_movement.dm"
+#include "code\modules\mob\living\carbon\carbon_sprint.dm"
#include "code\modules\mob\living\carbon\damage_procs.dm"
#include "code\modules\mob\living\carbon\death.dm"
#include "code\modules\mob\living\carbon\emote.dm"
@@ -2358,6 +2363,7 @@
#include "code\modules\mob\living\silicon\robot\robot_mobility.dm"
#include "code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
+#include "code\modules\mob\living\silicon\robot\robot_sprint.dm"
#include "code\modules\mob\living\silicon\robot\say.dm"
#include "code\modules\mob\living\silicon\robot\update_icons.dm"
#include "code\modules\mob\living\simple_animal\animal_defense.dm"
@@ -3269,9 +3275,7 @@
#include "modular_citadel\code\modules\mob\living\carbon\reindex_screams.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\human.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\human_defense.dm"
-#include "modular_citadel\code\modules\mob\living\carbon\human\human_movement.dm"
#include "modular_citadel\code\modules\mob\living\silicon\robot\dogborg_equipment.dm"
-#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_movement.dm"
#include "modular_citadel\code\modules\projectiles\gun.dm"
#include "modular_citadel\code\modules\projectiles\ammunition\caseless.dm"
#include "modular_citadel\code\modules\projectiles\ammunition\ballistic\smg\smg.dm"