Thrown items can be targeted, has miss chance...

...based on distance, similar to projectiles.

Conflicts:
	code/defines/obj.dm
	code/game/machinery/kitchen/smartfridge.dm
	code/game/machinery/vending.dm
	code/game/mecha/equipment/weapons/weapons.dm
	code/modules/games/cards.dm
	code/modules/mob/living/carbon/carbon.dm
	code/modules/mob/living/living_defense.dm
This commit is contained in:
mwerezak
2014-07-15 01:14:04 -04:00
committed by ZomgPonies
parent ee3b362f8e
commit a07b7a5ce3
21 changed files with 275 additions and 33 deletions
+7 -1
View File
@@ -7,6 +7,8 @@
var/l_move_time = 1
var/m_flag = 1
var/throwing = 0
var/thrower
var/turf/throw_source = null
var/throw_speed = 2
var/throw_range = 7
var/moved_recently = 0
@@ -83,11 +85,13 @@
if(A.density && !A.throwpass) // **TODO: Better behaviour for windows which are dense, but shouldn't always stop movement
src.throw_impact(A,speed)
/atom/movable/proc/throw_at(atom/target, range, speed)
/atom/movable/proc/throw_at(atom/target, range, speed, thrower)
if(!target || !src) return 0
//use a modified version of Bresenham's algorithm to get from the atom's current position to that of the target
src.throwing = 1
src.thrower = thrower
src.throw_source = get_turf(src) //store the origin turf
if(usr)
if(M_HULK in usr.mutations)
@@ -176,6 +180,8 @@
//done throwing, either because it hit something or it finished moving
if(isobj(src)) src.throw_impact(get_turf(src),speed)
src.throwing = 0
src.thrower = null
src.throw_source = null
//Overlays
+1 -1
View File
@@ -396,7 +396,7 @@
if ( emagged ) // Warning, hungry humans detected: throw fertilizer at them
spawn(0)
fert.loc = src.loc
fert.throw_at(target, 16, 3)
fert.throw_at(target, 16, 3, src)
src.visible_message("\red <b>[src] launches [fert.name] at [target.name]!</b>")
flick("farmbot_broke", src)
spawn (FARMBOT_EMAG_DELAY)
+1 -1
View File
@@ -172,7 +172,7 @@
var/obj/item/meatslab = allmeat[i]
var/turf/Tx = locate(src.x - i, src.y, src.z)
meatslab.loc = src.loc
meatslab.throw_at(Tx,i,3)
meatslab.throw_at(Tx,i,3,src)
if (!Tx.density)
new /obj/effect/decal/cleanable/blood/gibs(Tx,i)
src.operating = 0
@@ -203,5 +203,3 @@
+1 -1
View File
@@ -545,7 +545,7 @@
if (!throw_item)
return 0
spawn(0)
throw_item.throw_at(target, 16, shoot_speed)
throw_item.throw_at(target, 16, 3, src)
src.visible_message("\red <b>[src] launches [throw_item.name] at [target.name]!</b>")
return 1
+1 -1
View File
@@ -475,7 +475,7 @@
return
else if(target!=locked)
if(locked in view(chassis))
locked.throw_at(target, 14, 1.5)
locked.throw_at(target, 14, 1.5, chassis)
locked = null
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
set_ready_state(0)
+5 -5
View File
@@ -312,7 +312,7 @@
var/obj/item/missile/M = new projectile(chassis.loc)
M.primed = 1
playsound(chassis, fire_sound, 50, 1)
M.throw_at(target, missile_range, missile_speed)
M.throw_at(target, missile_range, missile_speed, chassis)
projectiles--
log_message("Fired from [src.name], targeting [target].")
do_after_cooldown()
@@ -349,7 +349,7 @@
set_ready_state(0)
var/obj/item/weapon/grenade/flashbang/F = new projectile(chassis.loc)
playsound(chassis, fire_sound, 50, 1)
F.throw_at(target, missile_range, missile_speed)
F.throw_at(target, missile_range, missile_speed, chassis)
projectiles--
log_message("Fired from [src.name], targeting [target].")
spawn(det_time)
@@ -391,7 +391,7 @@
set_ready_state(0)
var/obj/item/weapon/bananapeel/B = new projectile(chassis.loc)
playsound(chassis, fire_sound, 60, 1)
B.throw_at(target, missile_range, missile_speed)
B.throw_at(target, missile_range, missile_speed, chassis)
projectiles--
log_message("Bananed from [src.name], targeting [target]. HONK!")
do_after_cooldown()
@@ -422,8 +422,8 @@
var/obj/item/device/assembly/mousetrap/M = new projectile(chassis.loc)
M.secured = 1
playsound(chassis, fire_sound, 60, 1)
M.throw_at(target, missile_range, missile_speed)
M.throw_at(target, missile_range, missile_speed, chassis)
projectiles--
log_message("Launched a mouse-trap from [src.name], targeting [target]. HONK!")
do_after_cooldown()
return
return
@@ -151,16 +151,19 @@
C = usr.buckled
var/obj/B = usr.buckled
var/movementdirection = turn(direction,180)
if(C) C.propelled = 1
B.Move(get_step(usr,movementdirection), movementdirection)
sleep(1)
if(C) C.propelled = 4
B.Move(get_step(usr,movementdirection), movementdirection)
sleep(1)
B.Move(get_step(usr,movementdirection), movementdirection)
if(C) C.propelled = 3
sleep(1)
B.Move(get_step(usr,movementdirection), movementdirection)
sleep(1)
B.Move(get_step(usr,movementdirection), movementdirection)
if(C) C.propelled = 2
sleep(2)
B.Move(get_step(usr,movementdirection), movementdirection)
if(C) C.propelled = 1
sleep(2)
B.Move(get_step(usr,movementdirection), movementdirection)
if(C) C.propelled = 0
@@ -136,7 +136,7 @@
if(propelled)
var/mob/living/occupant = buckled_mob
unbuckle()
occupant.throw_at(A, 3, 2)
occupant.throw_at(A, 3, propelled)
occupant.apply_effect(6, STUN, 0)
occupant.apply_effect(6, WEAKEN, 0)
occupant.apply_effect(6, STUTTER, 0)
@@ -136,7 +136,12 @@
if(propelled || (pulling && (pulling.a_intent == "harm")))
var/mob/living/occupant = buckled_mob
unbuckle()
occupant.throw_at(A, 3, 2)
if (pulling && (pulling.a_intent == "hurt"))
occupant.throw_at(A, 3, 3, pulling)
else if (propelled)
occupant.throw_at(A, 3, propelled)
occupant.apply_effect(6, STUN, 0)
occupant.apply_effect(6, WEAKEN, 0)
occupant.apply_effect(6, STUTTER, 0)