balancing and level 1

This commit is contained in:
Lephenixnoir 2022-03-19 19:21:30 +00:00
parent b844a1d434
commit 34ba2eeece
Signed by: Lephenixnoir
GPG Key ID: 1BBA026E13FC0495
6 changed files with 73 additions and 49 deletions

View File

@ -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

View File

@ -7,19 +7,23 @@
#include <stdarg.h>
#include <gint/defs/util.h>
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;

View File

@ -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);

View File

@ -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;

View File

@ -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)

View File

@ -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)