syntax = "proto3"; option go_package = "/pb"; package pb; //{slgeditor}这个标签是地图编辑器相关。 //{slgeditor enter=MapData } // 地图数据主消息 message MapData { // 地图基本信息 MapInfo map_info = 1; //{slgeditor param=MapData.tiles fill=array from=cells } 用这个标签表示这个数组按NxN格子填充 //地块(格子)数据数组 //索引计算公式:index = y * width + x repeated TileData tiles = 2; //{slgeditor param=MapData.castles fill=map from=instances key=center globalTagInv=BuildingType globalTagInvVelue=0|10} 用对象列表中对象公共属性 BuildingType != 0 的对象填充列表, //系统城 //系统城 map castles = 4; //跨洲寻路概览 //{slgeditor param=MapData.path_summary} CrossStatePathSummary path_summary = 9; // 元数据,编辑器专用,方便定位修改记录 MapMetadata metadata = 10; } // 地图基本信息 message MapInfo { //{slgeditor param=MapInfo.map_id src=global path=map_id} //地图 int32 map_id = 1; //{slgeditor param=MapInfo.version_code src=global path=version_code} // 地图版本号 int32 version_code = 2; //{slgeditor param=MapInfo.width src=global path=mapwith} // 地图宽度(格子数) int32 width = 3; //{slgeditor param=MapInfo.height src=global path=mapwith} // 地图高度(格子数) int32 height = 4; // 场景名称 string unity_scene_name =5 ; //{slgeditor param=MapInfo.map_name src=global path=map_name} // 地图名称 string map_name = 6; // 地图描述 string description = 7; } // 格子数据 message TileData { //{slgeditor param=TileData.coord_index src=cell kind=pos} cell这种类型的情况,cell=pos导出格子的位置。 // 格子索引(行优先顺序) // 索引计算公式:index = y * width + x // 索引从0开始,最大值为 (width * height - 1) int32 coord_index = 1; //{slgeditor param=TileData.county_id src=cell kind=area} cell这种类型的情况,cell=area 导出区域信息 反正就是导出最低一层是区域。简单来说,导出json的时候建筑有 Area0 Area1 Area2.反正就是最低一层所在的区域节点。 // 所在县组合规则: //例如 1 001 001 //州ID(001-999) + 省ID(001-999) + 县(001-999) //相当于原json Area1 + Area2 + Area3 // Area2 int32 county_id = 2; //{slgeditor param=TileData.terrain src=cell kind=ground }//这个意思是把地图碰撞值放在这里,就是那个山,水,地面那个 // 地形类型 TerrainType terrain = 3; //{slgeditor param=TileData.block_type src=cell kind=walkabletag} // 这个就是当前格子的地面信息是否地面可放置层。 //是否静态固定阻挡 MapWalkableTag block_type = 4; //{slgeditor param=TileData.castle_center src=cell kind=center globalTagInv=BuildingType globalTagInvVelue=0|10 default=-1} //这个表示检查当前格子是否被某种instance占用,包括Point,Offset.如果有,这里是instance的center,否则则是defaul值-1 //系统物件中心点,坐标索引,没有就是-1 int32 castle_center = 5; //{slgeditor param=TileData.is_state_boundary src=cell kind=gperimeter} //是否州界 bool is_state_boundary = 6; } //行走动态标签tag enum MapWalkableTag { //不可行走 mwt_disable = 0; //可行走 mwt_enable = 1; //动态区域,区域通道占位点的格子标志这个 mwt_dymamic = 2; } //系统城/卫城/关隘/渡口/码头 // 2026.1.14 策划说码头是一个整体,只有一个血条,因此合并系统城/卫城/关隘/渡口/码头数据 message CastleData { //中心点 换算公式 index = y * width + x //{slgeditor param=CastleData.center src=instance prop=pos} // 所有Vector2In都映射成 y * width + x int32 center = 1; //{slgeditor param=CastleData.config_id src=instance prop=exportId} // 就是导出Instance的id //配置Id int32 config_id = 2; //{slgeditor param=CastleData.occupied_coords src=instance prop=offsets} //占据面积(位置索引的集合),不含子建筑(卫城等) repeated int32 occupied_coords = 3; //{slgeditor param=CastleData.parent src=instance prop=parent} //父建筑数据(如有),坐标索引 int32 parent = 4; //{slgeditor param=CastleData.childs src=instance prop=childs} //子建筑数据(如有),坐标索引列表 repeated int32 childs = 5; //{slgeditor param=CastleData.appearance_index src=instance prop=AppearanceIndex} // 外观索引 //外观索引 int32 appearance_index = 6; //{slgeditor param=CastleData.tag_TilePoints fill=map_entry key=1 path=GarrisonPoint} //{slgeditor param=CastleData.tag_TilePoints fill=map_entry key=2 path=MainForce} // 将自定义点数组写入 tag_TilePoints[1].TilePoints.list(自动从 TilePoints 的 point_list_field 配置获取字段名) //{slgeditor param=CastleData.tag_TilePoints fill=map_entry key=3 path=SiegeSquad} //{slgeditor param=CastleData.tag_TilePoints fill=map_entry key=4 path=SiegePoints} //{slgeditor param=CastleData.tag_TilePoints fill=map_entry key=5 path=PassageWay} //{slgeditor param=CastleData.tag_TilePoints fill=map_entry key=6 path=Wall} //标签坐标列表,如驻守点等 // Protobuf 的 map key 不支持 enum,改用 int32(存 MapRuleTag 的数值) map tag_TilePoints = 7; //系统对象类型(系统城、卫城、关隘、渡口、码头) //{slgeditor param=CastleData.sys_type src=tag name=BuildingType} SysObjType sys_type = 8; } //策划动态添加的tag enum MapRuleTag { //无,默认值 mrt_none = 0; //驻守点 mrt_garrison_point = 1; //攻城主力站位 mrt_main_force = 2; //拆迁队站位 mrt_siege_squad = 3; //攻城交战位置(与守军交战的位置) mrt_siege_Points = 4; //通道,关隘/渡口/码头等需要 mrt_passageway = 5; //城墙 mrt_wall = 6; } // 地形/地表类型 enum TerrainType { tt_none = 0; tt_grass = 1; //草地 tt_mountain = 2; //山 tt_water=3; //水 tt_snowfield = 4; //雪地 tt_desert = 5; //沙漠 tt_wall = 10;//城墙 tt_foundation=20; //联盟驻地城内地基 } // 系统对象(系统城/卫城/关卡/码头)类型 enum SysObjType{ so_none = 0; //无 so_castle = 1; //系统城 so_moutain_pass = 2 ; //关隘 so_river_crossing = 3; //渡口 so_dock = 4; //码头 so_town = 5; //卫城 } // 地图元数据 message MapMetadata { // 创建时间(Unix时间戳) int64 created_time = 1; // 修改时间(Unix时间戳) int64 modified_time = 2; // 作者 string author = 3; // 编辑器版本 string editor_version = 4; // 备注 string notes = 5; // 标签 repeated string tags = 6; } //---------------------------------------------------------------- //跨州寻路 //跨州寻路参考 message CrossStatePathSummary { //{slgeditor param=CrossStatePathSummary.one_way_path fill=map from=areaMap areaLevel=1} 这是一个跨区域寻路字典,以区域第1层划分区域。 areaLevel=i,就是区域以哪级为主。 //遍历所有区域创建字典one_way_path[区域Id] //key为起始州Id map one_way_path = 1; } //州目标 message AreaStateTarget { //查找所有建筑,当拥有PassageWay自定义点数据集合,并且查询第一个点和最后一个点 //如果第一个点是属于当前区域,则添加PassageWay的点的数组到字典。 //如果第而个点是属于当前区域,则添加PassageWay的点的顺序反转的数组数组到字典。 //以此表示当前两个区域连续。 //支持多条路径:同一个目标区域可以有多个通道点实例,每个实例生成一条路径,所有路径存储在TilePathList中 //{slgeditor param=AreaStateTarget.targets fill=map from=areaPath path=PassageWay areaLevel=1} // 自动从 TilePathList 和 TilePoints 的 point_list_field 配置获取字段名 map targets = 1; } //多条路径列表 //{slgeditor point_list_field=path_list message=TilePathList} // 指定 TilePathList 消息中用于存储路径列表的字段名 message TilePathList { //多条路径列表 //{slgeditor param=TilePathList.path_list fill=array manual=true} // 手动填充,不需要映射规则 repeated TilePoints path_list =1 ; } //路径点(坐标索引)列表 //{slgeditor point_list_field=points message=TilePoints} // 指定 TilePoints 消息中用于存储点列表的字段名 message TilePoints { repeated int32 points =1 ; }