A game engine for top-down 2D RPG games.
rpg
game-engine
raylib
c99
1#include <keraforge.h>
2#include <raylib.h>
3#include <raymath.h>
4
5
6#define x(T) \
7 struct kf_vec2(T) kf_normalize_vec2##T(struct kf_vec2(T) v) \
8 { \
9 Vector2 v2 = Vector2Normalize((Vector2){v.x, v.y}); \
10 return (struct kf_vec2(T)){v2.x, v2.y}; \
11 }
12_kf_mathdef(x)
13#undef x
14
15#define x(T) \
16 struct kf_vec2(T) kf_add_vec2##T(struct kf_vec2(T) a, struct kf_vec2(T) b) { return (struct kf_vec2(T)){a.x+b.x, a.y+b.y}; } \
17 struct kf_vec2(T) kf_sub_vec2##T(struct kf_vec2(T) a, struct kf_vec2(T) b) { return (struct kf_vec2(T)){a.x-b.x, a.y-b.y}; } \
18 struct kf_vec2(T) kf_mul_vec2##T(struct kf_vec2(T) a, struct kf_vec2(T) b) { return (struct kf_vec2(T)){a.x*b.x, a.y*b.y}; } \
19 struct kf_vec2(T) kf_div_vec2##T(struct kf_vec2(T) a, struct kf_vec2(T) b) { return (struct kf_vec2(T)){a.x/b.x, a.y/b.y}; } \
20 struct kf_vec2(T) kf_addval_vec2##T(struct kf_vec2(T) a, T val) { return (struct kf_vec2(T)){a.x+val, a.y+val}; } \
21 struct kf_vec2(T) kf_subval_vec2##T(struct kf_vec2(T) a, T val) { return (struct kf_vec2(T)){a.x-val, a.y-val}; } \
22 struct kf_vec2(T) kf_mulval_vec2##T(struct kf_vec2(T) a, T val) { return (struct kf_vec2(T)){a.x*val, a.y*val}; } \
23 struct kf_vec2(T) kf_divval_vec2##T(struct kf_vec2(T) a, T val) { return (struct kf_vec2(T)){a.x/val, a.y/val}; } \
24 struct kf_vec2(T) kf_vec2##T##_x(struct kf_vec2(T) a) { return (struct kf_vec2(T)){a.x, 0}; } \
25 struct kf_vec2(T) kf_vec2##T##_y(struct kf_vec2(T) a) { return (struct kf_vec2(T)){0, a.y}; }
26_kf_mathdef(x)
27#undef x
28
29
30static
31int _kf_isdir(enum kf_direction dir)
32{
33 return dir >= kf_north && dir <= kf_west;
34}
35
36enum kf_direction kf_rotatecw(enum kf_direction dir)
37{
38 return _kf_isdir(dir+1) ? kf_north : dir+1;
39}
40
41enum kf_direction kf_rotateccw(enum kf_direction dir)
42{
43 return _kf_isdir(dir-1) ? kf_west : dir-1;
44}
45
46struct kf_vec2(f32) kf_dtov2f(enum kf_direction dir)
47{
48 switch (dir) {
49 case kf_north:
50 return (struct kf_vec2(f32)){ -1, 0 };
51 case kf_east:
52 return (struct kf_vec2(f32)){ 0, 1 };
53 case kf_south:
54 return (struct kf_vec2(f32)){ 1, 0 };
55 case kf_west:
56 return (struct kf_vec2(f32)){ 0, -1 };
57 }
58 return (struct kf_vec2(f32)){ 0, 0 };
59}