You kick me down but I bite back

Attacks

talons and magboots

missing icons, legcuff check

meme references, magboot stomping toned down

ops

f

remove magstomp from vox magboots

p

do indows properly

hotkeys, cl

vox can bite silicon

Fix inconsistencies and typos
This commit is contained in:
unid15
2016-02-19 19:24:09 +01:00
parent 8a08f174da
commit 2b060d322c
44 changed files with 605 additions and 85 deletions

View File

@@ -63,6 +63,7 @@
#define ui_dropbutton "EAST-4:22,SOUTH:5"
#define ui_drop_throw "EAST-1:28,SOUTH+1:7"
#define ui_pull_resist "EAST-2:26,SOUTH+1:7"
#define ui_kick_bite "EAST-3:24,SOUTH+1:7"
#define ui_acti "EAST-2:26,SOUTH:5"
#define ui_movi "EAST-3:24,SOUTH:5"
#define ui_zonesel "EAST-1:28,SOUTH:5"

View File

@@ -341,6 +341,22 @@
mymob.throw_icon.alpha = ui_alpha
src.hotkeybuttons += mymob.throw_icon
mymob.kick_icon = getFromPool(/obj/screen)
mymob.kick_icon.name = "kick"
mymob.kick_icon.icon = ui_style
mymob.kick_icon.icon_state = "act_kick"
mymob.kick_icon.screen_loc = ui_kick_bite
mymob.kick_icon.color = ui_color
mymob.kick_icon.alpha = ui_alpha
mymob.bite_icon = getFromPool(/obj/screen)
mymob.bite_icon.name = "bite"
mymob.bite_icon.icon = ui_style
mymob.bite_icon.icon_state = "act_bite"
mymob.bite_icon.screen_loc = ui_kick_bite
mymob.bite_icon.color = ui_color
mymob.bite_icon.alpha = ui_alpha
mymob.oxygen = getFromPool(/obj/screen)
mymob.oxygen.icon = ui_style
mymob.oxygen.icon_state = "oxy0"
@@ -451,7 +467,7 @@
mymob.client.reset_screen()
mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.damageoverlay, mymob.gun_setting_icon) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach )
mymob.client.screen += list( mymob.throw_icon, mymob.kick_icon, mymob.bite_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.damageoverlay, mymob.gun_setting_icon) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach )
mymob.client.screen += src.adding + src.hotkeybuttons
inventory_shown = 0;

View File

@@ -444,6 +444,26 @@
if("throw")
if(!usr.stat && isturf(usr.loc) && !usr.restrained())
usr:toggle_throw_mode()
if("kick")
if(ishuman(usr))
var/mob/living/carbon/human/H = usr
var/list/modifiers = params2list(params)
if(modifiers["middle"] || modifiers["right"] || modifiers["ctrl"] || modifiers["shift"] || modifiers["alt"])
H.set_attack_type() //Reset
else
H.set_attack_type(ATTACK_KICK)
if("bite")
if(ishuman(usr))
var/mob/living/carbon/human/H = usr
var/list/modifiers = params2list(params)
if(modifiers["middle"] || modifiers["right"] || modifiers["ctrl"] || modifiers["shift"] || modifiers["alt"])
H.set_attack_type() //Reset
else
H.set_attack_type(ATTACK_BITE)
if("drop")
usr.drop_item_v()

View File

@@ -10,11 +10,32 @@
// Special glove functions:
// If the gloves do anything, have them return 1 to stop
// normal attack_hand() here.
if(ismob(A))
delayNextAttack(10)
if(proximity && istype(G) && G.Touch(A, src, 1))
return
if(a_intent == "hurt" && A.loc != src)
switch(attack_type) //Special attacks - kicks, bites
if(ATTACK_KICK)
if(can_kick())
delayNextAttack(10)
A.kick_act(src)
return
else
set_attack_type() //Reset attack type
return
if(ATTACK_BITE)
if(can_bite())
delayNextAttack(10)
A.bite_act(src)
return
else
set_attack_type() //Reset attack type
return
if(ismob(A))
delayNextAttack(10)
if(src.can_use_hand())
A.attack_hand(src, params)
else

View File

@@ -220,6 +220,12 @@ var/global/list/ghdel_profiling = list()
/atom/proc/emp_act(var/severity)
return
/atom/proc/kick_act(mob/living/carbon/human/user) //Kicked
return
/atom/proc/bite_act(mob/living/carbon/human/user) //Bitten
return
/atom/proc/singuloCanEat()
return 1

View File

@@ -371,7 +371,10 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
src.attack_log += text("\[[time_stamp()]\] <font color='red'>Bit [H.name] ([H.ckey]) in the neck and draining their blood</font>")
H.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been bit in the neck by [src.name] ([src.ckey])</font>")
log_attack("[src.name] ([src.ckey]) bit [H.name] ([H.ckey]) in the neck")
src.visible_message("<span class='danger'>[src.name] bites [H.name]'s neck!</span>", "<span class='danger'>You bite [H.name]'s neck and begin to drain their blood.</span>", "<span class='notice'>You hear a soft puncture and a wet sucking noise.</span>")
to_chat(src, "<span class='danger'>You latch on firmly to \the [H]'s neck.</span>")
to_chat(H, "<span class='userdanger'>\The [src] latches on to your neck!</span>")
if(!iscarbon(src))
H.LAssailant = null
else

View File

@@ -468,3 +468,9 @@ var/list/camera_names=list()
/obj/machinery/camera/arena/attack_pai(mob/user as mob)
return
/obj/machinery/camera/kick_act(mob/living/carbon/human/H)
to_chat(H, "<span class='info'>You attempt to kick \the [src].</span>")
to_chat(H, "<span class='notice'>Dumb move! You strain a muscle.</span>")
H.apply_damage(rand(1,2), BRUTE, pick("r_leg", "l_leg", "r_foot", "l_foot"))

View File

@@ -303,3 +303,15 @@
A = new
export_game_data(A)
..(toggleitem, user, A)
/obj/machinery/computer/arcade/kick_act()
..()
if(!emagged && prob(5)) //Bug
temp = "|eW R0vnb##[rand(0,9)]#"
player_hp = rand(1,30)
player_mp = rand(1,10)
enemy_hp = rand(1,60)
enemy_mp = rand(1,40)
gameover = 0
turtle = 0

View File

@@ -704,3 +704,10 @@ Class Procs:
W.play_rped_sound()
return 1
return 0
/obj/machinery/kick_act(mob/living/carbon/human/H)
playsound(get_turf(src), 'sound/effects/grillehit.ogg', 50, 1) //Zth: I couldn't find a proper sound, please replace it
H.visible_message("<span class='danger'>[H] kicks \the [src].</span>", "<span class='danger'>You kick \the [src].</span>")
if(prob(70))
H.apply_damage(rand(2,4), BRUTE, pick("r_leg", "l_leg", "r_foot", "l_foot"))

View File

@@ -551,33 +551,33 @@ var/global/num_vending_terminals = 1
else
src.icon_state = "[initial(icon_state)]"
/obj/machinery/vending/attack_hand(mob/living/user as mob)
if(user.a_intent == "hurt" && istype(user, /mob/living/carbon/)) //Will make another update later. Hulks will insta-break
user.delayNextAttack(10)
playsound(get_turf(src), 'sound/effects/grillehit.ogg', 50, 1) //Zth: I couldn't find a proper sound, please replace it
src.shake(1, 3) //1 means x movement, 3 means intensity
src.health -= 4
if (!Adjacent(user) && (M_TK in usr.mutations))
to_chat(user, "<span class='danger'>You slam the [src] with your mind.</span>")
src.visible_message("<span class='danger'>[src] dents slightly as if struck.</span>")
else
user.visible_message( "<span class='danger'>[user] kicks the [src].</span>", "<span class='danger'>You kick the [src].</span>")
if(prob(70))
user.apply_damage(rand(2,4), BRUTE, "r_leg")
if(src.health <= 0)
stat |= BROKEN
src.update_vicon()
return
if(prob(2)) //Jackpot!
malfunction()
if(prob(2))
src.TurnOff(600) //A whole minute
/*if(prob(1))
to_chat(usr, "<span class='warning'>You fall down and break your leg!</span>")
user.emote("scream",,, 1)
shake_camera(user, 2, 1)*/
/obj/machinery/vending/proc/damaged()
src.shake(1, 3) //1 means x movement, 3 means intensity
src.health -= 4
if(src.health <= 0)
stat |= BROKEN
src.update_vicon()
return
if(prob(2)) //Jackpot!
malfunction()
if(prob(2))
src.TurnOff(600) //A whole minute
/*if(prob(1))
to_chat(usr, "<span class='warning'>You fall down and break your leg!</span>")
user.emote("scream",,, 1)
shake_camera(user, 2, 1)*/
/obj/machinery/vending/kick_act(mob/living/carbon/human/user)
..()
damaged()
/obj/machinery/vending/attack_hand(mob/living/user as mob)
if(M_TK in user.mutations && user.a_intent == "hurt" && iscarbon(user))
if(!Adjacent(user))
to_chat(user, "<span class='danger'>You slam the [src] with your mind!</span>")
visible_message("<span class='danger'>[src] dents slightly, as if it was struck!</span>")
damaged()
if(stat & (BROKEN|NOPOWER))
return

View File

@@ -926,6 +926,11 @@ steam.start() -- spawns the effect
to_chat(user, "<span class='notice'>You hit the metal foam but bounce off it.</span>")
return
/obj/structure/foamedmetal/kick_act()
..()
if(prob(75 - metal*25))
qdel(src)
/obj/structure/foamedmetal/attackby(var/obj/item/I, var/mob/user)
user.delayNextAttack(10)

