- Ja carrega habitació i actors de arxiu

- Els templates deurien funcionar quan s'active la funcionalitat
This commit is contained in:
2024-06-05 20:46:15 +02:00
parent 9dc27d7e8b
commit 30e908c8a9
6 changed files with 167 additions and 52 deletions

View File

@@ -47,26 +47,97 @@ namespace actor
return act;
}
void createFromFile(char **buffer)
actor_t *createEmptyActor()
{
actor_t *act = (actor_t*)malloc(sizeof(actor_t));
act->pos = {0, 0, 0};
act->size = {8,8,8};
act->bmp_rect = {0,0,32,32};
act->bmp_offset = {0,0};
act->anim_cycle = act->orient = act->movement = 0;
act->push = act->mov_push = PUSH_NONE;
act->below = act->above = nullptr;
act->prev = act->next = nullptr;
act->anim_wait = act->anim_wait_count = 0;
act->anim_frame=0;
act->react_mask = act->react_push = 0;
return act;
}
actor_t *createFromFile(char **buffer)
{
if (*buffer)
{
actor_t *t = createEmptyActor();
while (**buffer != 0)
{
const char* key = file::readString(buffer);
if (util::strcomp(key, "pos:")) {
act->pos.x = file::readInt(buffer);
act->pos.y = file::readInt(buffer);
act->pos.z = file::readInt(buffer);
} else if (util::strcomp(key, "height:")) {
const int val = file::readInt(buffer);
inner_h = SDL_clamp(val, 0, 3);
if (util::strcomp(key, "name:")) {
const char *val = file::readString(buffer);
strcpy(t->name, val);
} else if (util::strcomp(key, "bmp:")) {
const char *val = file::readString(buffer);
strcpy(t->bmp, val);
t->surface = draw::loadSurface(t->bmp);
} else if (util::strcomp(key, "bmp-rect:")) {
t->bmp_rect.x = file::readInt(buffer);
t->bmp_rect.y = file::readInt(buffer);
t->bmp_rect.w = file::readInt(buffer);
t->bmp_rect.h = file::readInt(buffer);
} else if (util::strcomp(key, "bmp-offset:")) {
t->bmp_offset.x = file::readInt(buffer);
t->bmp_offset.y = file::readInt(buffer);
} else if (util::strcomp(key, "pos:")) {
t->pos.x = file::readInt(buffer);
t->pos.y = file::readInt(buffer);
t->pos.z = file::readInt(buffer);
} else if (util::strcomp(key, "size:")) {
t->size.x = file::readInt(buffer);
t->size.y = file::readInt(buffer);
t->size.z = file::readInt(buffer);
} else if (util::strcomp(key, "orient:")) {
t->orient = util::stringToInt(file::readString(buffer), {"none", "xp", "xn", "yp", "yn", "zp", "zn"}, {0, 1, 2, 4, 8, 16, 32});
} else if (util::strcomp(key, "movement:")) {
t->movement = util::stringToInt(file::readString(buffer), {"none", "x", "y", "z", "cw", "ccw", "rand", "hunt"},{MOV_NONE, MOV_X, MOV_Y, MOV_Z, MOV_CW, MOV_CCW, MOV_RAND, MOV_HUNT});
} else if (util::strcomp(key, "anim-cycle:")) {
t->anim_cycle = util::stringToInt(file::readString(buffer), {"walk", "seq"},{0, 1});
} else if (util::strcomp(key, "anim-wait:")) {
t->anim_wait = file::readInt(buffer);
} else if (util::strcomp(key, "flags:")) {
const char *str = file::readString(buffer, true);
int value = 0;
while (str)
{
value |= util::stringToInt(str, { "none", "hero", "pushable", "reactive", "moving", "animated", "orientable", "deadly", "gravity", "pickable", "special", "noeditor" },{ FLAG_NONE, FLAG_HERO, FLAG_PUSHABLE, FLAG_REACTIVE, FLAG_MOVING, FLAG_ANIMATED, FLAG_ORIENTABLE, FLAG_DEADLY, FLAG_GRAVITY, FLAG_PICKABLE, FLAG_SPECIAL, FLAG_NOEDITOR });
str = file::readString(buffer, true);
}
t->flags = value;
} else if (util::strcomp(key, "react-push:")) {
const char *str = file::readString(buffer, true);
int value = 0;
while (str)
{
value |= util::stringToInt(str, { "none", "xp", "xn", "yp", "yn", "zp", "zn" }, { PUSH_NONE, PUSH_XP, PUSH_XN, PUSH_YP, PUSH_YN, PUSH_ZP, PUSH_ZN });
str = file::readString(buffer, true);
}
t->react_push = value;
} else if (util::strcomp(key, "react-mask:")) {
const char *str = file::readString(buffer, true);
int value = 0;
while (str)
{
value |= util::stringToInt(str, { "none", "xp", "xn", "yp", "yn", "zp", "zn" }, { PUSH_NONE, PUSH_XP, PUSH_XN, PUSH_YP, PUSH_YN, PUSH_ZP, PUSH_ZN });
str = file::readString(buffer, true);
}
t->react_mask = value;
} else if (util::strcomp(key, "}")) {
return t;
}
}
return t;
}
setDirty(act, true);
return nullptr;
}
const bool check_2d_collision(actor_t *obj1, actor_t *obj2)
@@ -846,35 +917,50 @@ namespace actor
void load()
{
templates.clear();
FILE *f = fopen("data/templates.txt", "r");
if (!f) return;
int size = 0;
fscanf(f, "TEMPLATES %i\n", &size);
char filename[] = "templates.txt";
int filesize=0;
char *buffer = file::getFileBuffer(filename, filesize, true);
char *original_buffer = buffer;
fclose(f);
if (buffer)
{
while (*buffer != 0)
{
const char* key = file::readString(&buffer);
if (util::strcomp(key, "actor{"))
{
actor_t *t = createFromFile(&buffer);
templates.push_back(*t);
free(t);
}
}
free(original_buffer);
}
}
void save()
{
FILE *f = fopen("data/templates.txt", "w");
fprintf(f, "TEMPLATES %i\n", templates.size());
for (int i=0; i<templates.size(); ++i)
{
actor_t t = templates[i];
fprintf(f, "name = %s\n", t.name);
fprintf(f, "bmp = %s\n", t.bmp);
fprintf(f, "bmp_rect = %i %i %i %i\n", t.bmp_rect.x, t.bmp_rect.y, t.bmp_rect.w, t.bmp_rect.h);
fprintf(f, "bmp_offset = %i %i\n", t.bmp_offset.x, t.bmp_offset.y);
fprintf(f, "pos = %i %i %i\n", t.pos.x, t.pos.y, t.pos.z);
fprintf(f, "size = %i %i %i\n", t.size.x, t.size.y, t.size.z);
fprintf(f, "orient = %s\n", numToOrient(t.orient));
fprintf(f, "anim_cycle = %s\n", t.anim_cycle==0 ? "WALK" : "SEQ");
fprintf(f, "anim_wait = %i\n", t.anim_wait);
fprintf(f, "flags = %s\n", numToFlags(t.flags));
fprintf(f, "react_mask = %s\n", numToOrient(t.react_mask));
fprintf(f, "react_push = %s\n", numToOrient(t.react_push));
fprintf(f, "movement = %s\n\n", numToMov(t.movement));
fprintf(f, "actor{\n");
fprintf(f, " name: %s\n", t.name);
fprintf(f, " bmp: %s\n", t.bmp);
fprintf(f, " bmp-rect: %i %i %i %i\n", t.bmp_rect.x, t.bmp_rect.y, t.bmp_rect.w, t.bmp_rect.h);
fprintf(f, " bmp-offset: %i %i\n", t.bmp_offset.x, t.bmp_offset.y);
fprintf(f, " pos: %i %i %i\n", t.pos.x, t.pos.y, t.pos.z);
fprintf(f, " size: %i %i %i\n", t.size.x, t.size.y, t.size.z);
fprintf(f, " orient: %s\n", numToOrient(t.orient));
fprintf(f, " anim-cycle: %s\n", t.anim_cycle==0 ? "WALK" : "SEQ");
fprintf(f, " anim-wait: %i\n", t.anim_wait);
fprintf(f, " flags: %s\n", numToFlags(t.flags));
fprintf(f, " react-mask: %s\n", numToOrient(t.react_mask));
fprintf(f, " react-push: %s\n", numToOrient(t.react_push));
fprintf(f, " movement: %s\n\n", numToMov(t.movement));
fprintf(f, "}\n\n");
}
fclose(f);
@@ -890,21 +976,34 @@ namespace actor
return &templates[index];
}
void add(actor_t *actor){
actor_t *getByName(const char *name)
{
for (int i=0;i<templates.size();++i) if (util::strcomp(name, templates[i].name)) return &templates[i];
//for (auto t : templates) if (util::strcomp(name, t.name)) return &t;
return nullptr;
}
void copy(actor_t *dest, actor_t *source)
{
strcpy(dest->name, source->name);
strcpy(dest->bmp, source->bmp);
dest->bmp_rect = source->bmp_rect;
dest->bmp_offset = source->bmp_offset;
dest->pos = source->pos;
dest->size = source->size;
dest->orient = source->orient;
dest->anim_cycle = source->anim_cycle;
dest->anim_wait = source->anim_wait;
dest->flags = source->flags;
dest->react_mask = source->react_mask;
dest->react_push = source->react_push;
dest->movement = source->movement;
}
void add(actor_t *actor)
{
actor_t new_template;
strcpy(new_template.name, actor->name);
strcpy(new_template.bmp, actor->bmp);
new_template.bmp_rect = actor->bmp_rect;
new_template.bmp_offset = actor->bmp_offset;
new_template.pos = actor->pos;
new_template.size = actor->size;
new_template.orient = actor->orient;
new_template.anim_cycle = actor->anim_cycle;
new_template.anim_wait = actor->anim_wait;
new_template.flags = actor->flags;
new_template.react_mask = actor->react_mask;
new_template.react_push = actor->react_push;
new_template.movement = actor->movement;
copy(&new_template, actor);
templates.push_back(new_template);
}
}

View File

@@ -86,7 +86,7 @@ namespace actor
// 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);
void createFromFile(char **buffer);
actor_t *createFromFile(char **buffer);
void setDirty(actor_t *act, const bool force=false);
@@ -119,6 +119,8 @@ namespace actor
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 *actor);
}
}

