Files
vgstation13/code/datums/alt_control.dm
DamianX fe77ef6e20 Converted all old events to lazy_events, removed old events, renamed lazy_event to event (#30503)
* wip refactor old events

* refactored events

* We're not lazy anymore! I mean we're still are. We just don't call ourselves that. Lazy is the new default option. It's also the only option. God, this took so long.
2021-09-04 23:21:03 -05:00

120 lines
3.2 KiB
Plaintext

/datum/control
var/name = "controlling something else"
var/mob/controller
var/atom/movable/controlled
var/control_flags = 0
var/is_controlled = FALSE //Whether we're in strict control
/datum/control/New(var/mob/new_controller, var/atom/new_controlled)
..()
controller = new_controller
controller.register_event(/event/damaged, src, .proc/user_damaged)
controlled = new_controlled
/datum/control/Destroy()
break_control()
if(controller)
controller.control_object.Remove(src)
controller = null
controlled = null
..()
/datum/control/proc/user_damaged(kind, amount)
if(amount > 0 && control_flags & REVERT_ON_CONTROLLER_DAMAGED)
break_control()
/datum/control/proc/break_control()
if(controller && controller.client)
controller.client.eye = controller.client.mob
controller.client.perspective = MOB_PERSPECTIVE
is_controlled = FALSE
if(control_flags & LOCK_MOVEMENT_OF_CONTROLLER)
controller.canmove = 1
/datum/control/proc/take_control()
if(!is_valid(0))
return
if(control_flags & LOCK_EYE_TO_CONTROLLED)
controller.client.perspective = EYE_PERSPECTIVE
controller.client.eye = controlled
is_controlled = TRUE
if(control_flags & LOCK_MOVEMENT_OF_CONTROLLER)
controller.canmove = 0
/datum/control/proc/is_valid(var/check_control = FALSE)
if(!controller || !controller.client || !controlled || controller.gcDestroyed || controlled.gcDestroyed)
qdel(src)
return 0
if(check_control && !(control_flags & REQUIRES_CONTROL && is_controlled))
return 0
return 1
/datum/control/proc/Move_object(var/direction)
if(!is_valid())
return
if(controlled)
if(control_flags & LOCK_MOVEMENT_OF_CONTROLLER)
controller.canmove = 0
if(controlled.density)
step(controlled,direction)
if(!controlled)
return
controlled.dir = direction
else
controlled.forceMove(get_step(controlled,direction))
/datum/control/proc/Orient_object(var/direction)
if(!is_valid())
return
if(control_flags & LOCK_MOVEMENT_OF_CONTROLLER)
controller.canmove = 0
controlled.dir = direction
/////////////////////////////LOCK MOVE//////////////////////////////
/datum/control/lock_move
control_flags = LOCK_MOVEMENT_OF_CONTROLLER | LOCK_EYE_TO_CONTROLLED
///////////////////////////////SOULBLADE CONTROLLER///////////////////////////////
/datum/control/soulblade
var/obj/item/weapon/melee/soulblade/blade = null
var/move_delay = 0
/datum/control/soulblade/New(var/mob/new_controller, var/atom/new_controlled)
..()
blade = new_controlled
/datum/control/soulblade/is_valid(var/direction)
if (blade.blood <= 0 || move_delay || blade.throwing)
return 0
if (!isturf(blade.loc))
if (istype(blade.loc,/obj/structure/cult/altar))
var/obj/structure/cult/altar/A = blade.loc
blade.forceMove(A.loc)
A.blade = null
playsound(A.loc, 'sound/weapons/blade1.ogg', 50, 1)
if (A.is_locking(A.lock_type))
var/mob/M = A.get_locked(A.lock_type)[1]
A.unlock_atom(M)
A.update_icon()
else
return 0
return ..()
/datum/control/soulblade/Move_object(var/direction)
if(!controlled)
return
var/atom/start = blade.loc
if(!is_valid())
return
step(controlled,direction)
controlled.dir = direction
if (blade.loc != start)
blade.blood = max(blade.blood-1,0)
move_delay = 1
spawn(blade.movespeed)
move_delay = 0
controller.DisplayUI("Soulblade")