aboutsummaryrefslogtreecommitdiff
path: root/world.c
blob: 18cc6cdec028e23f7ed9c3eac078b29a7d6ea2bc (plain) (blame)
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
#include "plat.h"
#include "world.h"

void init_world(World* w) {
	w->particle_count = 0;
	w->enemy_count = 0;
	w->deathzone_count = 0;
	w->frame = 0;
	init_player(&w->player);
}

Particle* inst_particle(
	World* w,
	int x,
	int y,
	int anim,
	int bmp
) {
	Particle* p;
	assert(w->particle_count < max_particles);
	p = &w->particles[w->particle_count++];
	init_particle(p, x, y, anim, bmp);
	return p;
}

Enemy* inst_enemy(
	World* w,
	Enemy_Type t,
	int x,
	int y
) {
	Enemy* e;
	assert(w->enemy_count < max_enemies);
	e = &w->enemies[w->enemy_count++];
	init_enemy(e, t, x, y);
	return e;
}

Deathzone* inst_deathzone(
	World* w,
	const Rect* r,
	int vx,
	int vy,
	int hp,
	int life,
	int friendly
) {
	Deathzone* d;
	assert(w->deathzone_count < max_deathzones);
	d = &w->deathzones[w->deathzone_count++];
	init_deathzone(d, r, vx, vy, hp, life, friendly);
	return d;
}

void update_world(World* w, const App* a) {
	int i;
	for (i = w->deathzone_count - 1; i >= 0; i--)
		if (update_deathzone(&w->deathzones[i]))
			w->deathzones[i] = w->deathzones[--w->deathzone_count];
	update_player(&w->player, w, a, &w->map);
	for (i = w->particle_count - 1; i >= 0; i--)
		if (update_particle(&w->particles[i]))
			w->particles[i] = w->particles[--w->particle_count];
	for (i = w->enemy_count - 1; i >= 0; i--)
		if (update_enemy(&w->enemies[i], w))
			w->enemies[i] = w->enemies[--w->enemy_count];
	w->frame++;
}

void ren_world(const World* w, struct Renderer* r) {
	int i;
	ren_player(&w->player, r);
	render_map(&w->map, r);
	for (i = 0; i < w->particle_count; i++)
		ren_particle(&w->particles[i], r);
	for (i = 0; i < w->enemy_count; i++)
		ren_enemy(&w->enemies[i], r);
	ren_hud(w, r);
}