2020-06-26 19:08:51 +02:00
|
|
|
#include "collide.h"
|
2020-06-27 14:47:58 +02:00
|
|
|
#include "define.h"
|
2021-05-02 20:21:41 +02:00
|
|
|
#include "util.h"
|
2020-06-26 19:08:51 +02:00
|
|
|
|
2021-04-30 02:12:24 +02:00
|
|
|
#define DEAD_COLLISION 3 // make collision with the deadly block less effective
|
2020-07-01 21:35:52 +02:00
|
|
|
|
2021-04-30 02:12:24 +02:00
|
|
|
char collide(int x, int y, char level[],
|
|
|
|
char block) // detect if player is in a block
|
2020-06-26 19:08:51 +02:00
|
|
|
{
|
2021-06-16 03:28:04 +02:00
|
|
|
if(collide_point(x, y, level, block) ||
|
|
|
|
collide_point(x + PLAYER_HEIGHT, y, level, block) ||
|
|
|
|
collide_point(x, y + PLAYER_HEIGHT, level, block) ||
|
|
|
|
collide_point(x + PLAYER_HEIGHT, y + PLAYER_HEIGHT, level, block))
|
2021-04-30 02:12:24 +02:00
|
|
|
return 1;
|
2020-06-30 17:12:33 +02:00
|
|
|
return 0;
|
2020-06-29 22:31:30 +02:00
|
|
|
}
|
|
|
|
|
2021-06-16 03:28:04 +02:00
|
|
|
char collide_gravity(int x, int y, char level[], char gravity, char block) {
|
|
|
|
if(gravity == 1) {
|
|
|
|
if(collide_point(x, y + PLAYER_HEIGHT, level, block) ||
|
|
|
|
collide_point(x + PLAYER_HEIGHT, y + PLAYER_HEIGHT, level, block))
|
|
|
|
return 1;
|
|
|
|
} else {
|
|
|
|
if(collide_point(x, y, level, block) ||
|
|
|
|
collide_point(x + PLAYER_HEIGHT, y, level, block))
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-08-16 23:12:04 +02:00
|
|
|
char collide_solid(int x, int y, char level[])
|
2020-06-29 22:31:30 +02:00
|
|
|
{
|
2021-04-30 02:12:24 +02:00
|
|
|
return collide(x, y, level, '1') || collide(x, y, level, '3') ||
|
|
|
|
collide(x, y, level, '4') || collide(x, y, level, 'c') ||
|
|
|
|
collide(x, y, level, 'C') || collide(x, y, level, 'B') ||
|
2021-05-09 21:58:51 +02:00
|
|
|
collide(x, y, level, 'i') || collide(x, y, level, 'H') ||
|
|
|
|
collide(x, y, level, 'r');
|
2020-06-27 14:47:58 +02:00
|
|
|
}
|
2020-07-01 21:35:52 +02:00
|
|
|
|
2021-06-16 03:28:04 +02:00
|
|
|
char collide_solid_gravity(int x, int y, char level[], char gravity)
|
|
|
|
{
|
|
|
|
return collide_gravity(x, y, level, gravity, '1') || collide_gravity(x, y, level, gravity, '3') ||
|
|
|
|
collide_gravity(x, y, level, gravity, '4') || collide_gravity(x, y, level, gravity, 'c') ||
|
|
|
|
collide_gravity(x, y, level, gravity, 'C') || collide_gravity(x, y, level, gravity, 'B') ||
|
|
|
|
collide_gravity(x, y, level, gravity, 'i') || collide_gravity(x, y, level, gravity, 'H') ||
|
|
|
|
collide_gravity(x, y, level, gravity, 'r');
|
|
|
|
}
|
|
|
|
|
2020-07-01 21:35:52 +02:00
|
|
|
char collide_dead(int x, int y, char level[])
|
|
|
|
{
|
2021-04-30 02:12:24 +02:00
|
|
|
return collide_point(x + DEAD_COLLISION, y + DEAD_COLLISION, level,
|
|
|
|
'd') ||
|
|
|
|
collide_point(x + PLAYER_HEIGHT - DEAD_COLLISION,
|
|
|
|
y + DEAD_COLLISION, level, 'd') ||
|
|
|
|
collide_point(x + DEAD_COLLISION,
|
|
|
|
y + PLAYER_HEIGHT - DEAD_COLLISION, level, 'd') ||
|
|
|
|
collide_point(x + PLAYER_HEIGHT - DEAD_COLLISION,
|
|
|
|
y + PLAYER_HEIGHT - DEAD_COLLISION, level, 'd') ||
|
|
|
|
collide_point(x + 1, y + 1, level, 'C') ||
|
|
|
|
collide_point(x + PLAYER_HEIGHT - 1, y + 1, level, 'C') ||
|
|
|
|
collide_point(x + 1, y + PLAYER_HEIGHT - 1, level, 'C') ||
|
|
|
|
collide_point(x + PLAYER_HEIGHT - 1, y + PLAYER_HEIGHT - 1,
|
|
|
|
level, 'C');
|
2020-07-01 21:35:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
char collide_point(int x, int y, char level[], char block)
|
|
|
|
{
|
2021-05-02 20:21:41 +02:00
|
|
|
return (level[(int)(x / TILE_HEIGHT) +
|
|
|
|
(int)(y / TILE_HEIGHT) * LEVEL_WIDTH] == block);
|
2020-07-01 21:35:52 +02:00
|
|
|
}
|
|
|
|
|
2020-08-16 23:12:04 +02:00
|
|
|
char collide_end(int x, int y, char level[])
|
2020-07-01 21:35:52 +02:00
|
|
|
{
|
2020-08-16 23:12:04 +02:00
|
|
|
return collide(x, y, level, 'e');
|
2020-07-01 21:35:52 +02:00
|
|
|
}
|
2020-08-20 01:05:39 +02:00
|
|
|
|
|
|
|
void collide_replace(int x, int y, char level[], char collide, char replace)
|
|
|
|
{
|
2021-04-30 02:12:24 +02:00
|
|
|
if (collide_point(x, y, level, collide)) {
|
2021-05-02 20:21:41 +02:00
|
|
|
level[((x) / TILE_HEIGHT) + ((y) / TILE_HEIGHT) * LEVEL_WIDTH] =
|
|
|
|
replace;
|
2020-08-20 01:05:39 +02:00
|
|
|
}
|
2021-04-30 02:12:24 +02:00
|
|
|
if (collide_point(x + PLAYER_HEIGHT, y, level, collide)) {
|
2021-05-02 20:21:41 +02:00
|
|
|
level[((x + PLAYER_HEIGHT) / TILE_HEIGHT) +
|
|
|
|
((y) / TILE_HEIGHT) * LEVEL_WIDTH] = replace;
|
2020-08-20 01:05:39 +02:00
|
|
|
}
|
2021-04-30 02:12:24 +02:00
|
|
|
if (collide_point(x, y + PLAYER_HEIGHT, level, collide)) {
|
2021-05-02 20:21:41 +02:00
|
|
|
level[((x) / TILE_HEIGHT) +
|
|
|
|
((y + PLAYER_HEIGHT) / TILE_HEIGHT) * LEVEL_WIDTH] =
|
|
|
|
replace;
|
2020-08-20 01:05:39 +02:00
|
|
|
}
|
2021-04-30 02:12:24 +02:00
|
|
|
if (collide_point(x + PLAYER_HEIGHT, y + PLAYER_HEIGHT, level,
|
|
|
|
collide)) {
|
2021-05-02 20:21:41 +02:00
|
|
|
level[((x + PLAYER_HEIGHT) / TILE_HEIGHT) +
|
|
|
|
((y + PLAYER_HEIGHT) / TILE_HEIGHT) * LEVEL_WIDTH] =
|
|
|
|
replace;
|
2020-08-20 01:05:39 +02:00
|
|
|
}
|
|
|
|
}
|
2021-05-02 20:21:41 +02:00
|
|
|
|
|
|
|
char collide_center(int x, int y, char level[], char block)
|
|
|
|
{
|
2021-05-04 01:46:11 +02:00
|
|
|
if (level[(int)((x + round_sup(PLAYER_HEIGHT / 2)) / TILE_HEIGHT) +
|
|
|
|
(int)((y + round_sup(PLAYER_HEIGHT / 2)) / TILE_HEIGHT) *
|
2021-05-02 20:21:41 +02:00
|
|
|
LEVEL_WIDTH] == block) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
2021-05-02 20:35:38 +02:00
|
|
|
}
|