View File

@@ -869,3 +869,23 @@ var/global/list/image/blood_overlays = list()
//Gets the rating of the item, used in stuff like machine construction.
/obj/item/proc/get_rating()
return 0
/obj/item/kick_act(mob/living/carbon/human/H) //Kick items around!
if(anchored || w_class > 3)
H.visible_message("<span class='danger'>[H] attempts to kick \the [src]!</span>", "<span class='danger'>You attempt to kick \the [src]!</span>")
if(prob(70))
to_chat(H, "Dumb move! You strain a muscle.")
H.apply_damage(rand(1,4), BRUTE, pick("r_leg", "l_leg", "r_foot", "l_foot"))
return
if(!isturf(loc)) return
var/turf/T = get_edge_target_turf(loc, get_dir(H, src))
var/kick_power = (10 - (w_class ** 2)) * H.get_strength()
H.visible_message("<span class='danger'>[H] kicks \the [src]!</span>", "<span class='danger'>You kick \the [src]!</span>")
throw_at(T, kick_power, 1)
Crossed(H) //So you can't kick shards while naked without suffering

View File

@@ -20,3 +20,10 @@ obj/structure/ex_act(severity)
/obj/structure/projectile_check()
return PROJREACT_OBJS
/obj/structure/kick_act(mob/living/carbon/human/H)
playsound(get_turf(src), 'sound/effects/grillehit.ogg', 50, 1) //Zth: I couldn't find a proper sound, please replace it
H.visible_message("<span class='danger'>[H] kicks \the [src].</span>", "<span class='danger'>You kick \the [src].</span>")
if(prob(70))
H.apply_damage(rand(2,4), BRUTE, pick("r_leg", "l_leg", "r_foot", "l_foot"))

View File

@@ -138,3 +138,7 @@
return
user.visible_message("<span class='danger'>[user] smashes [src]!</span>")
shatter()
/obj/structure/mirror/kick_act()
..()
shatter()

View File

@@ -111,7 +111,8 @@
to_chat(user, "You carefully place \the [I] into the cistern.")
return
/obj/structure/toilet/bite_act(mob/user)
user.simple_message("<span class='notice'>That would be disgusting.</span>", "<span class='info'>You're not high enough for that... Yet.</span>") //Second message 4 hallucinations
/obj/structure/urinal
name = "urinal"
@@ -135,6 +136,9 @@
else
to_chat(user, "<span class='notice'>You need a tighter grip.</span>")
/obj/structure/urinal/bite_act(mob/user)
user.simple_message("<span class='notice'>That would be disgusting.</span>", "<span class='info'>You're not high enough for that... Yet.</span>") //Second message 4 hallucinations
/obj/machinery/shower
name = "shower"
desc = "The HS-451. Installed in the 2550s by the Nanotrasen Hygiene Division."

View File

@@ -129,6 +129,15 @@
health -= rand(30, 50)
healthcheck()
/obj/structure/window/kick_act(mob/living/carbon/human/H)
playsound(get_turf(src), 'sound/effects/glassknock.ogg', 100, 1)
H.visible_message("<span class='danger'>\The [H] kicks \the [src].</span>", \
"<span class='danger'>You kick \the [src].</span>")
health -= (rand(1,7)) * H.get_strength()
healthcheck()
/obj/structure/window/CheckExit(var/atom/movable/O, var/turf/target)
if(istype(O) && O.checkpass(PASSGLASS))

View File

@@ -364,3 +364,11 @@
if(current_size == STAGE_FOUR)
if(prob(30))
dismantle_wall()
/turf/simulated/wall/kick_act(mob/living/carbon/human/H)
H.visible_message("<span class='danger'>[H] kicks \the [src]!</span>", "<span class='danger'>You kick \the [src]!</span>")
if(prob(70))
to_chat(H, "<span class='userdanger'>Ouch! That hurts!</span>")
H.apply_damage(rand(5,7), BRUTE, pick("r_leg", "l_leg", "r_foot", "l_foot"))

View File

@@ -208,8 +208,11 @@ BLIND // can't see anything
icon = 'icons/obj/clothing/shoes.dmi'
desc = "Comfortable-looking shoes."
gender = PLURAL //Carn: for grammarically correct text-parsing
var/chained = 0
var/chaintype = null // Type of chain.
var/bonus_kick_damage = 0
siemens_coefficient = 0.9
body_parts_covered = FEET
slot_flags = SLOT_FEET
@@ -218,6 +221,9 @@ BLIND // can't see anything
slowdown = SHOES_SLOWDOWN
species_restricted = list("exclude","Unathi","Tajaran","Muton")
/obj/item/clothing/shoes/proc/on_kick(mob/living/user, mob/living/victim)
return
/obj/item/clothing/shoes/clean_blood()
..()
track_blood = 0

