109 lines
3.4 KiB
Fortran
109 lines
3.4 KiB
Fortran
module player_mod
|
|
use iso_fortran_env
|
|
use iso_c_binding
|
|
use raylib
|
|
implicit none
|
|
|
|
type player
|
|
character(len=24):: username
|
|
type(vector3) :: position
|
|
type(color) :: apperance
|
|
integer :: fifo_write
|
|
integer :: fifo_read
|
|
contains
|
|
procedure, public :: login
|
|
procedure, public :: logout
|
|
procedure, public :: ping
|
|
procedure, public :: move
|
|
procedure, non_overridable, public :: sync_camera
|
|
end type player
|
|
|
|
contains
|
|
|
|
type(player) function init_player(username, position, apperance, fifo_write, fifo_read) result(this)
|
|
character(24) :: username
|
|
type(vector3) :: position
|
|
type(color) :: apperance
|
|
integer :: fifo_write
|
|
integer :: fifo_read
|
|
|
|
this%username = username
|
|
this%position = position
|
|
this%apperance = apperance
|
|
this%fifo_write = fifo_write
|
|
this%fifo_read = fifo_read
|
|
end function
|
|
|
|
function login(this, password) result(players)
|
|
class(player) :: this
|
|
character(24) :: password
|
|
type(player), dimension(:), allocatable :: players
|
|
|
|
players = send_packet(this, 1)
|
|
end function login
|
|
|
|
function logout(this) result(players)
|
|
class(player) :: this
|
|
type(player), dimension(:), allocatable :: players
|
|
|
|
players = send_packet(this, 2)
|
|
end function logout
|
|
|
|
function ping(this) result(players)
|
|
class(player) :: this
|
|
type(player), dimension(:), allocatable :: players
|
|
|
|
players = send_packet(this, 0)
|
|
end function ping
|
|
|
|
function move(this) result(players)
|
|
class(player) :: this
|
|
type(player), dimension(:), allocatable :: players
|
|
|
|
players = send_packet(this, 3)
|
|
end function move
|
|
|
|
subroutine sync_camera(this, camera)
|
|
class(player), intent(inout) :: this
|
|
type(camera3d), intent(inout) :: camera
|
|
|
|
camera%position%x = this%position%x
|
|
camera%position%y = this%position%y + 10.0_c_float
|
|
camera%position%z = this%position%z + 10.0_c_float
|
|
camera%target%x = this%position%x
|
|
camera%target%y = this%position%y
|
|
camera%target%z = this%position%z
|
|
end subroutine sync_camera
|
|
|
|
function send_packet(this, request_type) result(players)
|
|
class(player) :: this
|
|
type(player), dimension(:), allocatable :: players
|
|
integer :: request_type
|
|
character(len=24) :: username
|
|
integer :: apperance_r, apperance_g, apperance_b, i, count
|
|
real(c_float) :: x_pos, y_pos
|
|
|
|
write(this%fifo_write, "(i3, 1x, a24, 1x, f8.2, 1x, f8.2)") request_type, &
|
|
this%username, this%position%x, this%position%y
|
|
call flush(this%fifo_write)
|
|
|
|
write(12, "(i3, 1x, a24, 1x, f8.2, 1x, f8.2)") request_type, &
|
|
this%username, this%position%x, this%position%y
|
|
|
|
read (this%fifo_read, '(i3)') count
|
|
do i=0, count, 1
|
|
read(this%fifo_read, "(a, i3, i3, i3, f8.2, f8.2)") username, &
|
|
apperance_r, apperance_g, apperance_b, x_pos, y_pos
|
|
|
|
if (allocated(players)) then
|
|
players = [players, player(username, vector3( x_pos, 1.0_c_float, y_pos ), &
|
|
color(apperance_r, apperance_g, apperance_b, 255), -1, -1)]
|
|
else
|
|
players = [player(username, vector3( x_pos, 1.0_c_float, y_pos ), &
|
|
color(apperance_r, apperance_g, apperance_b, 255), -1, -1)]
|
|
end if
|
|
end do
|
|
end function send_packet
|
|
|
|
end module player_mod
|