mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-19 22:51:40 +00:00
Merge branch 'grab' into dev
Conflicts: icons/mob/screen1.dmi
This commit is contained in:
@@ -72,6 +72,10 @@
|
||||
if(I_GRAB)
|
||||
if(M == src || anchored)
|
||||
return 0
|
||||
for(var/obj/item/weapon/grab/G in src.grabbed_by)
|
||||
if(G.assailant == M)
|
||||
M << "<span class='notice'>You already grabbed [src].</span>"
|
||||
return
|
||||
if(w_uniform)
|
||||
w_uniform.add_fingerprint(M)
|
||||
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
|
||||
/obj/item/weapon/grab
|
||||
name = "grab"
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "reinforce"
|
||||
flags = NOBLUDGEON
|
||||
var/obj/screen/grab/hud = null
|
||||
var/mob/affecting = null
|
||||
@@ -32,6 +34,7 @@
|
||||
|
||||
hud = new /obj/screen/grab(src)
|
||||
hud.icon_state = "reinforce"
|
||||
icon_state = "grabbed"
|
||||
hud.name = "reinforce grab"
|
||||
hud.master = src
|
||||
|
||||
@@ -89,11 +92,12 @@
|
||||
if(G.state >= GRAB_AGGRESSIVE)
|
||||
allow_upgrade = 0
|
||||
if(allow_upgrade)
|
||||
hud.icon_state = "reinforce"
|
||||
if(state < GRAB_AGGRESSIVE)
|
||||
hud.icon_state = "reinforce"
|
||||
else
|
||||
hud.icon_state = "reinforce1"
|
||||
else
|
||||
hud.icon_state = "!reinforce"
|
||||
else if(!affecting.buckled)
|
||||
affecting.loc = assailant.loc
|
||||
|
||||
if(state >= GRAB_NECK)
|
||||
affecting.Stun(1)
|
||||
@@ -105,7 +109,51 @@
|
||||
//affecting.apply_effect(STUTTER, 5) //would do this, but affecting isn't declared as mob/living for some stupid reason.
|
||||
affecting.stuttering = max(affecting.stuttering, 5) //It will hamper your voice, being choked and all.
|
||||
affecting.Weaken(5) //Should keep you down unless you get help.
|
||||
affecting.losebreath = min(affecting.losebreath + 2, 3)
|
||||
affecting.losebreath = max(affecting.losebreath + 2, 3)
|
||||
|
||||
adjust_position()
|
||||
|
||||
|
||||
/obj/item/weapon/grab/attack_self()
|
||||
return s_click(hud)
|
||||
|
||||
|
||||
//Updating pixelshift, position and direction
|
||||
//Gets called on process, when the grab gets upgraded or the assailant moves
|
||||
/obj/item/weapon/grab/proc/adjust_position()
|
||||
if(affecting.buckled)
|
||||
return
|
||||
var/shift = 0
|
||||
var/adir = get_dir(assailant, affecting)
|
||||
affecting.layer = 4
|
||||
switch(state)
|
||||
if(GRAB_PASSIVE)
|
||||
shift = 6
|
||||
if(GRAB_AGGRESSIVE)
|
||||
shift = 12
|
||||
if(GRAB_NECK, GRAB_UPGRADING)
|
||||
shift = -10
|
||||
adir = assailant.dir
|
||||
affecting.set_dir(assailant.dir)
|
||||
affecting.loc = assailant.loc
|
||||
if(GRAB_KILL)
|
||||
shift = 0
|
||||
adir = 1
|
||||
affecting.set_dir(reverse_dir[assailant.dir])
|
||||
affecting.loc = assailant.loc
|
||||
affecting.lying = 1
|
||||
|
||||
switch(adir)
|
||||
if(NORTH)
|
||||
animate(affecting, pixel_x = 0, pixel_y =-shift, 5, 1, LINEAR_EASING)
|
||||
affecting.layer = 3.9
|
||||
if(SOUTH)
|
||||
animate(affecting, pixel_x = 0, pixel_y = shift, 5, 1, LINEAR_EASING)
|
||||
if(WEST)
|
||||
animate(affecting, pixel_x = shift, pixel_y = 0, 5, 1, LINEAR_EASING)
|
||||
if(EAST)
|
||||
animate(affecting, pixel_x =-shift, pixel_y = 0, 5, 1, LINEAR_EASING)
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/grab/proc/s_click(obj/screen/S)
|
||||
@@ -129,6 +177,7 @@
|
||||
assailant.visible_message("<span class='warning'>[assailant] has grabbed [affecting] aggressively (now hands)!</span>")
|
||||
state = GRAB_AGGRESSIVE
|
||||
icon_state = "grabbed1"
|
||||
hud.icon_state = "reinforce1"
|
||||
else if(state < GRAB_NECK)
|
||||
if(isslime(affecting))
|
||||
assailant << "<span class='notice'>You squeeze [affecting], but nothing interesting happens.</span>"
|
||||
@@ -137,38 +186,25 @@
|
||||
assailant.visible_message("<span class='warning'>[assailant] has reinforced \his grip on [affecting] (now neck)!</span>")
|
||||
state = GRAB_NECK
|
||||
icon_state = "grabbed+1"
|
||||
if(!affecting.buckled)
|
||||
affecting.loc = assailant.loc
|
||||
assailant.set_dir(get_dir(assailant, affecting))
|
||||
affecting.attack_log += "\[[time_stamp()]\] <font color='orange'>Has had their neck grabbed by [assailant.name] ([assailant.ckey])</font>"
|
||||
assailant.attack_log += "\[[time_stamp()]\] <font color='red'>Grabbed the neck of [affecting.name] ([affecting.ckey])</font>"
|
||||
msg_admin_attack("[key_name(assailant)] grabbed the neck of [key_name(affecting)]")
|
||||
hud.icon_state = "disarm/kill"
|
||||
hud.name = "disarm/kill"
|
||||
hud.icon_state = "kill"
|
||||
hud.name = "kill"
|
||||
else if(state < GRAB_UPGRADING)
|
||||
assailant.visible_message("<span class='danger'>[assailant] starts to tighten \his grip on [affecting]'s neck!</span>")
|
||||
hud.icon_state = "disarm/kill1"
|
||||
state = GRAB_UPGRADING
|
||||
if(do_after(assailant, UPGRADE_KILL_TIMER))
|
||||
if(state == GRAB_KILL)
|
||||
return
|
||||
if(!affecting)
|
||||
del(src)
|
||||
return
|
||||
if(!assailant.canmove || assailant.lying)
|
||||
del(src)
|
||||
return
|
||||
state = GRAB_KILL
|
||||
assailant.visible_message("<span class='danger'>[assailant] has tightened \his grip on [affecting]'s neck!</span>")
|
||||
affecting.attack_log += "\[[time_stamp()]\] <font color='orange'>Has been strangled (kill intent) by [assailant.name] ([assailant.ckey])</font>"
|
||||
assailant.attack_log += "\[[time_stamp()]\] <font color='red'>Strangled (kill intent) [affecting.name] ([affecting.ckey])</font>"
|
||||
msg_admin_attack("[key_name(assailant)] strangled (kill intent) [key_name(affecting)]")
|
||||
hud.icon_state = "kill1"
|
||||
|
||||
assailant.next_move = world.time + 10
|
||||
affecting.losebreath += 1
|
||||
else
|
||||
assailant.visible_message("<span class='warning'>[assailant] was unable to tighten \his grip on [affecting]'s neck!</span>")
|
||||
hud.icon_state = "disarm/kill"
|
||||
state = GRAB_NECK
|
||||
state = GRAB_KILL
|
||||
assailant.visible_message("<span class='danger'>[assailant] has tightened \his grip on [affecting]'s neck!</span>")
|
||||
affecting.attack_log += "\[[time_stamp()]\] <font color='orange'>Has been strangled (kill intent) by [assailant.name] ([assailant.ckey])</font>"
|
||||
assailant.attack_log += "\[[time_stamp()]\] <font color='red'>Strangled (kill intent) [affecting.name] ([affecting.ckey])</font>"
|
||||
msg_admin_attack("[key_name(assailant)] strangled (kill intent) [key_name(affecting)]")
|
||||
|
||||
assailant.next_move = world.time + 10
|
||||
affecting.losebreath += 1
|
||||
adjust_position()
|
||||
|
||||
|
||||
//This is used to make sure the victim hasn't managed to yackety sax away before using the grab.
|
||||
@@ -223,5 +259,7 @@
|
||||
del(src)
|
||||
|
||||
/obj/item/weapon/grab/Del()
|
||||
animate(affecting, pixel_x = 0, pixel_y = 0, 4, 1)
|
||||
affecting.layer = 4
|
||||
del(hud)
|
||||
..()
|
||||
|
||||
@@ -343,6 +343,11 @@
|
||||
else
|
||||
. = mob.SelfMove(n, direct)
|
||||
|
||||
for (var/obj/item/weapon/grab/G in mob)
|
||||
if (G.state == GRAB_NECK)
|
||||
mob.set_dir(reverse_dir[direct])
|
||||
G.adjust_position()
|
||||
|
||||
moving = 0
|
||||
|
||||
return .
|
||||
|
||||
Reference in New Issue
Block a user