View File

@@ -8,6 +8,7 @@
gas_transfer_coefficient = 0.90
species_fit = list("Vox")
origin_tech = "biotech=2"
body_parts_covered = MOUTH
//Monkeys can not take the muzzle off of themself! Call PETA!
/obj/item/clothing/mask/muzzle/attack_paw(mob/user as mob)

View File

@@ -9,6 +9,34 @@
action_button_name = "Toggle Magboots"
species_fit = list("Vox")
var/stomp_attack_power = 20
/obj/item/clothing/shoes/magboots/on_kick(mob/living/carbon/human/user, mob/living/victim)
if(!stomp_attack_power) return
var/turf/T = get_turf(src)
if(magpulse && victim.lying && T == victim.loc && !istype(T, /turf/space)) //To stomp on somebody, you have to be on the same tile as them. You can't be in space, and they have to be lying
//NUCLEAR MAGBOOT STUMP INCOMING (it takes 3 seconds)
user.visible_message("<span class='danger'>\The [user] slowly raises his foot above the lying [victim.name], preparing to stomp on \him.</span>")
toggle()
if(do_after(user, src, 3 SECONDS))
if(magpulse) return //Magboots enabled
if(!victim.lying || (victim.loc != T)) return //Victim moved
if(locate(/obj/structure/table) in T) //Can't curbstomp on a table
to_chat(user, "<span class='info'>There is a table in the way!</span>")
return
victim.visible_message("<span class='danger'>\The [user] crushes \the [victim] with the activated [src.name]!", "<span class='userdanger'>\The [user] crushes you with \his [src.name]!</span>")
victim.adjustBruteLoss(stomp_attack_power)
playsound(get_turf(victim), 'sound/effects/gib3.ogg', 100, 1)
else
return
toggle()
playsound(get_turf(victim), 'sound/mecha/mechstep.ogg', 100, 1)
/obj/item/clothing/shoes/magboots/verb/toggle()
set name = "Toggle Magboots"
set category = "Object"

View File

@@ -70,6 +70,7 @@
species_fit = list("Vox")
siemens_coefficient = 0.6
heat_conductivity = INS_SHOE_HEAT_CONDUCTIVITY
bonus_kick_damage = 3
/obj/item/clothing/shoes/combat //Basically SWAT shoes combined with galoshes.
name = "combat boots"
@@ -81,6 +82,7 @@
siemens_coefficient = 0.6
max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE
heat_conductivity = INS_SHOE_HEAT_CONDUCTIVITY
bonus_kick_damage = 3
/obj/item/clothing/shoes/sandal
desc = "A pair of rather plain, wooden sandals."
@@ -232,6 +234,7 @@
siemens_coefficient = 0.7
species_fit = list("Vox")
heat_conductivity = INS_SHOE_HEAT_CONDUCTIVITY
bonus_kick_damage = 3
/obj/item/clothing/shoes/jackboots/batmanboots
name = "batboots"

View File

@@ -127,6 +127,8 @@
icon_state = "boots-vox"
species_restricted = list("Vox")
stomp_attack_power = 0
/obj/item/clothing/shoes/magboots/vox/toggle()
//set name = "Toggle Floor Grip"
if(usr.isUnconscious())

View File

@@ -1641,3 +1641,56 @@
/mob/living/carbon/human/proc/make_all_robot_parts_organic()
make_robot_limbs_organic()
make_robot_internals_organic()
/mob/living/carbon/human/proc/set_attack_type(new_type = NORMAL_ATTACK)
kick_icon.icon_state = "act_kick"
bite_icon.icon_state = "act_bite"
if(attack_type == new_type)
attack_type = NORMAL_ATTACK
return
attack_type = new_type
switch(attack_type)
if(NORMAL_ATTACK)
if(ATTACK_KICK)
kick_icon.icon_state = "act_kick_on"
if(ATTACK_BITE)
bite_icon.icon_state = "act_bite_on"
/mob/living/carbon/human/proc/can_kick()
//Need two feet to kick!
if(legcuffed)
return 0
var/datum/organ/external/left_foot = get_organ("l_foot")
if(!left_foot)
return 0
else if(left_foot.status & ORGAN_DESTROYED)
return 0
var/datum/organ/external/right_foot = get_organ("r_foot")
if(!right_foot)
return 0
else if(right_foot.status & ORGAN_DESTROYED)
return 0
return 1
/mob/living/carbon/human/proc/can_bite()
//Need at least two teeth or a beak to bite
if(check_body_part_coverage(MOUTH))
if(!isvampire(src)) //Vampires can bite through masks
return 0
if(M_BEAK in mutations)
return 1
var/datum/butchering_product/teeth/T = locate(/datum/butchering_product/teeth) in src.butchering_drops
if(T && T.amount >= 2)
return 1
return 0