View File

@@ -73,6 +73,7 @@ void game::init()
restart();
/*
actor::actor_t *box = actor::create("BOX", {32,32,16}, {8,8,8}, "test.gif", {32,0,32,32}, {0,32});
box->flags = FLAG_PUSHABLE | FLAG_GRAVITY;
box->movement = MOV_CW;
@@ -84,7 +85,7 @@ void game::init()
box->movement = MOV_CW;
box->mov_push = PUSH_XN;
actor::setDirty(box, true);
*/
actor::select(actor::find("BOX"));
}

View File

@@ -101,8 +101,8 @@ namespace room
// Després intentem carregar els valors segons el arxiu que toca, si existeix
char filename[] = "rooms/00.txt";
filename[6] = int(room/10)*48;
filename[7] = (room%10)*48;
filename[6] = int(room/10)+48;
filename[7] = (room%10)+48;
int filesize=0;
char *buffer = file::getFileBuffer(filename, filesize, true);
char *original_buffer = buffer;
@@ -165,7 +165,8 @@ namespace room
exits[5] = SDL_clamp(val, 0, 64);
} else if (util::strcomp(key, "actor{")) {
actor::createFromFile(&buffer);
actor::actor_t *act = actor::createFromFile(&buffer);
actor::setDirty(act, true);
}
}
free(original_buffer);