Merge pull request #8674 from uraniummeltdown/attacks

[READY] Attack Code Update
This commit is contained in:
tigercat2000
2018-03-22 11:55:53 -07:00
committed by GitHub
178 changed files with 2457 additions and 1949 deletions
@@ -24,7 +24,7 @@
for(var/datum/surgery/S in surgeries)
if(S.next_step(user, src))
return 1
..()
return ..()
/mob/living/carbon/attack_hand(mob/living/carbon/human/user)
if(!iscarbon(user))
@@ -228,6 +228,3 @@
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("<span class='danger'>[M] attempted to disarm [src]!</span>")
return
/mob/living/carbon/human/proc/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, inrange, params)
return
@@ -176,21 +176,22 @@ emp_act
return 1
//Returns 1 if the attack hit, 0 if it missed.
/mob/living/carbon/human/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone)
if(!I || !user) return 0
/mob/living/carbon/human/attacked_by(obj/item/I, mob/living/user, def_zone)
if(!I || !user)
return 0
if((istype(I, /obj/item/weapon/kitchen/knife/butcher/meatcleaver) || istype(I, /obj/item/weapon/twohanded/chainsaw)) && src.stat == DEAD && user.a_intent == INTENT_HARM)
var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new /obj/item/weapon/reagent_containers/food/snacks/meat/human(get_turf(src.loc))
newmeat.name = src.real_name + newmeat.name
newmeat.subjectname = src.real_name
newmeat.subjectjob = src.job
newmeat.reagents.add_reagent ("nutriment", (src.nutrition / 15) / 3)
src.reagents.trans_to (newmeat, round ((src.reagents.total_volume) / 3, 1))
if((istype(I, /obj/item/weapon/kitchen/knife/butcher/meatcleaver) || istype(I, /obj/item/weapon/twohanded/chainsaw)) && stat == DEAD && user.a_intent == INTENT_HARM)
var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new /obj/item/weapon/reagent_containers/food/snacks/meat/human(get_turf(loc))
newmeat.name = real_name + newmeat.name
newmeat.subjectname = real_name
newmeat.subjectjob = job
newmeat.reagents.add_reagent("nutriment", (nutrition / 15) / 3)
reagents.trans_to(newmeat, round((reagents.total_volume) / 3, 1))
add_mob_blood(src)
--src.meatleft
to_chat(user, "<span class='warning'>You hack off a chunk of meat from [src.name]</span>")
if(!src.meatleft)
src.create_attack_log("Was chopped up into meat by <b>[key_name(user)]</b>")
--meatleft
to_chat(user, "<span class='warning'>You hack off a chunk of meat from [name]</span>")
if(!meatleft)
create_attack_log("Was chopped up into meat by <b>[key_name(user)]</b>")
user.create_attack_log("Chopped up <b>[key_name(src)]</b> into meat</b>")
msg_admin_attack("[key_name_admin(user)] chopped up [key_name_admin(src)] into meat")
if(!iscarbon(user))
@@ -214,19 +215,18 @@ emp_act
if(istype(I,/obj/item/weapon/card/emag))
emag_act(user, affecting)
if(! I.discrete)
if(I.attack_verb.len)
visible_message("<span class='combat danger'>[src] has been [pick(I.attack_verb)] in the [hit_area] with [I.name] by [user]!</span>")
else
visible_message("<span class='combat danger'>[src] has been attacked in the [hit_area] with [I.name] by [user]!</span>")
send_item_attack_message(I, user, hit_area)
var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].", armour_penetration = I.armour_penetration)
if(!I.force)
return 0 //item force is zero
var/armor = run_armor_check(affecting, "melee", "<span class='warning'>Your armour has protected your [hit_area].</span>", "<span class='warning'>Your armour has softened hit to your [hit_area].</span>", armour_penetration = I.armour_penetration)
var/weapon_sharp = is_sharp(I)
if(weapon_sharp && prob(getarmor(user.zone_sel.selecting, "melee")))
weapon_sharp = 0
if(armor >= 100) return 0
if(!I.force) return 0
if(armor >= 100)
return 0
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)
apply_damage(I.force, I.damtype, affecting, armor, sharp = weapon_sharp, used_weapon = I)
@@ -234,8 +234,6 @@ emp_act
var/bloody = 0
if(I.damtype == BRUTE && I.force && prob(25 + I.force * 2))
I.add_mob_blood(src) //Make the weapon bloody, not the person.
// if(user.hand) user.update_inv_l_hand() //updates the attacker's overlay for the (now bloodied) weapon
// else user.update_inv_r_hand() //removed because weapons don't have on-mob blood overlays
if(prob(I.force * 2)) //blood spatter!
bloody = 1
var/turf/location = loc
+26 -36
View File
@@ -193,6 +193,12 @@
updatehealth()
return
/mob/living/carbon/slime/MouseDrop(atom/movable/A)
if(isliving(A) && A != usr)
var/mob/living/Food = A
if(Food.Adjacent(usr) && !stat && Food.stat != DEAD) //messy
Feedon(Food)
..()
/mob/living/carbon/slime/unEquip(obj/item/W as obj)
return
@@ -200,28 +206,25 @@
/mob/living/carbon/slime/attack_ui(slot)
return
/mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M as mob)
/mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M)
if(!ticker)
to_chat(M, "You cannot attack people before the game has started.")
return
if(Victim) return // can't attack while eating!
if(Victim)
return // can't attack while eating!
M.do_attack_animation(src)
visible_message("<span class='danger'>[M.name] has glomped [src]!</span>", \
"<span class='userdanger'>[M.name] has glomped [src]!</span>")
var/damage = rand(1, 3)
attacked += 5
if(M.is_adult)
damage = rand(1, 6)
else
damage = rand(1, 3)
if(health > -100)
M.do_attack_animation(src)
visible_message("<span class='danger'> The [M.name] has glomped [src]!</span>", \
"<span class='userdanger'> The [M.name] has glomped [src]!</span>")
var/damage = rand(1, 3)
attacked += 5
if(M.is_adult)
damage = rand(1, 6)
else
damage = rand(1, 3)
adjustBruteLoss(damage)
updatehealth()
return
@@ -327,20 +330,6 @@
if(S.next_step(M, src))
return 1
/*
if(M.gloves && istype(M.gloves,/obj/item/clothing/gloves))
var/obj/item/clothing/gloves/G = M.gloves
if(G.cell)
if(M.a_intent == "hurt")//Stungloves. Any contact will stun the alien.
if(G.cell.charge >= 2500)
G.cell.use(2500)
visible_message("<span class='warning'>[src] has been touched with the stun gloves by [M]!</span>")
return
else
to_chat(M, "<span class='warning'>Not enough charge! </span>")
return
*/
switch(M.a_intent)
if(INTENT_HELP)
@@ -373,9 +362,9 @@
playsound(loc, "punch", 25, 1, -1)
visible_message("<span class='danger'>[M] has punched [src]!</span>", \
"<span class='userdanger'>[M] has punched [src]!</span>")
adjustBruteLoss(damage)
updatehealth()
if(health > -100)
adjustBruteLoss(damage)
updatehealth()
else
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("<span class='danger'>[M] has attempted to punch [src]!</span>")
@@ -404,13 +393,14 @@
var/damage = rand(15, 30)
if(damage >= 25)
damage = rand(20, 40)
visible_message("<span class='danger'>[M] has attacked [name]!</span>", \
"<span class='userdanger'>[M] has attacked [name]!</span>")
visible_message("<span class='danger'>[M] has slashed [name]!</span>", \
"<span class='userdanger'>[M] has slashed [name]!</span>")
else
visible_message("<span class='danger'>[M] has wounded [name]!</span>", \
"<span class='userdanger'>)[M] has wounded [name]!</span>")
adjustBruteLoss(damage)
updatehealth()
if(health > -100)
adjustBruteLoss(damage)
updatehealth()
else
playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
visible_message("<span class='danger'>[M] has attempted to lunge at [name]!</span>", \
+4 -3
View File
@@ -983,11 +983,12 @@
return 0
/mob/living/proc/attempt_harvest(obj/item/I, mob/user)
if(stat == DEAD && !isnull(butcher_results)) //can we butcher it?
if(istype(I, /obj/item/weapon/kitchen/knife))
if(user.a_intent == INTENT_HARM && stat == DEAD && butcher_results) //can we butcher it?
var/sharpness = is_sharp(I)
if(sharpness)
to_chat(user, "<span class='notice'>You begin to butcher [src]...</span>")
playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1)
if(do_mob(user, src, 80))
if(do_mob(user, src, 80 / sharpness) && Adjacent(I))
harvest(user)
return 1
@@ -567,10 +567,7 @@ var/list/robot_verbs_default = list(
return 2
/mob/living/silicon/robot/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/restraints/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do
return
/mob/living/silicon/robot/attackby(obj/item/weapon/W, mob/user, params)
if(opened) // Are they trying to insert something?
for(var/V in components)
var/datum/robot_component/C = components[V]
@@ -610,6 +607,7 @@ var/list/robot_verbs_default = list(
else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == INTENT_HELP && (wiresexposed || istype(src,/mob/living/silicon/robot/drone)))
user.changeNext_move(CLICK_CD_MELEE)
if(!getFireLoss())
to_chat(user, "<span class='notice'>Nothing to fix!</span>")
return
@@ -744,9 +742,13 @@ var/list/robot_verbs_default = list(
to_chat(user, "<span class='danger'>Upgrade error.</span>")
else
spark_system.start()
return ..()
/mob/living/silicon/robot/attacked_by(obj/item/I, mob/living/user, def_zone)
if(I.force && I.damtype != STAMINA && stat != DEAD) //only sparks if real damage is dealt.
spark_system.start()
..()
/mob/living/silicon/robot/emag_act(user as mob)
if(!ishuman(user) && !issilicon(user))
return
@@ -8,7 +8,7 @@
health = 100
maxHealth = 100
damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
obj_damage = 60
environment_smash = 2 //Walls can't stop THE LAW
mob_size = MOB_SIZE_LARGE
@@ -221,8 +221,9 @@
update_controls()
return
/mob/living/simple_animal/bot/medbot/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
/mob/living/simple_animal/bot/medbot/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/reagent_containers/glass))
. = 1 //no afterattack
if(locked)
to_chat(user, "<span class='warning'>You cannot insert a beaker because the panel is locked!</span>")
return
@@ -236,7 +237,6 @@
reagent_glass = W
to_chat(user, "<span class='notice'>You insert [W].</span>")
show_controls(user)
return
else
var/current_health = health
@@ -100,6 +100,7 @@
health = 250
response_harm = "harmlessly punches"
harm_intent_damage = 0
obj_damage = 90
melee_damage_lower = 30
melee_damage_upper = 30
attacktext = "smashes their armoured gauntlet into"
@@ -189,6 +190,7 @@
health = 50
response_harm = "viciously beats"
harm_intent_damage = 5
obj_damage = 60
melee_damage_lower = 5
melee_damage_upper = 5
attacktext = "rams"
@@ -302,7 +304,7 @@
melee_damage_lower = 1
melee_damage_upper = 5
attacktext = "prods"
environment_smash = 3
environment_smash = ENVIRONMENT_SMASH_RWALLS
see_in_dark = 8
attack_sound = 'sound/weapons/tap.ogg'
const_type = "harvester"
@@ -9,7 +9,7 @@
health = 5
maxHealth = 5
attacktext = "bites"
attacktext = "bites"
obj_damage = 0
melee_damage_lower = 1
melee_damage_upper = 2
response_help = "pets"
@@ -14,6 +14,7 @@
maxHealth = 100
health = 100
harm_intent_damage = 5
obj_damage = 60
melee_damage_lower = 25
melee_damage_upper = 25
attacktext = "slashes"
@@ -145,6 +146,7 @@
melee_damage_upper = 0
a_intent = INTENT_HELP
friendly = "caresses"
obj_damage = 0
environment_smash = 0
icon_state = "maid"
icon_living = "maid"
@@ -20,6 +20,7 @@
stop_automated_movement_when_pulled = 0
maxHealth = 60
health = 60
obj_damage = 60
melee_damage_lower = 20
melee_damage_upper = 30
attacktext = "mauls"
@@ -29,6 +29,7 @@
health = 10
faction = list("hostile")
move_to_delay = 0
obj_damage = 0
environment_smash = 0
mouse_opacity = 2
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
@@ -18,6 +18,7 @@
health = 25
harm_intent_damage = 8
obj_damage = 50
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = "bites"
@@ -70,6 +71,6 @@
health = 65
pixel_x = -16
mob_size = MOB_SIZE_LARGE
obj_damage = 80
melee_damage_lower = 20
melee_damage_upper = 20
@@ -8,6 +8,7 @@
icon_dead = "otherthing-dead"
health = 80
maxHealth = 80
obj_damage = 100
melee_damage_lower = 25
melee_damage_upper = 50
attacktext = "chomps"
@@ -17,7 +17,7 @@
armour_penetration = 25
melee_damage_lower = 10
melee_damage_upper = 100
environment_smash = 3
environment_smash = ENVIRONMENT_SMASH_RWALLS
force_threshold = 15
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
@@ -12,7 +12,7 @@
speed = 0
maxHealth = 80
health = 80
obj_damage = 50
harm_intent_damage = 10
melee_damage_lower = 15
melee_damage_upper = 15
@@ -39,6 +39,7 @@
response_harm = "hits"
maxHealth = 200
health = 200
obj_damage = 60
melee_damage_lower = 15
melee_damage_upper = 20
heat_damage_per_tick = 20 //amount of damage applied if animal's body temperature is higher than maxbodytemp
@@ -16,6 +16,7 @@
faction = list("creature")
robust_searching = 1
stat_attack = 2
obj_damage = 0
environment_smash = 0
speak_emote = list("squeaks")
ventcrawler = 2
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile
faction = list("hostile")
stop_automated_movement_when_pulled = 0
obj_damage = 40
environment_smash = 1 //Set to 1 to break closets,tables,racks, etc; 2 for walls; 3 for rwalls
var/atom/target
var/ranged = 0
@@ -241,7 +242,7 @@
if(target.loc != null && get_dist(targets_from, target.loc) <= vision_range) //We can't see our target, but he's in our vision range still
if(ranged_ignores_vision && ranged_cooldown <= world.time) //we can't see our target... but we can fire at them!
OpenFire(target)
if(environment_smash >= 2) //If we're capable of smashing through walls, forget about vision completely after finding our target
if((environment_smash & ENVIRONMENT_SMASH_WALLS) || (environment_smash & ENVIRONMENT_SMASH_RWALLS)) //If we're capable of smashing through walls, forget about vision completely after finding our target
Goto(target,move_to_delay,minimum_distance)
FindHidden()
return 1
@@ -65,6 +65,7 @@
melee_damage_lower = 0
melee_damage_upper = 0
speed = -1
obj_damage = 0
environment_smash = 0
@@ -267,6 +267,7 @@ Difficulty: Medium
maxHealth = 200
health = 200
faction = list("neutral")
obj_damage = 80
melee_damage_upper = 30
melee_damage_lower = 30
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
@@ -7,7 +7,8 @@
maxHealth = 1000
a_intent = INTENT_HARM
sentience_type = SENTIENCE_BOSS
environment_smash = 3
environment_smash = ENVIRONMENT_SMASH_RWALLS
obj_damage = 400
luminosity = 3
faction = list("mining", "boss")
weather_immunities = list("lava","ash")
@@ -225,6 +225,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
/mob/living/simple_animal/hostile/mimic/copy/ranged/CopyObject(obj/O, mob/living/creator, destroy_original = 0)
if(..())
emote_see = list("aims menacingly")
obj_damage = 0
environment_smash = 0 //needed? seems weird for them to do so
ranged = 1
retreat_distance = 1 //just enough to shoot
@@ -17,6 +17,7 @@
maxHealth = 75
health = 75
harm_intent_damage = 5
obj_damage = 0
melee_damage_lower = 0
melee_damage_upper = 0
attacktext = "lashes out at"
@@ -4,6 +4,7 @@
unsuitable_atmos_damage = 15
faction = list("mining")
weather_immunities = list("lava","ash")
obj_damage = 30
environment_smash = 2
minbodytemp = 0
heat_damage_per_tick = 20
@@ -65,6 +66,7 @@
maxHealth = 200
health = 200
harm_intent_damage = 5
obj_damage = 60
melee_damage_lower = 12
melee_damage_upper = 12
attacktext = "bites into"
@@ -125,6 +127,7 @@
maxHealth = 300
health = 300
harm_intent_damage = 1 //Only the manliest of men can kill a Goliath with only their fists.
obj_damage = 100
melee_damage_lower = 25
melee_damage_upper = 25
attacktext = "pulverizes"
@@ -13,6 +13,7 @@
response_disarm = "gently pushes aside"
response_harm = "whacks"
harm_intent_damage = 5
obj_damage = 0
melee_damage_lower = 1
melee_damage_upper = 1
attack_same = 2
@@ -14,6 +14,7 @@
health = 100
harm_intent_damage = 5
obj_damage = 60
melee_damage_lower = 30
melee_damage_upper = 30
attacktext = "slashes"
@@ -22,6 +22,7 @@
melee_damage_upper = 10
attacktext = "attacks"
attack_sound = 'sound/items/bikehorn.ogg'
obj_damage = 0
environment_smash = 0
minbodytemp = 270
maxbodytemp = 370
@@ -19,6 +19,7 @@
healable = 0
harm_intent_damage = 35
obj_damage = 100
melee_damage_lower = 34
melee_damage_upper = 42
attacktext = "claws"
@@ -112,6 +112,7 @@
pass_flags = PASSTABLE
health = 15
maxHealth = 15
obj_damage = 0
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = "cuts"
@@ -24,7 +24,7 @@
move_to_delay = 4 // faster than normal
ventcrawler = 0
ai_ventcrawls = 0
environment_smash = 3
environment_smash = ENVIRONMENT_SMASH_RWALLS
loot = list(/obj/item/clothing/accessory/medal)
idle_ventcrawl_chance = 0
spider_tier = TS_TIER_3
@@ -25,7 +25,7 @@
spider_opens_doors = 2
ventcrawler = 0
ai_ventcrawls = 0
environment_smash = 3
environment_smash = ENVIRONMENT_SMASH_RWALLS
idle_ventcrawl_chance = 0 // stick to the queen!
var/dcheck_counter = 0
var/queen_visible = 1
@@ -232,7 +232,7 @@
hasnested = 1
ventcrawler = 0
ai_ventcrawls = 0
environment_smash = 3
environment_smash = ENVIRONMENT_SMASH_RWALLS
DoQueenScreech(8, 100, 8, 100)
MassFlicker()
to_chat(src, "<span class='notice'>You have matured to your egglaying stage. You can now smash through walls, and lay eggs, but can no longer ventcrawl.</span>")
@@ -54,6 +54,7 @@
maxHealth = 50
ranged = 1
harm_intent_damage = 5
obj_damage = 60
melee_damage_lower = 25
melee_damage_upper = 25
a_intent = INTENT_HARM
@@ -46,6 +46,7 @@
//LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly
var/melee_damage_lower = 0
var/melee_damage_upper = 0
var/obj_damage = 0 //how much damage this simple animal does to objects, if any
var/armour_penetration = 0 //How much armour they ignore, as a flat reduction from the targets armour value
var/melee_damage_type = BRUTE //Damage type of a simple mob's melee attack, should it do damage.
var/list/damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) // 1 for full damage , 0 for none , -1 for 1:1 heal from that source
@@ -276,9 +277,6 @@
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
attack_threshold_check(damage,M.melee_damage_type)
/mob/living/simple_animal/proc/attacked_by(obj/item/I, mob/living/user) // Handled in _onclick/click.dm
return
/mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj)
if(!Proj)
return
@@ -385,7 +383,7 @@
return
/mob/living/simple_animal/attackby(var/obj/item/O as obj, var/mob/living/user as mob) //Marker -Agouri
/mob/living/simple_animal/attackby(obj/item/O, mob/living/user)
if(can_collar && !collar && istype(O, /obj/item/clothing/accessory/petcollar))
var/obj/item/clothing/accessory/petcollar/C = O
user.drop_item()
@@ -399,33 +397,7 @@
real_name = C.tagname
return
else
user.changeNext_move(CLICK_CD_MELEE)
if(attempt_harvest(O, user))
return
user.do_attack_animation(src)
if(istype(O) && istype(user) && !O.attack(src, user))
var/damage = 0
if(O.force)
if(O.force >= force_threshold)
damage = O.force
if(O.damtype == STAMINA)
damage = 0
if(O.damtype == BRUTE)
if(prob(33))
O.add_mob_blood(src)
var/turf/location = get_turf(src)
add_splatter_floor(location)
if(get_dist(user, src) <= 1) //people with TK won't get smeared with blood
user.add_mob_blood(src)
visible_message("<span class='danger'>[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] [src] with [O]!</span>",\
"<span class='userdanger'>[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] you with [O]!</span>")
else
visible_message("<span class='danger'>[O] bounces harmlessly off of [src].</span>",\
"<span class='userdanger'>[O] bounces harmlessly off of [src].</span>")
else
user.visible_message("<span class='warning'>[user] gently taps [src] with [O].</span>",\
"<span class='warning'>This weapon is ineffective, it does no damage.</span>")
adjustBruteLoss(damage)
..()
/mob/living/simple_animal/movement_delay()
. = ..()