View File

@@ -1,3 +1,132 @@
//BITES
/mob/living/carbon/human/bite_act(mob/living/carbon/human/M as mob)
if(M == src)
return //Can't bite yourself
//Vampire code
if(M.zone_sel && M.zone_sel.selecting == "head" && src != M)
if(M.mind && isvampire(M) && !M.mind.vampire.draining)
if(src.check_body_part_coverage(MOUTH))
to_chat(M, "<span class='warning'>Remove their mask!</span>")
return 0
if(M.check_body_part_coverage(MOUTH))
if(M.species.breath_type == "oxygen")
to_chat(M, "<span class='warning'>Remove your mask!</span>")
return 0
else
to_chat(M, "<span class='notice'>With practiced ease, you shift aside your mask for each gulp of blood.</span>")
if(mind && mind.vampire && (mind in ticker.mode.vampires))
to_chat(M, "<span class='warning'>Your fangs fail to pierce [src.name]'s cold flesh.</span>")
return 0
//we're good to suck the blood, blaah
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
src.visible_message("<span class='danger'>\The [M] has bitten \the [src]!</span>", "<span class='userdanger'>You were bitten by \the [M]!</span>")
M.handle_bloodsucking(src)
return
//end vampire codes
var/armor_modifier = 30
var/damage = rand(1, 7)
if(M_BEAK in M.mutations) //Beaks = stronger bites
armor_modifier = 5
damage += 4
var/datum/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
var/armorblock = run_armor_check(affecting, modifier = armor_modifier) //Bites are easy to stop, hence the modifier value
switch(armorblock)
if(1) //Partial block
damage = max(0, damage - 3)
if(2) //Full block
damage = 0
if(!damage)
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("<span class='danger'>\The [M] has attempted to bite \the [src]!</span>")
return 0
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
src.visible_message("<span class='danger'>\The [M] has bitten \the [src]!</span>", "<span class='userdanger'>You were bitten by \the [M]!</span>")
for(var/datum/disease/D in M.viruses)
if(D.spread == "Bite")
contract_disease(D,1,0)
apply_damage(damage, BRUTE, affecting)
M.attack_log += text("\[[time_stamp()]\] <font color='red'>bit [src.name] ([src.ckey]) for [damage] damage</font>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been bitten by [M.name] ([M.ckey]) for [damage] damage</font>")
if(!iscarbon(M))
LAssailant = null
else
LAssailant = M
log_attack("[M.name] ([M.ckey]) bitten by [src.name] ([src.ckey])")
return
//KICKS
/mob/living/carbon/human/kick_act(mob/living/carbon/human/M)
M.delayNextAttack(20) //Kicks are slow
if((src == M) || ((M_CLUMSY in M.mutations) && prob(20))) //Kicking yourself (or being clumsy) = stun
M.visible_message("<span class='notice'>\The [M] tripped while attempting to kick \the [src]!</span>", "<span class='userdanger'>While attempting to kick \the [src], you tripped and fell!</span>")
M.Weaken(rand(1,10))
return
var/stomping = 0
if(lying && (M.size >= size)) //On the ground, the kicker is bigger than/equal size of the victim = stomp
stomping = 1
var/armor_modifier = 1
var/damage = rand(0,9)
if(stomping) //Stomps = more damage and armor bypassing
armor_modifier = 0.5
damage += rand(0,9)
if(!damage)
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("<span class='danger'>\The [M] has attempted to kick \the [src]!</span>")
return 0
//Handle shoes
var/obj/item/clothing/shoes/S = M.shoes
if(istype(S))
damage += S.bonus_kick_damage
S.on_kick(M, src)
else if(M_TALONS in M.mutations) //Not wearing shoes and having talons = bonus 1-6 damage
damage += rand(1,6)
playsound(loc, "punch", 30, 1, -1)
if(stomping)
visible_message("<span class='danger'>\The [M] has stomped on \the [src]!</span>", "<span class='userdanger'>\The [M] stomps on you!</span>")
else
visible_message("<span class='danger'>\The [M] has kicked \the [src]!</span>", "<span class='userdanger'>\The [M] kicks you!</span>")
if(M.size != size) //The bigger the kicker, the more damage
damage = max(damage + (rand(1,5) * (1 + M.size - size)), 0)
var/datum/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
var/armorblock = run_armor_check(affecting, modifier = armor_modifier) //Bites are easy to stop, hence the modifier value
switch(armorblock)
if(1) //Partial block
damage = max(0, damage - rand(1,5))
if(2) //Full block
damage = max(0, damage - rand(1,10))
apply_damage(damage, BRUTE, affecting)
M.attack_log += text("\[[time_stamp()]\] <font color='red'>[stomping ? "stomped on" : "kicked"] [src.name] ([src.ckey]) for [damage] damage</font>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been [stomping ? "stomped on" : "kicked"] by [M.name] ([M.ckey]) for [damage] damage</font>")
if(!iscarbon(M))
LAssailant = null
else
LAssailant = M
log_attack("[M.name] ([M.ckey]) bitten by [src.name] ([src.ckey])")
/mob/living/carbon/human/attack_hand(mob/living/carbon/human/M as mob)
//M.delayNextAttack(10)
if (istype(loc, /turf) && istype(loc.loc, /area/start))
@@ -116,53 +245,6 @@
return 1
if(I_HURT)
//Vampire code
if(M.zone_sel && M.zone_sel.selecting == "head" && src != M)
if(M.mind && M.mind.vampire && (M.mind in ticker.mode.vampires) && !M.mind.vampire.draining)
if(src.check_body_part_coverage(MOUTH))
to_chat(M, "<span class='warning'>Remove their mask!</span>")
return 0
if(M.check_body_part_coverage(MOUTH))
if(M.species.breath_type == "oxygen")
to_chat(M, "<span class='warning'>Remove your mask!</span>")
return 0
else
to_chat(M, "<span class='notice'>With practiced ease, you shift aside your mask for each gulp of blood.</span>")
if(mind && mind.vampire && (mind in ticker.mode.vampires))
to_chat(M, "<span class='warning'>Your fangs fail to pierce [src.name]'s cold flesh.</span>")
return 0
//we're good to suck the blood, blaah
M.handle_bloodsucking(src)
return
//end vampire codes
// BITING
var/can_bite = 0
for(var/datum/disease/D in M.viruses)
if(D.spread == "Bite")
can_bite = 1
break
if(can_bite)
if ((prob(75) && health > 0))
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
src.visible_message("<span class='danger'>[M.name] has bit [name]!</span>")
var/damage = rand(1, 5)
adjustBruteLoss(damage)
health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
for(var/datum/disease/D in M.viruses)
if(D.spread == "Bite")
contract_disease(D,1,0)
M.attack_log += text("\[[time_stamp()]\] <font color='red'>bitten by [src.name] ([src.ckey])</font>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been bitten by [M.name] ([M.ckey])</font>")
if(!iscarbon(M))
LAssailant = null
else
LAssailant = M
log_attack("[M.name] ([M.ckey]) bitten by [src.name] ([src.ckey])")
return
//end biting
M.attack_log += text("\[[time_stamp()]\] <font color='red'>[M.species.attack_verb]ed [src.name] ([src.ckey])</font>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been [M.species.attack_verb]ed by [M.name] ([M.ckey])</font>")
if(!iscarbon(M))

View File

@@ -263,8 +263,9 @@ emp_act
if(!istype(T) || T.amount == 0) return
var/amount = rand(1,3)
if(L && M_HULK in L.mutations) //just like the mountain
amount += 8
if(user)
if(M_HULK in L.mutations) //just like the mountain
amount += 8
var/obj/item/stack/teeth/teeth = T.spawn_result(get_turf(src), src, amount)

View File

@@ -46,6 +46,9 @@
var/obj/item/l_ear = null
var/obj/item/r_ear = null
//Special attacks (bite, kicks, ...)
var/attack_type = NORMAL_ATTACK
var/used_skillpoints = 0
var/skill_specialization = null
var/list/skills = null

View File

@@ -474,7 +474,7 @@ var/global/list/whitelisted_species = list("Human")
eyes = "vox_eyes_s"
breath_type = "nitrogen"
default_mutations = list(M_BEAK)
default_mutations = list(M_BEAK, M_TALONS)
flags = IS_WHITELISTED | NO_SCAN
blood_color = "#2299FC"

View File

@@ -10,13 +10,15 @@
1 - halfblock
2 - fullblock
*/
/mob/living/proc/run_armor_check(var/def_zone = null, var/attack_flag = "melee", var/absorb_text = null, var/soften_text = null)
/mob/living/proc/run_armor_check(var/def_zone = null, var/attack_flag = "melee", var/absorb_text = null, var/soften_text = null, modifier = 1)
var/armor = getarmor(def_zone, attack_flag)
var/absorb = 0
if(prob(armor))
if(prob(armor * modifier))
absorb += 1
if(prob(armor))
if(prob(armor * modifier))
absorb += 1
if(absorb >= 2)
if(absorb_text)
show_message("[absorb_text]")
@@ -135,6 +137,66 @@
src.LAssailant = M
//BITES
/mob/living/bite_act(mob/living/carbon/human/M as mob)
var/damage = rand(0, 7)
if(M_BEAK in M.mutations) //Beaks = stronger bites
damage += 4
if(!damage)
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("<span class='danger'>\The [M] has attempted to bite \the [src]!</span>")
return 0
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
src.visible_message("<span class='danger'>\The [M] has bitten \the [src]!</span>", "<span class='userdanger'>You were bitten by \the [M]!</span>")
adjustBruteLoss(damage)
return
//KICKS
/mob/living/kick_act(mob/living/carbon/human/M)
M.delayNextAttack(20) //Kicks are slow
if((M_CLUMSY in M.mutations) && prob(20)) //Kicking yourself (or being clumsy) = stun
M.visible_message("<span class='notice'>\The [M] tripped while attempting to kick \the [src]!</span>", "<span class='userdanger'>While attempting to kick \the [src], you tripped and fell!</span>")
M.Weaken(rand(1,10))
return
var/stomping = 0
if(M.size >= size && !flying) //On the ground, the kicker is bigger than/equal size of the victim = stomp
stomping = 1
var/damage = rand(0,9)
if(stomping) //Stomps = more damage and armor bypassing
damage += rand(0,9)
if(!damage)
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("<span class='danger'>\The [M] has attempted to kick \the [src]!</span>")
return 0
//Handle shoes
var/obj/item/clothing/shoes/S = M.shoes
if(istype(S))
damage += S.bonus_kick_damage
S.on_kick(M, src)
else if(M_TALONS in M.mutations) //Not wearing shoes and having talons = bonus 1-6 damage
damage += rand(1,6)
playsound(loc, "punch", 30, 1, -1)
if(stomping)
visible_message("<span class='danger'>\The [M] has stomped on \the [src]!</span>", "<span class='userdanger'>\The [M] stomps on you!</span>")
else
visible_message("<span class='danger'>\The [M] has kicked \the [src]!</span>", "<span class='userdanger'>\The [M] kicks you!</span>")
if(M.size != size) //The bigger the kicker, the more damage
damage = max(damage + (rand(1,5) * (1 + M.size - size)), 0)
adjustBruteLoss(damage)
/mob/living/proc/near_wall(var/direction,var/distance=1)
var/turf/T = get_step(get_turf(src),direction)

