http://bugs.eressea.de/view.php?id=1703
- coordinate transform repairs
This commit is contained in:
Enno Rehling 2010-01-24 19:56:45 +00:00
parent b982a92d9e
commit 2426e5d7f5
4 changed files with 94 additions and 12 deletions

View file

@ -193,19 +193,34 @@ plane_center_y(const plane *pl)
void void
adjust_coordinates(const faction *f, int *x, int *y, const plane * pl, const region * r) adjust_coordinates(const faction *f, int *x, int *y, const plane * pl, const region * r)
{ {
int nx = *x - plane_center_x(pl); int nx = *x;
int ny = *y - plane_center_y(pl); int ny = *y;
if (f) { if (f) {
nx -= ursprung_x(f, pl, r);
ny -= ursprung_y(f, pl, r);
}
if (pl) {
nx -= plane_center_x(pl);
ny -= plane_center_y(pl);
}
if (pl) {
int width = plane_width(pl); int width = plane_width(pl);
int height = plane_height(pl); int height = plane_height(pl);
int width_2 = width/2; int width_2 = width/2;
int height_2 = height/2; int height_2 = height/2;
nx -= ursprung_x(f, pl, r); if (nx<0) nx = (width-(-nx)%width);
if (nx>width_2) nx -= width; if (nx>width_2) nx -= width;
ny -= ursprung_y(f, pl, r); if (ny<0) ny = (height-(-ny)%height);
if (ny>height_2) ny -= height; if (ny>height_2) ny -= height;
} }
assert(!pl || nx<=pl->maxx - plane_center_x(pl));
assert(!pl || nx>=pl->minx - plane_center_x(pl));
assert(!pl || ny<=pl->maxy - plane_center_y(pl));
assert(!pl || ny>=pl->miny - plane_center_y(pl));
*x = nx; *x = nx;
*y = ny; *y = ny;
} }

View file

