mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 10:12:45 +00:00
Adds a fairly simple system that allows adjusting various numbers like max health, incoming damage, outgoing melee damage, etc. The nice part is that changing certain variables this way (like max health) is a lot safer than manually setting the max health var directly. Changes a lot of short lines of code to point towards a variable's getter or setter helper instead of reading the var directly so the modifiers can work. Endoarmor, delayed toxin sting, Enfeebling sting, and recursive adrenaline overdose now use the modifier system. Enfeebling sting now only lasts two minutes, from five minutes, however it now also reduces the victim's melee damage by 25%/50%, and increases the damage they suffer by 10%/35%, for normal and recursive respectively. Delayed Toxin Sting's effects are now felt all at once instead of over the course of a few minutes.
94 lines
3.8 KiB
Plaintext
94 lines
3.8 KiB
Plaintext
/*
|
|
=== Item Click Call Sequences ===
|
|
These are the default click code call sequences used when clicking on stuff with an item.
|
|
|
|
Atoms:
|
|
|
|
mob/ClickOn() calls the item's resolve_attackby() proc.
|
|
item/resolve_attackby() calls the target atom's attackby() proc.
|
|
|
|
Mobs:
|
|
|
|
mob/living/attackby() after checking for surgery, calls the item's attack() proc.
|
|
item/attack() generates attack logs, sets click cooldown and calls the mob's attacked_with_item() proc. If you override this, consider whether you need to set a click cooldown, play attack animations, and generate logs yourself.
|
|
mob/attacked_with_item() should then do mob-type specific stuff (like determining hit/miss, handling shields, etc) and then possibly call the item's apply_hit_effect() proc to actually apply the effects of being hit.
|
|
|
|
Item Hit Effects:
|
|
|
|
item/apply_hit_effect() can be overriden to do whatever you want. However "standard" physical damage based weapons should make use of the target mob's hit_with_weapon() proc to
|
|
avoid code duplication. This includes items that may sometimes act as a standard weapon in addition to having other effects (e.g. stunbatons on harm intent).
|
|
*/
|
|
|
|
// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown.
|
|
/obj/item/proc/attack_self(mob/user)
|
|
return
|
|
|
|
//I would prefer to rename this to attack(), but that would involve touching hundreds of files.
|
|
/obj/item/proc/resolve_attackby(atom/A, mob/user)
|
|
add_fingerprint(user)
|
|
return A.attackby(src, user)
|
|
|
|
// No comment
|
|
/atom/proc/attackby(obj/item/W, mob/user)
|
|
return
|
|
|
|
/atom/movable/attackby(obj/item/W, mob/user)
|
|
if(!(W.flags & NOBLUDGEON))
|
|
visible_message("<span class='danger'>[src] has been hit by [user] with [W].</span>")
|
|
|
|
/mob/living/attackby(obj/item/I, mob/user)
|
|
if(!ismob(user))
|
|
return 0
|
|
if(can_operate(src) && I.do_surgery(src,user))
|
|
if(I.can_do_surgery(src,user))
|
|
return 1
|
|
else
|
|
return 0
|
|
return I.attack(src, user, user.zone_sel.selecting)
|
|
|
|
// Proximity_flag is 1 if this afterattack was called on something adjacent, in your square, or on your person.
|
|
// Click parameters is the params string from byond Click() code, see that documentation.
|
|
/obj/item/proc/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
|
return
|
|
|
|
//I would prefer to rename this attack_as_weapon(), but that would involve touching hundreds of files.
|
|
/obj/item/proc/attack(mob/living/M, mob/living/user, var/target_zone)
|
|
if(!force || (flags & NOBLUDGEON))
|
|
return 0
|
|
if(M == user && user.a_intent != I_HURT)
|
|
return 0
|
|
|
|
/////////////////////////
|
|
user.lastattacked = M
|
|
M.lastattacker = user
|
|
|
|
if(!no_attack_log)
|
|
user.attack_log += "\[[time_stamp()]\]<font color='red'> Attacked [M.name] ([M.ckey]) with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])</font>"
|
|
M.attack_log += "\[[time_stamp()]\]<font color='orange'> Attacked by [user.name] ([user.ckey]) with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])</font>"
|
|
msg_admin_attack("[key_name(user)] attacked [key_name(M)] with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])" )
|
|
/////////////////////////
|
|
|
|
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
|
user.do_attack_animation(M)
|
|
|
|
var/hit_zone = M.resolve_item_attack(src, user, target_zone)
|
|
if(hit_zone)
|
|
apply_hit_effect(M, user, hit_zone)
|
|
|
|
return 1
|
|
|
|
//Called when a weapon is used to make a successful melee attack on a mob. Returns the blocked result
|
|
/obj/item/proc/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
|
|
user.break_cloak()
|
|
if(hitsound)
|
|
playsound(loc, hitsound, 50, 1, -1)
|
|
|
|
var/power = force
|
|
for(var/datum/modifier/M in user.modifiers)
|
|
if(!isnull(M.outgoing_melee_damage_percent))
|
|
power *= M.outgoing_melee_damage_percent
|
|
if(HULK in user.mutations)
|
|
power *= 2
|
|
return target.hit_with_weapon(src, user, power, hit_zone)
|
|
|