View File

@@ -308,3 +308,11 @@
/mob/living/silicon/spook()
to_chat(src, "<i>[pick(boo_phrases_silicon)]</i>")
/mob/living/silicon/bite_act(mob/living/carbon/human/H)
if(H.hallucinating() || (M_BEAK in H.mutations)) //If we're hallucinating, bite the silicon and lose some of our teeth. Doesn't apply to vox who have beaks
..()
H.knock_out_teeth()
else
to_chat(H, "<span class='info'>Your self-preservation instinct prevents you from breaking your teeth on \the [src].</span>")

View File

@@ -84,6 +84,16 @@
if((M.a_intent == I_HURT) || (M.a_intent == I_DISARM))
panic_attack(M)
/mob/living/simple_animal/bee/kick_act(mob/living/carbon/human/H)
if(prob(10)) ..()
panic_attack(H)
/mob/living/simple_animal/bee/bite_act(mob/living/carbon/human/H)
if(prob(10)) ..()
panic_attack(H)
/mob/living/simple_animal/bee/proc/panic_attack(mob/damagesource)
for(var/mob/living/simple_animal/bee/B in range(src,3))
B.feral = 15

View File

@@ -16,6 +16,8 @@
var/obj/screen/blind = null
var/obj/screen/hands = null
var/obj/screen/pullin = null
var/obj/screen/kick_icon = null
var/obj/screen/bite_icon = null
var/obj/screen/visible = null
var/obj/screen/purged = null
var/obj/screen/internals = null

View File

@@ -340,6 +340,25 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT)
hud_used.action_intent.icon_state = "harm"
else
hud_used.action_intent.icon_state = "help"
//For hotkeys
/mob/verb/a_kick()
set name = "a-kick"
set hidden = 1
if(ishuman(src))
var/mob/living/carbon/human/H = src
H.set_attack_type(ATTACK_KICK)
/mob/verb/a_bite()
set name = "a-bite"
set hidden = 1
if(ishuman(src))
var/mob/living/carbon/human/H = src
H.set_attack_type(ATTACK_BITE)
proc/is_blind(A)
if(istype(A, /mob/living/carbon))
var/mob/living/carbon/C = A

View File

@@ -79,6 +79,12 @@
return
..()
/obj/machinery/light_construct/kick_act(mob/living/carbon/human/H)
to_chat(H, "<span class='info'>You attempt to kick \the [src].</span>")
to_chat(H, "<span class='notice'>Dumb move! You strain a muscle.</span>")
H.apply_damage(rand(1,2), BRUTE, pick("r_leg", "l_leg", "r_foot", "l_foot"))
/obj/machinery/light_construct/small
name = "small light fixture frame"
desc = "A small light fixture under construction."
@@ -142,6 +148,12 @@ var/global/list/obj/machinery/light/alllights = list()
if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) )
broken()
/obj/machinery/light/kick_act(mob/living/carbon/human/H)
to_chat(H, "<span class='info'>You attempt to kick \the [src].</span>")
to_chat(H, "<span class='notice'>Dumb move! You strain a muscle.</span>")
H.apply_damage(rand(1,2), BRUTE, pick("r_leg", "l_leg", "r_foot", "l_foot"))
/obj/machinery/light/small
icon_state = "lbulb1"
base_state = "bulb"

