forked from github/server
http://bugs.eressea.de/view.php?id=1703 - coordinate transform repairs
This commit is contained in:
parent
b982a92d9e
commit
2426e5d7f5
4 changed files with 94 additions and 12 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue