From 2eef87c8970db643c4ef09e0fd9e8110c8193043 Mon Sep 17 00:00:00 2001 From: jacopo grandi Date: Sat, 20 Feb 2021 00:11:23 +0100 Subject: finish condition and bad cost function --- gst/gst.c | 29 +++++++++++++++++++-- gst/gst.h | 3 +++ gst/info.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- gst/info.h | 1 + gst/units.c | 9 ++++--- gst/units.h | 4 +-- 6 files changed, 122 insertions(+), 10 deletions(-) (limited to 'gst') diff --git a/gst/gst.c b/gst/gst.c index 09f3c1c..a97b4f9 100644 --- a/gst/gst.c +++ b/gst/gst.c @@ -66,6 +66,24 @@ void gst_tobattle (gamestate *gst) { gst->starttime = FLT_MAX; gst->turn = 0; gst->coveredtime = 0; + gst->turn_until_finish = 5; + gst->over = 0; +} + +void gst_toeditor(gamestate *gst) { + gst->playernum = 1; +} + +int gst_check_victory (gamestate *gst) { + int counts[gst->playernum], max=-1, imax = -1; + for (int i=0; iar.uslen; i++) { + counts[gst->ar.us[i].owner] ++; + if (counts[gst->ar.us[i].owner] > max) { + imax = gst->ar.us[i].owner; + max = counts[gst->ar.us[i].owner]; + } + } + return imax; } void gst_process (gamestate *gst, infos *info, float t) { @@ -76,8 +94,15 @@ void gst_process (gamestate *gst, infos *info, float t) { gst->turn ++; map *m; army *ar; gst_get_maparmy(gst, &m, &ar); - army_move(info, ar, m); - army_fire(info, ar, m); + int move = army_move(info, ar, m); + int fire = army_fire(info, ar, m); army_upkeep(info, ar, m); + printf("%d, %d\n", move, fire); + if (move == 0 && fire == 0) { + gst->turn_until_finish--; + } else { gst->turn_until_finish = 5; } + if (gst->turn_until_finish <= 0) { + gst->over = 1; + } } } \ No newline at end of file diff --git a/gst/gst.h b/gst/gst.h index 8acb699..171e213 100644 --- a/gst/gst.h +++ b/gst/gst.h @@ -19,12 +19,15 @@ typedef struct { float coveredtime; int turn; float turnspeed; + int turn_until_finish; + int over; } gamestate; void gst_init (gamestate *gst); void gst_destroy (gamestate *gst); void gst_get_maparmy(gamestate *gst, map **m, army **ar); void gst_tobattle (gamestate *gst); +void gst_toeditor (gamestate *gst); void gst_process (gamestate *gst, infos *info, float t); #endif \ No newline at end of file diff --git a/gst/info.c b/gst/info.c index 985b7dd..15c7c0b 100644 --- a/gst/info.c +++ b/gst/info.c @@ -130,8 +130,10 @@ float info_unit_get_health(infos *info, info_unit *u) { sum += info->augs[u->augs[i]].add_hp[lvl]; } } - sum += info->chassis[u->chassis].hp[lc]; - return sum; + float mult = (1 + sum/100.0f); + if (mult < 0) mult = 0; + float ret = info->chassis[u->chassis].hp[lc] * mult; + return ret; } float info_unit_get_speed(infos *info, info_unit *u) { @@ -175,6 +177,39 @@ float info_unit_get_damage_target (infos *info, info_unit *u, int w, return damage * mult; } +float info_unit_get_aoe (infos *info, info_unit *u, int w) { + int lc = u->levels[LEVEL_CHASSIS]; + float sum = 0; + for(int i=0; i<16; i++) { + if (u->augs[i] != -1 && info->chassis[u->chassis].slot_aug[lc]) { + int lvl = u->levels[LEVEL_AUGS+i]; + //sum += info->augs[u->augs[i]].add_aoe[lvl]; + } + } + int lw = u->levels[LEVEL_WEAPONS+w]; + float dam = info->weapons[u->weapons[w]].aoe[lw] + sum; + return dam; +} + +float info_unit_get_knockback (infos *info, info_unit *u, int w) { + int lc = u->levels[LEVEL_CHASSIS]; + float sum = 0; + for(int i=0; i<16; i++) { + if (u->augs[i] != -1 && info->chassis[u->chassis].slot_aug[lc]) { + int lvl = u->levels[LEVEL_AUGS+i]; + //sum += info->augs[u->augs[i]].add_knockback[lvl]; + } + } + int lw = u->levels[LEVEL_WEAPONS+w]; + float dam = info->weapons[u->weapons[w]].knockback[lw] + sum; + return dam; +} + +float info_unit_get_stun (infos *info, info_unit *u, int w) { + // TODO + return 0; +} + float info_unit_get_cooldown(infos *info, info_unit *u, int w) { int lc = u->levels[LEVEL_CHASSIS]; float sum = 0; @@ -228,6 +263,53 @@ float info_unit_get_armor(infos *info, info_unit *u, int d) { return sum; } +float info_unit_get_cost (infos *info, info_unit *u) { + // see design/notes.txt:implement cost function + float sum = 0; + int lc = u->levels[LEVEL_CHASSIS]; + info_chassis *chassis = info->chassis+u->chassis; + float sumchassis = 0; + sumchassis += powf(2, chassis->slot_weapon[lc])*20; + sumchassis += powf(2, chassis->slot_armor[lc])*10; + sumchassis += powf(2, chassis->slot_aug[lc])*5; + sumchassis += chassis->weight_max[lc]/5; + sumchassis += chassis->hp[lc]/20; + sumchassis += chassis->speed[lc]*32; + sum += sumchassis; + if (u->battery != -1) { + int lb = u->levels[LEVEL_BATTERY]; + info_battery *battery = info->batteries+u->battery; + float sumbattery = 0; + sumbattery += battery->capacity[lb]; + sum += sumbattery; + } + for(int i=0; i<8; i++) { + int lw = u->levels[LEVEL_WEAPONS+i]; + int la = u->levels[LEVEL_ARMOR+i]; + if (u->weapons[i] != -1 && islot_weapon[lc]) { + info_weapon *weapon = info->weapons+u->weapons[i]; + float sumweap = 0; + float dam = info_unit_get_damage(info, u, i); + float cool = info_unit_get_cooldown(info, u, i); + float damtot = dam / cool; + float aoe = info_unit_get_aoe(info, u, i); + float knockback = info_unit_get_knockback(info, u, i); + float stun = info_unit_get_stun(info, u, i); + float mult = 1+aoe*5 + 10; + damtot = damtot*mult; + damtot += knockback * 20 + stun * 50; + sumweap = damtot; + sum += sumweap; + } + } + for(int t=0; t<7; t++) { + float armortot = info_unit_get_armor(info, u, t) * 3; + sum += armortot; + } + + return sum; +} + void weapon_init (info_weapon *w) { strcpy(w->name, "nameless"); diff --git a/gst/info.h b/gst/info.h index 8e7fdaf..9219f8b 100644 --- a/gst/info.h +++ b/gst/info.h @@ -116,6 +116,7 @@ float info_unit_get_damage_target(infos *info, info_unit *u, int w, float info_unit_get_cooldown(infos *info, info_unit *u, int w); float info_unit_get_range(infos *info, info_unit *u, int w); float info_unit_get_armor(infos *info, info_unit *u, int d); +float info_unit_get_cost(infos *info, info_unit *u); void info_load (infos *info); diff --git a/gst/units.c b/gst/units.c index dbf177b..b247e3c 100644 --- a/gst/units.c +++ b/gst/units.c @@ -168,18 +168,18 @@ int army_move_step (infos *info, army *ar, map *m) { else return 1; } -void army_move (infos *info, army *ar, map *m) { +int army_move (infos *info, army *ar, map *m) { for (int i=0; iuslen; i++) { ar->us[i].move_points += info_unit_get_speed(info, &ar->us[i].info); } - int iter = 0, finished = 0; + int iter = 0, finished = army_move_step(info, ar, m); for (; iter<5 && !finished; iter++) { finished = army_move_step(info, ar, m); } - //printf("stepped %d %d\n", iter, finished); + return iter; } -void army_fire (infos *info, army *ar, map *m) { +int army_fire (infos *info, army *ar, map *m) { for (int i=0; iuslen; i++) { unit *u = ar->us+i; int lw = u->info.levels[LEVEL_CHASSIS]; @@ -216,6 +216,7 @@ void army_fire (infos *info, army *ar, map *m) { unit_dead(ar, m, dmgs[i].u); } } + return dmgslen; } void army_upkeep (infos *info, army *ar, map *m) { diff --git a/gst/units.h b/gst/units.h index 615eaa7..8e78d8d 100644 --- a/gst/units.h +++ b/gst/units.h @@ -34,8 +34,8 @@ void army_grid_init(army *ar); void army_init (army *ar, map *m); void army_destory(army *ar); void army_spawn (army *ar, map *m, unit u); -void army_move (infos *info, army *ar, map *m); -void army_fire (infos *info, army *ar, map *m); +int army_move (infos *info, army *ar, map *m); +int army_fire (infos *info, army *ar, map *m); void army_upkeep (infos *info, army *ar, map *m); #endif \ No newline at end of file -- cgit v1.2.3-54-g00ecf