The Battle for Wesnoth
1.17.12+dev
scripting
lua_pathfind_cost_calculator.hpp
Go to the documentation of this file.
1
/*
2
Copyright (C) 2017 - 2022
3
Part of the Battle for Wesnoth Project https://www.wesnoth.org/
4
5
This program is free software; you can redistribute it and/or modify
6
it under the terms of the GNU General Public License as published by
7
the Free Software Foundation; either version 2 of the License, or
8
(at your option) any later version.
9
This program is distributed in the hope that it will be useful,
10
but WITHOUT ANY WARRANTY.
11
12
See the COPYING file for more details.
13
*/
14
15
#pragma once
16
17
#include "
lua/lua.h
"
18
#include "
map/location.hpp
"
19
#include "
pathfind/pathfind.hpp
"
20
21
/**
22
* Cost function object relying on a Lua function.
23
* @note The stack index of the Lua function must be valid each time the cost is computed.
24
*/
25
struct
lua_pathfind_cost_calculator
:
pathfind::cost_calculator
26
{
27
lua_State *
L
;
28
int
index
;
29
/**
30
* @param L_ the pointer to the lua interpreter.
31
* @param i the stack position of the lua function to calculate the cost.
32
*/
33
lua_pathfind_cost_calculator
(lua_State *L_,
int
i
): L(L_), index(i) {}
34
double
cost
(
const
map_location
&loc,
const
double
so_far)
const
35
{
36
// Copy the user function and push the location and current cost.
37
lua_pushvalue(L, index);
38
lua_pushinteger(L, loc.
wml_x
());
39
lua_pushinteger(L, loc.
wml_y
());
40
lua_pushnumber(L, so_far);
41
// Execute the user function.
42
if
(!
luaW_pcall
(L, 3, 1)) {
43
return
1.;
44
}
45
// Return a cost of at least 1 mp to avoid issues in pathfinder.
46
// (Condition is inverted to detect NaNs.)
47
double
cost
= lua_tonumber(L, -1);
48
lua_pop(L, 1);
49
return
!(cost >= 1.) ? 1. :
cost
;
50
}
51
};
luaW_pcall
bool luaW_pcall(lua_State *L, int nArgs, int nRets, bool allow_wml_error)
Calls a Lua function stored below its nArgs arguments at the top of the stack.
Definition:
lua_common.cpp:1134
location.hpp
lua_pathfind_cost_calculator::index
int index
Definition:
lua_pathfind_cost_calculator.hpp:28
lua_pathfind_cost_calculator::cost
double cost(const map_location &loc, const double so_far) const
Definition:
lua_pathfind_cost_calculator.hpp:34
map_location::wml_x
int wml_x() const
Definition:
location.hpp:153
lua_pathfind_cost_calculator::lua_pathfind_cost_calculator
lua_pathfind_cost_calculator(lua_State *L_, int i)
Definition:
lua_pathfind_cost_calculator.hpp:33
lua_pathfind_cost_calculator::L
lua_State * L
Definition:
lua_pathfind_cost_calculator.hpp:27
map_location::wml_y
int wml_y() const
Definition:
location.hpp:154
map_location
Encapsulates the map of the game.
Definition:
location.hpp:38
lua.h
lua_pathfind_cost_calculator
Cost function object relying on a Lua function.
Definition:
lua_pathfind_cost_calculator.hpp:25
i
std::size_t i
Definition:
function.cpp:968
pathfind::cost_calculator
Definition:
pathfind.hpp:58
pathfind.hpp
This module contains various pathfinding functions and utilities.
Generated by
1.8.13