aboutsummaryrefslogtreecommitdiff
path: root/gst/units.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/units.c')
-rw-r--r--gst/units.c53
1 files changed, 34 insertions, 19 deletions
diff --git a/gst/units.c b/gst/units.c
index b699e26..785230e 100644
--- a/gst/units.c
+++ b/gst/units.c
@@ -31,14 +31,16 @@ void army_destory(army *ar) {
void unit_init (infos *info, army *ar, map *m,
int x, int y, info_unit *iu, int owner, unit *u)
{
+ stats_unit base; stats_unit_compute(info, iu, &base);
u->pos[0] = x*m->ts; u->pos[1] = y*m->ts;
u->gridpos[0] = x; u->gridpos[1] = y;
u->info = *iu;
u->owner = owner;
- u->hp = info_unit_get_health(info, iu);
+ u->hp = base.frame.hp;
u->move_points = 0;
- u->charge = info_unit_get_capacity(info, iu);
+ u->charge = base.frame.capacity;
for (int i=0; i<8; u->cooldown[i] = 1, i++);
+ for (int i=0; i<7; u->reduced_armor[i] = 0, i++);
}
void army_spawn (army *ar, map *m, unit u) {
@@ -102,7 +104,7 @@ void unit_search (infos *info, army *ar, map *m, unit *u,
typedef struct { unit *u; int *dir; int done; } mcom;
-int army_move_step (infos *info, army *ar, map *m) {
+int army_move_step (infos *info, army *ar, map *m, stats_unit *ustats) {
int dirs[4][2] = { {1, 0},{0, 1},{-1,0},{0,-1} };
mcom mcs[ar->uslen];
int mclen = 0;
@@ -116,7 +118,11 @@ int army_move_step (infos *info, army *ar, map *m) {
if (u->charge <= 0) continue;
// search target inside max range
unit *t[32];
- float maxrange = info_unit_get_maxrange(info, &u->info);
+ float maxrange = 0;
+ for (int w=0; w<ustats[i].weaponlen; w++) {
+ float range = ustats[i].weapon[w].range;
+ if (maxrange < range) maxrange = range;
+ }
unit_search(info, ar, m, u, t, maxrange);
// stop if found
if (t[0] != NULL) { continue; }
@@ -173,22 +179,24 @@ int army_move_step (infos *info, army *ar, map *m) {
else return 1;
}
-int army_move (infos *info, army *ar, map *m) {
+int army_move (infos *info, army *ar, map *m, stats_unit *ustats) {
for (int i=0; i<ar->uslen; i++) {
- ar->us[i].move_points += info_unit_get_speed(info, &ar->us[i].info);
+ ar->us[i].move_points += ustats[i].frame.speed;
}
- int iter = 0, finished = army_move_step(info, ar, m);
+ int iter = 0, finished = army_move_step(info, ar, m, ustats);
for (; iter<5 && !finished; iter++) {
- finished = army_move_step(info, ar, m);
+ finished = army_move_step(info, ar, m, ustats);
}
return iter;
}
-int army_fire (infos *info, army *ar, map *m, a_dmg dmgs[]) {
+int army_fire (infos *info, army *ar, map *m, a_dmg dmgs[],
+ stats_unit *ustats)
+{
for (int i=0; i<ar->uslen; i++) {
unit *u = ar->us+i;
int lw = u->info.levels[LEVEL_CHASSIS];
- for (int j=0; j<info->chassis[u->info.chassis].slot_weapon[lw]; j++) {
+ for (int j=0; j<ustats[i].weaponlen; j++) {
u->cooldown[j] += 1;
}
}
@@ -199,19 +207,26 @@ int army_fire (infos *info, army *ar, map *m, a_dmg dmgs[]) {
if (u->hp <= 0) continue;
if (u->charge <= 0) continue;
int lw = u->info.levels[LEVEL_CHASSIS];
- for (int j=0; j<info->chassis[u->info.chassis].slot_weapon[lw]; j++) {
- if (u->info.weapons[j] == -1) continue;
+ for (int j=0; j<ustats[i].weaponlen; j++) {
if (u->cooldown[j] <= 0) continue;
- float range = info_unit_get_range(info, &u->info, j);
+ float range = ustats[i].weapon[j].range;
unit_search(info, ar, m, u, t, range);
if (t[0]!=NULL) {
dmgs[dmgslen].u = u;
dmgs[dmgslen].t = t[0];
- dmgs[dmgslen].dam = info_unit_get_damage_target(
- info, &u->info, j, &t[0]->info);
+
+ int t_i = 0;
+ for (int k=0; k<ar->uslen; k++) {
+ if (ar->us+k == t[0]) { t_i = k; break; }
+ }
+ float dam = stats_compute_damage(
+ &ustats[i].weapon[j],
+ &ustats[t_i].frame, u->reduced_armor);
+
+ dmgs[dmgslen].dam = dam;
dmgslen++;
- u->cooldown[j] -= info_unit_get_cooldown(info, &u->info, j);
- u->charge -= info_unit_get_charge_per_shot(info, &u->info, j);
+ u->cooldown[j] -= ustats[i].weapon[j].cooldown;
+ u->charge -= ustats[i].weapon[j].charge_per_shot;
if (u->charge < 0) u->charge = 0;
}
}
@@ -225,12 +240,12 @@ int army_fire (infos *info, army *ar, map *m, a_dmg dmgs[]) {
return dmgslen;
}
-void army_upkeep (infos *info, army *ar, map *m) {
+void army_upkeep (infos *info, army *ar, map *m, stats_unit *ustats) {
// battery drain or recharge
for (int i=0; i<ar->uslen; i++) {
unit *u = ar->us+i;
if (u->hp <= 0) continue;
- u->charge -= info_unit_get_upkeep(info, &u->info);
+ u->charge -= ustats[i].frame.upkeep;
if (u->charge < 0) u->charge = 0;
}
} \ No newline at end of file