summaryrefslogtreecommitdiff
path: root/src/game/player.h
blob: 27b423d0f1232f5c8e1100abaf4b84a5fe614937 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#pragma once
#include "object.h"
#include "camera.h"

enum PlayerFlags_t {
  PFL_NONE = 0,
  PFL_ONGROUND = 1 << 0,
  PFL_INVULNERABLE = 1 << 1,
  PFL_NOCLIP = 1 << 2,
  PFL_DUCK = 1 << 3,
};

enum PlayerMoveType_t {
  PMT_NONE = 0,
  PMT_WALK = 1,
  PMT_FLY = 2,
  PMT_LADDER = 3,
  PMT_NOCLIP = 4
};

struct PLAYER_INPUT {
  PLAYER_CAMERA cam;
  struct PLAYER* pobj;

  // for nulls
  U8 fwd_held{}, bk_held{}, left_held{}, right_held{};
  U8 jump{};

  VEC2 move;
};

struct PLAYER : OBJECT {
  static const U32 CLASSID = OBJCLASS_PLAYER;
  OBJVAR( U32, health );
  OBJVARV( F32, fov, 72.f );
  OBJVARV( F32, eyeoffset, 40.f );

  OBJVAR( I32, flags );

  PLAYER_INPUT input;

  OBJVARV( F32, gravity, 1.f );
  F32 maxspeed{250.f};
  F32 walkspeed{250.f};
  F32 stepsize{16.f};
  OBJVARV( U8, movetype, PMT_WALK );

  OBJECT* ground_ent;
  F32 surf_friction{};
};

extern PLAYER* player_create( VEC3 origin, F32 yaw );
extern void player_input( struct GAME_DATA* game, PLAYER* player );
extern void player_move( struct GAME_DATA* game, PLAYER* player );
extern VEC3 player_get_view_pos( PLAYER* player );