From f1f37d78012e50e0d1e4845157ef0bfb709e7cf6 Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Tue, 17 Sep 2024 20:02:25 +0200 Subject: [PATCH] =?UTF-8?q?-=20Ordenaci=C3=B3=20alfab=C3=A8tica=20dels=20a?= =?UTF-8?q?ctors=20de=20cada=20habitaci=C3=B3=20per=20als=20arxius=20i=20l?= =?UTF-8?q?'editor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/actor.cpp | 51 ++++++++++++++++++++++++++++++++++++++++++++++++ source/actor.h | 3 +++ source/room.cpp | 4 ++-- 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/source/actor.cpp b/source/actor.cpp index 98f60b1..16af551 100644 --- a/source/actor.cpp +++ b/source/actor.cpp @@ -281,6 +281,57 @@ namespace actor return "NONE"; } + actor_t *alpha = nullptr; + const bool a_is_greater_than_b(actor_t *a, actor_t *b) + { + return strcmp(a->name, b->name) >= 0; + } + + void order(actor_t *act) + { + if (!act) return; + if (!a_is_greater_than_b(act, alpha)) + { + act->next_alpha = alpha; + alpha = act; + } + else + { + actor_t *other = alpha; + actor_t *prev = nullptr; + while (a_is_greater_than_b(act, other)) + { + if (other->next_alpha) + { + prev = other; + other = other->next_alpha; + } + else + { + other->next_alpha = act; + return; + } + } + prev->next_alpha = act; + act->next_alpha = other; + } + } + + actor_t *alphaOrder(actor_t *act) + { + if (!act) return nullptr; + alpha = act; + act->next_alpha = nullptr; + act = act->next; + while (act) + { + act->next_alpha = nullptr; + order(act); + act = act->next; + } + return alpha; + } + void saveToFile(FILE *f, actor_t *act) { fprintf(f, "\nactor{\n"); diff --git a/source/actor.h b/source/actor.h index 590ce7e..492fce6 100644 --- a/source/actor.h +++ b/source/actor.h @@ -100,6 +100,7 @@ namespace actor actor_t *prev; actor_t *next; + actor_t *next_alpha; int inner_x; int inner_y; @@ -131,6 +132,8 @@ namespace actor void setUniqueName(actor_t *act); + actor_t *alphaOrder(actor_t *act); + void saveToFile(FILE *f, actor_t *act); void setDirty(actor_t *act, const bool force=false); diff --git a/source/room.cpp b/source/room.cpp index 57975d5..f5ee67d 100644 --- a/source/room.cpp +++ b/source/room.cpp @@ -572,11 +572,11 @@ namespace room if (exits[ZP]!=-1) fprintf(f, "exit-zp: %i\n", exits[ZP]); if (exits[ZN]!=-1) fprintf(f, "exit-zn: %i\n", exits[ZN]); - actor::actor_t *act = actor::getFirst(); + actor::actor_t *act = actor::alphaOrder(actor::getFirst()); while (act) { if ( (act->flags&(FLAG_HERO|FLAG_NOEDITOR))==0 ) actor::saveToFile(f, act); - act = act->next; + act = act->next_alpha; } fclose(f);