From 34ba2eeeced5903e98a1b5e51296a78ba6e158c3 Mon Sep 17 00:00:00 2001 From: Lephenixnoir Date: Sat, 19 Mar 2022 19:21:30 +0000 Subject: [PATCH] balancing and level 1 --- assets-cg/levels/lv1.txt | 13 +++++----- src/comp/fighter.c | 36 +++++++++++++++++++--------- src/comp/fighter.h | 9 +++---- src/enemies.c | 2 +- src/item.c | 52 +++++++++++++++++++++++----------------- src/player.c | 10 ++++---- 6 files changed, 73 insertions(+), 49 deletions(-) diff --git a/assets-cg/levels/lv1.txt b/assets-cg/levels/lv1.txt index 89e4485..d74d8f3 100644 --- a/assets-cg/levels/lv1.txt +++ b/assets-cg/levels/lv1.txt @@ -7,14 +7,15 @@ spawner: 18,5 spawner: 5,7 wave: 9s 3*slime/1 +wave: 12s 6*slime/1 item: armor1 -wave: 12s 12*slime/1 +wave: 2s 1*bat/2 +wave: 20s 10*slime/1 +wave: 8s 4*bat/2 item: sword1 -wave: 18s 10*slime/1 2*bat/2 -wave: 8s 6*bat/2 +wave: 8s 12*slime/1 4*bat/2 +delay: 4s item: potion_hp -wave: 8s 16*slime/1 6*bat/2 -delay: 2s wave: 6s 8*slime/1 8*bat/2 2*fire_slime/4 -delay: 2s +delay: 6s wave: 8s 12*bat/2 4*fire_slime/4 1*gunslinger/8 diff --git a/src/comp/fighter.c b/src/comp/fighter.c index 02519cf..e41fd74 100644 --- a/src/comp/fighter.c +++ b/src/comp/fighter.c @@ -7,19 +7,23 @@ #include #include -fighter_stat_model_t fighter_stat_model_add(int amount, ...) +fighter_stat_model_t fighter_stat_model_mul(int amount, ...) { va_list args; va_start(args, amount); - fighter_stat_model_t model = { 0 }; + fighter_stat_model_t model = { + .HP = fix(1), + .ATK = fix(1), + .DEF = fix(1), + .MAG = fix(1), }; for(int i = 0; i < amount; i++) { fighter_stat_model_t op = va_arg(args, fighter_stat_model_t); - model.HP += op.HP; - model.ATK += op.ATK; - model.DEF += op.DEF; - model.MAG += op.MAG; + model.HP = fmul(model.HP , op.HP); + model.ATK = fmul(model.ATK, op.ATK); + model.DEF = fmul(model.DEF, op.DEF); + model.MAG = fmul(model.MAG, op.MAG); } va_end(args); @@ -35,13 +39,23 @@ static int instantiate_stat(fixed_t affinity, fixed_t multiplier, int level) } fighter_stat_model_t fighter_stat_model_instantiate( - fighter_stat_model_t const *model, int level, fixed_t multiplier) + fighter_stat_model_t const *model, fighter_stat_model_t const *equipment, + int level, fixed_t hp_multiplier) { fighter_stat_model_t m; - m.HP = fix(instantiate_stat(model->HP, 2 * multiplier, level)); + m.HP = fix(instantiate_stat(model->HP, 3 * hp_multiplier, level)); m.ATK = fix(instantiate_stat(model->ATK, fix(1.6), level)); - m.DEF = fix(instantiate_stat(model->DEF, fix(0.9), level)); + m.DEF = fix(instantiate_stat(model->DEF, fix(0.7), level)); m.MAG = fix(instantiate_stat(model->MAG, fix(1.2), level)); + + /* Apply equipment boost */ + if(equipment) { + m.HP = fmul(m.HP, equipment->HP); + m.ATK = fmul(m.ATK, equipment->ATK); + m.DEF = fmul(m.DEF, equipment->DEF); + m.MAG = fmul(m.MAG, equipment->MAG); + } + return m; } @@ -59,11 +73,11 @@ int fighter_damage(entity_t *e, int base_damage) if(f->HP == 0) return 0; - base_damage -= f->DEF; - if(base_damage <= 0) return 0; + base_damage = max(base_damage - f->DEF, 0); int variation = (base_damage >= 4) ? (rand() % (base_damage / 4)) : 0; int damage = (base_damage * 7) / 8 + variation; + damage = max(damage, 1); if(f->HP < damage) f->HP = 0; else f->HP -= damage; diff --git a/src/comp/fighter.h b/src/comp/fighter.h index a8d0189..ec8cf19 100644 --- a/src/comp/fighter.h +++ b/src/comp/fighter.h @@ -54,12 +54,13 @@ typedef struct } fighter_t; -/* Adds two or more stat models */ -fighter_stat_model_t fighter_stat_model_add(int amount, ...); +/* Multiply equipment stat modifiers */ +fighter_stat_model_t fighter_stat_model_mul(int amount, ...); -/* Instantiate a statistics model */ +/* Instantiate a statistics model with optional equipment and HP multiplier */ fighter_stat_model_t fighter_stat_model_instantiate( - fighter_stat_model_t const *model, int level, fixed_t multiplier); + fighter_stat_model_t const *model, fighter_stat_model_t const *equipment, + int level, fixed_t hp_multiplier); /* Initialize fighter's stats by using the instantiated stat model */ void fighter_set_stats(fighter_t *f, fighter_stat_model_t const *instance); diff --git a/src/enemies.c b/src/enemies.c index 38d688a..9524ca5 100644 --- a/src/enemies.c +++ b/src/enemies.c @@ -158,7 +158,7 @@ entity_t *enemy_make(int enemy_id) memset(f, 0, sizeof *f); fighter_stat_model_t inst = fighter_stat_model_instantiate(&data->stats, - data->level, fix(1.0)); + NULL, data->level, fix(1.0)); fighter_set_stats(f, &inst); f->HP = f->HP_max; f->combo_length = 1; diff --git a/src/item.c b/src/item.c index 761ae2b..45a67c9 100644 --- a/src/item.c +++ b/src/item.c @@ -112,30 +112,38 @@ int item_equipment_slot(int item) fighter_stat_model_t item_stat_model(int item) { + fighter_stat_model_t m = { + .HP = fix(1.0), + .ATK = fix(1.0), + .DEF = fix(1.0), + .MAG = fix(1.0), + }; + switch(item) { - case ITEM_SWORD1: return (fighter_stat_model_t){ - .ATK = fix(0.4), - .MAG = fix(0.2), - }; - case ITEM_SWORD2: return (fighter_stat_model_t){ - .ATK = fix(0.8), - .MAG = fix(0.3), - }; - case ITEM_SCEPTER1: return (fighter_stat_model_t){ - .ATK = fix(0.15), - .DEF = fix(0.1), - .MAG = fix(0.3), - }; - case ITEM_SCEPTER2: return (fighter_stat_model_t){ - .ATK = fix(0.3), - .DEF = fix(0.15), - .MAG = fix(0.6), - }; - case ITEM_ARMOR1: return (fighter_stat_model_t){ - .DEF = fix(0.25), - }; - default: return (fighter_stat_model_t){ 0 }; + case ITEM_SWORD1: + m.ATK = fix(1.4); + m.MAG = fix(1.2); + break; + case ITEM_SWORD2: + m.ATK = fix(1.8); + m.MAG = fix(1.3); + break; + case ITEM_SCEPTER1: + m.ATK = fix(1.15); + m.DEF = fix(1.1); + m.MAG = fix(1.3); + break; + case ITEM_SCEPTER2: + m.ATK = fix(1.25); + m.DEF = fix(1.15); + m.MAG = fix(1.6); + break; + case ITEM_ARMOR1: + m.DEF = fix(1.3); + break; } + + return m; } void item_skills(int item, int *skill1, int *skill2, int *skill3) diff --git a/src/player.c b/src/player.c index 41a5af8..aef76d0 100644 --- a/src/player.c +++ b/src/player.c @@ -38,17 +38,17 @@ fighter_stat_model_t player_compute_stats(entity_t *e, int *equips) { player_data_t *p = getcomp(e, fighter)->player; - fighter_stat_model_t m[4] = { - p->stat_model, + fighter_stat_model_t m[3] = { item_stat_model(equips[0]), item_stat_model(equips[1]), item_stat_model(equips[2]), }; - fighter_stat_model_t model = fighter_stat_model_add(4, - m[0], m[1], m[2], m[3]); + fighter_stat_model_t equip_model = fighter_stat_model_mul(3, + m[0], m[1], m[2]); - return fighter_stat_model_instantiate(&model, p->xp_level, fix(2.0)); + return fighter_stat_model_instantiate(&p->stat_model, &equip_model, + p->xp_level, fix(3.0)); } void player_compute_skills(entity_t *e, int *equips, int *skills)