aboutsummaryrefslogtreecommitdiff
path: root/src/entity.h
blob: 7d2725869e44f74bfacf1410adbe7c98558b5e90 (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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include "gameCommon.h"
#include "util.h"

#ifndef	ENTITY_H
#define ENTITY_H

enum {
	ENTITY_NONE = -1,
	ENTITY_ANTIFA,
	ENTITY_SOLDATO,
	ENTITY_CAPORALE,
	ENTITY_SERGENTE,
	ENTITY_MARESCIALLO,
	ENTITY_GENERALE,
	ENTITY_MUSSOLINI
};

#define ENTITY_TYPE_COUNT 7

typedef int8_t EntityType;
typedef int16_t EntityId; // Id in world.

// Callbacks.
typedef void (*EntityUpdateCb)(Game * game, Entity * entity, EntityId id);
typedef void (*EntityDrawCb)(Game * game, Entity * entity, EntityId id);

// Acceleration indeed hehehe.
typedef struct EntityAcceleration {
	Vector3 rotationUp;
	Vector3 rotationDown;
	float speedUp;
	float speedDown;
} EntityAcceleration;

float accelerateValue(float value, float lastValue, float up, float down);
Vector3 accelerateVector3(Vector3 value, Vector3 lastValue, Vector3 up, Vector3 down);

typedef struct EntityVelocity {
	Vector3 velocity;
	AxisAngle angularVelocity;
	Vector3 stick; // Pilot control stick.
	float speed; // Somewhat general use (:
} EntityVelocity;

EntityVelocity entityVelocityIdentity();

// This fucker is a entity.
typedef struct Entity {
	EntityType type;
	Model model;

	Vector3 position;
	Quaternion rotation;

	EntityVelocity velocity;
	EntityVelocity lastVelocity;

	bool useAcceleration;
	EntityAcceleration acceleration;

	EntityUpdateCb updateCb;
	EntityDrawCb drawCb;

	// Used for whatever.
	void * data;
} Entity;

typedef void (*EntityInitCb)(Entity * entity);
typedef void (*EntityCloseCb)(Entity * entity);

// Info for each entity type.
typedef struct EntityTypeInfo {
	EntityInitCb initCb;
	EntityCloseCb closeCb;
	EntityUpdateCb updateCb;
	EntityDrawCb drawCb;
} EntityTypeInfo;

const extern EntityTypeInfo entityTypeInfo[ENTITY_TYPE_COUNT];

// Do I need a fucking comment?
Entity createEntity(EntityType type);
void closeEntity(Entity * entity);

// Helper functions for updating and drawing.
void entityDraw(Entity * entity);
void entityUpdatePosition(Entity * entity);
void entityUpdateRotation(Entity * entity);

void entityJoystickControl(Entity * entity, Vector3 stick, float speed);

#endif