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 ET_ENEMY 0
#define ET_KEY 1
#define ET_MIA 2
#define ET_BOB 3
#define ET_DESTRUCTABLE 4
#define ET_BOSS 5
enum
{
ET_EFFECT,
ET_TRAP,
ET_BOB,
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_HEART_CELL (2 << 0)
#define EF_WEIGHTLESS (2 << 1)
#define EF_BOMB_SHIELD (2 << 2)
#define EF_IMMUNE (2 << 3)
#define EF_NONE 0
#define EF_WEIGHTLESS (2 << 0)
#define EF_BOUNCES (2 << 1)
#define EF_TELEPORTING (2 << 2)
#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
{
@ -153,6 +191,11 @@ enum
PLANE_FOREGROUND
};
enum
{
ENV_AIR
};
enum
{
PT_LINE,

View File

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

View File

@ -29,9 +29,116 @@ Entity *createEntity(void)
world.entityTail->next = e;
world.entityTail = e;
e->uniqueId = game.entityCounter++;
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)
{
}

View File

@ -20,4 +20,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#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;

View File

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