找回密码
 注册
搜索
查看: 1289|回复: 22

公版僧舍地图的一个解法

[复制链接]
门派:桃花岛
发表于 2020-2-29 09:48:53 | 显示全部楼层 |阅读模式
早上发现shaolin/sengshe3地图出了问题
看了下locate 的记录是当成了sengshe2

很有意思我就看了看代码
第一反应就是sengshe3居然没有room_relative,然后跑过去locate一把拷贝了下来
所以第一个改动
  1. - rooms.lua

  2. Room {
  3.         id = "shaolin/sengshe3",
  4.         name = "僧舍",
  5.         no_fight = true,
  6.         ways = {
  7.                 ["north"] = "shaolin/sengshe1",
  8.         },
  9.         room_relative="僧舍|僧舍僧舍",
  10. }
复制代码


但是sengshe3 和僧舍2的relative秒输是一样的?
那怎么处理呢?
第一反应最简单就是学比别的地图写个肯定成功的路径,例如n,n,s  或者s,s,n 保证跑到sengshe1就能找对位置了

但是这样就不能灌水了啊!

所以我们来改善下写法

目前path_consider如果遇到同名房间,做法就是比较room_relative
拿第一个相同的房间来尝试行走。

那我们能不能比较下出口呢?
众所周知,出口在地图的ways里面有, 当前房间也存在了exit.locl.那就改造下把!

ways是hashmap类型表格,key是路径方向,例如north, south.
exit.locl 是类array表格,key是数字,value是方向
所以我们写个简单的方程把ways的key拿出来比较

  1. function tablelength(T)
  2.     local count = 0
  3.     for _ in pairs(T) do count = count + 1 end
  4.     return count
  5. end
复制代码


然后就是改造path_consider,这里代码也不复杂,我懒得打字,大家看看吧。。
  1.             for i = 1, table.getn(sour.rooms) do
  2.                 local roomInfo = map.rooms[sour.rooms[i]]
  3.                 if (locl.room_relation ~= '' and
  4.                     roomInfo.room_relative == locl.room_relation) then
  5.                     if exit.locl and roomInfo.ways and #exit.locl == tablelength(roomInfo.ways) then
  6.                         local match = true
  7.                         for k,v in ipairs(exit.locl) do
  8.                             if not roomInfo.ways[v] then
  9.                                 match = false
  10.                             end
  11.                         end
  12.                         if match then
  13.                             sour.id = sour.rooms[i]
  14.                             chats_locate('定位系统:尝试精确定位!猜测目前位置为'..sour.id,
  15.                             'LimeGreen')                          
  16.                             return check_halt(path_consider)
  17.                         end
  18.                     else
  19.                         chats_locate('定位系统:尝试精确定位!',
  20.                         'LimeGreen')
  21.                         sour.id = sour.rooms[i]
  22.                         return check_halt(path_consider)
  23.                     end

  24.                     -- return go(road.act,dest.area,dest.room,sour.rooms[i])
  25.                 end
  26.             end
复制代码

评分

1

查看全部评分

门派:天龙寺
发表于 2020-2-29 10:12:55 | 显示全部楼层
我是来学习的                                                   
门派:华山派
发表于 2020-2-29 13:52:16 | 显示全部楼层
room_relative就是根据出口room做出来的
一般来说room_relative一样的2个room,出口也是一样的
不能根据出口来判断
门派:桃花岛
 楼主| 发表于 2020-2-29 14:06:25 | 显示全部楼层
xyxs@tj 发表于 2020-2-29 13:52
room_relative就是根据出口room做出来的
一般来说room_relative一样的2个room,出口也是一样的
不能根据 ...

僧舍就不是
就算退一步来讲,反正relative也一样,那在判断一下出口也没问题啊
为啥不能呢?
如果出口也一样,跟以前逻辑完全没区别,选第一个尝试
如果出口不一样,才会看下一个同名房间。
我不知道你为啥认为一定是一样的,但我并没有只根据出口来判断
所以这个逻辑不会有负面作用
门派:古墓派
发表于 2020-2-29 18:52:28 | 显示全部楼层
xyxs@tj 发表于 2020-2-29 13:52
room_relative就是根据出口room做出来的
一般来说room_relative一样的2个room,出口也是一样的
不能根据 ...

出口是可以作为一种判断方式的,当然,不是所有都适用,个别的用出口还是挺有用的。
门派:天龙寺
发表于 2020-2-29 23:15:01 | 显示全部楼层
学习了, 等下改来试试                    
门派:铁掌帮
发表于 2020-2-29 23:29:48 | 显示全部楼层
真的是不明觉厉啊         
门派:铁掌帮
发表于 2020-2-29 23:30:21 | 显示全部楼层
努力的看了半天,还是一知半解
门派:明教
发表于 2020-3-1 00:36:33 来自手机 | 显示全部楼层
这是大神们的讨论贴啊
门派:桃花岛
发表于 2020-3-1 08:58:37 | 显示全部楼层
这个思路不错,我认为在 位置定位的时候,如果发现 该名称存在有多个rooms 的时候,可以进一步采用 出口或者 room内的 objectid 来做比较。。。如果还是存在多个,则取第一个。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|书剑永恒MUD ( 闽ICP备14012032号|闽公网安备 35050202000162号 )

GMT+8, 2025-8-14 10:32 , Processed in 0.053936 second(s), 29 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表