Skip to content
Snippets Groups Projects
Commit 4df70631 authored by dg's avatar dg
Browse files

scrolling

git-svn-id: http://svn.net-core.org/repos/t-engine4@43 51575b47-30f0-44d4-a5cc-537603b46e54
parent f45dace3
No related branches found
No related tags found
No related merge requests found
......@@ -26,7 +26,7 @@ rememberDisplayOrder = { TERRAIN }
-- @param tile_h height of a single tile
function _M:setViewPort(x, y, w, h, tile_w, tile_h)
self.display_x, self.display_y = x, y
self.viewport = {width=w, height=h}
self.viewport = {width=w, height=h, mwidth=math.floor(w/tile_w), mheight=math.floor(h/tile_h)}
self.tiles = Tiles.new(tile_w, tile_h)
self.tile_w, self.tile_h = tile_w, tile_h
end
......@@ -46,6 +46,8 @@ end
-- @param x screen coordonate where the map will be displayed (this has no impact on the real display). This is used to compute mouse clicks
-- @param y screen coordonate where the map will be displayed (this has no impact on the real display). This is used to compute mouse clicks
function _M:init(w, h)
self.mx = 0
self.my = 0
self.w, self.h = w, h
self.map = {}
self.lites = {}
......@@ -154,7 +156,8 @@ function _M:display()
local z
local order
local friend
for i = 0, self.w - 1 do for j = 0, self.h - 1 do
for i = self.mx, self.mx + self.viewport.mwidth - 1 do
for j = self.my, self.my + self.viewport.mheight - 1 do
e, si = nil, 1
z = i + j * self.w
order = displayOrder
......@@ -163,19 +166,19 @@ function _M:display()
while not e and si <= #order do e = self(i, j, order[si]) si = si + 1 end
if e then
if self.seens[z] then
self.surface:merge(self.tiles:get(e.display, e.color_r, e.color_g, e.color_b, e.color_br, e.color_bg, e.color_bb, e.image), i * self.tile_w, j * self.tile_h)
self.surface:merge(self.tiles:get(e.display, e.color_r, e.color_g, e.color_b, e.color_br, e.color_bg, e.color_bb, e.image), (i - self.mx) * self.tile_w, (j - self.my) * self.tile_h)
elseif self.remembers[z] then
self.surface:merge(self.tiles:get(e.display, e.color_r/3, e.color_g/3, e.color_b/3, e.color_br/3, e.color_bg/3, e.color_bb/3, e.image), i * self.tile_w, j * self.tile_h)
self.surface:merge(self.tiles:get(e.display, e.color_r/3, e.color_g/3, e.color_b/3, e.color_br/3, e.color_bg/3, e.color_bb/3, e.image), (i - self.mx) * self.tile_w, (j - self.my) * self.tile_h)
end
-- Tactical overlay ?
if self.view_faction and e.faction then
friend = Faction:factionReaction(self.view_faction, e.faction)
if friend > 0 then
self.surface:merge(self.tiles:get(nil, 0,0,0, 0,0,0, self.faction_friend), i * self.tile_w, j * self.tile_h)
self.surface:merge(self.tiles:get(nil, 0,0,0, 0,0,0, self.faction_friend), (i - self.mx) * self.tile_w, (j - self.my) * self.tile_h)
elseif friend < 0 then
self.surface:merge(self.tiles:get(nil, 0,0,0, 0,0,0, self.faction_enemy), i * self.tile_w, j * self.tile_h)
self.surface:merge(self.tiles:get(nil, 0,0,0, 0,0,0, self.faction_enemy), (i - self.mx) * self.tile_w, (j - self.my) * self.tile_h)
else
self.surface:merge(self.tiles:get(nil, 0,0,0, 0,0,0, self.faction_neutral), i * self.tile_w, j * self.tile_h)
self.surface:merge(self.tiles:get(nil, 0,0,0, 0,0,0, self.faction_neutral), (i - self.mx) * self.tile_w, (j - self.my) * self.tile_h)
end
end
end
......@@ -262,3 +265,9 @@ function _M:rememberAll(x, y, w, h)
end end
end
--- Sets the current view area with the given coords at the center
function _M:centerViewAround(x, y)
self.mx = x - math.floor(self.viewport.mwidth / 2)
self.my = y - math.floor(self.viewport.mheight / 2)
self.changed = true
end
......@@ -20,6 +20,9 @@ function _M:receiveMouse(button, x, y)
end
end
function _M:receiveMouseMotion(button, x, y, xrel, yrel)
end
--- Setups as the current game keyhandler
function _M:setCurrent()
core.mouse.set_current_handler(self)
......
......@@ -42,10 +42,10 @@ function _M:display()
local lx, ly = l()
while lx and ly do
if not game.level.map.seens(lx, ly) then s = self.sr end
s:toScreen(self.display_x + lx * self.tile_w, self.display_y + ly * self.tile_h)
s:toScreen(self.display_x + (lx - game.level.map.mx) * self.tile_w, self.display_y + (ly - game.level.map.my) * self.tile_h)
lx, ly = l()
end
self.cursor:toScreen(self.display_x + self.target.x * self.tile_w, self.display_y + self.target.y * self.tile_h)
self.cursor:toScreen(self.display_x + (self.target.x - game.level.map.mx) * self.tile_w, self.display_y + (self.target.y - game.level.map.my) * self.tile_h)
end
function _M:setActive(v)
......@@ -71,7 +71,7 @@ function _M:scan(dir, radius)
if dir ~= 5 then
-- Get a list of actors in the direction given
core.fov.calc_beam(self.target.x, self.target.y, radius, dir, 45, checker, function()end, self)
core.fov.calc_beam(self.target.x, self.target.y, radius, dir, 55, checker, function()end, self)
else
-- Get a list of actors all around
core.fov.calc_circle(self.target.x, self.target.y, radius, checker, function()end, self)
......
......@@ -79,12 +79,12 @@ function _M:display()
end
self.level.map:display():toScreen(self.level.map.display_x, self.level.map.display_y)
-- DIsplay the targetting system if active
-- Display the targetting system if active
self.target:display()
-- Display a tooltip if available
local mx, my = core.mouse.get()
local tmx, tmy = math.floor(mx / self.level.map.tile_w), math.floor(my / self.level.map.tile_h)
local tmx, tmy = math.floor(mx / self.level.map.tile_w) + self.level.map.mx, math.floor(my / self.level.map.tile_h) + self.level.map.my
local tt = self.level.map:checkAllEntities(tmx, tmy, "tooltip")
if tt and self.level.map.seens(tmx, tmy) then
self.tooltip:set(tt)
......@@ -246,6 +246,28 @@ function _M:setupMouse()
if button == "wheelup" then self.log:scrollUp(1) end
if button == "wheeldown" then self.log:scrollUp(-1) end
end)
local derivx, derivy = 0, 0
self.mouse.receiveMouseMotion = function(self, button, x, y, xrel, yrel)
if button ~= "left" then return end
derivx = derivx + xrel
derivy = derivy + yrel
game.level.map.changed = true
if derivx >= game.level.map.tile_w then
game.level.map.mx = game.level.map.mx - 1
derivx = derivx - game.level.map.tile_w
elseif derivx <= -game.level.map.tile_w then
game.level.map.mx = game.level.map.mx + 1
derivx = derivx + game.level.map.tile_w
end
if derivy >= game.level.map.tile_h then
game.level.map.my = game.level.map.my - 1
derivy = derivy - game.level.map.tile_h
elseif derivy <= -game.level.map.tile_h then
game.level.map.my = game.level.map.my + 1
derivy = derivy + game.level.map.tile_h
end
end
end
--- Ask if we realy want to close, if so, save the game first
......
......@@ -7,11 +7,14 @@ function _M:init(t)
mod.class.Actor.init(self, t)
self.player = true
self.faction = "players"
self.combat = { dam=10, atk=4, apr=2, def=6, armor=4 }
self.combat = { dam=10, atk=40, apr=2, def=6, armor=4 }
end
function _M:move(x, y, force)
local moved = mod.class.Actor.move(self, x, y, force)
if moved then
game.level.map:centerViewAround(self.x, self.y)
end
return moved
end
......
return {
name = "ancient ruins",
max_level = 5,
width = 50, height = 30,
width = 100, height = 100,
all_remembered = true,
all_lited = true,
level_npcs = {5, 10},
......@@ -16,7 +16,7 @@ return {
},
actor = {
class = "engine.generator.actor.Random",
nb_npc = {10, 20},
nb_npc = {200, 200},
},
}
}
......@@ -152,6 +152,27 @@ void on_event(SDL_Event *event)
docall(L, 4, 0);
}
break;
case SDL_MOUSEMOTION:
if (current_mousehandler != LUA_NOREF)
{
lua_rawgeti(L, LUA_REGISTRYINDEX, current_mousehandler);
lua_pushstring(L, "receiveMouseMotion");
lua_gettable(L, -2);
lua_remove(L, -2);
lua_rawgeti(L, LUA_REGISTRYINDEX, current_mousehandler);
if (event->motion.state & SDL_BUTTON(1)) lua_pushstring(L, "left");
else if (event->motion.state & SDL_BUTTON(2)) lua_pushstring(L, "middle");
else if (event->motion.state & SDL_BUTTON(3)) lua_pushstring(L, "right");
else if (event->motion.state & SDL_BUTTON(4)) lua_pushstring(L, "wheelup");
else if (event->motion.state & SDL_BUTTON(5)) lua_pushstring(L, "wheeldown");
else lua_pushstring(L, "none");
lua_pushnumber(L, event->motion.x);
lua_pushnumber(L, event->motion.y);
lua_pushnumber(L, event->motion.xrel);
lua_pushnumber(L, event->motion.yrel);
docall(L, 6, 0);
}
break;
}
}
......@@ -261,6 +282,7 @@ int main(int argc, char *argv[])
{
switch(event.type)
{
case SDL_MOUSEMOTION:
case SDL_MOUSEBUTTONDOWN:
case SDL_KEYDOWN:
/* handle key presses */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment