manuelly set map
3
.gitignore
vendored
@@ -153,4 +153,5 @@ local_config.yml
|
||||
台本/
|
||||
笔记/
|
||||
tmp/
|
||||
tmp2/
|
||||
tmp2/
|
||||
tmp3/
|
||||
BIN
assets/tiles/bamboo.png
Normal file
|
After Width: | Height: | Size: 85 KiB |
BIN
assets/tiles/gobi.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
assets/tiles/island.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 52 KiB |
BIN
assets/tiles/tundra.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
@@ -12,4 +12,9 @@ id,name,desc,shape,north-west-cor,south-east-cor,animal_ids,plant_ids
|
||||
110,青云林海,古树参天,绿意盎然。此地森林广袤,物产丰富,是伐木工和猎人的主要活动区域。,rectangle,"40,10","59,29",,7
|
||||
111,炎狱火山,烈焰冲天,岩浆奔流。此地火山活跃,地热丰富,是铁匠锻造的理想之地,但也极其危险。,square,"52,32","54,34",8,
|
||||
112,沃土良田,土地肥沃,五谷丰登。此地土壤深厚,雨水充沛,是农民耕种的黄金宝地。,rectangle,"33,25","37,29",,8
|
||||
113,迷雾沼泽,雾气缭绕,泥泞不堪。此地地形复杂,瘴气丛生,是盗贼和亡命之徒的藏身之所。,rectangle,"42,30","45,33",9,
|
||||
113,幽冥毒泽,终年被五色瘴气笼罩,毒虫遍地。凡人入之即化为白骨,唯有修习毒功者视此处为无上洞天。,rectangle,"42,30","45,33",9,
|
||||
114,十万大山,苍茫群山连绵不绝,乃是妖族祖地。山势险峻,道路难行。,
|
||||
115,紫竹幽境,紫竹成林,灵气清冽。风过林间若奏仙乐,在此静修可涤荡心魔,感悟天地自然之道。,
|
||||
116,凛霜荒原,寸草不生,冻土千尺。此地生机绝灭,却蕴含着极致的阴寒灵气,偶有万年玄冰出世。,
|
||||
117,碎星戈壁,飞沙走石,狂风如刀。传说曾有星辰陨落于此,至今仍残存着狂暴的星辰之力与天外陨铁。,
|
||||
118,蓬莱遗岛,孤悬海外,云雾缭绕。岛上灵泉喷涌,奇花异草遍布,灵气浓郁远超内陆,是海外散修向往之地。,
|
||||
|
||||
|
BIN
tools/img_gemini/origin/bamboo.jpg
Normal file
|
After Width: | Height: | Size: 121 KiB |
BIN
tools/img_gemini/origin/gobi.jpg
Normal file
|
After Width: | Height: | Size: 89 KiB |
BIN
tools/img_gemini/origin/island.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
tools/img_gemini/origin/marsh.jpg
Normal file
|
After Width: | Height: | Size: 113 KiB |
BIN
tools/img_gemini/origin/rainforest.jpg
Normal file
|
After Width: | Height: | Size: 105 KiB |
BIN
tools/img_gemini/origin/tundra.jpg
Normal file
|
After Width: | Height: | Size: 96 KiB |
110
tools/img_gemini/split.py
Normal file
@@ -0,0 +1,110 @@
|
||||
import os
|
||||
from PIL import Image, ImageChops
|
||||
|
||||
def trim_white_border(img, tolerance=50, shrink=2):
|
||||
"""
|
||||
Trims white border from the image with tolerance.
|
||||
Args:
|
||||
img: PIL Image to trim
|
||||
tolerance: Threshold for difference from white (0-255).
|
||||
Higher value means more aggressive trimming.
|
||||
shrink: Number of pixels to shrink inwards after finding the bbox.
|
||||
Helps remove anti-aliasing artifacts/white halo.
|
||||
"""
|
||||
if img.mode == 'RGBA':
|
||||
# Create a white background image
|
||||
bg = Image.new('RGBA', img.size, (255, 255, 255, 255))
|
||||
# Composite the image on top
|
||||
comp = Image.alpha_composite(bg, img)
|
||||
rgb_img = comp.convert('RGB')
|
||||
else:
|
||||
rgb_img = img.convert('RGB')
|
||||
|
||||
# Compare with pure white
|
||||
bg_white = Image.new('RGB', img.size, (255, 255, 255))
|
||||
diff = ImageChops.difference(rgb_img, bg_white)
|
||||
|
||||
# Convert to grayscale to find "distance" from white
|
||||
diff = diff.convert('L')
|
||||
|
||||
# Create a mask where Content=255, Background=0
|
||||
mask = diff.point(lambda x: 255 if x > tolerance else 0)
|
||||
|
||||
bbox = mask.getbbox()
|
||||
if bbox:
|
||||
left, upper, right, lower = bbox
|
||||
|
||||
# Apply shrink to remove the "halo"
|
||||
if shrink > 0:
|
||||
left += shrink
|
||||
upper += shrink
|
||||
right -= shrink
|
||||
lower -= shrink
|
||||
|
||||
# Safety check: ensure we didn't shrink into nothingness
|
||||
if left >= right or upper >= lower:
|
||||
# Revert to original bbox if shrink was too aggressive
|
||||
left, upper, right, lower = bbox
|
||||
|
||||
return img.crop((left, upper, right, lower))
|
||||
|
||||
return img
|
||||
|
||||
def split_and_process():
|
||||
base_dir = os.path.dirname(__file__)
|
||||
origin_dir = os.path.join(base_dir, 'origin')
|
||||
split_dir = os.path.join(base_dir, 'split')
|
||||
|
||||
if not os.path.exists(split_dir):
|
||||
os.makedirs(split_dir)
|
||||
|
||||
if not os.path.exists(origin_dir):
|
||||
print(f"Origin directory not found: {origin_dir}")
|
||||
return
|
||||
|
||||
files = [f for f in os.listdir(origin_dir) if f.lower().endswith(('.png', '.jpg', '.jpeg'))]
|
||||
|
||||
if not files:
|
||||
print("No images found in origin directory.")
|
||||
return
|
||||
|
||||
print(f"Found {len(files)} images to process.")
|
||||
|
||||
for filename in files:
|
||||
filepath = os.path.join(origin_dir, filename)
|
||||
try:
|
||||
img = Image.open(filepath)
|
||||
w, h = img.size
|
||||
cell_w = w // 3
|
||||
cell_h = h // 3
|
||||
|
||||
base_name = os.path.splitext(filename)[0]
|
||||
print(f"Processing {filename} ({w}x{h})...")
|
||||
|
||||
count = 0
|
||||
for r in range(3):
|
||||
for c in range(3):
|
||||
count += 1
|
||||
left = c * cell_w
|
||||
upper = r * cell_h
|
||||
right = left + cell_w
|
||||
lower = upper + cell_h
|
||||
|
||||
# Crop the grid cell
|
||||
crop = img.crop((left, upper, right, lower))
|
||||
|
||||
# Remove white border with more aggressive tolerance and shrinking
|
||||
# Tolerance 50 + Shrink 2px usually kills the halo
|
||||
final_img = trim_white_border(crop, tolerance=50, shrink=2)
|
||||
|
||||
save_name = f"{base_name}_{count}.png"
|
||||
save_path = os.path.join(split_dir, save_name)
|
||||
final_img.save(save_path)
|
||||
|
||||
print(f"Finished {filename}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Failed to process {filename}: {e}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
split_and_process()
|
||||
BIN
tools/img_gemini/split/bamboo_1.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
tools/img_gemini/split/bamboo_2.png
Normal file
|
After Width: | Height: | Size: 85 KiB |
BIN
tools/img_gemini/split/bamboo_3.png
Normal file
|
After Width: | Height: | Size: 91 KiB |
BIN
tools/img_gemini/split/bamboo_4.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
tools/img_gemini/split/bamboo_5.png
Normal file
|
After Width: | Height: | Size: 92 KiB |
BIN
tools/img_gemini/split/bamboo_6.png
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
tools/img_gemini/split/bamboo_7.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
tools/img_gemini/split/bamboo_8.png
Normal file
|
After Width: | Height: | Size: 97 KiB |
BIN
tools/img_gemini/split/bamboo_9.png
Normal file
|
After Width: | Height: | Size: 97 KiB |
BIN
tools/img_gemini/split/gobi_1.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
tools/img_gemini/split/gobi_2.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
tools/img_gemini/split/gobi_3.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
tools/img_gemini/split/gobi_4.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
tools/img_gemini/split/gobi_5.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
tools/img_gemini/split/gobi_6.png
Normal file
|
After Width: | Height: | Size: 67 KiB |
BIN
tools/img_gemini/split/gobi_7.png
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
tools/img_gemini/split/gobi_8.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
tools/img_gemini/split/gobi_9.png
Normal file
|
After Width: | Height: | Size: 61 KiB |
BIN
tools/img_gemini/split/island_1.png
Normal file
|
After Width: | Height: | Size: 110 KiB |
BIN
tools/img_gemini/split/island_2.png
Normal file
|
After Width: | Height: | Size: 120 KiB |
BIN
tools/img_gemini/split/island_3.png
Normal file
|
After Width: | Height: | Size: 108 KiB |
BIN
tools/img_gemini/split/island_4.png
Normal file
|
After Width: | Height: | Size: 122 KiB |
BIN
tools/img_gemini/split/island_5.png
Normal file
|
After Width: | Height: | Size: 102 KiB |
BIN
tools/img_gemini/split/island_6.png
Normal file
|
After Width: | Height: | Size: 119 KiB |
BIN
tools/img_gemini/split/island_7.png
Normal file
|
After Width: | Height: | Size: 106 KiB |
BIN
tools/img_gemini/split/island_8.png
Normal file
|
After Width: | Height: | Size: 120 KiB |
BIN
tools/img_gemini/split/island_9.png
Normal file
|
After Width: | Height: | Size: 114 KiB |
BIN
tools/img_gemini/split/marsh_1.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
tools/img_gemini/split/marsh_2.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
tools/img_gemini/split/marsh_3.png
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
tools/img_gemini/split/marsh_4.png
Normal file
|
After Width: | Height: | Size: 72 KiB |
BIN
tools/img_gemini/split/marsh_5.png
Normal file
|
After Width: | Height: | Size: 61 KiB |
BIN
tools/img_gemini/split/marsh_6.png
Normal file
|
After Width: | Height: | Size: 61 KiB |
BIN
tools/img_gemini/split/marsh_7.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
tools/img_gemini/split/marsh_8.png
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
tools/img_gemini/split/marsh_9.png
Normal file
|
After Width: | Height: | Size: 81 KiB |
BIN
tools/img_gemini/split/rainforest_1.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
tools/img_gemini/split/rainforest_2.png
Normal file
|
After Width: | Height: | Size: 73 KiB |
BIN
tools/img_gemini/split/rainforest_3.png
Normal file
|
After Width: | Height: | Size: 79 KiB |
BIN
tools/img_gemini/split/rainforest_4.png
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
tools/img_gemini/split/rainforest_5.png
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
tools/img_gemini/split/rainforest_6.png
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
tools/img_gemini/split/rainforest_7.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
tools/img_gemini/split/rainforest_8.png
Normal file
|
After Width: | Height: | Size: 78 KiB |
BIN
tools/img_gemini/split/rainforest_9.png
Normal file
|
After Width: | Height: | Size: 84 KiB |
BIN
tools/img_gemini/split/tundra_1.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
tools/img_gemini/split/tundra_2.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
tools/img_gemini/split/tundra_3.png
Normal file
|
After Width: | Height: | Size: 67 KiB |
BIN
tools/img_gemini/split/tundra_4.png
Normal file
|
After Width: | Height: | Size: 72 KiB |
BIN
tools/img_gemini/split/tundra_5.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
tools/img_gemini/split/tundra_6.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
BIN
tools/img_gemini/split/tundra_7.png
Normal file
|
After Width: | Height: | Size: 67 KiB |
BIN
tools/img_gemini/split/tundra_8.png
Normal file
|
After Width: | Height: | Size: 65 KiB |
BIN
tools/img_gemini/split/tundra_9.png
Normal file
|
After Width: | Height: | Size: 81 KiB |
263
tools/map_creator/main.py
Normal file
@@ -0,0 +1,263 @@
|
||||
import os
|
||||
import csv
|
||||
import json
|
||||
import glob
|
||||
from flask import Flask, render_template, jsonify, request, send_from_directory
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
# --- 配置路径 ---
|
||||
BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../"))
|
||||
ASSETS_DIR = os.path.join(BASE_DIR, "assets")
|
||||
CONFIG_DIR = os.path.join(BASE_DIR, "static", "game_configs")
|
||||
OUTPUT_DIR = os.path.dirname(__file__)
|
||||
|
||||
# 地图尺寸
|
||||
MAP_WIDTH = 100
|
||||
MAP_HEIGHT = 70
|
||||
|
||||
@app.route('/')
|
||||
def index():
|
||||
return render_template('index.html')
|
||||
|
||||
@app.route('/tiles/<path:filename>')
|
||||
def serve_tile_image(filename):
|
||||
return send_from_directory(os.path.join(ASSETS_DIR, "tiles"), filename)
|
||||
|
||||
@app.route('/sects/<path:filename>')
|
||||
def serve_sect_image(filename):
|
||||
return send_from_directory(os.path.join(ASSETS_DIR, "sects"), filename)
|
||||
|
||||
# 显式定义的区域-地形映射表
|
||||
# Key: 区域名称, Value: {"t": tile_name, "type": "tile" | "sect"}
|
||||
REGION_TILE_MAP = {
|
||||
# --- 普通区域 (Normal Regions) ---
|
||||
"平原地带": {"t": "plain", "type": "tile"},
|
||||
"西域流沙": {"t": "desert", "type": "tile"},
|
||||
"南疆蛮荒": {"t": "rainforest", "type": "tile"},
|
||||
"极北冰原": {"t": "glacier", "type": "tile"},
|
||||
"无边碧海": {"t": "sea", "type": "tile"},
|
||||
"天河奔流": {"t": "water", "type": "tile"},
|
||||
"青峰山脉": {"t": "mountain", "type": "tile"},
|
||||
"万丈雪峰": {"t": "snow_mountain", "type": "tile"},
|
||||
"碧野千里": {"t": "grassland", "type": "tile"},
|
||||
"青云林海": {"t": "forest", "type": "tile"},
|
||||
"炎狱火山": {"t": "volcano", "type": "tile"},
|
||||
"沃土良田": {"t": "farm", "type": "tile"},
|
||||
"幽冥毒泽": {"t": "swamp", "type": "tile"},
|
||||
"十万大山": {"t": "mountain", "type": "tile"},
|
||||
"紫竹幽境": {"t": "bamboo", "type": "tile"},
|
||||
"凛霜荒原": {"t": "tundra", "type": "tile"},
|
||||
"碎星戈壁": {"t": "gobi", "type": "tile"},
|
||||
"蓬莱遗岛": {"t": "island", "type": "tile"},
|
||||
|
||||
# --- 城市区域 (City Regions) ---
|
||||
"青云城": {"t": "city", "type": "tile"},
|
||||
"沙月城": {"t": "city", "type": "tile"},
|
||||
"翠林城": {"t": "city", "type": "tile"},
|
||||
|
||||
# --- 洞府遗迹 (Cultivate Regions) ---
|
||||
"太白金府": {"t": "cave", "type": "tile"},
|
||||
"青木洞天": {"t": "cave", "type": "tile"},
|
||||
"玄水秘境": {"t": "cave", "type": "tile"},
|
||||
"离火洞府": {"t": "cave", "type": "tile"},
|
||||
"厚土玄宫": {"t": "cave", "type": "tile"},
|
||||
"古越遗迹": {"t": "ruins", "type": "tile"},
|
||||
"沧海遗迹": {"t": "ruins", "type": "tile"},
|
||||
}
|
||||
|
||||
def get_default_tile(name, type_tag, all_tiles, all_sect_tiles):
|
||||
"""根据区域名称和类型查找默认 Tile"""
|
||||
|
||||
# 1. 查表 (精确匹配)
|
||||
if name in REGION_TILE_MAP:
|
||||
return REGION_TILE_MAP[name]
|
||||
|
||||
# 2. 宗门:尝试匹配 Sect 图片
|
||||
if type_tag == 'sect':
|
||||
# 尝试直接匹配宗门名
|
||||
if name in all_sect_tiles:
|
||||
return {"t": name, "type": "sect"}
|
||||
# 尝试部分匹配
|
||||
for t in all_sect_tiles:
|
||||
if t in name or name in t:
|
||||
return {"t": t, "type": "sect"}
|
||||
return {"t": "mountain", "type": "tile"} # 默认建在山上
|
||||
|
||||
# 3. 城市默认
|
||||
if type_tag == 'city':
|
||||
return {"t": "city", "type": "tile"}
|
||||
|
||||
# 4. 包含特定关键词的兜底逻辑 (针对未在表中的新区域)
|
||||
name_lower = name.lower()
|
||||
if '洞' in name_lower or '府' in name_lower or '秘境' in name_lower:
|
||||
return {"t": "cave", "type": "tile"}
|
||||
if '遗迹' in name_lower:
|
||||
return {"t": "ruins", "type": "tile"}
|
||||
|
||||
# 默认
|
||||
return {"t": "plain", "type": "tile"}
|
||||
|
||||
@app.route('/api/init')
|
||||
def init_data():
|
||||
"""初始化数据:读取Tiles列表和Region配置"""
|
||||
|
||||
# 1. 获取所有 Tile 图片名称
|
||||
tile_files = glob.glob(os.path.join(ASSETS_DIR, "tiles", "*.png"))
|
||||
tiles = [os.path.splitext(os.path.basename(f))[0] for f in tile_files]
|
||||
tiles.sort()
|
||||
|
||||
# 2. 获取所有 Sect 图片名称
|
||||
sect_files = glob.glob(os.path.join(ASSETS_DIR, "sects", "*.png"))
|
||||
sect_tiles = [os.path.splitext(os.path.basename(f))[0] for f in sect_files]
|
||||
sect_tiles.sort()
|
||||
|
||||
# 3. 读取 Region 配置
|
||||
regions = []
|
||||
|
||||
def parse_csv(filename, id_col, name_col, type_tag):
|
||||
path = os.path.join(CONFIG_DIR, filename)
|
||||
if not os.path.exists(path):
|
||||
print(f"Warning: {path} not found")
|
||||
return
|
||||
|
||||
with open(path, 'r', encoding='utf-8-sig') as f:
|
||||
reader = csv.reader(f)
|
||||
rows = list(reader)
|
||||
# 跳过前两行 (header 和 description)
|
||||
data_rows = rows[2:] if len(rows) > 2 else []
|
||||
|
||||
for row in data_rows:
|
||||
if len(row) <= max(id_col, name_col): continue
|
||||
try:
|
||||
r_id = int(row[id_col])
|
||||
name = row[name_col]
|
||||
# 简单的 hash 颜色生成
|
||||
color_hash = hash(f"{type_tag}_{r_id}") & 0xFFFFFF
|
||||
color = f"#{color_hash:06x}"
|
||||
|
||||
# 计算默认绑定 Tile
|
||||
bind_info = get_default_tile(name, type_tag, tiles, sect_tiles)
|
||||
|
||||
regions.append({
|
||||
"id": r_id,
|
||||
"name": name,
|
||||
"type": type_tag,
|
||||
"color": color,
|
||||
"bindTile": bind_info["t"],
|
||||
"bindTileType": bind_info["type"]
|
||||
})
|
||||
except ValueError:
|
||||
continue
|
||||
|
||||
|
||||
# 读取四种配置
|
||||
# normal_region.csv: id=0, name=1
|
||||
parse_csv("normal_region.csv", 0, 1, "normal")
|
||||
# sect_region.csv: sect_id=0, sect_name=1
|
||||
parse_csv("sect_region.csv", 0, 1, "sect")
|
||||
# cultivate_region.csv: id=0, name=1
|
||||
parse_csv("cultivate_region.csv", 0, 1, "cultivate")
|
||||
# city_region.csv: id=0, name=1
|
||||
parse_csv("city_region.csv", 0, 1, "city")
|
||||
|
||||
# 排序优先级:normal > sect > cultivate > city > 其他
|
||||
def sort_priority(r):
|
||||
if r['type'] == 'normal': return 0
|
||||
if r['type'] == 'sect': return 1
|
||||
if r['type'] == 'cultivate': return 2
|
||||
if r['type'] == 'city': return 3
|
||||
return 4
|
||||
|
||||
regions.sort(key=lambda x: (sort_priority(x), x['id']))
|
||||
|
||||
# 3. 尝试读取现有的地图数据
|
||||
saved_map = load_map_data()
|
||||
|
||||
return jsonify({
|
||||
"width": MAP_WIDTH,
|
||||
"height": MAP_HEIGHT,
|
||||
"tiles": tiles,
|
||||
"sectTiles": sect_tiles,
|
||||
"regions": regions,
|
||||
"savedMap": saved_map
|
||||
})
|
||||
|
||||
@app.route('/api/save', methods=['POST'])
|
||||
def save_map():
|
||||
data = request.json
|
||||
grid = data.get('grid', []) # list of {x, y, t, r}
|
||||
|
||||
tile_csv_path = os.path.join(OUTPUT_DIR, "tile_map.csv")
|
||||
region_csv_path = os.path.join(OUTPUT_DIR, "region_map.csv")
|
||||
|
||||
try:
|
||||
# 初始化二维数组 (Matrix)
|
||||
# MAP_HEIGHT 行, MAP_WIDTH 列
|
||||
tile_matrix = [["plain" for _ in range(MAP_WIDTH)] for _ in range(MAP_HEIGHT)]
|
||||
region_matrix = [[-1 for _ in range(MAP_WIDTH)] for _ in range(MAP_HEIGHT)]
|
||||
|
||||
# 填充数据
|
||||
for cell in grid:
|
||||
x, y = cell['x'], cell['y']
|
||||
if 0 <= x < MAP_WIDTH and 0 <= y < MAP_HEIGHT:
|
||||
tile_matrix[y][x] = cell['t']
|
||||
if cell.get('r') is not None:
|
||||
region_matrix[y][x] = cell['r']
|
||||
|
||||
# 保存 Tile Map (矩阵形式)
|
||||
with open(tile_csv_path, 'w', newline='', encoding='utf-8') as f:
|
||||
writer = csv.writer(f)
|
||||
writer.writerows(tile_matrix)
|
||||
|
||||
# 保存 Region Map (矩阵形式)
|
||||
with open(region_csv_path, 'w', newline='', encoding='utf-8') as f:
|
||||
writer = csv.writer(f)
|
||||
writer.writerows(region_matrix)
|
||||
|
||||
return jsonify({"status": "success", "message": "Map saved successfully (Matrix Format)"})
|
||||
except Exception as e:
|
||||
return jsonify({"status": "error", "message": str(e)}), 500
|
||||
|
||||
def load_map_data():
|
||||
"""读取矩阵格式 CSV 并重建 Grid 状态"""
|
||||
tile_csv_path = os.path.join(OUTPUT_DIR, "tile_map.csv")
|
||||
region_csv_path = os.path.join(OUTPUT_DIR, "region_map.csv")
|
||||
|
||||
loaded_data = {} # key: "x,y", value: {t: ..., r: ...}
|
||||
|
||||
# 读取 Tile Matrix
|
||||
if os.path.exists(tile_csv_path):
|
||||
with open(tile_csv_path, 'r', encoding='utf-8') as f:
|
||||
reader = csv.reader(f)
|
||||
for y, row in enumerate(reader):
|
||||
if y >= MAP_HEIGHT: break
|
||||
for x, val in enumerate(row):
|
||||
if x >= MAP_WIDTH: break
|
||||
key = f"{x},{y}"
|
||||
loaded_data[key] = {"t": val}
|
||||
|
||||
# 读取 Region Matrix
|
||||
if os.path.exists(region_csv_path):
|
||||
with open(region_csv_path, 'r', encoding='utf-8') as f:
|
||||
reader = csv.reader(f)
|
||||
for y, row in enumerate(reader):
|
||||
if y >= MAP_HEIGHT: break
|
||||
for x, val in enumerate(row):
|
||||
if x >= MAP_WIDTH: break
|
||||
try:
|
||||
rid = int(val)
|
||||
if rid != -1:
|
||||
key = f"{x},{y}"
|
||||
if key not in loaded_data:
|
||||
loaded_data[key] = {"t": "plain"} # 默认
|
||||
loaded_data[key]["r"] = rid
|
||||
except ValueError:
|
||||
continue
|
||||
|
||||
return loaded_data
|
||||
|
||||
if __name__ == '__main__':
|
||||
print(f"Starting Map Creator at http://127.0.0.1:5000")
|
||||
print(f"Assets Dir: {ASSETS_DIR}")
|
||||
app.run(debug=True, port=5000)
|
||||
70
tools/map_creator/region_map.csv
Normal file
@@ -0,0 +1,70 @@
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,116,116,116,116,116,116,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,116,116,116,116,116,116,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,10,10,10,104,104,104,116,116,116,116,116,116,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,108,108,108,108,108,12,12,12,108,108,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,10,10,10,104,104,104,116,116,116,116,116,116,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,108,108,108,108,108,12,12,12,108,108,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,10,10,10,104,104,116,116,116,116,116,-1,-1,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,108,108,108,108,108,108,108,12,12,12,108,108,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,116,116,-1,-1,-1,-1,5,5,5,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,108,108,108,108,108,108,108,108,108,108,108,108,108,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,116,116,-1,-1,-1,-1,5,5,5,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,116,116,116,-1,111,111,111,5,5,5,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,117,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,-1,-1,-1,-1,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,116,116,116,116,111,111,111,111,111,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,117,117,117,117,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,-1,-1,-1,-1,-1,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,201,104,104,104,104,104,104,116,116,116,111,111,111,111,111,111,111,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,117,117,117,117,117,117,108,108,108,108,108,108,108,108,108,108,108,108,108,108,-1,-1,-1,-1,-1,-1,-1,-1,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,116,116,116,116,-1,111,111,111,111,111,111,111,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,117,117,117,117,117,117,117,106,108,108,108,108,108,108,108,108,106,-1,-1,-1,-1,-1,-1,-1,4,4,4,104,104,104,104,104,104,107,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,116,116,116,-1,111,111,111,111,111,111,111,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,117,117,117,117,117,117,117,106,106,106,106,108,108,108,108,106,106,-1,-1,-1,-1,-1,-1,-1,4,4,4,104,104,104,104,104,104,107,107,104,104,104,104,107,104,116,116,104,116,116,116,116,104,116,116,116,116,116,-1,-1,-1,111,111,111,111,111,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,117,117,117,117,117,117,117,109,109,109,109,106,108,108,106,106,-1,-1,-1,-1,-1,-1,-1,-1,4,4,4,-1,-1,104,104,104,104,104,107,107,104,107,104,107,116,116,116,116,116,116,116,116,116,116,116,116,116,-1,-1,-1,-1,204,111,111,111,-1,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,117,117,117,117,117,117,117,109,109,109,109,106,106,106,106,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,104,104,104,104,104,104,107,107,107,107,107,116,116,116,116,116,116,116,116,116,116,116,116,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,117,117,117,117,117,117,117,109,109,109,109,109,109,106,106,106,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,107,107,107,107,107,107,107,107,107,116,116,116,116,116,116,116,116,116,116,116,116,-1,-1,-1,112,112,112,112,112,-1,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,117,117,117,117,117,117,117,109,109,109,109,109,109,-1,106,106,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,107,107,107,107,107,107,107,107,107,107,116,116,116,116,116,116,116,116,116,116,116,-1,-1,112,112,112,112,112,112,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,-1,109,109,109,109,109,109,109,-1,106,106,-1,-1,-1,-1,-1,-1,-1,-1,-1,110,-1,-1,-1,-1,-1,-1,-1,107,107,107,107,107,107,107,107,116,116,116,116,116,116,116,-1,-1,-1,-1,-1,112,112,112,112,112,112,112,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,-1,109,109,109,109,109,109,109,-1,-1,106,106,-1,-1,-1,-1,-1,110,110,110,110,110,110,-1,-1,-1,-1,-1,-1,107,107,107,107,107,107,107,116,116,116,116,116,-1,-1,-1,-1,-1,-1,-1,112,112,112,112,112,112,112,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,302,302,302,302,302,117,117,117,117,117,117,117,117,117,117,117,-1,109,109,109,109,109,109,109,109,109,-1,-1,106,106,-1,-1,-1,110,110,110,110,110,110,110,110,110,110,110,110,110,110,107,107,107,107,107,107,116,107,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,112,112,112,112,112,112,112,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,302,302,302,302,302,117,117,117,117,117,117,117,117,117,117,117,-1,109,109,109,109,109,109,109,109,109,109,109,-1,106,106,106,-1,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,107,107,107,107,107,107,107,-1,-1,-1,-1,-1,-1,-1,-1,-1,112,112,112,112,112,112,112,-1,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,302,302,302,302,302,117,117,117,117,117,117,117,117,117,117,117,-1,109,109,109,109,109,109,109,109,109,109,109,109,109,106,106,106,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,107,107,107,107,107,107,107,-1,-1,-1,-1,-1,-1,-1,-1,-1,112,112,112,112,112,-1,-1,-1,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,302,302,302,302,302,117,117,117,117,117,117,117,117,117,117,117,-1,109,109,109,109,109,109,109,109,109,109,109,109,109,109,106,106,106,106,-1,-1,-1,110,110,110,110,110,110,110,110,110,110,110,110,110,107,107,107,107,107,107,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,302,302,302,302,302,117,117,117,117,117,117,117,117,117,117,-1,-1,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,106,106,106,106,106,106,-1,-1,-1,-1,-1,110,110,110,110,110,110,110,110,107,107,107,107,107,107,107,-1,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,117,117,117,117,117,117,117,117,-1,-1,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,-1,-1,-1,-1,-1,106,106,106,106,106,-1,-1,-1,-1,-1,202,110,110,110,110,110,107,107,107,107,107,107,107,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,-1,-1,9,9,9,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,117,117,117,117,117,117,117,-1,-1,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,-1,-1,-1,-1,-1,-1,-1,106,106,106,106,106,-1,-1,-1,-1,-1,-1,110,110,110,110,107,107,107,107,107,107,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,-1,-1,9,9,9,105,105,105,105,105,105,105,207,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,117,117,117,117,117,117,117,-1,11,11,11,109,109,109,109,109,109,109,109,109,109,109,109,109,-1,-1,-1,-1,-1,-1,-1,301,301,301,301,301,106,106,-1,-1,-1,-1,-1,-1,110,110,110,110,107,107,107,107,107,107,101,101,101,101,101,101,101,101,101,101,101,101,101,101,-1,-1,9,9,9,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,117,117,117,117,117,117,117,-1,11,11,11,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,-1,-1,-1,-1,301,301,301,301,301,106,106,106,106,-1,-1,-1,303,303,303,110,110,107,107,107,107,107,107,107,101,101,101,101,101,101,101,101,101,101,101,101,101,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,117
|
||||
102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,117,117,117,117,117,117,117,-1,11,11,11,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,-1,-1,301,301,301,301,301,106,106,106,-1,-1,-1,-1,303,303,303,-1,110,110,107,107,107,107,107,107,107,101,101,101,101,101,101,101,101,101,101,101,101,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,117,117,117,117,117,117,-1,-1,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,-1,-1,-1,301,301,301,301,301,106,106,-1,-1,-1,-1,-1,303,303,303,-1,-1,107,107,107,107,107,107,107,107,107,101,101,101,101,101,101,101,101,101,101,101,101,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,117,117,117,117,117,117,-1,-1,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,-1,-1,-1,301,301,301,301,301,106,-1,-1,-1,-1,-1,-1,303,303,303,-1,-1,107,107,107,107,107,107,107,107,107,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,115,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,117,117,117,117,117,-1,-1,-1,-1,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,-1,-1,-1,-1,106,106,106,7,7,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,107,107,107,107,107,107,107,107,107,-1,-1,-1,-1,-1,-1,-1,-1,-1,115,115,115,115,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,117,117,117,117,117,-1,-1,-1,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,-1,-1,-1,-1,-1,106,106,-1,7,7,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,107,107,107,107,107,107,107,107,107,-1,-1,-1,-1,-1,-1,-1,115,115,115,115,115,115,115,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,117,117,117,-1,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,-1,-1,-1,-1,106,106,106,-1,7,7,7,-1,-1,-1,-1,-1,-1,-1,-1,107,107,107,-1,107,107,107,107,107,107,107,-1,-1,-1,-1,-1,115,115,115,115,115,115,115,115,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,117,-1,-1,-1,-1,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,-1,-1,-1,106,106,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,107,107,107,-1,-1,-1,107,107,107,107,107,107,107,1,1,1,-1,115,115,115,115,115,115,115,115,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,117,117,117,117,117,-1,-1,109,-1,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,-1,-1,-1,-1,-1,106,106,106,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,107,107,-1,-1,-1,-1,107,-1,107,107,107,107,107,1,1,1,-1,115,115,115,115,115,115,115,115,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,117,117,-1,-1,-1,-1,-1,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,-1,-1,-1,-1,106,106,106,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,107,107,107,-1,-1,-1,-1,-1,-1,-1,-1,107,107,107,107,1,1,1,-1,115,115,115,115,115,115,115,115,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,-1,-1,-1,-1,106,106,106,-1,-1,-1,-1,-1,-1,-1,-1,-1,107,107,107,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,107,107,107,107,-1,-1,-1,-1,115,115,115,115,115,115,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,-1,-1,-1,-1,106,106,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,107,107,107,-1,-1,-1,-1,-1,115,115,115,115,115,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,3,3,3,106,106,106,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,107,107,-1,-1,-1,-1,-1,-1,115,115,115,115,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,3,3,3,-1,106,106,106,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,107,-1,-1,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,14,14,14,-1,-1,-1,-1,-1,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,3,3,3,-1,106,106,106,106,106,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,106,106,106,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,14,14,14,-1,-1,-1,-1,-1,-1,-1,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,-1,-1,-1,-1,106,106,203,106,106,106,106,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,106,106,106,106,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,14,14,14,-1,-1,-1,-1,-1,-1,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,-1,-1,-1,-1,-1,106,106,106,106,106,106,106,106,-1,-1,-1,-1,-1,-1,13,13,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,106,106,106,106,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,-1,-1,109,-1,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,-1,109,-1,-1,-1,-1,-1,-1,106,106,106,106,106,106,106,106,106,106,-1,-1,-1,13,13,13,-1,-1,-1,-1,-1,-1,-1,-1,106,106,106,106,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,109,109,109,109,-1,-1,-1,-1,-1,-1,-1,109,109,109,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,106,106,106,106,106,106,106,106,106,-1,13,13,13,-1,-1,-1,-1,-1,-1,-1,106,106,106,106,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,109,109,-1,-1,-1,-1,-1,114,114,-1,-1,109,109,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,106,106,106,106,106,106,106,106,106,106,106,-1,-1,106,106,-1,106,106,106,106,106,106,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,114,114,114,-1,-1,-1,-1,-1,-1,-1,114,-1,114,114,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,-1,-1,-1,114,114,-1,-1,114,-1,114,114,114,114,114,114,114,114,114,114,114,-1,114,114,114,-1,114,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,-1,-1,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,-1,-1,-1,-1,-1,-1,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,-1,-1,-1,-1,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,-1,-1,-1,-1,-1,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,-1,-1,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,-1,-1,-1,-1,-1,-1,-1,-1,-1,106,106,106,106,106,106,106,106,106,106,106,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,118,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,-1,-1,205,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,106,106,106,106,106,106,106,106,106,106,106,105,105,105,105,105,105,105,105,105,105,105,105,105,105,118,118,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,-1,-1,-1,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,106,106,106,106,106,106,106,106,106,106,105,105,105,105,105,105,105,105,105,105,105,105,105,118,118,118,118,118,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,-1,-1,-1,8,8,8,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,103,114,114,114,114,103,114,114,114,114,103,103,114,114,114,114,114,114,114,114,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,106,106,106,106,106,106,106,106,105,105,105,105,105,105,105,105,105,105,105,105,105,105,118,118,118,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,8,8,-1,114,114,114,114,114,114,103,103,114,103,114,114,103,103,103,103,103,103,103,103,114,114,114,114,103,114,103,103,103,103,114,114,103,103,-1,-1,114,114,114,114,114,-1,-1,-1,-1,-1,-1,-1,-1,-1,106,106,106,106,106,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,118,118,118,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,8,8,-1,114,114,113,113,113,103,103,103,103,103,114,103,103,103,103,103,103,103,103,103,114,103,103,114,103,103,103,103,103,103,103,114,103,103,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,106,106,106,106,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,114,113,-1,113,113,113,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,114,103,103,103,103,103,103,103,103,103,103,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,113,113,113,113,113,113,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,-1,102,102,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,113,113,113,113,113,113,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,-1,-1,113,-1,113,113,113,113,113,113,113,113,113,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6,6,6,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,-1,-1,-1,113,113,113,113,113,113,113,113,113,113,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,2,2,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6,6,6,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,113,113,113,113,113,113,113,113,113,113,113,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,2,2,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,105,6,6,6,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-1,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,2,2,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,-1,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-1,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,113,113,113,113,113,113,113,113,113,113,113,113,-1,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,113,113,113,113,113,113,113,113,113,113,113,113,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,206,-1,-1,-1,103,103,103,103,103,103,103,-1,-1,-1,-1,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,113,113,113,113,113,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
102,102,102,102,102,102,102,102,102,102,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105
|
||||
|
571
tools/map_creator/templates/index.html
Normal file
@@ -0,0 +1,571 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>修仙世界地图编辑器</title>
|
||||
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
<style>
|
||||
body { margin: 0; overflow: hidden; background: #1a1a1a; color: #e0e0e0; }
|
||||
#canvas-container {
|
||||
width: 100%;
|
||||
height: 100vh;
|
||||
overflow: auto;
|
||||
position: relative;
|
||||
background: #333;
|
||||
}
|
||||
canvas {
|
||||
display: block;
|
||||
background: #000;
|
||||
}
|
||||
.sidebar {
|
||||
position: fixed;
|
||||
left: 0; top: 0; bottom: 0;
|
||||
width: 300px;
|
||||
background: #2d2d2d;
|
||||
border-right: 1px solid #444;
|
||||
z-index: 10;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
.scroll-area {
|
||||
flex: 1;
|
||||
overflow-y: auto;
|
||||
padding: 10px;
|
||||
}
|
||||
.item-btn {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 8px;
|
||||
cursor: pointer;
|
||||
border-radius: 4px;
|
||||
margin-bottom: 4px;
|
||||
transition: background 0.2s;
|
||||
}
|
||||
.item-btn:hover { background: #444; }
|
||||
.item-btn.active { background: #3b82f6; color: white; }
|
||||
.color-bar {
|
||||
width: 4px;
|
||||
align-self: stretch;
|
||||
margin-right: 8px;
|
||||
border-radius: 2px;
|
||||
}
|
||||
.preview-img {
|
||||
width: 32px; height: 32px;
|
||||
margin-right: 8px;
|
||||
object-fit: cover;
|
||||
border-radius: 2px;
|
||||
background: #000;
|
||||
}
|
||||
.region-id {
|
||||
font-size: 0.7rem;
|
||||
color: #666;
|
||||
font-family: monospace;
|
||||
}
|
||||
.bind-img {
|
||||
width: 16px; height: 16px;
|
||||
margin-left: auto;
|
||||
opacity: 0.7;
|
||||
}
|
||||
.section-title {
|
||||
font-size: 0.8rem;
|
||||
color: #888;
|
||||
margin-top: 10px;
|
||||
margin-bottom: 5px;
|
||||
padding-left: 5px;
|
||||
text-transform: uppercase;
|
||||
font-weight: bold;
|
||||
}
|
||||
/* Loader */
|
||||
.loader {
|
||||
position: fixed; top: 0; left: 0; right: 0; bottom: 0;
|
||||
background: rgba(0,0,0,0.8);
|
||||
display: flex; justify-content: center; align-items: center;
|
||||
z-index: 100;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
{% raw %}
|
||||
<div id="app">
|
||||
<!-- Loading Overlay -->
|
||||
<div v-if="loading" class="loader">
|
||||
<div class="text-white text-xl">正在加载资源...</div>
|
||||
</div>
|
||||
|
||||
<!-- Sidebar -->
|
||||
<div class="sidebar">
|
||||
<div class="p-4 border-b border-gray-600 flex justify-between items-center">
|
||||
<h1 class="font-bold text-lg">地图编辑器</h1>
|
||||
<button @click="saveMap" class="bg-green-600 hover:bg-green-500 text-white px-3 py-1 rounded text-sm">
|
||||
保存
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Tabs: 交换顺序,Region 在前 -->
|
||||
<div class="flex border-b border-gray-600">
|
||||
<div
|
||||
class="flex-1 text-center py-2 cursor-pointer hover:bg-gray-700"
|
||||
:class="{ 'bg-gray-600': mode === 'region' }"
|
||||
@click="mode = 'region'">
|
||||
区域 (Region)
|
||||
</div>
|
||||
<div
|
||||
class="flex-1 text-center py-2 cursor-pointer hover:bg-gray-700"
|
||||
:class="{ 'bg-gray-600': mode === 'tile' }"
|
||||
@click="mode = 'tile'">
|
||||
地形 (Tile)
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Region List -->
|
||||
<div v-if="mode === 'region'" class="scroll-area">
|
||||
<div class="mb-2 px-2">
|
||||
<button
|
||||
class="w-full border border-red-400 text-red-400 py-1 rounded hover:bg-red-900"
|
||||
:class="{ 'bg-red-900': currentRegion === null }"
|
||||
@click="currentRegion = null">
|
||||
橡皮擦 (清除区域)
|
||||
</button>
|
||||
</div>
|
||||
<div
|
||||
v-for="region in regions"
|
||||
:key="region.id"
|
||||
class="item-btn"
|
||||
:class="{ active: currentRegion === region.id }"
|
||||
@click="currentRegion = region.id">
|
||||
<!-- 颜色条 -->
|
||||
<div class="color-bar" :style="{ backgroundColor: region.color }"></div>
|
||||
|
||||
<!-- 绑定地形预览图 (主展示) -->
|
||||
<img
|
||||
v-if="region.bindTile"
|
||||
:src="`/${region.bindTileType === 'sect' ? 'sects' : 'tiles'}/${region.bindTile}.png`"
|
||||
class="preview-img"
|
||||
>
|
||||
<div v-else class="preview-img bg-gray-700"></div>
|
||||
|
||||
<div class="flex flex-col overflow-hidden">
|
||||
<span class="text-sm font-bold truncate" :title="region.name">{{ region.name }}</span>
|
||||
<span class="region-id">{{ region.id }} | {{ region.type }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Tile List -->
|
||||
<div v-if="mode === 'tile'" class="scroll-area">
|
||||
<div class="section-title">基础地形</div>
|
||||
<div
|
||||
v-for="tile in tiles"
|
||||
:key="tile"
|
||||
class="item-btn"
|
||||
:class="{ active: currentTile === tile && currentTileType === 'tile' }"
|
||||
@click="selectTile(tile, 'tile')">
|
||||
<img :src="`/tiles/${tile}.png`" class="preview-img">
|
||||
<span>{{ tile }}</span>
|
||||
</div>
|
||||
|
||||
<div class="section-title">宗门建筑</div>
|
||||
<div
|
||||
v-for="tile in sectTiles"
|
||||
:key="tile"
|
||||
class="item-btn"
|
||||
:class="{ active: currentTile === tile && currentTileType === 'sect' }"
|
||||
@click="selectTile(tile, 'sect')">
|
||||
<img :src="`/sects/${tile}.png`" class="preview-img">
|
||||
<span>{{ tile }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-2 text-xs text-gray-500 border-t border-gray-600">
|
||||
左键绘制 | 按住Shift框选<br>
|
||||
滚轮缩放 | 右键拖动<br>
|
||||
当前坐标: {{ hoverX }}, {{ hoverY }}<br>
|
||||
<span v-if="isShiftDown" class="text-yellow-400">矩形工具已激活</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Canvas Area -->
|
||||
<div id="canvas-container" ref="container" @contextmenu.prevent tabindex="0">
|
||||
<canvas ref="canvas"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const { createApp, ref, onMounted, reactive, computed, watch } = Vue;
|
||||
|
||||
createApp({
|
||||
setup() {
|
||||
// --- State ---
|
||||
const loading = ref(true);
|
||||
const mode = ref('region'); // 默认 Region 模式
|
||||
const tiles = ref([]);
|
||||
const sectTiles = ref([]);
|
||||
const regions = ref([]);
|
||||
const savedMap = ref({});
|
||||
|
||||
const currentTile = ref('plain');
|
||||
const currentTileType = ref('tile');
|
||||
const currentRegion = ref(null);
|
||||
|
||||
const mapWidth = ref(100);
|
||||
const mapHeight = ref(70);
|
||||
const tileSize = 32;
|
||||
|
||||
const grid = reactive([]);
|
||||
|
||||
// Viewport
|
||||
const scale = ref(1.0);
|
||||
const offsetX = ref(320);
|
||||
const offsetY = ref(20);
|
||||
|
||||
const hoverX = ref(0);
|
||||
const hoverY = ref(0);
|
||||
const isShiftDown = ref(false);
|
||||
|
||||
// Rect Tool
|
||||
const dragStart = ref(null);
|
||||
|
||||
// Canvas refs
|
||||
const canvas = ref(null);
|
||||
const container = ref(null);
|
||||
let ctx = null;
|
||||
|
||||
// Image Cache: name -> Image
|
||||
const images = {};
|
||||
|
||||
// --- Initialization ---
|
||||
onMounted(async () => {
|
||||
await initData();
|
||||
initGrid();
|
||||
initCanvas();
|
||||
initKeyboard();
|
||||
requestAnimationFrame(drawLoop);
|
||||
loading.value = false;
|
||||
});
|
||||
|
||||
async function initData() {
|
||||
try {
|
||||
const res = await fetch('/api/init');
|
||||
const data = await res.json();
|
||||
tiles.value = data.tiles;
|
||||
sectTiles.value = data.sectTiles;
|
||||
regions.value = data.regions;
|
||||
mapWidth.value = data.width;
|
||||
mapHeight.value = data.height;
|
||||
savedMap.value = data.savedMap || {};
|
||||
|
||||
// Preload images
|
||||
const loadImg = (name, folder) => {
|
||||
return new Promise((resolve) => {
|
||||
const img = new Image();
|
||||
img.src = `/${folder}/${name}.png`;
|
||||
img.onload = () => { images[name] = img; resolve(); };
|
||||
img.onerror = () => { console.warn('Missing img:', name); resolve(); };
|
||||
});
|
||||
};
|
||||
|
||||
const promises = [
|
||||
...data.tiles.map(t => loadImg(t, 'tiles')),
|
||||
...data.sectTiles.map(t => loadImg(t, 'sects'))
|
||||
];
|
||||
await Promise.all(promises);
|
||||
} catch (e) {
|
||||
console.error("Failed to init", e);
|
||||
alert("初始化失败,请查看控制台");
|
||||
}
|
||||
}
|
||||
|
||||
function initGrid() {
|
||||
const total = mapWidth.value * mapHeight.value;
|
||||
for (let y = 0; y < mapHeight.value; y++) {
|
||||
for (let x = 0; x < mapWidth.value; x++) {
|
||||
const key = `${x},${y}`;
|
||||
const saved = savedMap.value[key];
|
||||
grid.push({
|
||||
x: x,
|
||||
y: y,
|
||||
t: saved?.t || 'plain',
|
||||
r: saved?.r || null
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function selectTile(name, type) {
|
||||
currentTile.value = name;
|
||||
currentTileType.value = type;
|
||||
}
|
||||
|
||||
function initKeyboard() {
|
||||
window.addEventListener('keydown', e => {
|
||||
if (e.key === 'Shift') isShiftDown.value = true;
|
||||
});
|
||||
window.addEventListener('keyup', e => {
|
||||
if (e.key === 'Shift') isShiftDown.value = false;
|
||||
});
|
||||
}
|
||||
|
||||
// --- Canvas Logic ---
|
||||
function initCanvas() {
|
||||
const el = canvas.value;
|
||||
ctx = el.getContext('2d');
|
||||
resizeCanvas();
|
||||
|
||||
const cont = container.value;
|
||||
|
||||
let isDragging = false;
|
||||
let isPanning = false;
|
||||
let lastX = 0;
|
||||
let lastY = 0;
|
||||
|
||||
cont.addEventListener('mousedown', e => {
|
||||
container.value.focus();
|
||||
if (e.button === 2 || e.button === 1) {
|
||||
isPanning = true;
|
||||
lastX = e.clientX;
|
||||
lastY = e.clientY;
|
||||
} else if (e.button === 0) {
|
||||
isDragging = true;
|
||||
if (isShiftDown.value) {
|
||||
dragStart.value = { x: hoverX.value, y: hoverY.value };
|
||||
} else {
|
||||
paint(hoverX.value, hoverY.value);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener('mouseup', () => {
|
||||
if (isDragging && isShiftDown.value && dragStart.value) {
|
||||
applyRectPaint();
|
||||
}
|
||||
isDragging = false;
|
||||
isPanning = false;
|
||||
dragStart.value = null;
|
||||
});
|
||||
|
||||
cont.addEventListener('mousemove', e => {
|
||||
updateHover(e);
|
||||
|
||||
if (isPanning) {
|
||||
offsetX.value += e.clientX - lastX;
|
||||
offsetY.value += e.clientY - lastY;
|
||||
lastX = e.clientX;
|
||||
lastY = e.clientY;
|
||||
}
|
||||
|
||||
if (isDragging) {
|
||||
if (!isShiftDown.value) {
|
||||
paint(hoverX.value, hoverY.value);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
cont.addEventListener('wheel', e => {
|
||||
e.preventDefault();
|
||||
const zoomSpeed = 0.1;
|
||||
const delta = e.deltaY > 0 ? -zoomSpeed : zoomSpeed;
|
||||
const newScale = Math.max(0.1, Math.min(5.0, scale.value + delta));
|
||||
scale.value = newScale;
|
||||
}, { passive: false });
|
||||
|
||||
window.addEventListener('resize', resizeCanvas);
|
||||
}
|
||||
|
||||
function resizeCanvas() {
|
||||
canvas.value.width = window.innerWidth;
|
||||
canvas.value.height = window.innerHeight;
|
||||
}
|
||||
|
||||
function updateHover(e) {
|
||||
const rect = canvas.value.getBoundingClientRect();
|
||||
const mx = e.clientX - rect.left;
|
||||
const my = e.clientY - rect.top;
|
||||
|
||||
const worldX = (mx - offsetX.value) / scale.value;
|
||||
const worldY = (my - offsetY.value) / scale.value;
|
||||
|
||||
const gx = Math.max(0, Math.min(mapWidth.value - 1, Math.floor(worldX / tileSize)));
|
||||
const gy = Math.max(0, Math.min(mapHeight.value - 1, Math.floor(worldY / tileSize)));
|
||||
|
||||
hoverX.value = gx;
|
||||
hoverY.value = gy;
|
||||
}
|
||||
|
||||
function paint(gx, gy) {
|
||||
if (gx < 0 || gx >= mapWidth.value || gy < 0 || gy >= mapHeight.value) return;
|
||||
|
||||
const idx = gy * mapWidth.value + gx;
|
||||
const cell = grid[idx];
|
||||
|
||||
if (mode.value === 'tile') {
|
||||
cell.t = currentTile.value;
|
||||
} else {
|
||||
cell.r = currentRegion.value;
|
||||
|
||||
// Auto-paint bind tile if not eraser
|
||||
if (currentRegion.value !== null) {
|
||||
const region = regions.value.find(r => r.id === currentRegion.value);
|
||||
if (region && region.bindTile) {
|
||||
cell.t = region.bindTile;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function applyRectPaint() {
|
||||
const x1 = Math.min(dragStart.value.x, hoverX.value);
|
||||
const x2 = Math.max(dragStart.value.x, hoverX.value);
|
||||
const y1 = Math.min(dragStart.value.y, hoverY.value);
|
||||
const y2 = Math.max(dragStart.value.y, hoverY.value);
|
||||
|
||||
for (let y = y1; y <= y2; y++) {
|
||||
for (let x = x1; x <= x2; x++) {
|
||||
paint(x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- Render Loop ---
|
||||
function drawLoop() {
|
||||
if (!ctx) return;
|
||||
|
||||
const cvs = canvas.value;
|
||||
const w = cvs.width;
|
||||
const h = cvs.height;
|
||||
|
||||
ctx.fillStyle = '#1a1a1a';
|
||||
ctx.fillRect(0, 0, w, h);
|
||||
|
||||
ctx.save();
|
||||
ctx.translate(offsetX.value, offsetY.value);
|
||||
ctx.scale(scale.value, scale.value);
|
||||
|
||||
const startX = Math.floor(-offsetX.value / scale.value / tileSize);
|
||||
const startY = Math.floor(-offsetY.value / scale.value / tileSize);
|
||||
const endX = startX + Math.floor(w / scale.value / tileSize) + 2;
|
||||
const endY = startY + Math.floor(h / scale.value / tileSize) + 2;
|
||||
|
||||
const rMap = {};
|
||||
regions.value.forEach(r => rMap[r.id] = r);
|
||||
|
||||
// Draw Tiles & Region Borders
|
||||
for (let y = Math.max(0, startY); y < Math.min(mapHeight.value, endY); y++) {
|
||||
for (let x = Math.max(0, startX); x < Math.min(mapWidth.value, endX); x++) {
|
||||
const idx = y * mapWidth.value + x;
|
||||
const cell = grid[idx];
|
||||
const px = x * tileSize;
|
||||
const py = y * tileSize;
|
||||
|
||||
// 1. Draw Tile Image
|
||||
const img = images[cell.t];
|
||||
if (img) {
|
||||
ctx.drawImage(img, px, py, tileSize, tileSize);
|
||||
} else {
|
||||
ctx.fillStyle = '#333';
|
||||
ctx.fillRect(px, py, tileSize, tileSize);
|
||||
}
|
||||
|
||||
// 2. Draw Region Border (Edge Detection)
|
||||
if (cell.r !== null) {
|
||||
const region = rMap[cell.r];
|
||||
if (region) {
|
||||
const getR = (tx, ty) => {
|
||||
if (tx < 0 || tx >= mapWidth.value || ty < 0 || ty >= mapHeight.value) return null;
|
||||
return grid[ty * mapWidth.value + tx].r;
|
||||
};
|
||||
|
||||
ctx.lineWidth = 4;
|
||||
ctx.lineCap = 'square';
|
||||
ctx.strokeStyle = region.color;
|
||||
ctx.beginPath();
|
||||
|
||||
// Top
|
||||
if (getR(x, y - 1) !== cell.r) { ctx.moveTo(px, py); ctx.lineTo(px + tileSize, py); }
|
||||
// Bottom
|
||||
if (getR(x, y + 1) !== cell.r) { ctx.moveTo(px, py + tileSize); ctx.lineTo(px + tileSize, py + tileSize); }
|
||||
// Left
|
||||
if (getR(x - 1, y) !== cell.r) { ctx.moveTo(px, py); ctx.lineTo(px, py + tileSize); }
|
||||
// Right
|
||||
if (getR(x + 1, y) !== cell.r) { ctx.moveTo(px + tileSize, py); ctx.lineTo(px + tileSize, py + tileSize); }
|
||||
|
||||
ctx.stroke();
|
||||
|
||||
// Very light fill to indicate ownership
|
||||
ctx.globalAlpha = 0.1;
|
||||
ctx.fillStyle = region.color;
|
||||
ctx.fillRect(px, py, tileSize, tileSize);
|
||||
ctx.globalAlpha = 1.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Draw Hover / Rect Preview
|
||||
if (isShiftDown.value && dragStart.value) {
|
||||
// Rect Preview
|
||||
const x1 = Math.min(dragStart.value.x, hoverX.value);
|
||||
const x2 = Math.max(dragStart.value.x, hoverX.value);
|
||||
const y1 = Math.min(dragStart.value.y, hoverY.value);
|
||||
const y2 = Math.max(dragStart.value.y, hoverY.value);
|
||||
|
||||
const px = x1 * tileSize;
|
||||
const py = y1 * tileSize;
|
||||
const rw = (x2 - x1 + 1) * tileSize;
|
||||
const rh = (y2 - y1 + 1) * tileSize;
|
||||
|
||||
ctx.strokeStyle = '#ffff00';
|
||||
ctx.lineWidth = 2;
|
||||
ctx.strokeRect(px, py, rw, rh);
|
||||
ctx.fillStyle = 'rgba(255, 255, 0, 0.2)';
|
||||
ctx.fillRect(px, py, rw, rh);
|
||||
|
||||
} else {
|
||||
// Single Cell Hover
|
||||
const px = hoverX.value * tileSize;
|
||||
const py = hoverY.value * tileSize;
|
||||
ctx.strokeStyle = 'white';
|
||||
ctx.lineWidth = 2;
|
||||
ctx.strokeRect(px, py, tileSize, tileSize);
|
||||
}
|
||||
|
||||
ctx.restore();
|
||||
requestAnimationFrame(drawLoop);
|
||||
}
|
||||
|
||||
// --- Actions ---
|
||||
async function saveMap() {
|
||||
const payload = {
|
||||
grid: grid
|
||||
};
|
||||
try {
|
||||
const res = await fetch('/api/save', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: JSON.stringify(payload)
|
||||
});
|
||||
const json = await res.json();
|
||||
if (json.status === 'success') {
|
||||
alert('保存成功!');
|
||||
} else {
|
||||
alert('保存失败: ' + json.message);
|
||||
}
|
||||
} catch (e) {
|
||||
alert('保存出错');
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
loading, mode, tiles, sectTiles, regions,
|
||||
currentTile, currentTileType, currentRegion,
|
||||
saveMap,
|
||||
hoverX, hoverY, isShiftDown,
|
||||
selectTile,
|
||||
canvas, container
|
||||
};
|
||||
}
|
||||
}).mount('#app');
|
||||
</script>
|
||||
{% endraw %}
|
||||
</body>
|
||||
</html>
|
||||
70
tools/map_creator/tile_map.csv
Normal file
@@ -0,0 +1,70 @@
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,tundra,tundra,tundra,tundra,tundra,tundra,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,tundra,tundra,tundra,tundra,tundra,tundra,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,tundra,tundra,tundra,tundra,tundra,tundra,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,妙化宗,glacier,glacier,glacier,glacier,tundra,tundra,tundra,tundra,tundra,tundra,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,不夜城,snow_mountain,snow_mountain,snow_mountain,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,tundra,tundra,tundra,tundra,tundra,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,tundra,tundra,plain,plain,plain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,tundra,tundra,plain,plain,plain,plain,plain,朱勾宗,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,tundra,tundra,tundra,plain,volcano,volcano,volcano,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,gobi,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,plain,plain,plain,plain,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,tundra,tundra,tundra,tundra,volcano,volcano,volcano,volcano,volcano,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,plain,plain,plain,plain,plain,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,cave,glacier,glacier,glacier,glacier,glacier,glacier,tundra,tundra,tundra,volcano,volcano,volcano,volcano,volcano,volcano,volcano,plain,plain,plain,sea,sea,sea,sea,sea,sea,island,island,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,plain,plain,plain,plain,plain,plain,plain,plain,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,tundra,tundra,tundra,tundra,plain,volcano,volcano,volcano,volcano,volcano,volcano,volcano,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,island,island,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,water,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,snow_mountain,water,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,glacier,glacier,glacier,glacier,glacier,glacier,mountain,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,glacier,tundra,tundra,tundra,plain,volcano,volcano,volcano,volcano,volcano,volcano,volcano,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,island,island,island,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,water,water,water,water,snow_mountain,snow_mountain,snow_mountain,snow_mountain,water,water,plain,plain,plain,plain,plain,plain,plain,plain,冥王宗,plain,glacier,glacier,glacier,glacier,glacier,glacier,mountain,mountain,glacier,glacier,glacier,glacier,mountain,glacier,tundra,tundra,glacier,tundra,tundra,tundra,tundra,glacier,tundra,tundra,tundra,tundra,tundra,plain,plain,plain,volcano,volcano,volcano,volcano,volcano,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,grassland,grassland,grassland,grassland,water,snow_mountain,snow_mountain,water,water,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,glacier,glacier,glacier,glacier,glacier,mountain,mountain,glacier,mountain,glacier,mountain,tundra,tundra,tundra,tundra,tundra,tundra,tundra,tundra,tundra,tundra,tundra,tundra,tundra,plain,plain,plain,plain,cave,volcano,volcano,volcano,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,grassland,grassland,grassland,grassland,water,water,water,water,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,glacier,glacier,glacier,glacier,glacier,glacier,mountain,mountain,mountain,mountain,mountain,tundra,tundra,tundra,tundra,tundra,tundra,tundra,tundra,tundra,tundra,tundra,tundra,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,grassland,grassland,grassland,grassland,grassland,grassland,water,water,water,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,tundra,tundra,tundra,tundra,tundra,tundra,tundra,tundra,tundra,tundra,tundra,tundra,plain,plain,plain,farm,farm,farm,farm,farm,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,grassland,grassland,grassland,grassland,grassland,grassland,plain,water,water,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,tundra,tundra,tundra,tundra,tundra,tundra,tundra,tundra,tundra,tundra,tundra,plain,plain,farm,farm,farm,farm,farm,farm,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,water,water,plain,plain,plain,plain,plain,plain,plain,plain,plain,forest,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,tundra,tundra,tundra,tundra,tundra,tundra,tundra,plain,plain,plain,plain,plain,farm,farm,farm,farm,farm,farm,farm,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,plain,water,water,plain,plain,plain,plain,plain,forest,forest,forest,forest,forest,forest,plain,plain,plain,plain,plain,plain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,tundra,tundra,tundra,tundra,tundra,plain,plain,plain,plain,plain,plain,plain,farm,farm,farm,farm,farm,farm,farm,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,plain,water,water,plain,plain,plain,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,mountain,mountain,mountain,mountain,mountain,mountain,tundra,mountain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,farm,farm,farm,farm,farm,farm,farm,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,water,forest,forest,plain,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,water,water,water,plain,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,mountain,mountain,mountain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,plain,plain,farm,farm,farm,farm,farm,farm,farm,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,water,city,forest,plain,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,water,water,water,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,mountain,mountain,mountain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,plain,plain,farm,farm,farm,farm,farm,plain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,water,forest,forest,plain,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,water,water,water,water,plain,plain,plain,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,mountain,mountain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,plain,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,water,water,water,water,water,water,plain,plain,plain,plain,plain,forest,forest,forest,forest,forest,forest,forest,forest,mountain,mountain,mountain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,plain,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,plain,plain,plain,plain,water,water,water,water,water,plain,plain,plain,plain,plain,cave,forest,forest,forest,forest,forest,mountain,mountain,mountain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,plain,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,plain,plain,plain,plain,plain,plain,water,water,water,water,water,plain,plain,plain,plain,plain,plain,forest,forest,forest,forest,mountain,mountain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,千帆城,plain,sea,sea,sea,sea,sea,sea,sea,ruins,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,plain,forest,forest,forest,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,plain,plain,plain,plain,plain,plain,plain,plain,water,water,water,water,water,plain,plain,plain,plain,plain,plain,forest,forest,forest,forest,mountain,mountain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,plain,forest,回玄宗,forest,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,plain,plain,plain,plain,plain,water,water,water,water,water,water,water,plain,plain,plain,forest,forest,forest,forest,forest,mountain,mountain,mountain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,gobi
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,plain,forest,forest,forest,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,plain,plain,plain,city,water,water,water,water,water,plain,plain,plain,plain,plain,forest,forest,plain,forest,forest,mountain,mountain,mountain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,plain,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,plain,plain,plain,plain,plain,plain,water,water,water,plain,plain,plain,plain,plain,plain,city,forest,plain,plain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,plain,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,plain,plain,plain,plain,plain,water,water,water,plain,plain,plain,plain,plain,plain,plain,plain,forest,plain,plain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,bamboo,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,plain,plain,plain,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,plain,plain,plain,water,water,water,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,plain,plain,bamboo,bamboo,bamboo,bamboo,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,plain,plain,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,plain,plain,plain,plain,water,water,plain,plain,镇魂宗,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,bamboo,bamboo,bamboo,bamboo,bamboo,bamboo,bamboo,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,gobi,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,plain,plain,plain,water,water,water,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,mountain,plain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,plain,bamboo,bamboo,bamboo,bamboo,bamboo,bamboo,bamboo,bamboo,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,gobi,plain,plain,plain,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,plain,plain,water,water,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,mountain,plain,plain,plain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,bamboo,bamboo,bamboo,plain,bamboo,bamboo,bamboo,bamboo,bamboo,bamboo,bamboo,bamboo,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,gobi,gobi,gobi,plain,plain,grassland,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,plain,plain,plain,plain,water,water,water,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,plain,plain,plain,plain,mountain,plain,mountain,mountain,mountain,mountain,mountain,bamboo,明心剑宗,bamboo,plain,bamboo,bamboo,bamboo,bamboo,bamboo,bamboo,bamboo,bamboo,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,gobi,gobi,plain,plain,plain,plain,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,plain,plain,plain,water,water,water,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,mountain,mountain,bamboo,bamboo,bamboo,plain,bamboo,bamboo,bamboo,bamboo,bamboo,bamboo,bamboo,bamboo,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,plain,plain,plain,water,water,water,plain,plain,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,bamboo,bamboo,bamboo,bamboo,bamboo,bamboo,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,plain,plain,plain,water,water,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,mountain,plain,plain,plain,plain,plain,bamboo,bamboo,bamboo,bamboo,bamboo,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,plain,plain,water,water,water,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,plain,plain,plain,plain,plain,plain,bamboo,bamboo,bamboo,bamboo,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,水镜宗,plain,plain,water,water,water,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,mountain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,plain,plain,plain,water,water,water,water,water,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,water,water,water,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,噬魔宗,desert,plain,plain,plain,plain,plain,plain,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,plain,plain,plain,water,water,cave,water,water,water,water,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,water,water,water,water,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,plain,plain,plain,plain,water,water,water,water,water,water,water,water,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,water,water,water,water,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,plain,grassland,plain,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,grassland,plain,grassland,plain,plain,plain,plain,plain,plain,water,water,water,water,water,water,water,water,water,water,plain,plain,plain,plain,天行健宗,plain,plain,plain,plain,plain,plain,plain,plain,plain,water,water,water,water,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,grassland,grassland,grassland,grassland,plain,plain,plain,plain,plain,plain,plain,grassland,grassland,grassland,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,water,water,water,water,water,water,water,water,water,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,water,water,water,water,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,grassland,grassland,plain,plain,plain,plain,plain,mountain,mountain,plain,plain,grassland,grassland,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,water,water,water,water,water,water,water,water,plain,water,water,plain,plain,water,water,plain,water,water,water,water,water,water,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,mountain,plain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,water,water,water,water,water,water,water,water,water,water,water,water,water,water,water,water,water,water,water,water,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,plain,plain,mountain,plain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,plain,mountain,mountain,mountain,plain,mountain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,water,water,water,water,water,water,water,water,water,water,water,water,water,water,water,water,water,water,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,water,water,water,water,water,water,water,water,water,water,water,water,water,water,water,water,water,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,plain,water,water,water,water,water,water,water,water,water,water,water,water,grassland,grassland,water,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,plain,plain,water,water,water,water,water,water,water,water,water,grassland,grassland,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,island,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,plain,cave,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,water,water,water,water,water,water,water,water,grassland,grassland,water,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,island,island,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,water,water,water,water,water,water,grassland,grassland,water,water,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,island,island,island,island,island,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,rainforest,mountain,mountain,mountain,mountain,rainforest,mountain,mountain,mountain,mountain,rainforest,rainforest,mountain,mountain,mountain,mountain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,water,water,water,water,water,water,water,water,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,island,island,island,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,幽魂噬影宗,plain,plain,mountain,mountain,mountain,mountain,mountain,mountain,rainforest,rainforest,mountain,rainforest,mountain,mountain,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,mountain,mountain,mountain,mountain,rainforest,mountain,rainforest,rainforest,rainforest,rainforest,mountain,mountain,rainforest,rainforest,plain,plain,mountain,mountain,mountain,mountain,mountain,plain,plain,plain,plain,plain,plain,plain,plain,plain,water,water,water,water,water,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,island,island,island,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,mountain,mountain,swamp,swamp,swamp,rainforest,rainforest,rainforest,rainforest,rainforest,mountain,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,mountain,rainforest,rainforest,mountain,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,mountain,rainforest,rainforest,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,water,water,water,water,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,mountain,swamp,plain,swamp,swamp,swamp,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,mountain,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,swamp,swamp,swamp,swamp,swamp,swamp,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,desert,desert,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,swamp,swamp,swamp,swamp,swamp,swamp,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,swamp,plain,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,合欢宗,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,plain,百兽宗,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,sea,sea,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,plain,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,plain,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,plain,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,swamp,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,ruins,plain,plain,plain,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,rainforest,plain,plain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,swamp,swamp,swamp,swamp,swamp,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,island,island,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,island,sea,sea,sea,sea,sea
|
||||
desert,desert,desert,desert,desert,desert,desert,desert,desert,desert,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,plain,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea,sea
|
||||
|