Skip to content

Commit

Permalink
MouseDrop controls for swipes.
Browse files Browse the repository at this point in the history
  • Loading branch information
LudwigVonChesterfield committed Sep 26, 2019
1 parent f202fd0 commit 44580bf
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 22 deletions.
24 changes: 21 additions & 3 deletions code/_onclick/drag_drop.dm
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,29 @@
/atom/MouseDrop(atom/over)
if(!usr || !over)
return
if(!Adjacent(usr) || !over.Adjacent(usr))
return // should stop you from dragging through windows

INVOKE_ASYNC(over, /atom.proc/MouseDrop_T, src, usr)
INVOKE_ASYNC(usr, /mob.proc/onMouseDrop, over, src)

// recieve a mousedrop
/atom/proc/MouseDrop_T(atom/dropping, mob/user)
return

/mob/proc/canMouseDrop_T(atom/dropping, atom/target)
return target.Adjacent(src) && dropping.Adjacent(src)

// Call the MouseDrop_T here if you must.
/mob/proc/onMouseDrop(atom/target, atom/dropping)
if(!canMouseDrop_T(target, dropping))
return // should stop you from dragging through windows

INVOKE_ASYNC(target, /atom.proc/MouseDrop_T, dropping, src)

/mob/living/onMouseDrop(atom/target, atom/dropping)
var/obj/item/I = get_active_hand()
if(I && I.onUserMouseDrop(target, dropping, src))
return

if(!canMouseDrop_T(target, dropping))
return // should stop you from dragging through windows

INVOKE_ASYNC(target, /atom.proc/MouseDrop_T, dropping, src)
4 changes: 4 additions & 0 deletions code/game/objects/items.dm
Original file line number Diff line number Diff line change
Expand Up @@ -987,3 +987,7 @@ var/global/list/items_blood_overlay_by_type = list()
. |= DAM_SHARP
if(damtype == BURN)
. |= DAM_LASER

// Return TRUE to prevent a MouseDrop_T call.
/obj/item/proc/onUserMouseDrop(atom/target, atom/dropping, mob/user)
return FALSE
28 changes: 16 additions & 12 deletions code/game/objects/items/weapons/shields.dm
Original file line number Diff line number Diff line change
Expand Up @@ -7,26 +7,29 @@
can_sweep = TRUE
interupt_on_sweep_hit_types = list(/turf, /obj/structure/table, /obj/machinery/disposal, /obj/structure/rack)

var/next_shield_push = 0

/obj/item/weapon/shield/on_sweep_hit(turf/current_turf, obj/effect/effect/weapon_sweep/sweep_image, atom/A, mob/living/user)
var/is_stunned = is_type_in_list(A, interupt_on_sweep_hit_types)
if(is_stunned)
to_chat(user, "<span class='warning'>Your [src] has hit [A]! There's not enough space for broad sweeps here!</span>")

if(user.a_intent != I_HELP)
var/resolved = A.attackby(src, user, list())
if(!resolved && src)
afterattack(A, user, TRUE, list()) // 1 indicates adjacency

if(isliving(A) && prob(Get_shield_chance())) // Better shields have more chance to stun.
var/mob/living/M = A
user.visible_message("<span class='warning'>[M] is stunned by [user] with [src]!</span>", "<span class='warning'>You stun [M] with [src]!</span>")
if(M.buckled)
M.buckled.user_unbuckle_mob(M)

M.apply_effect(3, STUN, 0)
M.apply_effect(3, WEAKEN, 0)
M.apply_effect(6, STUTTER, 0)
M.apply_effect(2, STUN, 0)
M.apply_effect(2, WEAKEN, 0)
M.apply_effect(4, STUTTER, 0)
shake_camera(M, 1, 1)

var/resolved = A.attackby(src, user, list())
if(!resolved && src)
afterattack(A, user, TRUE, list()) // 1 indicates adjacency

return is_stunned

