Updated entities.

This commit is contained in:
Steve 2018-01-24 19:04:36 +00:00
parent 699c66485c
commit a29e81d131
5 changed files with 177 additions and 12 deletions

View File

@ -81,18 +81,56 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define MAX_WIDGET_OPTIONS 8 #define MAX_WIDGET_OPTIONS 8
#define ET_ENEMY 0 enum
#define ET_KEY 1 {
#define ET_MIA 2 ET_EFFECT,
#define ET_BOB 3 ET_TRAP,
#define ET_DESTRUCTABLE 4 ET_BOB,
#define ET_BOSS 5 ET_ENEMY,
ET_TEEKA,
ET_BOSS,
ET_HEART_CELL,
ET_KEY,
ET_ITEM,
ET_CONSUMABLE,
ET_MIA,
ET_DECORATION,
ET_DOOR,
ET_LIFT,
ET_PUSHBLOCK,
ET_DESTRUCTABLE,
ET_POWER_POINT,
ET_CARD_READER,
ET_PRESSURE_PLATE,
ET_TELEPORTER,
ET_ITEM_PAD,
ET_POOL,
ET_EXIT,
ET_INFO_POINT
};
#define EF_NONE 0 #define EF_NONE 0
#define EF_HEART_CELL (2 << 0) #define EF_WEIGHTLESS (2 << 0)
#define EF_WEIGHTLESS (2 << 1) #define EF_BOUNCES (2 << 1)
#define EF_BOMB_SHIELD (2 << 2) #define EF_TELEPORTING (2 << 2)
#define EF_IMMUNE (2 << 3) #define EF_NO_ENVIRONMENT (2 << 3)
#define EF_SWIMS (2 << 4)
#define EF_HALT_AT_EDGE (2 << 5)
#define EF_NO_CLIP (2 << 6)
#define EF_EXPLODES (2 << 7)
#define EF_IGNORE_BULLETS (2 << 8)
#define EF_FLICKER (2 << 9)
#define EF_FRICTIONLESS (2 << 10)
#define EF_WATER_BREATHING (2 << 11)
#define EF_IMMUNE (2 << 12)
#define EF_BOMB_SHIELD (2 << 13)
#define EF_GONE (2 << 14)
#define EF_KILL_OFFSCREEN (2 << 15)
#define EF_ALWAYS_PROCESS (2 << 16)
#define EF_NO_TELEPORT (2 << 17)
#define GRAVITY_POWER 0.5f
#define FRICTION 0.75f
enum enum
{ {
@ -153,6 +191,11 @@ enum
PLANE_FOREGROUND PLANE_FOREGROUND
}; };
enum
{
ENV_AIR
};
enum enum
{ {
PT_LINE, PT_LINE,

View File

@ -84,6 +84,7 @@ typedef struct {
} Delegate; } Delegate;
struct Entity { struct Entity {
unsigned long uniqueId;
char name[MAX_NAME_LENGTH]; char name[MAX_NAME_LENGTH];
int type; int type;
float x; float x;
@ -91,9 +92,12 @@ struct Entity {
int w; int w;
int h; int h;
int health; int health;
int healthMax;
int alive; int alive;
float dx; float dx;
float dy; float dy;
int tx;
int ty;
int reload; int reload;
int isOnGround; int isOnGround;
int facing; int facing;
@ -101,6 +105,11 @@ struct Entity {
int weaponType; int weaponType;
int shotsToFire; int shotsToFire;
int isSolid; int isSolid;
int environment;
int isStatic;
int isMissionTarget;
int thinkTime;
int plane;
int value; int value;
long flags; long flags;
SDL_Rect bounds; SDL_Rect bounds;
@ -219,6 +228,7 @@ typedef struct {
int enemiesKilled; int enemiesKilled;
int missionsPlayed; int missionsPlayed;
long timePlayed; long timePlayed;
unsigned long entityCounter;
char worldId[MAX_NAME_LENGTH]; char worldId[MAX_NAME_LENGTH];
int isResumingMission; int isResumingMission;
int isComplete; int isComplete;

View File

@ -29,9 +29,116 @@ Entity *createEntity(void)
world.entityTail->next = e; world.entityTail->next = e;
world.entityTail = e; world.entityTail = e;
e->uniqueId = game.entityCounter++;
return e; return e;
} }
void initEntity(Entity *e)
{
e->sprite[0] = e->sprite[1] = e->sprite[2] = -1;
e->environment = ENV_AIR;
e->alive = ALIVE_ALIVE;
e->isOnGround = 0;
e->isSolid = 0;
e->isStatic = 0;
e->isMissionTarget = 0;
e->health = e->healthMax = 1;
e->facing = FACING_LEFT;
e->spriteFrame = -1;
e->spriteTime = 0;
e->dx = e->dy = 0;
e->flags = 0;
e->owner = NULL;
e->thinkTime = 0;
e->plane = PLANE_BACKGROUND;
}
SDL_Rect *getEntityBounds(Entity *e)
{
e->bounds.x = e->x;
e->bounds.y = e->y;
e->bounds.w = e->w;
e->bounds.h = e->h;
return &e->bounds;
}
int getCurrentEntitySprite(Entity *e)
{
return e->sprite[e->facing];
}
void animateEntity(Entity *e)
{
Sprite *spr;
if (e->spriteTime != -1)
{
e->spriteTime--;
if (e->spriteTime <= 0)
{
spr = getSpriteByIndex(getCurrentEntitySprite(e));
e->spriteFrame = wrap(e->spriteFrame + 1, 0, 1);
e->spriteTime = 0;
e->w = spr->w;
e->h = spr->h;
}
}
}
void setEntitySize(Entity *e)
{
Sprite *spr;
spr = getSpriteByIndex(getCurrentEntitySprite(e));
e->w = spr->w;
e->h = spr->h;
}
float bounce(Entity *e, float x)
{
if (!(e->flags & EF_BOUNCES))
{
return 0;
}
else if (e->flags & EF_FRICTIONLESS)
{
return -x;
}
x = -x * FRICTION;
if (x > -1 && x < 1)
{
e->flags &= ~EF_BOUNCES;
x = 0;
}
return x;
}
void teleport(Entity *e, float tx, float ty)
{
e->tx = tx;
e->ty = ty;
e->flags |= EF_TELEPORTING;
addTeleportStars(e);
}
void activateEntities(char *names, int activate) void activateEntities(char *names, int activate)
{ {
} }

View File

@ -20,4 +20,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "../common.h" #include "../common.h"
extern Sprite *getSpriteByIndex(int x);
extern float wrap(float value, float low, float high);
extern void addTeleportStars(Entity *e);
extern Game game;
extern World world; extern World world;

View File

@ -173,7 +173,7 @@ static int isMissingHeartCell(char *targetName)
{ {
if (e->alive == ALIVE_ALIVE) if (e->alive == ALIVE_ALIVE)
{ {
if (e->flags & EF_HEART_CELL) if (e->type == ET_HEART_CELL)
{ {
return 0; return 0;
} }