@ -20,7 +20,9 @@ without prior permission by the authors of Eressea.
#include <kernel/unit.h> #include <kernel/unit.h>
#include <kernel/item.h> #include <kernel/item.h>
#include <kernel/faction.h> #include <kernel/faction.h>
#include <kernel/plane.h>
#include <kernel/race.h> #include <kernel/race.h>
#include <kernel/region.h>
#include <util/language.h> #include <util/language.h>
@ -251,6 +253,35 @@ tolua_faction_set_policy(lua_State* L)
return 0; return 0;
} }
static int
tolua_faction_normalize(lua_State* L)
{
faction * f = (faction *)tolua_tousertype(L, 1, 0);
region * r = (region * )tolua_tousertype(L, 2, 0);
if (r) {
plane * pl = rplane(r);
int nx = r->x, ny = r->y;
pnormalize(&nx, &ny, pl);
adjust_coordinates(f, &nx, &ny, pl, r);
tolua_pushnumber(L, (lua_Number)nx);
tolua_pushnumber(L, (lua_Number)ny);
return 2;
}
return 0;
}
static int
tolua_faction_set_origin(lua_State* L)
{
faction * f = (faction *)tolua_tousertype(L, 1, 0);
region * r = (region *)tolua_tousertype(L, 2, 0);
plane * pl = rplane(r);
int id = pl?pl->id:0;
set_ursprung(f, id, r->x - plane_center_x(pl), r->y - plane_center_y(pl));
return 0;
}
static int static int
tolua_faction_get_origin(lua_State* L) tolua_faction_get_origin(lua_State* L)
{ {
@ -498,9 +529,11 @@ tolua_faction_open(lua_State* L)
tolua_variable(L, TOLUA_CAST "flags", tolua_faction_get_flags, NULL); tolua_variable(L, TOLUA_CAST "flags", tolua_faction_get_flags, NULL);
tolua_variable(L, TOLUA_CAST "lastturn", tolua_faction_get_lastturn, tolua_faction_set_lastturn); tolua_variable(L, TOLUA_CAST "lastturn", tolua_faction_get_lastturn, tolua_faction_set_lastturn);
tolua_function(L, TOLUA_CAST "set_policy", tolua_faction_set_policy); tolua_function(L, TOLUA_CAST "set_policy", &tolua_faction_set_policy);
tolua_function(L, TOLUA_CAST "get_policy", tolua_faction_get_policy); tolua_function(L, TOLUA_CAST "get_policy", &tolua_faction_get_policy);
tolua_function(L, TOLUA_CAST "get_origin", tolua_faction_get_origin); tolua_function(L, TOLUA_CAST "get_origin", &tolua_faction_get_origin);
tolua_function(L, TOLUA_CAST "set_origin", &tolua_faction_set_origin);
tolua_function(L, TOLUA_CAST "normalize", &tolua_faction_normalize);
tolua_function(L, TOLUA_CAST "add_item", tolua_faction_add_item); tolua_function(L, TOLUA_CAST "add_item", tolua_faction_add_item);
tolua_variable(L, TOLUA_CAST "items", tolua_faction_get_items, NULL); tolua_variable(L, TOLUA_CAST "items", tolua_faction_get_items, NULL);

View file

@ -1,5 +1,9 @@
require "lunit" require "lunit"
function setup()
free_game()
end
function one_unit(r, f) function one_unit(r, f)
local u = unit.create(f, r, 1) local u = unit.create(f, r, 1)
u:add_item("money", u.number * 100) u:add_item("money", u.number * 100)
@ -45,7 +49,6 @@ function test_fleeing_units_can_be_transported()
end end
function test_plane() function test_plane()
free_game()
local pl = plane.create(0, -3, -3, 7, 7) local pl = plane.create(0, -3, -3, 7, 7)
local nx, ny = plane.normalize(pl, 4, 4) local nx, ny = plane.normalize(pl, 4, 4)
assert_equal(nx, -3, "normalization failed") assert_equal(nx, -3, "normalization failed")
@ -507,6 +510,40 @@ function test_mallorn()
assert(u3:get_item("mallorn")==1) assert(u3:get_item("mallorn")==1)
end end
function test_coordinate_translation()
local pl = plane.create(1, 500, 500, 1001, 1001) -- astralraum
local pe = plane.create(1, -8761, 3620, 23, 23) -- eternath
local r = region.create(1000, 1000, "plain")
local f = faction.create("noreply@eressea.de", "human", "de")
assert_not_equal(nil, r)
assert_equal(r.x, 1000)
assert_equal(r.y, 1000)
local nx, ny = plane.normalize(pl, r.x, r.y)
assert_equal(nx, 1000)
assert_equal(ny, 1000)
local r1 = region.create(500, 500, "plain")
f:set_origin(r1)
nx, ny = f:normalize(r1)
assert_equal(0, nx)
assert_equal(0, ny)
local r0 = region.create(0, 0, "plain")
nx, ny = f:normalize(r0)
assert_equal(0, nx)
assert_equal(0, ny)
nx, ny = f:normalize(r)
assert_equal(500, nx)
assert_equal(500, ny)
local rn = region.create(1010, 1010, "plain")
nx, ny = f:normalize(rn)
assert_equal(-491, nx)
assert_equal(-491, ny)
local re = region.create(-8760, 3541, "plain") -- eternath
nx, ny = f:normalize(rn)
assert_equal(-491, nx)
assert_equal(-491, ny)
end
function test_control() function test_control()
free_game() free_game()
local u1, u2 = two_units(region.create(0, 0, "plain"), two_factions()) local u1, u2 = two_units(region.create(0, 0, "plain"), two_factions())

View file

@ -219,7 +219,7 @@ function test_market()
end end
end end
function jest_market_gives_items() function test_market_gives_items()
free_game() free_game()
local r local r
for x = -1, 1 do for y = -1, 1 do for x = -1, 1 do for y = -1, 1 do
@ -326,7 +326,6 @@ function test_alliance()
end end
function test_morale() function test_morale()
free_game()
local r = region.create(0, 0, "plain") local r = region.create(0, 0, "plain")
assert_equal(1, r.morale) assert_equal(1, r.morale)
local f1 = faction.create("noreply@eressea.de", "human", "de") local f1 = faction.create("noreply@eressea.de", "human", "de")
@ -355,7 +354,6 @@ function test_morale()
end end
function test_canoe_passes_through_land() function test_canoe_passes_through_land()
free_game()
local f = faction.create("noreply@eressea.de", "human", "de") local f = faction.create("noreply@eressea.de", "human", "de")
local src = region.create(0, 0, "ocean") local src = region.create(0, 0, "ocean")
local land = region.create(1, 0, "plain") local land = region.create(1, 0, "plain")
@ -376,7 +374,6 @@ function test_canoe_passes_through_land()
end end
function test_give_only_a_third_of_items() function test_give_only_a_third_of_items()
free_game()
local u1, u2 = two_units(region.create(0, 0, "plain"), two_factions()) local u1, u2 = two_units(region.create(0, 0, "plain"), two_factions())
local r = u2.region local r = u2.region
u1.faction.age = 10 u1.faction.age = 10