aboutsummaryrefslogtreecommitdiff
path: root/gst/generate.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/generate.c')
-rw-r--r--gst/generate.c63
1 files changed, 50 insertions, 13 deletions
diff --git a/gst/generate.c b/gst/generate.c
index 1d8a340..3339ad7 100644
--- a/gst/generate.c
+++ b/gst/generate.c
@@ -10,6 +10,7 @@ void generate_init () {
}
float calc_unit_cost (infos *info, info_unit *u) {
+ if (u->chassis == -1) return 0;
stats_unit base;
stats_unit_compute(info, u, &base);
return stats_compute_cost(&info->cost_weights, &base);
@@ -24,6 +25,35 @@ int accept_cond (infos *info, info_unit *u, float cost_max) {
return 1;
}
+int gen_add_comp (infos *info, stats_unit *base, info_unit *u) {
+ int sel = rand() % 3;
+ if (sel == 0) {
+ for (int i=0; i<base->frame.slot_weapon; i++) {
+ if (u->weapons[i] == -1) {
+ u->weapons[i] = rand() % info->statslen[STATS_WEAPONS];
+ break;
+ }
+ }
+ }
+ else if (sel == 1) {
+ for (int i=0; i<base->frame.slot_armor; i++) {
+ if (u->armor[i] == -1) {
+ u->armor[i] = rand() % info->statslen[STATS_ARMOR];
+ break;
+ }
+ }
+ }
+ else if (sel == 2) {
+ for (int i=0; i<base->frame.slot_aug; i++) {
+ if (u->augs[i] == -1) {
+ u->augs[i] = rand() % info->statslen[STATS_AUGS];
+ break;
+ }
+ }
+ }
+ return sel;
+}
+
// generates randomly a valid unit
void gen_unit_attempt (infos *info, info_unit *u, float cost_max) {
info_unit_init(u);
@@ -32,27 +62,33 @@ void gen_unit_attempt (infos *info, info_unit *u, float cost_max) {
u->battery = rand() % info->statslen[STATS_BATTERY];
u->brain = rand() % info->statslen[STATS_BRAIN];
stats_unit_compute(info, u, &base);
- for (int i=0; i<base.frame.slot_weapon; i++) {
- u->weapons[i] = rand() % info->statslen[STATS_WEAPONS];
- if (!accept_cond(info, u, cost_max)) { u->weapons[i] = -1; return; }
- }
- for (int i=0; i<base.frame.slot_armor; i++) {
- u->armor[i] = rand() % info->statslen[STATS_ARMOR];
- if (!accept_cond(info, u, cost_max)) { u->armor[i] = -1; return; }
- }
- for (int i=0; i<base.frame.slot_aug; i++) {
- u->augs[i] = rand() % info->statslen[STATS_AUGS];
- if (!accept_cond(info, u, cost_max)) { u->augs[i] = -1; return; }
+ for (int i=0; i<8*8*16; i++) {
+ int sel = gen_add_comp(info, &base, u);
+ if (sel == 0) {
+ if (!accept_cond(info, u, cost_max)) {
+ u->weapons[i] = -1; return;
+ }
+ }
+ if (sel == 1) {
+ if (!accept_cond(info, u, cost_max)) {
+ u->armor[i] = -1; return;
+ }
+ }
+ if (sel == 2) {
+ if (!accept_cond(info, u, cost_max)) {
+ u->augs[i] = -1; return;
+ }
+ }
}
}
// selects the max cost generated unit
int generate_unit (infos *info, info_unit *u, float cost_max) {
- info_unit cand = *u;
+ info_unit cand;
info_unit candmax; info_unit_init(&candmax);
float cost;
for (int i=0; i<GENERATE_UNIT_MAX_ATTEMPTS; i++) {
- cand = *u;
+ info_unit_init(&cand);
gen_unit_attempt(info, &cand, cost_max);
if (accept_cond(info, &cand, cost_max)) {
if (calc_unit_cost(info, &cand)
@@ -63,6 +99,7 @@ int generate_unit (infos *info, info_unit *u, float cost_max) {
}
}
if (candmax.chassis != -1) {
+ printf("i generated!\n");
*u = candmax;
return 0;
}