Files
thepool/source/actor.h
2024-06-18 07:07:19 +02:00

142 lines
4.0 KiB
C++

#pragma once
#include <SDL2/SDL.h>
#include "misc.h"
#include "jdraw.h"
#include <string>
// Flags que defineixen les capacitats de l'actor
#define FLAG_NONE 0
#define FLAG_HERO 1 // Es el heroi
#define FLAG_PUSHABLE 2 // Es pot espentar
#define FLAG_REACTIVE 4 // Quan se li espenta, torna una espenta específica
#define FLAG_MOVING 8 // Es mou
#define FLAG_ANIMATED 16 // Te animació de frames
#define FLAG_ORIENTABLE 32 // S'orienta cap on va
#define FLAG_DEADLY 64 // Fa pupa
#define FLAG_GRAVITY 128 // Li afecta la gravetat
#define FLAG_PICKABLE 256 // Es pot agafar
#define FLAG_SPECIAL 512 // Especial (habilitats, poders temporals i parts de l'excavadora)
#define FLAG_NOEDITOR 1024 // No es seleccionable a l'editor (son les portes)
#define FLAG_SENSIBLE 6 // PUSHABLE or REACTIVE
#define FLAG_IGNORE 1025 // HERO or NOEDITOR
// Direcció de espenta
#define PUSH_NONE 0
#define PUSH_XP 1
#define PUSH_XN 2
#define PUSH_YP 4
#define PUSH_YN 8
#define PUSH_ZP 16
#define PUSH_ZN 32
#define PUSH_KILL 64
// Tipus de moviment de l'actor
#define MOV_NONE 0 // Ningun
#define MOV_X 1 // Es mou només en l'eix X i quan topeta en algo, torna per on venia
#define MOV_Y 2 // Es mou només en l'eix Y i quan topeta en algo, torna per on venia
#define MOV_Z 3 // Es mou només en l'eix Z i quan topeta en algo, torna per on venia
#define MOV_CW 4 // Es mou en sentit de les agulles del rellotge
#define MOV_CCW 5 // Es mou en sentit contrari a les agulles del rellotge
#define MOV_RAND 6 // Es mou en direcció aleatòria
#define MOV_HUNT 7 // Persegueix al heroi
namespace actor
{
struct actor_t
{
char name[16];
draw::surface *surface;
char bmp[16];
SDL_Rect bmp_rect;
SDL_Point bmp_offset;
vec3_t pos;
vec3_t size;
int orient;
int anim_cycle;
int anim_frame;
int anim_wait;
int anim_wait_count;
int flags;
int push;
int react_mask;
int react_push;
int movement;
int mov_push;
actor_t *below;
actor_t *above;
actor_t *prev;
actor_t *next;
};
// Torna el primer actor de la llista
actor_t *getFirst();
// Torna l'últim actor de la llista
actor_t *getLast();
// Torna el actor seleccionat a l'editor
actor_t *getSelected();
// Torna un nou actor
actor_t *create(std::string name, vec3_t p, vec3_t s, std::string bmp, SDL_Rect r, SDL_Point o);
actor_t *duplicate(actor_t *act);
actor_t *createFromTemplate(const char *name);
actor_t *createFromFile(char **buffer);
void setUniqueName(actor_t *act);
void saveToFile(FILE *f, actor_t *act);
void setDirty(actor_t *act, const bool force=false);
void select(actor_t *act);
void reorder();
uint8_t push(actor_t *act, uint8_t push);
void update(actor_t *act, const bool update_all=true);
void updateEditor(actor_t *act, const bool update_all=true);
void draw(actor_t *act, const bool draw_all=true);
actor_t *find(std::string name);
actor_t *find_at(const int x, const int y, const int z);
actor_t *get_collision(actor_t *act);
const bool check_collision(actor_t *obj1, actor_t *obj2);
void remove(actor_t *act);
void pick(actor_t *act);
actor_t *getPicked();
void clear();
namespace templates
{
void load();
void save();
const int size();
actor_t *get(const int index);
actor_t *getByName(const char *name);
void copy(actor_t *dest, actor_t *source);
void add(actor_t *act);
}
}