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
@@ -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"
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -138,3 +138,7 @@
|
||||
return
|
||||
user.visible_message("<span class='danger'>[user] smashes [src]!</span>")
|
||||
shatter()
|
||||
|
||||
/obj/structure/mirror/kick_act()
|
||||
..()
|
||||
shatter()
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -570,3 +570,6 @@
|
||||
/obj/machinery/singularity/Destroy()
|
||||
..()
|
||||
power_machines -= src
|
||||
|
||||
/obj/machinery/singularity/bite_act()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
|
||||
36
html/changelogs/unid-why.yml
Normal 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.
|
||||
|
Before Width: | Height: | Size: 141 KiB After Width: | Height: | Size: 133 KiB |
|
Before Width: | Height: | Size: 140 KiB After Width: | Height: | Size: 151 KiB |
|
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 129 KiB |
|
Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 121 KiB |
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||