/obj/item/weapon/shield/on_sweep_push_success(atom/target, mob/user)
Expand All @@ -42,9 +45,10 @@
else if(istype(target, /atom/movable))
var/atom/movable/AM = target
if(!AM.anchored)
var/old_loc = AM.loc
var/turf/to_move = get_step(target, get_dir(user, target))
step_away(target, get_turf(src))
if(old_loc == AM.loc && isliving(AM)) // We tried pushing them, but pushed them into something, IT'S FALLING DOWN TIME.
if(AM.loc != to_move && isliving(AM) && next_shield_push < world.time) // We tried pushing them, but pushed them into something, IT'S FALLING DOWN TIME.
next_shield_push = world.time + 4 SECONDS
var/mob/living/M = AM

user.attack_log += "\[[time_stamp()]\]<font color='red'>pushed [M.name] ([M.ckey]) with [src.name].</font>"
Expand All @@ -54,9 +58,9 @@
if(M.buckled)
M.buckled.user_unbuckle_mob(M)

M.apply_effect(3, STUN, 0)
M.apply_effect(3, WEAKEN, 0)
M.apply_effect(6, STUTTER, 0)
M.apply_effect(2, STUN, 0)
M.apply_effect(2, WEAKEN, 0)
M.apply_effect(4, STUTTER, 0)
shake_camera(M, 1, 1)

/obj/item/weapon/shield/riot
Expand Down
37 changes: 30 additions & 7 deletions code/game/objects/weapons.dm
Original file line number Diff line number Diff line change
Expand Up @@ -253,20 +253,20 @@

var/turf/T = get_turf(target)
var/direction = get_dir(get_turf(src), T)
var/list/turfs = list(turn(direction, 45), direction, turn(direction, -45))
sweep(turfs, user, sweep_step)
var/list/directions = list(turn(direction, 45), direction, turn(direction, -45))
sweep(directions, user, sweep_step)
return TRUE

/obj/item/weapon/proc/sweep_spin(mob/user)
var/rot_dir = 1
if(user.dir == SOUTH || user.dir == WEST) // South-west rotate anti-clockwise.
rot_dir = -1

var/list/turfs = list(user.dir, turn(user.dir, rot_dir * 45), turn(user.dir, rot_dir * 90), turn(user.dir, rot_dir * 135), turn(user.dir, rot_dir * 180), turn(user.dir, rot_dir * 225), turn(user.dir, rot_dir * 270), turn(user.dir, rot_dir * 315), user.dir)
var/list/directions = list(user.dir, turn(user.dir, rot_dir * 45), turn(user.dir, rot_dir * 90), turn(user.dir, rot_dir * 135), turn(user.dir, rot_dir * 180), turn(user.dir, rot_dir * 225), turn(user.dir, rot_dir * 270), turn(user.dir, rot_dir * 315), user.dir)

var/saved_sweep_step = sweep_step
sweep_step *= 0.5
sweep(turfs, user, sweep_step)
sweep(directions, user, sweep_step)
sweep_step = saved_sweep_step

/obj/item/weapon/MiddleClickAction(atom/target, mob/user)
Expand Down Expand Up @@ -302,11 +302,34 @@
if(M.buckled)
M.buckled.user_unbuckle_mob(M)

M.apply_effect(3, STUN, 0)
M.apply_effect(3, WEAKEN, 0)
M.apply_effect(6, STUTTER, 0)
M.apply_effect(2, STUN, 0)
M.apply_effect(2, WEAKEN, 0)
M.apply_effect(4, STUTTER, 0)
shake_camera(M, 1, 1)

/obj/item/weapon/onUserMouseDrop(atom/target, atom/dropping, mob/user)
var/turf/target_turf = get_turf(target)
var/turf/dropping_turf = get_turf(dropping)

var/list/turfs = getline(dropping_turf, target_turf)
var/list/directions = list()
for(var/turf/T in turfs)
if(!in_range(user, T))
if(get_dir(dropping, target) == get_dir(user, target))
if(can_push())
sweep_push(target, user)
return TRUE
else
if(can_pull())
sweep_pull(target, user)
return TRUE
directions += get_dir(user, T)

if(directions.len == 3 && can_sweep())
sweep(directions, user, sweep_step)
return TRUE
return FALSE

/obj/item/weapon/throwing_star
name = "throwing star"
desc = "An ancient weapon still used to this day due to it's ease of lodging itself into victim's body parts"
Expand Down

0 comments on commit 44580bf

Please sign in to comment.