Making empty space transparent to fix FOV, more generous FOV algorithm

This commit is contained in:
John McCardle 2023-03-10 21:42:50 -05:00
parent 99fa92f8ba
commit 3fd60d76ea
4 changed files with 64 additions and 8 deletions

View File

@ -58,7 +58,7 @@ void Grid::refreshTCODmap() {
std::cout << "Map refreshed: " << total << " squares, " << walkable << "walkable, " << transparent << " transparent" << std::endl; std::cout << "Map refreshed: " << total << " squares, " << walkable << "walkable, " << transparent << " transparent" << std::endl;
} }
void Grid::refreshTCODsight(int x, int y) { void Grid::refreshTCODsight(int x, int y) {
tcodmap->computeFov(x,y); tcodmap->computeFov(x,y, 0, true, FOV_PERMISSIVE_8);
for (int x = 0; x < grid_x; x++) { for (int x = 0; x < grid_x; x++) {
for (int y = 0; y < grid_y; y++) { for (int y = 0; y < grid_y; y++) {
auto& p = at(x, y); auto& p = at(x, y);

View File

@ -87,6 +87,7 @@ static PyMethodDef mcrfpyMethods[] = {
{"lockPlayerInput", McRFPy_API::_lockPlayerInput, METH_VARARGS, ""}, {"lockPlayerInput", McRFPy_API::_lockPlayerInput, METH_VARARGS, ""},
{"requestGridTarget", McRFPy_API::_requestGridTarget, METH_VARARGS, ""}, {"requestGridTarget", McRFPy_API::_requestGridTarget, METH_VARARGS, ""},
{"activeGrid", McRFPy_API::_activeGrid, METH_VARARGS, ""}, {"activeGrid", McRFPy_API::_activeGrid, METH_VARARGS, ""},
{"setActiveGrid", McRFPy_API::_setActiveGrid, METH_VARARGS, ""},
{"inputMode", McRFPy_API::_inputMode, METH_VARARGS, ""}, {"inputMode", McRFPy_API::_inputMode, METH_VARARGS, ""},
{"turnNumber", McRFPy_API::_turnNumber, METH_VARARGS, ""}, {"turnNumber", McRFPy_API::_turnNumber, METH_VARARGS, ""},
{"createEntity", McRFPy_API::_createEntity, METH_VARARGS, ""}, {"createEntity", McRFPy_API::_createEntity, METH_VARARGS, ""},
@ -967,6 +968,13 @@ PyObject* McRFPy_API::_requestGridTarget(PyObject* self, PyObject* args) {
PyObject* McRFPy_API::_activeGrid(PyObject* self, PyObject* args) { PyObject* McRFPy_API::_activeGrid(PyObject* self, PyObject* args) {
return Py_BuildValue("s", McRFPy_API::active_grid.c_str()); return Py_BuildValue("s", McRFPy_API::active_grid.c_str());
} }
PyObject* McRFPy_API::_setActiveGrid(PyObject* self, PyObject* args) {
const char* newactivegrid;
if (!PyArg_ParseTuple(args, "s", &newactivegrid)) return NULL;
McRFPy_API::active_grid = newactivegrid;
Py_INCREF(Py_None);
return Py_None;
}
PyObject* McRFPy_API::_inputMode(PyObject* self, PyObject* args) { PyObject* McRFPy_API::_inputMode(PyObject* self, PyObject* args) {
return Py_BuildValue("s", McRFPy_API::input_mode.c_str()); return Py_BuildValue("s", McRFPy_API::input_mode.c_str());
} }

View File

@ -100,6 +100,7 @@ public:
// string for labeling the map // string for labeling the map
static std::string active_grid; static std::string active_grid;
static PyObject* _activeGrid(PyObject*, PyObject*); static PyObject* _activeGrid(PyObject*, PyObject*);
static PyObject* _setActiveGrid(PyObject*, PyObject*);
// string for prompting input // string for prompting input
static std::string input_mode; static std::string input_mode;
static PyObject* _inputMode(PyObject*, PyObject*); static PyObject* _inputMode(PyObject*, PyObject*);

View File

@ -14,7 +14,7 @@ animations_in_progress = 0
scene = None scene = None
class TestEntity: class TestEntity:
def __init__(self, grid, label, tex_index, basesprite, x, y, texture_width=64, walk_frames=5, attack_frames=6): def __init__(self, grid, label, tex_index, basesprite, x, y, texture_width=64, walk_frames=5, attack_frames=6, do_fov=False):
self.grid = grid self.grid = grid
self.basesprite = basesprite self.basesprite = basesprite
self.texture_width = texture_width self.texture_width = texture_width
@ -23,6 +23,7 @@ class TestEntity:
self.x = x self.x = x
self.y = y self.y = y
self.facing_direction = 0 self.facing_direction = 0
self.do_fov = do_fov
#print(f"Calling C++ with: {repr((self.grid, label, tex_index, self.basesprite, x, y, self))}") #print(f"Calling C++ with: {repr((self.grid, label, tex_index, self.basesprite, x, y, self))}")
grids = mcrfpy.listGrids() grids = mcrfpy.listGrids()
for g in grids: for g in grids:
@ -36,7 +37,7 @@ class TestEntity:
#grids = mcrfpy.listGrids() #grids = mcrfpy.listGrids()
for g in scene.grids: for g in scene.grids:
if g.title == self.grid: if g.title == self.grid:
if not g.at(self.x + dx, self.y + dy).walkable: if g.at(self.x + dx, self.y + dy) is None or not g.at(self.x + dx, self.y + dy).walkable:
print("Blocked at target location.") print("Blocked at target location.")
return return
if (dx == 0 and dy == 0): if (dx == 0 and dy == 0):
@ -47,6 +48,7 @@ class TestEntity:
direction = 0 if dy == +1 else 1 direction = 0 if dy == +1 else 1
self.animate(direction, move=True, animove=(self.x + dx, self.y+dy)) self.animate(direction, move=True, animove=(self.x + dx, self.y+dy))
self.facing_direction = direction self.facing_direction = direction
if (self.do_fov): mcrfpy.refreshFov()
def animate(self, direction, attacking=False, move=False, animove=None): def animate(self, direction, attacking=False, move=False, animove=None):
@ -140,13 +142,26 @@ class TestScene:
mcrfpy.createButton(entitymenu, 0, 160, 150, 40, DARKBLUE, BLACK, "Right", "test_right") mcrfpy.createButton(entitymenu, 0, 160, 150, 40, DARKBLUE, BLACK, "Right", "test_right")
mcrfpy.createButton(entitymenu, 0, 210, 150, 40, DARKBLUE, BLACK, "Attack", "test_attack") mcrfpy.createButton(entitymenu, 0, 210, 150, 40, DARKBLUE, BLACK, "Attack", "test_attack")
mcrfpy.createButton(entitymenu, 0, 210, 150, 40, DARKBLUE, RED, "TE", "testent") mcrfpy.createButton(entitymenu, 0, 210, 150, 40, DARKBLUE, RED, "TE", "testent")
mcrfpy.createMenu("gridtitlemenu", 0, -10, 0, 0)
mcrfpy.createCaption("gridtitlemenu", "<grid name>", 18, WHITE)
mcrfpy.createMenu("hintsmenu", 0, 505, 0, 0)
mcrfpy.createCaption("hintsmenu", "<hintline>", 16, WHITE)
print("Make UIs visible") print("Make UIs visible")
self.menus = mcrfpy.listMenus() self.menus = mcrfpy.listMenus()
self.menus[0].visible = True self.menus[0].visible = True
self.menus[1].w = 170 self.menus[1].w = 170
self.menus[1].visible = True self.menus[1].visible = True
self.menus[2].visible = True
self.menus[2].bgcolor = BLACK
self.menus[3].visible = True
self.menus[3].bgcolor = BLACK
mcrfpy.modMenu(self.menus[0]) mcrfpy.modMenu(self.menus[0])
mcrfpy.modMenu(self.menus[1]) mcrfpy.modMenu(self.menus[1])
mcrfpy.modMenu(self.menus[2])
mcrfpy.modMenu(self.menus[3])
print(mcrfpy.listMenus()) print(mcrfpy.listMenus())
print("Create grid") print("Create grid")
@ -172,7 +187,7 @@ class TestScene:
TestEntity("demogrid", "classtest", 1, 143, 13, 11, 64, walk_frames=5, attack_frames=6), TestEntity("demogrid", "classtest", 1, 143, 13, 11, 64, walk_frames=5, attack_frames=6),
TestEntity("demogrid", "classtest", 1, 158, 15, 13, 64, walk_frames=5, attack_frames=6), TestEntity("demogrid", "classtest", 1, 158, 15, 13, 64, walk_frames=5, attack_frames=6),
TestEntity("demogrid", "classtest", 1, 165, 17, 15, 64, walk_frames=5, attack_frames=6), TestEntity("demogrid", "classtest", 1, 165, 17, 15, 64, walk_frames=5, attack_frames=6),
TestEntity("demogrid", "player", 3, 20, 17, 3, 5, walk_frames=4, attack_frames=5) TestEntity("demogrid", "player", 3, 20, 17, 3, 5, walk_frames=4, attack_frames=5, do_fov=True)
] ]
self.grids = mcrfpy.listGrids() self.grids = mcrfpy.listGrids()
@ -195,6 +210,9 @@ class TestScene:
mcrfpy.registerPyAction("nextsp", lambda: self.changesprite(1)) mcrfpy.registerPyAction("nextsp", lambda: self.changesprite(1))
mcrfpy.registerPyAction("prevsp", lambda: self.changesprite(-1)) mcrfpy.registerPyAction("prevsp", lambda: self.changesprite(-1))
mcrfpy.registerPyAction("skipsp", lambda: self.changesprite(16)) mcrfpy.registerPyAction("skipsp", lambda: self.changesprite(16))
mcrfpy.unlockPlayerInput()
mcrfpy.setActiveGrid("demogrid")
self.updatehints()
def animate_entity(self, direction, attacking=False): def animate_entity(self, direction, attacking=False):
if direction is None: if direction is None:
@ -253,17 +271,46 @@ class TestScene:
self.menus[0].sprites[0].sprite_index = randint(0, 3) self.menus[0].sprites[0].sprite_index = randint(0, 3)
mcrfpy.modMenu(self.menus[0]) mcrfpy.modMenu(self.menus[0])
def updatehints(self):
self.menus[2].captions[0].text=mcrfpy.activeGrid()
mcrfpy.modMenu(self.menus[2])
self.menus[3].captions[0].text=mcrfpy.inputMode()
mcrfpy.modMenu(self.menus[3])
def gridgen(self): def gridgen(self):
print(f"[Python] modifying {len(self.grids[0].points)} grid points") print(f"[Python] modifying {len(self.grids[0].points)} grid points")
for p in self.grids[0].points: for p in self.grids[0].points:
p.color = (randint(0, 255), randint(64, 192), 0) #p.color = (randint(0, 255), randint(64, 192), 0)
print("[Python] Modifying:") p.color = (0,0,0)
p.walkable = False
p.transparent = False
room_centers = [(randint(0, self.grids[0].grid_x-1), randint(0, self.grids[0].grid_y-1)) for i in range(6)]
room_centers.append((3, 5))
for r in room_centers:
print(r)
room_color = (randint(128, 192), randint(128, 192), randint(128, 192))
#self.grids[0].at(r[0], r[1]).walkable = True
#self.grids[0].at(r[0], r[1]).color = room_color
halfx, halfy = randint(2, 11), randint(2,11)
for p_x in range(r[0] - halfx, r[0] + halfx):
for p_y in range(r[1] - halfy, r[1] + halfy):
gpoint = self.grids[0].at(p_x, p_y)
if gpoint is None: continue
gpoint.walkable = True
gpoint.transparent = True
gpoint.color = room_color
print()
#print("[Python] Modifying:")
self.grids[0].at(10, 10).color = (255, 255, 255) self.grids[0].at(10, 10).color = (255, 255, 255)
self.grids[0].at(10, 10).walkable = False self.grids[0].at(10, 10).walkable = False
self.grids[0].visible = True self.grids[0].visible = True
mcrfpy.modGrid(self.grids[0]) mcrfpy.modGrid(self.grids[0])
print(f"Sent grid: {repr(self.grids[0])}") #print(f"Sent grid: {repr(self.grids[0])}")
print(f"Received grid: {repr(mcrfpy.listGrids()[0])}") #print(f"Received grid: {repr(mcrfpy.listGrids()[0])}")
def animation_done(self, s): def animation_done(self, s):
print(f"The `{s}` animation completed.") print(f"The `{s}` animation completed.")