diff --git a/src/enemies.c b/src/enemies.c index 211877e..d4ca1a7 100644 --- a/src/enemies.c +++ b/src/enemies.c @@ -4,55 +4,55 @@ static enemy_t const slime = { .name = "Slime", - .hitbox = (frect_t){ -FIX(3)/16, FIX(4)/16, -FIX(2)/16, FIX(3)/16 }, - .sprite = (frect_t){ -FIX(5)/16, FIX(5)/16, -FIX(4)/16, FIX(3)/16 }, + .hitbox = (frect_t){ -fix(3)/16, fix(4)/16, -fix(2)/16, fix(3)/16 }, + .sprite = (frect_t){ -fix(5)/16, fix(5)/16, -fix(4)/16, fix(3)/16 }, .anim_idle = { anim_slime_idle_left, anim_slime_idle_right }, .anim_death = { anim_slime_death_left, anim_slime_death_right }, .movement_params = { - .max_speed = FIX(1), - .propulsion = FIX(12), + .max_speed = fix(1), + .propulsion = fix(12), }, .HP = { - .base = FIX(10), - .growth = FIX(5), - .affinity = FIX(3), + .base = fix(10), + .growth = fix(5), + .affinity = fix(3), }, .ATK = { - .base = FIX(5), - .growth = FIX(2), - .affinity = FIX(1), + .base = fix(5), + .growth = fix(2), + .affinity = fix(1), }, .DEF = { - .base = FIX(2), - .growth = FIX(1), - .affinity = FIX(1)/2, + .base = fix(2), + .growth = fix(1), + .affinity = fix(0.5), }, }; static enemy_t const bat = { .name = "Bat", - .hitbox = (frect_t){ -FIX(3)/16, FIX(4)/16, -FIX(2)/16, FIX(3)/16 }, - .sprite = (frect_t){ -FIX(5)/16, FIX(5)/16, -FIX(4)/16, FIX(3)/16 }, + .hitbox = (frect_t){ -fix(3)/16, fix(4)/16, -fix(2)/16, fix(3)/16 }, + .sprite = (frect_t){ -fix(5)/16, fix(5)/16, -fix(4)/16, fix(3)/16 }, .anim_idle = { anim_bat_idle_left, anim_bat_idle_right }, .anim_death = { anim_bat_death_left, anim_bat_death_right }, .movement_params = { - .max_speed = FIX(2), - .propulsion = FIX(8), + .max_speed = fix(1.8), + .propulsion = fix(8), }, .HP = { - .base = FIX(8), - .growth = FIX(4), - .affinity = FIX(2), + .base = fix(8), + .growth = fix(4), + .affinity = fix(2), }, .ATK = { - .base = FIX(8), - .growth = FIX(2), - .affinity = FIX(2), + .base = fix(8), + .growth = fix(2), + .affinity = fix(2), }, .DEF = { - .base = FIX(2), - .growth = FIX(2), - .affinity = FIX(1), + .base = fix(2), + .growth = fix(2), + .affinity = fix(1), }, }; diff --git a/src/entities.c b/src/entities.c index 92940d1..998752e 100644 --- a/src/entities.c +++ b/src/entities.c @@ -201,7 +201,7 @@ static bool slash_hit_apply(game_t *game, effect_area_t *ea, entity_t *e) int damage = entity_damage(e, ea->data.slash.strength); /* Knockback */ - fixed_t r = (rand() & (fix(1)/4-1)) + fix(7)/8; + fixed_t r = (rand() & (fix(0.25)-1)) + fix(0.875); /* Half knockback against players */ if(e->identity == 0) r /= 2; @@ -213,7 +213,7 @@ static bool slash_hit_apply(game_t *game, effect_area_t *ea, entity_t *e) particle_damage_t *p = malloc(sizeof *p); p->particle.type = PARTICLE_DAMAGE; p->particle.age = 0; - p->particle.pos = (fpoint_t){ e->movement.x, e->movement.y - fix(1)/2 }; + p->particle.pos = (fpoint_t){ e->movement.x, e->movement.y - fix(0.5) }; p->damage = damage; p->color = (e->identity == 0) ? C_RED : C_WHITE; game_add_particle(game, &p->particle); diff --git a/src/fixed.h b/src/fixed.h index e11d2fd..6b52f17 100644 --- a/src/fixed.h +++ b/src/fixed.h @@ -28,13 +28,7 @@ static inline fixed_t fdiv(fixed_t left, fixed_t right) return d / right; } -static inline fixed_t fix(int constant) -{ - return constant << 16; -} - -/* Compile-time version */ -#define FIX(c) ((c) * 65536) +#define fix(x) ((int)((x) * 65536)) static inline fixed_t fixdouble(double constant) { @@ -83,7 +77,7 @@ static inline fixed_t feasein(fixed_t x) static inline fixed_t fease(fixed_t x) { - if(x <= fix(1) / 2) { + if(x <= fix(0.5)) { return 2 * fmul(x, x); } else { diff --git a/src/game.c b/src/game.c index 1ebaed4..c5c8f84 100644 --- a/src/game.c +++ b/src/game.c @@ -263,7 +263,7 @@ void game_spawn_enemies(game_t *g) if(s->time > g->time_wave) break; entity_t *e = enemy_spawn(s->identity, s->level); - fpoint_t pos = { fix(s->x) + fix(1)/2, fix(s->y) + fix(1)/2 }; + fpoint_t pos = { fix(s->x) + fix(0.5), fix(s->y) + fix(0.5) }; game_spawn_entity(g, e, pos); g->wave_spawned++; } diff --git a/src/geometry.c b/src/geometry.c index a1e3dff..b2e2193 100644 --- a/src/geometry.c +++ b/src/geometry.c @@ -27,7 +27,7 @@ irect_t rect_f2i(frect_t r) fpoint_t point_i2f_center(ipoint_t p) { - return (fpoint_t){ fix(p.x) + fix(1)/2, fix(p.y) + fix(1)/2 }; + return (fpoint_t){ fix(p.x) + fix(0.5), fix(p.y) + fix(0.5) }; } //--- diff --git a/src/geometry.h b/src/geometry.h index 05fc048..7277f04 100644 --- a/src/geometry.h +++ b/src/geometry.h @@ -46,7 +46,7 @@ typedef struct irect irect_t; fpoint_t point_i2f(ipoint_t); frect_t rect_i2f(irect_t); -/* Same as point_i2f() but adds +fix(1)/2 at each coordinate. */ +/* Same as point_i2f() but adds +0.5 at each coordinate. */ fpoint_t point_i2f_center(ipoint_t); /* Functions converting fixed-point shapes to integer. */ diff --git a/src/level.c b/src/level.c index a48e3a3..326c309 100644 --- a/src/level.c +++ b/src/level.c @@ -16,20 +16,20 @@ level_t lv_1 = { /* Wave 1: Just some slimes */ { .enemy_count = 6, .enemies = (level_wave_spawn_t []){ - { ENEMY_SLIME, 1, 2,1, FIX(0)/2 }, - { ENEMY_SLIME, 1, 19,9, FIX(1)/2 }, - { ENEMY_SLIME, 1, 2,1, FIX(2)/2 }, - { ENEMY_SLIME, 1, 19,9, FIX(3)/2 }, - { ENEMY_SLIME, 2, 2,1, FIX(4)/2 }, - { ENEMY_SLIME, 2, 19,9, FIX(5)/2 }, + { ENEMY_SLIME, 1, 2,1, fix(0.0) }, + { ENEMY_SLIME, 1, 19,9, fix(0.5) }, + { ENEMY_SLIME, 1, 2,1, fix(1.0) }, + { ENEMY_SLIME, 1, 19,9, fix(1.5) }, + { ENEMY_SLIME, 2, 2,1, fix(2.0) }, + { ENEMY_SLIME, 2, 19,9, fix(2.5) }, }}, /* Wave 2: Stronger slimes and a bat */ { .enemy_count = 4, .enemies = (level_wave_spawn_t []){ - { ENEMY_SLIME, 2, 2,1, FIX(0)/2 }, - { ENEMY_SLIME, 2, 19,9, FIX(0)/2 }, - { ENEMY_BAT, 1, 2,1, FIX(2)/2 }, - { ENEMY_BAT, 1, 19,9, FIX(2)/2 }, + { ENEMY_SLIME, 2, 2,1, fix(0.0) }, + { ENEMY_SLIME, 2, 19,9, fix(0.0) }, + { ENEMY_BAT, 1, 2,1, fix(1.0) }, + { ENEMY_BAT, 1, 19,9, fix(1.0) }, }}, }, }; diff --git a/src/main.c b/src/main.c index a4c0a9d..e0fad42 100644 --- a/src/main.c +++ b/src/main.c @@ -83,8 +83,8 @@ int main(void) struct tile *t = map_tile(m, x, y); if(t && !t->solid) break; } - player->movement.x = fix(x) + fix(1) / 2; - player->movement.y = fix(y) + fix(1) / 2; + player->movement.x = fix(x) + fix(0.5); + player->movement.y = fix(y) + fix(0.5); game_add_entity(&game, player); game.player = player; @@ -284,9 +284,9 @@ int main(void) } if(ev.key == KEY_LN) - emp_player.dash_speed += fix(1) / 2; + emp_player.dash_speed += fix(0.5); if(ev.key == KEY_LEFTP) { - emp_player.dash_speed -= fix(1) / 2; + emp_player.dash_speed -= fix(0.5); if(emp_player.dash_speed <= 0) emp_player.dash_speed = 0; } @@ -400,8 +400,8 @@ int main(void) fpoint_t dir = fdir(facing); fpoint_t anchor = rect_center(entity_sprite(e)); - anchor.x += fmul(fix(3)/4, dir.x); - anchor.y += fmul(fix(3)/4, dir.y); + anchor.x += fmul(fix(0.75), dir.x); + anchor.y += fmul(fix(0.75), dir.y); effect_area_t *area = effect_area_new(EFFECT_HIT); area->sprite = hitbox; @@ -423,14 +423,14 @@ int main(void) /* Player attack */ if(player->HP > 0 && attack && !player->current_attack) { frect_t hitbox = { - -fix(5)/8, fix(5)/8, -fix(1)/4, fix(1)/4, + -fix(10)/16, fix(10)/16, -fix(4)/16, fix(4)/16, }; hitbox = rect_rotate(hitbox, UP, player->movement.facing); fpoint_t dir = fdir(player->movement.facing); fpoint_t anchor = rect_center(entity_sprite(player)); - anchor.x += fmul(fix(3)/4, dir.x); - anchor.y += fmul(fix(3)/4, dir.y); + anchor.x += fmul(fix(0.75), dir.x); + anchor.y += fmul(fix(0.75), dir.y); effect_area_t *area = effect_area_new(EFFECT_SLASH); area->sprite = hitbox; diff --git a/src/map.c b/src/map.c index e9f9007..607f418 100644 --- a/src/map.c +++ b/src/map.c @@ -6,10 +6,10 @@ frect_t tile_shape(struct tile const *tile) if(!tile->solid) return (frect_t){ 0 }; return (frect_t){ - .l = -fix(1)/2, - .r = fix(1)/2, - .t = -fix(1)/2, - .b = fix(1)/2, + .l = -fix(0.5), + .r = fix(0.5), + .t = -fix(0.5), + .b = fix(0.5), }; } @@ -34,7 +34,7 @@ bool map_collides(map_t const *m, frect_t hitbox) struct tile *t = map_tile(m, x, y); if(!t || !t->solid) continue; - fpoint_t center = { fix(x) + fix(1)/2, fix(y) + fix(1)/2 }; + fpoint_t center = { fix(x) + fix(0.5), fix(y) + fix(0.5) }; frect_t tile_hitbox = rect_translate(tile_shape(t), center); if(rect_collide(hitbox, tile_hitbox)) diff --git a/src/settings.h b/src/settings.h index 72d4f0c..bc53ed5 100644 --- a/src/settings.h +++ b/src/settings.h @@ -25,9 +25,5 @@ #define CAMERA_SPEED_Y fix(3) /* Ideal frame rate (FPS) */ #define FRAME_RATE 30 -/* Player reach for attacks, in tiles */ -#define ATTACK_REACH fix(1) -/* Width of the cone where attacks reach, in cosine */ -#define ATTACK_ANGLE_COS fix(1)/2 /* 60 degrees */ -/* Knockback speed applied to hit enemies */ +/* Knockback speed when entities are hit */ #define KNOCKBACK_SPEED fix(15)