演示
-- ***************************************************************************************************** --
-- code by http://www.Cgdev.me
-- 地图库Map示范脚本
-- #更新日志#
-- TYPE ***** TIME ***** Editor ***** Text
-- CREATE 2013/01/19 Free
-- ADD 2013/01/20 Free 针对Map库的函数进行示范性演示,全部使用全局的Talk事件触发
-- #基本设置#
-- 定义Lua地图的MAPID,不可修改
local LUAMAPID = %地图类型_LUAMAP%;
-- #使用说明#
-- 在游戏中输入如下命令并发出,即可触发
-- copymap,地图类型,地图ID --> 复制指定地图
-- mazemap,x坐标范围,y坐标范围,地图名 --> 制作指定大小随机地图
-- delmap,地图ID --> 删除指定Lua地图
-- getpos,地图ID --> 获取指定Lua生成的随机地图中的随机可用的坐标点
-- getimage --> 获取当前人物坐标的地板图档号和物件图档号
-- setimage --> 设置当前人物坐标的地板/物件图档号
-- dumpmap,路径,地图ID,写入ID --> 将指定Lua地图生成成地图文件保存在指定路径中
-- #注意事项#
-- 生成随机地图时候,会暂停游戏中本身随机地图的生成,如果随机地图设置过大,可能需要很长时间才能生成好地图,请自行测试。
-- makeMazeMap函数中调用的Map.MakeMazeMap的各项参数请查阅相关文档进行查看,也可在论坛/QQ群中进行讨论
-- 该脚本并未经过完全的测试,如遇问题,绝对不稀奇。
-- ***************************************************************************************************** --
--注册事件委托
Delegate.RegDelTalkEvent("MapProc_TalkEvent");
-- 创建复制地图
-- 参数定义 index: 玩家对象
-- c_mapid: 要复制的地图的Map ID
-- c_floor: 要复制的地图的Floor ID
function makeCopyMap(index, c_mapid, c_floor)
local newFloorID = Map.MakeCopyMap(c_mapid, c_floor);
if(newFloorID == -1)then
NLG.SystemMessage(index, "地图复制失败。");
else
NLG.SystemMessage(index, "地图"..c_mapid..","..c_floor.."已经成功复制到"..LUAMAPID..","..newFloorID);
NLG.SystemMessage(index, "使用GM命令[warp "..LUAMAPID.." "..newFloorID.." x坐标 y坐标] 可以移动过去看看哦");
end
return;
end
-- 创建随机地图
-- 参数定义 index: 玩家对象
-- xsiz: 要生成的地图的x坐标范围
-- ysiz: 要生成的地图的y坐标范围
-- mapName: 地图名
-- 函数说明:MakeMazeMap是需要定义回调函数的,当生成完毕后,会触发定义的回调函数,返回生成的地图是否完毕
function makeMazeMap(index, xsiz, ysiz, mapName)
--Map.MakeMazeMap参数简要说明
--[[
----------------------------
回调函数所在文件
回调函数名
地图x坐标最大值
地图y坐标最大值
地图名
---------------------------- 可选参数,定义地图调色板号
调色板ID
---------------------------- 可选参数,定义随机生成地图的一些变量
随机地图块大小
随机地图块x坐标最小值
随机地图块y坐标最小值
随机地图块x坐标最大值
随机地图块y坐标最大值
---------------------------- 可选参数,定义地图图档信息
地图地板图档编号
地图其他图档编号
地图其他物件编号
---------------------------- 可选参数,定义地图墙面,如果全部写0,则会自动生成洞窟墙面
墙横向图档编号
墙横向反向图档编号
墙纵向图档编号
墙纵向反向图档编号
墙相交图档编号
----------------------------
--]]
local newFloorID = Map.MakeMazeMap(nil,"mazeMapDoneCall",xsiz,ysiz,mapName,0,30,30,30,30,30,9491,100,0,0,0,0,0,0);
if(newFloorID == -1)then
NLG.SystemMessage(index, "地图生成失败。");
else
NLG.SystemMessage(index, "地图"..LUAMAPID..","..newFloorID.."已经开始生成了...请稍后");
end
return;
end
-- 创建随机地图的回调函数
-- 参数定义 floorID: 生成的地图的Floor ID
-- doneflg: 生成结果
function mazeMapDoneCall(floorID, doneflg)
if(doneflg == 1)then
NLG.SystemMessage(-1,"生成地图"..LUAMAPID..","..floorID.."成功!");
NLG.SystemMessage(index, "可以通过使用getpos,"..floorID.."来获取一个合法的坐标点");
else
NLG.SystemMessage(-1,"生成地图"..LUAMAPID..","..floorID.."失败!");
end
end
-- 获取随机地图可用的坐标
-- 参数定义 index: 玩家对象
-- floorID: 随机地图的Floor ID
function getPosition(index, floorID)
local mapx, mapy = Map.GetAvailablePos(floorID);
if(mapx == 0 and mapy == 0)then
NLG.SystemMessage(index,"获取地图可用坐标失败,请重试");
else
NLG.SystemMessage(index,"获取地图"..LUAMAPID..","..floorID.."可用坐标"..mapx..","..mapy);
NLG.SystemMessage(index, "使用GM命令[warp "..LUAMAPID.." "..floorID.." "..mapx.." "..mapy.."] 可以移动过去看看哦");
end
return;
end
-- 获取当前玩家坐标的地板图档号与物件(obj)图档号
-- 参数定义 index: 玩家对象
function getTileandObj(index)
local nowMap = Char.GetData(index, %对象_MAP%);
local nowFloor = Char.GetData(index, %对象_地图%);
local nowXpos = Char.GetData(index, %对象_X%);
local nowYpos = Char.GetData(index, %对象_Y%);
local tile, obj = Map.GetImage(nowMap,nowFloor,nowXpos,nowYpos);
NLG.SystemMessage(index,"获取地图"..nowMap..","..nowFloor..","..nowXpos..","..nowYpos.."的地图元素[地板:"..tile.."],[物件:"..obj.."]");
return;
end
-- 设置当前玩家坐标的地板图档号与物件(obj)图档号,函数会自动判定图档属于地板还是物件
-- 参数定义 index: 玩家对象
-- image: 图档号
function setTileandObj(index, image)
local nowMap = Char.GetData(index, %对象_MAP%);
local nowFloor = Char.GetData(index, %对象_地图%);
local nowXpos = Char.GetData(index, %对象_X%);
local nowYpos = Char.GetData(index, %对象_Y%);
local ori_tile, ori_obj = Map.GetImage(nowMap,nowFloor,nowXpos,nowYpos);
Map.SetImage(nowMap,nowFloor,nowXpos,nowYpos, image);
local now_tile, now_obj = Map.GetImage(nowMap,nowFloor,nowXpos,nowYpos);
NLG.SystemMessage(index,"地图"..nowMap..","..nowFloor..","..nowXpos..","..nowYpos.."的地图元素变更[地板:"..ori_tile.."->"..now_tile.."],[物件:"..ori_obj.."->"..now_obj.."]");
return;
end
-- 输出地图文件到本地路径中
-- 参数定义 index: 玩家对象
-- path: 本地路径,不包含文件名,文件夹以"\"结尾
-- floorID: Lua地图的地图Floor号
-- writeAsFloor: 写出文件中定义的地图编号
function dumpMapFile(index, path, floorID, writeAsFloor)
local ret = Map.DumpLuaMap(path, floorID, writeAsFloor);
if (ret == 0) then
NLG.SystemMessage(index,"地图"..LUAMAPID..","..floorID.."输出至文件失败!");
else
NLG.SystemMessage(index,"地图"..LUAMAPID..","..floorID.."已经输出至文件:["..path..LUAMAPID.."_"..floorID.."]");
end
return;
end
-- 删除Lua生成的地图,释放地图编号
-- 参数定义 floorID: Lua地图的地图Floor编号
function deleteLuaMap(index, floorID)
local ret = Map.DelLuaMap(floorID);
if (ret == 0) then
NLG.SystemMessage(index,"地图"..LUAMAPID..","..floorID.."删除失败!");
else
NLG.SystemMessage(index,"地图"..LUAMAPID..","..floorID.."已经成功删除!");
end
return;
end
-- NL.AllTaklEventCallBack的委托调用
-- 参数定义 http://lua.cgdev.me/doku.php?id=lua:nl:callback:talkcallback
function MapProc_TalkEvent(index, msg, col, range, size)
local token = Split(msg,",")
if(string.find(msg,","))then
local token = Split(msg,",")
end
if(string.find(msg,"copymap"))then
local m = tonumber(token[2]);
local f = tonumber(token[3]);
makeCopyMap(index, m ,f);
return 1;
end
if(string.find(msg,"mazemap"))then
local xsiz = tonumber(token[2]);
local ysiz = tonumber(token[3]);
local MapName = token[4];
makeMazeMap(index, xsiz, ysiz, MapName);
return 1;
end
if(string.find(msg,"delmap"))then
local f = tonumber(token[2]);
deleteLuaMap(index, f);
return 1;
end
if(string.find(msg,"getpos"))then
local f = tonumber(token[2]);
getPosition(index, f);
return 1;
end
if(msg=="getimage")then
getTileandObj(index);
return 1;
end
if(string.find(msg,"setimage"))then
image = tonumber(token[2]);
setTileandObj(index, image);
return 1;
end
if(string.find(msg,"dumpmap"))then
path = token[2];
floorID = tonumber(token[3]);
writeAsFloor = tonumber(token[4]);
dumpMapFile(index, path, floorID, writeAsFloor);
return 1;
end
end