View File

@@ -570,3 +570,6 @@
/obj/machinery/singularity/Destroy()
..()
power_machines -= src
/obj/machinery/singularity/bite_act()

View File

@@ -609,3 +609,6 @@ var/list/impact_master = list()
if((!( ttarget ) || loc == ttarget))
ttarget = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z) //Finding the target turf at map edge
step_towards(src, ttarget)
/obj/item/projectile/kick_act() //Can't be kicked around
return

View File

@@ -63,6 +63,9 @@
attack(user, user) //This is painful, but it works, I guess
return
/obj/item/weapon/reagent_containers/food/snacks/bite_act(mob/user) //nom nom
attack_self(user)
/obj/item/weapon/reagent_containers/food/snacks/New()
..()

View File

@@ -426,6 +426,7 @@ var/global/list/BODY_COVER_VALUE_LIST=list("[HEAD]" = COVER_PROTECTION_HEAD,"[EY
#define M_LASER 9 // harm intent - click anywhere to shoot lasers from eyes
#define M_CLAWS 10 // Deal extra damage with punches (but without gloves), can butcher animals without tools
#define M_BEAK 11 // Can buther animals without tools
#define M_TALONS 12 // Bonus kick damage
//#define HEAL 12 // (Not implemented) healing people with hands
//#define SHADOW 13 // (Not implemented) shadow teleportation (create in/out portals anywhere) (25%)
//#define SCREAM 14 // (Not implemented) supersonic screaming (25%)
@@ -1445,3 +1446,8 @@ var/proccalls = 1
#define DISP_TELECOMMS "Telecomms"
#define DISP_MECHANICS "Mechanics"
#define DISP_TELESCIENCE "Telescience"
//Human attack types
#define NORMAL_ATTACK 0
#define ATTACK_BITE 1
#define ATTACK_KICK 2

View File

@@ -0,0 +1,36 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscdel (general deleting of nice things)
# rscadd (general adding of nice things)
# imageadd
# imagedel
# spellcheck (typo fixes)
# experiment
# tgs (TG-ported fixes?)
#################################
author: Unid
delete-after: True
changes:
- experiment: Added two special attacks - kicks and bites. Players can now select their preferred attack type on their HUD (the buttons are next to throw and drop). Hotkey for kicking is 5 or CTRL 5. Hotkey for biting is 6 or CTRL 6.
- experiment: Special attacks proc when clicking something on harm intent. You need both of your feet to perform a kick. You need at least two teeth or a beak to bite. Kicks have 2x the normal attack delay.
- tweak: Kicking a vending machine now requires you to enable the Kick special attack.
- tweak: Kicking a lying human turns the attack into a stomp, dealing double damage.
- tweak: Kicking a small item sends it flying.
- tweak: SWAT shoes, combat boots and jackboots increase kick damage. Stomping on somebody while wearing magboots deals a lot of damage.
- tweak: Talons increase kick damage if not wearing shoes. Vox now have talons.
- rscadd: Vampires have to enable the Bite special attack to drain blood. Vampires can bite while wearing masks.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 121 KiB

View File

@@ -80,6 +80,8 @@ Hotkey-Mode: (hotkey-mode must be on)
\t2 = disarm-intent
\t3 = grab-intent
\t4 = harm-intent
\t5 = kick
\t6 = bite
</font>"}
var/other = {"<font color='purple'>
@@ -99,6 +101,8 @@ Any-Mode: (hotkey doesn't need to be on)
\tCtrl+2 = disarm-intent
\tCtrl+3 = grab-intent
\tCtrl+4 = harm-intent
\tCtrl+5 = kick
\tCtrl+6 = bite
\tDEL = pull
\tINS = cycle-intents-right
\tHOME = drop

View File

@@ -79,6 +79,14 @@ macro "macro"
name = "CTRL+4"
command = "a-intent harm"
is-disabled = false
elem
name = "CTRL+5"
command = "a-kick"
is-disabled = false
elem
name = "CTRL+6"
command = "a-bite"
is-disabled = false
elem
name = "CTRL+A+REP"
command = ".west"
@@ -277,6 +285,22 @@ macro "hotkeymode"
name = "CTRL+4"
command = "a-intent hurt"
is-disabled = false
elem
name = "5"
command = "a-kick"
is-disabled = false
elem
name = "CTRL+5"
command = "a-kick"
is-disabled = false
elem
name = "6"
command = "a-bite"
is-disabled = false
elem
name = "CTRL+6"
command = "a-bite"
is-disabled = false
elem
name = "A+REP"
command = ".west"