Herculean/Atlas implants get a few additional BOULDER/Equipment related benefits. Boulders are more robust. Natural Athletics gains. (#87469)

## About The Pull Request

Herculean/Atlas spinal implants allow you to break boulders to process
them manually. Doing so also grants athletics experience.

They also increase the speed at which you throw objects, and also
increase the range further. The Atlas version also allows you to reduce
equipment movespeed penalties. (Fikou wanted me to do this for
specifically modsuits, but I don't see any reason this can't apply to
more than that, modsuits are just generally the slowest equipment you
could wear)

Boulders have 30 throw force, are by default HUGE, but have no throw
range at all and really weak tk throw range. You need a throwing booster
to throw boulders around. (They do extra damage to SPECIAL mobs, like
lavaland bosses, because it's funny to kill a god-like being with a huge
rock while slow as shit)

You naturally get athletics experience by doing some actions. Fireman
carrying, climbing tables/crates, climbing rope and climbing ladders
give you a slow and steady stream of experience. Rope gives a larger
amount if only because the process for doing so is destructive in some
way (you have to get more climbing rope eventually, so there is an
associated cost). Spinal implants now improve climbing speed for
climbing over objects.

## Why It's Good For The Game

I just had this strange compulsion to make the spinal implant make you
good at throwing boulders at lethal speeds. It already has some cool
rock-based special effects around you. Having mastery over rock throwing
just kind of made sense. Additionally, I thought it would be a funny
method for someone to be able to kill a boss via way of thrown boulders.
Or some hapless nuclear operative unprepared for a bunch of assistants
lobbing boulders at them.

Additionally, I also think it letting you break boulders for ore is a
fairly minor but fun addition. Pull boulders out of the vents, smash
them. Good work out. Particularly for miners.

I talked a while ago with I think Jacq about adding some natural methods
for accumulating athletics experience over the course of a round that
doesn't involve the dedicated weight lifting machinery/boxing bag. I
thought any method for doing that should probably be relatively slow and
definitely nonviable for significant athletics gains beyond novice
level. Mooost people will hit novice on a multi-z map if they go up and
down ladders enough. Or climb a lot of tables/crates. The results aren't
going to have much noticeable impact, however, as you only gain
appreciable benefits above novice. Probably just greater visibility of
fitness in a round. (Rather nice for the RD, who gets to show off how
swole they are more regularly).

<details>
  <summary>Spoiler warning</summary>


![CES8b4XWEAAIakb](https://github.com/user-attachments/assets/8baaa012-8048-419f-b936-2dc6621db3c2)

</details>

## Changelog
🆑
balance: Herculean/Atlas spinal implants make you better at climbing
tables, throw objects much faster and throw them much further. You can
also break boulders with your bare hands.
balance: Atlas implants let you offset the weight of worn/carried
equipment (like boulders).
balance: Boulders have no throw range, but if you can throw them via
throwing range boosters (such as the spinal implant), they deal fairly
large amounts of damage. Especially to powerful mobs like lavlaand
bosses.
balance: You naturally gain a small amount of athletics experience doing
some tasks, such as climbing rope, ladders and tables/crates, fireman
carrying, or smashing open boulders.
/🆑
This commit is contained in:
necromanceranne
2024-11-07 23:58:32 +11:00
committed by GitHub
parent 0bfead0df8
commit ab3cac746e
7 changed files with 63 additions and 16 deletions

View File

@@ -62,8 +62,19 @@
climbed_thing.add_fingerprint(user)
user.visible_message(span_warning("[user] starts climbing onto [climbed_thing]."), \
span_notice("You start climbing onto [climbed_thing]..."))
// Time in deciseoncds it takes to complete the climb do_after()
var/adjusted_climb_time = climb_time
// Time in deciseonds that the mob is stunned after climbing successfully.
var/adjusted_climb_stun = climb_stun
// Our climbers fitness level, which removes some climb time and speeds up our climbing do_after, assuming they worked out
var/fitness_level = user.mind?.get_skill_level(/datum/skill/athletics) - 1
adjusted_climb_time = clamp(adjusted_climb_time - fitness_level, 1, climb_time) //Here we adjust the number of deciseconds we shave off per level of fitness, with a minimum of 1 decisecond and a maximum of climb_time (just in case)
var/obj/item/organ/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE)
if(istype(potential_spine))
adjusted_climb_time *= potential_spine.athletics_boost_multiplier
adjusted_climb_stun *= potential_spine.athletics_boost_multiplier
if(HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) //climbing takes twice as long without help from the hands.
adjusted_climb_time *= 2
if(isalien(user))
@@ -88,6 +99,7 @@
if(istype(buckle_target))
if(buckle_target.is_buckle_possible(user))
buckle_target.buckle_mob(user)
user.mind?.adjust_experience(/datum/skill/athletics, 5) //Get a bit fitter with every climb.
else
to_chat(user, span_warning("You fail to climb onto [climbed_thing]."))
LAZYREMOVEASSOC(current_climbers, climbed_thing, user)

View File

@@ -68,6 +68,7 @@
if(do_after(user, final_climb_time, target))
user.forceMove(target)
uses--
user.mind?.adjust_experience(/datum/skill/athletics, 50) //get some experience for our trouble, especially since this costs us a climbing rope use
if(uses <= 0)
user.visible_message(span_warning("[src] snaps and tears apart!"))

View File

@@ -119,14 +119,14 @@
var/final_travel_time = (travel_time - fitness_level) * misc_multiplier
if(do_after(user, final_travel_time, target = src, interaction_key = DOAFTER_SOURCE_CLIMBING_LADDER))
travel(user, going_up)
travel(user, going_up, grant_exp = TRUE)
/// The message shown when the player starts climbing the ladder
/obj/structure/ladder/proc/show_initial_fluff_message(mob/user, going_up)
var/up_down = going_up ? "up" : "down"
user.balloon_alert_to_viewers("climbing [up_down]...")
/obj/structure/ladder/proc/travel(mob/user, going_up = TRUE, is_ghost = FALSE)
/obj/structure/ladder/proc/travel(mob/user, going_up = TRUE, is_ghost = FALSE, grant_exp = FALSE)
var/obj/structure/ladder/ladder = going_up ? up : down
if(!ladder)
balloon_alert(user, "there's nothing that way!")
@@ -138,6 +138,9 @@
var/turf/target = get_turf(ladder)
user.zMove(target = target, z_move_flags = ZMOVE_CHECK_PULLEDBY|ZMOVE_ALLOW_BUCKLED|ZMOVE_INCLUDE_PULLED)
if(grant_exp)
user.mind?.adjust_experience(/datum/skill/athletics, 10) //get a little experience for our trouble
if(!is_ghost)
show_final_fluff_message(user, ladder, going_up)

View File

@@ -9,7 +9,10 @@
icon_state = "ore"
icon = 'icons/obj/ore.dmi'
item_flags = NO_MAT_REDEMPTION | SLOWS_WHILE_IN_HAND
throw_range = 2
w_class = WEIGHT_CLASS_HUGE
throwforce = 30 // Under normal circumstances, pretty much nobody can throw this.
throw_range = 0
tk_throw_range = 1 // Sorry, this is too cheesy, but maybe you can smash down doors with it.
throw_speed = 0.5
slowdown = 1.5
drag_slowdown = 1.5 // It's still a big rock.
@@ -28,6 +31,7 @@
register_context()
AddComponent(/datum/component/two_handed, require_twohands = TRUE, force_unwielded = 0, force_wielded = 5) //Heavy as all hell, it's a boulder, dude.
AddComponent(/datum/component/sisyphus_awarder)
AddElement(/datum/element/bane, mob_biotypes = MOB_SPECIAL, added_damage = 20, requires_combat_mode = FALSE)
/obj/item/boulder/Destroy(force)
SSore_generation.available_boulders -= src
@@ -144,6 +148,7 @@
to_chat(user, span_notice("You finish working on \the [src], and it crumbles into ore."))
playsound(src, 'sound/effects/rock/rock_break.ogg', 50)
user.mind?.adjust_experience(/datum/skill/mining, MINING_SKILL_BOULDER_SIZE_XP * 0.2)
user.mind?.adjust_experience(/datum/skill/athletics, MINING_SKILL_BOULDER_SIZE_XP * 0.2)
qdel(src)
return
var/msg = (durability == 1 ? "is crumbling!" : "looks weaker!")

View File

@@ -170,6 +170,13 @@
if(start_T && end_T)
log_combat(src, thrown_thing, "thrown", addition="grab from tile in [AREACOORD(start_T)] towards tile at [AREACOORD(end_T)]")
var/power_throw = 0
var/extra_throw_range = HAS_TRAIT(src, TRAIT_THROWINGARM) ? 2 : 0
var/obj/item/organ/cyberimp/chest/spine/potential_spine = get_organ_slot(ORGAN_SLOT_SPINE)
if(istype(potential_spine))
power_throw += potential_spine.added_throw_speed
extra_throw_range += potential_spine.added_throw_range
if(HAS_TRAIT(src, TRAIT_HULK))
power_throw++
if(HAS_TRAIT(src, TRAIT_DWARF))
@@ -200,11 +207,6 @@
visible_message(span_danger("[src] [verb_text][plural_s(verb_text)] [thrown_thing][power_throw_text]"), \
span_danger("You [verb_text] [thrown_thing][power_throw_text]"))
log_message("has thrown [thrown_thing] [power_throw_text]", LOG_ATTACK)
var/extra_throw_range = HAS_TRAIT(src, TRAIT_THROWINGARM) ? 2 : 0
var/obj/item/organ/cyberimp/chest/spine/potential_spine = get_organ_slot(ORGAN_SLOT_SPINE)
if(istype(potential_spine))
extra_throw_range += potential_spine.added_throw_range
var/drift_force = max(0.5 NEWTONS, 1 NEWTONS + power_throw)
if (isitem(thrown_thing))

View File

@@ -935,10 +935,13 @@
var/carrydelay = 5 SECONDS //if you have latex you are faster at grabbing
var/skills_space
var/fitness_level = mind?.get_skill_level(/datum/skill/athletics) - 1
var/experience_reward = 5
if(HAS_TRAIT(src, TRAIT_QUICKER_CARRY))
carrydelay -= 2 SECONDS
experience_reward *= 3
else if(HAS_TRAIT(src, TRAIT_QUICK_CARRY))
carrydelay -= 1 SECONDS
experience_reward *= 2
// can remove up to 2 seconds at legendary
carrydelay -= fitness_level * (1/3) SECONDS
@@ -946,6 +949,7 @@
var/obj/item/organ/cyberimp/chest/spine/potential_spine = get_organ_slot(ORGAN_SLOT_SPINE)
if(istype(potential_spine))
carrydelay *= potential_spine.athletics_boost_multiplier
experience_reward += experience_reward * potential_spine.athletics_boost_multiplier
if(carrydelay <= 3 SECONDS)
skills_space = " very quickly"
@@ -963,6 +967,8 @@
visible_message(span_warning("[src] fails to fireman carry [target]!"))
return
mind?.adjust_experience(/datum/skill/athletics, experience_reward) //Get a bit fitter every time we fireman carry successfully. Deadlift your friends for gains!
return buckle_mob(target, TRUE, TRUE, CARRIER_NEEDS_ARM)
/mob/living/carbon/human/proc/piggyback(mob/living/carbon/target)

View File

@@ -265,8 +265,10 @@
slot = ORGAN_SLOT_SPINE
/// How much faster does the spinal implant improve our lifting speed, workout ability, reducing falling damage and improving climbing and standing speed
var/athletics_boost_multiplier = 0.8
/// How much additional throwing speed does our spinal implant grant us.
var/added_throw_speed = 1
/// How much additional throwing range does our spinal implant grant us.
var/added_throw_range = 2
var/added_throw_range = 4
/// How much additional boxing damage and tackling power do we add?
var/strength_bonus = 4
/// Whether or not a gravity anomaly core has been installed, improving the effectiveness of the spinal implant.
@@ -285,16 +287,20 @@
. = ..()
stone_overlay = mutable_appearance(icon = 'icons/effects/effects.dmi', icon_state = "stone")
organ_owner.add_overlay(stone_overlay)
add_organ_trait(TRAIT_BOULDER_BREAKER)
if(core_applied)
organ_owner.AddElement(/datum/element/forced_gravity, 1)
add_organ_trait(TRAIT_STURDY_FRAME)
/obj/item/organ/cyberimp/chest/spine/on_mob_remove(mob/living/carbon/organ_owner, special)
. = ..()
remove_organ_trait(TRAIT_BOULDER_BREAKER)
if(stone_overlay)
organ_owner.cut_overlay(stone_overlay)
stone_overlay = null
if(core_applied)
organ_owner.RemoveElement(/datum/element/forced_gravity, 1)
remove_organ_trait(TRAIT_STURDY_FRAME)
/obj/item/organ/cyberimp/chest/spine/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
. = ..()
@@ -304,14 +310,26 @@
if(istype(tool, /obj/item/assembly/signaler/anomaly/grav))
user.balloon_alert(user, "core installed.")
athletics_boost_multiplier = 0.25
added_throw_range += 2
strength_bonus += 4
name = /obj/item/organ/cyberimp/chest/spine/atlas::name
desc = /obj/item/organ/cyberimp/chest/spine/atlas::desc
athletics_boost_multiplier = /obj/item/organ/cyberimp/chest/spine/atlas::athletics_boost_multiplier
added_throw_range = /obj/item/organ/cyberimp/chest/spine/atlas::added_throw_range
added_throw_speed = /obj/item/organ/cyberimp/chest/spine/atlas::added_throw_speed
strength_bonus = /obj/item/organ/cyberimp/chest/spine/atlas::strength_bonus
core_applied = TRUE
name = "\improper Atlas gravitonic spinal implant"
desc = "This gravitronic spinal interface is able to improve the athletics of a user, allowing them greater physical ability. \
This one has been improved through the installation of a gravity anomaly core, allowing for personal gravity manipulation."
icon_state = "herculean_implant_core"
update_appearance()
qdel(tool)
return ITEM_INTERACT_SUCCESS
/obj/item/organ/cyberimp/chest/spine/atlas
name = "\improper Atlas gravitonic spinal implant"
desc = "This gravitronic spinal interface is able to improve the athletics of a user, allowing them greater physical ability. \
This one has been improved through the installation of a gravity anomaly core, allowing for personal gravity manipulation. \
Not only can you walk with your feet planted firmly on the ground even during a loss of enviromental gravity, but you also \
carry heavier loads with relative ease."
icon_state = "herculean_implant_core"
athletics_boost_multiplier = 0.25
added_throw_speed = 6
added_throw_range = 8
strength_bonus = 8
core_applied = TRUE