160175ee8b
Yeah uhh this'll probably need testmerging even after it's done because yeah it's a bit big. If y'all want me to atomize this into two PRs (pass flags vs projectiles) tell me please. Pass flags would have to go in first though, in that case, as new projectile hit handling will rely on pass_flags_self. Pass flags: Pass flags handling now uses an atom variable named pass_flags_self. If any of these match a pass_flag on a thing trying to pass through, it's allowed through by default. This makes overriding CanAllowThrough unnecessary for the majority of things. I've however not removed overrides for very.. weird cases, like plastic flaps which uses a prob(60) for letting PASSGLASS things through for god knows why. LETPASSTHROW is now on pass_flags_self Projectiles: Not finalized yet, need to do something to make the system I have in mind have less unneeded overhead + snowflake Basically, for piercing/phasing/otherwise projectiles that go through things instead of hitting the first dense object, I have them use pass_flags flags for two new variables, projectile_phasing and projectile_piercing. Anything with pass_flags_self in the former gets phased through entirely. Anything in the latter gets hit, and the projectile then goes through. on_hit will also register a piercing hit vs a normal hit (so things like missiles can only explode on a normal hit or otherwise, instead of exploding multiple times. Not needed as missiles qdel(src) right now but it's nice to have for the future). I still need to decide what to do for hit handling proper, as Bump() is still preferred due to it not being as high-overhead as something like scanning on Moved(). I'm thinking I'll make Moved() only scan for cases where it needs to hit a non-dense object - a prone human the user clicked on, anything special like that. Don't know the exact specifics yet, which is why this is still WIP. Projectiles now use check_pierce() to determine if it goes through something and hits it, doesn't hit it, or doesn't go through something at all (should delete self after hitting). Will likely make an on_pierce proc to be called post-piercing something so you can have !fun! things like projectiles that go down in damage after piercing something. This will likely deprecate the process_hit proc, or at least make it less awful. scan_for_hit() is now used to attempt to hit something and will return whether the projectile got deleted or not. It will delete the projectile if the projectile does hit something and fails to pierce through it. scan_moved_turf() (WIP) will be used for handling moving onto a turf. permutated has been renamed to impacted. Ricocheting projectiles get it reset, allowing projectiles to pierce and potentially hit something again if it goes back around. A new unit test has been added checking for projectiles with movement type of PHASING. This is because PHASING completely causes projectiles to break down as projectiles mainly sense collisions through Bump. The small boost in performance from using PHASING instead of having all pass flags active/overriding check_pierce is in my opinion not worth the extra snowflake in scan_moved_turf() I'd have to do to deal with having to check for hits manually rather than Bump()ing things. Movement types UNSTOPPABLE renamed to PHASING to better describe what it is, going through and crossing everything but not actually bumping. Why It's Good For The Game Better pass flags handling allows for less proc overrides, bitflag checks are far less expensive in general. Fixes penetrating projectiles like sniper penetrators This system also allows for better handling of piercing projectiles (see above) without too much snowflake code, as you'd only need to modify on_pierce() if you needed to do special handling like dampening damage per target pierced, and otherwise you could just use the standardized system and just set pass flags to what's needed. If you really need a projectile that pierces almost everything, override check_pierce(), which is still going to be easier than what was done before (even with snowflake handling of UNSTOPPABLE flag process_hit() was extremely ugly, now we don't rely on movement types at all.)
286 lines
11 KiB
Plaintext
286 lines
11 KiB
Plaintext
/*ALL DEFINES RELATED TO COMBAT GO HERE*/
|
|
|
|
//Damage and status effect defines
|
|
|
|
//Damage defines //TODO: merge these down to reduce on defines
|
|
/// Physical fracturing and warping of the material.
|
|
#define BRUTE "brute"
|
|
/// Scorching and charring of the material.
|
|
#define BURN "burn"
|
|
/// Poisoning. Mostly caused by reagents.
|
|
#define TOX "toxin"
|
|
/// Suffocation.
|
|
#define OXY "oxygen"
|
|
/// Cellular degredation. Rare and difficult to treat.
|
|
#define CLONE "clone"
|
|
/// Exhaustion and nonlethal damage.
|
|
#define STAMINA "stamina"
|
|
/// Brain damage. Should probably be decomissioned and replaced with proper organ damage.
|
|
#define BRAIN "brain"
|
|
|
|
//Damage flag defines //
|
|
/// Involves a melee attack or a thrown object.
|
|
#define MELEE "melee"
|
|
/// Involves a solid projectile.
|
|
#define BULLET "bullet"
|
|
/// Involves a laser.
|
|
#define LASER "laser"
|
|
/// Involves an EMP or energy-based projectile.
|
|
#define ENERGY "energy"
|
|
/// Involves a shockwave, usually from an explosion.
|
|
#define BOMB "bomb"
|
|
/// Involved in checking wheter a disease can infect or spread. Also involved in xeno neurotoxin.
|
|
#define BIO "bio"
|
|
/// Involves ionizing radiation.
|
|
#define RAD "rad"
|
|
/// Involves fire or temperature extremes.
|
|
#define FIRE "fire"
|
|
/// Involves corrosive substances.
|
|
#define ACID "acid"
|
|
/// Involves magic.
|
|
#define MAGIC "magic"
|
|
/// Involved in checking the likelyhood of applying a wound to a mob.
|
|
#define WOUND "wound"
|
|
|
|
//bitflag damage defines used for suicide_act
|
|
#define BRUTELOSS (1<<0)
|
|
#define FIRELOSS (1<<1)
|
|
#define TOXLOSS (1<<2)
|
|
#define OXYLOSS (1<<3)
|
|
#define SHAME (1<<4)
|
|
#define MANUAL_SUICIDE (1<<5) //suicide_act will do the actual killing.
|
|
#define MANUAL_SUICIDE_NONLETHAL (1<<6) //when the suicide is conditionally lethal
|
|
|
|
#define EFFECT_STUN "stun"
|
|
#define EFFECT_KNOCKDOWN "knockdown"
|
|
#define EFFECT_UNCONSCIOUS "unconscious"
|
|
#define EFFECT_PARALYZE "paralyze"
|
|
#define EFFECT_IMMOBILIZE "immobilize"
|
|
#define EFFECT_IRRADIATE "irradiate"
|
|
#define EFFECT_STUTTER "stutter"
|
|
#define EFFECT_SLUR "slur"
|
|
#define EFFECT_EYE_BLUR "eye_blur"
|
|
#define EFFECT_DROWSY "drowsy"
|
|
#define EFFECT_JITTER "jitter"
|
|
|
|
//Bitflags defining which status effects could be or are inflicted on a mob
|
|
#define CANSTUN (1<<0)
|
|
#define CANKNOCKDOWN (1<<1)
|
|
#define CANUNCONSCIOUS (1<<2)
|
|
#define CANPUSH (1<<3)
|
|
#define GODMODE (1<<4)
|
|
|
|
//Health Defines
|
|
#define HEALTH_THRESHOLD_CRIT 0
|
|
#define HEALTH_THRESHOLD_FULLCRIT -30
|
|
#define HEALTH_THRESHOLD_DEAD -100
|
|
|
|
#define HEALTH_THRESHOLD_NEARDEATH -90 //Not used mechanically, but to determine if someone is so close to death they hear the other side
|
|
|
|
//Actual combat defines
|
|
|
|
//click cooldowns, in tenths of a second, used for various combat actions
|
|
#define CLICK_CD_MELEE 8
|
|
#define CLICK_CD_THROW 8
|
|
#define CLICK_CD_RANGE 4
|
|
#define CLICK_CD_RAPID 2
|
|
#define CLICK_CD_CLICK_ABILITY 6
|
|
#define CLICK_CD_BREAKOUT 100
|
|
#define CLICK_CD_HANDCUFFED 10
|
|
#define CLICK_CD_RESIST 20
|
|
#define CLICK_CD_GRABBING 10
|
|
#define CLICK_CD_LOOK_UP 5
|
|
|
|
//Cuff resist speeds
|
|
#define FAST_CUFFBREAK 1
|
|
#define INSTANT_CUFFBREAK 2
|
|
|
|
//Grab levels
|
|
#define GRAB_PASSIVE 0
|
|
#define GRAB_AGGRESSIVE 1
|
|
#define GRAB_NECK 2
|
|
#define GRAB_KILL 3
|
|
|
|
//Grab breakout odds
|
|
#define BASE_GRAB_RESIST_CHANCE 60 //base chance for whether or not you can escape from a grab
|
|
|
|
//slowdown when in softcrit. Note that crawling slowdown will also apply at the same time!
|
|
#define SOFTCRIT_ADD_SLOWDOWN 2
|
|
//slowdown when crawling
|
|
#define CRAWLING_ADD_SLOWDOWN 4
|
|
|
|
//Attack types for checking shields/hit reactions
|
|
#define MELEE_ATTACK 1
|
|
#define UNARMED_ATTACK 2
|
|
#define PROJECTILE_ATTACK 3
|
|
#define THROWN_PROJECTILE_ATTACK 4
|
|
#define LEAP_ATTACK 5
|
|
|
|
//attack visual effects
|
|
#define ATTACK_EFFECT_PUNCH "punch"
|
|
#define ATTACK_EFFECT_KICK "kick"
|
|
#define ATTACK_EFFECT_SMASH "smash"
|
|
#define ATTACK_EFFECT_CLAW "claw"
|
|
#define ATTACK_EFFECT_SLASH "slash"
|
|
#define ATTACK_EFFECT_DISARM "disarm"
|
|
#define ATTACK_EFFECT_BITE "bite"
|
|
#define ATTACK_EFFECT_MECHFIRE "mech_fire"
|
|
#define ATTACK_EFFECT_MECHTOXIN "mech_toxin"
|
|
#define ATTACK_EFFECT_BOOP "boop" //Honk
|
|
|
|
//intent defines
|
|
#define INTENT_HELP "help"
|
|
#define INTENT_GRAB "grab"
|
|
#define INTENT_DISARM "disarm"
|
|
#define INTENT_HARM "harm"
|
|
//NOTE: INTENT_HOTKEY_* defines are not actual intents!
|
|
//they are here to support hotkeys
|
|
#define INTENT_HOTKEY_LEFT "left"
|
|
#define INTENT_HOTKEY_RIGHT "right"
|
|
|
|
//the define for visible message range in combat
|
|
#define COMBAT_MESSAGE_RANGE 3
|
|
#define DEFAULT_MESSAGE_RANGE 7
|
|
|
|
//Shove knockdown lengths (deciseconds)
|
|
#define SHOVE_KNOCKDOWN_SOLID 20
|
|
#define SHOVE_KNOCKDOWN_HUMAN 20
|
|
#define SHOVE_KNOCKDOWN_TABLE 20
|
|
#define SHOVE_KNOCKDOWN_COLLATERAL 1
|
|
#define SHOVE_CHAIN_PARALYZE 30
|
|
//Shove slowdown
|
|
#define SHOVE_SLOWDOWN_LENGTH 30
|
|
#define SHOVE_SLOWDOWN_STRENGTH 0.85 //multiplier
|
|
//Shove disarming item list
|
|
GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
|
|
/obj/item/gun)))
|
|
|
|
|
|
//Combat object defines
|
|
|
|
//Embedded objects
|
|
///Chance for embedded objects to cause pain (damage user)
|
|
#define EMBEDDED_PAIN_CHANCE 15
|
|
///Chance for embedded object to fall out (causing pain but removing the object)
|
|
#define EMBEDDED_ITEM_FALLOUT 5
|
|
///Chance for an object to embed into somebody when thrown
|
|
#define EMBED_CHANCE 45
|
|
///Coefficient of multiplication for the damage the item does while embedded (this*item.w_class)
|
|
#define EMBEDDED_PAIN_MULTIPLIER 2
|
|
///Coefficient of multiplication for the damage the item does when it first embeds (this*item.w_class)
|
|
#define EMBEDDED_IMPACT_PAIN_MULTIPLIER 4
|
|
///The minimum value of an item's throw_speed for it to embed (Unless it has embedded_ignore_throwspeed_threshold set to 1)
|
|
#define EMBED_THROWSPEED_THRESHOLD 4
|
|
///Coefficient of multiplication for the damage the item does when it falls out or is removed without a surgery (this*item.w_class)
|
|
#define EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER 6
|
|
///A Time in ticks, total removal time = (this*item.w_class)
|
|
#define EMBEDDED_UNSAFE_REMOVAL_TIME 30
|
|
///Chance for embedded objects to cause pain every time they move (jostle)
|
|
#define EMBEDDED_JOSTLE_CHANCE 5
|
|
///Coefficient of multiplication for the damage the item does while
|
|
#define EMBEDDED_JOSTLE_PAIN_MULTIPLIER 1
|
|
///This percentage of all pain will be dealt as stam damage rather than brute (0-1)
|
|
#define EMBEDDED_PAIN_STAM_PCT 0.0
|
|
|
|
#define EMBED_HARMLESS list("pain_mult" = 0, "jostle_pain_mult" = 0, "ignore_throwspeed_threshold" = TRUE)
|
|
#define EMBED_HARMLESS_SUPERIOR list("pain_mult" = 0, "jostle_pain_mult" = 0, "ignore_throwspeed_threshold" = TRUE, "embed_chance" = 100, "fall_chance" = 0.1)
|
|
#define EMBED_POINTY list("ignore_throwspeed_threshold" = TRUE)
|
|
#define EMBED_POINTY_SUPERIOR list("embed_chance" = 100, "ignore_throwspeed_threshold" = TRUE)
|
|
|
|
//Gun weapon weight
|
|
#define WEAPON_LIGHT 1
|
|
#define WEAPON_MEDIUM 2
|
|
#define WEAPON_HEAVY 3
|
|
//Gun trigger guards
|
|
#define TRIGGER_GUARD_ALLOW_ALL -1
|
|
#define TRIGGER_GUARD_NONE 0
|
|
#define TRIGGER_GUARD_NORMAL 1
|
|
//Gun bolt types
|
|
///Gun has a bolt, it stays closed while not cycling. The gun must be racked to have a bullet chambered when a mag is inserted.
|
|
/// Example: c20, shotguns, m90
|
|
#define BOLT_TYPE_STANDARD 1
|
|
///Gun has a bolt, it is open when ready to fire. The gun can never have a chambered bullet with no magazine, but the bolt stays ready when a mag is removed.
|
|
/// Example: Some SMGs, the L6
|
|
#define BOLT_TYPE_OPEN 2
|
|
///Gun has no moving bolt mechanism, it cannot be racked. Also dumps the entire contents when emptied instead of a magazine.
|
|
/// Example: Break action shotguns, revolvers
|
|
#define BOLT_TYPE_NO_BOLT 3
|
|
///Gun has a bolt, it locks back when empty. It can be released to chamber a round if a magazine is in.
|
|
/// Example: Pistols with a slide lock, some SMGs
|
|
#define BOLT_TYPE_LOCKING 4
|
|
//Sawn off nerfs
|
|
///accuracy penalty of sawn off guns
|
|
#define SAWN_OFF_ACC_PENALTY 25
|
|
///added recoil of sawn off guns
|
|
#define SAWN_OFF_RECOIL 1
|
|
|
|
//ammo box sprite defines
|
|
///ammo box will always use provided icon state
|
|
#define AMMO_BOX_ONE_SPRITE 0
|
|
///ammo box will have a different state for each bullet; <icon_state>-<bullets left>
|
|
#define AMMO_BOX_PER_BULLET 1
|
|
///ammo box will have a different state for full and empty; <icon_state>-max_ammo and <icon_state>-0
|
|
#define AMMO_BOX_FULL_EMPTY 2
|
|
|
|
#define SUPPRESSED_NONE 0
|
|
#define SUPPRESSED_QUIET 1 ///standard suppressed
|
|
#define SUPPRESSED_VERY 2 /// no message
|
|
|
|
//Projectile Reflect
|
|
#define REFLECT_NORMAL (1<<0)
|
|
#define REFLECT_FAKEPROJECTILE (1<<1)
|
|
|
|
//Object/Item sharpness
|
|
#define SHARP_NONE 0
|
|
#define SHARP_EDGED 1
|
|
#define SHARP_POINTY 2
|
|
|
|
//His Grace.
|
|
#define HIS_GRACE_SATIATED 0 //He hungers not. If bloodthirst is set to this, His Grace is asleep.
|
|
#define HIS_GRACE_PECKISH 20 //Slightly hungry.
|
|
#define HIS_GRACE_HUNGRY 60 //Getting closer. Increases damage up to a minimum of 20.
|
|
#define HIS_GRACE_FAMISHED 100 //Dangerous. Increases damage up to a minimum of 25 and cannot be dropped.
|
|
#define HIS_GRACE_STARVING 120 //Incredibly close to breaking loose. Increases damage up to a minimum of 30.
|
|
#define HIS_GRACE_CONSUME_OWNER 140 //His Grace consumes His owner at this point and becomes aggressive.
|
|
#define HIS_GRACE_FALL_ASLEEP 160 //If it reaches this point, He falls asleep and resets.
|
|
|
|
#define HIS_GRACE_FORCE_BONUS 4 //How much force is gained per kill.
|
|
|
|
#define EXPLODE_NONE 0 //Don't even ask me why we need this.
|
|
#define EXPLODE_DEVASTATE 1
|
|
#define EXPLODE_HEAVY 2
|
|
#define EXPLODE_LIGHT 3
|
|
#define EXPLODE_GIB_THRESHOLD 50 //ex_act() with EXPLODE_DEVASTATE severity will gib mobs with less than this much bomb armor
|
|
|
|
#define EMP_HEAVY 1
|
|
#define EMP_LIGHT 2
|
|
|
|
#define GRENADE_CLUMSY_FUMBLE 1
|
|
#define GRENADE_NONCLUMSY_FUMBLE 2
|
|
#define GRENADE_NO_FUMBLE 3
|
|
|
|
#define BODY_ZONE_HEAD "head"
|
|
#define BODY_ZONE_CHEST "chest"
|
|
#define BODY_ZONE_L_ARM "l_arm"
|
|
#define BODY_ZONE_R_ARM "r_arm"
|
|
#define BODY_ZONE_L_LEG "l_leg"
|
|
#define BODY_ZONE_R_LEG "r_leg"
|
|
|
|
#define BODY_ZONE_PRECISE_EYES "eyes"
|
|
#define BODY_ZONE_PRECISE_MOUTH "mouth"
|
|
#define BODY_ZONE_PRECISE_GROIN "groin"
|
|
#define BODY_ZONE_PRECISE_L_HAND "l_hand"
|
|
#define BODY_ZONE_PRECISE_R_HAND "r_hand"
|
|
#define BODY_ZONE_PRECISE_L_FOOT "l_foot"
|
|
#define BODY_ZONE_PRECISE_R_FOOT "r_foot"
|
|
|
|
//We will round to this value in damage calculations.
|
|
#define DAMAGE_PRECISION 0.1
|
|
|
|
//bullet_act() return values
|
|
#define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting.
|
|
#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting.
|
|
#define BULLET_ACT_FORCE_PIERCE "PIERCE" //It pierces through the object regardless of the bullet being piercing by default.
|
|
|
|
#define NICE_SHOT_RICOCHET_BONUS 10 //if the shooter has the NICE_SHOT trait and they fire a ricocheting projectile, add this to the ricochet chance and auto aim angle
|