luaui.cpp
来自「这是整套横扫千军3D版游戏的源码」· C++ 代码 · 共 2,574 行 · 第 1/5 页
CPP
2,574 行
// call the function
if (!RunCallIn(cmdStr, 3, 1)) {
return false;
}
// get the results
const int args = lua_gettop(L);
if (!lua_isboolean(L, -1)) {
logOutput.Print("CommandNotify() bad return value (%i)\n", args);
lua_pop(L, 1);
return false;
}
const bool retval = !!lua_toboolean(L, -1);
lua_pop(L, 1);
return retval;
}
bool CLuaUI::GroupChanged(int groupID)
{
static const LuaHashString cmdStr("GroupChanged");
if (!cmdStr.GetGlobalFunc(L)) {
return false; // the call is not defined
}
lua_pushnumber(L, groupID);
// call the routine
if (!RunCallIn(cmdStr, 1, 0)) {
return false;
}
return true;
}
static inline float fuzzRand(float fuzz)
{
return (1.0f + fuzz) - ((2.0f * fuzz) * (float)rand() / (float)RAND_MAX);
}
void CLuaUI::ShockFront(float power, const float3& pos, float areaOfEffect)
{
if (!haveShockFront) {
return;
}
if (areaOfEffect < shockFrontMinArea) {
return;
}
float3 gap = (camera->pos - pos);
float dist = gap.Length() + shockFrontDistAdj;
power = power / (dist * dist);
if (power < shockFrontMinPower) {
return;
}
static const LuaHashString cmdStr("ShockFront");
if (!cmdStr.GetGlobalFunc(L)) {
haveShockFront = false;
return; // the call is not defined
}
if (!loshandler->InLos(pos, gu->myAllyTeam) && !gu->spectatingFullView) {
const float fuzz = 0.25f;
gap.x *= fuzzRand(fuzz);
gap.y *= fuzzRand(fuzz);
gap.z *= fuzzRand(fuzz);
dist = gap.Length() + shockFrontDistAdj;
}
const float3 dir = (gap / dist); // normalize
lua_pushnumber(L, power);
lua_pushnumber(L, dir.x);
lua_pushnumber(L, dir.y);
lua_pushnumber(L, dir.z);
// call the routinea
if (!RunCallIn(cmdStr, 4, 0)) {
return;
}
return;
}
string CLuaUI::WorldTooltip(const CUnit* unit,
const CFeature* feature,
const float3* groundPos)
{
if (!haveWorldTooltip) {
return "";
}
static const LuaHashString cmdStr("WorldTooltip");
if (!cmdStr.GetGlobalFunc(L)) {
haveWorldTooltip = false;
return ""; // the call is not defined
}
int args;
if (unit) {
HSTR_PUSH(L, "unit");
lua_pushnumber(L, unit->id);
args = 2;
}
else if (feature) {
HSTR_PUSH(L, "feature");
lua_pushnumber(L, feature->id);
args = 2;
}
else if (groundPos) {
HSTR_PUSH(L, "ground");
lua_pushnumber(L, groundPos->x);
lua_pushnumber(L, groundPos->y);
lua_pushnumber(L, groundPos->z);
args = 4;
}
else {
HSTR_PUSH(L, "selection");
args = 1;
}
// call the routinea
if (!RunCallIn(cmdStr, args, 1)) {
return "";
}
if (!lua_isstring(L, -1)) {
lua_pop(L, 1);
return "";
}
const string retval = lua_tostring(L, -1);
lua_pop(L, 1);
return retval;
}
bool CLuaUI::MapDrawCmd(int playerID, int type,
const float3* pos0,
const float3* pos1,
const string* label)
{
if (!haveMapDrawCmd) {
return false;
}
static const LuaHashString cmdStr("MapDrawCmd");
if (!cmdStr.GetGlobalFunc(L)) {
haveMapDrawCmd = false;
return false; // the call is not defined
}
int args;
lua_pushnumber(L, playerID);
if (type == CInMapDraw::NET_POINT) {
HSTR_PUSH(L, "point");
lua_pushnumber(L, pos0->x);
lua_pushnumber(L, pos0->y);
lua_pushnumber(L, pos0->z);
lua_pushstring(L, label->c_str());
args = 6;
}
else if (type == CInMapDraw::NET_LINE) {
HSTR_PUSH(L, "line");
lua_pushnumber(L, pos0->x);
lua_pushnumber(L, pos0->y);
lua_pushnumber(L, pos0->z);
lua_pushnumber(L, pos1->x);
lua_pushnumber(L, pos1->y);
lua_pushnumber(L, pos1->z);
args = 8;
}
else if (type == CInMapDraw::NET_ERASE) {
HSTR_PUSH(L, "erase");
lua_pushnumber(L, pos0->x);
lua_pushnumber(L, pos0->y);
lua_pushnumber(L, pos0->z);
lua_pushnumber(L, 100.0f); // radius
args = 6;
}
else {
logOutput.Print("Unknown MapDrawCmd() type");
lua_pop(L, 2); // pop the function and playerID
return false;
}
// call the routine
if (!RunCallIn(cmdStr, args, 1)) {
return false;
}
// take the event?
if (!lua_isboolean(L, -1)) {
lua_pop(L, 1);
return false;
}
const bool retval = lua_toboolean(L, -1);
lua_pop(L, 1);
return retval;
}
bool CLuaUI::GameSetup(const string& state, bool& ready,
const map<int, string>& playerStates)
{
static const LuaHashString cmdStr("GameSetup");
if (!cmdStr.GetGlobalFunc(L)) {
return false;
}
lua_pushstring(L, state.c_str());
lua_pushboolean(L, ready);
lua_newtable(L);
map<int, string>::const_iterator it;
for (it = playerStates.begin(); it != playerStates.end(); ++it) {
lua_pushnumber(L, it->first);
lua_pushstring(L, it->second.c_str());
lua_rawset(L, -3);
}
// call the routinea
if (!RunCallIn(cmdStr, 3, 2)) {
return false;
}
if (lua_isboolean(L, -2)) {
if (lua_toboolean(L, -2)) {
if (lua_isboolean(L, -1)) {
ready = lua_toboolean(L, -1);
}
lua_pop(L, 2);
return true;
}
}
lua_pop(L, 2);
return false;
}
/******************************************************************************/
bool CLuaUI::KeyPress(unsigned short key, bool isRepeat)
{
static const LuaHashString cmdStr("KeyPress");
if (!cmdStr.GetGlobalFunc(L)) {
return false; // the call is not defined, do not take the event
}
lua_pushnumber(L, key);
lua_newtable(L);
HSTR_PUSH_BOOL(L, "alt", !!keys[SDLK_LALT]);
HSTR_PUSH_BOOL(L, "ctrl", !!keys[SDLK_LCTRL]);
HSTR_PUSH_BOOL(L, "meta", !!keys[SDLK_LMETA]);
HSTR_PUSH_BOOL(L, "shift", !!keys[SDLK_LSHIFT]);
lua_pushboolean(L, isRepeat);
CKeySet ks(key, false);
lua_pushstring(L, ks.GetString(true).c_str());
// call the function
if (!RunCallIn(cmdStr, 4, 1)) {
return false;
}
const int args = lua_gettop(L);
if (!lua_isboolean(L, -1)) {
lua_pop(L, 1);
return false;
}
const bool retval = !!lua_toboolean(L, -1);
lua_pop(L, 1);
return retval;
}
bool CLuaUI::KeyRelease(unsigned short key)
{
static const LuaHashString cmdStr("KeyRelease");
if (!cmdStr.GetGlobalFunc(L)) {
return false; // the call is not defined, do not take the event
}
lua_pushnumber(L, key);
lua_newtable(L);
HSTR_PUSH_BOOL(L, "alt", !!keys[SDLK_LALT]);
HSTR_PUSH_BOOL(L, "ctrl", !!keys[SDLK_LCTRL]);
HSTR_PUSH_BOOL(L, "meta", !!keys[SDLK_LMETA]);
HSTR_PUSH_BOOL(L, "shift", !!keys[SDLK_LSHIFT]);
CKeySet ks(key, false);
lua_pushstring(L, ks.GetString(true).c_str());
// call the function
if (!RunCallIn(cmdStr, 3, 1)) {
return false;
}
if (!lua_isboolean(L, -1)) {
lua_pop(L, 1);
return false;
}
const bool retval = !!lua_toboolean(L, -1);
lua_pop(L, 1);
return retval;
}
bool CLuaUI::MouseMove(int x, int y, int dx, int dy, int button)
{
static const LuaHashString cmdStr("MouseMove");
if (!cmdStr.GetGlobalFunc(L)) {
return false; // the call is not defined, do not take the event
}
lua_pushnumber(L, x - gu->viewPosX);
lua_pushnumber(L, gu->viewSizeY - y - 1);
lua_pushnumber(L, dx);
lua_pushnumber(L, -dy);
lua_pushnumber(L, button);
// call the function
if (!RunCallIn(cmdStr, 5, 1)) {
return false;
}
if (!lua_isboolean(L, -1)) {
lua_pop(L, 1);
return false;
}
const bool retval = !!lua_toboolean(L, -1);
lua_pop(L, 1);
return retval;
}
bool CLuaUI::MousePress(int x, int y, int button)
{
static const LuaHashString cmdStr("MousePress");
if (!cmdStr.GetGlobalFunc(L)) {
return false; // the call is not defined, do not take the event
}
lua_pushnumber(L, x - gu->viewPosX);
lua_pushnumber(L, gu->viewSizeY - y - 1);
lua_pushnumber(L, button);
// call the function
if (!RunCallIn(cmdStr, 3, 1)) {
return false;
}
if (!lua_isboolean(L, -1)) {
lua_pop(L, 1);
return false;
}
const bool retval = !!lua_toboolean(L, -1);
lua_pop(L, 1);
return retval;
}
int CLuaUI::MouseRelease(int x, int y, int button)
{
static const LuaHashString cmdStr("MouseRelease");
if (!cmdStr.GetGlobalFunc(L)) {
return false; // the call is not defined, do not take the event
}
lua_pushnumber(L, x - gu->viewPosX);
lua_pushnumber(L, gu->viewSizeY - y - 1);
lua_pushnumber(L, button);
// call the function
if (!RunCallIn(cmdStr, 3, 1)) {
return false;
}
if (!lua_isnumber(L, -1)) {
lua_pop(L, 1);
return -1;
}
const int retval = (int)lua_tonumber(L, -1) - 1;
lua_pop(L, 1);
return retval;
}
bool CLuaUI::MouseWheel(bool up, float value)
{
static const LuaHashString cmdStr("MouseWheel");
if (!cmdStr.GetGlobalFunc(L)) {
return false; // the call is not defined, do not take the event
}
lua_pushboolean(L, up);
lua_pushnumber(L, value);
// call the function
if (!RunCallIn(cmdStr, 2, 1)) {
return false;
}
if (!lua_isboolean(L, -1)) {
lua_pop(L, 1);
return false;
}
const bool retval = !!lua_toboolean(L, -1);
lua_pop(L, 1);
return retval;
}
bool CLuaUI::IsAbove(int x, int y)
{
static const LuaHashString cmdStr("IsAbove");
if (!cmdStr.GetGlobalFunc(L)) {
return false; // the call is not defined
}
lua_pushnumber(L, x - gu->viewPosX);
lua_pushnumber(L, gu->viewSizeY - y - 1);
// call the function
if (!RunCallIn(cmdStr, 2, 1)) {
return false;
}
if (!lua_isboolean(L, -1)) {
lua_pop(L, 1);
return false;
}
const bool retval = !!lua_toboolean(L, -1);
lua_pop(L, 1);
return retval;
}
string CLuaUI::GetTooltip(int x, int y)
{
static const LuaHashString cmdStr("GetTooltip");
if (!cmdStr.GetGlobalFunc(L)) {
return ""; // the call is not defined
}
lua_pushnumber(L, x - gu->viewPosX);
lua_pushnumber(L, gu->viewSizeY - y - 1);
// call the function
if (!RunCallIn(cmdStr, 2, 1)) {
return "";
}
if (!lua_isstring(L, -1)) {
lua_pop(L, 1);
return "";
}
const string retval = lua_tostring(L, -1);
lua_pop(L, 1);
return retval;
}
bool CLuaUI::HasLayoutButtons()
{
static const LuaHashString cmdStr("LayoutButtons");
if (!cmdStr.GetGlobalFunc(L)) {
return false; // the call is not defined
}
lua_pop(L, 1);
return true;
}
bool CLuaUI::LayoutButtons(int& xButtons, int& yButtons,
const vector<CommandDescription>& cmds,
vector<int>& removeCmds,
vector<CommandDescription>& customCmds,
vector<int>& onlyTextureCmds,
vector<ReStringPair>& reTextureCmds,
vector<ReStringPair>& reNamedCmds,
vector<ReStringPair>& reTooltipCmds,
vector<ReParamsPair>& reParamsCmds,
map<int, int>& buttonList,
string& menuName)
{
customCmds.clear();
removeCmds.clear();
reTextureCmds.clear();
reNamedCmds.clear();
reTooltipCmds.clear();
onlyTextureCmds.clear();
buttonList.clear();
menuName = "";
const int top = lua_gettop(L);
static const LuaHashString cmdStr("LayoutButtons");
if (!cmdStr.GetGlobalFunc(L)) {
return false;
}
lua_pushnumber(L, xButtons);
lua_pushnumber(L, yButtons);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?