sprite.h 5.22 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
#ifndef sprite_H_INCLUDED
#define sprite_H_INCLUDED

#include "eruta.h"
#include "image.h"

typedef struct SpriteCell_      SpriteCell;
typedef struct SpriteFrame_     SpriteFrame;
typedef struct SpriteAction_    SpriteAction;   
typedef struct Sprite_          Sprite;
typedef struct SpriteLayout_    SpriteLayout;
typedef struct SpriteState_     SpriteState;



/* Flags of a Sprite, frame or layer. */
enum SpriteFlags_ {
  /* Zero flag means sprite , frame, etc not in use. */
  SPRITE_EMPTY          = 0,
  /* Sprite element is in use if this is set, not if not. */ 
  SPRITE_ACTIVE         = 1,
  /* Sprite element does not need to be updated. */
  SPRITE_FREEZE         = 2,
  /* Direction flags */
  SPRITE_NO_DIRECTION   = 0,
  SPRITE_SOUTH          = 1 << 8,
  SPRITE_EAST           = 1 << 9,
  SPRITE_NORTH          = 1 << 10,
  SPRITE_WEST           = 1 << 11,
  SPRITE_ALL            = SPRITE_SOUTH + SPRITE_EAST + SPRITE_NORTH + SPRITE_WEST
};

/* Type of the sprite action. The numbers correspond with the 
 * row in the liberated pixel cup sprite sheet compilation divided by 4, 
 * which is used  placeholder art now. The real art will have the same structure 
 * for it's sprite sheets.
 * 
 * To limit art requirements, emotions will be showed with emoticons and through
 * the character portraits in the dialogues.
 * 
 */
enum SpriteActionType_ {
  SPRITE_CAST           = 0,
  SPRITE_STAB           = 1,
  SPRITE_WALK           = 2,
  SPRITE_SLASH          = 3,
  SPRITE_SHOOT          = 4,
  SPRITE_DOWN           = 5, 
  
  /* The positions below are not in the LPC 
   * sprite sheet but could be synthesized or used in the real art. */  
  SPRITE_RUN            = 6,
  SPRITE_HURT           = 7,
  SPRITE_STAND          = 8,
  SPRITE_DEFEND         = 9,
};

/* Sprite layer suggested uses. For Eruta the game, 
 * knives, blades, staves, claws, guns and cannons are used, 
 * but not bows and polearms */
enum SpriteLayerKind_   { 
  SPRITELAYER_BEHINDBODY  = 1,
  SPRITELAYER_BODY        = 3,
  SPRITELAYER_HEAD        = 5,
  SPRITELAYER_EYES        = 7,
  SPRITELAYER_EARS        = 9,
  SPRITELAYER_HAIR        = 10,
  SPRITELAYER_HANDS       = 13,
  SPRITELAYER_FEET        = 15,
  SPRITELAYER_LEGS        = 17,
  SPRITELAYER_TORSO       = 19,
  SPRITELAYER_BELT        = 21,
  SPRITELAYER_ACCESSORY   = 23,
  SPRITELAYER_BLADE       = 25,
  SPRITELAYER_KNIFE       = 27,
  SPRITELAYER_CLAW        = 29,
  SPRITELAYER_STAFF       = 31,
  SPRITELAYER_GUN         = 33,
  SPRITELAYER_CANNON      = 35,
  SPRITELAYER_POLEARM     = 37,
  SPRITELAYER_BOW         = 39,
};


/* Load type of sprites. */
enum SpriteLoadType_ {
  SPRITE_LOAD_ULPCSS_NORMAL             = 0,
  SPRITE_LOAD_ULPCSS_OVERSIZED_SLASH    = 1,
  SPRITE_LOAD_ULPCSS_OVERSIZED_STAB     = 2,
};


/* Amount of potential actions that a sprite has by default at creation. */
#define SPRITE_NACTIONS_DEFAULT 32

/* Amount of potential frame that a spriteaction has by default at creation. */
#define SPRITEACTION_NFRAMES_DEFAULT 32

/* Amount of potential layers that a spriteframe has by default at creation. */
#define SPRITEFRAME_NLAYERS_DEFAULT 64

int spriteframe_maxlayers(SpriteFrame * self);
SpriteCell * spriteframe_cell(SpriteFrame * self, int index);


int sprite_maxactions(Sprite *self);
SpriteAction * sprite_action(Sprite *self, int index);
SpriteAction * sprite_action_(Sprite *self, int index, SpriteAction * action);
int sprite_frames(Sprite *self, int action);
SpriteFrame * sprite_frame(Sprite *self, int action, int index);
Sprite * sprite_initall(Sprite * self, int index, int nactions);
Sprite * sprite_init(Sprite * self, int index);
Sprite * sprite_done(Sprite * self);
Sprite * sprite_free(Sprite * self);
Sprite * sprite_alloc();
Sprite * sprite_new(int index);

/** Sprite cleanup walker decaration, needed for spritelist.c  */
void * sprite_cleanup_walker(void * data, void * extra);

void sprite_draw(Sprite * self, Point * at);
Sprite * sprite_now_(Sprite * self, int actionnow, int framenow);
void sprite_update(Sprite * self, double dt);

SpriteAction * sprite_action_for(Sprite * me, int pose, int direction);
int sprite_action_index_for(Sprite * me, int pose, int direction);



SpriteFrame * spriteaction_newframe
  (SpriteAction * self, int index, double duration);

SpriteAction * sprite_newaction
  (Sprite * self, int actionindex, int type, int flags);

SpriteCell * sprite_load_cell_from
  (Sprite * self, int pose, int direction, int layeri, 
    Image * source, Point size, Point where, Point offset, double duration);

SpriteFrame * sprite_newframe
  (Sprite * self, int actionindex, int frameindex, double duration);

Sprite * sprite_loadlayer_vpath
(Sprite * self, SpriteLayout * layout, int layerindex, char * vpath);

Sprite * sprite_loadlayer_ulpcss_vpath
  (Sprite * self, int layerindex, char * vpath, int oversized);

int sprite_framesused(Sprite * self, int actionindex);

double spriteframe_duration(SpriteFrame * me);

int spriteaction_is_pose(SpriteAction * self, int pose, int direction);
int spriteaction_matches_pose(SpriteAction * self, int pose, int direction);

void spritecell_draw_tinted(SpriteCell * self, Point * at, Color tint);

void spritecell_draw(SpriteCell * self, Point * at);
 

int sprite_id(Sprite * sprite);

Point spritecell_real_position(SpriteCell * self, Point * at);


#endif