From f5d3e6ea128bd3d1455d8a2d9c374338ad466fb1 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 7 Jan 2024 12:01:52 +0100 Subject: [PATCH] flying ships (#1048) * attempt fallback for bad encoding headers * Fix levitation duration Ship flag was persisted and somehow never cleared. Resolves https://bugs.eressea.de/view.php?id=2997 --- scripts/tests/e2/e2features.lua | 3 ++- src/kernel/save.c | 1 + src/kernel/ship.h | 2 +- src/spells/flyingship.c | 18 ++---------------- tests/data/test.dat | Bin 0 -> 232 bytes 5 files changed, 6 insertions(+), 18 deletions(-) create mode 100644 tests/data/test.dat diff --git a/scripts/tests/e2/e2features.lua b/scripts/tests/e2/e2features.lua index 7f703d788..1df6dc081 100644 --- a/scripts/tests/e2/e2features.lua +++ b/scripts/tests/e2/e2features.lua @@ -253,8 +253,9 @@ function test_levitate() u:add_order("ARBEITE") levitate_ship(u.ship, u, 2, 1) assert_equal(32, u.ship.flags) + assert_not_nil(u.ship:get_curse('flyingship')) process_orders() - assert_equal(0, u.ship.flags) + assert_nil(u.ship:get_curse('flyingship')) end function test_levitation_ring() diff --git a/src/kernel/save.c b/src/kernel/save.c index 1e565e320..a960515d1 100644 --- a/src/kernel/save.c +++ b/src/kernel/save.c @@ -1468,6 +1468,7 @@ ship *read_ship(gamedata *data) if (data->version >= FOSS_VERSION) { READ_INT(store, &sh->flags); + sh->flags &= SFL_SAVEMASK; } /* Attribute rekursiv einlesen */ diff --git a/src/kernel/ship.h b/src/kernel/ship.h index c8113270c..e73e75546 100644 --- a/src/kernel/ship.h +++ b/src/kernel/ship.h @@ -51,7 +51,7 @@ typedef struct ship_type { #define SF_FISHING (1<<4) /* was on an ocean, can fish */ #define SF_FLYING (1<<5) /* the ship can fly */ -#define SFL_SAVEMASK (SF_FLYING) +#define SFL_SAVEMASK 0 #define INCOME_FISHING 10 typedef struct ship { diff --git a/src/spells/flyingship.c b/src/spells/flyingship.c index bfe09daf9..56dfb000c 100644 --- a/src/spells/flyingship.c +++ b/src/spells/flyingship.c @@ -103,27 +103,13 @@ static int flyingship_read(gamedata * data, curse * c, void *target) { ship *sh = (ship *)target; c->data.v = sh; - if (data->version < FOSS_VERSION) { - sh->flags |= SF_FLYING; - return 0; - } - assert(sh->flags & SF_FLYING); - return 0; -} - -static int flyingship_age(curse * c) -{ - ship *sh = (ship *)c->data.v; - if (sh && c->duration == 1) { - sh->flags &= ~SF_FLYING; - return 1; - } + sh->flags |= SF_FLYING; return 0; } const struct curse_type ct_flyingship = { "flyingship", CURSETYP_NORM, 0, NO_MERGE, cinfo_ship, NULL, flyingship_read, -NULL, NULL, flyingship_age +NULL, NULL, NULL }; void register_flyingship(void) diff --git a/tests/data/test.dat b/tests/data/test.dat new file mode 100644 index 0000000000000000000000000000000000000000..f06761f12f7bb3bb91d98eac2e5c806aa664d607 GIT binary patch literal 232 zcmb753J5cFibFU+BU|r2nX1HEkdv4RRKXRJnUt85k(gXs46?ukq?jqgppk#R zK+|^y_RPHG)V$(UMwa5toNNZ>{LCCy*4)aXq6}8ntkm*UAg{O}GdY!s1!zbvBS