mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 02:09:41 +00:00
116 lines
2.9 KiB
Plaintext
116 lines
2.9 KiB
Plaintext
/obj/effect/map/ship
|
|
name = "generic ship"
|
|
desc = "Space faring vessel."
|
|
icon_state = "sheet-sandstone"
|
|
var/vessel_mass = 9000 //tonnes, random number
|
|
var/default_delay = 60
|
|
var/list/speed = list(0,0)
|
|
var/last_burn = 0
|
|
var/list/last_movement = list(0,0)
|
|
var/fore_dir = NORTH
|
|
var/rotate = 1 //For proc rotate
|
|
|
|
var/obj/effect/map/current_sector
|
|
var/obj/machinery/computer/helm/nav_control
|
|
var/obj/machinery/computer/engines/eng_control
|
|
|
|
/obj/effect/map/ship/initialize()
|
|
for(var/obj/machinery/computer/engines/E in machines)
|
|
if (E.z == map_z)
|
|
eng_control = E
|
|
break
|
|
for(var/obj/machinery/computer/helm/H in machines)
|
|
if (H.z == map_z)
|
|
nav_control = H
|
|
break
|
|
processing_objects.Add(src)
|
|
|
|
/obj/effect/map/ship/relaymove(mob/user, direction)
|
|
accelerate(direction)
|
|
|
|
/obj/effect/map/ship/proc/is_still()
|
|
return !(speed[1] || speed[2])
|
|
|
|
/obj/effect/map/ship/proc/get_acceleration()
|
|
return eng_control.get_total_thrust()/vessel_mass
|
|
|
|
/obj/effect/map/ship/proc/get_speed()
|
|
return round(sqrt(speed[1]*speed[1] + speed[2]*speed[2]))
|
|
|
|
/obj/effect/map/ship/proc/get_heading()
|
|
var/res = 0
|
|
if(speed[1])
|
|
if(speed[1] > 0)
|
|
res |= EAST
|
|
else
|
|
res |= WEST
|
|
if(speed[2])
|
|
if(speed[2] > 0)
|
|
res |= NORTH
|
|
else
|
|
res |= SOUTH
|
|
return res
|
|
|
|
/obj/effect/map/ship/proc/adjust_speed(n_x, n_y)
|
|
speed[1] = Clamp(speed[1] + n_x, -default_delay, default_delay)
|
|
speed[2] = Clamp(speed[2] + n_y, -default_delay, default_delay)
|
|
if(is_still())
|
|
toggle_move_stars(map_z)
|
|
else
|
|
toggle_move_stars(map_z, fore_dir)
|
|
|
|
/obj/effect/map/ship/proc/can_burn()
|
|
if (!eng_control)
|
|
return 0
|
|
if (world.time < last_burn + 10)
|
|
return 0
|
|
if (!eng_control.burn())
|
|
return 0
|
|
return 1
|
|
|
|
/obj/effect/map/ship/proc/get_brake_path()
|
|
if(!get_acceleration())
|
|
return INFINITY
|
|
return get_speed()/get_acceleration()
|
|
|
|
#define SIGN(X) (X == 0 ? 0 : (X > 0 ? 1 : -1))
|
|
/obj/effect/map/ship/proc/decelerate()
|
|
if(!is_still() && can_burn())
|
|
if (speed[1])
|
|
adjust_speed(-SIGN(speed[1]) * min(get_acceleration(),abs(speed[1])), 0)
|
|
if (speed[2])
|
|
adjust_speed(0, -SIGN(speed[2]) * min(get_acceleration(),abs(speed[2])))
|
|
last_burn = world.time
|
|
|
|
/obj/effect/map/ship/proc/accelerate(direction)
|
|
if(can_burn())
|
|
last_burn = world.time
|
|
|
|
if(direction & EAST)
|
|
adjust_speed(get_acceleration(), 0)
|
|
if(direction & WEST)
|
|
adjust_speed(-get_acceleration(), 0)
|
|
if(direction & NORTH)
|
|
adjust_speed(0, get_acceleration())
|
|
if(direction & SOUTH)
|
|
adjust_speed(0, -get_acceleration())
|
|
|
|
|
|
/obj/effect/map/ship/proc/rotate(var/direction)
|
|
var/matrix/M = matrix()
|
|
M.Turn(dir2angle(direction))
|
|
src.transform = M //Rotate ship
|
|
|
|
/obj/effect/map/ship/process()
|
|
if(!is_still())
|
|
var/list/deltas = list(0,0)
|
|
for(var/i=1, i<=2, i++)
|
|
if(speed[i] && world.time > last_movement[i] + default_delay - abs(speed[i]))
|
|
deltas[i] = speed[i] > 0 ? 1 : -1
|
|
last_movement[i] = world.time
|
|
var/turf/newloc = locate(x + deltas[1], y + deltas[2], z)
|
|
if(newloc)
|
|
Move(newloc)
|
|
if(rotate)
|
|
rotate(get_heading())
|