Re-balances ant damage values & lets you pour ants on the floor (#60543)

One final change I wanted to make to ants was to rework their rather low damage values. While they by no means were ever intended to be a kill-chem, the fact that they only did 25 brute after being injected with 200u was just far too low.
To change this, I've reworked their damage formula, so now you do roughly 32 brute damage with 100u of ants. This scales significantly once you add more ants after that point.
This is still a rather low amount of damage for the amount of u it takes, so to balance that I made the chance for one to vomit out the ants also stun the user, however to balance that balance it will purge anywhere from 5-10u of ants upon doing so.
I have also changed how the debuff works somewhat. While it still does its normal damage over time, I have increased the damage done by the user scratching at themselves, which yielded an average of 100 brute when dumped with 200u ants during testing.
Finally, you can pour ants back onto the ground now, with the amount of ants being poured being directly proportional to the amount of damage they will do. You must pour more than 10 ants for it to appear, and the amount of ants will only change the maximum damage that the resulting caltrop will do, not the minimum damage. There is a hard-cap at a 10 damage maximum, with the minimum always being 0.5. The amount of damage this caltrop does is equal to `ant_volume * 0.2`
Finally to balance this a little more, breeding ants has gone from requiring 6u sugar to 8u sugar, making farming take a little longer.
This commit is contained in:
Wallem
2021-09-05 11:57:59 -04:00
committed by GitHub
parent c0e0cbb7a0
commit 23ef1c255a
10 changed files with 68 additions and 22 deletions
+1 -1
View File
@@ -1456,9 +1456,9 @@
/// Called on the organ when it is removed from someone (mob/living/carbon/old_owner)
#define COMSIG_ORGAN_REMOVED "comsig_organ_removed"
///Called when the ticker enters the pre-game phase
#define COMSIG_TICKER_ENTER_PREGAME "comsig_ticker_enter_pregame"
///Called when the ticker sets up the game for start
#define COMSIG_TICKER_ENTER_SETTING_UP "comsig_ticker_enter_setting_up"
+17
View File
@@ -24,6 +24,8 @@
COMSIG_ATOM_ENTERED = .proc/on_entered,
)
///So we can update ant damage
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
/datum/component/caltrop/Initialize(min_damage = 0, max_damage = 0, probability = 100, flags = NONE, soundfile = null)
. = ..()
@@ -41,6 +43,21 @@
else
RegisterSignal(get_turf(parent), COMSIG_ATOM_ENTERED, .proc/on_entered)
// Inherit the new values passed to the component
/datum/component/caltrop/InheritComponent(datum/component/caltrop/new_comp, original, min_damage, max_damage, probability, flags, soundfile)
if(!original)
return
if(min_damage)
src.min_damage = min_damage
if(max_damage)
src.max_damage = max_damage
if(probability)
src.probability = probability
if(flags)
src.flags = flags
if(soundfile)
src.soundfile = soundfile
/datum/component/caltrop/proc/on_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs)
SIGNAL_HANDLER
+2 -2
View File
@@ -23,12 +23,12 @@
/// Used for examining
var/examine_type = DECOMP_EXAM_NORMAL
/datum/component/decomposition/Initialize(mapload, decomp_flags = NONE)
/datum/component/decomposition/Initialize(mapload, decomp_req_handle, decomp_flags = NONE)
if(!isobj(parent))
return COMPONENT_INCOMPATIBLE
src.decomp_flags = decomp_flags
if(mapload)
if(mapload || decomp_req_handle)
handled = FALSE
RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/handle_movement)
+4 -4
View File
@@ -1018,20 +1018,20 @@
victim.say(pick("GET THEM OFF ME!!", "OH GOD THE ANTS!!", "MAKE IT END!!", "THEY'RE EVERYWHERE!!", "GET THEM OFF!!", "SOMEBODY HELP ME!!"), forced = /datum/status_effect/ants)
if(2)
victim.emote("scream")
if(prob(50))
if(prob(50)) // Most of the damage is done through random chance. When tested yielded an average 100 brute with 200u ants.
switch(rand(1,50))
if (1 to 8) //16% Chance
var/obj/item/bodypart/head/hed = victim.get_bodypart(BODY_ZONE_HEAD)
to_chat(victim, "<span class='danger'>You scratch at the ants on your scalp!.</span>")
hed.receive_damage(0.1,0)
hed.receive_damage(1,0)
if (9 to 29) //40% chance
var/obj/item/bodypart/arm = victim.get_bodypart(pick(BODY_ZONE_L_ARM,BODY_ZONE_R_ARM))
to_chat(victim, "<span class='danger'>You scratch at the ants on your arms!</span>")
arm.receive_damage(0.1,0)
arm.receive_damage(3,0)
if (30 to 49) //38% chance
var/obj/item/bodypart/leg = victim.get_bodypart(pick(BODY_ZONE_L_LEG,BODY_ZONE_R_LEG))
to_chat(victim, "<span class='danger'>You scratch at the ants on your leg!</span>")
leg.receive_damage(0.1,0)
leg.receive_damage(3,0)
if(50) // 2% chance
to_chat(victim, "<span class='danger'>You rub some ants away from your eyes!</span>")
victim.blur_eyes(3)
@@ -262,15 +262,28 @@
name = "space ants"
desc = "A small colony of space ants. They're normally used to the vacuum of space, so they can't climb too well."
icon = 'icons/obj/objects.dmi'
icon_state = "spaceants"
icon_state = "ants"
beauty = -150
layer = LOW_OBJ_LAYER
var/ant_bite_damage = 0.1
var/ant_volume
/obj/effect/decal/cleanable/ants/Initialize(mapload)
. = ..()
var/scale = (rand(6, 8) / 10) + (rand(2, 5) / 50)
transform = matrix(transform, scale, scale, MATRIX_SCALE)
setDir(pick(GLOB.cardinals))
reagents.add_reagent(/datum/reagent/ants, rand(2, 5))
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
AddComponent(/datum/component/caltrop, min_damage = 0.2, max_damage = 1, flags = (CALTROP_NOCRAWL | CALTROP_NOSTUN | CALTROP_BYPASS_SHOES), soundfile = 'sound/weapons/bite.ogg')
ant_volume = rand(3, 5)
reagents.add_reagent(/datum/reagent/ants, ant_volume)
update_ant_damage()
/obj/effect/decal/cleanable/ants/proc/update_ant_damage(spilled_ants)
ant_volume += spilled_ants
ant_bite_damage = min(10, round((ant_volume * 0.1),0.1)) // 100u ants = 10 max_damage
AddComponent(/datum/component/caltrop, min_damage = 0.1, max_damage = ant_bite_damage, flags = (CALTROP_NOCRAWL | CALTROP_NOSTUN | CALTROP_BYPASS_SHOES), soundfile = 'sound/weapons/bite.ogg')
switch(ant_bite_damage)
if(0 to 1)
icon_state = initial(icon_state)
if(1.1 to 4)
icon_state = "[initial(icon_state)]_2"
if(4.1 to 7)
icon_state = "[initial(icon_state)]_3"
if(7.1 to 10)
icon_state = "[initial(icon_state)]_4"
+4 -1
View File
@@ -40,6 +40,8 @@
var/venue_value
///Food that's immune to decomposition.
var/preserved_food = FALSE
///Food that needs to be picked up in order to decompose.
var/decomp_req_handle = FALSE
/obj/item/food/Initialize(mapload)
. = ..()
@@ -97,6 +99,7 @@
return
///This proc makes things decompose. Set preserved_food to TRUE to make it never decompose.
///Set decomp_req_handle to TRUE to only make it decompose when someone picks it up.
/obj/item/food/proc/MakeDecompose(mapload)
if(!preserved_food)
AddComponent(/datum/component/decomposition, mapload, decomp_flags = foodtypes)
AddComponent(/datum/component/decomposition, mapload, decomp_req_handle, decomp_flags = foodtypes)
@@ -202,6 +202,7 @@
food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 2)
foodtypes = GROSS | MEAT | RAW
grind_results = list(/datum/reagent/blood = 20, /datum/reagent/liquidgibs = 5)
decomp_req_handle = TRUE
/obj/item/food/deadmouse/Initialize()
. = ..()
@@ -2736,7 +2736,7 @@
var/amount_left = 0
/datum/reagent/ants/on_mob_life(mob/living/carbon/victim, delta_time)
victim.adjustBruteLoss(max(0.1, round((ant_damage * 0.005),0.1))) //Scales with time. Around 12.5 brute for 50 seconds.
victim.adjustBruteLoss(max(0.1, round((ant_damage * 0.025),0.1))) //Scales with time. Roughly 32 brute with 100u.
if(DT_PROB(5, delta_time))
if(DT_PROB(5, delta_time)) //Super rare statement
victim.say("AUGH NO NOT THE ANTS! NOT THE ANTS! AAAAUUGH THEY'RE IN MY EYES! MY EYES! AUUGH!!", forced = /datum/reagent/ants)
@@ -2744,9 +2744,9 @@
victim.say(pick("THEY'RE UNDER MY SKIN!!", "GET THEM OUT OF ME!!", "HOLY HELL THEY BURN!!", "MY GOD THEY'RE INSIDE ME!!", "GET THEM OUT!!"), forced = /datum/reagent/ants)
if(DT_PROB(15, delta_time))
victim.emote("scream")
if(DT_PROB(2, delta_time))
victim.vomit(rand(1, 2), stun = FALSE)
ant_damage += 1
if(DT_PROB(2, delta_time)) // Stuns, but purges ants.
victim.vomit(rand(5,10), FALSE, TRUE, 1, TRUE, FALSE, purge_ratio = 1)
ant_damage++
return ..()
/datum/reagent/ants/on_mob_end_metabolize(mob/living/living_anthill)
@@ -2762,6 +2762,18 @@
amount_left = round(reac_volume,0.1)
exposed_mob.apply_status_effect(STATUS_EFFECT_ANTS, amount_left)
/datum/reagent/ants/expose_turf(turf/exposed_turf, reac_volume)
. = ..()
if((reac_volume < 10) || isspaceturf(exposed_turf))
return
var/obj/effect/decal/cleanable/ants/pests = locate() in exposed_turf.contents
if(!pests)
pests = new(exposed_turf)
var/spilled_ants = (round(reac_volume,1) - 5) // To account for ant decals giving 3-5 ants on initialize.
pests.reagents.add_reagent(/datum/reagent/ants, spilled_ants)
pests.update_ant_damage(spilled_ants)
//This is intended to a be a scarce reagent to gate certain drugs and toxins with. Do not put in a synthesizer. Renewable sources of this reagent should be inefficient.
/datum/reagent/lead
name = "lead"
@@ -909,9 +909,9 @@
clear_products(holder, step_volume_added)
holder.my_atom.audible_message(span_notice("[icon2html(holder.my_atom, viewers(DEFAULT_MESSAGE_RANGE, src))] The reaction gives out a fizz, teleporting items everywhere!"))
/datum/chemical_reaction/ants
/datum/chemical_reaction/ants // Breeding ants together, high sugar cost makes this take a while to farm.
results = list(/datum/reagent/ants = 3)
required_reagents = list(/datum/reagent/ants = 2, /datum/reagent/consumable/sugar = 6)
required_reagents = list(/datum/reagent/ants = 2, /datum/reagent/consumable/sugar = 8)
//FermiChem vars:
optimal_ph_min = 3
optimal_ph_max = 12
Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 103 KiB