0.7.4策划文档

This commit is contained in:
daixiawu 2026-06-15 16:00:53 +08:00
parent a062c90f8d
commit cdc702c786
112 changed files with 209569 additions and 9133 deletions

View File

@ -1,10 +1,75 @@
---
name: th1-steam-announcement
description: TH1 project workflow for Steam announcements, especially localized patch notes / patchnote CSV generation. Use when the user asks to publish, prepare, localize, inspect, or generate Steam announcement files, Steam patch notes, patchnote_loc_V*.csv, or release-note CSVs from TH1 VersionConfig and Multilingual assets.
description: TH1 project workflow for Steam announcements, including localized weekly development reports and patch notes / patchnote CSV generation. Use when the user asks to publish, prepare, localize, inspect, or generate Steam announcement files, weekly progress reports, 每周汇报, Steam patch notes, patchnote_loc_V*.csv, or release-note CSVs from TH1 VersionConfig and Multilingual assets.
---
# TH1 Steam Announcement
## Weekly Development Report Workflow
Use this for Steam weekly report requests such as "生成每周开发进度汇报 6.14" or "做每周汇报的 Steam 通告".
1. Read the existing examples before choosing format:
- `D:/TH1_本地目录/Steam通告/每周汇报/#1/简体中文.txt`
- `D:/TH1_本地目录/Steam通告/每周汇报/#1/每周进度通告607_localization.csv`
- Older long-form examples can also live under `D:/TH1_本地目录/Steam通告/#4/`.
2. Output to the next numbered folder under `D:/TH1_本地目录/Steam通告/每周汇报/#<n>` unless the user says otherwise.
3. Produce at minimum:
- `简体中文.txt`: polished Chinese source text with the title on the first line.
- `每周进度通告<MMdd>_localization.csv`: Steam localization CSV.
4. Use the weekly CSV shape from `#1`: header `field,english,german,...,indonesian`; rows `body`, `subtitle`, `summary`, `title`.
5. Fill only TH1 supported Steam languages:
- `english`
- `schinese`
- `tchinese`
- `japanese`
- `korean`
Leave all other Steam language columns blank.
6. Write Steam body text with BBCode:
- Paragraphs: `[p]...[/p]`
- Section headings: `[h2]...[/h2]`
- Lists: `[list]`, `[*][p]...[/p][/*]`, `[/list]`
- Links: `[url=https://...]https://...[/url]`
7. If the user mentions "版本更新详细内容,请移步链接" but no link is provided:
- Check `D:/TH1_本地目录/Steam通告/PatchNote/` and Steam public news/API for the matching version.
- Do not invent a version-specific Steam `view/...` URL.
- Use the real URL if found; otherwise use the app news page or a clear placeholder and report that it needs replacement before publishing.
8. Keep translations concise and close to the Chinese meaning. Preserve game terms such as `Hakurei Empire`, `Steam Cloud`, `eye-comfort mode`, class names, version IDs, and hero names consistently with nearby examples.
### Weekly Report Script
Prepare a JSON object with `fields.body`, `fields.summary`, `fields.title`, optional `fields.subtitle`, and optional `plain_text_files`, then run:
```powershell
python .codex/skills/th1-steam-announcement/scripts/build_weekly_report_csv.py --input weekly_report.json
```
The script also accepts stdin:
```powershell
Get-Content weekly_report.json -Encoding UTF8 | python .codex/skills/th1-steam-announcement/scripts/build_weekly_report_csv.py --input -
```
Expected JSON shape:
```json
{
"output_dir": "D:/TH1_本地目录/Steam通告/每周汇报/#2",
"csv_filename": "每周进度通告614_localization.csv",
"fields": {
"body": {"english": "...", "korean": "...", "schinese": "...", "tchinese": "...", "japanese": "..."},
"subtitle": {},
"summary": {"english": "...", "korean": "...", "schinese": "...", "tchinese": "...", "japanese": "..."},
"title": {"english": "...", "korean": "...", "schinese": "...", "tchinese": "...", "japanese": "..."}
},
"plain_text_files": {
"简体中文.txt": "..."
}
}
```
After generation, parse the CSV with `Import-Csv` or Python `csv` and check that the five supported languages have non-empty `body`, `summary`, and `title`.
## Patch Note CSV Workflow
Use this for Steam patch note requests such as "给我做 V0.7.2 的 patchnote" or "发布 Steam 补丁公告".

View File

@ -1,4 +1,4 @@
interface:
display_name: "TH1 Steam Announcement"
short_description: "Build TH1 Steam patch note localization CSVs."
default_prompt: "Use $th1-steam-announcement to generate a Steam patch note CSV for version V0.7.2."
short_description: "Build TH1 Steam announcement localization CSVs."
default_prompt: "Use $th1-steam-announcement to generate a localized Steam weekly report or patch note CSV."

View File

@ -0,0 +1,156 @@
#!/usr/bin/env python3
import argparse
import csv
import json
import sys
from pathlib import Path
if hasattr(sys.stdout, "reconfigure"):
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
STEAM_COLUMNS = [
"field",
"english",
"german",
"french",
"italian",
"korean",
"spanish",
"schinese",
"tchinese",
"russian",
"thai",
"japanese",
"portuguese",
"polish",
"danish",
"dutch",
"finnish",
"norwegian",
"swedish",
"hungarian",
"czech",
"romanian",
"turkish",
"brazilian",
"bulgarian",
"greek",
"arabic",
"ukrainian",
"latam",
"vietnamese",
"indonesian",
]
SUPPORTED_LANGUAGES = {"english", "korean", "schinese", "tchinese", "japanese"}
FIELD_ORDER = ["body", "subtitle", "summary", "title"]
def read_json(path_arg):
if path_arg == "-":
return json.load(sys.stdin)
path = Path(path_arg)
with path.open("r", encoding="utf-8-sig") as f:
return json.load(f)
def output_dir_from(data, input_arg):
if data.get("output_dir"):
return Path(data["output_dir"])
if input_arg != "-":
return Path(input_arg).resolve().parent
raise ValueError("JSON must include output_dir when reading from stdin")
def validate_fields(fields):
missing = [name for name in ("body", "summary", "title") if name not in fields]
if missing:
raise ValueError(f"Missing required fields: {', '.join(missing)}")
for field_name, values in fields.items():
if not isinstance(values, dict):
raise ValueError(f"fields.{field_name} must be an object")
unknown = sorted(set(values) - SUPPORTED_LANGUAGES)
if unknown:
raise ValueError(f"fields.{field_name} has unsupported languages: {', '.join(unknown)}")
for field_name in ("body", "summary", "title"):
values = fields[field_name]
missing_langs = sorted(lang for lang in SUPPORTED_LANGUAGES if not values.get(lang))
if missing_langs:
raise ValueError(f"fields.{field_name} is missing text for: {', '.join(missing_langs)}")
def make_row(field_name, values):
row = {column: "" for column in STEAM_COLUMNS}
row["field"] = field_name
for language, text in values.items():
row[language] = text.rstrip("\n")
return row
def write_csv(path, fields):
rows = []
for field_name in FIELD_ORDER:
if field_name in fields:
rows.append(make_row(field_name, fields[field_name]))
for field_name in fields:
if field_name not in FIELD_ORDER:
rows.append(make_row(field_name, fields[field_name]))
with path.open("w", encoding="utf-8-sig", newline="") as f:
writer = csv.DictWriter(f, fieldnames=STEAM_COLUMNS, lineterminator="\n")
writer.writeheader()
writer.writerows(rows)
def write_plain_text_files(output_dir, files):
for filename, content in files.items():
if "/" in filename or "\\" in filename:
raise ValueError(f"plain_text_files keys must be filenames only: {filename}")
target = output_dir / filename
target.write_text(content.rstrip("\n") + "\n", encoding="utf-8")
def main():
parser = argparse.ArgumentParser(description="Build TH1 Steam weekly-report localization CSV.")
parser.add_argument("--input", required=True, help="JSON input path, or '-' for stdin.")
parser.add_argument("--force", action="store_true", help="Overwrite existing output files.")
args = parser.parse_args()
data = read_json(args.input)
fields = data.get("fields")
if not isinstance(fields, dict):
raise ValueError("JSON must include a fields object")
validate_fields(fields)
output_dir = output_dir_from(data, args.input)
output_dir.mkdir(parents=True, exist_ok=True)
csv_filename = data.get("csv_filename", "weekly_report_localization.csv")
csv_path = output_dir / csv_filename
plain_files = data.get("plain_text_files", {})
if not isinstance(plain_files, dict):
raise ValueError("plain_text_files must be an object when present")
targets = [csv_path] + [output_dir / filename for filename in plain_files]
existing = [str(path) for path in targets if path.exists()]
if existing and not args.force:
raise FileExistsError("Refusing to overwrite existing files without --force: " + ", ".join(existing))
write_csv(csv_path, fields)
write_plain_text_files(output_dir, plain_files)
print(f"OK -> {csv_path}")
for language in sorted(SUPPORTED_LANGUAGES):
body_len = len(fields["body"].get(language, ""))
title = fields["title"].get(language, "")
print(f" {language}: body={body_len} title={title}")
for filename in plain_files:
print(f" text -> {output_dir / filename}")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,52 @@
---
name: th1-translate-multilingual-xlsx
description: TH1 fast workflow for translating newly added Tools/Multilingual.xlsx rows. Use when the user asks to translate Multilingual.xlsx, fill missing TH1 localization columns, update new Chinese rows into Traditional Chinese, English, Japanese, and Korean, or validate TH1 Excel localization markers without changing export/import outputs.
---
# TH1 Translate Multilingual XLSX
Use this skill as the fast path for `Tools/Multilingual.xlsx` translation. Also use `th1-multilingual` for broader localization import/export, duplicate-ID, editor-code, or runtime asset work.
## Fast Workflow
1. Do not read the whole localization pipeline unless the task touches export/import code or assets.
2. Scan the workbook first:
```powershell
& "<bundled-python>" .codex/skills/th1-translate-multilingual-xlsx/scripts/multilingual_xlsx_tool.py scan --xlsx Tools/Multilingual.xlsx
```
3. Translate only rows with missing Traditional Chinese, English, Japanese, or Korean cells, unless the user asks to revise existing translations.
4. Consult term sources only for terms that appear in the scanned rows:
- `Tools/multilingual_check/main.json`
- `Tools/multilingual_check/proper.json`
- `Tools/term_dict_en.json`
- `Tools/term_dict.json`
- `Tools/multi_audit.json`
5. Create a temporary UTF-8 JSON object keyed by ID. Use keys `tw`, `en`, `jp`, and `kr`.
6. Apply it:
```powershell
& "<bundled-python>" .codex/skills/th1-translate-multilingual-xlsx/scripts/multilingual_xlsx_tool.py apply --xlsx Tools/Multilingual.xlsx --input <translation-json>
```
7. Validate before finishing:
```powershell
& "<bundled-python>" .codex/skills/th1-translate-multilingual-xlsx/scripts/multilingual_xlsx_tool.py validate --xlsx Tools/Multilingual.xlsx
```
8. Delete temporary JSON/script files.
## Quality Rules
- Preserve every `**<...>**`, `**<![n]...>**`, and `{param}` count.
- Translate marker contents using project-standard terms, not literal ad hoc wording.
- Keep short UI labels short.
- Let the helper script normalize common Traditional Chinese proper nouns.
- Do not run `Tools/PrintExcelString.py`, edit `Tools/MultilingualTxt.txt`, or touch `Unity/Assets/BundleResources/Export/Multilingual.asset` unless the user explicitly asks for import/export.
- If PowerShell corrupts non-ASCII text in a heredoc or pipeline, stop and use a UTF-8 file plus bundled Python instead.
## Completion
Report row count, workbook path, and validation result. Mention if `Tools/MultilingualTxt.txt` or `Multilingual.asset` were already dirty but not modified by this workflow.

View File

@ -0,0 +1,4 @@
interface:
display_name: "TH1 Multilingual XLSX Translation"
short_description: "Fast TH1 Multilingual.xlsx translation workflow."
default_prompt: "Translate newly added rows in TH1 Tools/Multilingual.xlsx using project term standards and validate markers."

View File

@ -0,0 +1,213 @@
# -*- coding: utf-8 -*-
"""Fast helper for TH1 Tools/Multilingual.xlsx translation tasks."""
from __future__ import annotations
import argparse
import json
import re
from pathlib import Path
from typing import Any
import openpyxl
LANG_COLS = {
"tw": "繁中",
"en": "英文",
"jp": "日文",
"kr": "韩文",
}
MARKER_RE = re.compile(r"\*\*<[^>]*>\*\*")
PARAM_RE = re.compile(r"\{param\}")
ORDERED_BAD_RE = re.compile(r"\*\*<\[\d+\][^>]*>\*\*")
TW_REPLACEMENTS = {
"八坂神奈子": "八阪神奈子",
"御射宮司": "禦射宮司",
}
def load_sheet(path: Path):
wb = openpyxl.load_workbook(path, data_only=False)
ws = wb.active
headers = [cell.value for cell in ws[1]]
cols = {header: idx + 1 for idx, header in enumerate(headers) if header}
required = ["ID", "活跃文本", "中文", *LANG_COLS.values(), "无需翻译"]
missing = [name for name in required if name not in cols]
if missing:
raise SystemExit(f"Missing columns: {missing}")
return wb, ws, cols
def clean_id(value: Any) -> str:
return str(value or "").lstrip("\ufeff").strip()
def truthy(value: Any) -> bool:
return str(value or "").strip().lower() in {"true", "1", "yes", ""}
def row_payload(ws, cols, row: int) -> dict[str, Any]:
zh = ws.cell(row, cols["中文"]).value or ""
return {
"row": row,
"id": clean_id(ws.cell(row, cols["ID"]).value),
"active": ws.cell(row, cols["活跃文本"]).value,
"zh": zh,
"markers": MARKER_RE.findall(str(zh)),
"params": PARAM_RE.findall(str(zh)),
"desc": ws.cell(row, cols.get("备注", 0)).value if "备注" in cols else None,
}
def command_scan(args) -> None:
_, ws, cols = load_sheet(args.xlsx)
rows = []
for row in range(2, ws.max_row + 1):
zh = str(ws.cell(row, cols["中文"]).value or "")
if not zh.strip() or truthy(ws.cell(row, cols["无需翻译"]).value):
continue
if args.only_active and not truthy(ws.cell(row, cols["活跃文本"]).value):
continue
missing = [
key
for key, col_name in LANG_COLS.items()
if not str(ws.cell(row, cols[col_name]).value or "").strip()
]
if args.all_rows or missing:
payload = row_payload(ws, cols, row)
payload["missing_langs"] = missing
rows.append(payload)
print(json.dumps({"count": len(rows), "rows": rows}, ensure_ascii=False, indent=2))
def normalize_tw(text: str) -> str:
for old, new in TW_REPLACEMENTS.items():
text = text.replace(old, new)
return text
def load_translation_json(path: Path) -> dict[str, dict[str, str]]:
data = json.loads(path.read_text(encoding="utf-8-sig"))
if isinstance(data, dict) and "translations" in data:
data = data["translations"]
if not isinstance(data, dict):
raise SystemExit("Translation JSON must be an object keyed by ID, or contain translations.")
normalized: dict[str, dict[str, str]] = {}
for item_id, values in data.items():
if not isinstance(values, dict):
raise SystemExit(f"Translation for {item_id} must be an object.")
normalized[str(item_id)] = {
lang: str(values[lang])
for lang in LANG_COLS
if lang in values and values[lang] is not None
}
return normalized
def command_apply(args) -> None:
wb, ws, cols = load_sheet(args.xlsx)
translations = load_translation_json(args.input)
seen: set[str] = set()
updated = 0
for row in range(2, ws.max_row + 1):
item_id = clean_id(ws.cell(row, cols["ID"]).value)
if item_id not in translations:
continue
seen.add(item_id)
for lang, col_name in LANG_COLS.items():
if lang not in translations[item_id]:
continue
value = translations[item_id][lang]
if lang == "tw":
value = normalize_tw(value)
ws.cell(row, cols[col_name]).value = value
updated += 1
missing = sorted(set(translations) - seen)
if missing:
raise SystemExit(f"IDs not found in workbook: {missing}")
wb.save(args.xlsx)
print(f"updated {updated} rows")
def command_validate(args) -> None:
_, ws, cols = load_sheet(args.xlsx)
issues = []
missing = []
for row in range(2, ws.max_row + 1):
zh = str(ws.cell(row, cols["中文"]).value or "")
if not zh.strip() or truthy(ws.cell(row, cols["无需翻译"]).value):
continue
if ORDERED_BAD_RE.search(zh):
issues.append({"row": row, "type": "bad_ordered_marker", "lang": "zh"})
zh_markers = MARKER_RE.findall(zh)
zh_params = PARAM_RE.findall(zh)
for lang, col_name in LANG_COLS.items():
value = str(ws.cell(row, cols[col_name]).value or "")
if not value.strip():
missing.append({"row": row, "id": clean_id(ws.cell(row, cols["ID"]).value), "lang": lang})
continue
if ORDERED_BAD_RE.search(value):
issues.append({"row": row, "type": "bad_ordered_marker", "lang": lang})
markers = MARKER_RE.findall(value)
params = PARAM_RE.findall(value)
if len(markers) != len(zh_markers):
issues.append(
{
"row": row,
"id": clean_id(ws.cell(row, cols["ID"]).value),
"lang": lang,
"type": "marker_count",
"zh": len(zh_markers),
"tr": len(markers),
}
)
if len(params) != len(zh_params):
issues.append(
{
"row": row,
"id": clean_id(ws.cell(row, cols["ID"]).value),
"lang": lang,
"type": "param_count",
"zh": len(zh_params),
"tr": len(params),
}
)
result = {"missing": missing, "issues": issues}
print(json.dumps(result, ensure_ascii=False, indent=2))
if missing or issues:
raise SystemExit(1)
def add_xlsx_arg(parser: argparse.ArgumentParser) -> None:
parser.add_argument("--xlsx", type=Path, default=Path("Tools/Multilingual.xlsx"))
def main() -> None:
parser = argparse.ArgumentParser()
add_xlsx_arg(parser)
sub = parser.add_subparsers(dest="command", required=True)
scan = sub.add_parser("scan")
add_xlsx_arg(scan)
scan.add_argument("--all-rows", action="store_true")
scan.add_argument("--only-active", action="store_true", default=True)
scan.set_defaults(func=command_scan)
apply = sub.add_parser("apply")
add_xlsx_arg(apply)
apply.add_argument("--input", type=Path, required=True)
apply.set_defaults(func=command_apply)
validate = sub.add_parser("validate")
add_xlsx_arg(validate)
validate.set_defaults(func=command_validate)
args = parser.parse_args()
args.func(args)
if __name__ == "__main__":
main()

View File

@ -1,5 +1,5 @@
{
"nextId": 348,
"nextId": 365,
"bugs": [
{
"id": 2,
@ -3040,12 +3040,12 @@
"id": 303,
"title": "打不了盟友城上的敌人",
"description": "",
"status": "open",
"status": "fixed",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1780410200799,
"updatedAt": 1780410200799
"updatedAt": 1781376094036
},
{
"id": 304,
@ -3095,12 +3095,12 @@
"id": 308,
"title": "那现在占了守矢的城之后还能起军营",
"description": "",
"status": "open",
"status": "fixed",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1780563207530,
"updatedAt": 1780563207530
"updatedAt": 1781376088776
},
{
"id": 309,
@ -3216,12 +3216,12 @@
"id": 319,
"title": "连升两级城市 联机 会bug",
"description": "",
"status": "open",
"status": "fixed",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1780822732851,
"updatedAt": 1780822732851
"updatedAt": 1781376070022
},
{
"id": 320,
@ -3282,12 +3282,12 @@
"id": 325,
"title": "懂了这里有个bug 应该用小船里面的单位产生精微身但是他直接用小船的类型产生精微身小船是没有血量上限的相当于是0血因为小船根据船上单位决定血量上限所以生成小船精微身会立刻复活变成小船",
"description": "",
"status": "open",
"status": "fixed",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1780902545583,
"updatedAt": 1780902545583
"updatedAt": 1781431224686
},
{
"id": 326,
@ -3436,34 +3436,34 @@
"id": 339,
"title": "所有行动机会 要调整为 行动点",
"description": "",
"status": "open",
"status": "fixed",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781202610657,
"updatedAt": 1781202610657
"updatedAt": 1781431196025
},
{
"id": 340,
"title": "犬走椛 + 早苗 乘风 出错",
"description": "",
"status": "open",
"status": "fixed",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781206189499,
"updatedAt": 1781206189499
"updatedAt": 1781376034286
},
{
"id": 341,
"title": "价格loading图片不然开头就是星空",
"description": "",
"status": "open",
"status": "fixed",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781206575290,
"updatedAt": 1781206575290
"updatedAt": 1781376033145
},
{
"id": 342,
@ -3480,56 +3480,243 @@
"id": 343,
"title": "强制贴脸选项去掉",
"description": "",
"status": "open",
"status": "fixed",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781261788533,
"updatedAt": 1781261788533
"updatedAt": 1781376028556
},
{
"id": 344,
"title": "右上角显示玩家名字的功能怎么还没出来喵",
"description": "",
"status": "open",
"status": "fixed",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781272042237,
"updatedAt": 1781272042237
"updatedAt": 1781429576604
},
{
"id": 345,
"title": "连续升级bug",
"description": "",
"status": "open",
"status": "fixed",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781272049928,
"updatedAt": 1781272049928
"updatedAt": 1781376014631
},
{
"id": 346,
"title": "同城热插拔限制",
"description": "",
"status": "open",
"status": "fixed",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781280619804,
"updatedAt": 1781280619804
"updatedAt": 1781376015759
},
{
"id": 347,
"title": "开游戏的初始图片",
"description": "",
"status": "open",
"status": "fixed",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781339152929,
"updatedAt": 1781339152929
"updatedAt": 1781376016973
},
{
"id": 348,
"title": "火焰的文化复活",
"description": "",
"status": "open",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781357750754,
"updatedAt": 1781357750754
},
{
"id": 349,
"title": "Lv.4火焰的描述bug",
"description": "",
"status": "fixed",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781357760199,
"updatedAt": 1781375983237
},
{
"id": 350,
"title": "精微身占人口",
"description": "",
"status": "fixed",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781357856438,
"updatedAt": 1781373438408
},
{
"id": 351,
"title": "联机展示版本号",
"description": "",
"status": "open",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781360387935,
"updatedAt": 1781360387935
},
{
"id": 352,
"title": "阿空Lv2开雾问题",
"description": "",
"status": "fixed",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781360670276,
"updatedAt": 1781370669697
},
{
"id": 353,
"title": "buff生效的时候弹出特效提示",
"description": "",
"status": "open",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781362283774,
"updatedAt": 1781362283774
},
{
"id": 354,
"title": "觉叠恐惧不会爆炸",
"description": "",
"status": "fixed",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781363579213,
"updatedAt": 1781365899172
},
{
"id": 355,
"title": "成就读取失败",
"description": "",
"status": "fixed",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781367642598,
"updatedAt": 1781427933813
},
{
"id": 356,
"title": "觉的反击描述",
"description": "",
"status": "fixed",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781369506910,
"updatedAt": 1781428870697
},
{
"id": 357,
"title": "苗的溅射伤害又导致单位不会死亡",
"description": "",
"status": "fixed",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781370535371,
"updatedAt": 1781376299594
},
{
"id": 358,
"title": "火焰的复活时间 描述or实际",
"description": "",
"status": "fixed",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781379637601,
"updatedAt": 1781427997845
},
{
"id": 359,
"title": "阿空精微身",
"description": "",
"status": "fixed",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781428869249,
"updatedAt": 1781430812718
},
{
"id": 360,
"title": "咱发现好像起城墙+盾兵有些时候城市经验会莫名其妙+1",
"description": "",
"status": "open",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781444723637,
"updatedAt": 1781444723637
},
{
"id": 361,
"title": "测试模式 移动那个UI会滞留",
"description": "",
"status": "open",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781500209678,
"updatedAt": 1781500209678
},
{
"id": 362,
"title": "遗迹选择中的剑士为埃及的样子",
"description": "",
"status": "open",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781502796189,
"updatedAt": 1781502796189
},
{
"id": 363,
"title": "勇仪推美铃/帕琪人bug",
"description": "",
"status": "open",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781503066460,
"updatedAt": 1781503066460
},
{
"id": 364,
"title": "资源系数没有公布",
"description": "",
"status": "open",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781503072859,
"updatedAt": 1781503072859
}
]
}

View File

@ -0,0 +1,59 @@
# 博丽帝国批量策划需求索引
> 文档类型:策划给程序的批量开发需求索引
> 需求批次:博丽帝国 / 维京文明-北海帝国
> 来源:用户提供的两张策划表截图、`Design/final/mechanics/viking-heroes-final.md``Design/drafts/factions/viking-hakurei-mechanics-draft.md`
> 状态:初稿,供策划审核;程序开发前必须先处理审核报告中的阻塞项
## 1. 文档清单
| 文件 | 内容 | 程序读取优先级 |
| --- | --- | --- |
| `01-faction-base.md` | 阵营基础配置、选人界面、图鉴、BGM、加载图、基础 DataAsset 接入 | 最高 |
| `02-heroes.md` | 5 个英雄的等级规则、直接 Skill、衍生 Skill、UnitAction、衍生单位、英雄配合 | 最高 |
| `03-techs.md` | 初始科技、抢劫/符文/英灵殿、海洋线、狂暴线、圆盾兵线 | 高 |
| `04-units.md` | 新单位、替代单位、衍生单位、地块对象、形态单位 | 高 |
| `05-skills.md` | 阵营 Skill、英雄 Skill、衍生状态 Skill 的需求卡合集 | 高 |
| `06-unit-actions.md` | 主动抢劫、丹麦金、英灵点转化、英雄主动行为等 UnitAction 需求卡合集 | 高 |
| `99-review-report.md` | 本批需求文档初审报告、覆盖率、风险、阻塞项 | 最高 |
## 2. 需求拆分原则
- 阵营总配置只写接入要求,不把每个 Skill 的生命周期塞进阵营文档。
- 英雄文档按 Lv 整合玩法,并列出直接配置在英雄身上的 Skill、衍生 Skill、UnitAction 和衍生单位。
- Skill 文档负责生命周期、叠层、继承、表现、联机、存档、资源占位。
- UnitAction 文档负责玩家操作、`CheckShow``CheckCan``CommonActionParams`、权威数据变化。
- 科技文档负责 `TechInfo` / `TechAtomInfo` / 阵营接入,不替代 Skill 或 UnitAction 文档。
- 新单位文档负责属性、替代关系、生成/消失、资源和 AI 基础安全。
## 3. 统一命名约定
以下 ID 是策划建议名,不代表最终代码已存在。程序开发前必须检查枚举和 DataAsset 冲突。
| 类型 | 前缀 | 示例 |
| --- | --- | --- |
| 阵营 / 玩家 | `Hakurei` / `NorwayReimu` | `HakureiEmpire``NorwayReimu` |
| 科技 | `Hakurei` | `HakureiRaid` |
| TechAtom | `Hakurei` | `HakureiAutoRaid` |
| SkillType | `Hakurei` / 英雄名 | `HakureiProtection``ReimuExtermination` |
| UnitActionType | `Hakurei` / 英雄名 | `HakureiActiveRaid``SuikaThrow` |
| UnitType | `Hakurei` / 英雄名 | `HakureiKarvi``SuikaMini` |
| GiantType | 现有组合优先 | `NorwayReimu`;其他 4 英雄需新增或确认 |
## 4. 已发现的项目现状
- 项目已有 `ForceEnum.Reimu`
- 项目已有 `CivEnum.Norway`
- 项目已有 `GiantType.NorwayReimu`
- 项目已有 `MusicName: ReimuNorway`
- 项目导出多语言中已有 `Hakurei Empire``Hakurei Empire BGM` 文本痕迹。
- 以上说明“博丽帝国 / 维京文明”可能已有部分接入,不能当成全新空白阵营直接新增。
## 5. 阻塞确认
```text
[WARN][id-scope-unclear] HakureiEmpire: 项目已有 Norway/Reimu/Hakurei 痕迹 - 需确认本批是复用既有阵营、补全既有阵营,还是新增独立阵营
[WARN][hero-id-missing] HakureiEmpire: 仅确认 NorwayReimu 已存在 - 堇子/华扇/阿吽/萃香 GiantType 需程序检查或新增
[WARN][wonder-design-missing] HakureiEmpire: 本批图片未提供 7 个奇观配置 - 阵营基础配置只能保留警告
```

View File

@ -0,0 +1,128 @@
# 博丽帝国阵营基础配置策划需求
> 文档类型:策划给程序的新阵营基础配置需求
> 适用范围:博丽帝国 / 维京文明-北海帝国的基础 DataAsset、UI、图鉴、BGM、加载图、战绩筛选、文案来源
> 来源:用户提供的阵营机制截图、`Design/final/narrative/viking-hakurei-empire.html``Design/drafts/factions/viking-hakurei-mechanics-draft.md`
> 状态:初稿
## 1. 阵营定位
| 字段 | 内容 |
| --- | --- |
| 阵营显示名 | 博丽帝国 |
| 英文名 | Hakurei Empire |
| 文明包装 | 维京文明 / 北海帝国 |
| 核心节奏 | 弱种田、简化种田、敌境抢劫、死亡转英灵、跨海登陆 |
| 核心资源 | 金币、英灵点、发展度 |
| 主要玩法 | 在敌方领地和建筑上站稳,通过抢劫、勒索、符文、英灵殿和海战滚动收益 |
## 2. ID 与枚举
| 项 | 建议 | 要求 |
| --- | --- | --- |
| `CivEnum` | 优先确认是否复用 `Norway` | 项目已存在 `CivEnum.Norway`,不要盲目新增 |
| `ForceEnum` | 优先确认是否复用 `Reimu` | 项目已存在 `ForceEnum.Reimu` |
| `Empire` | `Norway + Reimu` 或策划确认的新组合 | 程序需先检查 `PlayerDataAssets.asset` 中是否已有完整 `PlayerInfo` |
| `GiantType` | `NorwayReimu` 已存在;其余 4 英雄待新增 | 堇子/华扇/阿吽/萃香不可复用灵梦 ID |
| `MusicName` | `ReimuNorway` 已存在候选 | 需确认是否用于博丽帝国专属 BGM |
## 3. 基础机制
### 3.1 发展设计
| 机制 | 规则 | 实现入口 |
| --- | --- | --- |
| 港口邻接城市中心 | 城市中心相邻的港口提供 +1 金币 | `PlayerLogic` / 城市产出刷新 / `PlayerDataAssets` 机制 Skill |
| 港口强化市场 | 港口为相邻市场 +1 等级 | 建筑等级计算或市场产出计算 |
| 英灵点换发展度 | 军营中可消耗英灵点换发展度,比例 5:1 | UnitAction`HakureiConvertEinherjarToDevelopment` |
### 3.2 战斗设计
| 机制 | 规则 | 独立文档 |
| --- | --- | --- |
| 抢劫 | 我方单位位于敌方任意建筑上且拥有攻击点,回合结束自动抢 1 金币,上限不超过城市产出 | `03-techs.md``05-skills.md``06-unit-actions.md` |
| 主动抢劫 | 消耗通用行动点,立即抢劫,收益翻倍 | `06-unit-actions.md` |
| 丹麦金 | 向某个帝国发起勒索;若不支付,下回合所有单位抢劫收益翻倍 | `06-unit-actions.md` |
| 符文 | 我方单位死亡后原地留下符文地块 | `04-units.md``05-skills.md` |
| 英灵殿 | 我方单位死亡后英灵点 +1军营可将英灵点转发展度 | `05-skills.md``06-unit-actions.md` |
| 特色海战 | 船只上岸、卡维船、长船、龙船推动 | `03-techs.md``04-units.md``05-skills.md``06-unit-actions.md` |
| 狂暴 | 狂暴立即获得 1 点攻击行动点,攻击无视损伤 | `03-techs.md``04-units.md``05-skills.md` |
| 圆盾兵 | 替代盾兵15HP相邻友军获得防御 1.5x,不叠加 | `03-techs.md``04-units.md``05-skills.md` |
## 4. 英雄配置
| 职阶 | 英雄 | 建议 `GiantType` | 状态 |
| --- | --- | --- | --- |
| 王 | 博丽灵梦 | `NorwayReimu` | 项目已有,需确认是否补全或重做 |
| 后 | 宇佐见堇子 | `NorwaySumireko` | 待新增或确认 |
| 相 | 茨木华扇 | `NorwayKasen` | 待新增或确认 |
| 马 | 高丽野阿吽 | `NorwayAunn` | 待新增或确认 |
| 车 | 伊吹萃香 | `NorwaySuika` | 待新增或确认 |
英雄详细需求见 `02-heroes.md`
## 5. DataAsset 接入
必须配置或检查:
| DataAsset | 要求 |
| --- | --- |
| `PlayerDataAssets.asset` | 新增或补全 `PlayerInfo`阵营名、文明名、英雄池、科技池、初始科技、特色科技、加载图、BGM、选人展示 |
| `UnitTypeDataAssets.asset` | 5 英雄 Lv1-Lv4、女武神、圆盾兵、狂暴步兵、狂战士、卡维船、长船、龙船、小萃香等 |
| `HeroDataAssets.asset` | 5 英雄任务、立绘、头像、职阶、升级任务 |
| `SkillDataAssets.asset` | 阵营 Skill、英雄 Skill、衍生 Skill |
| `ActionDataAssets.asset` | 主动抢劫、丹麦金、英灵转发展、英雄主动按钮 |
| `TechDataAssets.asset` | 初始科技、海洋线、山线+巨人、田线、外交/大使馆线 |
| `LibraryDataAssets.asset` | 阵营、5 英雄、7 奇观、单位、科技、Skill/Action 的图鉴入口 |
| `MusicDataAssets.asset` | 专属 BGM音乐室可播放 |
## 6. UI 接入
| UI | 要求 |
| --- | --- |
| 选人界面 | 博丽帝国可选择;展示 5 英雄、阵营介绍、特色科技、加载图 |
| 图鉴 | 5 英雄、阵营机制、新单位、科技、Skill/Action 可查 |
| 音乐室 | 专属 BGM 显示并可播放 |
| 战绩界面 | 所有阵营筛选下拉包含博丽帝国 |
| 科技树 | 新科技与 TechAtom 图标、名称、描述、锁定说明正确 |
| 行动圈 | 新 UnitAction 图标、锁定状态、消耗、目标选择正确 |
## 7. 文案来源
| 文案 | 来源 |
| --- | --- |
| 阵营叙事 | `Design/final/narrative/viking-hakurei-empire.html` |
| 英雄机制 | `Design/final/mechanics/viking-heroes-final.md` |
| 阵营机制 | `Design/drafts/factions/viking-hakurei-mechanics-draft.md` 与本批截图 |
| Skill/Action/Tech 正式 UI 文案 | 若 `Design/final/` 未找到,先留空并写警告 |
## 8. 资源占位要求
- 正式图标缺失时Skill / UnitAction / Tech 必须按模板复制同类旧图标作为独立占位资源。
- 不允许直接复用旧资源引用。
- 不复制源 `.meta`,避免 GUID 冲突。
- 英雄立绘、头像、加载图、单位 Sprite、VFX/SFX 如缺失,必须保留 warning。
## 9. 验收测试
- 博丽帝国可在选人界面选择并正常进游戏。
- 5 英雄均可进入英雄池Lv1-Lv4 数据不缺。
- 初始科技生效;海洋线、狂暴线、圆盾兵线可研发。
- 自动抢劫、主动抢劫、丹麦金、符文、英灵点转发展度可在单机中跑通。
- 新 UnitAction 不绕过 action 权威流程。
- 联机 host/client 抢劫收益、英灵点、符文、死亡恢复结果一致。
- 存档读回后英灵点、符文地块、英雄衍生单位、debuff 层数一致。
- 回放可重放抢劫、死亡、符文、传送、投掷等行为。
- 图鉴、音乐室、战绩筛选、科技树不报错。
## 10. 警告清单
```text
[WARN][id-scope-unclear] HakureiEmpire: 项目已有 Norway/Reimu/Hakurei 痕迹 - 需确认本批是复用既有阵营还是新增独立阵营
[WARN][hero-id-missing] HeroDataAssets: Sumireko/Kasen/Aunn/Suika GiantType 待确认 - 缺最终枚举
[WARN][wonder-design-missing] LibraryDataAssets: HakureiEmpire wonders - 本批图片未提供 7 个奇观 - 暂不具备完整图鉴配置
[WARN][loading-image-unclear] PlayerDataAssets: HakureiEmpire.LoadingPic - 未从图片确认加载图 - 等待资源检查
[WARN][music-unclear] MusicDataAssets: ReimuNorway - 项目已有候选 BGM需确认是否作为博丽帝国专属 BGM
[WARN][copy-missing] Skill/Action/Tech: 多数正式 UI 文案未在图片中提供 - 程序实现时先留空并保留警告
```

View File

@ -0,0 +1,234 @@
# 博丽帝国 5 英雄策划需求
> 文档类型:策划给程序的新英雄整合需求
> 适用范围:博丽帝国 5 个英雄 Lv1-Lv4 规则、Skill 获得、衍生 Skill、衍生单位、UnitAction、英雄配合
> 来源:用户提供的英雄表截图、`Design/final/mechanics/viking-heroes-final.md`
> 状态:初稿
## 1. 总览
| 职阶 | 英雄 | 特色 A | 特色 B | 建议 `GiantType` | 说明 |
| --- | --- | --- | --- | --- | --- |
| 王 | 灵梦 | 给御札 | 退治英雄 | `NorwayReimu` | 项目已有 ID需确认重做范围 |
| 后 | 堇子 | 灵异珠连线传送 | 连线叠 Buff | `NorwaySumireko` | 待新增或确认 |
| 相 | 华扇 | 设定兽引 | 兽引叠叠乐 | `NorwayKasen` | 待新增或确认 |
| 马 | 阿吽 | 双子切换 | 传送门 | `NorwayAunn` | 待新增或确认 |
| 车 | 萃香 | 小萃香强化抢劫 | 大萃香直入敌阵 | `NorwaySuika` | 待新增或确认 |
## 2. 王 - 灵梦
### 2.1 各等级要求
| 等级 | 策划规则描述 | 本级新增内容 |
| --- | --- | --- |
| Lv1 | 向友方施法:施加 4 层“博丽加护”,每层抵挡 1 点伤害。攻击敌方:附加永久 Debuff“退治”被灵梦攻击时每层额外 +2 伤害,层数上限等于灵梦等级。清除退治:向灵梦缴纳 `3 * 等级 * 层数` 金币才能清除。 | 直接 Skill博丽加护、退治UnitAction施加御札、缴金清除退治 |
| Lv2 | 移动或向友方施法时,对射程内拥有退治 Debuff 的英雄自动造成伤害,每层 2 点。2 格内友方英雄被攻击时,为攻击来源附加退治。 | 直接 Skill退治感应衍生 Skill友方英雄被击退治反制 |
| Lv3 | 向友方施法或攻击敌方时,额外施加“博丽御札”,效果为随机 Buff/Debuff。 | 衍生 Skill博丽御札随机效果 |
| Lv4 | 退治每层额外伤害提升至 5 点。 | 强化 Skill退治伤害参数 |
### 2.2 每级 Skill 配置
| 等级 | 直接配置在英雄身上的 Skill | 本级新增 Skill | 本级强化/替换 Skill | Skill 文档 |
| --- | --- | --- | --- | --- |
| Lv1 | `ReimuHakureiProtectionCaster``ReimuExterminationAttack` | `HakureiProtection``ReimuExtermination` | 无 | `05-skills.md` |
| Lv2 | `ReimuExterminationPulse``ReimuExterminationCounter` | `ReimuExterminationPulse``ReimuExterminationCounter` | 无 | `05-skills.md` |
| Lv3 | `ReimuRandomOfuda` | `ReimuRandomOfuda` | 无 | `05-skills.md` |
| Lv4 | 同 Lv3 | 无 | `ReimuExtermination` 每层伤害 2 -> 5 | `05-skills.md` |
### 2.3 UnitAction 配置
| 等级 | UnitAction | 规则 |
| --- | --- | --- |
| Lv1 | `ReimuCastHakureiProtection` | 向友方目标施法,施加 4 层博丽加护 |
| Lv1 | `ReimuPayClearExtermination` | 目标拥有退治时缴金清除;金币给灵梦所属玩家或从目标玩家扣除,需程序确认 |
| Lv3 | `ReimuCastRandomOfuda` | 若不复用施法/攻击入口,需要独立 Action否则由 Skill 自动触发 |
### 2.4 衍生对象
- `HakureiProtection`:友方单位身上的防护层数 Skill。
- `ReimuExtermination`:敌方英雄身上的永久 debuff。
- `ReimuRandomOfudaBuff` / `ReimuRandomOfudaDebuff`:随机御札效果,需策划补充效果池。
### 2.5 与其他英雄配合
| 配合英雄 | 配合规则 | 涉及对象 |
| --- | --- | --- |
| 堇子 | 灵异珠被攻击时也会附着退治 Debuff灵异线英雄加成可影响灵梦 | `SumirekoOccultOrb``ReimuExtermination` |
| 华扇 | 兽引效果对英雄翻倍;鹰引给移动机会时可触发灵梦移动后的自动退治伤害 | `KasenBeastGuide``ReimuExterminationPulse` |
| 阿吽 | 两个阿吽共享 Buff两个阿吽被攻击时各自独立计算退治 Debuff | `AunnTwinBody``ReimuExterminationCounter` |
| 萃香 | 小萃香被打也会附着退治 Debuff | `SuikaMini``ReimuExterminationCounter` |
## 3. 后 - 堇子
### 3.1 各等级要求
| 等级 | 策划规则描述 | 本级新增内容 |
| --- | --- | --- |
| Lv1 | 移动后,可向森林发射 1 颗丹麦灵异珠。灵异珠不可移动、隐身。丹麦灵异珠:附近 1 格内单位移动力与攻击力的最终数值互换。 | UnitAction发射灵异珠衍生单位丹麦灵异珠 |
| Lv2 | 可向水域发射英格兰灵异珠。英格兰灵异珠:附近 1 格内单位攻击力与防御力的最终数值互换。 | 新衍生单位:英格兰灵异珠 |
| Lv3 | 可向山脉发射挪威灵异珠。诺曼底灵异珠:替周围单位承伤 3 次。 | 新衍生单位:挪威/诺曼底灵异珠;需确认命名差异 |
| Lv4 | 可向平原发射诺曼底灵异珠。英格兰灵异珠:参与互换的数值与原本值取最大值。 | 强化英格兰灵异珠;新增诺曼底灵异珠 |
### 3.2 每级 Skill 配置
| 等级 | 直接配置在英雄身上的 Skill | 本级新增 Skill | 衍生 Skill | Skill 文档 |
| --- | --- | --- | --- | --- |
| Lv1 | `SumirekoShootOccultOrb` | `SumirekoDenmarkOrbUnlock` | `SumirekoDenmarkOrbSwapMoveAttack` | `05-skills.md` |
| Lv2 | 同 Lv1 | `SumirekoEnglandOrbUnlock` | `SumirekoEnglandOrbSwapAttackDefense` | `05-skills.md` |
| Lv3 | 同 Lv2 | `SumirekoNorwayOrbUnlock` | `SumirekoNormandyOrbDamageProxy` | `05-skills.md` |
| Lv4 | 同 Lv3 | `SumirekoNormandyOrbUnlock` | `SumirekoEnglandOrbMaxValueUpgrade` | `05-skills.md` |
### 3.3 UnitAction 配置
| 等级 | UnitAction | 规则 |
| --- | --- | --- |
| Lv1 | `SumirekoShootOccultOrb` | 移动后可使用;目标地形限制为森林 |
| Lv2 | `SumirekoShootOccultOrb` | 增加水域目标 |
| Lv3 | `SumirekoShootOccultOrb` | 增加山脉目标 |
| Lv4 | `SumirekoShootOccultOrb` | 增加平原目标 |
| Lv2+ | `SumirekoOccultLineTeleport` | 若两个灵异珠形成横竖线或 45 度斜线,普通单位可通过连线传送 |
### 3.4 衍生对象
| 衍生对象 | 来源等级 | 产生方式 | 生命周期 |
| --- | --- | --- | --- |
| 丹麦灵异珠 | Lv1 | 堇子移动后发射到森林 | 隐身、不可移动;上限与等级或图片“无上限”冲突,需确认 |
| 英格兰灵异珠 | Lv2 | 发射到水域 | 同上 |
| 挪威灵异珠 | Lv3 | 发射到山脉 | 同上 |
| 诺曼底灵异珠 | Lv4 | 发射到平原 | 可替周围承伤 3 次 |
| 灵异连线 | Lv2 | 两珠横竖线或 45 度斜线 | 由珠位置实时计算或生成临时连线对象 |
| 灵异三角 | Lv3 | 多珠围成三角形 | 提供移速/攻击/射程方向 BuffLv4 可叠加 |
### 3.5 与其他英雄配合
| 配合英雄 | 配合规则 |
| --- | --- |
| 灵梦 | 灵异珠被攻击时也给敌人附着退治 Debuff灵异线英雄加成 |
| 华扇 | 将单位快速传送到兽引附近 |
| 阿吽 | 灵异线英雄加成 |
| 萃香 | 灵异线英雄加成,可配合小萃香 |
## 4. 相 - 华扇
### 4.1 各等级要求
| 等级 | 策划规则描述 | 本级新增内容 |
| --- | --- | --- |
| Lv1 | 拥有兽引时,需先在 4 格距离内指定兽引位置。兽引:在某个地块留下标记,英雄可在兽引位置与华扇身边相互传送。回收兽引:收回兽印并获得 1 点移动行动点。 | UnitAction设定兽引、回收兽引衍生对象兽引地块 |
| Lv2 | 兽引效果增加:周围防御 +1回合开始时回复 2 血。回收兽引额外恢复 5 血。 | 强化兽引光环 |
| Lv3 | 兽引效果增加:周围防御 +1 攻,回合开始时回复 2 血。回收兽引获得 1 点移动行动点 + 恢复 5 血 + 1 层狂暴。 | 强化兽引光环;接入狂暴 |
| Lv4 | 进入鬼形态,变为车阶模板,常驻狂暴。 | 形态转换:鬼形态 |
### 4.2 Skill 与 UnitAction
| 等级 | 直接 Skill | UnitAction | 衍生 Skill |
| --- | --- | --- | --- |
| Lv1 | `KasenBeastGuideOwner` | `KasenSetBeastGuide``KasenRecallBeastGuide` | `KasenBeastGuideTeleport` |
| Lv2 | 同 Lv1 | 同 Lv1 | `KasenBeastGuideDefenseHealAura` |
| Lv3 | 同 Lv2 | 同 Lv2 | `KasenBeastGuideAttackBerserkAura` |
| Lv4 | `KasenOniForm` | `KasenToggleOniForm` 或自动触发 | `HakureiBerserk` |
### 4.3 衍生对象
- `KasenBeastGuideMarker`:地块标记,占格性待确认;默认不占格,不可攻击。
- `KasenOniForm`:华扇转换为车阶模板;需新 Lv4 `UnitTypeInfo` 或运行时模板覆盖。
### 4.4 与其他英雄配合
| 配合英雄 | 配合规则 |
| --- | --- |
| 灵梦 | 灵梦移动到兽引上可再次移动并触发退治伤害;英雄加成翻倍 |
| 堇子 | 堇子可将单位快速传送到兽引附近;英雄加成翻倍 |
| 阿吽 | 阿吽石化/坐在兽引上可强化防守;英雄加成翻倍 |
| 萃香 | 英雄加成翻倍 |
## 5. 马 - 阿吽
### 5.1 各等级要求
| 等级 | 策划规则描述 | 本级新增内容 |
| --- | --- | --- |
| Lv1 | 攻击后可选择逃脱或原地石化。石化效果:自身 +2 防御,周围友军 +1 防御。 | UnitAction石化/逃脱选择Skill石化防御 |
| Lv2 | 升级或出战后,身边出现第二个阿吽。操作其中一个,另一个自动变成石化状态。两者共享生命,距离不能超过 8 格。阿吽身边的单位可以传送到另一个阿吽边上。 | 衍生单位第二个阿吽Skill双子共享UnitAction传送 |
| Lv3 | 石化的阿吽替周围英雄承伤。 | Skill石化承伤 |
| Lv4 | 两个阿吽都可以操作。 | 强化双子操作规则 |
### 5.2 Skill 与 UnitAction
| 等级 | 直接 Skill | UnitAction | 衍生 Skill |
| --- | --- | --- | --- |
| Lv1 | `AunnPetrifyAfterAttack` | `AunnChooseEscapeOrPetrify` | `AunnPetrifiedDefenseAura` |
| Lv2 | `AunnTwinBody` | `AunnPortalTeleport` | `AunnSharedHealth``AunnTwinAutoPetrify` |
| Lv3 | 同 Lv2 | 同 Lv2 | `AunnPetrifiedHeroDamageProxy` |
| Lv4 | `AunnTwinBothOperable` | 同 Lv2 | `AunnSharedRecoveryOnly` |
### 5.3 衍生对象
- `AunnTwin`:第二个阿吽,建议作为衍生英雄单位处理,进存档和回放。
- `AunnPetrifiedState`:石化状态,可能改变行动能力和防御。
- `AunnPortalLink`:两个阿吽之间的传送规则,不一定需要可见实体。
### 5.4 与其他英雄配合
| 配合英雄 | 配合规则 |
| --- | --- |
| 灵梦 | 两个阿吽共享 Buff两个阿吽被攻击时各自独立计算退治 Debuff |
| 堇子 | 可通过灵异线和阿吽传送形成快速位移链 |
| 华扇 | 阿吽可石化守在兽引上;英雄加成翻倍 |
| 萃香 | 萃香可将阿吽丢出去,形成远距离传送门前点 |
## 6. 车 - 萃香
### 6.1 各等级要求
| 等级 | 策划规则描述 | 本级新增内容 |
| --- | --- | --- |
| Lv1 | 移动后,原地留下一个小萃香,可立刻行动。 | 衍生单位小萃香Skill移动生成 |
| Lv2 | 小萃香可附着到萃香身上,获得 1 层萃香层数,层数上限与等级相同。受伤时减半伤害并掉出一只小萃香。可主动抖出所有小萃香。 | UnitAction附着、抖出Skill层数与伤害分摊 |
| Lv3 | 萃香可不消耗行动点,仅消耗生命生成小萃香。若当前层数为 3自动变为“大萃香”能将 1 格内一个单位投掷到 3 格内任意陆地位置。 | 新形态大萃香UnitAction投掷 |
| Lv4 | 若当前层数为 4自动变为“巨大萃香”可对 3 格内任意位置从天而降;若不能击杀,则被动移动到附近 1 格随机位置。 | 新形态巨大萃香UnitAction从天而降 |
### 6.2 Skill 与 UnitAction
| 等级 | 直接 Skill | UnitAction | 衍生 Skill |
| --- | --- | --- | --- |
| Lv1 | `SuikaMiniSpawnAfterMove` | 无或自动触发 | `SuikaMiniCanActImmediately` |
| Lv2 | `SuikaMiniStack` | `SuikaMiniAttach``SuikaShakeOffMinis` | `SuikaDamageHalveDropMini` |
| Lv3 | `SuikaBigForm` | `SuikaCreateMiniByHp``SuikaThrowUnit` | `SuikaStackAutoTransformBig` |
| Lv4 | `SuikaGiantForm` | `SuikaFallingImpact` | `SuikaFailKillRandomMove` |
### 6.3 衍生对象
- `SuikaMini`:小萃香,可立刻行动,可附着,可被抖出。
- `SuikaBig`:大萃香,层数 3 自动形态。
- `SuikaGiant`:巨大萃香,层数 4 自动形态。
- `SuikaStack`:层数状态,必须进存档和回放。
### 6.4 与其他英雄配合
| 配合英雄 | 配合规则 |
| --- | --- |
| 灵梦 | 小萃香被打也会附着退治 Debuff |
| 堇子 | 小萃香可利用灵异线进行英雄加成或位移 |
| 华扇 | 萃香吃到兽引英雄加成翻倍 |
| 阿吽 | 萃香可将阿吽丢出去 |
## 7. 通用英雄验收
- 5 英雄可在选人界面展示。
- 每个英雄 Lv1-Lv4 属性、Skill、Action、升级任务都有配置。
- 所有衍生单位、状态和形态进入存档、联机、回放。
- 当前版本英雄 AI 暂不做专项设计,但 AI 不能因新 Skill / UnitAction / 衍生单位报错。
- 正式图标缺失时,按模板复制占位图标并保留 warning。
## 8. 统一警告
```text
[WARN][hero-id-missing] HeroDataAssets: NorwaySumireko/NorwayKasen/NorwayAunn/NorwaySuika - GiantType 待确认
[WARN][random-ofuda-unclear] ReimuRandomOfuda: 随机 Buff/Debuff 池未提供 - 需策划补充
[WARN][orb-limit-conflict] SumirekoOccultOrb: 图片出现“无上限”且正式文档写“上限与等级相同” - 需策划确认
[WARN][orb-name-conflict] SumirekoOccultOrb: 挪威/诺曼底灵异珠 Lv3/Lv4 命名存在混用 - 需策划确认
[WARN][aunn-lv2-lv3-conflict] AunnPortal: 截图与正式文档对传送解锁等级不同 - 以本图初稿写 Lv2需策划确认
[WARN][copy-missing] HeroDataAssets/LibraryGiantData: 5 英雄图鉴描述需从 Design/final/narrative 对应位置提取或补文案
```

View File

@ -0,0 +1,142 @@
# 博丽帝国科技策划需求
> 文档类型:策划给程序的新科技开发需求
> 适用范围:博丽帝国初始科技、抢劫/符文/英灵殿、海洋线、狂暴线、圆盾兵线、发展机制
> 来源:用户提供的阵营机制截图
> 状态:初稿
## 1. 科技总览
| 科技 | 建议 `TechType` | 科技线 | 核心 TechAtom | 说明 |
| --- | --- | --- | --- | --- |
| 博丽初始机制 | `HakureiStart` | 初始科技 | 自动抢劫、符文、英灵殿、港口邻接金币 | 阵营开局自带 |
| 大使馆丹麦金 | `HakureiDanegeld` | 大使馆科技 | 主动抢劫、丹麦金勒索 | 若主动抢劫属初始科技,需策划确认 |
| 博丽海洋线 | `HakureiOceanRaid` | 海洋线 | 卡维船、长船、龙船、上岸突击 | 替代/强化海军体系 |
| 博丽狂暴线 | `HakureiBerserkLine` | 山线 + 巨人 | 狂暴步兵、狂战士、女武神、狂暴通用规则 | 需接入单位替代 |
| 博丽圆盾线 | `HakureiShieldWall` | 田线 | 圆盾兵、相邻防御 1.5x | 替代盾兵 |
## 2. 博丽初始机制
| 字段 | 内容 |
| --- | --- |
| 科技名 | 博丽初始机制 |
| 建议 `TechType` | `HakureiStart` |
| 所属阵营 | 博丽帝国 |
| 科技层级 | 初始科技 |
| 是否选人界面特色科技 | 是 |
### TechAtom
| `TechAtom` | 名称 | 规则 | 关联文档 |
| --- | --- | --- | --- |
| `HakureiHarborCityGold` | 港市贡金 | 城市中心相邻港口 +1 金币 | `01-faction-base.md` |
| `HakureiHarborMarketLevel` | 港口市场 | 港口为相邻市场 +1 等级 | `01-faction-base.md` |
| `HakureiAutoRaid` | 自动抢劫 | 我方单位在敌方建筑上且有攻击点,回合结束抢 1 金币,上限不超过城市产出 | `05-skills.md` |
| `HakureiRuneOnDeath` | 符文遗留 | 我方单位死亡后原地留下符文地块 | `05-skills.md``04-units.md` |
| `HakureiEinherjarPoint` | 英灵殿 | 我方单位死亡后英灵点 +1 | `05-skills.md` |
## 3. 大使馆丹麦金
| 字段 | 内容 |
| --- | --- |
| 科技名 | 大使馆丹麦金 |
| 建议 `TechType` | `HakureiDanegeld` |
| 科技线 | 大使馆科技 |
| 前置科技 | 待程序按现有外交/大使馆科技确认 |
### TechAtom
| `TechAtom` | 名称 | 规则 | 关联文档 |
| --- | --- | --- | --- |
| `HakureiActiveRaid` | 主动抢劫 | 消耗通用行动点,立刻进行抢劫且收益翻倍 | `06-unit-actions.md` |
| `HakureiDanegeldDemand` | 丹麦金 | 向某个帝国发起勒索;若不支付,下回合所有单位抢劫收益翻倍 | `06-unit-actions.md` |
## 4. 博丽海洋线
| 字段 | 内容 |
| --- | --- |
| 科技名 | 博丽海洋线 |
| 建议 `TechType` | `HakureiOceanRaid` |
| 科技线 | 海洋线 |
| 特色兵种/建筑 | 卡维船、长船、龙船 |
### TechAtom
| `TechAtom` | 名称 | 规则 | 关联文档 |
| --- | --- | --- | --- |
| `HakureiShipLandingDash` | 上岸突击 | 所有船只上岸时,若拥有 Dash 能力则可立刻攻击 | `05-skills.md` |
| `HakureiKarviShip` | 卡维船 | 所有单位无须港口,直接进入浅海变成卡维船;无法升级 | `04-units.md` |
| `HakureiLongship` | 长船 | 替代小船下潜中的单位变为长船2 防 | `04-units.md` |
| `HakureiDragonship` | 龙船 | 替代突击艇0 攻 + 逃脱,可推动敌方/我方单位 1 格;无法推动则攻击力变为 2 并造成伤害,不被反击 | `04-units.md``06-unit-actions.md` |
## 5. 博丽狂暴线
| 字段 | 内容 |
| --- | --- |
| 科技名 | 博丽狂暴线 |
| 建议 `TechType` | `HakureiBerserkLine` |
| 科技线 | 山线 + 巨人 |
| 特色单位 | 狂暴步兵、狂战士、女武神 |
### TechAtom
| `TechAtom` | 名称 | 规则 | 关联文档 |
| --- | --- | --- | --- |
| `HakureiBerserkSkill` | 狂暴 | 狂暴技能:立刻获得 1 点攻击行动点,攻击无视损伤 | `05-skills.md` |
| `HakureiBerserkWarrior` | 狂暴步兵 | 替代步兵,可花费 5 金币狂暴 | `04-units.md``06-unit-actions.md` |
| `HakureiBerserker` | 狂战士 | 替代剑士,可花费 8 金币狂暴 | `04-units.md``06-unit-actions.md` |
| `HakureiValkyrie` | 女武神 | 替代巨人0 攻、2 移、飞行、40HP移动恢复周围 2HP可为友方承担下一回合伤害附近友方死亡时恢复 5HP | `04-units.md``05-skills.md``06-unit-actions.md` |
## 6. 博丽圆盾线
| 字段 | 内容 |
| --- | --- |
| 科技名 | 博丽圆盾线 |
| 建议 `TechType` | `HakureiShieldWall` |
| 科技线 | 田线 |
| 特色单位 | 圆盾兵 |
### TechAtom
| `TechAtom` | 名称 | 规则 | 关联文档 |
| --- | --- | --- | --- |
| `HakureiRoundShieldman` | 圆盾兵 | 替代盾兵15HP | `04-units.md` |
| `HakureiShieldWallAura` | 圆盾墙 | 与圆盾兵相邻时获得防御 1.5x,不叠加 | `05-skills.md` |
## 7. AI
当前版本 AI 不做专项策略。
程序只需保证:
- AI 研究科技时不报错。
- 如果 AI 不理解主动抢劫、丹麦金、龙船推动、狂暴和女武神施法,先不生成对应行动。
- AI 深拷贝评分图不会播放真实 VFX/UI。
## 8. 美术替代资源方案
- `TechInfo.icon` 缺失时,从 `Unity/Assets/BundleResources/TH1UI/Icon/TechIcon/` 复制同类科技图标,命名为 `Tech_<TechType>.png`
- `TechAtomInfo.IconContainer` 缺失时,优先复制关联 UnitAction 或 Skill 的图标,命名为 `TechAtom_<TechAtom>.png`
- 不直接复用旧图标引用,不复制源 `.meta`
## 9. 验收测试
- 初始科技开局自动拥有。
- 科技树显示所有新科技和 TechAtom。
- 自动抢劫、符文、英灵点在未研究额外科技时生效。
- 主动抢劫、丹麦金需要对应科技后出现。
- 卡维船、长船、龙船替代关系正确。
- 狂暴步兵、狂战士、女武神、圆盾兵替代关系正确。
- 存档读回后 TechAtom 缓存正确。
- 联机和回放一致。
## 10. 警告清单
```text
[WARN][tech-id-missing] TechDataAssets: HakureiStart/HakureiDanegeld/HakureiOceanRaid/HakureiBerserkLine/HakureiShieldWall - 需新增或确认 TechType
[WARN][tech-atom-id-missing] TechDataAssets: Hakurei* TechAtom - 需新增或确认 TechAtom
[WARN][tech-icon-placeholder] TechDataAssets: Hakurei* icon - 正式科技图标未确认,需复制占位
[WARN][copy-missing] TechDataAssets: Hakurei* Description - 缺正式科技描述
[WARN][dragonship-damage-conflict] HakureiDragonship: 草稿曾出现无法推动时攻击力 3本批截图为 2 - 以截图 2 为准,需策划确认
```

View File

@ -0,0 +1,248 @@
# 博丽帝国新单位策划需求
> 文档类型:策划给程序的新单位开发需求
> 适用范围:博丽帝国特色替代单位、海军单位、英雄衍生单位、地块标记/形态单位
> 来源:用户提供的阵营与英雄截图
> 状态:初稿
## 1. 单位总览
| 单位 | 建议 `UnitType` / `GiantType` | 类型 | 来源 |
| --- | --- | --- | --- |
| 卡维船 | `HakureiKarvi` | 特色船只 / 替代水上形态 | 海洋线 |
| 长船 | `HakureiLongship` | 特色船只 / 替代小船 | 海洋线 |
| 龙船 | `HakureiDragonship` | 特色船只 / 替代突击艇 | 海洋线 |
| 狂暴步兵 | `HakureiBerserkWarrior` | 替代步兵 | 狂暴线 |
| 狂战士 | `HakureiBerserker` | 替代剑士 | 狂暴线 |
| 女武神 | `HakureiValkyrie` | 替代巨人 | 狂暴线 |
| 圆盾兵 | `HakureiRoundShieldman` | 替代盾兵 | 田线 |
| 丹麦灵异珠 | `SumirekoDenmarkOrb` | 英雄衍生单位/地块对象 | 堇子 Lv1 |
| 英格兰灵异珠 | `SumirekoEnglandOrb` | 英雄衍生单位/地块对象 | 堇子 Lv2 |
| 挪威灵异珠 | `SumirekoNorwayOrb` | 英雄衍生单位/地块对象 | 堇子 Lv3 |
| 诺曼底灵异珠 | `SumirekoNormandyOrb` | 英雄衍生单位/地块对象 | 堇子 Lv4 |
| 兽引 | `KasenBeastGuideMarker` | 地块标记 | 华扇 Lv1 |
| 第二个阿吽 | `AunnTwin` / `NorwayAunn` 副体 | 英雄衍生单位 | 阿吽 Lv2 |
| 小萃香 | `SuikaMini` | 英雄衍生单位 | 萃香 Lv1 |
| 大萃香 | `NorwaySuikaBig` | 英雄形态 | 萃香 Lv3 |
| 巨大萃香 | `NorwaySuikaGiant` | 英雄形态 | 萃香 Lv4 |
## 2. 卡维船
| 字段 | 内容 |
| --- | --- |
| 单位名 | 卡维船 |
| 建议 `UnitType` | `HakureiKarvi` |
| 来源科技 | `HakureiKarviShip` |
| 定位 | 低成本浅海通行形态 |
规则:
- 所有单位无须港口,直接进入浅海时变成卡维船。
- 卡维船无法升级。
- 仅适用于浅海;深海、远洋限制按现有海洋规则处理。
- 如果原单位拥有 `DASH`,上岸时立刻获得攻击机会。
验收:
- 无港口可进入浅海。
- 上岸后恢复原单位或指定陆地形态,需程序确认现有船化逻辑。
- 存档读回后原单位身份和卡维船形态一致。
## 3. 长船
| 字段 | 内容 |
| --- | --- |
| 单位名 | 长船 |
| 建议 `UnitType` | `HakureiLongship` |
| 来源科技 | `HakureiLongship` |
| 替代关系 | 替代小船 |
规则:
- 下潜中的单位变为长船。
- 长船防御为 2。
- 如果原单位拥有 `DASH`,上岸时立刻获得攻击机会。
## 4. 龙船
| 字段 | 内容 |
| --- | --- |
| 单位名 | 龙船 |
| 建议 `UnitType` | `HakureiDragonship` |
| 来源科技 | `HakureiDragonship` |
| 替代关系 | 替代突击艇 |
属性与规则:
- 攻击 0。
- 移动 2。
- 拥有逃脱或等价位移能力。
- 可推动敌方或我方单位 1 格。
- 若目标无法被推动,则攻击力临时视为 2 并造成伤害。
- 无法推动造成伤害时不被反击。
关联:
- Skill`HakureiDragonshipPushSkill`
- UnitAction`HakureiDragonshipPush`
## 5. 狂暴步兵
| 字段 | 内容 |
| --- | --- |
| 单位名 | 狂暴步兵 |
| 建议 `UnitType` | `HakureiBerserkWarrior` |
| 替代关系 | 替代 `Warrior` |
| 狂暴消耗 | 5 金币 |
规则:
- 可花费 5 金币狂暴。
- 狂暴后立刻获得 1 点攻击行动点。
- 狂暴攻击无视损伤。
## 6. 狂战士
| 字段 | 内容 |
| --- | --- |
| 单位名 | 狂战士 |
| 建议 `UnitType` | `HakureiBerserker` |
| 替代关系 | 替代 `Swordsman` |
| 狂暴消耗 | 8 金币 |
规则同狂暴步兵,但消耗 8 金币。
## 7. 女武神
| 字段 | 内容 |
| --- | --- |
| 单位名 | 女武神 |
| 建议 `UnitType` | `HakureiValkyrie` |
| 替代关系 | 替代巨人 |
| 生命 | 40 |
| 攻击 | 0 |
| 移动 | 2 |
| 额外属性 | 飞行 |
规则:
- 移动时,为周围单位恢复 2HP。
- 向友方施法,使其下 1 回合受到的所有伤害转移到女武神身上。
- 附近己方单位死亡时,女武神恢复 5HP。
关联:
- Skill`HakureiValkyrieMoveHeal``HakureiValkyrieDeathHeal``HakureiValkyrieDamageProxy`.
- UnitAction`HakureiValkyrieProtect`.
## 8. 圆盾兵
| 字段 | 内容 |
| --- | --- |
| 单位名 | 圆盾兵 |
| 建议 `UnitType` | `HakureiRoundShieldman` |
| 替代关系 | 替代 `Defender` |
| 生命 | 15 |
规则:
- 与圆盾兵相邻的友军获得防御 1.5x。
- 多个圆盾兵相邻不叠加。
- 对圆盾兵自身是否生效:默认不生效,需策划确认。
## 9. 灵异珠
| 单位 | 来源等级 | 目标地形 | 效果 |
| --- | --- | --- | --- |
| 丹麦灵异珠 | 堇子 Lv1 | 森林 | 周围 1 格内单位移动力与攻击力最终数值互换 |
| 英格兰灵异珠 | 堇子 Lv2 | 水域 | 周围 1 格内单位攻击力与防御力最终数值互换 |
| 挪威灵异珠 | 堇子 Lv3 | 山脉 | 截图未明确单独效果;需确认是否承伤或三角 buff 来源 |
| 诺曼底灵异珠 | 堇子 Lv4 | 平原 | 替周围单位承伤 3 次 |
通用规则:
- 移动后发射。
- 不可移动。
- 隐身。
- 敌方踩中后是否消失并受伤:正式文档有,截图本批未写全,需确认是否保留。
- 数量上限:正式文档写“上限与等级相同”,截图 Lv1 行出现“无上限”,需确认。
## 10. 兽引
| 字段 | 内容 |
| --- | --- |
| 名称 | 兽引 |
| 建议对象 | `KasenBeastGuideMarker` |
| 来源 | 华扇 Lv1 |
| 目标距离 | 华扇 4 格内 |
规则:
- 放置在指定地块,作为传送锚点。
- 英雄可在兽引位置与华扇身边相互传送。
- 回收兽引获得 1 点移动行动点。
- Lv2/Lv3 提供防御、回血、攻击、狂暴等光环。
## 11. 第二个阿吽
规则:
- 阿吽 Lv2 升级或出战后,立刻在身边生成第二个阿吽。
- 如果操作其中一个,另一个自动变成石化状态。
- 两者共享生命。
- 两者距离不能超过 8 格。
- Lv4 两个阿吽都可以操作。
数据要求:
- 进存档。
- 进回放。
- 联机中生成、操作、石化状态同步。
- UI 需要清晰区分主阿吽和副阿吽。
## 12. 小萃香 / 大萃香 / 巨大萃香
### 小萃香
- 萃香 Lv1 移动后在原地留下小萃香。
- 小萃香可立刻行动。
- Lv2 可附着到萃香身上,变为萃香层数。
- 受伤掉出小萃香时,小萃香生成位置需选择可站立邻格。
### 大萃香
- 萃香层数为 3 时自动变为大萃香。
- 可将 1 格内一个单位投掷到 3 格内任意陆地位置。
### 巨大萃香
- 萃香层数为 4 时自动变为巨大萃香。
- 可对 3 格内任意位置从天而降。
- 若不能击杀目标,则被动移动到附近 1 格随机位置。
- 随机位置必须使用同步随机。
## 13. 资源与表现
- 所有新单位缺正式 Sprite 时,必须保留 warning。
- Skill/Action/Tech 图标缺失时,按对应模板复制独立占位资源。
- 小萃香、大萃香、巨大萃香需要清晰可识别的棋子 Sprite没有资源时不能静默复用萃香本体。
## 14. AI
当前版本 AI 不做专项策略。
程序只需保证:
- AI 不因替代单位、衍生单位、形态单位报错。
- AI 若不理解龙船推动、阿吽传送、萃香投掷,先不给 AI 生成对应 UnitAction。
## 15. 警告清单
```text
[WARN][unit-id-missing] UnitTypeDataAssets: Hakurei* 新单位 UnitType 待确认
[WARN][unit-sprite-missing] UnitTypeDataAssets: Hakurei* Sprite - 缺正式棋子资源
[WARN][orb-limit-conflict] SumirekoOccultOrb: 数量上限冲突 - 需策划确认
[WARN][round-shield-self-unclear] HakureiRoundShieldman: 圆盾兵相邻防御是否对自身生效未确认
[WARN][suika-random-sync] SuikaGiant: 击杀失败随机移动必须使用同步随机 - 程序实现时重点检查
```

View File

@ -0,0 +1,289 @@
# 博丽帝国 Skill 策划需求合集
> 文档类型:策划给程序的新 Skill 开发需求合集
> 适用范围:博丽帝国阵营 Skill、英雄 Skill、衍生状态 Skill
> 来源:用户提供的阵营与英雄截图
> 状态:初稿
## 1. Skill 总览
| SkillType 建议名 | 显示名 | 来源 | 类型 |
| --- | --- | --- | --- |
| `HakureiAutoRaid` | 抢劫 | 阵营初始科技 | 回合结束触发 |
| `HakureiRuneOnDeath` | 符文 | 阵营初始科技 | 死亡触发 |
| `HakureiRuneTileRevive` | 符文地块 | 符文对象 | 死亡恢复 |
| `HakureiEinherjarPoint` | 英灵殿 | 阵营初始科技 | 死亡资源 |
| `HakureiShipLandingDash` | 上岸突击 | 海洋线 | 移动/上下船触发 |
| `HakureiBerserk` | 狂暴 | 狂暴线 | 主动/状态 |
| `HakureiShieldWallAura` | 圆盾墙 | 圆盾兵 | 光环 |
| `HakureiValkyrieMoveHeal` | 女武神行军治疗 | 女武神 | 移动触发 |
| `HakureiValkyrieDamageProxy` | 女武神庇护 | 女武神 | 承伤状态 |
| `HakureiValkyrieDeathHeal` | 女武神英灵恢复 | 女武神 | 死亡触发 |
| `ReimuHakureiProtectionCaster` | 御札施放 | 灵梦 | 主动授予 |
| `HakureiProtection` | 博丽加护 | 灵梦衍生 | 防护层数 |
| `ReimuExtermination` | 退治 | 灵梦衍生 | 永久 Debuff |
| `ReimuExterminationPulse` | 退治感应 | 灵梦 Lv2 | 移动/施法触发 |
| `ReimuRandomOfuda` | 博丽御札 | 灵梦 Lv3 | 随机 Buff/Debuff |
| `SumirekoOccultOrbOwner` | 灵异珠 | 堇子 | 主动生成 |
| `SumirekoOccultLine` | 灵异连线 | 堇子 Lv2 | 地图关系 |
| `SumirekoOccultTriangle` | 灵异三角 | 堇子 Lv3 | 区域 Buff |
| `KasenBeastGuideOwner` | 兽引 | 华扇 | 主动生成 |
| `KasenBeastGuideAura` | 兽引光环 | 华扇 Lv2/Lv3 | 光环 |
| `KasenOniForm` | 鬼形态 | 华扇 Lv4 | 形态转换 |
| `AunnPetrifiedState` | 石化 | 阿吽 | 状态 |
| `AunnTwinBody` | 双子 | 阿吽 Lv2 | 衍生单位管理 |
| `AunnSharedHealth` | 共享生命 | 阿吽 Lv2 | 生命同步 |
| `AunnPetrifiedHeroDamageProxy` | 石化承伤 | 阿吽 Lv3 | 承伤 |
| `SuikaMiniSpawnAfterMove` | 小萃香生成 | 萃香 Lv1 | 移动触发 |
| `SuikaMiniStack` | 萃香层数 | 萃香 Lv2 | 层数 |
| `SuikaDamageHalveDropMini` | 掉出小萃香 | 萃香 Lv2 | 受伤触发 |
| `SuikaBigForm` | 大萃香 | 萃香 Lv3 | 形态 |
| `SuikaGiantForm` | 巨大萃香 | 萃香 Lv4 | 形态 |
## 2. 阵营 Skill
### 2.1 `HakureiAutoRaid` 抢劫
| 字段 | 内容 |
| --- | --- |
| 是否玩家可见 | 是 |
| 是否显示在单位头顶 | 否,建议在阵营/科技说明中展示 |
| 触发时机 | `OnTurnEnd` 或玩家回合结束结算 |
| 来源 | `TechAtom.HakureiAutoRaid` |
规则:
- 我方单位位于敌方任意建筑上。
- 单位拥有攻击点。
- 回合结束自动抢 1 金币。
- 抢劫上限不超过该城市的产出。
- 具体“城市产出”口径需程序确认:金币产出、总产出或建筑归属城市产出。
权威数据:
- 修改抢劫方金币。
- 修改被抢方金币或城市可抢劫额度,需策划确认。
- 必须联机同步。
### 2.2 `HakureiRuneOnDeath` 符文
规则:
- 我方单位死亡后,在死亡地块留下“符文”地块/标记。
- 符文是否可叠加、是否可被清除、是否有持续回合:待确认。
- 符文进入存档与回放。
### 2.3 `HakureiRuneTileRevive` 符文地块
规则:
- 符文地块上的我方单位死亡时,立刻恢复 6 点生命。
- “死亡时恢复”实际含义需实现为阻止死亡并恢复 6HP还是死亡后复活到 6HP需策划确认。
### 2.4 `HakureiEinherjarPoint` 英灵殿
规则:
- 我方单位死亡后,英灵点 +1。
- 英灵点属于玩家资源,需要进入存档、联机、回放。
- 军营可通过 UnitAction 将英灵点转化为发展度,比例 5:1。
### 2.5 `HakureiShipLandingDash` 上岸突击
规则:
- 所有船只上岸时,若原单位或当前船拥有 Dash 能力,则立刻获得攻击机会。
- 需明确上岸过程在现有移动/变船生命周期中的触发点。
### 2.6 `HakureiBerserk` 狂暴
规则:
- 触发后立刻获得 1 点攻击行动点。
- 攻击无视损伤。
- 狂暴是否持续整回合、一次攻击、永久状态:待确认。当前按“一次状态,直到消耗攻击点或回合结束”处理。
### 2.7 `HakureiShieldWallAura` 圆盾墙
规则:
- 与圆盾兵相邻的友军防御 1.5x。
- 不叠加。
- 多个圆盾兵同时相邻仍只取一次 1.5x。
## 3. 灵梦 Skill
### 3.1 `HakureiProtection`
- 层数4 层。
- 每层抵挡 1 点伤害。
- 伤害抵挡发生在最终伤害结算前。
- 层数归零后移除。
- 是否随英雄升级保留:是。
### 3.2 `ReimuExtermination`
- 永久 Debuff。
- 被灵梦攻击时,每层额外 +2 伤害;灵梦 Lv4 后每层 +5。
- 层数上限等于灵梦等级。
- 可通过缴金清除,金额 `3 * 灵梦等级 * 层数`
- 是否可被普通驱散清除:否,只有缴金可清除。
### 3.3 `ReimuExterminationPulse`
- 灵梦移动或向友方施法时触发。
- 对射程内拥有退治 Debuff 的敌方英雄造成伤害,每层 2 点。
- Lv4 是否也提升为每层 5 点:默认是,需策划确认。
### 3.4 `ReimuRandomOfuda`
- 灵梦 Lv3 获得。
- 向友方施法或攻击敌方时,额外施加随机 Buff/Debuff。
- 随机池未提供,暂不可实现完整效果。
- 联机随机必须使用同步随机。
## 4. 堇子 Skill
### 4.1 `SumirekoOccultOrbOwner`
- 控制灵异珠生成、上限、地形限制。
- 移动后可发射。
- 不同等级解锁不同灵异珠。
### 4.2 灵异珠效果
| Skill | 效果 |
| --- | --- |
| `SumirekoDenmarkOrbSwapMoveAttack` | 附近 1 格内单位移动力与攻击力最终数值互换 |
| `SumirekoEnglandOrbSwapAttackDefense` | 附近 1 格内单位攻击力与防御力最终数值互换 |
| `SumirekoNormandyOrbDamageProxy` | 替周围单位承伤 3 次 |
| `SumirekoEnglandOrbMaxValueUpgrade` | Lv4 后参与互换的数值与原本值取最大值 |
### 4.3 `SumirekoOccultLine`
- 两个灵异珠连成横竖线或 45 度斜线时激活。
- 堇子位于线上时获得额外 Buff。
- 普通单位可通过灵异连线传送。
### 4.4 `SumirekoOccultTriangle`
- 灵异连线围成三角形时激活。
- 堇子位于三角形内获得 Buff方向包括移速、攻击、射程。
- Lv4 三角形 Buff 可叠加。
## 5. 华扇 Skill
### 5.1 `KasenBeastGuideOwner`
- 管理兽引放置、回收和传送。
- 放置距离4 格内。
- 回收后获得 1 点移动行动点。
### 5.2 `KasenBeastGuideAura`
- Lv2周围防御 +1回合开始回复 2HP。
- Lv3周围防御 +1 攻,回合开始回复 2HP。
- 英雄受效果时加成翻倍。
- 多个兽引叠加规则:图片暗示“兽引叠叠乐”,但当前版本只有一个兽引,需确认是否允许多兽引。
### 5.3 `KasenOniForm`
- Lv4 进入鬼形态。
- 变为车阶模板。
- 常驻狂暴。
- 形态切换是否可逆:待确认。默认不可逆。
## 6. 阿吽 Skill
### 6.1 `AunnPetrifiedState`
- 攻击后可选择逃脱或原地石化。
- 石化:自身 +2 防御,周围友军 +1 防御。
- 石化期间是否不能移动/攻击:默认不能主动行动,需确认。
### 6.2 `AunnTwinBody` / `AunnSharedHealth`
- Lv2 生成第二个阿吽。
- 两者共享生命。
- 操作其中一个后,另一个自动石化。
- 两者距离不能超过 8 格。
- Lv4 两个阿吽都可操作。
### 6.3 `AunnPetrifiedHeroDamageProxy`
- 石化阿吽替周围英雄承伤。
- 承伤优先级、范围和是否可致死待确认。
## 7. 萃香 Skill
### 7.1 `SuikaMiniSpawnAfterMove`
- 萃香移动后,原地留下一个小萃香。
- 小萃香可立刻行动。
### 7.2 `SuikaMiniStack`
- 小萃香附着到萃香身上后,获得 1 层萃香层数。
- 层数上限等于萃香等级。
### 7.3 `SuikaDamageHalveDropMini`
- 萃香受到伤害时,减半伤害并掉出一只小萃香。
- 如果无可用邻格,掉出失败时的处理待确认。
### 7.4 `SuikaBigForm`
- 层数为 3 时自动变为大萃香。
- 解锁投掷单位。
### 7.5 `SuikaGiantForm`
- 层数为 4 时自动变为巨大萃香。
- 解锁从天而降。
- 击杀失败时随机移动到附近 1 格,必须同步随机。
## 8. 生命周期继承规则
除非具体 Skill 写明,否则默认:
| 字段 | 默认决策 |
| --- | --- |
| `ReserveOnCarry` | 英雄 Skill 保留;临时地块/光环不保留 |
| `ReserveLeaveCarry` | 英雄 Skill 保留 |
| `ReserveGiantUpgrade` | 英雄核心 Skill、层数、Debuff 保留 |
| `ReserveCommonTransform` | 形态 Skill 根据形态转换规则重算 |
高风险 Skill
- `SuikaMiniStack` 必须升级和变形保留。
- `ReimuExtermination` 必须永久保留,除非缴金清除。
- `AunnSharedHealth` 必须在存档、变船、回放中保持双体同步。
- `KasenOniForm` 变形后是否保留旧兽引状态需确认。
## 9. 表现与资源占位
- 所有玩家可见 Skill 必须有图标。
- 正式图标缺失时,从同类 Skill 图标复制独立占位,命名 `Skill_<SkillType>.png`
- 不复制源 `.meta`,不直接复用旧图标引用。
- VFX/SFX 未给出时保留 warning不阻塞逻辑初版。
## 10. AI / 联机 / 存档
- 当前版本 AI 不做专项设计。
- AI 不应生成无法理解的主动行动。
- 所有随机效果使用同步随机。
- 所有层数、符文、英灵点、灵异珠、兽引、阿吽双体、小萃香必须进入存档和回放。
## 11. 警告清单
```text
[WARN][skill-id-missing] SkillDataAssets: Hakurei/Reimu/Sumireko/Kasen/Aunn/Suika 新 SkillType 待确认
[WARN][skill-icon-placeholder] SkillDataAssets: 新 Skill 图标缺失 - 需复制占位
[WARN][random-ofuda-unclear] ReimuRandomOfuda: 随机 Buff/Debuff 池未提供
[WARN][rune-revive-unclear] HakureiRuneTileRevive: 死亡恢复是阻止死亡还是复活未确认
[WARN][berserk-duration-unclear] HakureiBerserk: 狂暴持续时间未确认
[WARN][beast-guide-stack-unclear] KasenBeastGuideAura: 兽引是否可多个叠加未确认
[WARN][aunn-proxy-unclear] AunnPetrifiedHeroDamageProxy: 承伤范围和致死规则未确认
[WARN][suika-drop-no-space-unclear] SuikaDamageHalveDropMini: 无可用邻格时小萃香掉出规则未确认
```

View File

@ -0,0 +1,273 @@
# 博丽帝国 UnitAction 策划需求合集
> 文档类型:策划给程序的单位行动开发需求合集
> 适用范围:博丽帝国阵营主动行动、科技解锁行动、英雄主动行动
> 来源:用户提供的阵营与英雄截图
> 状态:初稿
## 1. UnitAction 总览
| UnitAction 建议名 | 显示名 | 来源 | 是否 AI 可用 |
| --- | --- | --- | --- |
| `HakureiActiveRaid` | 主动抢劫 | 大使馆丹麦金科技 | 当前版本否 |
| `HakureiDanegeldDemand` | 丹麦金 | 大使馆丹麦金科技 | 当前版本否 |
| `HakureiConvertEinherjarToDevelopment` | 英灵转发展 | 阵营基础 / 军营 | 当前版本否 |
| `HakureiBerserkAction` | 狂暴 | 狂暴步兵/狂战士/华扇鬼形态 | 当前版本否 |
| `HakureiDragonshipPush` | 龙船推动 | 龙船 | 当前版本否 |
| `HakureiValkyrieProtect` | 女武神庇护 | 女武神 | 当前版本否 |
| `ReimuCastHakureiProtection` | 施加御札 | 灵梦 Lv1 | 当前版本否 |
| `ReimuPayClearExtermination` | 缴金退治 | 灵梦 Lv1 | 当前版本否 |
| `SumirekoShootOccultOrb` | 发射灵异珠 | 堇子 Lv1-Lv4 | 当前版本否 |
| `SumirekoOccultLineTeleport` | 灵异线传送 | 堇子 Lv2 | 当前版本否 |
| `KasenSetBeastGuide` | 设定兽引 | 华扇 Lv1 | 当前版本否 |
| `KasenRecallBeastGuide` | 回收兽引 | 华扇 Lv1 | 当前版本否 |
| `KasenToggleOniForm` | 鬼形态 | 华扇 Lv4 | 当前版本否 |
| `AunnChooseEscapeOrPetrify` | 逃脱/石化 | 阿吽 Lv1 | 当前版本否 |
| `AunnPortalTeleport` | 阿吽传送 | 阿吽 Lv2 | 当前版本否 |
| `SuikaMiniAttach` | 小萃香附着 | 萃香 Lv2 | 当前版本否 |
| `SuikaShakeOffMinis` | 抖出小萃香 | 萃香 Lv2 | 当前版本否 |
| `SuikaCreateMiniByHp` | 生命生成小萃香 | 萃香 Lv3 | 当前版本否 |
| `SuikaThrowUnit` | 投掷 | 萃香 Lv3 | 当前版本否 |
| `SuikaFallingImpact` | 从天而降 | 萃香 Lv4 | 当前版本否 |
当前版本所有新 UnitAction 的 AI 均暂不做专项设计;程序只需避免 AI 生成入口报错。
## 2. 阵营行动
### 2.1 `HakureiActiveRaid` 主动抢劫
| 字段 | 内容 |
| --- | --- |
| 行动类型 | `UnitAction` |
| 解锁来源 | `TechAtom.HakureiActiveRaid` |
| 消耗 | 通用行动点 |
| 目标 | 单位当前所在敌方建筑 |
规则:
- 执行单位必须位于敌方任意建筑上。
- 执行单位需要有通用行动点。
- 立刻进行抢劫。
- 收益为自动抢劫的 2 倍。
- 收益仍受城市产出上限约束,还是主动抢劫可突破上限:需策划确认。默认不突破。
权威数据变化:
- 扣除单位通用行动点。
- 增加我方金币。
- 记录本回合该城市/建筑被抢额度。
### 2.2 `HakureiDanegeldDemand` 丹麦金
| 字段 | 内容 |
| --- | --- |
| 行动类型 | `PlayerAction``UnitAction`,待程序确认 |
| 解锁来源 | `TechAtom.HakureiDanegeldDemand` |
| 目标 | 目标帝国 |
| 消耗 | 待确认 |
规则:
- 向某个帝国发起勒索。
- 若目标不支付,下回合所有我方单位对该帝国的抢劫收益翻倍。
- “支付”的交互方式未提供:当前先按单人游戏自动拒付处理,联机/外交版本需后续补文档。
阻塞:
- 需要策划确认是否做目标玩家 UI 选择和支付/拒付交互。
### 2.3 `HakureiConvertEinherjarToDevelopment` 英灵转发展
| 字段 | 内容 |
| --- | --- |
| 行动类型 | 城市/建筑/单位行动,待程序确认 |
| 执行位置 | 军营 |
| 消耗 | 5 英灵点 |
| 结果 | +1 发展度 |
规则:
- 只能在我方军营中执行。
- 消耗英灵点,比例 5:1 转化为发展度。
- 一次行动可转化 1 点,还是可批量转化,待确认。默认一次 1 点。
## 3. 特色单位行动
### 3.1 `HakureiBerserkAction` 狂暴
- 狂暴步兵消耗 5 金币。
- 狂战士消耗 8 金币。
- 华扇鬼形态是否消耗金币:否,常驻狂暴。
- 执行后获得 1 点攻击行动点,攻击无视损伤。
### 3.2 `HakureiDragonshipPush` 龙船推动
- 执行者:龙船。
- 目标:相邻敌方或友方单位。
- 推动目标 1 格。
- 若目标无法推动,则龙船临时攻击力视为 2 并造成伤害,不被反击。
- 推动方向由龙船到目标的方向决定,还是玩家选方向:默认由相对方向决定,需确认。
### 3.3 `HakureiValkyrieProtect` 女武神庇护
- 执行者:女武神。
- 目标:友方单位。
- 结果:目标下 1 回合受到的所有伤害转移到女武神身上。
- 如果女武神死亡,剩余伤害如何处理待确认。
## 4. 灵梦行动
### 4.1 `ReimuCastHakureiProtection`
- 执行者:灵梦。
- 目标:友方单位。
- 结果:目标获得 4 层博丽加护。
- Lv3 起额外触发随机御札。
### 4.2 `ReimuPayClearExtermination`
- 执行者:拥有退治 Debuff 的单位或所属玩家。
- 目标:自身 Debuff。
- 消耗:`3 * 灵梦等级 * 退治层数` 金币。
- 结果:清除退治。
- 金币支付给灵梦玩家、消失、还是进入赛钱箱:待确认。默认支付给灵梦玩家。
## 5. 堇子行动
### 5.1 `SumirekoShootOccultOrb`
- 执行者:堇子。
- 条件:移动后。
- 目标:按等级解锁地形。
- Lv1 森林:丹麦灵异珠。
- Lv2 水域:英格兰灵异珠。
- Lv3 山脉:挪威灵异珠。
- Lv4 平原:诺曼底灵异珠。
- 发射范围、是否消耗行动点、数量上限需确认。
### 5.2 `SumirekoOccultLineTeleport`
- 条件:两个灵异珠形成横竖线或 45 度斜线。
- 目标:普通单位。
- 结果:单位通过灵异连线传送。
- 是否消耗行动点:待确认。默认消耗通用行动点。
## 6. 华扇行动
### 6.1 `KasenSetBeastGuide`
- 执行者:华扇。
- 目标4 格内地块。
- 结果:放置兽引。
- 是否消耗攻击行动点:截图写“拥有兽引时需要先指定”,正式文档写消耗攻击行动点召唤,当前需确认。默认消耗攻击行动点。
### 6.2 `KasenRecallBeastGuide`
- 执行者:华扇。
- 目标:已有兽引。
- 结果:回收兽引,并获得 1 点移动行动点。
- Lv2 额外恢复 5HP。
- Lv3 额外获得 1 层狂暴。
### 6.3 `KasenToggleOniForm`
- Lv4 触发。
- 是否主动切换待确认。默认升级到 Lv4 后自动进入鬼形态。
## 7. 阿吽行动
### 7.1 `AunnChooseEscapeOrPetrify`
- 执行者:阿吽。
- 条件:攻击后。
- 选择:逃脱或原地石化。
- 石化:自身 +2 防御,周围友军 +1 防御。
### 7.2 `AunnPortalTeleport`
- 条件:阿吽 Lv2 后存在两个阿吽。
- 执行者:位于任一阿吽身边的单位。
- 结果:传送到另一个阿吽边上。
- 目标落点选择:玩家选择还是自动最近空格,待确认。
## 8. 萃香行动
### 8.1 `SuikaMiniAttach`
- 执行者:小萃香。
- 目标:萃香。
- 结果:小萃香消失,萃香层数 +1。
- 层数上限等于萃香等级。
### 8.2 `SuikaShakeOffMinis`
- 执行者:萃香。
- 结果:抖出所有小萃香。
- 小萃香生成位置:周围空格;空格不足时处理待确认。
### 8.3 `SuikaCreateMiniByHp`
- 萃香 Lv3 解锁。
- 不消耗行动点,仅消耗生命生成小萃香。
- 消耗生命数值待确认。
### 8.4 `SuikaThrowUnit`
- 大萃香解锁。
- 目标1 格内一个单位。
- 目标落点3 格内任意陆地位置。
- 可投掷敌方/友方/自己:待确认。默认敌我均可,不包括自己。
### 8.5 `SuikaFallingImpact`
- 巨大萃香解锁。
- 目标3 格内任意位置。
- 结果:从天而降。
- 伤害、击杀判定、落点占格规则未提供,需确认。
- 若不能击杀,则被动移动到附近 1 格随机位置,随机必须同步。
## 9. ActionDataAssets 配置要求
每个行动必须补齐:
- `ActionId`
- `ActionName`
- `Desc`
- `Icon`
- `IconViewSizeType`
- `Cost`
- `NoNeedTech`
- `SpriteSize` / `SpritePos`
正式图标缺失时:
- 从 `Unity/Assets/BundleResources/TH1UI/Icon/Action/UnitAction/``Action/CircleAction256x256/` 复制同类图标。
- 命名 `Action_<ActionId>.png` 或按目录现有规范命名。
- 不复制源 `.meta`
- 不直接复用旧图标引用。
## 10. 联机、回放、存档
所有改变 `MapData` 的主动行为必须走 action 权威流程。
重点检查:
- `CommonActionParams` 对象引用和 ID 同步。
- `CheckShow` / `CheckCan` 区分展示和合法性。
- Host/client 执行结果一致。
- 回放可重放。
- AI 深拷贝评分不会播放真实 UI/VFX。
- 同步随机用于萃香击杀失败位移和灵梦随机御札。
## 11. 警告清单
```text
[WARN][action-id-missing] ActionDataAssets: Hakurei/Reimu/Sumireko/Kasen/Aunn/Suika 新 ActionId 待确认
[WARN][action-icon-placeholder] ActionDataAssets: 新 Action 图标缺失 - 需复制占位
[WARN][danegeld-interaction-unclear] HakureiDanegeldDemand: 支付/拒付交互未确认
[WARN][raid-cap-unclear] HakureiActiveRaid: 主动抢劫是否突破城市产出上限未确认
[WARN][beast-guide-cost-unclear] KasenSetBeastGuide: 是否消耗攻击行动点未确认
[WARN][suika-hp-cost-unclear] SuikaCreateMiniByHp: 消耗生命数值未确认
[WARN][suika-falling-damage-unclear] SuikaFallingImpact: 伤害和击杀规则未确认
```

View File

@ -0,0 +1,112 @@
# 博丽帝国批量策划需求初审报告
> 文档类型:需求文档审核报告
> 审核对象:`DOC/devmissiondoc/26_06/hakurei_empire/` 下全部初稿
> 审核日期2026-06-15
> 结论:初步结构合格,但存在若干阻塞确认项;不建议程序直接全量开工
## 1. 本批已产出文档
| 文件 | 结论 | 说明 |
| --- | --- | --- |
| `00-index.md` | 合格 | 批量需求入口清楚,列出了拆分原则和统一命名 |
| `01-faction-base.md` | 初步合格 | 阵营基础、DataAsset、UI、文案、BGM、资源要求完整7 奇观缺失 |
| `02-heroes.md` | 初步合格 | 5 英雄 Lv1-Lv4、直接 Skill、衍生 Skill、UnitAction、衍生单位、配合均已覆盖 |
| `03-techs.md` | 初步合格 | 初始机制、丹麦金、海洋线、狂暴线、圆盾线已拆成 Tech/TechAtom |
| `04-units.md` | 初步合格 | 新单位、替代单位、灵异珠、兽引、阿吽副体、小萃香与形态均已覆盖 |
| `05-skills.md` | 初步合格 | 阵营 Skill、英雄 Skill、生命周期、联机存档、资源占位均已覆盖 |
| `06-unit-actions.md` | 初步合格 | 主动抢劫、丹麦金、英灵转发展、英雄主动行动均已列入 action 流程 |
## 2. 覆盖率检查
### 2.1 阵营机制
| 机制 | 是否覆盖 | 文档 |
| --- | --- | --- |
| 弱种田 / 简化种田 | 是 | `01-faction-base.md` |
| 港口邻接城市中心 +1 金币 | 是 | `01-faction-base.md``03-techs.md` |
| 港口为相邻市场 +1 等级 | 是 | `01-faction-base.md``03-techs.md` |
| 军营英灵点换发展度 5:1 | 是 | `01-faction-base.md``03-techs.md``06-unit-actions.md` |
| 自动抢劫 | 是 | `03-techs.md``05-skills.md` |
| 主动抢劫 | 是 | `03-techs.md``06-unit-actions.md` |
| 丹麦金勒索 | 是 | `03-techs.md``06-unit-actions.md` |
| 符文 | 是 | `04-units.md``05-skills.md` |
| 英灵殿 | 是 | `05-skills.md` |
| 卡维船 | 是 | `03-techs.md``04-units.md` |
| 长船 | 是 | `03-techs.md``04-units.md` |
| 龙船 | 是 | `03-techs.md``04-units.md``06-unit-actions.md` |
| 狂暴步兵 | 是 | `03-techs.md``04-units.md` |
| 狂战士 | 是 | `03-techs.md``04-units.md` |
| 女武神 | 是 | `03-techs.md``04-units.md``05-skills.md``06-unit-actions.md` |
| 圆盾兵 | 是 | `03-techs.md``04-units.md``05-skills.md` |
### 2.2 英雄机制
| 英雄 | Lv1-Lv4 | Skill | UnitAction | 衍生单位/对象 | 配合 |
| --- | --- | --- | --- | --- | --- |
| 灵梦 | 是 | 是 | 是 | 是 | 是 |
| 堇子 | 是 | 是 | 是 | 是 | 是 |
| 华扇 | 是 | 是 | 是 | 是 | 是 |
| 阿吽 | 是 | 是 | 是 | 是 | 是 |
| 萃香 | 是 | 是 | 是 | 是 | 是 |
## 3. 初步合格点
- 文档已按“阵营总案、英雄、科技、单位、Skill、UnitAction”拆开程序可以分模块读取。
- 每个会改变 `MapData` 的主动行为均要求走 action 权威流程。
- Skill 文档包含生命周期、层数、继承、联机、存档、回放和同步随机风险。
- Skill / UnitAction / Tech 均继承了“正式图标缺失时复制独立占位资源”的规则。
- 当前版本 AI 明确不做专项策略,仅要求不报错和不生成不理解的行动。
- 已标出项目现有 `Norway/Reimu/Hakurei` 痕迹,避免误判成完全新增阵营。
## 4. 阻塞确认项
这些问题不确认,程序无法稳定开工或会产生大返工。
| 编号 | 问题 | 影响 |
| --- | --- | --- |
| B1 | 博丽帝国是复用现有 `CivEnum.Norway + ForceEnum.Reimu + GiantType.NorwayReimu`,还是新增独立阵营? | 影响 PlayerDataAssets、枚举、图鉴、战绩筛选、选人 UI |
| B2 | 堇子、华扇、阿吽、萃香的最终 `GiantType` 命名和编号是什么? | 影响 UnitType、HeroData、Library、技能挂载 |
| B3 | 7 个奇观没有出现在本批图片中,是否本轮不做? | 影响阵营基础配置是否达完整上线标准 |
| B4 | 灵梦 Lv3 随机御札的 Buff/Debuff 池是什么? | 影响 Skill 实现和联机同步随机 |
| B5 | 堇子灵异珠数量上限冲突:截图有“无上限”,正式文档写“上限与等级相同”。 | 影响对象管理、UI、性能和存档 |
| B6 | 堇子 Lv3/Lv4 的“挪威/诺曼底灵异珠”命名和效果需要统一。 | 影响 UnitType、Skill、图鉴文案 |
| B7 | 丹麦金是否需要支付/拒付交互?单机和联机如何处理? | 影响 UI、网络协议、PlayerAction |
| B8 | 主动抢劫是否突破城市产出上限? | 影响经济平衡和抢劫额度记录 |
| B9 | 符文地块上的死亡恢复是“阻止死亡并恢复 6HP”还是“死亡后复活为 6HP” | 影响死亡生命周期、OnAnyUnitDie、英灵点结算顺序 |
| B10 | 狂暴持续到何时?一次攻击、当前回合、永久状态? | 影响 Skill 生命周期和 Action 点刷新 |
| B11 | 萃香 Lv3 消耗生命生成小萃香的生命成本是多少? | 影响 UnitAction 可执行条件 |
| B12 | 萃香 Lv4 从天而降的伤害、击杀判定、落点占格规则是什么? | 影响核心战斗实现 |
## 5. 非阻塞但需补充项
| 问题 | 建议 |
| --- | --- |
| 正式 Skill / Action / Tech UI 文案不足 | 开发可先留空并保留 `copy-missing` warning |
| 正式图标、棋子、VFX/SFX 未确认 | 按模板复制占位图标;棋子/VFX/SFX 保留资源 warning |
| AI 策略未设计 | 当前版本只做禁用或不生成入口 |
| 女武神承伤死亡后的剩余伤害规则未确认 | 默认女武神死亡后剩余伤害继续结算到原目标,但需策划确认 |
| 圆盾兵相邻防御是否对自身生效 | 默认不对自身生效 |
| 华扇兽引是否允许多个叠加 | 默认单兽引,等待策划确认 |
## 6. 程序开发建议顺序
1. 先确认阵营 ID 和 4 个新英雄 `GiantType`
2. 先做 DataAsset 骨架PlayerInfo、5 英雄 Lv1-Lv4、Tech/TechAtom、SkillInfo、ActionInfo。
3. 先实现阵营基础:自动抢劫、符文、英灵点、英灵转发展。
4. 再实现特色单位:圆盾兵、狂暴步兵、狂战士、海军三件套。
5. 再实现 5 英雄,建议顺序:灵梦、萃香、阿吽、堇子、华扇。
6. 最后接 UI、图鉴、音乐室、战绩筛选和资源占位清理。
## 7. 当前审核结论
本批需求文档已经达到“可以让策划审核大纲和对象拆分”的程度。
暂不建议程序直接全量开发,原因是 ID 复用、新英雄枚举、随机御札、灵异珠上限、丹麦金交互、符文死亡顺序、萃香 Lv4 伤害等关键规则仍未确认。
建议策划先只审核三件事:
- 对象拆分是否完整阵营、5 英雄、5 组科技、16 个新单位/对象、30 个左右 Skill、20 个 UnitAction。
- 每个对象是否应该独立成文档卡,还是合并/删减。
- 阻塞确认项 B1-B12 的策划答案。

View File

@ -0,0 +1,430 @@
# 新阵营基础配置策划需求
> 文档类型:策划给程序的开发需求
> 适用范围:新增一个可选阵营/文明组合的基础接入不包含具体英雄技能逻辑、单位战斗数值、AI 专项策略和平衡迭代
> 模板用途:后续每个新阵营需求从本文件复制到 `DOC/devmissiondoc/YY_MM/` 后,再补齐具体阵营变量和资源状态
> 需求来源:策划模板
> 程序执行前要求:所有缺失资源、缺失文案、缺失枚举、缺失 DataAsset 字段必须写入“警告清单”,不能静默使用旧阵营资源
## 1. 目标
新增一个完整可被玩家选择的新阵营,并保证它在主流程、图鉴、音乐室、加载图、战绩筛选、基础数据资产和多语言文案链路中都有可追踪配置。
本需求只负责“阵营基础配置可接入”。如果英雄技能、专属单位、专属建筑、奇观机制需要新逻辑,应拆到后续独立需求文档中。
## 1.1 关联模板
新阵营总需求只作为入口和总验收清单。具体玩法内容按以下模板拆分:
| 内容 | 使用模板 | 拆分规则 |
| --- | --- | --- |
| 新英雄 | `DOC/devmissiondoc/templates/new-hero-template.md` | 每个英雄一份;只写英雄整合,不展开复杂 Skill |
| 新 Skill | `DOC/devmissiondoc/templates/new-skill-template.md` | 每个新 `SkillType` 一张 Skill 规格卡;可多个 Skill 放在同一份需求内,但必须逐卡填写 |
| 新主动单位行动 | `DOC/devmissiondoc/templates/new-unit-action-template.md` | 任何玩家/AI 可点击且改变 `MapData` 的主动行为都要单独写 |
| 新单位/召唤物/变形体 | `DOC/devmissiondoc/templates/new-unit-template.md` | 每个单位或单位族一份 |
| 新科技/TechAtom | `DOC/devmissiondoc/templates/new-tech-template.md` | 每个科技或科技分支一份,写清解锁的 Skill、UnitAction、单位 |
默认规则:
- 英雄文档负责上下文和等级整合。
- Skill 文档负责生命周期、继承、叠层、动画、美术、AI、联机、回放和存档。
- UnitAction 文档负责 `CheckShow``CheckCan``CompleteExecute`、AI 生成/评分、网络同步和回放。
- 单位文档负责属性、资源、获取方式、初始 Skill 和可用行动。
- 科技文档负责解锁链路和 UI 展示。
## 2. 策划输入
程序开发前,策划需要在本文档或同目录补充文档中明确以下字段。
| 字段 | 必填 | 说明 | 缺失处理 |
| --- | --- | --- | --- |
| 阵营显示名 | 是 | 选人界面、战绩筛选、图鉴、音乐室展示用 | 阻塞开发 |
| `CivEnum` 候选 | 是 | 新文明枚举名,例如 `Norway` | 阻塞开发 |
| `ForceEnum` 候选 | 是 | 新势力/角色阵营枚举名,例如 `Reimu` | 阻塞开发 |
| 主领袖名 | 是 | `PlayerInfo.LeaderName` | 留空并警告,不允许复用其他阵营领袖名 |
| 阵营介绍 | 是 | `PlayerInfo.EmpireDesc` | 留空并警告 |
| 领袖介绍 | 是 | `PlayerInfo.LeaderDesc` | 留空并警告 |
| 专属 BGM 名 | 是 | `PlayerInfo.MusicName``MusicDataAssets.MusicName` 必须一致 | 阻塞上线,开发可先留警告占位 |
| 5 个英雄列表 | 是 | King / Queen / Bishop / Knight / Rook 五职阶 | 阻塞图鉴验收 |
| 7 个奇观列表 | 是 | 该阵营图鉴奇观与建造奇观配置 | 阻塞图鉴验收 |
| 阵营特色科技 | 是 | 选人界面特色科技圆点展示 | 留空并警告 |
| 初始科技 | 是 | `PlayerInfo.TechStart` | 留空并警告 |
| 可研发科技池 | 是 | `PlayerInfo.TechPool` | 阻塞开局测试 |
| 加载图 | 是 | `PlayerInfo.LoadingPic` | 留空并警告 |
| 领袖立绘/头像 | 是 | 选人界面、外交、战绩等通用展示 | 留空并警告 |
| 胜利图/失败图 | 是 | `WinPic` / `LosePic` | 留空并警告 |
| 旗帜图标 | 是 | `FlagIcon` | 留空并警告 |
| 房屋 Sprite 组 | 是 | `CivInfo.HouseSpriteList` 需要 House1~House5 | 缺任一张均警告 |
| 城市名称与描述 | 是 | `CivInfo.CityInfoList` | 留空并警告 |
## 3. 文案来源规则
程序接入图鉴英雄和图鉴奇观时,不直接在 DataAsset 中临时编写文案。文案按以下优先级读取:
1. 已存在的最佳实践设计文档路径。
- 英雄机制/任务/技能:`Design/final/mechanics/hero-system.html``Design/final/mechanics/hero-foundation.html`、对应新阵营机制文档。
- 英雄角色设定/图鉴描述:`Design/final/narrative/heroes.html`、对应新阵营叙事文档。
- 奇观设定/美术或叙事:`Design/final/narrative/奇观设计/`、对应新阵营奇观文档。
- 阵营设定:`Design/final/narrative/` 下对应阵营文档。
2. 如果正式文档不存在,但草稿存在,可从 `Design/drafts/` 对应主题读取,并在警告清单中标注“来源为草稿,待策划确认”。
3. 如果文案来源不存在,字段留空,必须写入警告清单,格式为:
- `[WARN][copy-missing] LibraryGiantData.Desc: <GiantType> 缺图鉴英雄描述,未找到最佳实践文案来源。`
- `[WARN][copy-missing] LibraryWonderData.Desc: <WonderLibraryID> 缺图鉴奇观描述,未找到最佳实践文案来源。`
游戏面向玩家的新增文本必须走多语言导出/导入链路,不允许在代码中硬编码。
## 4. 开发范围
### 4.1 基础枚举与 ID
程序需要确认新阵营是否已有枚举:
- `CivEnum`
- `ForceEnum`
- 5 个英雄的 `GiantType`
- 7 个奇观的 `WonderTypeEnum` / `WonderLibrary`
- 如涉及城市图鉴或地理描述,还需要确认 `CivLibrary``CityLibrary`
如果枚举已存在,不要重复新增。如果枚举不存在,需要评估存档兼容、网络同步和 DataAsset ID 对齐风险后再改。
### 4.2 `PlayerDataAssets`
配置路径:
- Authoring`Unity/Assets/BundleResources/DataAssets/PlayerDataAssets.asset`
- Runtime Export`Unity/Assets/BundleResources/Export/PlayerDataAssets.asset`
- 类型:`PlayerDataAssets` / `PlayerInfo`
必须新增或补齐一个 `PlayerInfo`
| 字段 | 要求 |
| --- | --- |
| `CivId` | 必须与 `Table.Instance.TransCivEnumToCivId(CivEnum)` 一致 |
| `ForceId` | 必须与 `Table.Instance.TransForceEnumToForceId(ForceEnum)` 一致 |
| `CivName` | 多语言字段,阵营文明名 |
| `ForceName` | 多语言字段,势力名/帝国名 |
| `LeaderName` | 多语言字段,主领袖名 |
| `LeaderIllustration` | 选人/外交等需要的主立绘 |
| `LeaderAvatar` | 头像 |
| `WinPic` / `LosePic` | 胜负结算图片 |
| `LoadingPic` | 加载界面图片 |
| `TechPool` | 可研发科技池,不得为空 |
| `TechStart` | 初始科技,不得只因复制旧阵营而保留错误科技 |
| `Color` | 阵营主色,选人界面背景使用 |
| `FlagIcon` | 阵营旗帜 |
| `Diff` | 选人界面难度星级 |
| `TechAtomList` | 选人界面阵营特色科技展示 |
| `EmpireDesc` | 多语言字段,阵营介绍 |
| `LeaderDesc` | 多语言字段,领袖介绍 |
| `StartChatBubble` / `MeetChatBubble` / `LoseChatBubble` / `WinChatBubble` | 多语言字段,缺失可警告占位 |
| `MusicName` | 必须能在 `MusicDataAssets``AudioManager` 音频 key 中查到 |
检查要求:
- `Table.Instance.PlayerDataAssets.GetPlayerInfo(civ, force, out info)` 必须返回 true。
- `info.MusicName` 不为空,并且 `MusicDataAssets.GetMusicInfo(info.MusicName, out _)` 返回 true。
- 所有图片字段如果缺失,程序必须给出明确警告,不允许借用其他阵营资源后不记录。
### 4.3 `CivDataAssets`
配置路径:
- Authoring`Unity/Assets/BundleResources/DataAssets/CivDataAssets.asset`
- Runtime Export`Unity/Assets/BundleResources/Export/CivDataAssets.asset`
- 类型:`CivDataAssets` / `CivInfo`
必须新增或补齐一个 `CivInfo`
| 字段 | 要求 |
| --- | --- |
| `CivId` | 与新 `CivEnum` 转换 ID 一致 |
| `Civ` | 对应 `CivLibrary` |
| `CivName` | 多语言字段 |
| `CityInfoList` | 至少包含该文明常用城市名称;缺少正式文案时留空并警告 |
| `HouseSpriteList` | House1~House5 五张房屋 Sprite缺任一张警告 |
### 4.4 专属 BGM 与音乐室
配置路径:
- Authoring`Unity/Assets/BundleResources/DataAssets/MusicDataAssets.asset`
- Runtime Export`Unity/Assets/BundleResources/Export/MusicDataAssets.asset`
- 类型:`MusicDataAssets` / `MusicInfo`
必须新增或补齐一条 `MusicInfo`
| 字段 | 要求 |
| --- | --- |
| `MusicName` | 与 `PlayerInfo.MusicName` 完全一致 |
| `MusicClip` | 专属 BGM 音频资源 |
| `CoverSprite` | 音乐室封面 |
| `BackgroundSprite` | 音乐室背景 |
| `Title` | 多语言字段,曲名 |
| `OriginalTitle` | 多语言字段,原曲名 |
| `Force` | 新 `ForceEnum` |
| `Civ` | 新 `CivEnum` |
| `Composer` / `Arranger` / `Mixer` / `Vocalist` / `Illustrator` | 多语言字段,缺失可留空并警告 |
验收要求:
- 音乐室列表能看到该曲目。
- 点击播放后能播放新 BGM。
- 选人/游戏内 BGM 轮播能通过 `PlayerInfo.MusicName` 找到该音频。
- 缺封面或背景时允许进入开发,但必须显示警告。
### 4.5 图鉴英雄
配置路径:
- 英雄基础数据:`Unity/Assets/BundleResources/DataAssets/HeroDataAssets.asset`
- 图鉴数据:`Unity/Assets/BundleResources/DataAssets/LibraryDataAssets.asset`
- Runtime Export对应 `Unity/Assets/BundleResources/Export/*.asset`
- 类型:`HeroInfoData``LibraryGiantData`
必须配置 5 个英雄,对应五职阶:
| 职阶 | `GiantType` | 图鉴文案来源 | 状态 |
| --- | --- | --- | --- |
| King | 待填 | 待填 | 待确认 |
| Queen | 待填 | 待填 | 待确认 |
| Bishop | 待填 | 待填 | 待确认 |
| Knight | 待填 | 待填 | 待确认 |
| Rook | 待填 | 待填 | 待确认 |
`HeroDataAssets` 要求:
- 每个 `HeroInfoData.GiantType` 唯一。
- `HeroIllustration``HeroAvatar` 缺失时警告。
- `TaskList` 可在后续英雄技能需求中补全;如果本次只做基础接入,允许为空,但必须警告“英雄任务未配置”。
`LibraryDataAssets.LibraryGiantList` 要求:
| 字段 | 要求 |
| --- | --- |
| `GiantType` | 对应英雄 |
| `Name` | 多语言字段,从最佳实践文案来源读取 |
| `SubTitle` | 多语言字段,缺失留空并警告 |
| `Desc` | 多语言字段,从最佳实践文案来源读取 |
| `Diag` | 多语言字段,缺失留空并警告 |
| `EnglishName` | 英文名,缺失留空并警告 |
| `DiagColor` | 对话颜色,缺失使用默认色并警告 |
| `Illust` | 图鉴立绘,缺失警告 |
| `AchivePreId` | 图鉴星星/成就前缀 ID需确认不与旧英雄冲突 |
### 4.6 图鉴奇观
配置路径:
- 奇观配置:`Unity/Assets/BundleResources/DataAssets/GridAndResourceDataAssets.asset`
- 图鉴数据:`Unity/Assets/BundleResources/DataAssets/LibraryDataAssets.asset`
- Runtime Export对应 `Unity/Assets/BundleResources/Export/*.asset`
- 相关代码:`Unity/Assets/Scripts/TH1_DataAssetsScript/GridObjectDataAssets.cs`
- 类型:`WonderInfo``LibraryWonderData`
必须配置 7 个新阵营奇观:
| 序号 | `WonderTypeEnum` | `WonderLibraryID` | 文案来源 | 状态 |
| --- | --- | --- | --- | --- |
| 1 | 待填 | 待填 | 待填 | 待确认 |
| 2 | 待填 | 待填 | 待填 | 待确认 |
| 3 | 待填 | 待填 | 待填 | 待确认 |
| 4 | 待填 | 待填 | 待填 | 待确认 |
| 5 | 待填 | 待填 | 待填 | 待确认 |
| 6 | 待填 | 待填 | 待填 | 待确认 |
| 7 | 待填 | 待填 | 待填 | 待确认 |
`GridAndResourceDataAssets` 要求:
- 该阵营可以通过 `GetWonderInfoByType(wonderType, empire, out wonderInfo)` 找到对应奇观。
- 奇观建造条件、资源图标、地块显示、完成状态必须与现有奇观流程一致。
- 如果仅做图鉴基础配置,建造逻辑暂未完成,必须在警告清单标注“图鉴已配置,建造逻辑未接入”。
`LibraryDataAssets.LibraryWonderList` 要求:
| 字段 | 要求 |
| --- | --- |
| `WonderLibraryID` | 唯一,不与旧奇观冲突 |
| `Name` | 多语言字段,从最佳实践文案来源读取 |
| `Desc` | 多语言字段,从最佳实践文案来源读取 |
| `Diags` | 多语言字段,缺失留空并警告 |
| `AchivePreId` | 图鉴星星/成就前缀 ID需确认不冲突 |
### 4.7 加载图片
必须确认 `PlayerInfo.LoadingPic` 已配置,并验证以下入口:
- 单机开始游戏,从选人界面进入 Loading显示新阵营加载图。
- 继续游戏/重玩本回合时Loading 图不错误回退到旧阵营。
- 联机房间若显示阵营加载图,也必须能读取新阵营。
如果 `LoadingPic` 为空,允许开发阶段保留默认图,但必须写警告。
### 4.8 选人界面
相关代码入口:
- `Unity/Assets/Scripts/TH1_UI/View/Outside/UIOutsideSelectView.cs`
- `Unity/Assets/Scripts/TH1_UI/View/Outside/UIOutsideSelectAvatarMono.cs`
- `Unity/Assets/Scripts/TH1_UI/View/Outside/UIOutsideSelectForceGroupMono.cs`
- `Unity/Assets/Scripts/TH1_UI/View/Outside/UIOutsideSelectSkillCircleMono.cs`
必须完成:
- `UIOutsideSelectView.CivForceList` 包含新 `Empire(CivEnum, ForceEnum)`
- 对应 `ForceGroupList` 或 prefab 配置包含新阵营五英雄展示。
- 英雄图片能通过 `HeroDataAssets` / prefab 引用正常显示。
- 阵营名、文明名、领袖描述、阵营介绍来自 `PlayerDataAssets` 多语言字段。
- 阵营特色科技圆点来自 `PlayerInfo.TechAtomList`
- 难度星级来自 `PlayerInfo.Diff`
- 选中后开始游戏传入的新 `CivId``ForceId` 正确。
- 上次选择记忆 `PlayerPrefs` 能识别新枚举。
缺任一资源时,界面可进入但必须警告,不能静默显示其他阵营图片。
### 4.9 联机选阵营
相关代码入口:
- `Unity/Assets/Scripts/TH1_UI/View/Outside/UIOutsideMultiplayMemberRowMono.cs`
- `Unity/Assets/Scripts/TH1_UI/View/Outside/UIOutsideMultiplayView.cs`
必须完成:
- 联机成员行阵营切换列表包含新阵营。
- AI 阵营候选列表包含新阵营,除非策划明确要求暂不上 AI。
- 房间同步的 `MemberCiv.CivId` / `ForceId` 能传递新阵营。
- 多人重复阵营逻辑下,新阵营名称显示正确。
### 4.10 战绩界面
相关代码入口:
- `Unity/Assets/Scripts/TH1_UI/View/Outside/UIOutsideHistoryView.cs`
- `Unity/Assets/Scripts/TH1_UI/View/Outside/UIOutsideHistoryItemMono.cs`
- `GameRecordManager.GetSortGameRecordList`
必须完成:
- 阵营下拉筛选包含新阵营。
- 下拉显示名来自 `PlayerDataAssets.GetPlayerInfo(civ, force, out info).ForceName`
- 筛选逻辑不能只按旧 `ForceEnum` switch 映射,必须覆盖新阵营。
- 新阵营完成一局后,战绩列表显示头像、阵营名、文明名、胜负图等不缺失。
当前项目中 `UIOutsideHistoryView` 仍存在旧阵营硬编码列表和 switch 映射,新阵营开发时必须修改或重构这里。
### 4.11 主菜单随机英雄展示
相关代码入口:
- `Unity/Assets/Scripts/TH1_UI/View/Outside/UIOutsideMenuView.cs`
必须确认主菜单随机展示英雄的候选池是否要包含新阵营。
如果策划希望新阵营上线后出现在主菜单随机英雄展示中,需要把新 `ForceEnum` 加入候选,并确认五英雄 `GiantType`、头像和图鉴立绘已配置。
### 4.12 图鉴入口与音乐室入口
相关代码入口:
- `Unity/Assets/Scripts/TH1_UI/View/Outside/UIOutsideLibraryView.cs`
- `Unity/Assets/Scripts/TH1_UI/View/Outside/UIOutsideLibraryHeroPanelMono.cs`
- `Unity/Assets/Scripts/TH1_UI/View/Outside/UIOutsideLibraryWonderPanelMono.cs`
- `Unity/Assets/Scripts/TH1_UI/View/Outside/UIOutsideLibraryMusicPanelMono.cs`
必须完成:
- 图鉴阵营筛选/展示列表包含新 `Empire`
- 5 个英雄能显示图鉴条目。
- 7 个奇观能显示图鉴条目。
- 音乐室能显示新 BGM 条目。
- 若当前代码中存在旧阵营硬编码数组,必须同步扩展或改成从 DataAsset 生成。
## 5. 多语言与导出
所有新增玩家可见文本必须进入多语言数据:
- `PlayerInfo.CivName`
- `PlayerInfo.ForceName`
- `PlayerInfo.LeaderName`
- `PlayerInfo.EmpireDesc`
- `PlayerInfo.LeaderDesc`
- `PlayerInfo.StartChatBubble` / `MeetChatBubble` / `LoseChatBubble` / `WinChatBubble`
- `CivInfo.CivName`
- `CityInfo.CityName`
- `CityInfo.CityDescription`
- `MusicInfo.Title` 等音乐室字段
- `LibraryGiantData.Name` / `SubTitle` / `Desc` / `Diag`
- `LibraryWonderData.Name` / `Desc` / `Diags`
程序完成 DataAsset 配置后,需要通过项目既有导出流程把 `DataAssets` 同步到 `Export`,并确保 `Multilingual.asset` 处于最新状态。
不要直接编辑 `Unity/Assets/BundleResources/Export/*` 作为源数据Export 是运行时产物,应由导出流程生成。
## 6. 警告清单格式
开发过程中若有任何缺失项,统一记录为:
```text
[WARN][category] <asset-or-file>: <field-or-entry> - <problem> - <expected-source-or-owner>
```
示例:
```text
[WARN][image-missing] PlayerDataAssets: Norway/Reimu.LoadingPic - 缺加载图 - 等待美术资源
[WARN][copy-missing] LibraryGiantData: NorwayReimu.Desc - 未找到正式图鉴文案 - 等待 Design/final/narrative 对应文档
[WARN][music-missing] MusicDataAssets: ReimuNorway.MusicClip - 缺 BGM AudioClip - 等待音频资源
[WARN][ui-hardcode] UIOutsideHistoryView: DropdownForceData - 仍是旧阵营硬编码列表 - 程序需扩展或改为 DataAsset 驱动
```
上线前,`image-missing``music-missing``enum-missing``data-missing` 必须清零。`copy-missing` 是否允许上线由策划确认。
## 7. 验收测试
### 7.1 静态数据检查
- `PlayerDataAssets.GetPlayerInfo(newCiv, newForce, out info)` 返回 true。
- `CivDataAssets.GetCivInfo(newCiv, out civInfo)` 返回 true。
- `MusicDataAssets.GetMusicInfo(info.MusicName, out musicInfo)` 返回 true。
- 5 个英雄 `HeroDataAssets.GetHeroInfo(giantType, out heroInfo)` 均返回 true。
- 5 个英雄 `LibraryDataAssets.GetLibraryInfoByGiant(giantType, out libInfo)` 均返回 true。
- 7 个奇观 `LibraryDataAssets.GetLibraryInfoByWonder(wonderLibraryID, out libInfo)` 均返回 true。
- 7 个奇观能通过新阵营 `Empire` 找到对应 `WonderInfo`
- 所有新增多语言字段导出后能在当前语言显示,不出现裸 ID、空白或旧阵营文本。
### 7.2 UI 流程检查
- 单机选人界面能看到新阵营。
- 选中新阵营后,阵营名、文明名、领袖介绍、阵营介绍、特色科技、难度星级、英雄展示均正确。
- 点击开始游戏后进入 Loading加载图正确。
- 进入游戏后玩家 `CivEnum``ForceEnum` 正确,初始科技正确。
- 图鉴中能看到该阵营 5 个英雄和 7 个奇观。
- 音乐室中能看到并播放该阵营 BGM。
- 战绩界面阵营筛选包含该阵营,并能筛出新阵营对局。
- 联机房间可选择该阵营,并能同步给其他玩家。
### 7.3 回归检查
- 旧四个已上线阵营仍可选择、可进入游戏、可显示图鉴和音乐室。
- 战绩筛选旧阵营结果不变。
- BGM 轮播不因新阵营缺音频 key 报错。
- 多语言导出不生成重复语义的新 ID。
## 8. 非目标
本需求不处理:
- 新英雄技能逻辑。
- 新英雄升级任务的完整数值与触发逻辑。
- 新奇观的特殊机制实现。
- AI 对新阵营特色玩法的专项评分。
- 成就系统新增条件设计。
- Steam 公告、补丁说明和商店素材。
这些内容需要独立策划需求文档。
## 9. 程序建议
如果开发时发现同一阵营需要在多个 UI 中重复维护硬编码列表,应优先考虑封装一个从 `PlayerDataAssets.PlayerDataList` 派生“可选阵营列表”的公共方法,再让选人界面、联机界面、图鉴和战绩筛选共用。这样后续新增阵营只改 DataAsset减少漏配。
该建议不改变本次验收目标;如果重构风险过高,可以先按现有结构补齐硬编码列表,但必须在警告清单中记录后续债务。

View File

@ -0,0 +1,245 @@
# 新英雄策划需求模板
> 文档类型:策划给程序的新英雄整合需求
> 适用范围新增或重做一个英雄的等级规则、Skill 获得、衍生 Skill、衍生单位、UnitAction、图鉴和资源接入
> 不适用范围:单个 Skill 的完整生命周期细节;复杂 Skill 必须关联 `new-skill-template.md`
> 模板用途:后续具体英雄需求从本文件复制到 `DOC/devmissiondoc/YY_MM/` 后补齐
> 程序执行前要求:英雄文档负责按 Lv 整合玩法;每个新 Skill / UnitAction / 衍生单位必须能追到对应需求卡或明确警告
## 1. 英雄基础信息
| 字段 | 内容 |
| --- | --- |
| 英雄名 | 待填 |
| 所属阵营 | 待填 |
| 职阶 | King / Queen / Bishop / Knight / Rook |
| 建议 `GiantType` | 待填 |
| 图鉴英文名 | 待填 |
| 是否进入选人界面展示 | 是 |
| 是否进入图鉴 | 是 |
| 是否有衍生单位 | 是 / 否 |
| 是否有主动 UnitAction | 是 / 否 |
## 2. 英雄设计摘要
按策划表格的“英雄设计 / 特色 A+B”填写保持短句即可。
| 项 | 内容 |
| --- | --- |
| 英雄设计 | 待填,例如:王 - 灵梦 |
| 特色 A | 待填 |
| 特色 B | 待填 |
| 额外关键词 | 待填 |
| 备注 | 待填 |
## 3. 各等级要求
这里写玩家能读懂的每级完整规则,允许直接从策划表复制。程序实现细节不要塞在这一节。
| 等级 | 策划规则描述 | 本级新增内容摘要 | 备注 |
| --- | --- | --- | --- |
| Lv1 | 待填 | 待填 | 待填 |
| Lv2 | 待填 | 待填 | 待填 |
| Lv3 | 待填 | 待填 | 待填 |
| Lv4 | 待填 | 待填 | 待填 |
填写要求:
- 每级新增、强化、替换、上限变化要明确。
- 如果某级只强化旧规则,也要写出强化前后差异。
- 如果某级引入衍生单位、主动行动或新 Skill必须在后续清单中逐项登记。
## 4. 每级 UnitType 属性
配置路径:
- `Unity/Assets/BundleResources/DataAssets/UnitTypeDataAssets.asset`
- 类型:`UnitTypeDataAssets` / `UnitTypeInfo`
| 等级 | `UnitLevel` | 生命 | 攻击 | 防御 | 移动 | 射程 | 视野 | 棋子/形态说明 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Lv1 | 1 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 |
| Lv2 | 2 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 |
| Lv3 | 3 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 |
| Lv4 | 4 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 |
如果某等级是变形、双形态、船形态或模板替换,必须在“衍生单位/形态”章节登记。
## 5. 每级 Skill 配置
本节只登记“这个英雄在哪一级获得哪些 Skill”。每个新 `SkillType` 的完整规则必须写到 Skill 需求卡。
| 等级 | 直接配置在英雄身上的 Skill | 本级新增 Skill | 本级强化/替换 Skill | Skill 文档 |
| --- | --- | --- | --- | --- |
| Lv1 | 待填 | 待填 | 待填 | 待填 |
| Lv2 | 待填 | 待填 | 待填 | 待填 |
| Lv3 | 待填 | 待填 | 待填 | 待填 |
| Lv4 | 待填 | 待填 | 待填 | 待填 |
字段说明:
- “直接配置在英雄身上的 Skill”最终应出现在该等级 `UnitTypeInfo.Skills` 或英雄生成后固定拥有的 Skill。
- “本级新增 Skill”该等级相比上一级新增的 Skill。
- “本级强化/替换 Skill”旧 Skill 升级、替换、变体化或参数增强。
- “Skill 文档”:填写从 `new-skill-template.md` 派生出的具体文档路径;没有则写警告。
## 6. 衍生 Skill 清单
衍生 Skill 指不直接配置在英雄身上,但由英雄 Skill、UnitAction、衍生单位、召唤物、地块效果或状态过程产生的 Skill。
| 衍生 Skill | 来源等级 | 来源规则 | 挂载对象 | 是否玩家可见 | Skill 文档 | 备注 |
| --- | --- | --- | --- | --- | --- | --- |
| 待填 | Lv1/Lv2/Lv3/Lv4 | 待填 | 英雄/友军/敌军/衍生单位/地块/城市/玩家 | 是/否 | 待填 | 待填 |
必须区分:
- 英雄自己持有的 Skill。
- 给其他单位添加的 buff/debuff。
- 给衍生单位添加的 Skill。
- 只作为内部状态记录、不展示给玩家的 Skill。
## 7. 每级 UnitAction 配置
如果某等级解锁主动按钮行为,必须按 Lv 登记。完整行动规则写到 UnitAction 需求卡。
| 等级 | UnitAction | 获得来源 | 是否直接来自英雄 Skill | 是否需要科技 | UnitAction 文档 | 备注 |
| --- | --- | --- | --- | --- | --- | --- |
| Lv1 | 待填 | 待填 | 是/否 | 是/否 | 待填 | 待填 |
| Lv2 | 待填 | 待填 | 是/否 | 是/否 | 待填 | 待填 |
| Lv3 | 待填 | 待填 | 是/否 | 是/否 | 待填 | 待填 |
| Lv4 | 待填 | 待填 | 是/否 | 是/否 | 待填 | 待填 |
程序提示:
- 主动行为通常需要 `ActionDataAssets.ActionInfo`
- 改变 `MapData` 的主动行为必须走 action 权威流程。
- 只有纯显示或纯选择效果不需要单独 action。
## 8. 衍生单位/召唤物/形态
英雄如果会产生新单位、临时单位、召唤物、复制体、变形体、船形态或模板替换,必须登记。
| 衍生对象 | 来源等级 | 产生方式 | 建议 `UnitType` / `GiantType` | 是否可行动 | 是否可被攻击 | 生命周期 | 单位文档 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 待填 | Lv1/Lv2/Lv3/Lv4 | Skill / UnitAction / 死亡 / 变形 / 召唤 | 待填 | 是/否 | 是/否 | 永久/N回合/到触发后消失 | 待填 |
必须明确:
- 是否占格。
- 是否继承英雄阵营、视野、科技、Skill。
- 是否会触发英雄任务。
- 是否进存档和回放。
- 是否需要 `new-unit-template.md` 派生文档。
## 9. 升级任务
配置路径:
- `Unity/Assets/BundleResources/DataAssets/HeroDataAssets.asset`
- 类型:`HeroInfoData.TaskList` / `HeroTaskInfoData`
| 升级段 | 任务类型 | 参数 | 关联 Skill/UnitAction/衍生单位 | 任务文案 | 备注 |
| --- | --- | --- | --- | --- | --- |
| Lv1 -> Lv2 | 待填 | 待填 | 待填 | 待填 | 待填 |
| Lv2 -> Lv3 | 待填 | 待填 | 待填 | 待填 | 待填 |
| Lv3 -> Lv4 | 待填 | 待填 | 待填 | 待填 | 待填 |
必须确认:
- 任务进度是否由新 Skill、UnitAction 或衍生单位触发。
- 衍生单位造成伤害、击杀、移动、死亡是否计入英雄任务。
- 变船、变形、复制、召唤物是否计入任务。
## 10. 和其他英雄的配合
按策划表格右侧“和其他英雄的配合”填写。这里描述组合关系,不写具体代码。
| 配合英雄 | 配合规则 | 涉及 Skill/UnitAction/衍生单位 | 是否需要额外文档 | 备注 |
| --- | --- | --- | --- | --- |
| King | 待填 | 待填 | 是/否 | 待填 |
| Queen | 待填 | 待填 | 是/否 | 待填 |
| Bishop | 待填 | 待填 | 是/否 | 待填 |
| Knight | 待填 | 待填 | 是/否 | 待填 |
| Rook | 待填 | 待填 | 是/否 | 待填 |
如果配合会新增独立 Skill 或行动,必须进入对应模板,不要只写在本节。
## 11. DataAsset 接入
必须配置或检查:
| DataAsset | 字段/内容 | 要求 |
| --- | --- | --- |
| `UnitTypeDataAssets.asset` | `UnitTypeInfo` Lv1~Lv4 | 每级属性、Skill、Sprite、Projectile、EnableActions |
| `HeroDataAssets.asset` | `HeroInfoData` | `GiantType``HeroIllustration``HeroAvatar``TaskList` |
| `SkillDataAssets.asset` | `SkillInfo` | 所有直接 Skill 和衍生 Skill |
| `ActionDataAssets.asset` | `ActionInfo` | 所有主动 UnitAction |
| `LibraryDataAssets.asset` | `LibraryGiantData` | 图鉴名称、描述、台词、插图、成就前缀 |
## 12. 图鉴文案
配置路径:
- `Unity/Assets/BundleResources/DataAssets/LibraryDataAssets.asset`
- 类型:`LibraryGiantData`
| 字段 | 内容 |
| --- | --- |
| `Name` | 待填 |
| `SubTitle` | 待填 |
| `Desc` | 待填 |
| `Diag` | 待填 |
| `EnglishName` | 待填 |
| `DiagColor` | 待填 |
| `Illust` | 待填 |
| `AchivePreId` | 待填 |
文案来源必须指向 `Design/final/``Design/drafts/` 的具体文档;缺失时写警告。
## 13. 资源清单
| 资源 | 是否需要 | 状态 | 备注 |
| --- | --- | --- | --- |
| 英雄立绘 `HeroIllustration` | 待填 | 待填 | 待填 |
| 英雄头像 `HeroAvatar` | 待填 | 待填 | 待填 |
| Lv1~Lv4 棋子 Sprite | 待填 | 待填 | 待填 |
| 衍生单位 Sprite | 待填 | 待填 | 待填 |
| Skill 图标 | 待填 | 待填 | 待填 |
| UnitAction 图标 | 待填 | 待填 | 待填 |
| VFX/SFX | 待填 | 待填 | 待填 |
| 投射物 | 待填 | 待填 | 待填 |
## 14. AI
当前版本新英雄 AI 暂不做专项设计。
程序只需保证:
- AI 不会因为该英雄、Skill、UnitAction 或衍生单位报错。
- 如果 AI 暂不使用某个新 UnitAction需要明确屏蔽或不给 AI 生成入口。
- 后续若要做 AI再补独立 AI 需求。
## 15. 验收测试
- 英雄可在选人界面展示。
- Lv1~Lv4 属性正确。
- 每级直接 Skill、衍生 Skill、强化/替换关系正确。
- 每级 UnitAction 解锁正确。
- 衍生单位/召唤物/形态按规则产生和消失。
- 升级任务能正确计数并升级。
- 与其他英雄配合按表格规则生效。
- 图鉴英雄条目显示正确。
- 立绘、头像、棋子、Skill 图标、UnitAction 图标不缺失。
- 单机、联机、存档、回放路径不报错。
## 16. 警告清单
```text
[WARN][hero-illustration-missing] HeroDataAssets: <GiantType>.HeroIllustration - 缺英雄立绘 - 等待美术资源
[WARN][hero-avatar-missing] HeroDataAssets: <GiantType>.HeroAvatar - 缺英雄头像 - 等待美术资源
[WARN][skill-doc-missing] <GiantType>: <SkillType> 缺 Skill 需求卡 - 策划需补充
[WARN][derived-skill-doc-missing] <GiantType>: <SkillType> 衍生 Skill 缺需求卡 - 策划需补充
[WARN][unit-action-doc-missing] <GiantType>: <ActionId> 缺 UnitAction 需求卡 - 策划需补充
[WARN][derived-unit-doc-missing] <GiantType>: <UnitType/GiantType> 缺衍生单位需求卡 - 策划需补充
[WARN][library-copy-missing] LibraryGiantData: <GiantType>.Desc - 缺图鉴文案 - 等待策划文案
```

View File

@ -0,0 +1,273 @@
# 新 Skill 策划需求模板
> 文档类型:策划给程序的 Skill 开发需求
> 适用范围:新增或重做一个 `SkillType` 对应的单位/英雄技能,包括被动、状态、触发器、叠层、持续效果、技能表现
> 不适用范围:玩家主动点击并改变地图数据的行为按钮;这类同时需要 `new-unit-action-template.md`
> 模板用途:后续具体 Skill 需求从本文件复制到 `DOC/devmissiondoc/YY_MM/` 后补齐
> 程序执行前要求:生命周期、叠层、继承、动画时序和资源缺失必须明确;不能让程序按旧技能猜
## 1. Skill 概要
| 字段 | 内容 |
| --- | --- |
| Skill 名称 | 待填 |
| 建议 `SkillType` | 待填 |
| 归属阵营/英雄/单位 | 待填 |
| Skill 类型 | 被动 / 状态 / 触发器 / 消耗型 / 光环 / 召唤物规则 / 其他 |
| 是否玩家可见 | 是 / 否 |
| 是否显示在单位头顶 | 是 / 否 |
| 是否可叠层 | 是 / 否 |
| 是否需要新行动按钮 | 是 / 否;若是,关联 `new-unit-action-template.md` |
| 是否需要新美术/动画 | 是 / 否 |
| 是否影响 AI 决策 | 是 / 否 |
| 是否影响联机同步/回放 | 是 / 否 |
## 2. 设计目标
说明这个 Skill 要解决的玩法问题,不写实现。
- 核心体验:待填。
- 玩家决策点:待填。
- 与英雄/单位/科技的关系:待填。
- 不希望出现的玩法:待填。
## 3. 获得与移除
| 场景 | 是否获得/移除 | 规则 |
| --- | --- | --- |
| 单位创建 | 待填 | 待填 |
| 英雄升级 | 待填 | 待填 |
| 科技解锁 | 待填 | 待填 |
| 行动执行后 | 待填 | 待填 |
| 攻击/受击后 | 待填 | 待填 |
| 回合开始/结束 | 待填 | 待填 |
| 死亡 | 待填 | 待填 |
| 复活 | 待填 | 待填 |
| 变成船 / 离船 | 待填 | 待填 |
| 变形 / 转换单位 | 待填 | 待填 |
| 复制 / 召唤物继承 | 待填 | 待填 |
| 被驱散 / 清除负面 | 待填 | 待填 |
必须明确:
- 由谁添加:单位自身 / 友军 / 敌军 / 玩家 / 地块 / 城市 / 科技。
- `originId` 语义:施加者单位 ID / 技能宿主 ID / 玩家 ID / 0。
- 重复获得时:刷新、覆盖、叠层、拒绝、延长回合数,必须选一个。
## 4. 生命周期继承规则
对应 `SkillInfo` 字段必须给出策划决策:
| 字段 | 决策 | 说明 |
| --- | --- | --- |
| `ReserveOnCarry` | 待填 | 变成船/运输携带时是否保留 |
| `ReserveLeaveCarry` | 待填 | 离船/离开携带状态时是否保留 |
| `ReserveGiantUpgrade` | 待填 | 英雄 Lv1->Lv4 升级时是否保留 |
| `ReserveCommonTransform` | 待填 | 普通变形/转换单位时是否保留 |
额外说明:
- 死亡后是否进入尸体、火焰、召唤物、复活形态:待填。
- 临时单位、幻象、复制体是否继承:待填。
- 队友/盟友/敌方转换阵营后是否保留:待填。
## 5. 数值与叠层
| 字段 | 内容 |
| --- | --- |
| 初始层数/等级 | 待填 |
| 最大层数/等级 | 待填 |
| 层数含义 | 待填 |
| 回合限制 | 永久 / N 回合 / 到本回合结束 / 到下次行动 / 其他 |
| 刷新规则 | 待填 |
| 覆盖规则 | 待填 |
| 多来源叠加 | 同来源叠加 / 不同来源叠加 / 只取最高 / 只保留最新 |
| 层数归零后 | 移除 Skill / 保留 0 层显示 / 转换为其他 Skill |
如果数值依赖单位属性、地图、科技、资源、城市或其他 Skill必须写公式和边界。
## 6. 触发时机
勾选所有相关生命周期,并补充触发条件。
| 生命周期 | 是否使用 | 条件 | 效果 |
| --- | --- | --- | --- |
| `OnActionExecuted` | 待填 | 待填 | 待填 |
| `OnTurnStart` | 待填 | 待填 | 待填 |
| `OnAfterTurnStart` | 待填 | 待填 | 待填 |
| `OnTurnEnd` | 待填 | 待填 | 待填 |
| `BeforeDamageOther` | 待填 | 待填 | 待填 |
| `OnDamageOther` | 待填 | 待填 | 待填 |
| `AfterDamageOther` | 待填 | 待填 | 待填 |
| `BeforeDamagedSupportStage` | 待填 | 待填 | 待填 |
| `BeforeDamagedTransformStage` | 待填 | 待填 | 待填 |
| `OnDamaged` | 待填 | 待填 | 待填 |
| `BeforeUnitDamaged` | 待填 | 待填 | 待填 |
| `OnAnyUnitMove` | 待填 | 待填 | 待填 |
| `OnAnyUnitDie` | 待填 | 待填 | 待填 |
| `OnAnyUnitCreate` | 待填 | 待填 | 待填 |
| 其他 | 待填 | 待填 | 待填 |
若同一事件中多个 Skill 都会触发,需说明优先级或是否允许按现有 `SkillPriority` 处理。
## 7. 逻辑效果
写清楚权威数据变化:
- 影响单位属性:生命、攻击、防御、移动、射程、视野、行动点。
- 影响地图数据:地块、城市、资源、领土、可见性。
- 影响玩家数据:金币、科技、文化、外交、任务进度。
- 创建/删除/转换单位:待填。
- 添加/移除其他 Skill待填。
- 触发英雄任务:待填。
如果会改变 `MapData`,程序必须判断是否需要通过 action 执行;不能只在 UI、动画或网络接收处改数据。
## 8. 表现与动画
| 表现项 | 是否需要 | 资源/说明 |
| --- | --- | --- |
| Skill 图标 | 待填 | 待填 |
| 单位头顶图标 | 待填 | 待填 |
| 地块 VFX | 待填 | 待填 |
| 单位 VFX | 待填 | 待填 |
| 投射物 | 待填 | 待填 |
| 音效 | 待填 | 待填 |
| BGM/特殊音乐 | 待填 | 待填 |
| 文字提示/飘字 | 待填 | 待填 |
| 摄像机/镜头 | 待填 | 待填 |
攻击相关 Skill 必须说明表现阶段:
- 攻击开始前。
- 弹道/近战命中前。
- 命中后立刻。
- 反击命中后。
- 攻击流程结算末尾。
程序要求:
- 若 Skill 在 `OnDamageOther` / `OnDamaged` 等攻击流程中刷新 Renderer必须使用 scope-aware 动画模式。
- 视觉表现只在 `mapData == Main.MapData` 时执行。
- AI 模拟图、回放重放准备阶段不能播放真实 UI/VFX 副作用。
## 9. DataAsset 配置
配置路径:
- Authoring`Unity/Assets/BundleResources/DataAssets/SkillDataAssets.asset`
- Runtime Export`Unity/Assets/BundleResources/Export/SkillDataAssets.asset`
- 类型:`SkillDataAssets` / `SkillInfo`
必须补齐:
| `SkillInfo` 字段 | 要求 |
| --- | --- |
| `SkillType` | 对应新枚举 |
| `SkillViewType` | 正面 / 负面 / 特殊 / 其他,待填 |
| `SkillName` | 多语言字段 |
| `SkillDesc` | 多语言字段 |
| `NotShow` | 是否隐藏 |
| `ShowOnUnitMono` | 是否显示在单位头顶 |
| `SkillIcon` | 图标资源 |
| `HasShowList` | 是否不同单位显示不同说明 |
| `SkillShowList` | 如有变体,逐项配置 |
| `skillPriority` | 触发顺序 |
| `ReserveOnCarry` | 见生命周期继承 |
| `ReserveLeaveCarry` | 见生命周期继承 |
| `ReserveGiantUpgrade` | 见生命周期继承 |
| `ReserveCommonTransform` | 见生命周期继承 |
如果 Skill 通过科技赋予,还要补充 `TechAtomInfo.IsAddSkill``AddSkillCondition``AddSkillType`
## 10. 文案
新增玩家可见文本必须走多语言:
- Skill 名。
- Skill 描述。
- 变体描述。
- 行动按钮描述,如存在。
- 图鉴描述,如需要。
- 教学/提示/日志,如需要。
文案来源:
- 优先从对应英雄/单位/阵营正式设计文档读取。
- 如果没有正式文案,留空并写警告。
## 11. AI
| 问题 | 决策 |
| --- | --- |
| AI 是否需要主动追求该 Skill | 待填 |
| AI 是否需要规避敌方该 Skill | 待填 |
| AI 评分是否要理解层数/剩余回合 | 待填 |
| AI 模拟执行时是否会改变真实表现 | 必须为否 |
| 是否需要 BTNodeCanvas 新节点 | 待填 |
如果 Skill 会显著改变行动价值,程序需要检查 `AIActionGenerator``AIActionScoreCalculator` 和相关 BTNodeCanvas 节点。
## 12. 联机、回放、存档
必须确认:
- 随机数来源是否同步。
- Skill 字段是否能被 MemoryPack 正确序列化。
- 存档读回后层数、来源、剩余回合是否正确。
- Host/client 执行结果是否一致。
- 回放/观战是否能重放同样结果。
- AI 评分深拷贝图不会污染真实图。
## 13. 美术替代资源方案
如果正式 Skill 图标、单位头顶图标或变体图标缺失,程序不能让玩家可见 Skill 以空图标进入实现。必须先找已有资源复制成新占位资源,并让 DataAsset 指向新占位资源。
占位流程:
1. 在现有 `SkillDataAssets.asset``Unity/Assets/BundleResources/TH1UI/Icon/SkillIcon/` 中找同类图标。
2. 优先选择同功能、同 `SkillViewType`、同阵营/英雄风格、同显示尺寸的图标;没有完全匹配时选视觉语义最接近的通用图标。
3. 将源图标复制为新资源文件,目标命名使用新 Skill 的正确名字:`Skill_<SkillType>.png`;变体图标使用 `Skill_<SkillType>_<UnitFullType>.png`
4. 不要直接让新 Skill 引用旧 Skill 的原始图标;必须复制出独立占位文件,方便后续美术替换。
5. 不要复制源 `.meta` 文件。优先在 Unity Editor 内 Duplicate 后重命名;如果用文件系统复制,只复制图片文件,让 Unity 生成新的 `.meta` 和 GUID再按源图标补齐必要的 import settings。
6. 将 `SkillInfo.SkillIcon` 指向新占位图标;如果 `HasShowList = true`,每个 `SkillInfoShowPack.Icon` 也要按变体复制并指向对应占位图标。
7. 在警告清单中记录占位来源、目标路径和待替换状态。
占位登记:
| 字段 | 目标占位资源 | 复制来源 | 是否已接入 DataAsset | 备注 |
| --- | --- | --- | --- | --- |
| `SkillInfo.SkillIcon` | 待填 | `<SourceSkillType>` / `<source path>` | 是 / 否 | 待填 |
| `SkillInfoShowPack.Icon` | 待填 | `<SourceSkillType>` / `<source path>` | 是 / 否 | 如无变体可删 |
只有满足以下情况,才允许不创建占位图标:
- `NotShow = true`,且不会出现在单位头顶、图鉴、科技树、行动提示、战斗提示等任何玩家可见位置。
- 策划明确该 Skill 是纯内部状态,并在本文档中写明“不需要玩家可见图标”。
## 14. 资源缺失与占位警告
按格式记录:
```text
[WARN][skill-icon-placeholder] SkillDataAssets: <SkillType>.SkillIcon - 正式图标缺失,已复制 <source path><target path> 占位 - 等待美术替换
[WARN][skill-variant-icon-placeholder] SkillDataAssets: <SkillType>.SkillShowList[<UnitFullType>].Icon - 正式变体图标缺失,已复制 <source path><target path> 占位 - 等待美术替换
[WARN][skill-icon-missing] SkillDataAssets: <SkillType>.SkillIcon - 缺 Skill 图标且未找到可接受占位源 - 需要策划或美术确认
[WARN][vfx-missing] <SkillType>: 命中特效缺失 - 等待特效资源
[WARN][copy-missing] SkillDataAssets: <SkillType>.SkillDesc - 缺正式技能描述 - 等待策划文案
[WARN][lifecycle-unclear] <SkillType>: ReserveGiantUpgrade 未确认 - 策划需确认英雄升级是否保留
```
## 15. 验收测试
- 获得 Skill 的所有入口均能正确添加。
- 重复获得、刷新、叠层、覆盖均符合设计。
- 变船、离船、升级、死亡、复活、变形、复制等生命周期符合设计。
- 图标、单位头顶显示、描述、多语言正确。
- 正式图标缺失时,已复制独立占位资源并接到 `SkillIcon` / `SkillInfoShowPack.Icon`,没有直接复用旧图标引用。
- 攻击相关表现时序正确,不提前刷新血条或状态。
- 单机玩家使用正常。
- AI 模拟不报错,不污染真实地图。
- 联机 host/client 结果一致。
- 存档读回后 Skill 状态一致。
- 回放/观战结果一致。

View File

@ -0,0 +1,147 @@
# 新科技策划需求模板
> 文档类型:策划给程序的新科技开发需求
> 适用范围:新增或重做一个科技、科技分支、科技原子 `TechAtom`,以及由科技解锁的单位/行动/Skill
> 模板用途:后续具体科技需求从本文件复制到 `DOC/devmissiondoc/YY_MM/` 后补齐
> 程序执行前要求:科技解锁内容必须明确到 `TechType``TechAtom`、action、Skill、单位和 UI 展示
## 1. 科技概要
| 字段 | 内容 |
| --- | --- |
| 科技名 | 待填 |
| 建议 `TechType` | 待填 |
| 所属阵营 | 通用 / 指定阵营 |
| 科技层级 | 待填 |
| 前置科技 | 待填 |
| 费用等级 `CostLevel` | 待填 |
| 科技树显示类型 | 待填 |
| 是否选人界面特色科技 | 是 / 否 |
## 2. 设计目标
- 解锁什么玩法:待填。
- 影响哪个阶段节奏:前期 / 中期 / 后期。
- 与阵营核心机制关系:待填。
- 不希望出现的滥用:待填。
## 3. `TechInfo` 配置
配置路径:
- `Unity/Assets/BundleResources/DataAssets/TechDataAssets.asset`
- 类型:`TechDataAssets` / `TechInfo`
| `TechInfo` 字段 | 内容 |
| --- | --- |
| `TechType` | 待填 |
| `TechName` | 多语言字段 |
| `Description` | 多语言字段 |
| `icon` | 科技图标 |
| `CostLevel` | 待填 |
| `FatherTechList` | 待填 |
| `TechAtomList` | 待填 |
| `TechTreeCircleViewType` | 待填 |
## 4. `TechAtom` 配置
| `TechAtomInfo` 字段 | 内容 |
| --- | --- |
| `TechAtom` | 待填 |
| `TechAtomName` | 多语言字段 |
| `Desc` | 多语言字段 |
| `IsAddSkill` | 是否生产单位时附加 Skill |
| `AddSkillCondition` | 哪些 `UnitFullType` 适用 |
| `AddSkillType` | 附加的 `SkillType` |
| `EnableAction` | 是否解锁行动 |
| `TechActions` | 解锁的 `CommonActionId` |
| `UseActionSprite` | 是否使用 action 图标 |
| `IconContainer` | 科技原子图标 |
| `iconViewSizeType` | 图标显示类型 |
如果 `IsAddSkill = true`,必须关联 Skill 需求卡。
如果 `EnableAction = true`,必须关联 UnitAction 需求卡。
## 5. 解锁内容
| 解锁项 | 类型 | 文档链接 | 备注 |
| --- | --- | --- | --- |
| 待填 | 单位 / Skill / UnitAction / 建筑 / 资源规则 / 其他 | 待填 | 待填 |
## 6. 阵营接入
必须确认:
- `PlayerInfo.TechPool` 是否包含该科技。
- `PlayerInfo.TechStart` 是否初始拥有。
- `PlayerInfo.TechAtomList` 是否用于选人界面特色科技展示。
- 旧阵营是否不应获得该科技。
- AI 是否会研发该科技。
## 7. UI 与文案
- 科技树图标。
- 科技名。
- 科技描述。
- TechAtom 名和描述。
- 行动锁定说明,如由科技解锁 action。
- 选人界面特色科技短说明,如展示。
全部走多语言。
## 8. AI
| 问题 | 决策 |
| --- | --- |
| AI 是否能研究 | 待填 |
| AI 研究优先级 | 待填 |
| AI 是否理解解锁后的新行动 | 待填 |
| AI 是否理解生产附加 Skill | 待填 |
## 9. 美术替代资源方案
如果正式科技图标或 TechAtom 图标缺失程序不能让科技树以空图标进入实现。必须先找已有科技、TechAtom、行动或 Skill 图标复制成新占位资源,并让 `TechDataAssets` 指向新占位资源。
占位流程:
1. 科技主图标优先在 `Unity/Assets/BundleResources/TH1UI/Icon/TechIcon/` 中找同类资源TechAtom 图标优先找同类 TechAtom 的 `IconContainer`,其次可从已关联的 UnitAction 或 Skill 图标复制。
2. 选择顺序:同科技分支/同阵营 > 同解锁类型 > 同视觉尺寸 > 通用科技图标。
3. 复制源图标为新文件,科技主图标命名为 `Tech_<TechType>.png`TechAtom 图标命名为 `TechAtom_<TechAtom>.png`。如果目录已有更明确命名规范,跟随现有目录规范,但必须包含新 `TechType``TechAtom`
4. 不要直接让新科技引用旧科技、旧行动或旧 Skill 的原始图标;必须复制出独立占位文件,方便后续美术替换。
5. 不要复制源 `.meta` 文件。优先在 Unity Editor 内 Duplicate 后重命名;如果用文件系统复制,只复制图片文件,让 Unity 生成新的 `.meta` 和 GUID再按源图标补齐必要的 import settings。
6. 将 `TechInfo.icon` 指向新科技主图标。
7. 如果 `TechAtomInfo.UseActionSprite = false`,必须将 `TechAtomInfo.IconContainer.Icon``IconContainer.IconList` 指向新 TechAtom 占位图标。
8. 如果 `TechAtomInfo.EnableAction = true``UseActionSprite = true`TechAtom 可使用行动图标,但对应 `ActionInfo.Icon` 仍必须按 UnitAction 模板完成占位。
9. 在警告清单中记录占位来源、目标路径和待替换状态。
占位登记:
| 字段 | 目标占位资源 | 复制来源 | 是否已接入 DataAsset | 备注 |
| --- | --- | --- | --- | --- |
| `TechInfo.icon` | 待填 | `<SourceTechType>` / `<source path>` | 是 / 否 | 待填 |
| `TechAtomInfo.IconContainer.Icon` | 待填 | `<SourceTechAtom>` / `<source path>` | 是 / 否 | 如 `UseActionSprite = true` 可写不需要 |
| `TechAtomInfo.IconContainer.IconList[*].Sprite` | 待填 | `<SourceTechAtom>` / `<source path>` | 是 / 否 | 如无变体可删 |
## 10. 验收测试
- 科技树显示正确。
- 前置科技和费用正确。
- 研究后 TechAtom 生效。
- 解锁单位/行动/Skill 正确。
- 选人特色科技展示正确。
- 正式图标缺失时,已复制独立占位资源并接到 `TechInfo.icon` / `TechAtomInfo.IconContainer`,没有直接复用旧图标引用。
- 旧阵营不会误获得。
- AI 如可研究,能正常评分。
- 存档读回后科技状态正确。
- 联机和回放一致。
## 11. 资源缺失与占位警告
```text
[WARN][tech-icon-placeholder] TechDataAssets: <TechType>.icon - 正式科技图标缺失,已复制 <source path><target path> 占位 - 等待美术替换
[WARN][tech-atom-icon-placeholder] TechDataAssets: <TechAtom>.IconContainer - 正式 TechAtom 图标缺失,已复制 <source path><target path> 占位 - 等待美术替换
[WARN][tech-icon-missing] TechDataAssets: <TechType>.icon - 缺科技图标且未找到可接受占位源 - 需要策划或美术确认
[WARN][tech-copy-missing] TechDataAssets: <TechType>.Description - 缺科技描述 - 等待策划文案
[WARN][tech-action-doc-missing] TechAtomInfo: <TechAtom>.TechActions - 解锁行动缺需求卡 - 策划需补充
[WARN][tech-skill-doc-missing] TechAtomInfo: <TechAtom>.AddSkillType - 附加 Skill 缺需求卡 - 策划需补充
```

View File

@ -0,0 +1,218 @@
# 新 UnitAction 策划需求模板
> 文档类型:策划给程序的单位行动开发需求
> 适用范围:新增或重做一个玩家/AI 可主动执行的单位行动按钮,通常对应 `CommonActionType.UnitAction``CommonActionType.UnitSkill`
> 不适用范围:纯被动 Skill、自动触发 Skill这些使用 `new-skill-template.md`
> 模板用途:后续具体 UnitAction 需求从本文件复制到 `DOC/devmissiondoc/YY_MM/` 后补齐
> 程序执行前要求:任何改变 `MapData` 的主动行为必须走 action 权威流程,不能只在 UI 或 Skill 表现层处理
## 1. 行动概要
| 字段 | 内容 |
| --- | --- |
| 行动名称 | 待填 |
| 建议 `UnitActionType` / `SkillType` | 待填 |
| 行动类型 | `UnitAction` / `UnitSkill` / 其他 |
| 归属单位/英雄 | 待填 |
| 是否需要科技解锁 | 是 / 否 |
| 是否消耗行动点 | 是 / 否;消耗类型待填 |
| 是否消耗资源 | 金币 / 文化 / 生命 / 层数 / 其他 |
| 是否需要目标 | 无目标 / 目标单位 / 目标地块 / 目标城市 / 目标玩家 |
| 是否 AI 可用 | 是 / 否 |
| 是否联机同步 | 是,主动行动默认必须同步 |
## 2. 玩家操作流程
写清楚玩家如何执行:
1. 行动按钮出现位置:单位行动圈 / 地块行动 / 城市行动 / 其他。
2. 显示条件 `CheckShow`:待填。
3. 可执行条件 `CheckCan`:待填。
4. 目标选择方式:待填。
5. 点击后是否二次确认:待填。
6. 执行后 UI 是否关闭/刷新/继续选择:待填。
`CheckShow` 可以宽松展示,`CheckCan` 必须保护真实合法性。
## 3. 行动规则
| 规则项 | 内容 |
| --- | --- |
| 施法者/执行者 | 待填 |
| 合法目标 | 待填 |
| 距离/范围 | 待填 |
| 地形限制 | 待填 |
| 阵营/外交限制 | 待填 |
| 冷却/每回合次数 | 待填 |
| 行动点消耗 | 待填 |
| 资源消耗 | 待填 |
| 失败条件 | 待填 |
| 执行结果 | 待填 |
如果行动触发或消耗某个 Skill 层数,需关联 `new-skill-template.md`
## 4. 权威数据变化
必须列出所有 `Execute` 中会改变的数据:
- 单位位置、生命、行动点、Skill、变形、创建、死亡。
- 地块:资源、特殊地块、归属、可见性。
- 城市:建筑、经验、归属。
- 玩家:资源、科技、外交、任务进度。
- 网络日志:是否写入 `MapData.Net.Actions`
禁止只在 UI、AI 或网络接收路径修改权威数据。
## 5. `CommonActionParams`
| 参数 | 是否需要 | 说明 |
| --- | --- | --- |
| `PlayerData` / `PlayerId` | 待填 | 待填 |
| `UnitData` / `UnitId` | 待填 | 行动发起单位 |
| `GridData` / `GridId` | 待填 | 发起地块或相关地块 |
| `TargetUnitData` / `TargetUnitId` | 待填 | 目标单位 |
| `TargetGridData` / `TargetGridId` | 待填 | 目标地块 |
| `TargetPlayerData` / `TargetPlayerId` | 待填 | 目标玩家 |
| 其他 | 待填 | 待填 |
程序要求:
- 构造参数后调用 `OnParamChanged()`
- 网络、回放、AI 深拷贝图中通过 ID 恢复引用时调用 `RefreshParams()`
## 6. `ActionDataAssets`
配置路径:
- Authoring`Unity/Assets/BundleResources/DataAssets/ActionDataAssets.asset`
- Runtime Export`Unity/Assets/BundleResources/Export/ActionDataAssets.asset`
- 类型:`ActionDataAssets` / `ActionInfo`
必须补齐:
| `ActionInfo` 字段 | 要求 |
| --- | --- |
| `ActionId` | 对应 `CommonActionId` |
| `ActionName` | 多语言字段 |
| `Desc` | 多语言字段 |
| `NeedTechDesc` / `TechDesc` | 科技树专用描述 |
| `NeedLockDesc` / `LockDesc` | 未解锁描述 |
| `Icon` | 行动图标 |
| `IconViewSizeType` | 图标显示类型 |
| `VarientIcon` / `IconList` | 阵营/地块变体图标 |
| `Cost` | 行动消耗 |
| `CityExp` | 如会提供城市经验 |
| `NoNeedTech` | 是否不需要科技解锁 |
| `SpriteSize` / `SpritePos` | UI 图标微调 |
## 7. 解锁来源
行动从哪里来:
- 单位自带:`UnitTypeInfo.EnableAction` / `EnableActions`
- 科技解锁:`TechAtomInfo.EnableAction` / `TechActions`
- Skill 临时授予:关联 Skill 文档。
- 其他:待填。
如果行动只应对特定阵营或特定单位出现,必须写清楚过滤规则。
## 8. 表现与动画
| 表现项 | 是否需要 | 说明 |
| --- | --- | --- |
| 行动图标 | 待填 | 待填 |
| 目标选择高亮 | 待填 | 待填 |
| 执行动画 | 待填 | 待填 |
| VFX | 待填 | 待填 |
| SFX | 待填 | 待填 |
| 摄像机 | 待填 | 待填 |
| 文字提示 | 待填 | 待填 |
如果行动内部会触发攻击、伤害或 Skill 表现,需遵守 scope-aware 时序。
## 9. AI
| 问题 | 决策 |
| --- | --- |
| AI 是否能生成该行动 | 待填 |
| AI 目标选择规则 | 待填 |
| AI 评分维度 | 待填 |
| AI 是否需要避免误伤/队友 | 待填 |
| 是否需要新 BTNodeCanvas 节点 | 待填 |
程序需要检查:
- `AIActionGenerator`
- `AIActionScoreCalculator`
- 相关 BTNodeCanvas 节点
- AI 模拟执行是否不产生真实 UI/VFX
## 10. 联机、回放、存档
主动行动必须验证:
- Host 本地执行并广播。
- Client 发起 `ActionConfirm`,等待 Host 广播。
- `CommonActionId` hash/相等/日志包含新维度。
- `CommonActionParams` 能仅凭 ID 在目标 `MapData` 恢复。
- 回放/观战能按 `Net.Actions` 重放。
- 随机结果使用同步随机。
## 11. 文案
新增玩家可见文本:
- 行动名。
- 行动说明。
- 锁定说明。
- 科技树说明。
- 目标选择提示。
- 错误提示,如需要。
全部走多语言,不硬编码。
## 12. 美术替代资源方案
如果正式 UnitAction 图标缺失,程序不能让行动按钮空图标上线。必须先找已有行动图标复制成新占位资源,并让 `ActionDataAssets` 指向新占位资源。
占位流程:
1. 在现有 `ActionDataAssets.asset``Unity/Assets/BundleResources/TH1UI/Icon/Action/` 下找同类行动图标。
2. 优先从 `Unity/Assets/BundleResources/TH1UI/Icon/Action/UnitAction/` 找单位专属行动图标;如果没有合适资源,再从 `Unity/Assets/BundleResources/TH1UI/Icon/Action/CircleAction256x256/` 找同语义通用图标。
3. 复制源图标为新文件,目标命名使用新行动的正确名字:`Action_<ActionId>.png``<ActionId>_256.png`,具体跟目标目录现有命名保持一致。
4. 不要直接让新行动引用旧行动原始图标;必须复制出独立占位文件,方便后续美术替换。
5. 不要复制源 `.meta` 文件。优先在 Unity Editor 内 Duplicate 后重命名;如果用文件系统复制,只复制图片文件,让 Unity 生成新的 `.meta` 和 GUID再按源图标补齐必要的 import settings。
6. 将 `ActionInfo.Icon` 指向新占位图标;如果 `VarientIcon = true``IconList` 中每个 `EmpireGridSpInfoPack.Sprite` 也要按阵营/地块变体复制并指向对应占位图标。
7. 在警告清单中记录占位来源、目标路径和待替换状态。
占位登记:
| 字段 | 目标占位资源 | 复制来源 | 是否已接入 DataAsset | 备注 |
| --- | --- | --- | --- | --- |
| `ActionInfo.Icon` | 待填 | `<SourceActionId>` / `<source path>` | 是 / 否 | 待填 |
| `ActionInfo.IconList[*].Sprite` | 待填 | `<SourceActionId>` / `<source path>` | 是 / 否 | 如无变体可删 |
## 13. 资源缺失与占位警告
```text
[WARN][action-icon-placeholder] ActionDataAssets: <ActionId>.Icon - 正式行动图标缺失,已复制 <source path><target path> 占位 - 等待美术替换
[WARN][action-variant-icon-placeholder] ActionDataAssets: <ActionId>.IconList[<condition>].Sprite - 正式变体图标缺失,已复制 <source path><target path> 占位 - 等待美术替换
[WARN][action-icon-missing] ActionDataAssets: <ActionId>.Icon - 缺行动图标且未找到可接受占位源 - 需要策划或美术确认
[WARN][copy-missing] ActionDataAssets: <ActionId>.Desc - 缺行动描述 - 等待策划文案
[WARN][ai-unclear] <ActionId>: AI 是否可用未确认 - 策划需确认
[WARN][target-rule-unclear] <ActionId>: 目标合法性未确认 - 策划需补充
```
## 14. 验收测试
- 行动按钮显示/隐藏符合 `CheckShow`
- 可执行/不可执行符合 `CheckCan`
- 目标选择和取消流程正常。
- 执行后权威数据变化正确。
- 消耗、冷却、行动点处理正确。
- 文案、图标、锁定状态正确。
- 正式图标缺失时,已复制独立占位资源并接到 `ActionInfo.Icon` / `IconList`,没有直接复用旧图标引用。
- AI 如可用,能生成、评分、执行。
- 联机 host/client 一致。
- 存档读回后状态正确。
- 回放/观战能重放。

View File

@ -0,0 +1,161 @@
# 新单位策划需求模板
> 文档类型:策划给程序的新单位开发需求
> 适用范围:新增或重做一个普通单位、召唤物、临时单位、变形单位或单位族
> 不适用范围:英雄整体设计;英雄使用 `new-hero-template.md`,复杂 Skill 使用 `new-skill-template.md`
> 模板用途:后续具体单位需求从本文件复制到 `DOC/devmissiondoc/YY_MM/` 后补齐
> 程序执行前要求:单位基础属性、生产/生成来源、Skill、行动和资源必须可验收
## 1. 单位概要
| 字段 | 内容 |
| --- | --- |
| 单位名 | 待填 |
| 建议 `UnitType` | 待填 |
| `GiantType` | 普通单位填 `None`,英雄/特殊巨人填具体值 |
| 所属阵营 | 通用 / 指定阵营 |
| 单位定位 | 待填 |
| 获取方式 | 训练 / 召唤 / 变形 / 事件 / 奇观 / 科技 / 其他 |
| 是否进入图鉴/Wiki | 是 / 否 |
| 是否 AI 可使用 | 是 / 否 |
| 是否有新 Skill | 是 / 否 |
| 是否有新 UnitAction | 是 / 否 |
## 2. 属性配置
配置路径:
- `Unity/Assets/BundleResources/DataAssets/UnitTypeDataAssets.asset`
- 类型:`UnitTypeDataAssets` / `UnitTypeInfo`
| `UnitTypeInfo` 字段 | 内容 |
| --- | --- |
| `UnitType` | 待填 |
| `GiantType` | 待填 |
| `UnitLevel` | 待填 |
| `ChessType` | 待填 |
| `GiantEmpire` | 待填 |
| `Name` | 多语言字段,待填 |
| `Desc` | 多语言字段,待填 |
| `LandType` | 陆地 / 海上 / 两栖 / 其他 |
| `NoMaxHealth` | 待填 |
| `MaxHealth` | 待填 |
| `Attack` | 待填 |
| `Defense` | 待填 |
| `MoveRange` | 待填 |
| `AttackRange` | 待填 |
| `Cost` | 待填 |
| `ProjectileType` | 待填 |
| `ForceMelee` | 待填 |
| `SameUnitCountLimit` | 待填 |
## 3. 获取与消失
| 场景 | 规则 |
| --- | --- |
| 城市训练 | 待填 |
| 行动召唤 | 待填 |
| Skill 生成 | 待填 |
| 单位变形 | 待填 |
| 死亡后产物 | 待填 |
| 回合结束消失 | 待填 |
| 被驱散/回收 | 待填 |
| 海陆转换/变船 | 待填 |
必须明确是否进入人口、是否占格、是否可被攻击、是否可被治疗、是否可获得经验或任务进度。
## 4. Skill 清单
| Skill | 获得方式 | 简述 | Skill 文档 |
| --- | --- | --- | --- |
| 待填 | 初始 / 科技 / 临时 | 待填 | 待填 |
复杂 Skill 必须关联 `new-skill-template.md` 派生文档。
## 5. 行动清单
如果单位有主动行为,配置:
- `UnitTypeInfo.EnableAction = true`
- `UnitTypeInfo.EnableActions`
- 或通过科技 `TechAtomInfo.EnableAction` 解锁
| 行动 | 来源 | 简述 | UnitAction 文档 |
| --- | --- | --- | --- |
| 待填 | 待填 | 待填 | 待填 |
主动行动必须关联 `new-unit-action-template.md` 派生文档。
## 6. 科技与解锁
| 项 | 内容 |
| --- | --- |
| 解锁科技 | 待填 |
| 是否初始可用 | 待填 |
| 是否仅某阵营可用 | 待填 |
| 是否被 `TechPool` 包含 | 待填 |
| 是否需要 `TechAtom` | 待填 |
| 是否显示在选人特色科技 | 待填 |
如需要新科技,关联 `new-tech-template.md`
## 7. 资源与表现
| 资源 | 是否需要 | 状态 |
| --- | --- | --- |
| 单位 Sprite | 待填 | 待填 |
| 阵营/地块变体 Sprite | 待填 | 待填 |
| 头像/图标 | 待填 | 待填 |
| 投射物 | 待填 | 待填 |
| 攻击动画 | 待填 | 待填 |
| 移动动画 | 待填 | 待填 |
| 受击/死亡 VFX | 待填 | 待填 |
| 音效 | 待填 | 待填 |
如果 `IsSpriteVarient = true`,必须补齐 `SpriteList` 的变体规则。
## 8. UI/Wiki/图鉴
必须确认:
- 单位名称和描述走多语言。
- Wiki 是否展示。
- 行动圈图标是否正常。
- Skill 图标是否正常。
- 训练按钮是否显示正确费用和锁定说明。
## 9. AI
| 问题 | 决策 |
| --- | --- |
| AI 是否会训练/生成该单位 | 待填 |
| AI 何时偏好该单位 | 待填 |
| AI 是否会主动使用该单位行动 | 待填 |
| AI 是否需要新评分规则 | 待填 |
## 10. 联机、回放、存档
- 单位创建/死亡/变形必须走权威逻辑。
- 随机生成必须使用同步随机。
- 存档读回后单位属性、Skill、行动解锁一致。
- 回放/观战能重放单位创建和行动。
## 11. 验收测试
- 单位能按设计方式获得。
- 属性、费用、移动、攻击、射程正确。
- 初始 Skill 正确。
- 主动行动正确。
- 变船、死亡、召唤、变形等生命周期正确。
- UI/Wiki/图标/文案正确。
- AI 如可用,能训练/使用。
- 联机、存档、回放一致。
## 12. 资源缺失警告
```text
[WARN][unit-sprite-missing] UnitTypeDataAssets: <UnitType>/<GiantType>/<Level>.Sprite - 缺单位 Sprite - 等待美术资源
[WARN][unit-copy-missing] UnitTypeDataAssets: <UnitType>.Desc - 缺单位描述 - 等待策划文案
[WARN][unit-action-doc-missing] <UnitType>: <ActionId> 缺行动需求卡 - 策划需补充
[WARN][skill-doc-missing] <UnitType>: <SkillType> 缺 Skill 需求卡 - 策划需补充
```

View File

@ -103,8 +103,9 @@
{
"id": 17,
"title": "伊吹小秋",
"done": false,
"createdAt": 1778772889258
"done": true,
"createdAt": 1778772889258,
"doneAt": 1781423344488
},
{
"id": 18,
@ -133,8 +134,9 @@
{
"id": 23,
"title": "准备 / 房主AI接管 / 房主自动更换 / 聊天文字 / 组队 / 限时 /",
"done": false,
"createdAt": 1779338200399
"done": true,
"createdAt": 1779338200399,
"doneAt": 1781423333907
},
{
"id": 24,

View File

@ -3,4 +3,4 @@
"platform": "discord",
"name": "Discord",
"comments": []
}
}

View File

@ -1,5 +1,5 @@
{
"nextId": 23,
"nextId": 25,
"suggestions": [
{
"id": 1,
@ -77,10 +77,10 @@
"id": 9,
"title": "丸子那边单子没结",
"description": "",
"status": "open",
"status": "processed",
"module": "",
"createdAt": 1780667177586,
"updatedAt": 1780667177586
"updatedAt": 1781434845037
},
{
"id": 10,
@ -149,10 +149,10 @@
"id": 17,
"title": "护眼模式开发",
"description": "",
"status": "open",
"status": "processed",
"module": "",
"createdAt": 1780833588503,
"updatedAt": 1780833588503
"updatedAt": 1781433368073
},
{
"id": 18,
@ -198,6 +198,24 @@
"module": "",
"createdAt": 1781198162366,
"updatedAt": 1781198162366
},
{
"id": 23,
"title": "建议] 目前游戏buff和debuff的时间点是根据施加者而不是接受者的回合来计算并且叠加时不会额外独立一个新的回合计数而是叠加在老的回合计数上就会导致以下问题 古明地觉3级的禁被动debuff一定无法续上 辉夜等可以给盟友有限制回合数时间buff的英雄给盟友的buff一定无法续上 如果改动上述的时间点(从施加者回合计数改为接受者回合计数),或者第二次施加给予一个独立的回合计数(,或者都做改动),就可以避免这些问题了",
"description": "建议] 目前游戏buff和debuff的时间点是根据施加者而不是接受者的回合来计算并且叠加时不会额外独立一个新的回合计数而是叠加在老的回合计数上就会导致以下问题 古明地觉3级的禁被动debuff一定无法续上 辉夜等可以给盟友有限制回合数时间buff的英雄给盟友的buff一定无法续上 如果改动上述的时间点(从施加者回合计数改为接受者回合计数),或者第二次施加给予一个独立的回合计数(,或者都做改动),就可以避免这些问题了",
"status": "open",
"module": "",
"createdAt": 1781367372364,
"updatedAt": 1781367372364
},
{
"id": 24,
"title": "芙兰复活问题",
"description": "",
"status": "open",
"module": "",
"createdAt": 1781433363044,
"updatedAt": 1781433363044
}
]
}

View File

@ -1,4 +1,27 @@
{
"nextId": 1,
"todos": []
}
"nextId": 3,
"todos": [
{
"id": 1,
"title": "THO 浙江",
"description": "",
"status": "open",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781446425181,
"updatedAt": 1781446425181
},
{
"id": 2,
"title": "discord管理员",
"description": "",
"status": "open",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1781447186517,
"updatedAt": 1781447186517
}
]
}

View File

@ -0,0 +1,44 @@
# CrashSight 成就读取检查 - 2026-06-14
## 范围
- CrashSight 项目:`01076c49ce` / `pid=10`
- 时间:`last_1_day`
- 分类ERRORstatus `0,2`
- 版本:`0.7.3f``0.7.3g`
- 本地抓取目录:
- `Temp/CrashSight/Daily_2026-06-14_0.7.3f_achievement_check`
- `Temp/CrashSight/Daily_2026-06-14_0.7.3g_achievement_check`
## 结果
| 版本 | 去重 Issue | blocking | logerror | 成就相关命中 |
|---|---:|---:|---:|---:|
| `0.7.3f` | 226 | 7 | 219 | 0 |
| `0.7.3g` | 127 | 4 | 123 | 0 |
按以下关键词检索所有 issue 的 message、keyStack、lastMatchedReport、callStack/rawStack/retrace
- `[Achievement]`
- `Achievement`
- `成就`
- `achievement.json`
- `Export/Achievement`
- `AchievementAsset`
- `AchievementDataManager`
最近 1 天未发现读取成就失败、成就 JSON 损坏、`Export/Achievement` 资源加载失败相关 CrashSight issue。
## 相关观察
历史 `0.7.2b``2026-06-01` 出现过成就文件损坏诊断:`achievement.json` 空 JSON / 读取失败,以及备份也损坏后重置数据。该路径会导致完成状态清空,但本次 `0.7.3f` / `0.7.3g` 最近 1 天没有同类上报。
当前最近 1 天有资源加载为空相关 issue但命中的是 `Assets/BundleResources/Export/Multilingual`,不是 `Export/Achievement`
## 初步判断
CrashSight 没有支持“线上普遍读取成就文件失败”的直接证据。如果玩家看到“成就里的所有都没了”,更可能是:
1. 本地 `achievement.json``.bak` 曾损坏,代码回退到默认成就并清空完成状态,但这次没有被 CrashSight 捕获到。
2. UI 分类映射或本地资源状态导致显示为 0而不是成就数据加载失败。
3. 资源包/AB 更新问题尚未表现为 `Export/Achievement` 加载失败;目前只有 `Export/Multilingual` 空加载上报。

View File

@ -0,0 +1,566 @@
# ??????????????
- ???`Tools/Multilingual.xlsx`
- ?????2026-06-14
- ?????`????=True` ? `??` ??? `????`?`????`?`????`?`????` ?????
- ?????23
## ?????
- `行动点数`?7
- `行动机会`?9
- `攻击机会`?5
- `移动机会`?3
## ??
### 1. ID 1469 / Excel ? 1422 / ???行动点数
```text
**<Demo V1.1.0>**
发布日期 25.8.8
[新增内容]
1.[新增]科技点:每回合获得科技点,科技点将被优先消耗
2.[新增]建筑:学院/军营/军港/保护区
学院:必须建造在山脉上。周围每有一座山脉+1回合科技点。周围的保护区或冶炼厂根据等级提供额外回合科技点。每座城市仅能拥有一座学院。学习"产业"科技后,学院额外提供回合金币。
保护区:必须建造在森林上。周围每拥有一片未改造的树林+1回合金币。每座城市仅能建造一座保护区。
军港为海军单位恢复所有行动点数每回合1次提供额外防御。每座城市仅能建造一座军港。
军营:能够建造军事单位,提供额外防御。每座城市仅能建造一座军营。
3.[调整]科技树:学院/产业/军港/军营/保护区/英雄
4.[调整]英雄英雄召唤不再需要耗费金币。此次仅为微小改动英雄整体改版请期待Demo V1.2版本。
5.[调整]巨人攻击4->5防御3->4
[修复bug及优化]
1.修复了突击艇击杀单位后没有位移的bug
2.修复了单位升级后攻击力降低的bug
3.修复了占领或失去城市后谷仓、锯木厂、冶炼厂、市场数据更新错误的bug
4.尝试修复了占领或失去城市后城市之间联通计算有错的bug
5.修复了快速点击地块能够额外获得两次城市经验的bug
6.修复了提示界面错误显示的bug
7.修复了部分文字错误(如姆Q的[相]职阶,美铃的[CARRIOT]职阶
8.优化了海军单位的显示,现在会显示船体运载的具体兵种
9.优化了提示的显示
10.修复了部分卡死和崩溃问题,重构了部分代码结构,提升游戏运行稳定性
```
### 2. ID 1919 / Excel ? 1872 / ???行动机会
```text
[功能版本Demo 1.3.0]
发布日期25.8.29
**<----[新增功能]----外交关系>**
- 任意两个阵营之间将拥有三种“外交关系”:结盟、中立、战争。
- 如果双方发生了任何攻击行为,立刻进入战争关系。
- 处于战争关系的双方在1回合内没有互相攻击则下一回合自动进入中立关系。
- 结盟关系则需要一方发起,另一方接受才可建立。
- 战争关系是你死我活的对抗,中立关系可能获得额外的视野和金币,结盟关系则能获得更为全面的收益。
**<----[新增功能]----结盟>**
- 学习防御科技后,可以解锁结盟的功能。
- 向一个阵营发起结盟后,下一回合对方将接受或者拒绝结盟。
- 正式结盟后,互相之间视为友军,也可以共享港口和道路。
- 盟友之间也可以发起”解除结盟“。由一方发起解除结盟后,双方的结盟关系立刻失效,但是会”强制停战”一回合,无法攻击对方。
- 率先发起解除结盟的一方,将在强制停战回合结束后,率先出手攻击”前盟友“,代价则是在发起解除结盟的那一刻,所有在对方领土上的己方单位将强制解散,而其他单位将立刻失去本回合的剩余行动机会。
- 遭遇”解除结盟“的一方,拥有一回合的喘息机会调整布局,以做好应对“前盟友”背叛的充足准备!
- 与最信赖的盟友携手,便可创造天下;但最致命的刀刃,也往往来自背后相抵的温度。谨慎地选择你的伙伴,并时刻准备好,迎接那无法预测的命运反转吧!
**<----[新增功能]----大使馆>**
- 学习大使馆科技后,可以解锁建造大使馆的功能。
- 拥有大使馆科技后,会自动获得所有已经见面的阵营原始首都的视野。
- 花费5金币可以在某个帝国的首都建立大使馆立刻获得首都周围一格的所有视野。双方每回合都会获得2金币的收益。
- 如果双方互相建立大使馆则双方每回合将拥有4金币的收益。如果双方已结盟所有收益将会翻倍。
- 建立大使馆通常能改善对方的外交策略。任何双方之间的战争将立刻撤销双方的大使馆。
- 如果对方已经丢失了原始首都,那么将无法在对方帝国建立大使馆。
- 大使馆不仅是势力间共享视野、洞察异变的哨塔,更是连通财富流脉的黄金水道。合理运用大使馆和外交策略,与你的盟友共建财富与信息的桥梁吧!
**<----[新增功能]----AI外交策略>**
- 欣赏认可观望猜忌还是敌视每个AI阵营都将拥有对于其他阵营的“外交策略”。
- 战场上的变化时刻影响着每个AI阵营对其他势力的“观点”。这些观点包含了正面、负面和中立观点它们最终构成了“外交策略”。
- 调整军事布局、发起战争、建立大使馆等行为均能有效影响对方的外交策略。纵横捭阖,操纵时局,于阴谋的棋盘上,夺取属于你的胜利吧!
**<----[新增角色立绘]----日白残无>**
拜占庭文明-日白帝国的领袖:日白残无立绘头像已实装。
昔日裁决兽畜的鬼王,如今身着君士坦丁堡的紫袍,君临拜占庭的帝座。
承继巴兹尔二世“屠夫”之名,她将以地狱的铁腕横扫帝国幻想乡,为自己戴上染血的皇冠。
**<----[Bug与优化]---->**
1.修复了连续碰到文明 可能会漏发见面礼金的bug
2.修复了移动时敌人控制区未正确生效的bug
3.修复了咲夜移动时行动力计算错误的bug
4.修复了蕾米Lv.0级血量和描述不符的bug
5.优化了首都相关的设计和显示。占领的原始首都不再显示首都icon。首都丢失后将不再拥有新的首都。
6.优化了界面显示逻辑,优化了常规通知、城市升级、外交通知的界面显示顺序
7.优化了快捷键目前WASD可以移动地图E是下一回合。今后会开放快捷键自定义系统。
8.优化了见面礼金的金额设计
9.优化了帝国和东方阵营之间的文案表达方式
```
### 3. ID 2391 / Excel ? 2344 / ???攻击机会
```text
V1.5.0版本公告
<size=36><b>[新增阵营] 斯卡雷特帝国</b></size>
红雾笼罩尼罗河两岸,神祗们指引着帝国的方向。生死在她的时计衡量,智慧在她的书页间流淌,禁忌则被她的血亲所守望。永生的法老蕾米莉亚正立于金字塔之巅,俯瞰着她的猩红王朝。
斯卡雷特帝国是一个拥有特色科技树的强大势力。
在建设方面,于尼罗河的滋养下,**<灌溉工程>**可以帮助帝国更好的利用三角洲、河岸及湖泊类的地形,建设大量农田,快速增加城市等级,喂养更多的妖精女仆人口;
在军事方面,斯卡雷特帝国的所有单位在击杀敌方后即可创造**<红雾领地>**,在领地中获得强大的吸血效果。配合**<斯卡雷特行宫>**,步步为营,蚕食他国领土,令敌人没有丝毫喘息的机会;
特色巨人单位**<小恶魔祭司>**继承了芭丝特的神祗伟力,可通过**<奉献>**为友方输送生命值,还被视作“英雄”单位,能够触发红魔馆其他英雄的组合技能。
<size=36><b>[新增英雄]斯卡雷特帝国:斯卡雷特·蕾米莉亚</b></size>
**<帝国的血之君王蕾米莉亚·斯卡雷特>**<br>
**<-------- Lv.0 -------->**<br>
**<[基础属性]>**10HP/2攻/2防/1移动力/1射程<br>
**<[能力:飞行]>**移动无视任何地形<br>
**<[能力:吸血鬼]>**攻击和反击时将20%的伤害值转化为生命值,可与**<红雾领地>**吸血效果叠加<br>
**<-------- Lv.1 -------->**<br>
**<[基础属性]>**20HP/2攻/2防/2移动力/1射程<br>
**<[能力:绯红魔法]>**1格范围内己方单位受伤后将其所在的地块转化为**<红雾领地>**<br>
**<-------- Lv.2 -------->**<br>
**<[基础属性]>**30HP/3攻/3防/2移动力/1射程<br>
**<[能力:蕾米莉亚伸展]>**攻击时为对方添加1回合**<猎物>**标记。若对方已经拥有**<猎物>**标记,本次攻击力+2并消除该标记。<br>
**<------- Lv.3 -------->**<br>
**<[基础属性]>**40HP/4攻/4防/3移动力/1射程<br>
**<[能力:绯红帝国]>**主动技能:使得周围一格内的地块全部转化为红雾领地<br>
**<[能力:绯红魔法]>**能力获得强化范围提升至2格<br>
<size=36><b>[新增英雄]斯卡雷特帝国:帕秋莉·诺蕾姬</b></size>
**<帝国的魔女帕秋莉·诺蕾姬>**<br>
**<-------- Lv.0 -------->**<br>
**<[基础属性]>**10HP/2攻/1防/1移动力/2射程<br>
**<[能力:不动的大图书馆]>**若上回合未移动本回合开始前获得1点**<体力>**。移动消耗体力(爬山消耗加倍),体力不足则会扣除生命。每点体力提供+0.5攻击力、+1防御并在回合结束自动恢复1HP。体力上限为2。<br>
**<-------- Lv.1 -------->**<br>
**<[基础属性]>**20HP/2.5攻/2防/1移动力/2射程<br>
**<[能力:贤者之石]>**回合开始时,根据地形获得魔力石。在陆地时,获得**<魔力石{}>**:可治疗友方5点HP若陆地为海岸额外获得**<魔力石{}>**:抵挡1次伤害若陆地为山脉额外获得**<魔法石{}>**:射程+1。每种魔力石上限存储1颗根据情况自动消耗。移动时若附近有己方英雄不会消耗体力<br>
**<-------- Lv.2 -------->**<br>
**<[基础属性]>**30HP/2.5攻/3防/1移动力/2射程<br>
**<[能力:贤者之石]>**贤者之石得到加强,在森林时,额外获得**<魔法石{}>**:移动力+2。在敌方领土额外获得**<魔法石{}>**:攻击+1。体力上限提升至4。<br>
**<------- Lv.3 -------->**<br>
**<[基础属性]>**40HP/3.5攻/3防/1移动力/2射程<br>
**<[能力:花阴的魔女]>**贤者之石获得的每种魔力石存储上限提升至2颗生效时效果叠加。<br>
<size=36><b>[新增英雄]斯卡雷特帝国:十六夜咲夜</b></size>
**<帝国的女仆长十六夜咲夜>**<br>
**<-------- Lv.0 -------->**<br>
**<[基础属性]>**15HP/1攻/2防/2移动力/1射程<br>
**<[能力:瞭望]>**拥有2格范围的视野<br>
**<[能力:水域通行]>**解锁对应科技后,无需通过港口即可在水域通行<br>
**<-------- Lv.1 -------->**<br>
**<[基础属性]>**25HP/2攻/2防/2移动力/1射程<br>
**<[能力:银之跳跃]>**可以移动到己方英雄1格范围内使自己获得1次攻击机会使1格范围内其他己方英雄获得**<女仆长护佑>**,所受伤害转移减半转移至咲夜。<br>
**<-------- Lv.2 -------->**<br>
**<[基础属性]>**35HP/3攻/2防/2移动力/1射程<br>
**<[能力:咲夜的世界]>**击杀单位时,可以再次使用**<银之跳跃>**<br>
**<------- Lv.3 -------->**<br>
**<[基础属性]>**45HP/4攻/3防/2移动力/1射程<br>
**<[能力:完美女仆]>**替代**<银之跳跃>**在原本效果的基础上还能使1格范围内的己方英雄获得1次攻击机会<br>
<size=36><b>[新增英雄]斯卡雷特帝国:芙兰朵露·斯卡雷特</b></size>
**<帝国的禁忌芙兰朵露·斯卡雷特>**<br>
**<-------- Lv.0 -------->**<br>
**<[基础属性]>**10HP/2攻/1防/2移动力/1射程<br>
**<[能力:连杀]>**击杀单位后再次获得攻击机会<br>
**<[能力:吸血鬼]>**攻击和反击时将20%的伤害值转化为生命值,可与**<红雾领地>**吸血效果叠加<br>
**<-------- Lv.1 -------->**<br>
**<[基础属性]>**20HP/3.5攻/2防/2移动力/1射程<br>
**<[能力:碎目]>**可以攻击己方单位(且不会被反击)<br>
**<-------- Lv.2 -------->**<br>
**<[基础属性]>**25HP/3.5攻/2防/3移动力/1射程<br>
**<[能力:莱瓦汀]>**每击杀1个单位本回合攻击力+0.5上限为3点<br>
**<------- Lv.3 -------->**<br>
**<[基础属性]>**25HP/3.5攻/2防/3移动力/1射程<br>
**<[能力:四重存在]>**场上最多存在4名**<芙兰朵露>**,共享**<莱瓦汀>**的攻击力加成<br>
<size=36><b>[新增英雄]斯卡雷特帝国:红美铃</b></size>
**<帝国之龙红美铃>**<br>
**<-------- Lv.0 -------->**<br>
**<[基础属性]>**20HP/3攻/2防/1移动力/1射程<br>
**<[能力:黄震脚]>**移动时造成范围溅射伤害<br>
**<-------- Lv.1 -------->**<br>
**<[基础属性]>**30HP/3攻/3防/1移动力/2射程<br>
**<[能力:休憩时光]>**红美铃1格范围内若存在己方英雄攻击力+1移动力+1反之防御力+1回合结束时回复2HP。<br>
**<-------- Lv.2 -------->**<br>
**<[基础属性]>**30HP/2攻/3防/2移动力/2射程<br>
**<[能力:猛虎内劲]>**受到攻击后,获得**<虎劲>**1回合(攻击力变为1.5倍)<br>
**<------- Lv.3 -------->**<br>
**<[基础属性]>**40HP/3攻/3防/2移动力/2射程<br>
**<[能力:燃烧吧红美铃]>**攻击敌方英雄时,若附近存在己方英雄,向对方施加一回合**<禁行>**,使其无法移动<br>
<size=36><b>[新增单位]小恶魔祭司</b></size>
芭丝特的神祗伟力寄于小恶魔的躯体。静谧的馆藏中,她是献上知识与安宁的温驯猫咪;当主人敕令落下,沉睡的母狮便会苏醒,焚尽一切。
小恶魔可以通过**<奉献>**,牺牲自身生命,恢复友方的生命,并获得额外的攻击机会。
<size=36><b>[新增角色立绘]博丽灵梦</b></size>
维京文明-北海帝国的领袖——博丽灵梦,立绘已实装。
从约克到哥本哈根,从奥斯陆到温彻斯特,征服北海的辽阔疆域,如同制霸幻想乡一般易如反掌。继承了征服巨浪的意志,灵梦将以巫女的直觉和征服者的铁腕,将汇聚而来的信仰、财富与怨念统统塞进奉纳箱中,让博丽之名在瓦尔哈拉永恒传唱。
<size=36><b>优化与bug修复</b></size>
1.动画功能重写,目前已经修复了各类动画表现问题(如伤害丢失)
2.部分界面bug将在V1.6版本对UI界面的重构中修复
3.地图生成方案优化,调整了水资源地块分布。
4.新增快速执行按钮。当单位可以进行城市占领、鲸鱼捕捞、升级、挖掘遗迹行为时,单位上方将浮现快速执行按钮。
5.其他已记录的bug将在后续版本中陆续修复。
6.联机模式正在测试中将于1.5.2版本放出。
```
### 4. ID 2400 / Excel ? 2353 / ???攻击机会
```text
[补丁版本Demo 1.5.1.1]
发布日期 25.10.27
--------- [优化 与 bug修复] ----------
1.修复了海洋防御加成和军港加成叠甲时防御系数与防御标识显示错误的bug
2.修复了解除结盟时芙兰在盟友领地上不会被强制解散的bug
3.修复了帕秋莉Lv2和Lv3体力恢复不生效的bug
4.修复了全科技奇观无法正常获得的bug
5.修复了蕾米的被动技能会使得水域也触发红雾领地效果的bug
6.调整了小恶魔的造型
7.修复了帕秋莉在附近时城市无法召唤美铃的bug并导致城市无法选择的bug
8.修复了Lv1以上的帕秋莉在重玩本回合后无论如何都会恢复体力的bug
9.修复了红美铃Lv2 Lv3文字描述的错误
10.修复了红美铃防御面板显示防御值加成出错的bug
11.优化了探索者的寻路逻辑, 探索者的探图步数从10提升至15
12.修复了英雄战船附近的美铃不会触发休憩时光能力的bug
13.修复了Lv3咲夜传送到友方英雄战船附近后无法使得友方英雄战船额外获得攻击机会的bug
14.修复了若干可能导致游戏卡死的bug
15.修复了Lv3咲夜击杀单位后在没有再次银之跳跃的情况下就可以连杀的bug
16.修复了市场的建筑造型不会随等级变化即时更新的bug
17.修复了挖掘遗迹获得单位时城市人口没有即时更新的bug
18.修复了阵营失败时其单位自动销毁后部分图像仍在地图中错误残留的bug
19.修复了占据他人城市时重玩本回合或者继续游戏城市的火烧特效消失的bug
20.修复了在一句游戏胜利/失败后开始下一局游戏下一回合按钮点击后不生效的bug
21.修复了单局游戏结束后战绩会存储两份的bug
22.修复了学者转化其他单位后城市人口条没有立即更新显示的bug
23.修复了解除结盟时对方的台词显示出错的bug
24.修复了AI攻击收益判定现在AI不会做出自不量力的过于愚蠢的主动攻击
```
### 5. ID 2402 / Excel ? 2355 / ???攻击机会
```text
[补丁版本Demo 1.5.1.1]
发布日期 25.10.27
--------- [优化 与 bug修复] ----------
1.修复了海洋防御加成和军港加成叠甲时防御系数与防御标识显示错误的bug
2.修复了解除结盟时芙兰在盟友领地上不会被强制解散的bug
3.修复了帕秋莉Lv2和Lv3体力恢复不生效的bug
4.修复了全科技奇观无法正常获得的bug
5.修复了蕾米的被动技能会使得水域也触发红雾领地效果的bug
6.调整了小恶魔的造型
7.修复了帕秋莉在附近时城市无法召唤美铃的bug并导致城市无法选择的bug
8.修复了Lv1以上的帕秋莉在重玩本回合后无论如何都会恢复体力的bug
9.修复了红美铃Lv2 Lv3文字描述的错误
10.修复了红美铃防御面板显示防御值加成出错的bug
11.优化了探索者的寻路逻辑, 探索者的探图步数从10提升至15
12.修复了英雄战船附近的美铃不会触发休憩时光能力的bug
13.修复了Lv3咲夜传送到友方英雄战船附近后无法使得友方英雄战船额外获得攻击机会的bug
14.修复了若干可能导致游戏卡死的bug
15.修复了Lv3咲夜击杀单位后在没有再次银之跳跃的情况下就可以连杀的bug
16.修复了市场的建筑造型不会随等级变化即时更新的bug
17.修复了挖掘遗迹获得单位时城市人口没有即时更新的bug
18.修复了阵营失败时其单位自动销毁后部分图像仍在地图中错误残留的bug
19.修复了占据他人城市时重玩本回合或者继续游戏城市的火烧特效消失的bug
20.修复了在一句游戏胜利/失败后开始下一局游戏下一回合按钮点击后不生效的bug
21.修复了单局游戏结束后战绩会存储两份的bug
22.修复了学者转化其他单位后城市人口条没有立即更新显示的bug
23.修复了解除结盟时对方的台词显示出错的bug
24.修复了AI攻击收益判定现在AI不会做出自不量力的过于愚蠢的主动攻击
25.修复了咲夜因为女仆长护佑技能死亡后留下残影的bug
```
### 6. ID 2417 / Excel ? 2370 / ???行动点数
```text
为处于军港的单位恢复所有行动点数。每回合上限一次。提供额外防御。每座城市仅能建造一座**<军港>**。
```
### 7. ID 2464 / Excel ? 2417 / ???行动机会
```text
可吸收周围1格范围内的所有红雾领地每吸收一格**<攻击力>**额外+0.5,仅本回合内生效。不消耗行动机会
```
### 8. ID 2472 / Excel ? 2425 / ???行动机会
```text
回收红雾并恢复4点生命。不消耗行动机会
```
### 9. ID 16754 / Excel ? 16707 / ???攻击机会
```text
每次投掷**<神签>**将连续掷出3枚。出现**<大吉>**即可额外获得一次攻击机会。
```
### 10. ID 16773 / Excel ? 16726 / ???移动机会
```text
消耗一层**<天狗的立风露>**,立刻获得一次移动机会
```
### 11. ID 16800 / Excel ? 16753 / ???行动机会
```text
被击杀后,击杀者恢复所有行动机会
```
### 12. ID 17036 / Excel ? 16988 / ???攻击机会, 移动机会
```text
<size=36><b>[新增阵营] 德意志文明——守矢帝国</b></size>
古老的土著神奠其根基,变革的风雨神转动工业的齿轮。八坂神奈子端坐于妖怪山的钢铁王座之上,将技术与信仰熔铸为帝国的铁与血。德意志的 雄鹰已然展翅,宣告着幻想乡新秩序的降临。
守矢帝国是一个拥科特色山脉技树和骑兵科技的强大势力。
在建设方面,守矢帝国凭借**<山神信仰>**与**<山海奇迹>**可以改变地貌创造山脉。**<守矢科学院>**与**<守矢产业>**可以帮助帝国创造连绵的群峰。而**<守矢冶炼业>**则可以允许帝国直接收获矿石或者通过勘探所发掘矿石。
在军事方面,帝国的疾风——**<天狗骑兵>**驾驭着特色技能**<山岳巡行>**,移动时无视敌人控制,将战火烧至敌人脆弱的腹地。于山巅操纵管风琴炮的**<天狗仲裁者>**则以强大的连发火力居高临下,扫除一切守矢的敌人。**<容克军官>**机制能够为久经沙场的老将提供额外的生命上限。**<天狗驿站>**在群山之间构建了庞大的后勤网络,将山脉打造为帝国的军事高速公路。弥漫着酒香的**<天狗酒馆>**则为帝国提供极其高效的军队训练场所。
特色巨人单位**<御射宫司大人>**拥有强大的攻击力量和极其灵活的身段。诹访子在其附近时,还能激活合成、分裂等特色作祟能力。
<size=36><b>**<帝国的全能神八坂神奈子>** <br></b></size>
**<-------- Lv.1 -------->** <br>
**<[基础属性]>**20HP/2攻/2防/1移动力/1射程 <br>
**<[能力:技术革新之神]>**每回合提供额外回合科技点,数额与英雄等级相同 <br>
**<[能力:山神]>**提供额外造山点数,数额与英雄等级相同 <br>
**<-------- Lv.2 -------->** <br>
**<[基础属性]>**30HP/2.5攻/2防/1移动力/1射程 <br>
**<[能力:风神]>**周围1格范围内若存在天狗酒馆移动力+1 <br>
**<[能力:战神]>**周围1格范围内若存在学院攻击+0.5 <br>
**<[能力:御柱古战场]>**可切换为御住古战场形态。该形态下无法移动,所有移动力转化为射程,移动力加成也可转化。 <br>
**<-------- Lv.3 -------->** <br>
**<[基础属性]>**40HP/3攻/3防/1移动力/1射程 <br>
**<[能力:风神]>**效果提升,周围每个天狗酒馆均能提供移动力+1 <br>
**<[能力:战神]>**效果提升,周围每个学院均能提供攻击+0.5 <br>
**<------- Lv.4 -------->** <br>
**<[基础属性]>**50HP/4攻/3防/1移动力/1射程 <br>
**<[能力:守矢的祭神]>**御住古战场形态下,全场我方英雄和御射宫司大人附近均纳入射程范围 <br>
<size=36><b>**<帝国的土著神洩矢诹访子>** <br></b></size>
**<-------- Lv.1 -------->** <br>
**<[基础属性]>**10HP/0攻/3防/3移动力/2射程 <br>
**<[能力:土著神]>**初始拥有2格视野3格移动力但只能以我方领土作为移动目标 <br>
**<[能力:祟神的首领]>**能够在空地上召唤御射宫司大人Lv.1
**<-------- Lv.2 -------->** <br>
**<[基础属性]>**20HP/0攻/3防/3移动力/2射程 <br>
**<[能力:土著神的作祟]>**在诹访子2格范围内时相同等级的御射宫司大人可以合成更高等级的单位上限Lv.5 <br>
**<-------- Lv.3 -------->** <br>
**<[基础属性]>**25HP/0攻/3防/3移动力/2射程 <br>
**<[能力:御射宫司大人的作祟]>**御射宫司大人在诹访子2格范围内死亡时分裂为两个更低等级的单位保留50%的生命值, <br>
**<------- Lv.4 -------->** <br>
**<[基础属性]>**35HP/0攻/3防/3移动力/2射程 <br>
**<[能力:就交给赤口大人吧!]>**诹访子对御射宫司大人的影响范围从2格提升至全图 <br>
<size=36><b>**<帝国的现人神东风谷早苗>** <br></b></size>
**<-------- Lv.1 -------->** <br>
**<[基础属性]>**10HP/1攻/2防/1移动力/1射程 <br>
**<[能力:风祝]>**拥有2格视野可以治疗友方。可在水域行动。移动时获得**<乘风>**1回合能够在该方向移动额外1格距离 <br>
**<[能力:逃脱]>**每回合首次攻击后恢复1点移动机会 <br>
**<-------- Lv.2 -------->** <br>
**<[基础属性]>**20HP/2攻/2防/1移动力/2射程 <br>
**<[能力:神风]>**移动结束时,使范围内所有友方获得**<乘风>**持续1回合 <br>
**<-------- Lv.3 -------->** <br>
**<[基础属性]>**30HP/2攻/3防/1移动力/2射程 <br>
**<[能力:御神签]>**治疗友方或攻击敌方时,将投掷出**<御神签>**根据抽签结果额外赋予不同的效果。若掷出大凶或大吉获得额外1次攻击机会。 <br>
**<------- Lv.4 -------->** <br>
**<[基础属性]>**40HP/3攻/3防/1移动力/2射程 <br>
**<[能力:暴乱神签连掷]>**投掷神签时将变为三连发 <br>
<size=36><b>**<帝国的最速记者射命丸文>** <br></b></size>
**<-------- Lv.1 -------->** <br>
**<[基础属性]>**10HP/2攻/1防/2移动力/1射程 <br>
**<[能力:鸦天狗巡行]>**回合开始时若处于山脉上,获得**<天狗之风>**(移动无视敌控区域)与**<天狗报当日截稿>**(移动力+1)各1回合。 <br>
**<-------- Lv.2 -------->** <br>
**<[基础属性]>**15HP/2攻/2防/2移动力/1射程 <br>
**<[能力:疾走风靡]>**移动时对移动路径附近1格内的所有单位造成溅射伤害 <br>
**<-------- Lv.3 -------->** <br>
**<[基础属性]>**20HP/3攻/2防/3移动力/1射程 <br>
**<[能力:天狗的立风露]>**可以主动消耗1层立刻恢复1次**<移动机会>**。每回合开始时重置为1层。 <br>
**<------- Lv.4 -------->** <br>
**<[基础属性]>**30HP/4攻/3防/3移动力/1射程 <br>
**<[能力:幻想风靡]>**每移动1格距离叠加1层。每满10层后转化为1层**<天狗的立风露>**。 <br>
<size=36><b>**<帝国的戍卫官犬走椛>** <br></b></size>
**<-------- Lv.1 -------->** <br>
**<[基础属性]>**20HP/3攻/2防/1移动力/1射程 <br>
**<[能力:千里眼]>**击杀单位后再次获得攻击机会 <br>
**<-------- Lv.2 -------->** <br>
**<[基础属性]>**30HP/3.5攻/2防/1移动力/1射程 <br>
**<[能力:猎物锁定]>**攻击时为目标赋予**<白狼追迹>**持续1回合 <br>
**<[能力:铁十字追击]>**以拥有**<白狼追迹>**的敌人附近为移动目标时,移动力+2 <br>
**<-------- Lv.3 -------->** <br>
**<[基础属性]>**40HP/4攻/3防/1移动力/1射程 <br>
**<[能力:红叶传令]>**回合开始时使周围1格内所有友军获得**<铁十字追击>** <br>
**<------- Lv.4 -------->** <br>
**<[基础属性]>**50HP/5攻/4防/1移动力/1射程 <br>
**<[能力:白狼的最后通牒]>****<白狼追迹>**的持续时间提升至3回合 <br>
<size=36><b>[新增单位]御射宫司大人</b></size>
由诹访子统率的祟神拥有2移动力与**<逃脱>**技能,可在水域行动,具备强大攻击力量的同时还能灵活出入战场。在诹访子附近时,激活特殊作祟能力,可进行单位合成或者分裂。
<size=36><b>[新增角色立绘]圣白莲</b></size>
英格兰文明-大英帝国的领袖——圣白莲,立绘已实装。
昔日诵经的圣僧,如今立于伦敦的雾中,俯瞰着横跨七海的钢铁舰队。她将以救世的慈悲与维新者的铁腕,让魔人经卷的光辉与工厂的黑烟一同升起,使“南无三”的梵音成为日不落帝国永恒的钟声。
<size=36><b>优化与bug修复</b></size>
1.游戏局内UI界面风格换新。
2.[联机]修复了联机房间内房间设置信息可能不同步的bug
```
### 13. ID 17054 / Excel ? 17006 / ???行动机会
```text
[补丁版本Demo 1.6.2]
发布日期 25.12.31
-------- [重要bug修复] --------
1. 修复了若干可能导致AI卡死的阻断性bug
2. 修复了城市连续升级导致升级选项卡死的bug
-------- [优化与bug修复] --------
1. 修复了继续游戏时地理信息系统可能无法正常显示的bug
2. 优化了财富奇观判定条件当财富达到100金币时会立刻提示完成奇观任务
3. 优化了排名表、顶部信息栏和倒计时图标的显示
4. 修复了在学习了道路相关科技后城市联通情况没有立刻更新的bug
5. 修复了天狗酒馆不能出阵英雄角色的bug
6. 修复了偶现城市中心的信息界面可以选择城市升级选项的bug
7. 优化了获取金币的显示
8. 修复了产业科技可能导致金币超额获取的bug
9. 修复了部分奇观的图片及文字错误的bug
10.修复了部分科技图标和技能图标现是错误的bug
11.修复了八坂神奈子Lv.4和犬走椛Lv.1英雄属性及介绍文字错误的bug
12.修复了八坂神奈子Lv.4可以攻击不处于山脉上友军附近敌方单位的bug
13.优化了科技树和左侧信息栏字体大小设定
14.修复了创造山脉后位于山脉上的单位没有开启对应视野的bug
15.修复了森林防御不能正常生效的bug
16.修复了早苗Lv.4投掷出大凶或者大吉后没有正常获得额外行动机会的bug
17.修复了森林防御和海洋防御在学习后单位的防御图标没有立即更新的bug
18.修复了诹访子在敌方城市中心召唤御射宫司大人时城市被占领状态显示不正确的bug
19.修复了左侧信息栏显示地块建筑时文字描述错误的bug
```
### 14. ID 17241 / Excel ? 17193 / ???行动点数
```text
完成击杀后消耗1层并恢复所有行动点数。提供1次效果。
```
### 15. ID 17242 / Excel ? 17194 / ???行动机会
```text
消耗行动机会,清除红雾
```
### 16. ID 17322 / Excel ? 17274 / ???行动机会
```text
击杀附有**<异端烙印>**的目标后,恢复所有行动机会,并刷新技能**<移动攻击>**
```
### 17. ID 17369 / Excel ? 17321 / ???行动机会
```text
[测试版本Beta 0.6.6]
发布日期 25.2.1
-------- [新增内容] --------
1. 新增游戏结算插画
2. 新增日文/繁中/英文/韩文的beta版本
-------- [平衡性调整] --------
1.英雄[帕秋莉·诺蕾姬]体力额外提供视野和射程初始防御调整为2。增加技能[魔女的视线]攻击敌方时获得对方周围2格视野。Lv.1升级任务调整为探索迷雾。
2.英雄[芙兰朵露·斯卡雷特]初始攻击调整为3技能[连续击杀]移至Lv.2拥有。Lv.1升级任务调整为占领1个敌方城市或2个村庄。
3.英雄[红美铃]初始防御调整为3
4.英雄[因幡帝]Lv.1升级任务调整为帝国成员挖掘2个遗迹
5.英雄[八意永琳]初始防御调整为3初始攻击调整为2
6.英雄[藤原妹红]初始防御调整为3
7.英雄[八坂神奈子]切换御柱主战场形态不再消耗行动机会
8.英雄[铃仙·优昙华院·因幡]Lv.1升级任务调整为占领1个敌方城市或2个村庄
9.[御射宫司大人]Lv.1/2/3/4/5的生命值调整为5/10/20/35/50Lv.3及以上等级不再拥有脱逃技能
10.英雄[射命丸文]初始攻击调整为3具备飞行能力。Lv.1技能[鸦天狗巡行]调整为[山岳巡行],Lv.2新增技能[猿田彦的先导]回合开始时使附近友方行动力提升。Lv.1升级任务调整为占领1个敌方城市或2个村庄。
11.英雄[犬走椛]初始防御调整为3Lv.2技能[猎物锁定]替换为技能[定罪敕令]3格内的敌方单位被任意我方单位主动攻击时将附加[异端烙印]1回合。全场只能存在1个异端烙印。Lv.2新增技能[神圣追猎]:场上存在被标记[异端烙印]的敌人时移动无视敌方控制。Lv.3新增技能[狂犬断噬]:击杀附有[异端烙印]的目标后,恢复所有行动力并刷新[移动攻击]。Lv.4技能[白狼最后通牒]调整为全场可同时存在2个[异端烙印]
12.[天狗仲裁者]的初始生命调整至10点
13.[学院]等级上限调整为5
14.[保护区]重做。每个城市首座保护区免费后续费用5金币递增。每个保护区收益浅海+1回合金币森林+1城市经验山地/深海+1回合科技。若一个2x2区域内拥有4个保护区且拥有至少3种不同的地形地貌将激活[国家公园]效果:保护区收益翻倍。
15.[守矢帝国]特色建筑[勘探所]的生效回合数调整为2回合
16.[蓬莱山帝国]初始将获得首都附近4格范围内遗迹的视野
17.[守矢帝国]初始金币数额调整为7
-------- [bug修复] --------
1. 修复了学者单位描述出错的bug
2. 修复了音量设置可能不正确的bug
3. 修复了开局可能出现上一局结算提示的bug
4. 修复了部分AI可能卡死的bug
5. 修复了战绩页面下拉选项匹配错误的bug
6. 修复了单位进入港口时战地协同debuff不会继承的bug
7. 修复了图鉴中的部分文案错误
8. 修复了部分情况下建筑等级变化时其图像没有正确变化的bug
9. 修复了可能导致AI行为怪异(一直往结界塔移动)的bug
```
### 18. ID 17440 / Excel ? 17392 / ???行动点数
```text
切换为**<御柱古战场>**形态。该形态下无法移动,所有**<移动力>**转化为**<射程>****<移动力加成>**也可转化。不消耗行动点数。
```
### 19. ID 17442 / Excel ? 17394 / ???行动点数
```text
从**<御柱古战场>**形态恢复为普通状态。不消耗行动点数。
```
### 20. ID 17868 / Excel ? 17818 / ???移动机会
```text
移动机会
```
### 21. ID 18097 / Excel ? 17944 / ???行动点数
```text
行动点数
```
### 22. ID 18824 / Excel ? 18369 / ???行动机会
```text
[Beta 0.7.0]
发布日期 26.4.10
注意本测试版本不稳定尚有较多bug将会在后续几天测试中尽快修复还请谅解
-------- [新内容] --------
1.古明地帝国上线,详情请参考游戏内介绍
2.文化值系统上线,整合了英雄、史诗、法典等模块,详情请参考游戏内介绍
-------- [新功能] --------
1.新增经典模式(30回合结束根据得分判定胜负),新增自定义模式(自定地图大小和水域占比)
2.提示系统迭代,提示文字中的关键概念将补充介绍。英雄技能说明界面整体迭代。
3.新增行动点系统(对原有“行动机会”等概念的清晰化表达)
4.新增"隐退”功能,可在对局中提前结算。
-------- [优化&bug] --------
1.优化了出生点生成逻辑
2.优化了技能上下船、变身等情况下的继承逻辑
3.修复了大量显示及逻辑bug
```
### 23. ID 21084 / Excel ? 19454 / ???行动点数
```text
治疗友方或攻击敌方时,将额外投掷御神签。若掷出**<大吉>**或者**<大凶>**则回复全部行动点数。若3次行动均为掷出**<大吉>**或**<大凶>**,下次行动必出。
```

View File

@ -4080,6 +4080,13 @@ body::after {
.sns-header-left { display: flex; align-items: baseline; gap: 12px; }
.sns-header-title { font-size: 18px; font-weight: 700; color: var(--text-primary); }
.sns-header-count { font-size: 13px; color: var(--text-muted); }
.sns-header-actions {
display: flex;
align-items: center;
gap: 10px;
flex-wrap: wrap;
justify-content: flex-end;
}
.sns-btn {
display: inline-flex;
@ -4102,6 +4109,11 @@ body::after {
border-color: var(--accent-blue);
}
.sns-btn-primary:hover { background: #2563eb; }
.sns-btn-large {
min-height: 44px;
padding: 11px 22px;
font-size: 15px;
}
/* Comment event row */
.sns-comment-row {
@ -4172,6 +4184,42 @@ body::after {
border-color: rgba(239,68,68,0.2);
}
.sns-row-meta {
flex: 1;
min-width: 0;
}
.sns-comment-main {
display: flex;
align-items: center;
gap: 10px;
min-width: 0;
}
.sns-comment-subtitle {
margin-top: 5px;
color: var(--text-muted);
font-size: 12px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.sns-view-btn {
flex-shrink: 0;
background: var(--bg-secondary);
border: 1px solid var(--border-color);
color: var(--text-primary);
font-size: 13px;
font-weight: 600;
padding: 6px 12px;
border-radius: 6px;
cursor: pointer;
transition: all 0.15s;
}
.sns-view-btn:hover {
color: #fff;
background: var(--accent-blue);
border-color: var(--accent-blue);
}
/* Empty state */
.sns-empty {
text-align: center;
@ -4180,6 +4228,76 @@ body::after {
font-size: 14px;
}
/* Discord paste dialog */
.sns-discord-modal-card {
width: 760px;
max-width: 94vw;
}
.sns-discord-help {
margin-bottom: 16px;
padding: 12px 14px;
border: 1px solid rgba(79,140,255,0.18);
border-radius: 8px;
background: rgba(79,140,255,0.08);
color: var(--text-secondary);
font-size: 13px;
line-height: 1.6;
}
.sns-discord-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 14px;
}
.sns-discord-textarea {
min-height: 300px;
font-family: Consolas, "Courier New", monospace;
font-size: 13px;
line-height: 1.55;
}
.sns-discord-submit {
min-width: 160px;
min-height: 42px;
justify-content: center;
}
.sns-discord-detail-meta {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px 16px;
margin-bottom: 14px;
color: var(--text-secondary);
font-size: 13px;
}
.sns-discord-raw {
margin: 0;
padding: 14px;
border: 1px solid var(--border-color);
border-radius: 8px;
background: var(--bg-primary);
color: var(--text-primary);
font-family: Consolas, "Courier New", monospace;
font-size: 13px;
line-height: 1.6;
white-space: pre-wrap;
word-break: break-word;
max-height: 56vh;
overflow-y: auto;
}
@media (max-width: 760px) {
.sns-header-bar {
align-items: stretch;
flex-direction: column;
gap: 12px;
}
.sns-header-actions {
justify-content: flex-start;
}
.sns-discord-grid,
.sns-discord-detail-meta {
grid-template-columns: 1fr;
}
}
/* ========== Quick Replies (常用回复) ========== */
.qr-row {
background: var(--bg-card);

View File

@ -742,10 +742,16 @@
<span class="sns-header-title">Discord评论</span>
<span class="sns-header-count" id="sns-discord-count">加载中...</span>
</div>
<button class="sns-btn sns-btn-primary" onclick="snsAutoUpdate('discord')">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M23 4v6h-6M1 20v-6h6"/><path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/></svg>
自动更新最新事件
</button>
<div class="sns-header-actions">
<button class="sns-btn sns-btn-primary sns-btn-large" onclick="snsShowDiscordPasteDialog()">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
添加 Discord 信息
</button>
<button class="sns-btn" onclick="snsAutoUpdate('discord')">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M23 4v6h-6M1 20v-6h6"/><path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/></svg>
自动更新最新事件
</button>
</div>
</div>
<div class="toolbar">
<input type="text" id="sns-discord-search" class="search-input" placeholder="搜索标题...">

View File

@ -152,6 +152,10 @@ function snsRenderCommentRow(platform, comment) {
const statusClass = isPending ? 'sns-pending' : 'sns-processed';
const statusText = isPending ? '待处理' : '已处理';
if (platform === 'discord' && (comment.rawText || comment.messageCount || comment.channel)) {
return snsRenderDiscordRow(comment, statusClass, statusText);
}
return `<div class="sns-comment-row" data-id="${comment.id}">
<span class="sns-status-badge ${statusClass}" onclick="snsToggleStatus('${platform}', ${comment.id})" title="点击切换状态">
${statusText}
@ -165,6 +169,43 @@ function snsRenderCommentRow(platform, comment) {
</div>`;
}
function snsRenderDiscordRow(comment, statusClass, statusText) {
const channel = comment.channel ? `频道: ${comment.channel}` : '频道: 未填写';
const messageCount = Number.isFinite(comment.messageCount) ? comment.messageCount : 0;
const speakers = Array.isArray(comment.speakers) && comment.speakers.length
? `发言人: ${comment.speakers.slice(0, 5).join(', ')}`
: '发言人: 未解析';
const timeText = snsFormatDate(comment.createdAt || comment.timestamp || comment.updatedAt);
const note = comment.note ? `备注: ${comment.note}` : '';
const subtitle = [channel, `${messageCount} 条消息`, speakers, timeText, note].filter(Boolean).join(' · ');
return `<div class="sns-comment-row" data-id="${comment.id}">
<span class="sns-status-badge ${statusClass}" onclick="snsToggleStatus('discord', ${comment.id})" title="点击切换状态">
${statusText}
</span>
<div class="sns-row-meta">
<div class="sns-comment-main">
<span class="sns-comment-title" title="${escHtml(comment.title)}">
${escHtml(comment.title || '(无标题)')}
</span>
</div>
<div class="sns-comment-subtitle" title="${escHtml(subtitle)}">${escHtml(subtitle)}</div>
</div>
<button class="sns-view-btn" onclick="snsShowDiscordDetail(${comment.id})" title="查看原文">查看</button>
<button class="sns-delete-btn" onclick="snsDeleteComment('discord', ${comment.id})" title="删除">
删除
</button>
</div>`;
}
function snsFormatDate(value) {
if (!value) return '';
const date = new Date(value);
if (Number.isNaN(date.getTime())) return '';
const pad = n => String(n).padStart(2, '0');
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}`;
}
// ════════════════════════════════════════════
// 状态切换
// ════════════════════════════════════════════
@ -289,6 +330,158 @@ async function snsFetchSteamDiscussions() {
}
}
// ════════════════════════════════════════════
// Discord手动粘贴入库
// ════════════════════════════════════════════
function snsShowDiscordPasteDialog() {
const existing = document.getElementById('sns-discord-paste-modal');
if (existing) existing.remove();
const overlay = document.createElement('div');
overlay.id = 'sns-discord-paste-modal';
overlay.className = 'qr-modal';
overlay.innerHTML = `
<div class="qr-modal-card sns-discord-modal-card">
<div class="qr-modal-header">
<div class="qr-modal-title">添加 Discord 信息</div>
<button class="qr-modal-close" onclick="this.closest('.qr-modal').remove()">&times;</button>
</div>
<div class="qr-modal-body">
<div class="sns-discord-help">
Discord 复制一段频道聊天后粘贴到下方工具会保存完整原文并尽量解析发言人和消息数量方便后续做管理员候选人分析
</div>
<div class="sns-discord-grid">
<div>
<label class="qr-field-label">标题 *</label>
<input id="sns-discord-title" class="qr-input" type="text" placeholder="例如:韩语频道 bot 处理 / 管理员候选人观察">
</div>
<div>
<label class="qr-field-label">频道 / 来源</label>
<input id="sns-discord-channel" class="qr-input" type="text" placeholder="例如:#kr-general">
</div>
</div>
<label class="qr-field-label">备注</label>
<input id="sns-discord-note" class="qr-input" type="text" placeholder="可选:这段聊天为什么重要">
<label class="qr-field-label">Discord 原始复制文本 *</label>
<textarea id="sns-discord-raw" class="qr-textarea sns-discord-textarea" placeholder="把 Discord 复制出来的完整聊天粘贴在这里..."></textarea>
</div>
<div class="qr-modal-footer">
<button class="sns-btn" onclick="snsClearDiscordPasteForm()">清空</button>
<button class="sns-btn" onclick="document.getElementById('sns-discord-paste-modal').remove()">取消</button>
<button id="sns-discord-submit" class="sns-btn sns-btn-primary sns-discord-submit" onclick="snsSubmitDiscordPaste()">提交入库</button>
</div>
</div>
`;
document.body.appendChild(overlay);
overlay.addEventListener('click', e => {
if (e.target === overlay) overlay.remove();
});
const titleInput = document.getElementById('sns-discord-title');
if (titleInput) titleInput.focus();
}
function snsClearDiscordPasteForm() {
['sns-discord-title', 'sns-discord-channel', 'sns-discord-note', 'sns-discord-raw'].forEach(id => {
const el = document.getElementById(id);
if (el) el.value = '';
});
const titleInput = document.getElementById('sns-discord-title');
if (titleInput) titleInput.focus();
}
async function snsSubmitDiscordPaste() {
const title = (document.getElementById('sns-discord-title')?.value || '').trim();
const channel = (document.getElementById('sns-discord-channel')?.value || '').trim();
const note = (document.getElementById('sns-discord-note')?.value || '').trim();
const rawText = (document.getElementById('sns-discord-raw')?.value || '').trim();
if (!title) {
showToast('请填写标题', 'error');
return;
}
if (!rawText) {
showToast('请粘贴 Discord 原文', 'error');
return;
}
const submitBtn = document.getElementById('sns-discord-submit');
if (submitBtn) {
submitBtn.disabled = true;
submitBtn.textContent = '提交中...';
}
try {
const resp = await fetch('/api/sns/discord/paste', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ title, channel, note, rawText })
});
const result = await resp.json();
if (!resp.ok || !result.success) {
throw new Error(result.error || '保存失败');
}
const overlay = document.getElementById('sns-discord-paste-modal');
if (overlay) overlay.remove();
await snsLoadPlatform('discord');
showToast(`已入库:${result.comment?.messageCount || 0} 条消息`, 'success');
} catch (e) {
showToast('入库失败: ' + e.message, 'error');
} finally {
if (submitBtn) {
submitBtn.disabled = false;
submitBtn.textContent = '提交入库';
}
}
}
function snsShowDiscordDetail(id) {
const data = snsData.discord;
const comment = data && data.comments ? data.comments.find(c => c.id === id) : null;
if (!comment) {
showToast('未找到这条 Discord 记录', 'error');
return;
}
const existing = document.getElementById('sns-discord-detail-modal');
if (existing) existing.remove();
const speakers = Array.isArray(comment.speakers) && comment.speakers.length
? comment.speakers.join(', ')
: '未解析';
const overlay = document.createElement('div');
overlay.id = 'sns-discord-detail-modal';
overlay.className = 'qr-modal';
overlay.innerHTML = `
<div class="qr-modal-card sns-discord-modal-card">
<div class="qr-modal-header">
<div class="qr-modal-title">${escHtml(comment.title || 'Discord 记录')}</div>
<button class="qr-modal-close" onclick="this.closest('.qr-modal').remove()">&times;</button>
</div>
<div class="qr-modal-body">
<div class="sns-discord-detail-meta">
<div><strong>频道</strong>${escHtml(comment.channel || '')}</div>
<div><strong>消息数</strong>${escHtml(String(comment.messageCount || 0))}</div>
<div><strong>入库时间</strong>${escHtml(snsFormatDate(comment.createdAt))}</div>
<div><strong>发言人</strong>${escHtml(speakers)}</div>
</div>
${comment.note ? `<div class="sns-discord-help">${escHtml(comment.note)}</div>` : ''}
<pre class="sns-discord-raw">${escHtml(comment.rawText || '')}</pre>
</div>
<div class="qr-modal-footer">
<button class="sns-btn" onclick="document.getElementById('sns-discord-detail-modal').remove()">关闭</button>
</div>
</div>
`;
document.body.appendChild(overlay);
overlay.addEventListener('click', e => {
if (e.target === overlay) overlay.remove();
});
}
function snsCreateLoadingModal(message) {
const modal = document.createElement('div');
modal.className = 'sns-loading-modal';

View File

@ -1794,7 +1794,7 @@ class DashboardHandler(http.server.SimpleHTTPRequestHandler):
def _get_sns_platform(self, path):
"""Extract platform name from /api/sns/{platform}..."""
parts = path.split('/')
parts = urlparse(path).path.split('/')
if len(parts) >= 4:
return parts[3]
return None
@ -1853,6 +1853,8 @@ class DashboardHandler(http.server.SimpleHTTPRequestHandler):
self._handle_sns_update(platform)
elif path.endswith('/delete'):
self._handle_sns_delete(platform)
elif path.endswith('/paste'):
self._handle_sns_paste(platform)
elif path.endswith('/fetch'):
self._handle_sns_fetch(platform)
elif path.endswith('/bulk-create'):
@ -1919,6 +1921,135 @@ class DashboardHandler(http.server.SimpleHTTPRequestHandler):
except Exception as e:
self._send_json({'success': False, 'error': str(e)}, 500)
def _handle_sns_paste(self, platform):
"""Create a manually pasted SNS record."""
if platform != 'discord':
self._send_json({'success': False, 'error': 'Paste import is only supported for Discord'}, 400)
return
try:
length = int(self.headers.get('Content-Length', 0))
raw = self.rfile.read(length)
payload = json.loads(raw.decode('utf-8'))
title = (payload.get('title') or '').strip()
channel = (payload.get('channel') or '').strip()
note = (payload.get('note') or '').strip()
raw_text = (payload.get('rawText') or '').strip()
if not title:
self._send_json({'success': False, 'error': 'Title required'}, 400)
return
if not raw_text:
self._send_json({'success': False, 'error': 'Discord raw text required'}, 400)
return
parsed_messages = self._parse_discord_paste(raw_text)
speakers = []
for msg in parsed_messages:
author = msg.get('author')
if author and author not in speakers:
speakers.append(author)
sns_data = self._load_sns_data(platform)
comments = sns_data.get('comments', [])
next_id = sns_data.get('nextId', 1)
now = int(time.time() * 1000)
comment = {
'id': next_id,
'title': title,
'status': 'pending',
'source': 'discord-paste',
'channel': channel,
'note': note,
'rawText': raw_text,
'parsedMessages': parsed_messages,
'messageCount': len(parsed_messages) if parsed_messages else self._count_discord_paste_lines(raw_text),
'speakers': speakers,
'timestamp': now,
'createdAt': now,
'updatedAt': now
}
comments.append(comment)
sns_data['comments'] = comments
sns_data['nextId'] = next_id + 1
self._save_sns_data(platform, sns_data)
self._send_json({'success': True, 'comment': comment})
except Exception as e:
self._send_json({'success': False, 'error': str(e)}, 500)
def _parse_discord_paste(self, raw_text):
"""Best-effort parser for copied Discord channel text."""
import re
lines = [line.rstrip() for line in raw_text.replace('\r\n', '\n').replace('\r', '\n').split('\n')]
messages = []
current = None
patterns = [
re.compile(r'^(?P<author>.+?)\s+(?P<date>\d{4}/\d{1,2}/\d{1,2})\s+(?P<time>\d{1,2}:\d{2})(?:\s*(?P<content>.*))?$'),
re.compile(r'^(?P<author>.+?)\s+(?P<date>\d{4}-\d{1,2}-\d{1,2})\s+(?P<time>\d{1,2}:\d{2})(?:\s*(?P<content>.*))?$'),
re.compile(r'^\[(?P<date>\d{4}-\d{1,2}-\d{1,2})\s+(?P<time>\d{1,2}:\d{2}(?::\d{2})?)\]\s*(?P<author>[^:]+):\s*(?P<content>.*)$'),
re.compile(r'^(?P<date>\d{4}-\d{1,2}-\d{1,2})\s+(?P<time>\d{1,2}:\d{2}(?::\d{2})?)\s*\|\s*(?P<author>[^:]+):\s*(?P<content>.*)$'),
]
def push_current():
if not current:
return
content = '\n'.join(current.get('contentLines', [])).strip()
messages.append({
'author': current.get('author', '').strip(),
'date': current.get('date', '').strip(),
'time': current.get('time', '').strip(),
'content': content
})
for line in lines:
stripped = line.strip()
if not stripped:
if current and current.get('contentLines'):
current['contentLines'].append('')
continue
match = None
for pattern in patterns:
match = pattern.match(stripped)
if match:
break
if match:
push_current()
groups = match.groupdict()
content = groups.get('content') or ''
current = {
'author': groups.get('author') or '',
'date': groups.get('date') or '',
'time': groups.get('time') or '',
'contentLines': [content] if content else []
}
elif current:
current['contentLines'].append(line)
else:
current = {
'author': '',
'date': '',
'time': '',
'contentLines': [line]
}
push_current()
return [
msg for msg in messages
if msg.get('author') or msg.get('content')
]
def _count_discord_paste_lines(self, raw_text):
lines = [line.strip() for line in raw_text.splitlines()]
return len([line for line in lines if line])
def _handle_sns_fetch(self, platform):
"""Fetch new discussions from Steam Community."""
if platform != 'steam':

View File

@ -0,0 +1,4 @@
[API] "GET /api/devplan/list?t=1781448916680 HTTP/1.1" 200 -
[API] "GET /api/marketing/events?t=1781448916680 HTTP/1.1" 200 -
[API] "GET /api/todos/list?t=1781448916680 HTTP/1.1" 200 -
[API] "GET /api/bugs/list?t=1781448916680 HTTP/1.1" 200 -

View File

@ -0,0 +1,13 @@
[API] "GET /api/devplan/list?t=1781448774357 HTTP/1.1" 200 -
[API] "GET /api/bugs/list?t=1781448774358 HTTP/1.1" 200 -
[API] "GET /api/marketing/events?t=1781448774358 HTTP/1.1" 200 -
[API] "GET /api/todos/list?t=1781448774358 HTTP/1.1" 200 -
[API] "GET /api/sns/steam?t=1781448804764 HTTP/1.1" 200 -
[API] "GET /api/devplan/list?t=1781448804885 HTTP/1.1" 200 -
[API] "GET /api/marketing/events?t=1781448804885 HTTP/1.1" 200 -
[API] "GET /api/bugs/list?t=1781448804885 HTTP/1.1" 200 -
[API] "GET /api/todos/list?t=1781448804885 HTTP/1.1" 200 -
[API] "GET /api/sns/discord?t=1781448805238 HTTP/1.1" 200 -
[API] "POST /api/sns/discord/paste HTTP/1.1" 200 -
[API] "GET /api/sns/discord?t=1781448819374 HTTP/1.1" 200 -
[API] "POST /api/sns/discord/delete HTTP/1.1" 200 -

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -2583,11 +2583,11 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u6355\u9C7C"
Desc: "\u6536\u83B7**<\u9C7C\u7FA4>**\u8D44\u6E90\uFF0C\u5E76\u83B7\u5F971\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u6536\u83B7**<\u9C7C\u7FA4>**\u8D44\u6E90\uFF0C\u5E76\u83B7\u5F971\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 1
LockDesc: "\u5B66\u4E60**<\u6355\u9C7C>**\u79D1\u6280\u540E\u53EF\u6267\u884C\u3002\u6536\u83B7**<\u9C7C\u7FA4>**\u8D44\u6E90\uFF0C\u5E76\u83B7\u5F971\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
LockDesc: "\u5B66\u4E60**<\u6355\u9C7C>**\u79D1\u6280\u540E\u53EF\u6267\u884C\u3002\u6536\u83B7**<\u9C7C\u7FA4>**\u8D44\u6E90\uFF0C\u5E76\u83B7\u5F971\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Icon: {fileID: 21300000, guid: d7b0a16ac6f53ad4b8820d8c295c6bc1, type: 3}
IconViewSizeType: 4
VarientIcon: 0
@ -2617,11 +2617,11 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u91C7\u96C6"
Desc: "\u6536\u83B7**<\u852C\u679C>**\u8D44\u6E90\uFF0C\u5E76\u83B7\u5F971\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u6536\u83B7**<\u852C\u679C>**\u8D44\u6E90\uFF0C\u5E76\u83B7\u5F971\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 1
LockDesc: "\u5B66\u4E60**<\u91C7\u96C6>**\u79D1\u6280\u540E\u53EF\u6267\u884C\u3002\u6536\u83B7**<\u852C\u679C>**\u8D44\u6E90\uFF0C\u5E76\u83B7\u5F971\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
LockDesc: "\u5B66\u4E60**<\u91C7\u96C6>**\u79D1\u6280\u540E\u53EF\u6267\u884C\u3002\u6536\u83B7**<\u852C\u679C>**\u8D44\u6E90\uFF0C\u5E76\u83B7\u5F971\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Icon: {fileID: 0}
IconViewSizeType: 4
VarientIcon: 1
@ -2898,11 +2898,11 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u72E9\u730E"
Desc: "\u6536\u83B7**<\u52A8\u7269>**\u8D44\u6E90\uFF0C\u5E76\u83B7\u5F971\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u6536\u83B7**<\u52A8\u7269>**\u8D44\u6E90\uFF0C\u5E76\u83B7\u5F971\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 1
LockDesc: "\u5B66\u4E60**<\u72E9\u730E>**\u79D1\u6280\u540E\u53EF\u6267\u884C\u3002\u6536\u83B7**<\u52A8\u7269>**\u8D44\u6E90\uFF0C\u5E76\u83B7\u5F971\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
LockDesc: "\u5B66\u4E60**<\u72E9\u730E>**\u79D1\u6280\u540E\u53EF\u6267\u884C\u3002\u6536\u83B7**<\u52A8\u7269>**\u8D44\u6E90\uFF0C\u5E76\u83B7\u5F971\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Icon: {fileID: 0}
IconViewSizeType: 4
VarientIcon: 1
@ -3166,7 +3166,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u5EFA\u9020\u519C\u7530"
Desc: "\u5C06**<\u5E84\u7A3C>**\u5EFA\u9020\u4E3A**<\u519C\u7530>**\uFF0C\u53EF\u63D0\u4F9B2\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u5C06**<\u5E84\u7A3C>**\u5EFA\u9020\u4E3A**<\u519C\u7530>**\uFF0C\u53EF\u63D0\u4F9B2\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -3200,7 +3200,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u5EFA\u9020\u91C7\u77FF\u573A"
Desc: "\u5C06**<\u91D1\u77FF>**\u5EFA\u9020\u4E3A**<\u91C7\u77FF\u573A>**\uFF0C\u63D0\u4F9B2\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u5C06**<\u91D1\u77FF>**\u5EFA\u9020\u4E3A**<\u91C7\u77FF\u573A>**\uFF0C\u63D0\u4F9B2\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -3234,7 +3234,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u5EFA\u9020\u4F10\u6728\u573A"
Desc: "\u5728**<\u68EE\u6797>**\u4E0A\u5EFA\u9020**<\u4F10\u6728\u573A>**\uFF0C\u63D0\u4F9B1\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002\u6CE8\u610F\uFF0C\u4F1A\u6E05\u9664\u68EE\u6797\u4E2D\u7684\u52A8\u7269\u3002"
Desc: "\u5728**<\u68EE\u6797>**\u4E0A\u5EFA\u9020**<\u4F10\u6728\u573A>**\uFF0C\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u6CE8\u610F\uFF0C\u4F1A\u6E05\u9664\u68EE\u6797\u4E2D\u7684\u52A8\u7269\u3002"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -3268,7 +3268,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u5EFA\u9020\u6E2F\u53E3"
Desc: "\u5728**<\u6D45\u6D77>**\u5EFA\u9020**<\u6E2F\u53E3>**\uFF0C\u53EF\u63D0\u4F9B1\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002\u80FD\u591F\u5C06\u666E\u901A\u5355\u4F4D\u8F6C\u5316\u4E3A\u6D77\u4E0A\u5355\u4F4D\uFF0C\u540C\u65F6\u80FD\u591F\u5EFA\u7ACB**<\u6D77\u6D0B\u8D38\u6613\u901A\u8DEF>**\u3002"
Desc: "\u5728**<\u6D45\u6D77>**\u5EFA\u9020**<\u6E2F\u53E3>**\uFF0C\u53EF\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u80FD\u591F\u5C06\u666E\u901A\u5355\u4F4D\u8F6C\u5316\u4E3A\u6D77\u4E0A\u5355\u4F4D\uFF0C\u540C\u65F6\u80FD\u591F\u5EFA\u7ACB**<\u6D77\u6D0B\u8D38\u6613\u901A\u8DEF>**\u3002"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -3336,7 +3336,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u5EFA\u9020\u8C37\u4ED3"
Desc: "**<\u8C37\u4ED3>**\u5468\u56F4\u6BCF\u7247**<\u519C\u7530>**\u53EF\u4EE5\u63D0\u4F9B1\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u62E5\u6709\u4E00\u4E2A**<\u8C37\u4ED3>**"
Desc: "**<\u8C37\u4ED3>**\u5468\u56F4\u6BCF\u7247**<\u519C\u7530>**\u53EF\u4EE5\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u62E5\u6709\u4E00\u4E2A**<\u8C37\u4ED3>**"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -3370,7 +3370,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u5EFA\u9020\u952F\u6728\u5382"
Desc: "**<\u952F\u6728\u5382>**\u5468\u56F4\u6BCF\u5EA7**<\u4F10\u6728\u573A>**\u53EF\u4EE5\u63D0\u4F9B1\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u62E5\u6709\u4E00\u4E2A**<\u952F\u6728\u5382>**\u3002"
Desc: "**<\u952F\u6728\u5382>**\u5468\u56F4\u6BCF\u5EA7**<\u4F10\u6728\u573A>**\u53EF\u4EE5\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u62E5\u6709\u4E00\u4E2A**<\u952F\u6728\u5382>**\u3002"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -3404,7 +3404,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u5EFA\u9020\u51B6\u70BC\u5382"
Desc: "**<\u51B6\u70BC\u5382>**\u5468\u56F4\u6BCF\u5EA7**<\u91C7\u77FF\u573A>**\u53EF\u4EE5\u63D0\u4F9B2\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u62E5\u6709\u4E00\u4E2A**<\u51B6\u70BC\u5382>**"
Desc: "**<\u51B6\u70BC\u5382>**\u5468\u56F4\u6BCF\u5EA7**<\u91C7\u77FF\u573A>**\u53EF\u4EE5\u63D0\u4F9B2\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u62E5\u6709\u4E00\u4E2A**<\u51B6\u70BC\u5382>**"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -4121,7 +4121,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u519B\u6E2F"
Desc: "\u4E3A\u5904\u4E8E\u519B\u6E2F\u7684\u5355\u4F4D\u6062\u590D\u6240\u6709\u884C\u52A8\u70B9\u6570\u3002\u6BCF\u56DE\u5408\u4E0A\u9650\u4E00\u6B21\u3002\u63D0\u4F9B\u989D\u5916\u9632\u5FA1\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u5EFA\u9020\u4E00\u5EA7**<\u519B\u6E2F>**\u3002"
Desc: "\u4E3A\u5904\u4E8E\u519B\u6E2F\u7684**<\u8239\u53EA\u5355\u4F4D>**\u6062\u590D1\u70B9**<\u901A\u7528\u884C\u52A8\u70B9>**\u3002\u6BCF\u56DE\u5408\u4E0A\u9650\u4E00\u6B21\u3002\u63D0\u4F9B\u989D\u5916\u9632\u5FA1\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u5EFA\u9020\u4E00\u5EA7**<\u519B\u6E2F>**\u3002"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -4155,7 +4155,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u4FDD\u62A4\u533A"
Desc: "\u63D0\u4F9B\u91D1\u5E01(\u6D45\u6D77)/\u57CE\u5E02\u7ECF\u9A8C(\u68EE\u6797)\u6216\u79D1\u6280\u70B9\u3002\u82E54\u4E2A\u4FDD\u62A4\u533A\u56F4\u6210\u4E00\u5708\u4E14\u62E5\u6709\u81F3\u5C113\u79CD\u4E0D\u540C\u7C7B\u578B\uFF0C\u5219\u6536\u76CA\u7FFB\u500D\u3002"
Desc: "\u63D0\u4F9B\u91D1\u5E01(\u6D45\u6D77)/**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**(\u68EE\u6797)\u6216\u79D1\u6280\u70B9\u3002\u82E54\u4E2A\u4FDD\u62A4\u533A\u56F4\u6210\u4E00\u5708\u4E14\u62E5\u6709\u81F3\u5C113\u79CD\u4E0D\u540C\u7C7B\u578B\uFF0C\u5219\u6536\u76CA\u7FFB\u500D\u3002"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -7247,7 +7247,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u5EFA\u9020\u548C\u5E73\u5947\u89C2"
Desc: "\u5EFA\u9020\u548C\u5E73\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u5EFA\u9020\u548C\u5E73\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -7346,7 +7346,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u5EFA\u9020\u667A\u6167\u5947\u89C2"
Desc: "\u5EFA\u9020\u667A\u6167\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u5EFA\u9020\u667A\u6167\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -7445,7 +7445,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u5EFA\u9020\u8D38\u6613\u5947\u89C2"
Desc: "\u5EFA\u9020\u8D38\u6613\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C"
Desc: "\u5EFA\u9020\u8D38\u6613\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -7544,7 +7544,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u5EFA\u9020\u8D22\u5BCC\u5947\u89C2"
Desc: "\u5EFA\u9020\u8D22\u5BCC\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C"
Desc: "\u5EFA\u9020\u8D22\u5BCC\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -7643,7 +7643,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u5EFA\u9020\u6743\u529B\u5947\u89C2"
Desc: "\u5EFA\u9020\u6743\u529B\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C"
Desc: "\u5EFA\u9020\u6743\u529B\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -7742,7 +7742,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u5EFA\u9020\u6587\u5316\u5947\u89C2"
Desc: "\u5EFA\u9020\u6587\u5316\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C"
Desc: "\u5EFA\u9020\u6587\u5316\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -7841,7 +7841,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u5EFA\u9020\u63A2\u7D22\u5947\u89C2"
Desc: "\u5EFA\u9020\u63A2\u7D22\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C"
Desc: "\u5EFA\u9020\u63A2\u7D22\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -9742,7 +9742,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u704C\u6E89\u5DE5\u7A0B"
Desc: "\u5EFA\u9020**<\u704C\u6E89\u5DE5\u7A0B>**\u3002\u4E0D\u80FD\u4E0E\u53E6\u4E00\u4E2A\u704C\u6E89\u5DE5\u7A0B\u76F8\u90BB\u3002\u6BCF3\u56DE\u5408\u5728\u9644\u8FD1\u751F\u6210\u4E00\u7247\u5E84\u7A3C\u3002\u9644\u8FD1\u6BCF\u7247\u519C\u7530\u989D\u5916\u63D0\u4F9B1\u70B9\u57CE\u5E02\u7ECF\u9A8C(\u4E0A\u96502\u70B9)\uFF0C\u4E3A\u5E02\u573A\u63D0\u4F9B\u989D\u5916\u91D1\u5E01\u3002\u7814\u53D1**<\u704C\u6E89>**\u53EF\u5EFA\u9020\u5728\u4E0E\u4E24\u7247\u6C34\u57DF**<\u76F4\u63A5\u76F8\u90BB>**\u7684\u5E73\u539F\u4E0A\u3002\u7814\u53D1**<\u6392\u6D9D>**\u540E\uFF0C\u53EF\u4EE5\u5EFA\u9020\u5728\u4E0E\u4E24\u7247\u9646\u5730**<\u76F4\u63A5\u76F8\u90BB>**\u7684\u6C34\u57DF\u4E2D\u3002"
Desc: "\u5EFA\u9020**<\u704C\u6E89\u5DE5\u7A0B>**\u3002\u4E0D\u80FD\u4E0E\u53E6\u4E00\u4E2A\u704C\u6E89\u5DE5\u7A0B\u76F8\u90BB\u3002\u6BCF3\u56DE\u5408\u5728\u9644\u8FD1\u751F\u6210\u4E00\u7247\u5E84\u7A3C\u3002\u9644\u8FD1\u6BCF\u7247\u519C\u7530\u989D\u5916\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**(\u4E0A\u96502\u70B9)\uFF0C\u4E3A\u5E02\u573A\u63D0\u4F9B\u989D\u5916\u91D1\u5E01\u3002\u7814\u53D1**<\u704C\u6E89>**\u53EF\u5EFA\u9020\u5728\u4E0E\u4E24\u7247\u6C34\u57DF**<\u76F4\u63A5\u76F8\u90BB>**\u7684\u5E73\u539F\u4E0A\u3002\u7814\u53D1**<\u6392\u6D9D>**\u540E\uFF0C\u53EF\u4EE5\u5EFA\u9020\u5728\u4E0E\u4E24\u7247\u9646\u5730**<\u76F4\u63A5\u76F8\u90BB>**\u7684\u6C34\u57DF\u4E2D\u3002"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -9776,7 +9776,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u7EA2\u8272\u4E0D\u591C\u57CE"
Desc: "\u53EF\u5438\u6536\u5468\u56F41\u683C\u8303\u56F4\u5185\u7684\u6240\u6709\u7EA2\u96FE\u9886\u5730\uFF0C\u6BCF\u5438\u6536\u4E00\u683C\uFF0C**<\u653B\u51FB\u529B>**\u989D\u5916+0.5\uFF0C\u4EC5\u672C\u56DE\u5408\u5185\u751F\u6548\u3002\u4E0D\u6D88\u8017\u884C\u52A8\u673A\u4F1A"
Desc: "\u53EF\u5438\u6536\u5468\u56F41\u683C\u8303\u56F4\u5185\u7684\u6240\u6709\u7EA2\u96FE\u9886\u5730\uFF0C\u6BCF\u5438\u6536\u4E00\u683C\uFF0C**<\u653B\u51FB\u529B>**\u989D\u5916+0.5\uFF0C\u4EC5\u672C\u56DE\u5408\u5185\u751F\u6548\u3002\u4E0D\u6D88\u8017**<\u884C\u52A8\u70B9>**"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -9810,7 +9810,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u56DE\u6536\u7EA2\u96FE"
Desc: "\u56DE\u6536\u7EA2\u96FE\u5E76\u6062\u590D4\u70B9\u751F\u547D\u3002\u4E0D\u6D88\u8017\u884C\u52A8\u673A\u4F1A"
Desc: "\u56DE\u6536\u7EA2\u96FE\u5E76\u6062\u590D4\u70B9\u751F\u547D\u3002\u4E0D\u6D88\u8017**<\u884C\u52A8\u70B9>**"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -9844,7 +9844,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u6E05\u9664\u7EA2\u96FE"
Desc: "\u6D88\u8017\u884C\u52A8\u673A\u4F1A\uFF0C\u6E05\u9664\u7EA2\u96FE"
Desc: "\u6E05\u9664\u7EA2\u96FE\u5730\u5757"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -10456,7 +10456,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u5FA1\u67F1\u53E4\u6218\u573A"
Desc: "\u5207\u6362\u4E3A**<\u5FA1\u67F1\u53E4\u6218\u573A>**\u5F62\u6001\u3002\u8BE5\u5F62\u6001\u4E0B\u65E0\u6CD5\u79FB\u52A8\uFF0C\u6240\u6709**<\u79FB\u52A8\u529B>**\u8F6C\u5316\u4E3A**<\u5C04\u7A0B>**\uFF0C**<\u79FB\u52A8\u529B\u52A0\u6210>**\u4E5F\u53EF\u8F6C\u5316\u3002\u4E0D\u6D88\u8017\u884C\u52A8\u70B9\u6570\u3002"
Desc: "\u5207\u6362\u4E3A**<\u5FA1\u67F1\u53E4\u6218\u573A>**\u5F62\u6001\u3002\u8BE5\u5F62\u6001\u4E0B\u65E0\u6CD5\u79FB\u52A8\uFF0C\u6240\u6709**<\u79FB\u52A8\u529B>**\u8F6C\u5316\u4E3A**<\u5C04\u7A0B>**\uFF0C**<\u79FB\u52A8\u529B\u52A0\u6210>**\u4E5F\u53EF\u8F6C\u5316\u3002\u4E0D\u6D88\u8017**<\u884C\u52A8\u70B9>**\u3002"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -10490,7 +10490,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u89E3\u9664\u53E4\u6218\u573A"
Desc: "\u4ECE**<\u5FA1\u67F1\u53E4\u6218\u573A>**\u5F62\u6001\u6062\u590D\u4E3A\u666E\u901A\u72B6\u6001\u3002\u4E0D\u6D88\u8017\u884C\u52A8\u70B9\u6570\u3002"
Desc: "\u4ECE**<\u5FA1\u67F1\u53E4\u6218\u573A>**\u5F62\u6001\u6062\u590D\u4E3A\u666E\u901A\u72B6\u6001\u3002\u4E0D\u6D88\u8017**<\u884C\u52A8\u70B9>**\u3002"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -10524,7 +10524,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u5929\u72D7\u7684\u7ACB\u98CE\u9732"
Desc: "\u6D88\u8017\u4E00\u5C42**<\u5929\u72D7\u7684\u7ACB\u98CE\u9732>**\uFF0C\u7ACB\u523B\u83B7\u5F97\u4E00\u6B21\u79FB\u52A8\u673A\u4F1A"
Desc: "\u6D88\u8017\u4E00\u5C42**<\u5929\u72D7\u7684\u7ACB\u98CE\u9732>**\uFF0C\u7ACB\u523B\u83B7\u5F971\u70B9**<\u79FB\u52A8\u884C\u52A8\u70B9>**"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -10793,7 +10793,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u884C\u653F\u4E2D\u5FC3"
Desc: "\u5EFA\u7ACB**<\u884C\u653F\u4E2D\u5FC3>**\uFF0C\u7740\u91CD\u4E8E\u57CE\u5E02\u751F\u4EA7\u6548\u7387\uFF0C\u83B7\u5F973\u70B9\u57CE\u5E02\u7ECF\u9A8C"
Desc: "\u5EFA\u7ACB**<\u884C\u653F\u4E2D\u5FC3>**\uFF0C\u7740\u91CD\u4E8E\u57CE\u5E02\u751F\u4EA7\u6548\u7387\uFF0C\u83B7\u5F973\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -11504,7 +11504,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: "\u7518\u5473\u6797\u4E4B\u706B"
Desc: "\u5C06**<\u91D1\u521A\u8EAB>**\u5168\u90E8\u8F6C\u5316\u4E3A\u5F53\u524D\u6240\u5904\u57CE\u5E02\u7684**<\u57CE\u5E02\u7ECF\u9A8C>**\u3002\u4E0D\u6D88\u8017**<\u884C\u52A8\u70B9>**"
Desc: "\u5C06**<\u91D1\u521A\u8EAB>**\u5168\u90E8\u8F6C\u5316\u4E3A\u5F53\u524D\u6240\u5904\u57CE\u5E02\u7684**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u4E0D\u6D88\u8017**<\u884C\u52A8\u70B9>**"
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0

View File

@ -309,7 +309,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 21300000, guid: 7983e5706aca9634188e20ecea690403, type: 3}
ResourceName: "\u519C\u7530"
ResourceDesc: "\u9700**<\u8015\u79CD>**\u79D1\u6280\u3002\u53EF\u5728\u519C\u7530\u5468\u56F41\u683C\u5EFA\u8BBE\u8C37\u4ED3\u83B7\u5F97\u66F4\u591A\u57CE\u5E02\u7ECF\u9A8C\u3002"
ResourceDesc: "\u9700**<\u8015\u79CD>**\u79D1\u6280\u3002\u53EF\u5728\u519C\u7530\u5468\u56F41\u683C\u5EFA\u8BBE\u8C37\u4ED3\u83B7\u5F97\u66F4\u591A**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 2
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -324,7 +324,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 21300000, guid: 4814901362cb1924ca96564a88e97e74, type: 3}
ResourceName: "\u91C7\u77FF\u573A"
ResourceDesc: "\u9700**<\u91C7\u77FF>**\u79D1\u6280\u3002\u53EF\u5728\u91C7\u77FF\u573A\u5468\u56F41\u683C\u5EFA\u8BBE\u51B6\u70BC\u5382\u83B7\u5F97\u66F4\u591A\u57CE\u5E02\u7ECF\u9A8C\u3002"
ResourceDesc: "\u9700**<\u91C7\u77FF>**\u79D1\u6280\u3002\u53EF\u5728\u91C7\u77FF\u573A\u5468\u56F41\u683C\u5EFA\u8BBE\u51B6\u70BC\u5382\u83B7\u5F97\u66F4\u591A**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 2
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -339,7 +339,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 21300000, guid: a3bcc84a63fcc9d4f98afa1a74445f56, type: 3}
ResourceName: "\u4F10\u6728\u573A"
ResourceDesc: "\u63D0\u4F9B1\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002\u53EF\u5728\u4F10\u6728\u573A\u5468\u56F41\u683C\u5EFA\u8BBE\u952F\u6728\u5382\u83B7\u5F97\u66F4\u591A\u57CE\u5E02\u7ECF\u9A8C\u3002"
ResourceDesc: "\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u53EF\u5728\u4F10\u6728\u573A\u5468\u56F41\u683C\u5EFA\u8BBE\u952F\u6728\u5382\u83B7\u5F97\u66F4\u591A**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 1
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -354,7 +354,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 21300000, guid: a3c4b263edc024d4791bc9a1c6319e8c, type: 3}
ResourceName: "\u6E2F\u53E3"
ResourceDesc: "\u53EF\u63D0\u4F9B1\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002\u80FD\u591F\u5C06\u666E\u901A\u5355\u4F4D\u8F6C\u5316\u4E3A\u6D77\u4E0A\u5355\u4F4D\uFF0C\u540C\u65F6\u80FD\u591F\u5EFA\u7ACB**<\u6D77\u6D0B\u8D38\u6613\u901A\u8DEF>**\u3002"
ResourceDesc: "\u53EF\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u80FD\u591F\u5C06\u666E\u901A\u5355\u4F4D\u8F6C\u5316\u4E3A\u6D77\u4E0A\u5355\u4F4D\uFF0C\u540C\u65F6\u80FD\u591F\u5EFA\u7ACB**<\u6D77\u6D0B\u8D38\u6613\u901A\u8DEF>**\u3002"
Exp: 1
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -369,7 +369,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 0}
ResourceName: "\u952F\u6728\u5382"
ResourceDesc: "\u5468\u56F4\u7684\u6BCF\u5EA7**<\u4F10\u6728\u573A>**\u53EF\u4EE5\u63D0\u4F9B1\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u62E5\u6709\u4E00\u4E2A\u952F\u6728\u5382\u3002"
ResourceDesc: "\u5468\u56F4\u7684\u6BCF\u5EA7**<\u4F10\u6728\u573A>**\u53EF\u4EE5\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u62E5\u6709\u4E00\u4E2A\u952F\u6728\u5382\u3002"
Exp: 0
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -406,7 +406,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 0}
ResourceName: "\u51B6\u70BC\u5382"
ResourceDesc: "\u5468\u56F4\u7684\u6BCF\u5EA7\u91C7\u77FF\u573A\u53EF\u4EE5\u63D0\u4F9B2\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u62E5\u6709\u4E00\u4E2A\u51B6\u70BC\u5382\u3002"
ResourceDesc: "\u5468\u56F4\u7684\u6BCF\u5EA7\u91C7\u77FF\u573A\u53EF\u4EE5\u63D0\u4F9B2\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u62E5\u6709\u4E00\u4E2A\u51B6\u70BC\u5382\u3002"
Exp: 0
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -443,7 +443,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 0}
ResourceName: "\u8C37\u4ED3"
ResourceDesc: "\u5468\u56F4\u7684\u6BCF\u7247\u519C\u7530\u53EF\u4EE5\u63D0\u4F9B1\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u62E5\u6709\u4E00\u4E2A\u8C37\u4ED3\u3002"
ResourceDesc: "\u5468\u56F4\u7684\u6BCF\u7247\u519C\u7530\u53EF\u4EE5\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u62E5\u6709\u4E00\u4E2A\u8C37\u4ED3\u3002"
Exp: 0
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -480,7 +480,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 0}
ResourceName: "\u5947\u89C2{param}"
ResourceDesc: "\u8FD9\u662F\u4E00\u5EA7\u51DD\u805A\u667A\u6167\u4E0E\u4FE1\u4EF0\u3001\u8DE8\u8D8A\u65F6\u7A7A\u4E0E\u6587\u660E\u7684\u5947\u8FF9\u4E4B\u4F5C\u3002\u63D0\u4F9B3\u57CE\u5E02\u7ECF\u9A8C\u3002"
ResourceDesc: "\u8FD9\u662F\u4E00\u5EA7\u51DD\u805A\u667A\u6167\u4E0E\u4FE1\u4EF0\u3001\u8DE8\u8D8A\u65F6\u7A7A\u4E0E\u6587\u660E\u7684\u5947\u8FF9\u4E4B\u4F5C\u3002\u63D0\u4F9B3**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -1215,7 +1215,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 21300000, guid: bb99c5430da749d409fddffc438edb3a, type: 3}
ResourceName: "\u7ED3\u754C\u5854"
ResourceDesc: "\u6BCF\u5F53\u53D1\u73B0\u4E00\u5EA7\u7ED3\u754C\u5854\uFF0C\u9996\u90FD\u5C06\u83B7\u5F97\u4E00\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002\u53D1\u73B0\u6240\u6709\u7ED3\u754C\u5854\u540E\uFF0C\u5373\u53EF\u5EFA\u9020\u4E00\u4E2A\u5947\u89C2\u5EFA\u7B51\u3002"
ResourceDesc: "\u6BCF\u5F53\u53D1\u73B0\u4E00\u5EA7\u7ED3\u754C\u5854\uFF0C\u9996\u90FD\u5C06\u83B7\u5F97\u4E00\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u53D1\u73B0\u6240\u6709\u7ED3\u754C\u5854\u540E\uFF0C\u5373\u53EF\u5EFA\u9020\u4E00\u4E2A\u5947\u89C2\u5EFA\u7B51\u3002"
Exp: 1
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -1245,7 +1245,7 @@ MonoBehaviour:
ResourceSubType: 1
Sprite: {fileID: 21300000, guid: d7b0a16ac6f53ad4b8820d8c295c6bc1, type: 3}
ResourceName: "\u9C7C\u7FA4"
ResourceDesc: "\u53EF\u6536\u83B7\u6E14\u4EA7\uFF0C\u63D0\u4F9B1\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002\u9700**<\u6355\u9C7C>**\u79D1\u6280\u3002"
ResourceDesc: "\u53EF\u6536\u83B7\u6E14\u4EA7\uFF0C\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u9700**<\u6355\u9C7C>**\u79D1\u6280\u3002"
Exp: 1
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -1290,7 +1290,7 @@ MonoBehaviour:
ResourceSubType: 1
Sprite: {fileID: 0}
ResourceName: "\u52A8\u7269"
ResourceDesc: "\u53EF\u72E9\u730E\uFF0C\u63D0\u4F9B1\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002\u9700**<\u72E9\u730E>**\u7B49\u79D1\u6280\u3002"
ResourceDesc: "\u53EF\u72E9\u730E\uFF0C\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u9700**<\u72E9\u730E>**\u7B49\u79D1\u6280\u3002"
Exp: 1
ChessType: 0
CivIdForceIdNotFromPlayer: 1
@ -1545,14 +1545,14 @@ MonoBehaviour:
CarryGiantType: 0
Sprite: {fileID: 21300000, guid: 6fb742830567c9940b15155ca1a330ff, type: 3}
Name: "\u8759\u8760"
Desc: "\u53EF\u72E9\u730E\uFF0C\u63D0\u4F9B1\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002\u9700**<\u72E9\u730E>**\u7B49\u79D1\u6280\u3002"
Desc: "\u53EF\u72E9\u730E\uFF0C\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u9700**<\u72E9\u730E>**\u7B49\u79D1\u6280\u3002"
HasLevel: 0
LevelSprite: []
- Resource: 5
ResourceSubType: 1
Sprite: {fileID: 0}
ResourceName: "\u852C\u679C"
ResourceDesc: "\u53EF\u91C7\u96C6\u852C\u679C\uFF0C\u63D0\u4F9B1\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002\u9700**<\u91C7\u96C6>**\u79D1\u6280\u3002"
ResourceDesc: "\u53EF\u91C7\u96C6\u852C\u679C\uFF0C\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u9700**<\u91C7\u96C6>**\u79D1\u6280\u3002"
Exp: 1
ChessType: 0
CivIdForceIdNotFromPlayer: 1
@ -1814,7 +1814,7 @@ MonoBehaviour:
ResourceSubType: 1
Sprite: {fileID: 21300000, guid: 99e40f1b86cd9b3418c232e7c38f8de6, type: 3}
ResourceName: "\u5E84\u7A3C"
ResourceDesc: "\u53EF\u5EFA\u9020\u519C\u7530\uFF0C\u63D0\u4F9B2\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002\u9700**<\u8015\u79CD>**\u79D1\u6280\u3002"
ResourceDesc: "\u53EF\u5EFA\u9020\u519C\u7530\uFF0C\u63D0\u4F9B2\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u9700**<\u8015\u79CD>**\u79D1\u6280\u3002"
Exp: 0
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -1889,7 +1889,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 21300000, guid: 1e065dc4ce7d55644b06fa2e1690734c, type: 3}
ResourceName: "\u519B\u6E2F"
ResourceDesc: "\u4E3A\u5904\u4E8E**<\u519B\u6E2F>**\u7684\u5355\u4F4D\u6062\u590D1\u70B9**<\u901A\u7528\u884C\u52A8\u70B9>**\uFF0C\u6BCF\u56DE\u5408\u4E0A\u9650\u4E00\u6B21\u3002\u63D0\u4F9B\u989D\u5916\u9632\u5FA1\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u5EFA\u9020\u4E00\u5EA7**<\u519B\u6E2F>**\uFF0C\u4E14\u4EC5\u80FD\u5EFA\u9020\u5728\u6E2F\u53E3\u9644\u8FD1\u3002"
ResourceDesc: "\u4E3A\u5904\u4E8E**<\u519B\u6E2F>**\u7684**<\u8239\u53EA\u5355\u4F4D>**\u6062\u590D1\u70B9**<\u901A\u7528\u884C\u52A8\u70B9>**\uFF0C\u6BCF\u56DE\u5408\u4E0A\u9650\u4E00\u6B21\u3002\u63D0\u4F9B\u989D\u5916\u9632\u5FA1\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u5EFA\u9020\u4E00\u5EA7**<\u519B\u6E2F>**\uFF0C\u4E14\u4EC5\u80FD\u5EFA\u9020\u5728\u6E2F\u53E3\u9644\u8FD1\u3002"
Exp: 0
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -1904,7 +1904,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 21300000, guid: 20212381332c7a74ebcc703dd24b3a11, type: 3}
ResourceName: "\u4FDD\u62A4\u533A"
ResourceDesc: "\u63D0\u4F9B\u91D1\u5E01(\u6D45\u6D77)/\u57CE\u5E02\u7ECF\u9A8C(\u68EE\u6797)\u6216\u79D1\u6280\u70B9\u3002\u82E54\u4E2A\u4FDD\u62A4\u533A\u56F4\u6210\u4E00\u5708\u4E14\u62E5\u6709\u81F3\u5C113\u79CD\u4E0D\u540C\u7C7B\u578B\uFF0C\u5219\u6536\u76CA\u7FFB\u500D\u3002"
ResourceDesc: "\u63D0\u4F9B\u91D1\u5E01(\u6D45\u6D77)/**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**(\u68EE\u6797)\u6216\u79D1\u6280\u70B9\u3002\u82E54\u4E2A\u4FDD\u62A4\u533A\u56F4\u6210\u4E00\u5708\u4E14\u62E5\u6709\u81F3\u5C113\u79CD\u4E0D\u540C\u7C7B\u578B\uFF0C\u5219\u6536\u76CA\u7FFB\u500D\u3002"
Exp: 0
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -2139,7 +2139,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 21300000, guid: c065970504610f04da8781baac3ee5f8, type: 3}
ResourceName: "\u704C\u6E89\u5DE5\u7A0B"
ResourceDesc: "\u6BCF3\u56DE\u5408\u5728\u9644\u8FD1\u7A7A\u5730\u4E0A\u751F\u6210**<\u5E84\u7A3C>**\uFF0C\u5468\u56F4\u6BCF\u7247\u519C\u7530\u989D\u5916\u63D0\u4F9B1\u70B9\u57CE\u5E02\u7ECF\u9A8C(\u4E0A\u96502\u70B9)\uFF0C\u4E3A**<\u5E02\u573A>**\u63D0\u4F9B\u989D\u5916\u91D1\u5E01\u3002"
ResourceDesc: "\u6BCF3\u56DE\u5408\u5728\u9644\u8FD1\u7A7A\u5730\u4E0A\u751F\u6210**<\u5E84\u7A3C>**\uFF0C\u5468\u56F4\u6BCF\u7247\u519C\u7530\u989D\u5916\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**(\u4E0A\u96502\u70B9)\uFF0C\u4E3A**<\u5E02\u573A>**\u63D0\u4F9B\u989D\u5916\u91D1\u5E01\u3002"
Exp: 0
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -2218,7 +2218,7 @@ MonoBehaviour:
ForceId: 0
Sprite: {fileID: 21300000, guid: 9ae4068de3182e54c9c44e10b66089e6, type: 3}
Name: "\u5362\u514B\u7D22\u795E\u5E99"
Desc: "\u5E95\u6BD4\u65AF\u6700\u5B8F\u4F1F\u7684\u9732\u5929\u535A\u7269\u9986\uFF0C\u65B0\u738B\u56FD\u65F6\u671F\u6CD5\u8001\u7684\u732E\u793C\uFF0C\u65E8\u5728\u4E3E\u884C\u795E\u5723\u7684\u201C\u5965\u4F69\u7279\u8282\u201D\u5E86\u5178\u3002\u540E\u7ECF\u5343\u5E74\u6F14\u53D8\uFF0C\u878D\u5408\u591A\u79CD\u6587\u660E\u5370\u8BB0\uFF0C\u81F3\u4ECA\u5C79\u7ACB\u3002\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u5E95\u6BD4\u65AF\u6700\u5B8F\u4F1F\u7684\u9732\u5929\u535A\u7269\u9986\uFF0C\u65B0\u738B\u56FD\u65F6\u671F\u6CD5\u8001\u7684\u732E\u793C\uFF0C\u65E8\u5728\u4E3E\u884C\u795E\u5723\u7684\u201C\u5965\u4F69\u7279\u8282\u201D\u5E86\u5178\u3002\u540E\u7ECF\u5343\u5E74\u6F14\u53D8\uFF0C\u878D\u5408\u591A\u79CD\u6587\u660E\u5370\u8BB0\uFF0C\u81F3\u4ECA\u5C79\u7ACB\u3002\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
- Wonder: 1
WonderType: 2
@ -2226,7 +2226,7 @@ MonoBehaviour:
ForceId: 0
Sprite: {fileID: 21300000, guid: 5d2cbba21798bbf47af040f07f81ce58, type: 3}
Name: "\u4E9A\u5386\u5C71\u5927\u56FE\u4E66\u9986"
Desc: "\u53E4\u4EE3\u4E16\u754C\u6700\u5927\u3001\u6700\u8457\u540D\u7684\u56FE\u4E66\u9986\uFF0C\u5EFA\u4E8E\u6258\u52D2\u5BC6\u738B\u671D\u65F6\u671F\u7684\u57C3\u53CA\uFF0C\u65E8\u5728\u6536\u85CF\u5929\u4E0B\u6240\u6709\u77E5\u8BC6\u3002\u540E\u56E0\u6218\u706B\u4E0E\u653F\u6CBB\u52A8\u8361\u591A\u6B21\u711A\u6BC1\u3002\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u53E4\u4EE3\u4E16\u754C\u6700\u5927\u3001\u6700\u8457\u540D\u7684\u56FE\u4E66\u9986\uFF0C\u5EFA\u4E8E\u6258\u52D2\u5BC6\u738B\u671D\u65F6\u671F\u7684\u57C3\u53CA\uFF0C\u65E8\u5728\u6536\u85CF\u5929\u4E0B\u6240\u6709\u77E5\u8BC6\u3002\u540E\u56E0\u6218\u706B\u4E0E\u653F\u6CBB\u52A8\u8361\u591A\u6B21\u711A\u6BC1\u3002\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
- Wonder: 2
WonderType: 3
@ -2234,7 +2234,7 @@ MonoBehaviour:
ForceId: 0
Sprite: {fileID: 21300000, guid: 99f299139fee8074babe65db7c3ba2fc, type: 3}
Name: "\u5B5F\u83F2\u65AF\u8001\u57CE"
Desc: "\u53E4\u57C3\u53CA\u9996\u4E2A\u7EDF\u4E00\u738B\u671D\u7684\u9996\u90FD\uFF0C\u4F20\u8BF4\u7531\u7F8E\u5C3C\u65AF\u738B\u6240\u5EFA\uFF0C\u65E8\u5728\u6210\u4E3A\u4E0A\u4E0B\u57C3\u53CA\u7684\u7EDF\u6CBB\u6838\u5FC3\u3002\u540E\u867D\u8363\u5149\u4E0D\u518D\uFF0C\u5176\u5E9F\u589F\u4ECD\u8BC9\u8BF4\u7740\u4E09\u5343\u5E74\u7684\u5E1D\u56FD\u8F89\u714C\u3002\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u53E4\u57C3\u53CA\u9996\u4E2A\u7EDF\u4E00\u738B\u671D\u7684\u9996\u90FD\uFF0C\u4F20\u8BF4\u7531\u7F8E\u5C3C\u65AF\u738B\u6240\u5EFA\uFF0C\u65E8\u5728\u6210\u4E3A\u4E0A\u4E0B\u57C3\u53CA\u7684\u7EDF\u6CBB\u6838\u5FC3\u3002\u540E\u867D\u8363\u5149\u4E0D\u518D\uFF0C\u5176\u5E9F\u589F\u4ECD\u8BC9\u8BF4\u7740\u4E09\u5343\u5E74\u7684\u5E1D\u56FD\u8F89\u714C\u3002\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
- Wonder: 3
WonderType: 4
@ -2242,7 +2242,7 @@ MonoBehaviour:
ForceId: 0
Sprite: {fileID: 21300000, guid: 28481e4b4d1464f40b2463f41f7e0eb4, type: 3}
Name: "\u5409\u8428\u5927\u91D1\u5B57\u5854"
Desc: "\u53E4\u4EE3\u4E16\u754C\u4E03\u5927\u5947\u8FF9\u7684\u6700\u540E\u9057\u5B58\uFF0C\u6CD5\u8001\u80E1\u592B\u4E3A\u81EA\u5DF1\u4FEE\u5EFA\u7684\u6C38\u6052\u5C45\u6240\uFF0C\u65E8\u5728\u4F5C\u4E3A\u901A\u5F80\u795E\u754C\u7684\u9636\u68AF\u3002\u867D\u5386\u7ECF\u76D7\u6398\uFF0C\u5176\u96C4\u4F1F\u7ED3\u6784\u5C79\u7ACB\u6570\u5343\u5E74\u4E0D\u5012\u3002\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u53E4\u4EE3\u4E16\u754C\u4E03\u5927\u5947\u8FF9\u7684\u6700\u540E\u9057\u5B58\uFF0C\u6CD5\u8001\u80E1\u592B\u4E3A\u81EA\u5DF1\u4FEE\u5EFA\u7684\u6C38\u6052\u5C45\u6240\uFF0C\u65E8\u5728\u4F5C\u4E3A\u901A\u5F80\u795E\u754C\u7684\u9636\u68AF\u3002\u867D\u5386\u7ECF\u76D7\u6398\uFF0C\u5176\u96C4\u4F1F\u7ED3\u6784\u5C79\u7ACB\u6570\u5343\u5E74\u4E0D\u5012\u3002\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
- Wonder: 4
WonderType: 5
@ -2250,7 +2250,7 @@ MonoBehaviour:
ForceId: 0
Sprite: {fileID: 21300000, guid: 9654e91d69aca024c9a5f6e122007a1c, type: 3}
Name: "\u963F\u5E03\u8F9B\u8D1D\u5927\u795E\u5E99"
Desc: "\u62C9\u7F8E\u897F\u65AF\u4E8C\u4E16\u51FF\u5C71\u800C\u5EFA\u7684\u6743\u529B\u4E30\u7891\uFF0C\u5C3C\u7F57\u6CB3\u5357\u5883\u7684\u6C38\u6052\u5BA3\u544A\uFF0C\u65E8\u5728\u7EAA\u5FF5\u6218\u529F\u5E76\u5A01\u6151\u90BB\u90A6\u3002\u540E\u56E0\u6C34\u575D\u5DE5\u7A0B\uFF0C\u7531\u4E16\u754C\u534F\u529B\u6574\u4F53\u8FC1\u79FB\uFF0C\u518D\u521B\u5947\u8FF9\u3002\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u62C9\u7F8E\u897F\u65AF\u4E8C\u4E16\u51FF\u5C71\u800C\u5EFA\u7684\u6743\u529B\u4E30\u7891\uFF0C\u5C3C\u7F57\u6CB3\u5357\u5883\u7684\u6C38\u6052\u5BA3\u544A\uFF0C\u65E8\u5728\u7EAA\u5FF5\u6218\u529F\u5E76\u5A01\u6151\u90BB\u90A6\u3002\u540E\u56E0\u6C34\u575D\u5DE5\u7A0B\uFF0C\u7531\u4E16\u754C\u534F\u529B\u6574\u4F53\u8FC1\u79FB\uFF0C\u518D\u521B\u5947\u8FF9\u3002\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
- Wonder: 5
WonderType: 6
@ -2258,7 +2258,7 @@ MonoBehaviour:
ForceId: 0
Sprite: {fileID: 21300000, guid: c9a566b58f2082b4a9848735e022f3e7, type: 3}
Name: "\u72EE\u8EAB\u4EBA\u9762\u50CF"
Desc: "\u5409\u8428\u9AD8\u539F\u6700\u53E4\u8001\u7684\u6C89\u9ED8\u5B88\u62A4\u8005\uFF0C\u4E16\u4E0A\u6700\u5927\u7684\u6574\u4F53\u77F3\u96D5\uFF0C\u65E8\u5728\u7ED3\u5408\u738B\u6743\u4E0E\u795E\u529B\u62A4\u536B\u6CD5\u8001\u9675\u5BDD\u3002\u66FE\u88AB\u9EC4\u6C99\u63A9\u57CB\u5343\u5E74\uFF0C\u9192\u6765\u540E\u6210\u4E3A\u57C3\u53CA\u7684\u6C38\u6052\u8C61\u5F81\u3002\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u5409\u8428\u9AD8\u539F\u6700\u53E4\u8001\u7684\u6C89\u9ED8\u5B88\u62A4\u8005\uFF0C\u4E16\u4E0A\u6700\u5927\u7684\u6574\u4F53\u77F3\u96D5\uFF0C\u65E8\u5728\u7ED3\u5408\u738B\u6743\u4E0E\u795E\u529B\u62A4\u536B\u6CD5\u8001\u9675\u5BDD\u3002\u66FE\u88AB\u9EC4\u6C99\u63A9\u57CB\u5343\u5E74\uFF0C\u9192\u6765\u540E\u6210\u4E3A\u57C3\u53CA\u7684\u6C38\u6052\u8C61\u5F81\u3002\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
- Wonder: 6
WonderType: 7
@ -2266,7 +2266,7 @@ MonoBehaviour:
ForceId: 0
Sprite: {fileID: 21300000, guid: 6b82d407e72f5a04dad2051557c4a48c, type: 3}
Name: "\u5965\u91CC\u897F\u65AF\u795E\u5E99"
Desc: "\u963F\u62DC\u591A\u65AF\u6700\u795E\u79D8\u7684\u5730\u4E0B\u5723\u6BBF\uFF0C\u7531\u6CD5\u8001\u585E\u63D0\u4E00\u4E16\u5174\u5EFA\uFF0C\u65E8\u5728\u4F5C\u4E3A\u51A5\u795E\u5965\u897F\u91CC\u65AF\u7684\u8C61\u5F81\u6027\u9675\u5893\u3002\u5176\u771F\u5B9E\u5E74\u4EE3\u4E0E\u7528\u9014\u81F3\u4ECA\u4ECD\u662F\u8003\u53E4\u5B66\u4E0A\u7684\u672A\u89E3\u4E4B\u8C1C\u3002\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u963F\u62DC\u591A\u65AF\u6700\u795E\u79D8\u7684\u5730\u4E0B\u5723\u6BBF\uFF0C\u7531\u6CD5\u8001\u585E\u63D0\u4E00\u4E16\u5174\u5EFA\uFF0C\u65E8\u5728\u4F5C\u4E3A\u51A5\u795E\u5965\u897F\u91CC\u65AF\u7684\u8C61\u5F81\u6027\u9675\u5893\u3002\u5176\u771F\u5B9E\u5E74\u4EE3\u4E0E\u7528\u9014\u81F3\u4ECA\u4ECD\u662F\u8003\u53E4\u5B66\u4E0A\u7684\u672A\u89E3\u4E4B\u8C1C\u3002\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
- Wonder: 7
WonderType: 1
@ -2274,7 +2274,7 @@ MonoBehaviour:
ForceId: 1
Sprite: {fileID: 21300000, guid: fd412cc9548c654409cc979745ed1d40, type: 3}
Name: "\u67AB\u4E39\u767D\u9732\u5BAB"
Desc: "\u5386\u4EE3\u6CD5\u56FD\u541B\u738B\u7684\u72E9\u730E\u884C\u5BAB\u4E0E\u6743\u529B\u522B\u82D1\uFF0C\u88AB\u8A89\u4E3A\u201C\u6CD5\u56FD\u5386\u53F2\u7684\u7F29\u5F71\u201D\u3002\u65E8\u5728\u5F70\u663E\u6587\u827A\u590D\u5174\u5F15\u5165\u7684\u827A\u672F\u54C1\u5473\u4E0E\u738B\u5BA4\u5A01\u4EEA\u3002\u540E\u89C1\u8BC1\u62FF\u7834\u4ED1\u5E1D\u56FD\u7684\u7EC8\u7109\uFF0C\u6210\u4E3A\u6570\u4E2A\u65F6\u4EE3\u7684\u653F\u6CBB\u821E\u53F0\u3002\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u5386\u4EE3\u6CD5\u56FD\u541B\u738B\u7684\u72E9\u730E\u884C\u5BAB\u4E0E\u6743\u529B\u522B\u82D1\uFF0C\u88AB\u8A89\u4E3A\u201C\u6CD5\u56FD\u5386\u53F2\u7684\u7F29\u5F71\u201D\u3002\u65E8\u5728\u5F70\u663E\u6587\u827A\u590D\u5174\u5F15\u5165\u7684\u827A\u672F\u54C1\u5473\u4E0E\u738B\u5BA4\u5A01\u4EEA\u3002\u540E\u89C1\u8BC1\u62FF\u7834\u4ED1\u5E1D\u56FD\u7684\u7EC8\u7109\uFF0C\u6210\u4E3A\u6570\u4E2A\u65F6\u4EE3\u7684\u653F\u6CBB\u821E\u53F0\u3002\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
- Wonder: 8
WonderType: 2
@ -2282,7 +2282,7 @@ MonoBehaviour:
ForceId: 1
Sprite: {fileID: 21300000, guid: 25959da9c2209d2479802619fc828f5c, type: 3}
Name: "\u7D22\u90A6\u5927\u5B66"
Desc: "\u6B27\u6D32\u6700\u53E4\u8001\u7684\u5B66\u672F\u6BBF\u5802\u4E4B\u4E00\uFF0C\u5DF4\u9ECE\u5DE6\u5CB8\u7684\u77E5\u8BC6\u5FC3\u810F\u3002\u65E8\u5728\u4F5C\u4E3A\u795E\u5B66\u7814\u7A76\u7684\u6838\u5FC3\uFF0C\u540E\u6F14\u53D8\u4E3A\u601D\u60F3\u81EA\u7531\u7684\u7194\u7089\u3002\u66FE\u662F\u201C\u4E94\u6708\u98CE\u66B4\u201D\u7684\u7B56\u6E90\u5730\uFF0C\u81F3\u4ECA\u4ECD\u662F\u6CD5\u56FD\u7CBE\u82F1\u7684\u6447\u7BEE\u3002\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u6B27\u6D32\u6700\u53E4\u8001\u7684\u5B66\u672F\u6BBF\u5802\u4E4B\u4E00\uFF0C\u5DF4\u9ECE\u5DE6\u5CB8\u7684\u77E5\u8BC6\u5FC3\u810F\u3002\u65E8\u5728\u4F5C\u4E3A\u795E\u5B66\u7814\u7A76\u7684\u6838\u5FC3\uFF0C\u540E\u6F14\u53D8\u4E3A\u601D\u60F3\u81EA\u7531\u7684\u7194\u7089\u3002\u66FE\u662F\u201C\u4E94\u6708\u98CE\u66B4\u201D\u7684\u7B56\u6E90\u5730\uFF0C\u81F3\u4ECA\u4ECD\u662F\u6CD5\u56FD\u7CBE\u82F1\u7684\u6447\u7BEE\u3002\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
- Wonder: 9
WonderType: 3
@ -2290,7 +2290,7 @@ MonoBehaviour:
ForceId: 1
Sprite: {fileID: 21300000, guid: 0f1fce644ced23c4e907dc62ff4f23be, type: 3}
Name: "\u4EA4\u6613\u6240\u5E7F\u573A"
Desc: "\u6CE2\u5C14\u591A\u9EC4\u91D1\u65F6\u4EE3\u7684\u57CE\u5E02\u5BA2\u5385\uFF0C\u5927\u897F\u6D0B\u8D38\u6613\u7684\u8F89\u714C\u95E8\u9762\u3002\u65E8\u5728\u5411\u4E16\u754C\u5C55\u793A\u6E2F\u53E3\u57CE\u5E02\u7684\u8D22\u5BCC\u3001\u5F00\u653E\u4E0E\u6CD5\u5F0F\u4F18\u96C5\u3002\u5176\u7E41\u8363\u690D\u6839\u4E8E\u65E7\u6B96\u6C11\u8D38\u6613\uFF0C\u5982\u4ECA\u4EE5\u201C\u6C34\u955C\u201D\u5E7F\u573A\u95FB\u540D\u4E8E\u4E16\u3002\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u6CE2\u5C14\u591A\u9EC4\u91D1\u65F6\u4EE3\u7684\u57CE\u5E02\u5BA2\u5385\uFF0C\u5927\u897F\u6D0B\u8D38\u6613\u7684\u8F89\u714C\u95E8\u9762\u3002\u65E8\u5728\u5411\u4E16\u754C\u5C55\u793A\u6E2F\u53E3\u57CE\u5E02\u7684\u8D22\u5BCC\u3001\u5F00\u653E\u4E0E\u6CD5\u5F0F\u4F18\u96C5\u3002\u5176\u7E41\u8363\u690D\u6839\u4E8E\u65E7\u6B96\u6C11\u8D38\u6613\uFF0C\u5982\u4ECA\u4EE5\u201C\u6C34\u955C\u201D\u5E7F\u573A\u95FB\u540D\u4E8E\u4E16\u3002\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
- Wonder: 10
WonderType: 4
@ -2298,7 +2298,7 @@ MonoBehaviour:
ForceId: 1
Sprite: {fileID: 21300000, guid: 936535b388150f648a819b20d93498bb, type: 3}
Name: "\u5362\u6D6E\u5BAB"
Desc: "\u4ECE\u4E2D\u4E16\u7EAA\u5821\u5792\u5230\u56FD\u738B\u4EEC\u7684\u5962\u534E\u5BAB\u6BBF\uFF0C\u6700\u7EC8\u6210\u4E3A\u4E16\u754C\u7684\u827A\u672F\u5723\u6BBF\u3002\u65E8\u5728\u4F5C\u4E3A\u6CD5\u5170\u897F\u738B\u6743\u7684\u7EDD\u5BF9\u4E2D\u5FC3\uFF0C\u62F1\u536B\u56FD\u738B\u4E0E\u8D22\u5B9D\u3002\u540E\u5728\u6CD5\u56FD\u5927\u9769\u547D\u4E2D\u5411\u516C\u4F17\u5F00\u653E\uFF0C\u6210\u4E3A\u5168\u6C11\u5171\u4EAB\u7684\u6587\u5316\u9057\u4EA7\u3002\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u4ECE\u4E2D\u4E16\u7EAA\u5821\u5792\u5230\u56FD\u738B\u4EEC\u7684\u5962\u534E\u5BAB\u6BBF\uFF0C\u6700\u7EC8\u6210\u4E3A\u4E16\u754C\u7684\u827A\u672F\u5723\u6BBF\u3002\u65E8\u5728\u4F5C\u4E3A\u6CD5\u5170\u897F\u738B\u6743\u7684\u7EDD\u5BF9\u4E2D\u5FC3\uFF0C\u62F1\u536B\u56FD\u738B\u4E0E\u8D22\u5B9D\u3002\u540E\u5728\u6CD5\u56FD\u5927\u9769\u547D\u4E2D\u5411\u516C\u4F17\u5F00\u653E\uFF0C\u6210\u4E3A\u5168\u6C11\u5171\u4EAB\u7684\u6587\u5316\u9057\u4EA7\u3002\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
- Wonder: 11
WonderType: 5
@ -2306,7 +2306,7 @@ MonoBehaviour:
ForceId: 1
Sprite: {fileID: 21300000, guid: e82a494ae6572eb4c8e993dbdf382f26, type: 3}
Name: "\u51EF\u65CB\u95E8"
Desc: "\u62FF\u7834\u4ED1\u4E3A\u7EAA\u5FF5\u5176\u8D6B\u8D6B\u6218\u529F\u800C\u4E0B\u4EE4\u4FEE\u5EFA\u7684\u5E1D\u56FD\u8363\u8000\u8C61\u5F81\u3002\u65E8\u5728\u94ED\u8BB0\u6CD5\u5170\u897F\u7B2C\u4E00\u5E1D\u56FD\u7684\u8F89\u714C\u80DC\u5229\uFF0C\u6FC0\u52B1\u519B\u961F\u7684\u58EB\u6C14\u3002\u540E\u6210\u4E3A\u65E0\u540D\u70C8\u58EB\u7684\u5B89\u606F\u5730\uFF0C\u662F\u6CD5\u5170\u897F\u6C11\u65CF\u7CBE\u795E\u7684\u6C47\u805A\u70B9\u3002\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u62FF\u7834\u4ED1\u4E3A\u7EAA\u5FF5\u5176\u8D6B\u8D6B\u6218\u529F\u800C\u4E0B\u4EE4\u4FEE\u5EFA\u7684\u5E1D\u56FD\u8363\u8000\u8C61\u5F81\u3002\u65E8\u5728\u94ED\u8BB0\u6CD5\u5170\u897F\u7B2C\u4E00\u5E1D\u56FD\u7684\u8F89\u714C\u80DC\u5229\uFF0C\u6FC0\u52B1\u519B\u961F\u7684\u58EB\u6C14\u3002\u540E\u6210\u4E3A\u65E0\u540D\u70C8\u58EB\u7684\u5B89\u606F\u5730\uFF0C\u662F\u6CD5\u5170\u897F\u6C11\u65CF\u7CBE\u795E\u7684\u6C47\u805A\u70B9\u3002\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
- Wonder: 12
WonderType: 6
@ -2314,7 +2314,7 @@ MonoBehaviour:
ForceId: 1
Sprite: {fileID: 21300000, guid: 54ea1a42bea9909498e3e5b5aaadd3ff, type: 3}
Name: "\u5DF4\u9ECE\u5723\u6BCD\u9662"
Desc: "\u54E5\u7279\u827A\u672F\u7684\u5DC5\u5CF0\u4E4B\u4F5C\uFF0C\u5DF4\u9ECE\u57CE\u5C9B\u4E0A\u77D7\u7ACB\u8FD1\u5343\u5E74\u7684\u4FE1\u4EF0\u4E2D\u5FC3\u3002\u65E8\u5728\u4F5C\u4E3A\u732E\u7ED9\u5723\u6BCD\u739B\u5229\u4E9A\u7684\u793C\u7269\uFF0C\u627F\u8F7D\u5DF4\u9ECE\u7684\u5B97\u6559\u4E0E\u5E02\u6C11\u751F\u6D3B\u3002\u867D\u906D\u5927\u706B\u91CD\u521B\uFF0C\u5176\u91CD\u751F\u4E0E\u4FEE\u590D\u66F4\u51DD\u805A\u4E86\u4E16\u754C\u7684\u5173\u6CE8\u4E0E\u60C5\u611F\u3002\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u54E5\u7279\u827A\u672F\u7684\u5DC5\u5CF0\u4E4B\u4F5C\uFF0C\u5DF4\u9ECE\u57CE\u5C9B\u4E0A\u77D7\u7ACB\u8FD1\u5343\u5E74\u7684\u4FE1\u4EF0\u4E2D\u5FC3\u3002\u65E8\u5728\u4F5C\u4E3A\u732E\u7ED9\u5723\u6BCD\u739B\u5229\u4E9A\u7684\u793C\u7269\uFF0C\u627F\u8F7D\u5DF4\u9ECE\u7684\u5B97\u6559\u4E0E\u5E02\u6C11\u751F\u6D3B\u3002\u867D\u906D\u5927\u706B\u91CD\u521B\uFF0C\u5176\u91CD\u751F\u4E0E\u4FEE\u590D\u66F4\u51DD\u805A\u4E86\u4E16\u754C\u7684\u5173\u6CE8\u4E0E\u60C5\u611F\u3002\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
- Wonder: 13
WonderType: 7
@ -2322,7 +2322,7 @@ MonoBehaviour:
ForceId: 1
Sprite: {fileID: 21300000, guid: 803ed8a071ab0b0499b592b50c7f0f42, type: 3}
Name: "\u5DF4\u9ECE\u5929\u6587\u53F0"
Desc: "\u8DEF\u6613\u5341\u56DB\u4E0B\u4EE4\u5EFA\u9020\u7684\u56FD\u5BB6\u7EA7\u79D1\u7814\u673A\u6784\uFF0C\u4E0E\u683C\u6797\u5C3C\u6CBB\u5929\u6587\u53F0\u9F50\u540D\u7684\u7ECF\u5EA6\u4E4B\u4E89\u8005\u3002\u65E8\u5728\u7CBE\u786E\u7ED8\u5236\u5730\u56FE\u3001\u53D1\u5C55\u822A\u6D77\u672F\uFF0C\u4EE5\u79D1\u5B66\u4E08\u91CF\u4E16\u754C\u3002\u5176\u786E\u5B9A\u7684\u201C\u5DF4\u9ECE\u5B50\u5348\u7EBF\u201D\u66FE\u662F\u6CD5\u56FD\u5730\u56FE\u7684\u96F6\u5EA6\u7ECF\u7EBF\u57FA\u51C6\u3002\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u8DEF\u6613\u5341\u56DB\u4E0B\u4EE4\u5EFA\u9020\u7684\u56FD\u5BB6\u7EA7\u79D1\u7814\u673A\u6784\uFF0C\u4E0E\u683C\u6797\u5C3C\u6CBB\u5929\u6587\u53F0\u9F50\u540D\u7684\u7ECF\u5EA6\u4E4B\u4E89\u8005\u3002\u65E8\u5728\u7CBE\u786E\u7ED8\u5236\u5730\u56FE\u3001\u53D1\u5C55\u822A\u6D77\u672F\uFF0C\u4EE5\u79D1\u5B66\u4E08\u91CF\u4E16\u754C\u3002\u5176\u786E\u5B9A\u7684\u201C\u5DF4\u9ECE\u5B50\u5348\u7EBF\u201D\u66FE\u662F\u6CD5\u56FD\u5730\u56FE\u7684\u96F6\u5EA6\u7ECF\u7EBF\u57FA\u51C6\u3002\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
- Wonder: 14
WonderType: 1
@ -2330,7 +2330,7 @@ MonoBehaviour:
ForceId: 2
Sprite: {fileID: 21300000, guid: 193db0ee37259d547aae9e6db2e9ff94, type: 3}
Name: "\u52C3\u5170\u767B\u5821\u95E8"
Desc: "\u666E\u9C81\u58EB\u7684\u51EF\u65CB\u8C61\u5F81\uFF0C\u5FB7\u610F\u5FD7\u6C11\u65CF\u5206\u5408\u805A\u6563\u7684\u5386\u53F2\u89C1\u8BC1\u3002\u65E8\u5728\u7EAA\u5FF5\u666E\u9C81\u58EB\u7684\u519B\u4E8B\u80DC\u5229\uFF0C\u5F70\u663E\u56FD\u90FD\u67CF\u6797\u7684\u6C14\u6D3E\u3002\u66FE\u5728\u51B7\u6218\u4E2D\u88AB\u67CF\u6797\u5899\u9694\u7EDD\uFF0C\u540E\u6210\u4E3A\u5FB7\u56FD\u7EDF\u4E00\u7684\u6C38\u6052\u56FE\u817E\u3002\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u666E\u9C81\u58EB\u7684\u51EF\u65CB\u8C61\u5F81\uFF0C\u5FB7\u610F\u5FD7\u6C11\u65CF\u5206\u5408\u805A\u6563\u7684\u5386\u53F2\u89C1\u8BC1\u3002\u65E8\u5728\u7EAA\u5FF5\u666E\u9C81\u58EB\u7684\u519B\u4E8B\u80DC\u5229\uFF0C\u5F70\u663E\u56FD\u90FD\u67CF\u6797\u7684\u6C14\u6D3E\u3002\u66FE\u5728\u51B7\u6218\u4E2D\u88AB\u67CF\u6797\u5899\u9694\u7EDD\uFF0C\u540E\u6210\u4E3A\u5FB7\u56FD\u7EDF\u4E00\u7684\u6C38\u6052\u56FE\u817E\u3002\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
- Wonder: 15
WonderType: 2
@ -2338,7 +2338,7 @@ MonoBehaviour:
ForceId: 2
Sprite: {fileID: 21300000, guid: c32e08acd22a79443ba4de942202f32a, type: 3}
Name: "\u6D77\u767B\u5821\u5927\u5B66"
Desc: "\u5FB7\u610F\u5FD7\u6700\u53E4\u8001\u7684\u5927\u5B66\uFF0C\u54F2\u5B66\u5BB6\u4E0E\u8BD7\u4EBA\u7684\u601D\u60F3\u6447\u7BEE\u3002\u65E8\u5728\u4E3A\u4E3B\u6559\u6388\u4E1A\u89E3\u60D1\u63D0\u4F9B\u573A\u6240\uFF0C\u540E\u6210\u4E3A\u5FB7\u56FD\u6D6A\u6F2B\u4E3B\u4E49\u7684\u53D1\u6E90\u5730\u3002\u867D\u66FE\u7ECF\u5386\u7EB3\u7CB9\u65F6\u671F\u7684\u9ED1\u6697\uFF0C\u5176\u5B66\u672F\u81EA\u7531\u7CBE\u795E\u7EC8\u5F97\u5149\u590D\u3002\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u5FB7\u610F\u5FD7\u6700\u53E4\u8001\u7684\u5927\u5B66\uFF0C\u54F2\u5B66\u5BB6\u4E0E\u8BD7\u4EBA\u7684\u601D\u60F3\u6447\u7BEE\u3002\u65E8\u5728\u4E3A\u4E3B\u6559\u6388\u4E1A\u89E3\u60D1\u63D0\u4F9B\u573A\u6240\uFF0C\u540E\u6210\u4E3A\u5FB7\u56FD\u6D6A\u6F2B\u4E3B\u4E49\u7684\u53D1\u6E90\u5730\u3002\u867D\u66FE\u7ECF\u5386\u7EB3\u7CB9\u65F6\u671F\u7684\u9ED1\u6697\uFF0C\u5176\u5B66\u672F\u81EA\u7531\u7CBE\u795E\u7EC8\u5F97\u5149\u590D\u3002\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
- Wonder: 16
WonderType: 3
@ -2346,7 +2346,7 @@ MonoBehaviour:
ForceId: 2
Sprite: {fileID: 21300000, guid: 3bbafdaa5d59eed4ba343507956871b8, type: 3}
Name: "\u6C49\u5821\u6E2F\u53E3\u4ED3\u5E93\u57CE"
Desc: "\u4E16\u754C\u6700\u5927\u7684\u6869\u57FA\u4ED3\u5E93\u5EFA\u7B51\u7FA4\uFF0C\u6C49\u8428\u540C\u76DF\u7CBE\u795E\u7684\u5DE5\u4E1A\u65F6\u4EE3\u56DE\u54CD\u3002\u65E8\u5728\u4E3A\u5496\u5561\u3001\u9999\u6599\u7B49\u8FDC\u6D0B\u8D27\u7269\u63D0\u4F9B\u9AD8\u6548\u7684\u4ED3\u50A8\u4E0E\u8F6C\u8FD0\u3002\u5982\u4ECA\u8F6C\u578B\u4E3A\u878D\u5408\u5546\u4E1A\u3001\u6587\u5316\u4E0E\u5C45\u4F4F\u7684\u6D3B\u529B\u8857\u533A\uFF0C\u518D\u73B0\u6E2F\u53E3\u8F89\u714C\u3002\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u4E16\u754C\u6700\u5927\u7684\u6869\u57FA\u4ED3\u5E93\u5EFA\u7B51\u7FA4\uFF0C\u6C49\u8428\u540C\u76DF\u7CBE\u795E\u7684\u5DE5\u4E1A\u65F6\u4EE3\u56DE\u54CD\u3002\u65E8\u5728\u4E3A\u5496\u5561\u3001\u9999\u6599\u7B49\u8FDC\u6D0B\u8D27\u7269\u63D0\u4F9B\u9AD8\u6548\u7684\u4ED3\u50A8\u4E0E\u8F6C\u8FD0\u3002\u5982\u4ECA\u8F6C\u578B\u4E3A\u878D\u5408\u5546\u4E1A\u3001\u6587\u5316\u4E0E\u5C45\u4F4F\u7684\u6D3B\u529B\u8857\u533A\uFF0C\u518D\u73B0\u6E2F\u53E3\u8F89\u714C\u3002\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
- Wonder: 17
WonderType: 4
@ -2354,7 +2354,7 @@ MonoBehaviour:
ForceId: 2
Sprite: {fileID: 21300000, guid: ef75559cb243afb4eaaf79225304177c, type: 3}
Name: "\u65B0\u5929\u9E45\u5821"
Desc: "\u5DF4\u4F10\u5229\u4E9A\u56FD\u738B\u8DEF\u5FB7\u7EF4\u5E0C\u4E8C\u4E16\u7684\u6D6A\u6F2B\u5E7B\u60F3\uFF0C\u4E2D\u4E16\u7EAA\u9A91\u58EB\u68A6\u7684\u5316\u8EAB\u3002\u65E8\u5728\u8FDC\u79BB\u5C18\u56A3\uFF0C\u4E3A\u74E6\u683C\u7EB3\u6B4C\u5267\u6784\u5EFA\u4E00\u4E2A\u53EF\u5C45\u4F4F\u7684\u821E\u53F0\u3002\u8017\u5C3D\u56FD\u738B\u7684\u8D22\u5BCC\uFF0C\u5374\u610F\u5916\u6210\u4E3A\u8FEA\u58EB\u5C3C\u57CE\u5821\u7684\u7075\u611F\u4E0E\u5FB7\u56FD\u7684\u65C5\u6E38\u540D\u7247\u3002\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u5DF4\u4F10\u5229\u4E9A\u56FD\u738B\u8DEF\u5FB7\u7EF4\u5E0C\u4E8C\u4E16\u7684\u6D6A\u6F2B\u5E7B\u60F3\uFF0C\u4E2D\u4E16\u7EAA\u9A91\u58EB\u68A6\u7684\u5316\u8EAB\u3002\u65E8\u5728\u8FDC\u79BB\u5C18\u56A3\uFF0C\u4E3A\u74E6\u683C\u7EB3\u6B4C\u5267\u6784\u5EFA\u4E00\u4E2A\u53EF\u5C45\u4F4F\u7684\u821E\u53F0\u3002\u8017\u5C3D\u56FD\u738B\u7684\u8D22\u5BCC\uFF0C\u5374\u610F\u5916\u6210\u4E3A\u8FEA\u58EB\u5C3C\u57CE\u5821\u7684\u7075\u611F\u4E0E\u5FB7\u56FD\u7684\u65C5\u6E38\u540D\u7247\u3002\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
- Wonder: 18
WonderType: 5
@ -2362,7 +2362,7 @@ MonoBehaviour:
ForceId: 2
Sprite: {fileID: 21300000, guid: 8c1cd235d851c2c40b3a229ce02781e5, type: 3}
Name: "\u67CF\u6797\u80DC\u5229\u7EAA\u5FF5\u67F1"
Desc: "\u4E3A\u7EAA\u5FF5\u666E\u9C81\u58EB\u5728\u591A\u573A\u6218\u4E89\u4E2D\u83B7\u80DC\u800C\u5EFA\u7684\u91D1\u8272\u8363\u8000\u7891\u3002\u65E8\u5728\u5E86\u795D\u5FB7\u610F\u5FD7\u7EDF\u4E00\u524D\u5915\uFF0C\u666E\u9C81\u58EB\u519B\u961F\u53D6\u5F97\u7684\u51B3\u5B9A\u6027\u80DC\u5229\u3002\u66FE\u88AB\u7EB3\u7CB9\u8FC1\u79FB\u5E76\u8BA1\u5212\u4F5C\u4E3A\u201C\u4E16\u754C\u4E4B\u90FD\u201D\u7684\u6838\u5FC3\uFF0C\u5982\u4ECA\u662F\u67CF\u6797\u5929\u9645\u7EBF\u7684\u8457\u540D\u5730\u6807\u3002\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u4E3A\u7EAA\u5FF5\u666E\u9C81\u58EB\u5728\u591A\u573A\u6218\u4E89\u4E2D\u83B7\u80DC\u800C\u5EFA\u7684\u91D1\u8272\u8363\u8000\u7891\u3002\u65E8\u5728\u5E86\u795D\u5FB7\u610F\u5FD7\u7EDF\u4E00\u524D\u5915\uFF0C\u666E\u9C81\u58EB\u519B\u961F\u53D6\u5F97\u7684\u51B3\u5B9A\u6027\u80DC\u5229\u3002\u66FE\u88AB\u7EB3\u7CB9\u8FC1\u79FB\u5E76\u8BA1\u5212\u4F5C\u4E3A\u201C\u4E16\u754C\u4E4B\u90FD\u201D\u7684\u6838\u5FC3\uFF0C\u5982\u4ECA\u662F\u67CF\u6797\u5929\u9645\u7EBF\u7684\u8457\u540D\u5730\u6807\u3002\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
- Wonder: 19
WonderType: 6
@ -2370,7 +2370,7 @@ MonoBehaviour:
ForceId: 2
Sprite: {fileID: 21300000, guid: 989d2cba4eb64c04486da63a9842f061, type: 3}
Name: "\u62DC\u7F57\u4F0A\u7279\u8282\u65E5\u5267\u9662"
Desc: "\u5B8C\u5168\u4E3A\u4E0A\u6F14\u74E6\u683C\u7EB3\u6B4C\u5267\u800C\u751F\u7684\u97F3\u4E50\u5723\u6BBF\uFF0C\u5168\u7403\u74E6\u683C\u7EB3\u4E50\u8FF7\u7684\u671D\u5723\u5730\u3002\u65E8\u5728\u5B9E\u73B0\u4F5C\u66F2\u5BB6\u5BF9\u201C\u603B\u4F53\u827A\u672F\u4F5C\u54C1\u201D\u7684\u9769\u547D\u6027\u6784\u60F3\u3002\u66FE\u56E0\u4E0E\u5E0C\u7279\u52D2\u7684\u8054\u7CFB\u800C\u8499\u4E0A\u9634\u5F71\uFF0C\u6218\u540E\u7ECF\u51C0\u5316\u91CD\u751F\u4E3A\u7EAF\u7CB9\u7684\u827A\u672F\u6BBF\u5802\u3002\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u5B8C\u5168\u4E3A\u4E0A\u6F14\u74E6\u683C\u7EB3\u6B4C\u5267\u800C\u751F\u7684\u97F3\u4E50\u5723\u6BBF\uFF0C\u5168\u7403\u74E6\u683C\u7EB3\u4E50\u8FF7\u7684\u671D\u5723\u5730\u3002\u65E8\u5728\u5B9E\u73B0\u4F5C\u66F2\u5BB6\u5BF9\u201C\u603B\u4F53\u827A\u672F\u4F5C\u54C1\u201D\u7684\u9769\u547D\u6027\u6784\u60F3\u3002\u66FE\u56E0\u4E0E\u5E0C\u7279\u52D2\u7684\u8054\u7CFB\u800C\u8499\u4E0A\u9634\u5F71\uFF0C\u6218\u540E\u7ECF\u51C0\u5316\u91CD\u751F\u4E3A\u7EAF\u7CB9\u7684\u827A\u672F\u6BBF\u5802\u3002\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
- Wonder: 20
WonderType: 7
@ -2378,7 +2378,7 @@ MonoBehaviour:
ForceId: 2
Sprite: {fileID: 21300000, guid: f91a3b4a4a0057c4885eaaf387c1415d, type: 3}
Name: "\u9F50\u67CF\u6797\u98DE\u8247\u57FA\u5730"
Desc: "\u786C\u5F0F\u98DE\u8247\u7684\u8BDE\u751F\u5730\u4E0E\u5236\u9020\u4E2D\u5FC3\uFF0C\u89C1\u8BC1\u4E86\u4EBA\u7C7B\u822A\u7A7A\u53F2\u4E0A\u4E00\u4E2A\u8F89\u714C\u5374\u77ED\u6682\u7684\u7BC7\u7AE0\u3002\u56E0\u5174\u767B\u5821\u53F7\u7A7A\u96BE\u800C\u8FC5\u901F\u8870\u843D\uFF0C\u8FD9\u4E2A\u4F18\u96C5\u7684\u7A7A\u4E2D\u5DE8\u517D\u65F6\u4EE3\u6700\u7EC8\u8BA9\u4F4D\u4E8E\u98DE\u673A\u3002\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u786C\u5F0F\u98DE\u8247\u7684\u8BDE\u751F\u5730\u4E0E\u5236\u9020\u4E2D\u5FC3\uFF0C\u89C1\u8BC1\u4E86\u4EBA\u7C7B\u822A\u7A7A\u53F2\u4E0A\u4E00\u4E2A\u8F89\u714C\u5374\u77ED\u6682\u7684\u7BC7\u7AE0\u3002\u56E0\u5174\u767B\u5821\u53F7\u7A7A\u96BE\u800C\u8FC5\u901F\u8870\u843D\uFF0C\u8FD9\u4E2A\u4F18\u96C5\u7684\u7A7A\u4E2D\u5DE8\u517D\u65F6\u4EE3\u6700\u7EC8\u8BA9\u4F4D\u4E8E\u98DE\u673A\u3002\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
Exp: 3
- Wonder: 21
WonderType: 1

View File

@ -516,7 +516,7 @@ MonoBehaviour:
UnitFullTypes: []
TargetBuff:
- taskContentType: 7
Param: 20
Param: 15
SkillParam: 210
SpType: 0
SkillList:
@ -640,7 +640,7 @@ MonoBehaviour:
UnitFullTypes: []
TargetBuff:
- taskContentType: 7
Param: 15
Param: 12
SkillParam: 217
SpType: 0
SkillList: d9000000fc000000
@ -649,7 +649,7 @@ MonoBehaviour:
UnitFullTypes: []
TargetBuff:
- taskContentType: 7
Param: 40
Param: 30
SkillParam: 217
SpType: 0
SkillList: d9000000fc000000

View File

@ -27,16 +27,16 @@ MonoBehaviour:
HintContent: "\u65E0\u8BBA\u662F\u5E94\u5BF9\u6F5C\u5728\u7684\u654C\u4EBA\u5A01\u80C1\uFF0C\u8FD8\u662F\u63A2\u7D22\u5730\u56FE\u6316\u6398\u5B9D\u85CF\uFF0C\u8BAD\u7EC3\u5355\u4F4D\u90FD\u662F\u7B2C\u4E00\u6B65\u3002"
- HintType: 5
HintName: "\u53EF\u6539\u9020\u519C\u7530"
HintContent: "\u5B66\u4E60**<\u8015\u79CD>**\u79D1\u6280\uFF0C\u5C31\u80FD\u5C06\u5E84\u7A3C\u6539\u9020\u4E3A\u519C\u7530\uFF0C\u5E76\u4E3A\u57CE\u5E02\u63D0\u4F9B2\u70B9\u7ECF\u9A8C\u3002\u5728\u5B66\u4E60**<\u91C7\u96C6>**\u79D1\u6280\u524D\uFF0C\u65E0\u6CD5\u53D1\u73B0\u5E84\u7A3C\u3002"
HintContent: "\u5B66\u4E60**<\u8015\u79CD>**\u79D1\u6280\uFF0C\u5C31\u80FD\u5C06\u5E84\u7A3C\u6539\u9020\u4E3A\u519C\u7530\uFF0C\u5E76\u4E3A\u57CE\u5E02\u63D0\u4F9B2\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u5728\u5B66\u4E60**<\u91C7\u96C6>**\u79D1\u6280\u524D\uFF0C\u65E0\u6CD5\u53D1\u73B0\u5E84\u7A3C\u3002"
- HintType: 6
HintName: "\u53EF\u6355\u83B7\u6E14\u4E1A"
HintContent: "\u5B66\u4E60**<\u6355\u9C7C>**\u79D1\u6280\uFF0C\u5C31\u80FD\u6355\u83B7\u6E14\u4E1A\uFF0C\u5E76\u4E3A\u57CE\u5E02\u63D0\u4F9B1\u70B9\u7ECF\u9A8C\u3002"
HintContent: "\u5B66\u4E60**<\u6355\u9C7C>**\u79D1\u6280\uFF0C\u5C31\u80FD\u6355\u83B7\u6E14\u4E1A\uFF0C\u5E76\u4E3A\u57CE\u5E02\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
- HintType: 7
HintName: "\u53EF\u72E9\u730E"
HintContent: "\u5B66\u4E60**<\u72E9\u730E>**\u79D1\u6280\uFF0C\u5C31\u80FD\u6355\u83B7\u730E\u7269\uFF0C\u5E76\u4E3A\u57CE\u5E02\u63D0\u4F9B1\u70B9\u7ECF\u9A8C\u3002"
HintContent: "\u5B66\u4E60**<\u72E9\u730E>**\u79D1\u6280\uFF0C\u5C31\u80FD\u6355\u83B7\u730E\u7269\uFF0C\u5E76\u4E3A\u57CE\u5E02\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
- HintType: 8
HintName: "\u53EF\u6539\u9020\u77FF\u573A"
HintContent: "\u5B66\u4E60**<\u91C7\u77FF>**\u79D1\u6280\uFF0C\u5C31\u80FD\u5C06\u77FF\u5C71\u6539\u9020\u4E3A\u91C7\u77FF\u573A\uFF0C\u5E76\u4E3A\u57CE\u5E02\u63D0\u4F9B2\u70B9\u7ECF\u9A8C\u3002\u5728\u5B66\u4E60**<\u722C\u5C71>**\u79D1\u6280\u4E4B\u524D\uFF0C\u65E0\u6CD5\u53D1\u73B0\u77FF\u5C71\u3002"
HintContent: "\u5B66\u4E60**<\u91C7\u77FF>**\u79D1\u6280\uFF0C\u5C31\u80FD\u5C06\u77FF\u5C71\u6539\u9020\u4E3A\u91C7\u77FF\u573A\uFF0C\u5E76\u4E3A\u57CE\u5E02\u63D0\u4F9B2\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u5728\u5B66\u4E60**<\u722C\u5C71>**\u79D1\u6280\u4E4B\u524D\uFF0C\u65E0\u6CD5\u53D1\u73B0\u77FF\u5C71\u3002"
- HintType: 9
HintName: "\u53EF\u6536\u83B7\u6C34\u679C"
HintContent: "\u5B66\u4E60**<\u91C7\u96C6>**\u79D1\u6280\uFF0C\u5C31\u80FD\u6536\u83B7\u6C34\u679C\uFF0C\u5E76\u4E3A\u57CE\u5E02\u63D0\u4F9B1\u70B9\u7ECF\u9A8C\u3002"
HintContent: "\u5B66\u4E60**<\u91C7\u96C6>**\u79D1\u6280\uFF0C\u5C31\u80FD\u6536\u83B7\u6C34\u679C\uFF0C\u5E76\u4E3A\u57CE\u5E02\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"

View File

@ -18,7 +18,7 @@ MonoBehaviour:
HintDesc: "\u9009\u4E2D\u5355\u4F4D\uFF0C\u5411\u8FF7\u96FE\u5730\u5757\u79FB\u52A8\u3002\u6BCF\u4E2A\u5355\u4F4D\u6BCF\u56DE\u5408\u53EA\u80FD\u79FB\u52A8\u4E00\u6B21\u3002"
- PlayerTaskType: 7
PlayerTaskDesc: "\u62E5\u6709**<{param2_cur}/{param2_tar}>**\u4E2A**<Lv.{param1_tar}>**\u57CE\u5E02"
HintDesc: "\u6253\u5F00\u53F3\u4E0B\u89D2\u7684\u79D1\u6280\u6811\u6309\u94AE\uFF0C\u5B66\u4E60**<\u5B88\u77E2\u77FF\u4E1A>**\u79D1\u6280\u540E\uFF0C\u5373\u53EF\u5C06\u62E5\u6709**<\u77FF\u77F3>**\u7684\u5C71\u8109\u6539\u9020\u4E3A**<\u91C7\u77FF\u573A>**\uFF0C\u4ECE\u800C\u5347\u7EA7\u57CE\u5E02\u3002\u5B66\u4E60**<\u5B88\u77E2\u51B6\u70BC\u4E1A>**\u540E\uFF0C\u5EFA\u9020**<\u51B6\u70BC\u5382>**\u5C06\u83B7\u5F97\u66F4\u591A\u57CE\u5E02\u7ECF\u9A8C\u3002"
HintDesc: "\u6253\u5F00\u53F3\u4E0B\u89D2\u7684\u79D1\u6280\u6811\u6309\u94AE\uFF0C\u5B66\u4E60**<\u5B88\u77E2\u77FF\u4E1A>**\u79D1\u6280\u540E\uFF0C\u5373\u53EF\u5C06\u62E5\u6709**<\u77FF\u77F3>**\u7684\u5C71\u8109\u6539\u9020\u4E3A**<\u91C7\u77FF\u573A>**\uFF0C\u4ECE\u800C\u5347\u7EA7\u57CE\u5E02\u3002\u5B66\u4E60**<\u5B88\u77E2\u51B6\u70BC\u4E1A>**\u540E\uFF0C\u5EFA\u9020**<\u51B6\u70BC\u5382>**\u5C06\u83B7\u5F97\u66F4\u591A**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
- PlayerTaskType: 5
PlayerTaskDesc: "\u62E5\u6709**<{param1_cur}/{param1_tar}>**\u4E2A\u57CE\u5E02"
HintDesc: "\u63A2\u7D22\u5730\u56FE\uFF0C\u627E\u5230**<\u6751\u5E84>**\u5E76\u5360\u9886\uFF0C\u5373\u53EF\u83B7\u5F97\u65B0\u7684\u57CE\u5E02\u3002"

View File

@ -651,7 +651,7 @@ MonoBehaviour:
SkillIcon: {fileID: 0}
HasShowList: 0
SkillShowList: []
skillPriority: 0
skillPriority: 1
ReserveOnCarry: 0
ReserveLeaveCarry: 0
ReserveGiantUpgrade: 0
@ -1181,13 +1181,13 @@ MonoBehaviour:
- SkillType: 92
SkillViewType: 2
SkillName: "\u4E0D\u6B7B\u9E1F\u91CD\u751F"
SkillDesc: "\u59B9\u7EA2\u9635\u4EA1\u540E\u53D8\u4E3A\u706B\u7130\u72B6\u6001\uFF0C\u706B\u7130\u4E0D\u53EF\u653B\u51FB\u53CD\u51FB\uFF0C\u79FB\u52A8\u65F6\u9020\u6210\u6E85\u5C04\u4F24\u5BB3\u3002\u82E5\u706B\u7130\u5B58\u6D3B\u56DE\u5408\u6570\u8FBE\u5230**<\u5F53\u524D\u7B49\u7EA7\u6570\u989D>**\uFF0C\u59B9\u7EA2\u5728\u706B\u7130\u5904\u590D\u6D3B\u3002\u706B\u7130\u6D88\u5931\u65F6\u4E0D\u4F1A\u91CD\u7F6E\u590D\u6D3B\u51B7\u5374\u65F6\u95F4\u3002"
SkillDesc: "\u59B9\u7EA2\u9635\u4EA1\u540E\u53D8\u4E3A\u706B\u7130\u72B6\u6001\uFF0C\u706B\u7130\u4E0D\u53EF\u653B\u51FB\u53CD\u51FB\uFF0C\u79FB\u52A8\u65F6\u9020\u6210\u6E85\u5C04\u4F24\u5BB3\u3002**<\u590D\u6D3B\u51B7\u5374\u65F6\u95F4>**\u7ED3\u675F\u7684\u4E0B\u4E00\u56DE\u5408\uFF0C\u59B9\u7EA2\u5728\u706B\u7130\u5904\u590D\u6D3B\u4E14\u80FD\u7ACB\u523B\u884C\u52A8\u3002\u706B\u7130\u6D88\u5931\u65F6\u4E0D\u4F1A\u91CD\u7F6E**<\u590D\u6D3B\u51B7\u5374\u65F6\u95F4>**\u3002"
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: 75b508c1ae4678a418bf2cecdbf4d6f1, type: 3}
HasShowList: 0
SkillShowList: []
skillPriority: 0
skillPriority: 1
ReserveOnCarry: 0
ReserveLeaveCarry: 0
ReserveGiantUpgrade: 0
@ -2277,7 +2277,7 @@ MonoBehaviour:
- SkillType: 163
SkillViewType: 2
SkillName: "\u5FA1\u795E\u7B7E"
SkillDesc: "\u6CBB\u7597\u53CB\u65B9\u6216\u653B\u51FB\u654C\u65B9\u65F6\uFF0C\u5C06\u989D\u5916\u6295\u63B7\u5FA1\u795E\u7B7E\u3002\u82E5\u63B7\u51FA**<\u5927\u5409>**\u6216\u8005**<\u5927\u51F6>**\uFF0C\u5219\u56DE\u590D\u5168\u90E8\u884C\u52A8\u70B9\u6570\u3002\u82E53\u6B21\u884C\u52A8\u5747\u4E3A\u63B7\u51FA**<\u5927\u5409>**\u6216**<\u5927\u51F6>**\uFF0C\u4E0B\u6B21\u884C\u52A8\u5FC5\u51FA\u3002"
SkillDesc: "\u6CBB\u7597\u53CB\u65B9\u6216\u653B\u51FB\u654C\u65B9\u65F6\uFF0C\u5C06\u989D\u5916\u6295\u63B7\u5FA1\u795E\u7B7E\u3002\u82E5\u63B7\u51FA**<\u5927\u5409>**\u6216\u8005**<\u5927\u51F6>**\uFF0C\u5219\u83B7\u5F971\u70B9**<\u901A\u7528\u884C\u52A8\u70B9>**\u3002\u82E53\u6B21\u884C\u52A8\u5747\u4E3A\u63B7\u51FA**<\u5927\u5409>**\u6216**<\u5927\u51F6>**\uFF0C\u4E0B\u6B21\u884C\u52A8\u5FC5\u51FA\u3002"
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: 5aa40b680a2dc21409fa27a486f4dace, type: 3}
@ -2291,7 +2291,7 @@ MonoBehaviour:
- SkillType: 164
SkillViewType: 2
SkillName: "\u66B4\u4E71\u795E\u7B7E\u8FDE\u63B7"
SkillDesc: "\u6BCF\u6B21\u6295\u63B7**<\u795E\u7B7E>**\u5C06\u8FDE\u7EED\u63B7\u51FA3\u679A\u3002\u51FA\u73B0**<\u5927\u5409>**\u5373\u53EF\u989D\u5916\u83B7\u5F97\u4E00\u6B21\u653B\u51FB\u673A\u4F1A\u3002"
SkillDesc: "\u6BCF\u6B21\u6295\u63B7**<\u795E\u7B7E>**\u5C06\u8FDE\u7EED\u63B7\u51FA3\u679A\u3002"
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: f6ec388298702e34b8e97da694bbcbf1, type: 3}
@ -2426,7 +2426,7 @@ MonoBehaviour:
- SkillType: 198
SkillViewType: 4
SkillName: "\u5927\u5409\xB7\u518D\u52A8"
SkillDesc: "\u5B8C\u6210\u51FB\u6740\u540E\uFF0C\u6D88\u80171\u5C42\u5E76\u6062\u590D\u6240\u6709\u884C\u52A8\u70B9\u6570\u3002\u63D0\u4F9B1\u6B21\u6548\u679C\u3002"
SkillDesc: "\u5B8C\u6210\u51FB\u6740\u540E\uFF0C\u6D88\u80171\u5C42\u5E76\u6062\u590D1\u70B9**<\u901A\u7528\u884C\u52A8\u70B9>**\u3002"
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: a28eb05639f2b1c4aa4e06a448abf997, type: 3}
@ -2510,7 +2510,7 @@ MonoBehaviour:
- SkillType: 204
SkillViewType: 3
SkillName: "\u5927\u5409\xB7\u52A9\u654C"
SkillDesc: "\u88AB\u51FB\u6740\u540E\uFF0C\u51FB\u6740\u8005\u6062\u590D\u6240\u6709\u884C\u52A8\u673A\u4F1A"
SkillDesc: "\u88AB\u51FB\u6740\u540E\uFF0C\u51FB\u6740\u8005\u6062\u590D1\u70B9**<\u901A\u7528\u884C\u52A8\u70B9>**"
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: 6bb6788bb6110b6429062d66b8b30a4f, type: 3}
@ -2687,7 +2687,7 @@ MonoBehaviour:
- SkillType: 209
SkillViewType: 2
SkillName: "\u72C2\u72AC\u65AD\u566C"
SkillDesc: "\u51FB\u6740\u9644\u6709**<\u5F02\u7AEF\u70D9\u5370>**\u7684\u76EE\u6807\u540E\uFF0C\u6062\u590D\u6240\u6709\u884C\u52A8\u673A\u4F1A\uFF0C\u5E76\u5237\u65B0\u6280\u80FD**<\u79FB\u52A8\u653B\u51FB>**"
SkillDesc: "\u51FB\u6740\u9644\u6709**<\u5F02\u7AEF\u70D9\u5370>**\u7684\u76EE\u6807\u540E\uFF0C\u6062\u590D**<\u901A\u7528\u884C\u52A8\u70B9>**\uFF0C\u5E76\u5237\u65B0\u6280\u80FD**<\u79FB\u52A8\u653B\u51FB>**"
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: 825bb3e1196830c46bc9a57a6bc8213c, type: 3}
@ -2715,7 +2715,7 @@ MonoBehaviour:
- SkillType: 211
SkillViewType: 2
SkillName: "\u8111\u6307\u7EB9"
SkillDesc: "\u9644\u8FD12\u683C\u5185\u7684\u654C\u65B9\u5355\u4F4D\u53D1\u8D77\u4E3B\u52A8\u653B\u51FB\u524D\u88AB\u9644\u52A01\u5C42**<\u6050\u60E7>**"
SkillDesc: "\u9644\u8FD12\u683C\u5185\u7684\u654C\u65B9\u5355\u4F4D\u53D1\u8D77**<\u4E3B\u52A8\u653B\u51FB>**\u524D\u88AB\u9644\u52A01\u5C42**<\u6050\u60E7>**"
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: 0fc32a2f0f0257544a262d24f2007f45, type: 3}
@ -2729,7 +2729,7 @@ MonoBehaviour:
- SkillType: 212
SkillViewType: 2
SkillName: "\u6B63\u6CD5\u4E4B\u675F"
SkillDesc: "\u4E3B\u52A8\u653B\u51FB\u65F6\u4E3A\u76EE\u6807\u9644\u52A0**<\u5FC3\u7406\u521B\u4F24>**"
SkillDesc: "**<\u4E3B\u52A8\u653B\u51FB>**\u6216**<\u53CD\u51FB>**\u65F6\u4E3A\u76EE\u6807\u9644\u52A0**<\u5FC3\u7406\u521B\u4F24>**"
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: cb1349a579ede11408e930e7513c4265, type: 3}
@ -2743,7 +2743,7 @@ MonoBehaviour:
- SkillType: 213
SkillViewType: 3
SkillName: "\u5FC3\u7406\u521B\u4F24"
SkillDesc: "\u6240\u6709\u80FD\u529B\u5931\u6548"
SkillDesc: "\u6240\u6709\u80FD\u529B\u5931\u6548(**<\u56FA\u6709\u80FD\u529B>**\u9664\u5916)"
NotShow: 0
ShowOnUnitMono: 1
SkillIcon: {fileID: 21300000, guid: 717815cb183d0d740ac061169e3cf67f, type: 3}
@ -2889,7 +2889,7 @@ MonoBehaviour:
SkillIcon: {fileID: 21300000, guid: de3bb8de90b277e4d83c00930a9e7933, type: 3}
HasShowList: 0
SkillShowList: []
skillPriority: 0
skillPriority: 1
ReserveOnCarry: 0
ReserveLeaveCarry: 0
ReserveGiantUpgrade: 0
@ -2945,7 +2945,7 @@ MonoBehaviour:
SkillIcon: {fileID: 21300000, guid: d5e0a6906fa14364f8fc44cb42f990c2, type: 3}
HasShowList: 0
SkillShowList: []
skillPriority: 0
skillPriority: 1
ReserveOnCarry: 0
ReserveLeaveCarry: 0
ReserveGiantUpgrade: 0
@ -3035,23 +3035,14 @@ MonoBehaviour:
ReserveGiantUpgrade: 0
ReserveCommonTransform: 0
- SkillType: 224
SkillViewType: 2
SkillViewType: 1
SkillName: "\u6151\u5FC3"
SkillDesc: "\u4E3B\u52A8\u653B\u51FB\u65F6\u4E3A\u76EE\u6807\u9644\u52A0**<\u6050\u60E7>**"
SkillDesc: "**<\u4E3B\u52A8\u653B\u51FB>**\u6216**<\u53CD\u51FB>**\u65F6\u4E3A\u76EE\u6807\u9644\u52A0**<\u6050\u60E7>**"
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: a08a040eae9080b489eb62a1e78c94fd, type: 3}
HasShowList: 0
SkillShowList:
- UnitFullType:
UnitType: 0
GiantType: 0
UnitLevel: 0
IgnoreUnitGiantType: 0
IgnoreUnitLevel: 1
Icon: {fileID: 0}
SkillDesc: "\u4E3B\u52A8\u653B\u51FB\u65F6\u4E3A\u76EE\u6807\u9644\u52A0**<\u6050\u60E7>**"
SkillName: "\u6050\u6016\u56DE\u5FC6"
SkillShowList: []
skillPriority: 0
ReserveOnCarry: 0
ReserveLeaveCarry: 0
@ -3059,22 +3050,13 @@ MonoBehaviour:
ReserveCommonTransform: 0
- SkillType: 271
SkillViewType: 2
SkillName: "\u6151\u5FC3"
SkillDesc: "\u4E3B\u52A8\u653B\u51FB\u65F6\u4E3A\u76EE\u6807\u9644\u52A02\u5C42**<\u6050\u60E7>**"
SkillName: "\u6050\u6016\u56DE\u5FC6"
SkillDesc: "**<\u4E3B\u52A8\u653B\u51FB>**\u6216**<\u53CD\u51FB>**\u65F6\u4E3A\u76EE\u6807\u9644\u52A02\u5C42**<\u6050\u60E7>**"
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: a08a040eae9080b489eb62a1e78c94fd, type: 3}
HasShowList: 0
SkillShowList:
- UnitFullType:
UnitType: 0
GiantType: 0
UnitLevel: 0
IgnoreUnitGiantType: 0
IgnoreUnitLevel: 1
Icon: {fileID: 0}
SkillDesc: "\u4E3B\u52A8\u653B\u51FB\u65F6\u4E3A\u76EE\u6807\u9644\u52A02\u5C42**<\u6050\u60E7>**"
SkillName: "\u6050\u6016\u56DE\u5FC6\xB7\u6539"
SkillShowList: []
skillPriority: 0
ReserveOnCarry: 0
ReserveLeaveCarry: 0
@ -3083,7 +3065,7 @@ MonoBehaviour:
- SkillType: 242
SkillViewType: 2
SkillName: "\u672B\u6CD5\u6D9F\u6F2A"
SkillDesc: "\u4E3B\u52A8\u653B\u51FB\u65F6\u4E3A\u76EE\u6807\u9644\u52A0**<\u4E8C\u91CD\u9ED1\u6B7B\u8776>**"
SkillDesc: "**<\u4E3B\u52A8\u653B\u51FB>**\u6216**<\u53CD\u51FB>**\u65F6\u4E3A\u76EE\u6807\u9644\u52A0**<\u4E8C\u91CD\u9ED1\u6B7B\u8776>**"
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: a718d5b9d0863e9438f829f596b366bc, type: 3}
@ -3414,7 +3396,7 @@ MonoBehaviour:
- SkillType: 257
SkillViewType: 1
SkillName: "\u6EE1\u6708\u4E4B\u72FC"
SkillDesc: "\u51FA\u6218\u65F6\u521D\u59CB\u8840\u91CF\u4E3A1\u70B9\u3002\u6BCF\u7F3A\u5C112\u70B9\u751F\u547D\uFF0C\u989D\u5916\u589E\u52A01\u70B9\u4F24\u5BB3\u3002\u4E3B\u52A8\u5B8C\u6210\u51FB\u6740\u65F6\u6062\u590D5\u70B9\u751F\u547D\u503C\u3002"
SkillDesc: "\u51FA\u6218\u65F6\u521D\u59CB\u8840\u91CF\u4E3A1\u70B9\u3002\u6BCF\u7F3A\u5C112\u70B9\u751F\u547D\uFF0C\u989D\u5916\u589E\u52A01\u70B9\u4F24\u5BB3\u3002**<\u4E3B\u52A8\u653B\u51FB>**\u6216**<\u53CD\u51FB>**\u5B8C\u6210\u51FB\u6740\u65F6\u6062\u590D5\u70B9\u751F\u547D\u503C\u3002"
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: 709d4360a7a8bf6498e007b85c6e25b8, type: 3}

View File

@ -903,7 +903,7 @@ MonoBehaviour:
iconViewSizeType: 1
- TechAtom: 6
TechAtomName: "\u5EFA\u9020\u548C\u5E73\u5947\u89C2"
Desc: "\u5EFA\u9020\u548C\u5E73\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u5EFA\u9020\u548C\u5E73\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -969,7 +969,7 @@ MonoBehaviour:
iconViewSizeType: 0
- TechAtom: 7
TechAtomName: "\u5EFA\u9020\u667A\u6167\u5947\u89C2"
Desc: "\u5EFA\u9020\u667A\u6167\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u5EFA\u9020\u667A\u6167\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -1035,7 +1035,7 @@ MonoBehaviour:
iconViewSizeType: 0
- TechAtom: 8
TechAtomName: "\u5EFA\u9020\u8D38\u6613\u5947\u89C2"
Desc: "\u5EFA\u9020\u8D38\u6613\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C"
Desc: "\u5EFA\u9020\u8D38\u6613\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**"
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -1101,7 +1101,7 @@ MonoBehaviour:
iconViewSizeType: 0
- TechAtom: 9
TechAtomName: "\u5EFA\u9020\u548C\u5E73\u5947\u89C2"
Desc: "\u5EFA\u9020\u548C\u5E73\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C"
Desc: "\u5EFA\u9020\u548C\u5E73\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**"
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -1167,7 +1167,7 @@ MonoBehaviour:
iconViewSizeType: 0
- TechAtom: 10
TechAtomName: "\u5EFA\u9020\u6743\u529B\u5947\u89C2"
Desc: "\u5EFA\u9020\u6743\u529B\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C"
Desc: "\u5EFA\u9020\u6743\u529B\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**"
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -1233,7 +1233,7 @@ MonoBehaviour:
iconViewSizeType: 0
- TechAtom: 11
TechAtomName: "\u5EFA\u9020\u6587\u5316\u5947\u89C2"
Desc: "\u5EFA\u9020\u6587\u5316\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C"
Desc: "\u5EFA\u9020\u6587\u5316\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**"
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -1299,7 +1299,7 @@ MonoBehaviour:
iconViewSizeType: 0
- TechAtom: 12
TechAtomName: "\u5EFA\u9020\u63A2\u7D22\u5947\u89C2"
Desc: "\u5EFA\u9020\u63A2\u7D22\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9\u57CE\u5E02\u7ECF\u9A8C"
Desc: "\u5EFA\u9020\u63A2\u7D22\u5947\u89C2\uFF0C\u63D0\u4F9B3\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**"
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -1730,7 +1730,7 @@ MonoBehaviour:
iconViewSizeType: 0
- TechAtom: 17
TechAtomName: "\u5EFA\u9020\u91C7\u77FF\u573A"
Desc: "\u5C06**<\u91D1\u77FF>**\u5EFA\u9020\u4E3A**<\u91C7\u77FF\u573A>**\uFF0C\u63D0\u4F9B2\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u5C06**<\u91D1\u77FF>**\u5EFA\u9020\u4E3A**<\u91C7\u77FF\u573A>**\uFF0C\u63D0\u4F9B2\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -2353,7 +2353,7 @@ MonoBehaviour:
iconViewSizeType: 1
- TechAtom: 22
TechAtomName: "\u5EFA\u9020\u51B6\u70BC\u5382"
Desc: "**<\u51B6\u70BC\u5382>**\u5468\u56F4\u6BCF\u5EA7**<\u91C7\u77FF\u573A>**\u53EF\u4EE5\u63D0\u4F9B2\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u62E5\u6709\u4E00\u4E2A**<\u51B6\u70BC\u5382>**"
Desc: "**<\u51B6\u70BC\u5382>**\u5468\u56F4\u6BCF\u5EA7**<\u91C7\u77FF\u573A>**\u53EF\u4EE5\u63D0\u4F9B2\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u62E5\u6709\u4E00\u4E2A**<\u51B6\u70BC\u5382>**"
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -2385,7 +2385,7 @@ MonoBehaviour:
iconViewSizeType: 4
- TechAtom: 23
TechAtomName: "\u91C7\u96C6"
Desc: "\u6536\u83B7**<\u852C\u679C>**\u8D44\u6E90\uFF0C\u5E76\u83B7\u5F971\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u6536\u83B7**<\u852C\u679C>**\u8D44\u6E90\uFF0C\u5E76\u83B7\u5F971\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -2832,7 +2832,7 @@ MonoBehaviour:
iconViewSizeType: 2
- TechAtom: 26
TechAtomName: "\u5EFA\u9020\u519C\u7530"
Desc: "\u5C06**<\u5E84\u7A3C>**\u5EFA\u9020\u4E3A**<\u519C\u7530>**\uFF0C\u53EF\u63D0\u4F9B2\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u5C06**<\u5E84\u7A3C>**\u5EFA\u9020\u4E3A**<\u519C\u7530>**\uFF0C\u53EF\u63D0\u4F9B2\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -2942,7 +2942,7 @@ MonoBehaviour:
iconViewSizeType: 1
- TechAtom: 30
TechAtomName: "\u5EFA\u9020\u8C37\u4ED3"
Desc: "**<\u8C37\u4ED3>**\u5468\u56F4\u6BCF\u7247**<\u519C\u7530>**\u53EF\u4EE5\u63D0\u4F9B1\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u62E5\u6709\u4E00\u4E2A**<\u8C37\u4ED3>**"
Desc: "**<\u8C37\u4ED3>**\u5468\u56F4\u6BCF\u7247**<\u519C\u7530>**\u53EF\u4EE5\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u62E5\u6709\u4E00\u4E2A**<\u8C37\u4ED3>**"
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -3846,7 +3846,7 @@ MonoBehaviour:
iconViewSizeType: 0
- TechAtom: 42
TechAtomName: "\u72E9\u730E"
Desc: "\u6536\u83B7**<\u52A8\u7269>**\u8D44\u6E90\uFF0C\u5E76\u83B7\u5F971\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u6536\u83B7**<\u52A8\u7269>**\u8D44\u6E90\uFF0C\u5E76\u83B7\u5F971\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -3943,7 +3943,7 @@ MonoBehaviour:
iconViewSizeType: 4
- TechAtom: 43
TechAtomName: "\u5EFA\u9020\u4F10\u6728\u573A"
Desc: "\u5728**<\u68EE\u6797>**\u4E0A\u5EFA\u9020**<\u4F10\u6728\u573A>**\uFF0C\u63D0\u4F9B1\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002\u6CE8\u610F\uFF0C\u4F1A\u6E05\u9664\u68EE\u6797\u4E2D\u7684\u52A8\u7269\u3002"
Desc: "\u5728**<\u68EE\u6797>**\u4E0A\u5EFA\u9020**<\u4F10\u6728\u573A>**\uFF0C\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u6CE8\u610F\uFF0C\u4F1A\u6E05\u9664\u68EE\u6797\u4E2D\u7684\u52A8\u7269\u3002"
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -4378,7 +4378,7 @@ MonoBehaviour:
iconViewSizeType: 2
- TechAtom: 47
TechAtomName: "\u5EFA\u9020\u952F\u6728\u5382"
Desc: "**<\u952F\u6728\u5382>**\u5468\u56F4\u6BCF\u5EA7**<\u4F10\u6728\u573A>**\u53EF\u4EE5\u63D0\u4F9B1\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u62E5\u6709\u4E00\u4E2A**<\u952F\u6728\u5382>**\u3002"
Desc: "**<\u952F\u6728\u5382>**\u5468\u56F4\u6BCF\u5EA7**<\u4F10\u6728\u573A>**\u53EF\u4EE5\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u62E5\u6709\u4E00\u4E2A**<\u952F\u6728\u5382>**\u3002"
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -4663,7 +4663,7 @@ MonoBehaviour:
iconViewSizeType: 1
- TechAtom: 49
TechAtomName: "\u4FDD\u62A4\u533A"
Desc: "\u6BCF\u4E2A\u57CE\u5E02\u9996\u5EA7\u4FDD\u62A4\u533A\u514D\u8D39\uFF0C\u540E\u7EED\u8D39\u75285\u91D1\u5E01\u9012\u589E\u3002\u6BCF\u4E2A\u4FDD\u62A4\u533A\u6536\u76CA\uFF1A\u6D45\u6D77+1\u56DE\u5408\u91D1\u5E01\uFF0C\u68EE\u6797+1\u57CE\u5E02\u7ECF\u9A8C\uFF0C\u5C71\u5730/\u6DF1\u6D77+1\u56DE\u5408\u79D1\u6280\u3002\u82E54\u4E2A\u4FDD\u62A4\u533A\u56F4\u6210\u4E00\u5708\u4E14\u62E5\u6709\u81F3\u5C113\u79CD\u4E0D\u540C\u7684\u5730\u5F62\u5730\u8C8C\uFF0C\u5C06\u6FC0\u6D3B[\u56FD\u5BB6\u516C\u56ED]\u6548\u679C\uFF1A\u4FDD\u62A4\u533A\u6536\u76CA\u7FFB\u500D\u3002"
Desc: "\u6BCF\u4E2A\u57CE\u5E02\u9996\u5EA7\u4FDD\u62A4\u533A\u514D\u8D39\uFF0C\u540E\u7EED\u8D39\u75285\u91D1\u5E01\u9012\u589E\u3002\u6BCF\u4E2A\u4FDD\u62A4\u533A\u6536\u76CA\uFF1A\u6D45\u6D77+1\u56DE\u5408\u91D1\u5E01\uFF0C\u68EE\u6797+1**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\uFF0C\u5C71\u5730/\u6DF1\u6D77+1\u56DE\u5408\u79D1\u6280\u3002\u82E54\u4E2A\u4FDD\u62A4\u533A\u56F4\u6210\u4E00\u5708\u4E14\u62E5\u6709\u81F3\u5C113\u79CD\u4E0D\u540C\u7684\u5730\u5F62\u5730\u8C8C\uFF0C\u5C06\u6FC0\u6D3B[\u56FD\u5BB6\u516C\u56ED]\u6548\u679C\uFF1A\u4FDD\u62A4\u533A\u6536\u76CA\u7FFB\u500D\u3002"
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -4831,7 +4831,7 @@ MonoBehaviour:
iconViewSizeType: 0
- TechAtom: 51
TechAtomName: "\u6355\u9C7C"
Desc: "\u6536\u83B7**<\u9C7C\u7FA4>**\u8D44\u6E90\uFF0C\u5E76\u83B7\u5F971\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002"
Desc: "\u6536\u83B7**<\u9C7C\u7FA4>**\u8D44\u6E90\uFF0C\u5E76\u83B7\u5F971\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002"
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -4863,7 +4863,7 @@ MonoBehaviour:
iconViewSizeType: 4
- TechAtom: 52
TechAtomName: "\u5EFA\u9020\u6E2F\u53E3"
Desc: "\u5728**<\u6D45\u6D77>**\u5EFA\u9020**<\u6E2F\u53E3>**\uFF0C\u53EF\u63D0\u4F9B1\u70B9\u57CE\u5E02\u7ECF\u9A8C\u3002\u80FD\u591F\u5C06\u666E\u901A\u5355\u4F4D\u8F6C\u5316\u4E3A\u6D77\u4E0A\u5355\u4F4D\uFF0C\u540C\u65F6\u80FD\u591F\u5EFA\u7ACB**<\u6D77\u6D0B\u8D38\u6613\u901A\u8DEF>**\u3002"
Desc: "\u5728**<\u6D45\u6D77>**\u5EFA\u9020**<\u6E2F\u53E3>**\uFF0C\u53EF\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u3002\u80FD\u591F\u5C06\u666E\u901A\u5355\u4F4D\u8F6C\u5316\u4E3A\u6D77\u4E0A\u5355\u4F4D\uFF0C\u540C\u65F6\u80FD\u591F\u5EFA\u7ACB**<\u6D77\u6D0B\u8D38\u6613\u901A\u8DEF>**\u3002"
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -4909,7 +4909,7 @@ MonoBehaviour:
iconViewSizeType: 5
- TechAtom: 54
TechAtomName: "\u519B\u6E2F"
Desc: "\u4E3A\u5904\u4E8E\u519B\u6E2F\u7684\u5355\u4F4D\u6062\u590D\u6240\u6709\u884C\u52A8\u70B9\u6570\u3002\u6BCF\u56DE\u5408\u4E0A\u9650\u4E00\u6B21\u3002\u63D0\u4F9B\u989D\u5916\u9632\u5FA1\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u5EFA\u9020\u4E00\u5EA7**<\u519B\u6E2F>**\u3002"
Desc: "\u4E3A\u5904\u4E8E\u519B\u6E2F\u7684**<\u8239\u53EA\u5355\u4F4D>**\u6062\u590D1\u70B9**<\u901A\u7528\u884C\u52A8\u70B9>**\u3002\u6BCF\u56DE\u5408\u4E0A\u9650\u4E00\u6B21\u3002\u63D0\u4F9B\u989D\u5916\u9632\u5FA1\u3002\u6BCF\u5EA7\u57CE\u5E02\u4EC5\u80FD\u5EFA\u9020\u4E00\u5EA7**<\u519B\u6E2F>**\u3002"
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -5938,7 +5938,7 @@ MonoBehaviour:
iconViewSizeType: 0
- TechAtom: 70
TechAtomName: "\u704C\u6E89\u5DE5\u7A0B"
Desc: "\u5E1D\u56FD\u7279\u8272\u5EFA\u7B51\u3002\u53EF\u5EFA\u9020\u5728\u4E0E\u81F3\u5C11\u4E24\u7247\u6C34\u57DF**<\u76F4\u63A5\u76F8\u90BB>**\u7684\u5E73\u539F\u4E0A(\u9700\u7814\u53D1**<\u704C\u6E89>**\u79D1\u6280)\uFF0C\u53EF\u5EFA\u9020\u5728\u4E0E\u81F3\u5C11\u4E24\u7247\u9646\u5730**<\u76F4\u63A5\u76F8\u90BB>**\u7684\u6C34\u57DF\u4E2D(\u9700\u7814\u53D1**<\u6392\u6D9D>**\u79D1\u6280)\u3002\u4E0D\u80FD\u4E0E\u53E6\u4E00\u4E2A**<\u704C\u6E89\u5DE5\u7A0B>**\u76F8\u90BB\u3002\u6BCF2\u56DE\u5408\u5728\u9644\u8FD1\u7A7A\u5730\u4E0A\u751F\u6210**<\u5E84\u7A3C>**\uFF0C\u5468\u56F4\u6BCF\u7247\u519C\u7530\u989D\u5916\u63D0\u4F9B1\u70B9\u57CE\u5E02\u7ECF\u9A8C(\u4E0A\u96502\u70B9)\uFF0C\u4E3A**<\u5E02\u573A>**\u63D0\u4F9B\u989D\u5916\u91D1\u5E01\u3002"
Desc: "\u5E1D\u56FD\u7279\u8272\u5EFA\u7B51\u3002\u53EF\u5EFA\u9020\u5728\u4E0E\u81F3\u5C11\u4E24\u7247\u6C34\u57DF**<\u76F4\u63A5\u76F8\u90BB>**\u7684\u5E73\u539F\u4E0A(\u9700\u7814\u53D1**<\u704C\u6E89>**\u79D1\u6280)\uFF0C\u53EF\u5EFA\u9020\u5728\u4E0E\u81F3\u5C11\u4E24\u7247\u9646\u5730**<\u76F4\u63A5\u76F8\u90BB>**\u7684\u6C34\u57DF\u4E2D(\u9700\u7814\u53D1**<\u6392\u6D9D>**\u79D1\u6280)\u3002\u4E0D\u80FD\u4E0E\u53E6\u4E00\u4E2A**<\u704C\u6E89\u5DE5\u7A0B>**\u76F8\u90BB\u3002\u6BCF2\u56DE\u5408\u5728\u9644\u8FD1\u7A7A\u5730\u4E0A\u751F\u6210**<\u5E84\u7A3C>**\uFF0C\u5468\u56F4\u6BCF\u7247\u519C\u7530\u989D\u5916\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**(\u4E0A\u96502\u70B9)\uFF0C\u4E3A**<\u5E02\u573A>**\u63D0\u4F9B\u989D\u5916\u91D1\u5E01\u3002"
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -6016,7 +6016,7 @@ MonoBehaviour:
iconViewSizeType: 2
- TechAtom: 73
TechAtomName: "\u704C\u6E89\u5DE5\u7A0B"
Desc: "\u9635\u8425\u7279\u8272\u5EFA\u7B51\u3002\u53EF\u5EFA\u9020\u5728\u4E0E\u81F3\u5C11\u4E24\u7247\u6C34\u57DF**<\u76F4\u63A5\u76F8\u90BB>**\u7684\u5E73\u539F\u4E0A(\u9700\u7814\u53D1**<\u704C\u6E89>**\u79D1\u6280)\uFF0C\u53EF\u5EFA\u9020\u5728\u4E0E\u81F3\u5C11\u4E24\u7247\u9646\u5730**<\u76F4\u63A5\u76F8\u90BB>**\u7684\u6C34\u57DF\u4E2D(\u9700\u7814\u53D1**<\u6392\u6D9D>**\u79D1\u6280)\u3002\u4E0D\u80FD\u4E0E\u53E6\u4E00\u4E2A**<\u704C\u6E89\u5DE5\u7A0B>**\u76F8\u90BB\u3002\u6BCF2\u56DE\u5408\u5728\u9644\u8FD1\u7A7A\u5730\u4E0A\u751F\u6210**<\u5E84\u7A3C>**\uFF0C\u5468\u56F4\u6BCF\u7247\u519C\u7530\u989D\u5916\u63D0\u4F9B1\u70B9\u57CE\u5E02\u7ECF\u9A8C(\u4E0A\u96502\u70B9)\uFF0C\u4E3A**<\u5E02\u573A>**\u63D0\u4F9B\u989D\u5916\u91D1\u5E01\u3002"
Desc: "\u9635\u8425\u7279\u8272\u5EFA\u7B51\u3002\u53EF\u5EFA\u9020\u5728\u4E0E\u81F3\u5C11\u4E24\u7247\u6C34\u57DF**<\u76F4\u63A5\u76F8\u90BB>**\u7684\u5E73\u539F\u4E0A(\u9700\u7814\u53D1**<\u704C\u6E89>**\u79D1\u6280)\uFF0C\u53EF\u5EFA\u9020\u5728\u4E0E\u81F3\u5C11\u4E24\u7247\u9646\u5730**<\u76F4\u63A5\u76F8\u90BB>**\u7684\u6C34\u57DF\u4E2D(\u9700\u7814\u53D1**<\u6392\u6D9D>**\u79D1\u6280)\u3002\u4E0D\u80FD\u4E0E\u53E6\u4E00\u4E2A**<\u704C\u6E89\u5DE5\u7A0B>**\u76F8\u90BB\u3002\u6BCF2\u56DE\u5408\u5728\u9644\u8FD1\u7A7A\u5730\u4E0A\u751F\u6210**<\u5E84\u7A3C>**\uFF0C\u5468\u56F4\u6BCF\u7247\u519C\u7530\u989D\u5916\u63D0\u4F9B1\u70B9**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**(\u4E0A\u96502\u70B9)\uFF0C\u4E3A**<\u5E02\u573A>**\u63D0\u4F9B\u989D\u5916\u91D1\u5E01\u3002"
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0

View File

@ -5698,7 +5698,7 @@ MonoBehaviour:
Civ: 2
Force: 2
Name: "\u706B\u7130 Lv.2"
Desc: "\u59B9\u7EA2"
Desc: "**<\u85E4\u539F\u59B9\u7EA2>**\u9635\u4EA1\u540E\u5316\u4F5C\u4E0D\u706D\u706B\u7130\uFF0C\u6570\u56DE\u5408\u540E\u590D\u6D3B\u3002"
LandType: 3
NoMaxHealth: 0
MaxHealth: 30
@ -5724,7 +5724,7 @@ MonoBehaviour:
Civ: 2
Force: 2
Name: "\u706B\u7130 Lv.3"
Desc:
Desc: "**<\u85E4\u539F\u59B9\u7EA2>**\u9635\u4EA1\u540E\u5316\u4F5C\u4E0D\u706D\u706B\u7130\uFF0C\u6570\u56DE\u5408\u540E\u590D\u6D3B\u3002"
LandType: 3
NoMaxHealth: 0
MaxHealth: 40
@ -5750,7 +5750,7 @@ MonoBehaviour:
Civ: 2
Force: 2
Name: "\u706B\u7130 Lv.4"
Desc:
Desc: "**<\u85E4\u539F\u59B9\u7EA2>**\u9635\u4EA1\u540E\u5316\u4F5C\u4E0D\u706D\u706B\u7130\uFF0C\u6570\u56DE\u5408\u540E\u590D\u6D3B\u3002"
LandType: 3
NoMaxHealth: 0
MaxHealth: 50
@ -7616,7 +7616,7 @@ MonoBehaviour:
MoveRange: 0
AttackRange: 0
Cost: 0
Skills: 0100000007000000d8000000
Skills: 0100000007000000d800000053000000
Sprite: {fileID: 21300000, guid: 8d642fe2c85bf0b49a73ad8d304f5374, type: 3}
IsSpriteVarient: 0
SpriteList: []
@ -8025,7 +8025,7 @@ MonoBehaviour:
AttackRange: 1
Cost: 0
Skills: 02000000030000000d0000000d010000
Sprite: {fileID: 21300000, guid: c662e6880212d104dbdbeda8015d1ef0, type: 3}
Sprite: {fileID: 21300000, guid: 0dbaa2160980ead4c9af0a34805fb6f4, type: 3}
IsSpriteVarient: 0
SpriteList: []
ProjectileType: 1

File diff suppressed because one or more lines are too long

View File

@ -37,6 +37,7 @@ MonoBehaviour:
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
@ -56,6 +57,7 @@ MonoBehaviour:
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
@ -97,6 +99,7 @@ MonoBehaviour:
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
@ -116,6 +119,7 @@ MonoBehaviour:
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
@ -157,6 +161,7 @@ MonoBehaviour:
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
@ -176,6 +181,7 @@ MonoBehaviour:
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
@ -217,6 +223,7 @@ MonoBehaviour:
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
@ -236,6 +243,7 @@ MonoBehaviour:
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
@ -277,6 +285,7 @@ MonoBehaviour:
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
@ -296,6 +305,7 @@ MonoBehaviour:
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
@ -337,6 +347,7 @@ MonoBehaviour:
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
@ -356,6 +367,7 @@ MonoBehaviour:
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
@ -397,6 +409,7 @@ MonoBehaviour:
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
@ -416,6 +429,7 @@ MonoBehaviour:
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
@ -464,6 +478,7 @@ MonoBehaviour:
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
@ -483,6 +498,7 @@ MonoBehaviour:
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
@ -524,6 +540,7 @@ MonoBehaviour:
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
@ -543,6 +560,7 @@ MonoBehaviour:
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
@ -585,6 +603,7 @@ MonoBehaviour:
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
@ -604,6 +623,317 @@ MonoBehaviour:
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
TechAtom: 0
GeoIdList:
UnitFullType:
UnitType: 0
GiantType: 0
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
Icon: {fileID: 0}
IconSizeType: 0
HasIcon: 0
- Id: 12
Name: "\u653B\u51FB\u884C\u52A8\u70B9"
Types: 0300000086000000
DescItems:
- DescType: 0
Desc: "\u5141\u8BB8\u8FDB\u884C**<\u4E3B\u52A8\u653B\u51FB>**\u3002\n**<\u4E3B\u52A8\u653B\u51FB>**\u4F1A\u6D88\u8017\u6389\u5F53\u524D\u6240\u6709\u884C\u52A8\u70B9"
UseHint: 0
HintProvider:
HintDataType: 0
Text: "\u9ED8\u8BA4\u9759\u6001\u6587\u672C..."
TechTypeData: 0
SkillTypeData: 0
ActionIdData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
locked: 0
TextData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
TechAtom: 0
GeoIdList:
UnitFullType:
UnitType: 0
GiantType: 0
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
Icon: {fileID: 0}
IconSizeType: 0
HasIcon: 0
- Id: 13
Name: "\u79FB\u52A8\u884C\u52A8\u70B9"
Types: 0300000086000000
DescItems:
- DescType: 0
Desc: "\u5141\u8BB8\u8FDB\u884C**<\u4E3B\u52A8\u79FB\u52A8>**\n**<\u4E3B\u52A8\u79FB\u52A8>**\u4F1A\u6D88\u8017\u6389\u5F53\u524D\u6240\u6709\u884C\u52A8\u70B9"
UseHint: 0
HintProvider:
HintDataType: 0
Text: "\u9ED8\u8BA4\u9759\u6001\u6587\u672C..."
TechTypeData: 0
SkillTypeData: 0
ActionIdData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
locked: 0
TextData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
TechAtom: 0
GeoIdList:
UnitFullType:
UnitType: 0
GiantType: 0
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
Icon: {fileID: 0}
IconSizeType: 0
HasIcon: 0
- Id: 14
Name: "\u65BD\u6CD5\u884C\u52A8\u70B9"
Types: 0300000086000000
DescItems:
- DescType: 0
Desc: "\u5141\u8BB8\u8FDB\u884C**<\u4E3B\u52A8\u884C\u52A8>**\n**<\u6CBB\u7597>**\u3001**<\u89E3\u96C7>**\u7B49\u901A\u7528\u884C\u52A8\uFF0C\u4EE5\u53CA**<\u884C\u52A8\u680F>**\u7684\u6240\u6709\u9009\u9879\u5747\u4E3A**<\u4E3B\u52A8\u884C\u52A8>**\n**<\u4E3B\u52A8\u884C\u52A8>**\u65F6\u4F1A\u6D88\u8017\u6389\u5F53\u524D\u6240\u6709\u884C\u52A8\u70B9"
UseHint: 0
HintProvider:
HintDataType: 0
Text: "\u9ED8\u8BA4\u9759\u6001\u6587\u672C..."
TechTypeData: 0
SkillTypeData: 0
ActionIdData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
locked: 0
TextData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
TechAtom: 0
GeoIdList:
UnitFullType:
UnitType: 0
GiantType: 0
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
Icon: {fileID: 0}
IconSizeType: 0
HasIcon: 0
- Id: 15
Name: "\u7A7A\u884C\u52A8\u70B9"
Types: 0300000086000000
DescItems:
- DescType: 0
Desc: "**<\u7A7A\u884C\u52A8\u70B9>**\u8868\u793A\u4F60\u5DF2\u7ECF\u6CA1\u6709\u53EF\u7528\u884C\u52A8\u70B9"
UseHint: 0
HintProvider:
HintDataType: 0
Text: "\u9ED8\u8BA4\u9759\u6001\u6587\u672C..."
TechTypeData: 0
SkillTypeData: 0
ActionIdData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
locked: 0
TextData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
TechAtom: 0
GeoIdList:
UnitFullType:
UnitType: 0
GiantType: 0
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
Icon: {fileID: 0}
IconSizeType: 0
HasIcon: 0
- Id: 16
Name: "\u56FA\u6709\u80FD\u529B"
Types: 0600000069000000
DescItems:
- DescType: 0
Desc: "\u90E8\u5206\u80FD\u529B\u662F\u4E0E\u5355\u4F4D\u4E0E\u751F\u4FF1\u6765\u7684**<\u56FA\u6709\u80FD\u529B>**\n\u4F8B\u5982**<\u81EA\u7ED9\u81EA\u8DB3>**\u3001**<\u6D88\u6563>**\u7B49\uFF0C\u4E0D\u4F1A\u53D7\u5230**<\u5FC3\u7406\u521B\u4F24>**\u7B49\u6280\u80FD\u5F71\u54CD\n**<\u56FA\u6709\u80FD\u529B>**\u4F1A\u6807\u6CE8\u5728\u6BCF\u4E00\u4E2A\u80FD\u529B\u7684\u6807\u9898\u9644\u8FD1"
UseHint: 0
HintProvider:
HintDataType: 0
Text: "\u9ED8\u8BA4\u9759\u6001\u6587\u672C..."
TechTypeData: 0
SkillTypeData: 0
ActionIdData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
locked: 0
TextData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
@ -650,6 +980,8 @@ MonoBehaviour:
Name: "\u6B63\u9762\u72B6\u6001"
- Type: 104
Name: "\u8D1F\u9762\u72B6\u6001"
- Type: 105
Name: "\u57FA\u7840\u80FD\u529B"
- Type: 110
Name: "\u79D1\u6280"
- Type: 111
@ -690,6 +1022,8 @@ MonoBehaviour:
Name: "\u5B88\u77E2\u5E1D\u56FD"
- Type: 204
Name: "\u53E4\u660E\u5730\u5E1D\u56FD"
- Type: 105
Name: "\u80FD\u529B\u57FA\u7840\u6982\u5FF5"
WikiDescTypeInfoList:
- Type: 0
Name: "\u57FA\u7840\u63CF\u8FF0"

View File

@ -2583,11 +2583,11 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 397
Desc: 1311
Desc: 21144
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 1
LockDesc: 1228
LockDesc: 21154
Icon: {fileID: 21300000, guid: d7b0a16ac6f53ad4b8820d8c295c6bc1, type: 3}
IconViewSizeType: 4
VarientIcon: 0
@ -2617,11 +2617,11 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 45
Desc: 1312
Desc: 21137
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 1
LockDesc: 1229
LockDesc: 21155
Icon: {fileID: 0}
IconViewSizeType: 4
VarientIcon: 1
@ -2898,11 +2898,11 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 400
Desc: 1313
Desc: 21140
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 1
LockDesc: 1230
LockDesc: 21156
Icon: {fileID: 0}
IconViewSizeType: 4
VarientIcon: 1
@ -3166,7 +3166,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 1179
Desc: 1231
Desc: 21138
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -3200,7 +3200,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 404
Desc: 1232
Desc: 21135
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -3234,7 +3234,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 406
Desc: 1233
Desc: 21141
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -3268,7 +3268,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 408
Desc: 1234
Desc: 21145
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -3336,7 +3336,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 412
Desc: 1259
Desc: 21139
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -3370,7 +3370,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 1260
Desc: 1261
Desc: 21142
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -3404,7 +3404,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 416
Desc: 1262
Desc: 21136
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -4121,7 +4121,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 1382
Desc: 2417
Desc: 21092
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -4155,7 +4155,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 1375
Desc: 17347
Desc: 21157
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -7247,7 +7247,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 458
Desc: 1210
Desc: 21128
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -7346,7 +7346,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 459
Desc: 1211
Desc: 21129
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -7445,7 +7445,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 460
Desc: 16654
Desc: 21130
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -7544,7 +7544,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 461
Desc: 17042
Desc: 21158
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -7643,7 +7643,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 462
Desc: 1213
Desc: 21132
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -7742,7 +7742,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 463
Desc: 1214
Desc: 21133
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -7841,7 +7841,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 464
Desc: 1215
Desc: 21134
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -9742,7 +9742,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 2237
Desc: 2374
Desc: 21159
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -9776,7 +9776,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 2447
Desc: 2464
Desc: 21111
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -9810,7 +9810,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 2437
Desc: 2472
Desc: 21112
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -9844,7 +9844,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 2270
Desc: 17242
Desc: 21113
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -10456,7 +10456,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 16698
Desc: 17440
Desc: 21114
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -10490,7 +10490,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 17441
Desc: 17442
Desc: 21115
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -10524,7 +10524,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 16769
Desc: 16773
Desc: 21116
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -10793,7 +10793,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 16933
Desc: 16934
Desc: 21160
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0
@ -11504,7 +11504,7 @@ MonoBehaviour:
AIParamType: 0
CultureCardType: 0
ActionName: 18156
Desc: 18652
Desc: 21161
NeedTechDesc: 0
TechDesc:
NeedLockDesc: 0

View File

@ -309,7 +309,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 21300000, guid: 7983e5706aca9634188e20ecea690403, type: 3}
ResourceName: 54
ResourceDesc: 1409
ResourceDesc: 21162
Exp: 2
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -324,7 +324,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 21300000, guid: 4814901362cb1924ca96564a88e97e74, type: 3}
ResourceName: 53
ResourceDesc: 1410
ResourceDesc: 21163
Exp: 2
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -339,7 +339,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 21300000, guid: a3bcc84a63fcc9d4f98afa1a74445f56, type: 3}
ResourceName: 807
ResourceDesc: 16639
ResourceDesc: 21164
Exp: 1
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -354,7 +354,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 21300000, guid: a3c4b263edc024d4791bc9a1c6319e8c, type: 3}
ResourceName: 55
ResourceDesc: 2410
ResourceDesc: 21165
Exp: 1
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -369,7 +369,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 0}
ResourceName: 1128
ResourceDesc: 1412
ResourceDesc: 21166
Exp: 0
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -406,7 +406,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 0}
ResourceName: 61
ResourceDesc: 1929
ResourceDesc: 21167
Exp: 0
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -443,7 +443,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 0}
ResourceName: 58
ResourceDesc: 1414
ResourceDesc: 21168
Exp: 0
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -480,7 +480,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 0}
ResourceName: 1448
ResourceDesc: 1449
ResourceDesc: 21169
Exp: 3
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -1215,7 +1215,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 21300000, guid: bb99c5430da749d409fddffc438edb3a, type: 3}
ResourceName: 813
ResourceDesc: 1419
ResourceDesc: 21170
Exp: 1
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -1245,7 +1245,7 @@ MonoBehaviour:
ResourceSubType: 1
Sprite: {fileID: 21300000, guid: d7b0a16ac6f53ad4b8820d8c295c6bc1, type: 3}
ResourceName: 871
ResourceDesc: 1420
ResourceDesc: 21171
Exp: 1
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -1290,7 +1290,7 @@ MonoBehaviour:
ResourceSubType: 1
Sprite: {fileID: 0}
ResourceName: 874
ResourceDesc: 1423
ResourceDesc: 21172
Exp: 1
ChessType: 0
CivIdForceIdNotFromPlayer: 1
@ -1545,14 +1545,14 @@ MonoBehaviour:
CarryGiantType: 0
Sprite: {fileID: 21300000, guid: 6fb742830567c9940b15155ca1a330ff, type: 3}
Name: 2261
Desc: 1423
Desc: 21172
HasLevel: 0
LevelSprite: []
- Resource: 5
ResourceSubType: 1
Sprite: {fileID: 0}
ResourceName: 875
ResourceDesc: 1424
ResourceDesc: 21173
Exp: 1
ChessType: 0
CivIdForceIdNotFromPlayer: 1
@ -1814,7 +1814,7 @@ MonoBehaviour:
ResourceSubType: 1
Sprite: {fileID: 21300000, guid: 99e40f1b86cd9b3418c232e7c38f8de6, type: 3}
ResourceName: 876
ResourceDesc: 1425
ResourceDesc: 21174
Exp: 0
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -1889,7 +1889,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 21300000, guid: 1e065dc4ce7d55644b06fa2e1690734c, type: 3}
ResourceName: 1382
ResourceDesc: 19872
ResourceDesc: 21093
Exp: 0
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -1904,7 +1904,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 21300000, guid: 20212381332c7a74ebcc703dd24b3a11, type: 3}
ResourceName: 1375
ResourceDesc: 17347
ResourceDesc: 21157
Exp: 0
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -2139,7 +2139,7 @@ MonoBehaviour:
ResourceSubType: 0
Sprite: {fileID: 21300000, guid: c065970504610f04da8781baac3ee5f8, type: 3}
ResourceName: 2237
ResourceDesc: 2375
ResourceDesc: 21175
Exp: 0
ChessType: 0
CivIdForceIdNotFromPlayer: 0
@ -2218,7 +2218,7 @@ MonoBehaviour:
ForceId: 0
Sprite: {fileID: 21300000, guid: 9ae4068de3182e54c9c44e10b66089e6, type: 3}
Name: 302
Desc: 16671
Desc: 21176
Exp: 3
- Wonder: 1
WonderType: 2
@ -2226,7 +2226,7 @@ MonoBehaviour:
ForceId: 0
Sprite: {fileID: 21300000, guid: 5d2cbba21798bbf47af040f07f81ce58, type: 3}
Name: 268
Desc: 16672
Desc: 21177
Exp: 3
- Wonder: 2
WonderType: 3
@ -2234,7 +2234,7 @@ MonoBehaviour:
ForceId: 0
Sprite: {fileID: 21300000, guid: 99f299139fee8074babe65db7c3ba2fc, type: 3}
Name: 303
Desc: 16673
Desc: 21178
Exp: 3
- Wonder: 3
WonderType: 4
@ -2242,7 +2242,7 @@ MonoBehaviour:
ForceId: 0
Sprite: {fileID: 21300000, guid: 28481e4b4d1464f40b2463f41f7e0eb4, type: 3}
Name: 304
Desc: 16674
Desc: 21179
Exp: 3
- Wonder: 4
WonderType: 5
@ -2250,7 +2250,7 @@ MonoBehaviour:
ForceId: 0
Sprite: {fileID: 21300000, guid: 9654e91d69aca024c9a5f6e122007a1c, type: 3}
Name: 305
Desc: 16675
Desc: 21180
Exp: 3
- Wonder: 5
WonderType: 6
@ -2258,7 +2258,7 @@ MonoBehaviour:
ForceId: 0
Sprite: {fileID: 21300000, guid: c9a566b58f2082b4a9848735e022f3e7, type: 3}
Name: 306
Desc: 16676
Desc: 21181
Exp: 3
- Wonder: 6
WonderType: 7
@ -2266,7 +2266,7 @@ MonoBehaviour:
ForceId: 0
Sprite: {fileID: 21300000, guid: 6b82d407e72f5a04dad2051557c4a48c, type: 3}
Name: 307
Desc: 16677
Desc: 21182
Exp: 3
- Wonder: 7
WonderType: 1
@ -2274,7 +2274,7 @@ MonoBehaviour:
ForceId: 1
Sprite: {fileID: 21300000, guid: fd412cc9548c654409cc979745ed1d40, type: 3}
Name: 308
Desc: 16678
Desc: 21183
Exp: 3
- Wonder: 8
WonderType: 2
@ -2282,7 +2282,7 @@ MonoBehaviour:
ForceId: 1
Sprite: {fileID: 21300000, guid: 25959da9c2209d2479802619fc828f5c, type: 3}
Name: 309
Desc: 16679
Desc: 21184
Exp: 3
- Wonder: 9
WonderType: 3
@ -2290,7 +2290,7 @@ MonoBehaviour:
ForceId: 1
Sprite: {fileID: 21300000, guid: 0f1fce644ced23c4e907dc62ff4f23be, type: 3}
Name: 310
Desc: 16680
Desc: 21185
Exp: 3
- Wonder: 10
WonderType: 4
@ -2298,7 +2298,7 @@ MonoBehaviour:
ForceId: 1
Sprite: {fileID: 21300000, guid: 936535b388150f648a819b20d93498bb, type: 3}
Name: 311
Desc: 16681
Desc: 21186
Exp: 3
- Wonder: 11
WonderType: 5
@ -2306,7 +2306,7 @@ MonoBehaviour:
ForceId: 1
Sprite: {fileID: 21300000, guid: e82a494ae6572eb4c8e993dbdf382f26, type: 3}
Name: 312
Desc: 16682
Desc: 21187
Exp: 3
- Wonder: 12
WonderType: 6
@ -2314,7 +2314,7 @@ MonoBehaviour:
ForceId: 1
Sprite: {fileID: 21300000, guid: 54ea1a42bea9909498e3e5b5aaadd3ff, type: 3}
Name: 313
Desc: 16683
Desc: 21188
Exp: 3
- Wonder: 13
WonderType: 7
@ -2322,7 +2322,7 @@ MonoBehaviour:
ForceId: 1
Sprite: {fileID: 21300000, guid: 803ed8a071ab0b0499b592b50c7f0f42, type: 3}
Name: 314
Desc: 16684
Desc: 21189
Exp: 3
- Wonder: 14
WonderType: 1
@ -2330,7 +2330,7 @@ MonoBehaviour:
ForceId: 2
Sprite: {fileID: 21300000, guid: 193db0ee37259d547aae9e6db2e9ff94, type: 3}
Name: 315
Desc: 16685
Desc: 21190
Exp: 3
- Wonder: 15
WonderType: 2
@ -2338,7 +2338,7 @@ MonoBehaviour:
ForceId: 2
Sprite: {fileID: 21300000, guid: c32e08acd22a79443ba4de942202f32a, type: 3}
Name: 316
Desc: 16686
Desc: 21191
Exp: 3
- Wonder: 16
WonderType: 3
@ -2346,7 +2346,7 @@ MonoBehaviour:
ForceId: 2
Sprite: {fileID: 21300000, guid: 3bbafdaa5d59eed4ba343507956871b8, type: 3}
Name: 317
Desc: 16687
Desc: 21192
Exp: 3
- Wonder: 17
WonderType: 4
@ -2354,7 +2354,7 @@ MonoBehaviour:
ForceId: 2
Sprite: {fileID: 21300000, guid: ef75559cb243afb4eaaf79225304177c, type: 3}
Name: 318
Desc: 16688
Desc: 21193
Exp: 3
- Wonder: 18
WonderType: 5
@ -2362,7 +2362,7 @@ MonoBehaviour:
ForceId: 2
Sprite: {fileID: 21300000, guid: 8c1cd235d851c2c40b3a229ce02781e5, type: 3}
Name: 319
Desc: 16689
Desc: 21194
Exp: 3
- Wonder: 19
WonderType: 6
@ -2370,7 +2370,7 @@ MonoBehaviour:
ForceId: 2
Sprite: {fileID: 21300000, guid: 989d2cba4eb64c04486da63a9842f061, type: 3}
Name: 320
Desc: 16690
Desc: 21195
Exp: 3
- Wonder: 20
WonderType: 7
@ -2378,7 +2378,7 @@ MonoBehaviour:
ForceId: 2
Sprite: {fileID: 21300000, guid: f91a3b4a4a0057c4885eaaf387c1415d, type: 3}
Name: 321
Desc: 16691
Desc: 21196
Exp: 3
- Wonder: 21
WonderType: 1

View File

@ -516,7 +516,7 @@ MonoBehaviour:
UnitFullTypes: []
TargetBuff:
- taskContentType: 7
Param: 20
Param: 15
SkillParam: 210
SpType: 0
SkillList:
@ -640,7 +640,7 @@ MonoBehaviour:
UnitFullTypes: []
TargetBuff:
- taskContentType: 7
Param: 15
Param: 12
SkillParam: 217
SpType: 0
SkillList: d9000000fc000000
@ -649,7 +649,7 @@ MonoBehaviour:
UnitFullTypes: []
TargetBuff:
- taskContentType: 7
Param: 40
Param: 30
SkillParam: 217
SpType: 0
SkillList: d9000000fc000000

View File

@ -27,16 +27,16 @@ MonoBehaviour:
HintContent: 1018
- HintType: 5
HintName: 1019
HintContent: 1034
HintContent: 21117
- HintType: 6
HintName: 1021
HintContent: 1030
HintContent: 21118
- HintType: 7
HintName: 1023
HintContent: 1031
HintContent: 21119
- HintType: 8
HintName: 1025
HintContent: 1032
HintContent: 21120
- HintType: 9
HintName: 1027
HintContent: 1033
HintContent: 21121

File diff suppressed because one or more lines are too long

View File

@ -18,7 +18,7 @@ MonoBehaviour:
HintDesc: 17419
- PlayerTaskType: 7
PlayerTaskDesc: 17431
HintDesc: 17426
HintDesc: 21122
- PlayerTaskType: 5
PlayerTaskDesc: 17433
HintDesc: 17428

View File

@ -651,7 +651,7 @@ MonoBehaviour:
SkillIcon: {fileID: 0}
HasShowList: 0
SkillShowList: []
skillPriority: 0
skillPriority: 1
ReserveOnCarry: 0
ReserveLeaveCarry: 0
ReserveGiantUpgrade: 0
@ -1181,13 +1181,13 @@ MonoBehaviour:
- SkillType: 92
SkillViewType: 2
SkillName: 2023
SkillDesc: 21038
SkillDesc: 21098
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: 75b508c1ae4678a418bf2cecdbf4d6f1, type: 3}
HasShowList: 0
SkillShowList: []
skillPriority: 0
skillPriority: 1
ReserveOnCarry: 0
ReserveLeaveCarry: 0
ReserveGiantUpgrade: 0
@ -2272,7 +2272,7 @@ MonoBehaviour:
- SkillType: 163
SkillViewType: 2
SkillName: 16751
SkillDesc: 21084
SkillDesc: 21123
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: 5aa40b680a2dc21409fa27a486f4dace, type: 3}
@ -2286,7 +2286,7 @@ MonoBehaviour:
- SkillType: 164
SkillViewType: 2
SkillName: 16753
SkillDesc: 16754
SkillDesc: 21124
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: f6ec388298702e34b8e97da694bbcbf1, type: 3}
@ -2421,7 +2421,7 @@ MonoBehaviour:
- SkillType: 198
SkillViewType: 4
SkillName: 16828
SkillDesc: 17241
SkillDesc: 21125
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: a28eb05639f2b1c4aa4e06a448abf997, type: 3}
@ -2505,7 +2505,7 @@ MonoBehaviour:
- SkillType: 204
SkillViewType: 3
SkillName: 16799
SkillDesc: 16800
SkillDesc: 21126
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: 6bb6788bb6110b6429062d66b8b30a4f, type: 3}
@ -2682,7 +2682,7 @@ MonoBehaviour:
- SkillType: 209
SkillViewType: 2
SkillName: 17318
SkillDesc: 17322
SkillDesc: 21127
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: 825bb3e1196830c46bc9a57a6bc8213c, type: 3}
@ -2710,7 +2710,7 @@ MonoBehaviour:
- SkillType: 211
SkillViewType: 2
SkillName: 18100
SkillDesc: 18101
SkillDesc: 21200
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: 0fc32a2f0f0257544a262d24f2007f45, type: 3}
@ -2724,7 +2724,7 @@ MonoBehaviour:
- SkillType: 212
SkillViewType: 2
SkillName: 19278
SkillDesc: 18110
SkillDesc: 21201
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: cb1349a579ede11408e930e7513c4265, type: 3}
@ -2884,7 +2884,7 @@ MonoBehaviour:
SkillIcon: {fileID: 21300000, guid: de3bb8de90b277e4d83c00930a9e7933, type: 3}
HasShowList: 0
SkillShowList: []
skillPriority: 0
skillPriority: 1
ReserveOnCarry: 0
ReserveLeaveCarry: 0
ReserveGiantUpgrade: 0
@ -2940,7 +2940,7 @@ MonoBehaviour:
SkillIcon: {fileID: 21300000, guid: d5e0a6906fa14364f8fc44cb42f990c2, type: 3}
HasShowList: 0
SkillShowList: []
skillPriority: 0
skillPriority: 1
ReserveOnCarry: 0
ReserveLeaveCarry: 0
ReserveGiantUpgrade: 0
@ -3032,7 +3032,7 @@ MonoBehaviour:
- SkillType: 224
SkillViewType: 2
SkillName: 18179
SkillDesc: 18107
SkillDesc: 21202
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: a08a040eae9080b489eb62a1e78c94fd, type: 3}
@ -3054,8 +3054,8 @@ MonoBehaviour:
ReserveCommonTransform: 0
- SkillType: 271
SkillViewType: 2
SkillName: 18179
SkillDesc: 21080
SkillName: 17816
SkillDesc: 21203
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: a08a040eae9080b489eb62a1e78c94fd, type: 3}
@ -3078,7 +3078,7 @@ MonoBehaviour:
- SkillType: 242
SkillViewType: 2
SkillName: 18180
SkillDesc: 18108
SkillDesc: 21204
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: a718d5b9d0863e9438f829f596b366bc, type: 3}
@ -3409,7 +3409,7 @@ MonoBehaviour:
- SkillType: 257
SkillViewType: 1
SkillName: 19325
SkillDesc: 19379
SkillDesc: 21205
NotShow: 0
ShowOnUnitMono: 0
SkillIcon: {fileID: 21300000, guid: 709d4360a7a8bf6498e007b85c6e25b8, type: 3}

View File

@ -903,7 +903,7 @@ MonoBehaviour:
iconViewSizeType: 1
- TechAtom: 6
TechAtomName: 458
Desc: 1210
Desc: 21128
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -969,7 +969,7 @@ MonoBehaviour:
iconViewSizeType: 0
- TechAtom: 7
TechAtomName: 459
Desc: 1211
Desc: 21129
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -1035,7 +1035,7 @@ MonoBehaviour:
iconViewSizeType: 0
- TechAtom: 8
TechAtomName: 460
Desc: 16654
Desc: 21130
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -1101,7 +1101,7 @@ MonoBehaviour:
iconViewSizeType: 0
- TechAtom: 9
TechAtomName: 458
Desc: 1212
Desc: 21131
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -1167,7 +1167,7 @@ MonoBehaviour:
iconViewSizeType: 0
- TechAtom: 10
TechAtomName: 462
Desc: 1213
Desc: 21132
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -1233,7 +1233,7 @@ MonoBehaviour:
iconViewSizeType: 0
- TechAtom: 11
TechAtomName: 463
Desc: 1214
Desc: 21133
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -1299,7 +1299,7 @@ MonoBehaviour:
iconViewSizeType: 0
- TechAtom: 12
TechAtomName: 464
Desc: 1215
Desc: 21134
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -1730,7 +1730,7 @@ MonoBehaviour:
iconViewSizeType: 0
- TechAtom: 17
TechAtomName: 404
Desc: 1232
Desc: 21135
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -2353,7 +2353,7 @@ MonoBehaviour:
iconViewSizeType: 1
- TechAtom: 22
TechAtomName: 416
Desc: 1262
Desc: 21136
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -2385,7 +2385,7 @@ MonoBehaviour:
iconViewSizeType: 4
- TechAtom: 23
TechAtomName: 45
Desc: 1312
Desc: 21137
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -2832,7 +2832,7 @@ MonoBehaviour:
iconViewSizeType: 2
- TechAtom: 26
TechAtomName: 1179
Desc: 1231
Desc: 21138
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -2942,7 +2942,7 @@ MonoBehaviour:
iconViewSizeType: 1
- TechAtom: 30
TechAtomName: 412
Desc: 1259
Desc: 21139
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -3846,7 +3846,7 @@ MonoBehaviour:
iconViewSizeType: 0
- TechAtom: 42
TechAtomName: 400
Desc: 1313
Desc: 21140
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -3943,7 +3943,7 @@ MonoBehaviour:
iconViewSizeType: 4
- TechAtom: 43
TechAtomName: 406
Desc: 1233
Desc: 21141
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -4378,7 +4378,7 @@ MonoBehaviour:
iconViewSizeType: 2
- TechAtom: 47
TechAtomName: 1260
Desc: 1261
Desc: 21142
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -4663,7 +4663,7 @@ MonoBehaviour:
iconViewSizeType: 1
- TechAtom: 49
TechAtomName: 1375
Desc: 17346
Desc: 21143
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -4831,7 +4831,7 @@ MonoBehaviour:
iconViewSizeType: 0
- TechAtom: 51
TechAtomName: 397
Desc: 1311
Desc: 21144
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -4863,7 +4863,7 @@ MonoBehaviour:
iconViewSizeType: 4
- TechAtom: 52
TechAtomName: 408
Desc: 1234
Desc: 21145
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -4909,7 +4909,7 @@ MonoBehaviour:
iconViewSizeType: 5
- TechAtom: 54
TechAtomName: 1382
Desc: 2417
Desc: 21092
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -5938,7 +5938,7 @@ MonoBehaviour:
iconViewSizeType: 0
- TechAtom: 70
TechAtomName: 2237
Desc: 17006
Desc: 21146
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0
@ -6016,7 +6016,7 @@ MonoBehaviour:
iconViewSizeType: 2
- TechAtom: 73
TechAtomName: 2237
Desc: 17008
Desc: 21147
IsAddSkill: 0
AddSkillCondition: []
AddSkillType: 0

View File

@ -5698,7 +5698,7 @@ MonoBehaviour:
Civ: 2
Force: 2
Name: 2031
Desc: 17367
Desc: 21094
LandType: 3
NoMaxHealth: 0
MaxHealth: 30
@ -5724,7 +5724,7 @@ MonoBehaviour:
Civ: 2
Force: 2
Name: 2032
Desc:
Desc: 21094
LandType: 3
NoMaxHealth: 0
MaxHealth: 40
@ -5750,7 +5750,7 @@ MonoBehaviour:
Civ: 2
Force: 2
Name: 18979
Desc:
Desc: 21094
LandType: 3
NoMaxHealth: 0
MaxHealth: 50
@ -7616,7 +7616,7 @@ MonoBehaviour:
MoveRange: 0
AttackRange: 0
Cost: 0
Skills: 0100000007000000d8000000
Skills: 0100000007000000d800000053000000
Sprite: {fileID: 21300000, guid: 8d642fe2c85bf0b49a73ad8d304f5374, type: 3}
IsSpriteVarient: 0
SpriteList: []
@ -8025,7 +8025,7 @@ MonoBehaviour:
AttackRange: 1
Cost: 0
Skills: 02000000030000000d0000000d010000
Sprite: {fileID: 21300000, guid: c662e6880212d104dbdbeda8015d1ef0, type: 3}
Sprite: {fileID: 21300000, guid: 0dbaa2160980ead4c9af0a34805fb6f4, type: 3}
IsSpriteVarient: 0
SpriteList: []
ProjectileType: 1

View File

@ -12,8 +12,18 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: c659b850b20e460f866ed3f696be406b, type: 3}
m_Name: VersionConfig
m_EditorClassIdentifier:
CurVersionId: 70306
CurVersionId: 70400
Versions:
- MajorVersion: 0
MinorVersion: 7
PatchVersion: 4
Description: 21199
FourthVersion: 0
- MajorVersion: 0
MinorVersion: 7
PatchVersion: 3
Description: 21096
FourthVersion: 7
- MajorVersion: 0
MinorVersion: 7
PatchVersion: 3
@ -52,7 +62,7 @@ MonoBehaviour:
- MajorVersion: 0
MinorVersion: 7
PatchVersion: 2
Description: 20149
Description: 21148
FourthVersion: 2
- MajorVersion: 0
MinorVersion: 7
@ -192,7 +202,7 @@ MonoBehaviour:
- MajorVersion: 0
MinorVersion: 6
PatchVersion: 6
Description: 17369
Description: 21149
FourthVersion: 0
- MajorVersion: 0
MinorVersion: 6
@ -207,7 +217,7 @@ MonoBehaviour:
- MajorVersion: 0
MinorVersion: 6
PatchVersion: 3
Description: 17056
Description: 21150
FourthVersion: 0
- MajorVersion: 0
MinorVersion: 6
@ -227,7 +237,7 @@ MonoBehaviour:
- MajorVersion: 0
MinorVersion: 5
PatchVersion: 12
Description: 2403
Description: 21151
FourthVersion: 0
- MajorVersion: 0
MinorVersion: 5
@ -322,7 +332,7 @@ MonoBehaviour:
- MajorVersion: 0
MinorVersion: 1
PatchVersion: 0
Description: 1469
Description: 21197
FourthVersion: 0
- MajorVersion: 0
MinorVersion: 0

View File

@ -72,6 +72,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
Icon: {fileID: 0}
IconSizeType: 0
HasIcon: 0
@ -134,6 +135,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
Icon: {fileID: 0}
IconSizeType: 0
HasIcon: 0
@ -196,6 +198,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
Icon: {fileID: 0}
IconSizeType: 0
HasIcon: 0
@ -258,6 +261,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
Icon: {fileID: 0}
IconSizeType: 0
HasIcon: 0
@ -320,6 +324,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
Icon: {fileID: 0}
IconSizeType: 0
HasIcon: 0
@ -382,6 +387,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
Icon: {fileID: 0}
IconSizeType: 0
HasIcon: 0
@ -444,6 +450,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
Icon: {fileID: 0}
IconSizeType: 0
HasIcon: 0
@ -513,6 +520,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
Icon: {fileID: 0}
IconSizeType: 0
HasIcon: 0
@ -575,6 +583,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
Icon: {fileID: 0}
IconSizeType: 0
HasIcon: 0
@ -637,6 +646,322 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
Icon: {fileID: 0}
IconSizeType: 0
HasIcon: 0
- Id: 12
Name: 18802
Types: 0300000086000000
DescItems:
- DescType: 0
Desc: 21099
UseHint: 0
HintProvider:
HintDataType: 0
Text: "\u9ED8\u8BA4\u9759\u6001\u6587\u672C..."
TechTypeData: 0
SkillTypeData: 0
ActionIdData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
locked: 0
TextData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
TechAtom: 0
GeoIdList:
UnitFullType:
UnitType: 0
GiantType: 0
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
Icon: {fileID: 0}
IconSizeType: 0
HasIcon: 0
- Id: 13
Name: 18872
Types: 0300000086000000
DescItems:
- DescType: 0
Desc: 21100
UseHint: 0
HintProvider:
HintDataType: 0
Text: "\u9ED8\u8BA4\u9759\u6001\u6587\u672C..."
TechTypeData: 0
SkillTypeData: 0
ActionIdData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
locked: 0
TextData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
TechAtom: 0
GeoIdList:
UnitFullType:
UnitType: 0
GiantType: 0
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
Icon: {fileID: 0}
IconSizeType: 0
HasIcon: 0
- Id: 14
Name: 18871
Types: 0300000086000000
DescItems:
- DescType: 0
Desc: 21103
UseHint: 0
HintProvider:
HintDataType: 0
Text: "\u9ED8\u8BA4\u9759\u6001\u6587\u672C..."
TechTypeData: 0
SkillTypeData: 0
ActionIdData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
locked: 0
TextData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
TechAtom: 0
GeoIdList:
UnitFullType:
UnitType: 0
GiantType: 0
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
Icon: {fileID: 0}
IconSizeType: 0
HasIcon: 0
- Id: 15
Name: 18870
Types: 0300000086000000
DescItems:
- DescType: 0
Desc: 21104
UseHint: 0
HintProvider:
HintDataType: 0
Text: "\u9ED8\u8BA4\u9759\u6001\u6587\u672C..."
TechTypeData: 0
SkillTypeData: 0
ActionIdData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
locked: 0
TextData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
TechAtom: 0
GeoIdList:
UnitFullType:
UnitType: 0
GiantType: 0
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
Icon: {fileID: 0}
IconSizeType: 0
HasIcon: 0
- Id: 16
Name: 21105
Types: 0600000069000000
DescItems:
- DescType: 0
Desc: 21106
UseHint: 0
HintProvider:
HintDataType: 0
Text: "\u9ED8\u8BA4\u9759\u6001\u6587\u672C..."
TechTypeData: 0
SkillTypeData: 0
ActionIdData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
locked: 0
TextData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
TechAtom: 0
GeoIdList:
UnitFullType:
UnitType: 0
GiantType: 0
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
Icon: {fileID: 0}
IconSizeType: 0
HasIcon: 0
@ -669,6 +994,8 @@ MonoBehaviour:
Name: 19341
- Type: 104
Name: 19471
- Type: 105
Name: 21107
- Type: 110
Name: 14
- Type: 111
@ -709,6 +1036,8 @@ MonoBehaviour:
Name: 1637
- Type: 204
Name: 1639
- Type: 105
Name: 21108
WikiDescTypeInfoList:
- Type: 0
Name: 19475

View File

@ -330,8 +330,164 @@ MonoBehaviour:
NetRowContainer: {fileID: 3252362370951117910}
NetInfo: {fileID: 7448979660496629192}
ScrollViewRect: {fileID: 7039295970119204888}
ToggleButton: {fileID: 0}
ArrowIcon: {fileID: 0}
ChatAreaRoot: {fileID: 7448979660496629192}
NetErrorPanelRoot: {fileID: 0}
--- !u!1 &3447204173817333575
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2932727821040348081}
- component: {fileID: 2639892520584227310}
- component: {fileID: 1117976981426595334}
- component: {fileID: 2174353529021295729}
m_Layer: 5
m_Name: Text
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2932727821040348081
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3447204173817333575}
m_LocalRotation: {x: -0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: -1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 6026539830107997729}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
m_AnchoredPosition: {x: 89.0031, y: 0.000022888184}
m_SizeDelta: {x: 110.2086, y: 53.612}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2639892520584227310
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3447204173817333575}
m_CullTransparentMesh: 1
--- !u!114 &1117976981426595334
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3447204173817333575}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 0
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\u623F\u95F4\u4FE1\u606F"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: ce4904f8ddac15944907907115531ad5, type: 2}
m_sharedMaterial: {fileID: 1214840240034325189, guid: ce4904f8ddac15944907907115531ad5, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4285151031
m_fontColor: {r: 0.21568629, g: 0.21568629, b: 0.4156863, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 20
m_fontSizeBase: 20
m_fontWeight: 400
m_enableAutoSizing: 1
m_fontSizeMin: 12
m_fontSizeMax: 20
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 0
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &2174353529021295729
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3447204173817333575}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6b27f832d22e4a8d916272b644937774, type: 3}
m_Name:
m_EditorClassIdentifier:
Ban: 0
NoExport: 0
FontBan: 0
Preset: 0
ID: 21109
FontID: 0
TextCfg: []
--- !u!1 &3830065821644900243
GameObject:
m_ObjectHideFlags: 0
@ -360,6 +516,7 @@ RectTransform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 6026539830107997729}
- {fileID: 7039295970119204888}
m_Father: {fileID: 7448979660496629192}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@ -368,6 +525,128 @@ RectTransform:
m_AnchoredPosition: {x: 420, y: -914}
m_SizeDelta: {x: 840, y: 162.685}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &3908175180561385047
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6026539830107997729}
- component: {fileID: 8448746466423092331}
- component: {fileID: 2236555796276981739}
- component: {fileID: 1696168972793979207}
m_Layer: 5
m_Name: Toggle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6026539830107997729
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3908175180561385047}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: -1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 2932727821040348081}
- {fileID: 8802840903810279366}
m_Father: {fileID: 4797701493746855371}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 169, y: -49.027466}
m_SizeDelta: {x: 158.7511, y: 42.6395}
m_Pivot: {x: 0, y: 0}
--- !u!222 &8448746466423092331
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3908175180561385047}
m_CullTransparentMesh: 1
--- !u!114 &2236555796276981739
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3908175180561385047}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: df39380aaef39404eaf3e0e9183c785c, type: 3}
m_Type: 1
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 2
--- !u!114 &1696168972793979207
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3908175180561385047}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 2236555796276981739}
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!1 &4201993139918734613
GameObject:
m_ObjectHideFlags: 0
@ -460,7 +739,7 @@ MonoBehaviour:
m_EditorClassIdentifier:
m_Content: {fileID: 3252362370951117910}
m_Horizontal: 0
m_Vertical: 1
m_Vertical: 0
m_MovementType: 1
m_Elasticity: 0.1
m_Inertia: 1
@ -476,6 +755,81 @@ MonoBehaviour:
m_OnValueChanged:
m_PersistentCalls:
m_Calls: []
--- !u!1 &5539433788578153713
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8802840903810279366}
- component: {fileID: 5864333920559448752}
- component: {fileID: 7380583193104224147}
m_Layer: 5
m_Name: Arrow
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8802840903810279366
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5539433788578153713}
m_LocalRotation: {x: -0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 6026539830107997729}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0.5}
m_AnchorMax: {x: 1, y: 0.5}
m_AnchoredPosition: {x: -131, y: -0.20000076}
m_SizeDelta: {x: 24.9288, y: 21.7923}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5864333920559448752
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5539433788578153713}
m_CullTransparentMesh: 1
--- !u!114 &7380583193104224147
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5539433788578153713}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.21568629, g: 0.21568629, b: 0.4156863, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: d75a43167c8202744ace765fd528c7b1, type: 3}
m_Type: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &5935193861016011210
GameObject:
m_ObjectHideFlags: 0
@ -786,7 +1140,7 @@ MonoBehaviour:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastTarget: 0
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:

View File

@ -75,6 +75,182 @@ MonoBehaviour:
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &1357977304611888566
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 400525169563939464}
- component: {fileID: 5904547344961834915}
- component: {fileID: 4435446399321593931}
- component: {fileID: 6027195829693152108}
m_Layer: 5
m_Name: PlayerName
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!224 &400525169563939464
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1357977304611888566}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2195028801721153053}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
m_AnchoredPosition: {x: 148.6, y: 25.2612}
m_SizeDelta: {x: 191.0579, y: 48.8177}
m_Pivot: {x: 0, y: 1}
--- !u!222 &5904547344961834915
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1357977304611888566}
m_CullTransparentMesh: 1
--- !u!114 &4435446399321593931
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1357977304611888566}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 0
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\u73A9\u5BB6\u540D\u79F0\u5F88\u957F\u5F88\u957F"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: ce4904f8ddac15944907907115531ad5, type: 2}
m_sharedMaterial: {fileID: 1214840240034325189, guid: ce4904f8ddac15944907907115531ad5, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4285283138
m_fontColor: {r: 0.25882354, g: 0.23137257, b: 0.42352945, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 20
m_fontSizeBase: 20
m_fontWeight: 400
m_enableAutoSizing: 1
m_fontSizeMin: 12
m_fontSizeMax: 20
m_fontStyle: 1
m_HorizontalAlignment: 1
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 0
m_wordWrappingRatios: 0.4
m_overflowMode: 1
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &6027195829693152108
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1357977304611888566}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6b27f832d22e4a8d916272b644937774, type: 3}
m_Name:
m_EditorClassIdentifier:
Ban: 1
NoExport: 0
FontBan: 0
Preset: 0
ID: 21110
FontID: 2
TextCfg:
- Type: 0
ApplyFontSize: 0
FontSize: 24
ApplyCharacterSpacing: 0
CharacterSpacing: 0
ApplyWordSpacing: 0
WordSpacing: 0
ApplyLineSpacing: 0
LineSpacing: 0
ApplyParagraphSpacing: 0
ParagraphSpacing: 0
- Type: 1
ApplyFontSize: 0
FontSize: 24
ApplyCharacterSpacing: 0
CharacterSpacing: 0
ApplyWordSpacing: 0
WordSpacing: 0
ApplyLineSpacing: 0
LineSpacing: 0
ApplyParagraphSpacing: 0
ParagraphSpacing: 0
--- !u!1 &3421972008351261835
GameObject:
m_ObjectHideFlags: 0
@ -186,7 +362,7 @@ MonoBehaviour:
m_charWidthMaxAdj: 0
m_enableWordWrapping: 0
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_overflowMode: 1
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
@ -517,6 +693,7 @@ RectTransform:
- {fileID: 5405181277792130642}
- {fileID: 7090467032948065544}
- {fileID: 4122181712597952276}
- {fileID: 400525169563939464}
- {fileID: 48348785974861759}
- {fileID: 1382121971902538867}
- {fileID: 6787024625514555089}
@ -687,6 +864,7 @@ MonoBehaviour:
Union: {fileID: 8957439788609527438}
Rank: {fileID: 1895026781044628182}
ForceName: {fileID: 3693209512150132182}
PlayerName: {fileID: 4435446399321593931}
City: {fileID: 7295728285921560390}
Score: {fileID: 2696143602139731542}
GrayScaleMat: {fileID: 2100000, guid: 6fd2ca322eccbea4ba2ce4c235c340c0, type: 2}

View File

@ -317,6 +317,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
--- !u!1 &4975249862107715477
GameObject:
m_ObjectHideFlags: 0

View File

@ -4183,6 +4183,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 1
ShowWikiNameInHint: 0
--- !u!1 &7567515181940341547
GameObject:
m_ObjectHideFlags: 0

View File

@ -405,8 +405,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 293.6, y: -16}
m_SizeDelta: {x: 271.6, y: 49.4132}
m_AnchoredPosition: {x: 350.5, y: -16}
m_SizeDelta: {x: 385.4, y: 49.4132}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &9135779777592041238
CanvasRenderer:
@ -825,8 +825,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 293.6, y: -46.9066}
m_SizeDelta: {x: 271.6, y: 49.4132}
m_AnchoredPosition: {x: 350.50198, y: -47.65532}
m_SizeDelta: {x: 385.404, y: 50.9107}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6121913527472256340
CanvasRenderer:
@ -883,7 +883,7 @@ MonoBehaviour:
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 24.65
m_fontSize: 26
m_fontSizeBase: 26
m_fontWeight: 400
m_enableAutoSizing: 1
@ -5830,7 +5830,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 289.93222, y: -223.51164}
m_AnchoredPosition: {x: 289.93222, y: -241.52165}
m_SizeDelta: {x: 519.8644, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &8375249223767260024

View File

@ -188,6 +188,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
--- !u!225 &4637864925875569728
CanvasGroup:
m_ObjectHideFlags: 0

View File

@ -352,6 +352,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
--- !u!1 &2891400149996157267
GameObject:
m_ObjectHideFlags: 0

View File

@ -1538,6 +1538,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
--- !u!225 &4110689760467849083
CanvasGroup:
m_ObjectHideFlags: 0
@ -1740,6 +1741,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
--- !u!225 &5335785696691064018
CanvasGroup:
m_ObjectHideFlags: 0
@ -3004,6 +3006,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
--- !u!1 &3418664173005759065
GameObject:
m_ObjectHideFlags: 0
@ -7489,6 +7492,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
--- !u!1 &8067191945378985705
GameObject:
m_ObjectHideFlags: 0
@ -8238,6 +8242,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
--- !u!225 &117787065588076926
CanvasGroup:
m_ObjectHideFlags: 0

View File

@ -432,6 +432,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
--- !u!1 &887447221450025106
GameObject:
m_ObjectHideFlags: 0
@ -3406,7 +3407,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 147, y: -23}
m_SizeDelta: {x: 0, y: 32.0265}
m_SizeDelta: {x: 120.01, y: 32.0265}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5182836495056545005
CanvasRenderer:
@ -3994,7 +3995,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 55.005, y: -13.0845}
m_SizeDelta: {x: 90.01, y: 34.152}
m_SizeDelta: {x: 70.01, y: 34.152}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &124901836524755543
CanvasRenderer:
@ -4024,7 +4025,7 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\u884C\u52A8\u70B9\u6570"
m_text: "\u884C\u52A8\u70B9"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8e119f168f1a6b745be02ef19f51610f, type: 2}
m_sharedMaterial: {fileID: -8081454072124122709, guid: 8e119f168f1a6b745be02ef19f51610f, type: 2}
@ -4123,7 +4124,7 @@ MonoBehaviour:
NoExport: 0
FontBan: 0
Preset: 0
ID: 18097
ID: 18157
FontID: 1
TextCfg:
- Type: 1
@ -4350,7 +4351,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 250, y: -480.093}
m_AnchoredPosition: {x: 250, y: -550.093}
m_SizeDelta: {x: 500, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &4676610239985244751
@ -4789,6 +4790,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 1
ShowWikiNameInHint: 0
--- !u!1 &5460214510391889656
GameObject:
m_ObjectHideFlags: 0
@ -5251,7 +5253,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 250, y: -550.093}
m_AnchoredPosition: {x: 250, y: -785.093}
m_SizeDelta: {x: 500, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1555931548957767936
@ -6826,6 +6828,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
--- !u!1 &8646135986360655893
GameObject:
m_ObjectHideFlags: 0

View File

@ -11,6 +11,7 @@ GameObject:
- component: {fileID: 1588290817458350580}
- component: {fileID: 256190936727606809}
- component: {fileID: 3034544183570506463}
- component: {fileID: 4726304137045161382}
- component: {fileID: 7917922603281322474}
m_Layer: 5
m_Name: UIInfoGridInfoActionPoint
@ -76,6 +77,71 @@ MonoBehaviour:
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &4726304137045161382
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5231202581567858438}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 877da1f2a753cba41a4ae5bf9e3a37bd, type: 3}
m_Name: ""
m_EditorClassIdentifier: ""
positionOffset: {x: 15, y: -15}
DataProvider:
HintDataType: 10
Text: ""
TechTypeData: 0
SkillTypeData: 0
ActionIdData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
locked: 0
TextData:
ActionType: 0
WonderType: 0
ResourceType: 0
FeatureType: 0
TerrainType: 0
UnitType: 0
GiantType: 0
UnitLevel: 0
Vegetation: 0
UnitActionType: 0
CityLevelUpActionType: 0
CityActionType: 0
GridMiscActionType: 0
SkillType: 0
TechType: 0
PlayerActionType: 0
AIParamType: 0
CultureCardType: 0
TechAtom: 0
GeoIdList:
UnitFullType:
UnitType: 0
GiantType: 0
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
--- !u!114 &7917922603281322474
MonoBehaviour:
m_ObjectHideFlags: 0
@ -89,6 +155,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
Icon: {fileID: 3034544183570506463}
HintTrigger: {fileID: 4726304137045161382}
CommonActionPoint: {fileID: 21300000, guid: 59cccbeccf94bd0418875724f2cd85f3, type: 3}
MoveActionPoint: {fileID: 21300000, guid: 72b511845d3675343a0deb68f38250de, type: 3}
EmptyActionPoint: {fileID: 21300000, guid: 2f222fae450c4734e92e4e440d8cb24b, type: 3}

View File

@ -3115,6 +3115,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 3
ShowWikiNameInHint: 0
--- !u!1 &6148410344477652974
GameObject:
m_ObjectHideFlags: 0
@ -3256,6 +3257,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 4
ShowWikiNameInHint: 0
--- !u!1 &6272510805284021726
GameObject:
m_ObjectHideFlags: 0
@ -4429,6 +4431,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 2
ShowWikiNameInHint: 0
--- !u!1 &7012897301952734023
GameObject:
m_ObjectHideFlags: 0

View File

@ -635,6 +635,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
--- !u!114 &2386237195646487545
MonoBehaviour:
m_ObjectHideFlags: 0

View File

@ -156,6 +156,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
--- !u!1 &754554302084854851
GameObject:
m_ObjectHideFlags: 0

View File

@ -504,6 +504,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
--- !u!1 &1687355003406032675
GameObject:
m_ObjectHideFlags: 0

View File

@ -4303,6 +4303,10 @@ PrefabInstance:
propertyPath: m_IsActive
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4175714362897118791, guid: 4383e6d834644a0448bf936b84d32f4d, type: 3}
propertyPath: m_Size
value: 0.2530819
objectReference: {fileID: 0}
- target: {fileID: 4680148532628975072, guid: 4383e6d834644a0448bf936b84d32f4d, type: 3}
propertyPath: m_AnchorMax.x
value: 1
@ -4313,7 +4317,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 4680148532628975072, guid: 4383e6d834644a0448bf936b84d32f4d, type: 3}
propertyPath: m_AnchorMin.y
value: 0.73298705
value: 0.7469181
objectReference: {fileID: 0}
- target: {fileID: 4735088385716738539, guid: 4383e6d834644a0448bf936b84d32f4d, type: 3}
propertyPath: m_Pivot.x
@ -4405,7 +4409,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 7192590124915184435, guid: 4383e6d834644a0448bf936b84d32f4d, type: 3}
propertyPath: m_SizeDelta.y
value: 2180.01
value: 2300.01
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
@ -4841,6 +4845,54 @@ PrefabInstance:
serializedVersion: 3
m_TransformParent: {fileID: 4735088385716738539}
m_Modifications:
- target: {fileID: 275541059430206871, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMax.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 275541059430206871, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMin.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 275541059430206871, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.x
value: 325.793
objectReference: {fileID: 0}
- target: {fileID: 275541059430206871, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.y
value: -581.119
objectReference: {fileID: 0}
- target: {fileID: 1154205339516287308, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMax.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1154205339516287308, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMin.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1154205339516287308, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.x
value: 325.793
objectReference: {fileID: 0}
- target: {fileID: 1154205339516287308, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.y
value: -667.36365
objectReference: {fileID: 0}
- target: {fileID: 1876386961021224891, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMax.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1876386961021224891, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMin.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1876386961021224891, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.x
value: 325.793
objectReference: {fileID: 0}
- target: {fileID: 1876386961021224891, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.y
value: -321.88873
objectReference: {fileID: 0}
- target: {fileID: 2222896469180108794, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMax.y
value: 1
@ -4849,13 +4901,9 @@ PrefabInstance:
propertyPath: m_AnchorMin.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 2222896469180108794, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_SizeDelta.x
value: 256
objectReference: {fileID: 0}
- target: {fileID: 2222896469180108794, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.x
value: 319.7648
value: 325.793
objectReference: {fileID: 0}
- target: {fileID: 2222896469180108794, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.y
@ -4871,7 +4919,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 2679028018220029159, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_SizeDelta.x
value: -17
value: -4.9436
objectReference: {fileID: 0}
- target: {fileID: 3451901859462160635, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_Name
@ -4881,14 +4929,54 @@ PrefabInstance:
propertyPath: m_IsActive
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3933615919818076003, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_fontAsset
value:
objectReference: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
- target: {fileID: 3933615919818076003, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_sharedMaterial
value:
objectReference: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
- target: {fileID: 3911211426439110619, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMax.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 3911211426439110619, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMin.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 3911211426439110619, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.x
value: 325.793
objectReference: {fileID: 0}
- target: {fileID: 3911211426439110619, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.y
value: -415.51065
objectReference: {fileID: 0}
- target: {fileID: 4361745507012795772, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMax.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4361745507012795772, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMin.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4361745507012795772, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.x
value: 325.793
objectReference: {fileID: 0}
- target: {fileID: 4361745507012795772, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.y
value: -734.40717
objectReference: {fileID: 0}
- target: {fileID: 4717673199725746572, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMax.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4717673199725746572, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMin.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4717673199725746572, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.x
value: 325.793
objectReference: {fileID: 0}
- target: {fileID: 4717673199725746572, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.y
value: -498.31485
objectReference: {fileID: 0}
- target: {fileID: 4735088385716738539, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_Pivot.x
value: 0.5
@ -4969,49 +5057,77 @@ PrefabInstance:
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5509163480483728840, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMax.x
value: 1
objectReference: {fileID: 0}
- target: {fileID: 5509163480483728840, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
- target: {fileID: 5332167467873301708, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMax.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 5509163480483728840, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMin.y
value: 0.029751897
objectReference: {fileID: 0}
- target: {fileID: 6442713650346062183, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMax.x
value: 1
objectReference: {fileID: 0}
- target: {fileID: 6442713650346062183, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_SizeDelta.x
value: -17
objectReference: {fileID: 0}
- target: {fileID: 6739967715622538133, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMax.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 6739967715622538133, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
- target: {fileID: 5332167467873301708, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMin.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 6739967715622538133, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_SizeDelta.x
value: 130.78
objectReference: {fileID: 0}
- target: {fileID: 6739967715622538133, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
- target: {fileID: 5332167467873301708, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.x
value: 319.7648
value: 325.793
objectReference: {fileID: 0}
- target: {fileID: 6739967715622538133, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
- target: {fileID: 5332167467873301708, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.y
value: -599.887
value: -539.7169
objectReference: {fileID: 0}
- target: {fileID: 5509163480483728840, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMax.x
value: 1
objectReference: {fileID: 0}
- target: {fileID: 5509163480483728840, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMax.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 5509163480483728840, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMin.y
value: 0.18498898
objectReference: {fileID: 0}
- target: {fileID: 6442713650346062183, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMax.x
value: 1
objectReference: {fileID: 0}
- target: {fileID: 6442713650346062183, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_SizeDelta.x
value: -4.9436
objectReference: {fileID: 0}
- target: {fileID: 6824926511242018314, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_SizeDelta.y
value: 616.904
value: 734.40717
objectReference: {fileID: 0}
- target: {fileID: 6950220672686271629, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMax.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 6950220672686271629, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMin.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 6950220672686271629, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.x
value: 325.793
objectReference: {fileID: 0}
- target: {fileID: 6950220672686271629, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.y
value: -456.91275
objectReference: {fileID: 0}
- target: {fileID: 7763553452555182084, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMax.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 7763553452555182084, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMin.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 7763553452555182084, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.x
value: 325.793
objectReference: {fileID: 0}
- target: {fileID: 7763553452555182084, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.y
value: -374.10855
objectReference: {fileID: 0}
- target: {fileID: 7994070186174196096, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchorMax.y
@ -5021,265 +5137,28 @@ PrefabInstance:
propertyPath: m_AnchorMin.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 7994070186174196096, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_SizeDelta.x
value: 366.17
objectReference: {fileID: 0}
- target: {fileID: 7994070186174196096, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_SizeDelta.y
value: 385.01
value: 88.01
objectReference: {fileID: 0}
- target: {fileID: 7994070186174196096, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.x
value: 319.7648
value: 325.793
objectReference: {fileID: 0}
- target: {fileID: 7994070186174196096, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
propertyPath: m_AnchoredPosition.y
value: -390.365
value: -244.865
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents:
- targetCorrespondingSourceObject: {fileID: 1587307805496131294, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
insertIndex: -1
addedObject: {fileID: -4652528632386102149}
- targetCorrespondingSourceObject: {fileID: 638888629593181178, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
insertIndex: -1
addedObject: {fileID: -3951142880580769630}
- targetCorrespondingSourceObject: {fileID: 5240566880216800156, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
insertIndex: -1
addedObject: {fileID: 2575974305937779158}
- targetCorrespondingSourceObject: {fileID: 3339048183292520057, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
insertIndex: -1
addedObject: {fileID: 2664713409092711742}
- targetCorrespondingSourceObject: {fileID: 1485949646938022227, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
insertIndex: -1
addedObject: {fileID: 7974602602961491175}
- targetCorrespondingSourceObject: {fileID: 2637052484218034586, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
insertIndex: -1
addedObject: {fileID: 3886389279204164388}
- targetCorrespondingSourceObject: {fileID: 2008450765919396854, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
insertIndex: -1
addedObject: {fileID: -6742229696664827499}
- targetCorrespondingSourceObject: {fileID: 671544646025808179, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
insertIndex: -1
addedObject: {fileID: -2502285299729673575}
- targetCorrespondingSourceObject: {fileID: 1009781454029594320, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
insertIndex: -1
addedObject: {fileID: 7596442569041387132}
- targetCorrespondingSourceObject: {fileID: 1711532612554376573, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
insertIndex: -1
addedObject: {fileID: 1180457547941725065}
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
--- !u!224 &1486127346949497132 stripped
RectTransform:
m_CorrespondingSourceObject: {fileID: 4735088385716738539, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
m_PrefabInstance: {fileID: 6136613255588772039}
m_PrefabAsset: {fileID: 0}
--- !u!1 &2131217412642415451 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 5240566880216800156, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
m_PrefabInstance: {fileID: 6136613255588772039}
m_PrefabAsset: {fileID: 0}
--- !u!114 &2575974305937779158
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2131217412642415451}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6b27f832d22e4a8d916272b644937774, type: 3}
m_Name:
m_EditorClassIdentifier:
Ban: 0
NoExport: 0
FontBan: 0
Preset: 0
ID: 289
FontID: 0
TextCfg: []
--- !u!1 &4735119850677590420 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 1485949646938022227, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
m_PrefabInstance: {fileID: 6136613255588772039}
m_PrefabAsset: {fileID: 0}
--- !u!114 &7974602602961491175
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4735119850677590420}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6b27f832d22e4a8d916272b644937774, type: 3}
m_Name:
m_EditorClassIdentifier:
Ban: 0
NoExport: 0
FontBan: 0
Preset: 0
ID: 19821
FontID: 0
TextCfg: []
--- !u!1 &4821443055563226554 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 1711532612554376573, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
m_PrefabInstance: {fileID: 6136613255588772039}
m_PrefabAsset: {fileID: 0}
--- !u!114 &1180457547941725065
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4821443055563226554}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6b27f832d22e4a8d916272b644937774, type: 3}
m_Name:
m_EditorClassIdentifier:
Ban: 0
NoExport: 0
FontBan: 0
Preset: 0
ID: 19777
FontID: 0
TextCfg: []
--- !u!1 &4841054263471719961 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 1587307805496131294, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
m_PrefabInstance: {fileID: 6136613255588772039}
m_PrefabAsset: {fileID: 0}
--- !u!114 &-4652528632386102149
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4841054263471719961}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6b27f832d22e4a8d916272b644937774, type: 3}
m_Name:
m_EditorClassIdentifier:
Ban: 0
NoExport: 0
FontBan: 0
Preset: 0
ID: 99
FontID: 2
TextCfg:
- Type: 1
ApplyFontSize: 0
FontSize: 24
ApplyCharacterSpacing: 0
CharacterSpacing: 100
ApplyWordSpacing: 0
WordSpacing: 0
ApplyLineSpacing: 0
LineSpacing: 0
ApplyParagraphSpacing: 0
ParagraphSpacing: 0
--- !u!1 &5689966534960536369 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 2008450765919396854, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
m_PrefabInstance: {fileID: 6136613255588772039}
m_PrefabAsset: {fileID: 0}
--- !u!114 &-6742229696664827499
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5689966534960536369}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6b27f832d22e4a8d916272b644937774, type: 3}
m_Name:
m_EditorClassIdentifier:
Ban: 0
NoExport: 0
FontBan: 0
Preset: 0
ID: 294
FontID: 0
TextCfg: []
--- !u!1 &6569300362529105431 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 1009781454029594320, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
m_PrefabInstance: {fileID: 6136613255588772039}
m_PrefabAsset: {fileID: 0}
--- !u!114 &7596442569041387132
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6569300362529105431}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6b27f832d22e4a8d916272b644937774, type: 3}
m_Name:
m_EditorClassIdentifier:
Ban: 0
NoExport: 0
FontBan: 0
Preset: 0
ID: 19822
FontID: 0
TextCfg: []
--- !u!1 &6663198184287597044 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 671544646025808179, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
m_PrefabInstance: {fileID: 6136613255588772039}
m_PrefabAsset: {fileID: 0}
--- !u!114 &-2502285299729673575
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6663198184287597044}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6b27f832d22e4a8d916272b644937774, type: 3}
m_Name:
m_EditorClassIdentifier:
Ban: 0
NoExport: 0
FontBan: 0
Preset: 0
ID: 295
FontID: 0
TextCfg: []
--- !u!1 &6770151506938327869 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 638888629593181178, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
m_PrefabInstance: {fileID: 6136613255588772039}
m_PrefabAsset: {fileID: 0}
--- !u!114 &-3951142880580769630
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6770151506938327869}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6b27f832d22e4a8d916272b644937774, type: 3}
m_Name:
m_EditorClassIdentifier:
Ban: 0
NoExport: 0
FontBan: 0
Preset: 0
ID: 19830
FontID: 0
TextCfg: []
--- !u!114 &7377197744426511123 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 3695400844062659540, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
@ -5291,54 +5170,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: e9fe05490c8fe3a49ad2e2e2fd413df3, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &8192347326634975581 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 2637052484218034586, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
m_PrefabInstance: {fileID: 6136613255588772039}
m_PrefabAsset: {fileID: 0}
--- !u!114 &3886389279204164388
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8192347326634975581}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6b27f832d22e4a8d916272b644937774, type: 3}
m_Name:
m_EditorClassIdentifier:
Ban: 0
NoExport: 0
FontBan: 0
Preset: 0
ID: 290
FontID: 0
TextCfg: []
--- !u!1 &8898848566735412926 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 3339048183292520057, guid: 7ef51c9dc8d0c5248942738961b531fe, type: 3}
m_PrefabInstance: {fileID: 6136613255588772039}
m_PrefabAsset: {fileID: 0}
--- !u!114 &2664713409092711742
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8898848566735412926}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6b27f832d22e4a8d916272b644937774, type: 3}
m_Name:
m_EditorClassIdentifier:
Ban: 0
NoExport: 0
FontBan: 0
Preset: 0
ID: 293
FontID: 0
TextCfg: []
--- !u!1001 &6359307179058667278
PrefabInstance:
m_ObjectHideFlags: 0

View File

@ -995,17 +995,17 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls: []
m_text: "[\u8865\u4E01\u7248\u672C\uFF1ADemo 1.6.3] \n\u53D1\u5E03\u65E5\u671F
25.1.4\n\n-------- [\u91CD\u8981bug\u4FEE\u590D] --------\n1.\u4FEE\u590D\u4E86\u62C6\u9664\u5EFA\u7B51\u65F6\u529F\u80FD\u6CA1\u6709\u6B63\u786E\u6263\u9664\u57CE\u5E02\u7ECF\u9A8C\u7684bug\n\n--------
[\u4F18\u5316\u4E0Ebug\u4FEE\u590D] --------\n1.\u4FEE\u590D\u4E86\u590D\u6D3B\u82F1\u96C4\u6309\u94AE\u4F4D\u4E8E\u9009\u9879\u7B2C\u4E09\u6392\u65F6\u5012\u8BA1\u65F6\u65E0\u6CD5\u663E\u793A\u7684bug\n2.\u4F18\u5316\u4E86\u57CE\u5E02\u57FA\u7840\u4FE1\u606F\u7684\u663E\u793A\n3.\u4F18\u5316\u4E86\u57CE\u5E02\u548C\u5E1D\u56FD\u79D1\u6280\u70B9\u7684\u663E\u793A\n4.\u4F18\u5316\u4E86\u57CE\u5E02\u7ECF\u9A8C\u7684\u83B7\u53D6\u52A8\u753B\n5.\u4F18\u5316\u4E86\u6218\u573A\u5355\u4F4D\u7684\u663E\u793A\n6.\u4FEE\u590D\u4E86\u5947\u89C2\u7684\u4FE1\u606F\u680F\u5EFA\u7B51\u4E00\u680F\u663E\u793A\u9519\u8BEF\u7684bug\n7.\u4FEE\u590D\u4E86\u82F1\u96C4\u4EFB\u52A1\u5B8C\u6210\u65F6\uFF0C\u82F1\u96C4\u754C\u9762\u4EFB\u52A1\u8FDB\u5EA6\u6587\u5B57\u4E0E\u4EFB\u52A1\u5B8C\u6210\u63D0\u793A\u91CD\u53E0\u7684bug\n8.\u4FEE\u590D\u4E86\u6D77\u4E0A\u9057\u8FF9\u83B7\u5F97\u7684\u7A81\u51FB\u8247\u521D\u59CB\u8840\u91CF\u9519\u8BEF\u7684bug\n9.\u4FEE\u590D\u4E86\u5728\u6BCF\u56DE\u5408\u5F00\u59CB\u6536\u53D6\u91D1\u5E01\u52A8\u753B\u671F\u95F4\u5FEB\u901F\u6D88\u8017\u91D1\u5E01\u53EF\u80FD\u5BFC\u81F4\u91D1\u5E01\u6570\u91CF\u663E\u793A\u9519\u8BEF\u7684bug[\u8865\u4E01\u7248\u672C\uFF1ADemo
25.1.4\n\n-------- [\u91CD\u8981bug\u4FEE\u590D] --------\n1.\u4FEE\u590D\u4E86\u62C6\u9664\u5EFA\u7B51\u65F6\u529F\u80FD\u6CA1\u6709\u6B63\u786E\u6263\u9664**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u7684bug\n\n--------
[\u4F18\u5316\u4E0Ebug\u4FEE\u590D] --------\n1.\u4FEE\u590D\u4E86\u590D\u6D3B\u82F1\u96C4\u6309\u94AE\u4F4D\u4E8E\u9009\u9879\u7B2C\u4E09\u6392\u65F6\u5012\u8BA1\u65F6\u65E0\u6CD5\u663E\u793A\u7684bug\n2.\u4F18\u5316\u4E86\u57CE\u5E02\u57FA\u7840\u4FE1\u606F\u7684\u663E\u793A\n3.\u4F18\u5316\u4E86\u57CE\u5E02\u548C\u5E1D\u56FD\u79D1\u6280\u70B9\u7684\u663E\u793A\n4.\u4F18\u5316\u4E86**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u7684\u83B7\u53D6\u52A8\u753B\n5.\u4F18\u5316\u4E86\u6218\u573A\u5355\u4F4D\u7684\u663E\u793A\n6.\u4FEE\u590D\u4E86\u5947\u89C2\u7684\u4FE1\u606F\u680F\u5EFA\u7B51\u4E00\u680F\u663E\u793A\u9519\u8BEF\u7684bug\n7.\u4FEE\u590D\u4E86\u82F1\u96C4\u4EFB\u52A1\u5B8C\u6210\u65F6\uFF0C\u82F1\u96C4\u754C\u9762\u4EFB\u52A1\u8FDB\u5EA6\u6587\u5B57\u4E0E\u4EFB\u52A1\u5B8C\u6210\u63D0\u793A\u91CD\u53E0\u7684bug\n8.\u4FEE\u590D\u4E86\u6D77\u4E0A\u9057\u8FF9\u83B7\u5F97\u7684\u7A81\u51FB\u8247\u521D\u59CB\u8840\u91CF\u9519\u8BEF\u7684bug\n9.\u4FEE\u590D\u4E86\u5728\u6BCF\u56DE\u5408\u5F00\u59CB\u6536\u53D6\u91D1\u5E01\u52A8\u753B\u671F\u95F4\u5FEB\u901F\u6D88\u8017\u91D1\u5E01\u53EF\u80FD\u5BFC\u81F4\u91D1\u5E01\u6570\u91CF\u663E\u793A\u9519\u8BEF\u7684bug[\u8865\u4E01\u7248\u672C\uFF1ADemo
1.6.3] \n\u53D1\u5E03\u65E5\u671F 25.1.4\n\n-------- [\u91CD\u8981bug\u4FEE\u590D]
--------\n1.\u4FEE\u590D\u4E86\u62C6\u9664\u5EFA\u7B51\u65F6\u529F\u80FD\u6CA1\u6709\u6B63\u786E\u6263\u9664\u57CE\u5E02\u7ECF\u9A8C\u7684bug\n\n--------
[\u4F18\u5316\u4E0Ebug\u4FEE\u590D] --------\n1.\u4FEE\u590D\u4E86\u590D\u6D3B\u82F1\u96C4\u6309\u94AE\u4F4D\u4E8E\u9009\u9879\u7B2C\u4E09\u6392\u65F6\u5012\u8BA1\u65F6\u65E0\u6CD5\u663E\u793A\u7684bug\n2.\u4F18\u5316\u4E86\u57CE\u5E02\u57FA\u7840\u4FE1\u606F\u7684\u663E\u793A\n3.\u4F18\u5316\u4E86\u57CE\u5E02\u548C\u5E1D\u56FD\u79D1\u6280\u70B9\u7684\u663E\u793A\n4.\u4F18\u5316\u4E86\u57CE\u5E02\u7ECF\u9A8C\u7684\u83B7\u53D6\u52A8\u753B\n5.\u4F18\u5316\u4E86\u6218\u573A\u5355\u4F4D\u7684\u663E\u793A\n6.\u4FEE\u590D\u4E86\u5947\u89C2\u7684\u4FE1\u606F\u680F\u5EFA\u7B51\u4E00\u680F\u663E\u793A\u9519\u8BEF\u7684bug\n7.\u4FEE\u590D\u4E86\u82F1\u96C4\u4EFB\u52A1\u5B8C\u6210\u65F6\uFF0C\u82F1\u96C4\u754C\u9762\u4EFB\u52A1\u8FDB\u5EA6\u6587\u5B57\u4E0E\u4EFB\u52A1\u5B8C\u6210\u63D0\u793A\u91CD\u53E0\u7684bug\n8.\u4FEE\u590D\u4E86\u6D77\u4E0A\u9057\u8FF9\u83B7\u5F97\u7684\u7A81\u51FB\u8247\u521D\u59CB\u8840\u91CF\u9519\u8BEF\u7684bug\n9.\u4FEE\u590D\u4E86\u5728\u6BCF\u56DE\u5408\u5F00\u59CB\u6536\u53D6\u91D1\u5E01\u52A8\u753B\u671F\u95F4\u5FEB\u901F\u6D88\u8017\u91D1\u5E01\u53EF\u80FD\u5BFC\u81F4\u91D1\u5E01\u6570\u91CF\u663E\u793A\u9519\u8BEF\u7684bug[\u8865\u4E01\u7248\u672C\uFF1ADemo
--------\n1.\u4FEE\u590D\u4E86\u62C6\u9664\u5EFA\u7B51\u65F6\u529F\u80FD\u6CA1\u6709\u6B63\u786E\u6263\u9664**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u7684bug\n\n--------
[\u4F18\u5316\u4E0Ebug\u4FEE\u590D] --------\n1.\u4FEE\u590D\u4E86\u590D\u6D3B\u82F1\u96C4\u6309\u94AE\u4F4D\u4E8E\u9009\u9879\u7B2C\u4E09\u6392\u65F6\u5012\u8BA1\u65F6\u65E0\u6CD5\u663E\u793A\u7684bug\n2.\u4F18\u5316\u4E86\u57CE\u5E02\u57FA\u7840\u4FE1\u606F\u7684\u663E\u793A\n3.\u4F18\u5316\u4E86\u57CE\u5E02\u548C\u5E1D\u56FD\u79D1\u6280\u70B9\u7684\u663E\u793A\n4.\u4F18\u5316\u4E86**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u7684\u83B7\u53D6\u52A8\u753B\n5.\u4F18\u5316\u4E86\u6218\u573A\u5355\u4F4D\u7684\u663E\u793A\n6.\u4FEE\u590D\u4E86\u5947\u89C2\u7684\u4FE1\u606F\u680F\u5EFA\u7B51\u4E00\u680F\u663E\u793A\u9519\u8BEF\u7684bug\n7.\u4FEE\u590D\u4E86\u82F1\u96C4\u4EFB\u52A1\u5B8C\u6210\u65F6\uFF0C\u82F1\u96C4\u754C\u9762\u4EFB\u52A1\u8FDB\u5EA6\u6587\u5B57\u4E0E\u4EFB\u52A1\u5B8C\u6210\u63D0\u793A\u91CD\u53E0\u7684bug\n8.\u4FEE\u590D\u4E86\u6D77\u4E0A\u9057\u8FF9\u83B7\u5F97\u7684\u7A81\u51FB\u8247\u521D\u59CB\u8840\u91CF\u9519\u8BEF\u7684bug\n9.\u4FEE\u590D\u4E86\u5728\u6BCF\u56DE\u5408\u5F00\u59CB\u6536\u53D6\u91D1\u5E01\u52A8\u753B\u671F\u95F4\u5FEB\u901F\u6D88\u8017\u91D1\u5E01\u53EF\u80FD\u5BFC\u81F4\u91D1\u5E01\u6570\u91CF\u663E\u793A\u9519\u8BEF\u7684bug[\u8865\u4E01\u7248\u672C\uFF1ADemo
1.6.3] \n\u53D1\u5E03\u65E5\u671F 25.1.4\n\n-------- [\u91CD\u8981bug\u4FEE\u590D]
--------\n1.\u4FEE\u590D\u4E86\u62C6\u9664\u5EFA\u7B51\u65F6\u529F\u80FD\u6CA1\u6709\u6B63\u786E\u6263\u9664\u57CE\u5E02\u7ECF\u9A8C\u7684bug\n\n--------
[\u4F18\u5316\u4E0Ebug\u4FEE\u590D] --------\n1.\u4FEE\u590D\u4E86\u590D\u6D3B\u82F1\u96C4\u6309\u94AE\u4F4D\u4E8E\u9009\u9879\u7B2C\u4E09\u6392\u65F6\u5012\u8BA1\u65F6\u65E0\u6CD5\u663E\u793A\u7684bug\n2.\u4F18\u5316\u4E86\u57CE\u5E02\u57FA\u7840\u4FE1\u606F\u7684\u663E\u793A\n3.\u4F18\u5316\u4E86\u57CE\u5E02\u548C\u5E1D\u56FD\u79D1\u6280\u70B9\u7684\u663E\u793A\n4.\u4F18\u5316\u4E86\u57CE\u5E02\u7ECF\u9A8C\u7684\u83B7\u53D6\u52A8\u753B\n5.\u4F18\u5316\u4E86\u6218\u573A\u5355\u4F4D\u7684\u663E\u793A\n6.\u4FEE\u590D\u4E86\u5947\u89C2\u7684\u4FE1\u606F\u680F\u5EFA\u7B51\u4E00\u680F\u663E\u793A\u9519\u8BEF\u7684bug\n7.\u4FEE\u590D\u4E86\u82F1\u96C4\u4EFB\u52A1\u5B8C\u6210\u65F6\uFF0C\u82F1\u96C4\u754C\u9762\u4EFB\u52A1\u8FDB\u5EA6\u6587\u5B57\u4E0E\u4EFB\u52A1\u5B8C\u6210\u63D0\u793A\u91CD\u53E0\u7684bug\n8.\u4FEE\u590D\u4E86\u6D77\u4E0A\u9057\u8FF9\u83B7\u5F97\u7684\u7A81\u51FB\u8247\u521D\u59CB\u8840\u91CF\u9519\u8BEF\u7684bug\n9.\u4FEE\u590D\u4E86\u5728\u6BCF\u56DE\u5408\u5F00\u59CB\u6536\u53D6\u91D1\u5E01\u52A8\u753B\u671F\u95F4\u5FEB\u901F\u6D88\u8017\u91D1\u5E01\u53EF\u80FD\u5BFC\u81F4\u91D1\u5E01\u6570\u91CF\u663E\u793A\u9519\u8BEF\u7684bug[\u8865\u4E01\u7248\u672C\uFF1ADemo
--------\n1.\u4FEE\u590D\u4E86\u62C6\u9664\u5EFA\u7B51\u65F6\u529F\u80FD\u6CA1\u6709\u6B63\u786E\u6263\u9664**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u7684bug\n\n--------
[\u4F18\u5316\u4E0Ebug\u4FEE\u590D] --------\n1.\u4FEE\u590D\u4E86\u590D\u6D3B\u82F1\u96C4\u6309\u94AE\u4F4D\u4E8E\u9009\u9879\u7B2C\u4E09\u6392\u65F6\u5012\u8BA1\u65F6\u65E0\u6CD5\u663E\u793A\u7684bug\n2.\u4F18\u5316\u4E86\u57CE\u5E02\u57FA\u7840\u4FE1\u606F\u7684\u663E\u793A\n3.\u4F18\u5316\u4E86\u57CE\u5E02\u548C\u5E1D\u56FD\u79D1\u6280\u70B9\u7684\u663E\u793A\n4.\u4F18\u5316\u4E86**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u7684\u83B7\u53D6\u52A8\u753B\n5.\u4F18\u5316\u4E86\u6218\u573A\u5355\u4F4D\u7684\u663E\u793A\n6.\u4FEE\u590D\u4E86\u5947\u89C2\u7684\u4FE1\u606F\u680F\u5EFA\u7B51\u4E00\u680F\u663E\u793A\u9519\u8BEF\u7684bug\n7.\u4FEE\u590D\u4E86\u82F1\u96C4\u4EFB\u52A1\u5B8C\u6210\u65F6\uFF0C\u82F1\u96C4\u754C\u9762\u4EFB\u52A1\u8FDB\u5EA6\u6587\u5B57\u4E0E\u4EFB\u52A1\u5B8C\u6210\u63D0\u793A\u91CD\u53E0\u7684bug\n8.\u4FEE\u590D\u4E86\u6D77\u4E0A\u9057\u8FF9\u83B7\u5F97\u7684\u7A81\u51FB\u8247\u521D\u59CB\u8840\u91CF\u9519\u8BEF\u7684bug\n9.\u4FEE\u590D\u4E86\u5728\u6BCF\u56DE\u5408\u5F00\u59CB\u6536\u53D6\u91D1\u5E01\u52A8\u753B\u671F\u95F4\u5FEB\u901F\u6D88\u8017\u91D1\u5E01\u53EF\u80FD\u5BFC\u81F4\u91D1\u5E01\u6570\u91CF\u663E\u793A\u9519\u8BEF\u7684bug[\u8865\u4E01\u7248\u672C\uFF1ADemo
1.6.3] \n\u53D1\u5E03\u65E5\u671F 25.1.4\n\n-------- [\u91CD\u8981bug\u4FEE\u590D]
--------\n1.\u4FEE\u590D\u4E86\u62C6\u9664\u5EFA\u7B51\u65F6\u529F\u80FD\u6CA1\u6709\u6B63\u786E\u6263\u9664\u57CE\u5E02\u7ECF\u9A8C\u7684bug\n\n--------
[\u4F18\u5316\u4E0Ebug\u4FEE\u590D] --------\n1.\u4FEE\u590D\u4E86\u590D\u6D3B\u82F1\u96C4\u6309\u94AE\u4F4D\u4E8E\u9009\u9879\u7B2C\u4E09\u6392\u65F6\u5012\u8BA1\u65F6\u65E0\u6CD5\u663E\u793A\u7684bug\n2.\u4F18\u5316\u4E86\u57CE\u5E02\u57FA\u7840\u4FE1\u606F\u7684\u663E\u793A\n3.\u4F18\u5316\u4E86\u57CE\u5E02\u548C\u5E1D\u56FD\u79D1\u6280\u70B9\u7684\u663E\u793A\n4.\u4F18\u5316\u4E86\u57CE\u5E02\u7ECF\u9A8C\u7684\u83B7\u53D6\u52A8\u753B\n5.\u4F18\u5316\u4E86\u6218\u573A\u5355\u4F4D\u7684\u663E\u793A\n6.\u4FEE\u590D\u4E86\u5947\u89C2\u7684\u4FE1\u606F\u680F\u5EFA\u7B51\u4E00\u680F\u663E\u793A\u9519\u8BEF\u7684bug\n7.\u4FEE\u590D\u4E86\u82F1\u96C4\u4EFB\u52A1\u5B8C\u6210\u65F6\uFF0C\u82F1\u96C4\u754C\u9762\u4EFB\u52A1\u8FDB\u5EA6\u6587\u5B57\u4E0E\u4EFB\u52A1\u5B8C\u6210\u63D0\u793A\u91CD\u53E0\u7684bug\n8.\u4FEE\u590D\u4E86\u6D77\u4E0A\u9057\u8FF9\u83B7\u5F97\u7684\u7A81\u51FB\u8247\u521D\u59CB\u8840\u91CF\u9519\u8BEF\u7684bug\n9.\u4FEE\u590D\u4E86\u5728\u6BCF\u56DE\u5408\u5F00\u59CB\u6536\u53D6\u91D1\u5E01\u52A8\u753B\u671F\u95F4\u5FEB\u901F\u6D88\u8017\u91D1\u5E01\u53EF\u80FD\u5BFC\u81F4\u91D1\u5E01\u6570\u91CF\u663E\u793A\u9519\u8BEF\u7684bug"
--------\n1.\u4FEE\u590D\u4E86\u62C6\u9664\u5EFA\u7B51\u65F6\u529F\u80FD\u6CA1\u6709\u6B63\u786E\u6263\u9664**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u7684bug\n\n--------
[\u4F18\u5316\u4E0Ebug\u4FEE\u590D] --------\n1.\u4FEE\u590D\u4E86\u590D\u6D3B\u82F1\u96C4\u6309\u94AE\u4F4D\u4E8E\u9009\u9879\u7B2C\u4E09\u6392\u65F6\u5012\u8BA1\u65F6\u65E0\u6CD5\u663E\u793A\u7684bug\n2.\u4F18\u5316\u4E86\u57CE\u5E02\u57FA\u7840\u4FE1\u606F\u7684\u663E\u793A\n3.\u4F18\u5316\u4E86\u57CE\u5E02\u548C\u5E1D\u56FD\u79D1\u6280\u70B9\u7684\u663E\u793A\n4.\u4F18\u5316\u4E86**<\u57CE\u5E02\u53D1\u5C55\u5EA6>**\u7684\u83B7\u53D6\u52A8\u753B\n5.\u4F18\u5316\u4E86\u6218\u573A\u5355\u4F4D\u7684\u663E\u793A\n6.\u4FEE\u590D\u4E86\u5947\u89C2\u7684\u4FE1\u606F\u680F\u5EFA\u7B51\u4E00\u680F\u663E\u793A\u9519\u8BEF\u7684bug\n7.\u4FEE\u590D\u4E86\u82F1\u96C4\u4EFB\u52A1\u5B8C\u6210\u65F6\uFF0C\u82F1\u96C4\u754C\u9762\u4EFB\u52A1\u8FDB\u5EA6\u6587\u5B57\u4E0E\u4EFB\u52A1\u5B8C\u6210\u63D0\u793A\u91CD\u53E0\u7684bug\n8.\u4FEE\u590D\u4E86\u6D77\u4E0A\u9057\u8FF9\u83B7\u5F97\u7684\u7A81\u51FB\u8247\u521D\u59CB\u8840\u91CF\u9519\u8BEF\u7684bug\n9.\u4FEE\u590D\u4E86\u5728\u6BCF\u56DE\u5408\u5F00\u59CB\u6536\u53D6\u91D1\u5E01\u52A8\u753B\u671F\u95F4\u5FEB\u901F\u6D88\u8017\u91D1\u5E01\u53EF\u80FD\u5BFC\u81F4\u91D1\u5E01\u6570\u91CF\u663E\u793A\u9519\u8BEF\u7684bug"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8e119f168f1a6b745be02ef19f51610f, type: 2}
m_sharedMaterial: {fileID: -8081454072124122709, guid: 8e119f168f1a6b745be02ef19f51610f, type: 2}
@ -1090,7 +1090,7 @@ MonoBehaviour:
NoExport: 0
FontBan: 0
Preset: 0
ID: 17062
ID: 21153
FontID: 1
TextCfg:
- Type: 1

View File

@ -2069,6 +2069,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 11
ShowWikiNameInHint: 0
--- !u!1 &363799916270652669
GameObject:
m_ObjectHideFlags: 0
@ -14527,7 +14528,7 @@ MonoBehaviour:
TimeGroup: {fileID: 2274168138790390027}
WaterRow: {fileID: 4383974893084986848}
Water: {fileID: 7521021416995573315}
NearToggle: {fileID: 0}
NearToggle: {fileID: 5645551490641389971}
--- !u!1 &3841575198812028415
GameObject:
m_ObjectHideFlags: 0
@ -25604,6 +25605,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 10
ShowWikiNameInHint: 0
--- !u!1 &5908035494656309294
GameObject:
m_ObjectHideFlags: 0
@ -28566,6 +28568,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 9
ShowWikiNameInHint: 0
--- !u!1 &7048315436533850258
GameObject:
m_ObjectHideFlags: 0

View File

@ -2204,6 +2204,171 @@ MonoBehaviour:
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 2
--- !u!1 &4551686799909881948
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3158107335264150104}
- component: {fileID: 8143296128513183419}
- component: {fileID: 2737715248453704710}
- component: {fileID: 1711369049110144768}
m_Layer: 5
m_Name: Version
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!224 &3158107335264150104
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4551686799909881948}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2438225421395076648}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
m_AnchoredPosition: {x: 894, y: -16}
m_SizeDelta: {x: 206.58, y: 39.1089}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &8143296128513183419
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4551686799909881948}
m_CullTransparentMesh: 1
--- !u!114 &2737715248453704710
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4551686799909881948}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: V0.7.3g
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8e119f168f1a6b745be02ef19f51610f, type: 2}
m_sharedMaterial: {fileID: -8081454072124122709, guid: 8e119f168f1a6b745be02ef19f51610f, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4280556828
m_fontColor: {r: 0.10980393, g: 0.1137255, b: 0.14117648, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 18
m_fontSizeBase: 18
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 12
m_fontSizeMax: 24
m_fontStyle: 0
m_HorizontalAlignment: 4
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 0
m_wordWrappingRatios: 0.4
m_overflowMode: 1
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &1711369049110144768
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4551686799909881948}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6b27f832d22e4a8d916272b644937774, type: 3}
m_Name:
m_EditorClassIdentifier:
Ban: 0
NoExport: 0
FontBan: 0
Preset: 0
ID: 21090
FontID: 1
TextCfg:
- Type: 1
ApplyFontSize: 0
FontSize: 24
ApplyCharacterSpacing: 0
CharacterSpacing: 0
ApplyWordSpacing: 0
WordSpacing: 0
ApplyLineSpacing: 0
LineSpacing: 0
ApplyParagraphSpacing: 0
ParagraphSpacing: 0
--- !u!1 &4574996094802340373
GameObject:
m_ObjectHideFlags: 0
@ -3279,6 +3444,7 @@ RectTransform:
- {fileID: 8207125967839836190}
- {fileID: 4667728109123456789}
- {fileID: 6303313510194795360}
- {fileID: 3158107335264150104}
- {fileID: 3110038563642209199}
- {fileID: 6579359848737393927}
- {fileID: 156356484042927983}

View File

@ -6116,7 +6116,11 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 1305705549259675497, guid: d60a14dc86fa6eb4393a807707706fe8, type: 3}
propertyPath: m_Size
value: 0.75226617
value: 0.6938792
objectReference: {fileID: 0}
- target: {fileID: 1305705549259675497, guid: d60a14dc86fa6eb4393a807707706fe8, type: 3}
propertyPath: m_Value
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1415829388902399652, guid: d60a14dc86fa6eb4393a807707706fe8, type: 3}
propertyPath: m_AnchorMax.y

View File

@ -37,7 +37,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 195.7, y: -25.23105}
m_SizeDelta: {x: 0, y: 50.4621}
m_SizeDelta: {x: 351.4, y: 50.4621}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3008411533810648394
CanvasRenderer:

View File

@ -1934,7 +1934,7 @@ MonoBehaviour:
TestTitle: {fileID: 4570603145798529443}
TestGroup: {fileID: 2069599407373216499}
ResumeToggle: {fileID: 2799874246160134801}
NearToggle: {fileID: 0}
NearToggle: {fileID: 2817872014645801402}
StartButton: {fileID: 4295583436560441463}
CloseButton: {fileID: 8083913519070174357}
BlockerButton: {fileID: 1282977772445369391}
@ -11035,6 +11035,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 9
ShowWikiNameInHint: 0
--- !u!1 &7700750613240084010
GameObject:
m_ObjectHideFlags: 0
@ -12874,6 +12875,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 10
ShowWikiNameInHint: 0
--- !u!1 &8810924184225504814
GameObject:
m_ObjectHideFlags: 0

View File

@ -723,6 +723,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
--- !u!1 &8944683762979028098
GameObject:
m_ObjectHideFlags: 0

View File

@ -233,6 +233,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
--- !u!225 &561595370928176174
CanvasGroup:
m_ObjectHideFlags: 0
@ -1067,7 +1068,7 @@ MonoBehaviour:
- BigType: 5
SmallTypes: 6e0000006f000000
- BigType: 6
SmallTypes: 6400000065000000660000006700000068000000
SmallTypes: 640000006900000065000000660000006700000068000000
BigSelectButtonPrefab: {fileID: 4989028887636264829, guid: 5c902d681ba81294aabc31392b8e5a0d, type: 3}
BigSelectArea: {fileID: 7587354269484913663}
SmallSelectButtonPrefab: {fileID: 9019303537036836721, guid: 39337c6de85b63f4185268484ede5bb1, type: 3}
@ -1294,6 +1295,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
--- !u!225 &5394946346870615241
CanvasGroup:
m_ObjectHideFlags: 0
@ -3345,6 +3347,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
--- !u!1 &6290379265712900593
GameObject:
m_ObjectHideFlags: 0
@ -4207,6 +4210,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 1
ShowWikiNameInHint: 0
--- !u!1 &7917773665552577846
GameObject:
m_ObjectHideFlags: 0

View File

@ -440,6 +440,7 @@ MonoBehaviour:
UnitLevel: 0
PlayerTaskType: 0
WikiId: 0
ShowWikiNameInHint: 0
--- !u!1 &4075501085066031480
GameObject:
m_ObjectHideFlags: 0

View File

@ -13438,6 +13438,9 @@ GameObject:
- component: {fileID: 1726596150}
- component: {fileID: 1726596152}
- component: {fileID: 1726596151}
- component: {fileID: 1726596153}
- component: {fileID: 1726596154}
- component: {fileID: 1726596155}
m_Layer: 5
m_Name: tohotopiaBG
m_TagString: Untagged
@ -13503,6 +13506,53 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1726596149}
m_CullTransparentMesh: 1
--- !u!225 &1726596153
CanvasGroup:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1726596149}
m_Enabled: 1
m_Alpha: 1
m_Interactable: 0
m_BlocksRaycasts: 0
m_IgnoreParentGroups: 0
--- !u!95 &1726596154
Animator:
serializedVersion: 5
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1726596149}
m_Enabled: 1
m_Avatar: {fileID: 0}
m_Controller: {fileID: 0}
m_CullingMode: 0
m_UpdateMode: 0
m_ApplyRootMotion: 0
m_LinearVelocityBlending: 0
m_StabilizeFeet: 0
m_WarningMessage:
m_HasTransformHierarchy: 1
m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorStateOnDisable: 0
m_WriteDefaultValuesOnDisable: 0
--- !u!114 &1726596155
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1726596149}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0ad50f81b1d25c441943c37a89ba23f6, type: 3}
m_Name:
m_EditorClassIdentifier:
_Animator: {fileID: 1726596154}
_ActionOnDisable: 0
--- !u!1 &1759254319
GameObject:
m_ObjectHideFlags: 0

View File

@ -1478,6 +1478,7 @@ public class AOTGenericReferences : UnityEngine.MonoBehaviour
// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,byte,uint,uint,uint,float,int,int,byte,int,int,byte,byte,int,byte>(byte&,byte&,uint&,uint&,uint&,float&,int&,int&,byte&,int&,int&,byte&,byte&,int&,byte&)
// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,byte>(byte&,byte&)
// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,float>(byte&,float&)
// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,int,int,byte>(byte&,int&,int&,byte&)
// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,int,int>(byte&,int&,int&)
// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,int,ulong>(byte&,int&,ulong&)
// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,uint,uint,int,int>(byte&,uint&,uint&,int&,int&)
@ -1560,7 +1561,7 @@ public class AOTGenericReferences : UnityEngine.MonoBehaviour
// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<byte,byte,int,uint>(byte&,byte&,int&,uint&)
// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<byte,byte>(byte&,byte&)
// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<byte,float>(byte&,float&)
// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<byte,int,int>(byte&,int&,int&)
// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<byte,int,int,byte>(byte&,int&,int&,byte&)
// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<byte>(byte&)
// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<float,int,int,int,int,int>(float&,int&,int&,int&,int&,int&)
// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<float>(float&)
@ -1580,6 +1581,7 @@ public class AOTGenericReferences : UnityEngine.MonoBehaviour
// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<uint,uint,uint,uint,int,uint,int>(uint&,uint&,uint&,uint&,int&,uint&,int&)
// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<uint,uint,uint>(uint&,uint&,uint&)
// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<uint,uint>(uint&,uint&)
// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<uint>(uint&)
// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<ulong,uint,int>(ulong&,uint&,int&)
// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<ulong,ulong,long,long,long,int,int,byte,byte,float,float,int,int,int,float>(ulong&,ulong&,long&,long&,long&,int&,int&,byte&,byte&,float&,float&,int&,int&,int&,float&)
// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedArray<byte>(byte[])
@ -1642,6 +1644,7 @@ public class AOTGenericReferences : UnityEngine.MonoBehaviour
// float System.Collections.Generic.CollectionExtensions.GetValueOrDefault<uint,float>(System.Collections.Generic.IReadOnlyDictionary<uint,float>,uint)
// float System.Collections.Generic.CollectionExtensions.GetValueOrDefault<uint,float>(System.Collections.Generic.IReadOnlyDictionary<uint,float>,uint,float)
// int System.Collections.Generic.CollectionExtensions.GetValueOrDefault<RuntimeData.UnitFullType,int>(System.Collections.Generic.IReadOnlyDictionary<RuntimeData.UnitFullType,int>,RuntimeData.UnitFullType,int)
// int System.Collections.Generic.CollectionExtensions.GetValueOrDefault<int,int>(System.Collections.Generic.IReadOnlyDictionary<int,int>,int)
// int System.Collections.Generic.CollectionExtensions.GetValueOrDefault<int,int>(System.Collections.Generic.IReadOnlyDictionary<int,int>,int,int)
// int System.Collections.Generic.CollectionExtensions.GetValueOrDefault<object,int>(System.Collections.Generic.IReadOnlyDictionary<object,int>,object,int)
// int System.Collections.Generic.CollectionExtensions.GetValueOrDefault<uint,int>(System.Collections.Generic.IReadOnlyDictionary<uint,int>,uint,int)
@ -1669,7 +1672,9 @@ public class AOTGenericReferences : UnityEngine.MonoBehaviour
// object System.Linq.Enumerable.First<object>(System.Collections.Generic.IEnumerable<object>)
// uint System.Linq.Enumerable.First<uint>(System.Collections.Generic.IEnumerable<uint>)
// object System.Linq.Enumerable.FirstOrDefault<object>(System.Collections.Generic.IEnumerable<object>)
// object System.Linq.Enumerable.FirstOrDefault<object>(System.Collections.Generic.IEnumerable<object>,System.Func<object,bool>)
// System.Linq.IOrderedEnumerable<System.ValueTuple<UnityEngine.Vector2Int,float>> System.Linq.Enumerable.OrderBy<System.ValueTuple<UnityEngine.Vector2Int,float>,float>(System.Collections.Generic.IEnumerable<System.ValueTuple<UnityEngine.Vector2Int,float>>,System.Func<System.ValueTuple<UnityEngine.Vector2Int,float>,float>)
// System.Linq.IOrderedEnumerable<object> System.Linq.Enumerable.OrderBy<object,System.DateTime>(System.Collections.Generic.IEnumerable<object>,System.Func<object,System.DateTime>)
// System.Linq.IOrderedEnumerable<object> System.Linq.Enumerable.OrderBy<object,int>(System.Collections.Generic.IEnumerable<object>,System.Func<object,int>)
// System.Linq.IOrderedEnumerable<object> System.Linq.Enumerable.OrderByDescending<object,System.DateTime>(System.Collections.Generic.IEnumerable<object>,System.Func<object,System.DateTime>)
// System.Collections.Generic.IEnumerable<System.ValueTuple<UnityEngine.Vector2Int,float>> System.Linq.Enumerable.Select<int,System.ValueTuple<UnityEngine.Vector2Int,float>>(System.Collections.Generic.IEnumerable<int>,System.Func<int,System.ValueTuple<UnityEngine.Vector2Int,float>>)

File diff suppressed because it is too large Load Diff

View File

@ -138,8 +138,26 @@ namespace TH1_Core.Managers
if (_startupFallbackImage == null) return;
_startupFallbackImage.SetActive(false);
_startupFallbackImageHidden = true;
var animancer = _startupFallbackImage.GetComponent<AnimancerComponent>();
var fadeOutClip = ResourceCache.Instance?.AnimCache?.UICommonPanelFadeOut;
var canvasGroup = _startupFallbackImage.GetComponent<CanvasGroup>();
if (canvasGroup != null) canvasGroup.alpha = 1f;
if (animancer == null || fadeOutClip == null)
{
_startupFallbackImage.SetActive(false);
return;
}
var startupFallbackImage = _startupFallbackImage;
var state = animancer.Play(fadeOutClip);
state.Events.OnEnd = () =>
{
if (startupFallbackImage != null)
startupFallbackImage.SetActive(false);
state.Events.OnEnd = null;
};
}
private GameObject FindStartupFallbackImage()

View File

@ -11,6 +11,7 @@ using System.Collections.Generic;
using System.IO;
using Logic.Achievement;
using Logic.CrashSight;
using TH1_Logic.MatchConfig;
using TH1_Logic.Config;
using TH1_Logic.Tools;
using UnityEngine;
@ -20,6 +21,8 @@ namespace RuntimeData
{
public class AchievementDataManager
{
private const string LibraryAchievementRebuildMarkerFileName = "achievement_library_record_rebuild_v1.marker";
public static AchievementDataManager Instance = new AchievementDataManager();
public AchievementData Achievement;
public List<uint> FinishedCache;
@ -35,6 +38,7 @@ namespace RuntimeData
public void Init()
{
LoadAchievement();
RebuildLibraryAchievementFromEndedArchives();
ReCheckAchievementDataNotComplete();
foreach (var item in Achievement.AchievementList) item.CheckConditions(null);
}
@ -147,6 +151,172 @@ namespace RuntimeData
FileTools.SafeWriteFile(Application.persistentDataPath + "/../Config/achievement.json", bytes);
}
private void RebuildLibraryAchievementFromEndedArchives()
{
if (Achievement?.AchievementList == null) return;
var configRoot = Path.GetDirectoryName(Application.persistentDataPath + "/../Config/achievement.json");
if (string.IsNullOrEmpty(configRoot) || !Directory.Exists(configRoot)) return;
if (File.Exists(GetLibraryAchievementRebuildMarkerPath(configRoot))) return;
var heroCounts = new Dictionary<GiantType, int>();
var wonderCounts = new Dictionary<WonderLibrary, int>();
var scannedCount = 0;
var skippedCount = 0;
foreach (var archivePath in GameRecordManager.EnumerateEndedArchiveFiles(configRoot))
{
try
{
var map = GameRecordManager.ReadMigrationArchive(archivePath);
if (!TryCollectEndedArchiveLibraryProgress(map, heroCounts, wonderCounts))
{
skippedCount++;
continue;
}
scannedCount++;
}
catch (Exception ex)
{
skippedCount++;
LogSystem.LogError($"[Achievement] 图鉴星星历史回补读取失败: {archivePath} | {ex.Message}");
}
}
var finishedChangedCount = ApplyLibraryAchievementCounts(heroCounts, wonderCounts, out var progressChangedCount);
if (progressChangedCount > 0) SaveAchievementData();
if (scannedCount > 0 || skippedCount == 0)
WriteLibraryAchievementRebuildMarker(configRoot, scannedCount, skippedCount, progressChangedCount, finishedChangedCount);
if (scannedCount > 0 || skippedCount > 0 || progressChangedCount > 0)
{
LogSystem.LogInfo(
$"[Achievement] 图鉴星星历史记录回补完成 scanned={scannedCount}, skipped={skippedCount}, progressChanged={progressChangedCount}, finishedChanged={finishedChangedCount}");
}
}
private bool TryCollectEndedArchiveLibraryProgress(
MapData map,
Dictionary<GiantType, int> heroCounts,
Dictionary<WonderLibrary, int> wonderCounts)
{
if (!GameRecordManager.IsMigrationMapUsable(map)) return false;
if (map.MatchSettlement == null || !map.MatchSettlement.IsFinished) return false;
var matchSettlement = MatchSettlementInfo.NormalizeType(map.MapConfig.MatchSettlement);
if (matchSettlement == MatchSettlementType.Tutor) return false;
var player = GameRecordManager.TryGetMigrationPlayer(map);
if (player == null) return true;
if (!map.IsPlayerOrTeammateWin(player.Id)) return true;
CollectPlayerHeroProgress(player, heroCounts);
CollectPlayerWonderProgress(player, wonderCounts);
return true;
}
private void CollectPlayerHeroProgress(PlayerData player, Dictionary<GiantType, int> heroCounts)
{
var heroList = player.PlayerHeroData?.HeroList;
if (heroList == null) return;
var seenHeroes = new HashSet<GiantType>();
foreach (var heroType in heroList)
{
var giantType = heroType.GiantType;
if (giantType == GiantType.None || !seenHeroes.Add(giantType)) continue;
heroCounts[giantType] = heroCounts.GetValueOrDefault(giantType) + 1;
}
}
private void CollectPlayerWonderProgress(PlayerData player, Dictionary<WonderLibrary, int> wonderCounts)
{
var wonderInfoDict = player.Wonder?.WonderInfoDict;
if (wonderInfoDict == null) return;
var empire = new Empire(player.CivEnum, player.ForceEnum);
foreach (var kv in wonderInfoDict)
{
if (kv.Value != WonderState.FINISH_BUILD) continue;
if (!Table.Instance.LibraryDataAssets.GetLibraryInfoByWonder(empire, kv.Key, out var info)) continue;
wonderCounts[info.WonderLibraryID] = wonderCounts.GetValueOrDefault(info.WonderLibraryID) + 1;
}
}
private int ApplyLibraryAchievementCounts(
Dictionary<GiantType, int> heroCounts,
Dictionary<WonderLibrary, int> wonderCounts,
out int progressChangedCount)
{
progressChangedCount = 0;
var finishedChangedCount = 0;
foreach (var item in Achievement.AchievementList)
{
if (item?.Conditions == null || item.Conditions.Count != 1) continue;
if (item.BigID == 2 && item.Conditions[0] is TrainGiantCondition heroCondition)
{
var count = heroCounts.GetValueOrDefault(heroCondition.TargetGiant);
if (count <= heroCondition.TrainCount) continue;
heroCondition.TrainCount = count;
progressChangedCount++;
finishedChangedCount += TryFinishLibraryAchievement(item);
continue;
}
if (item.BigID == 3 && item.Conditions[0] is BuildWonderConditionCondition wonderCondition)
{
var count = wonderCounts.GetValueOrDefault(wonderCondition.Wonder);
if (count <= wonderCondition.BuildCount) continue;
wonderCondition.BuildCount = count;
progressChangedCount++;
finishedChangedCount += TryFinishLibraryAchievement(item);
}
}
return finishedChangedCount;
}
private int TryFinishLibraryAchievement(AchievementItem item)
{
if (item.IsFinished) return 0;
item.CheckConditions(null);
return item.IsFinished ? 1 : 0;
}
private void WriteLibraryAchievementRebuildMarker(
string configRoot,
int scannedCount,
int skippedCount,
int progressChangedCount,
int finishedChangedCount)
{
try
{
var text =
$"completedUtc={DateTime.UtcNow:O}\n" +
$"scanned={scannedCount}\n" +
$"skipped={skippedCount}\n" +
$"progressChanged={progressChangedCount}\n" +
$"finishedChanged={finishedChangedCount}\n";
File.WriteAllText(GetLibraryAchievementRebuildMarkerPath(configRoot), text);
}
catch (Exception ex)
{
LogSystem.LogWarning($"[Achievement] 写入图鉴星星历史回补标记失败: {ex.Message}");
}
}
private string GetLibraryAchievementRebuildMarkerPath(string configRoot)
{
return Path.Combine(configRoot, LibraryAchievementRebuildMarkerFileName);
}
public void BindMapData(MapData mapData)
{
foreach (var item in Achievement.AchievementList) item.BindMapData(mapData);
@ -260,4 +430,4 @@ namespace RuntimeData
}
}
}
}

View File

@ -21,8 +21,8 @@ public class WikiDataEditor : Editor
// ── 状态 ─────────────────────────────────────────────────────────────────
private string _searchText = "";
private Vector2 _scrollPos;
private bool _typeInfoFoldout = true;
private bool _descTypeInfoFoldout = true;
private bool _typeInfoFoldout = false;
private bool _descTypeInfoFoldout = false;
// 以 ItemId 为 key避免增删后 index 偏移导致折叠状态错乱
private readonly Dictionary<uint, bool> _foldouts = new Dictionary<uint, bool>();
@ -375,7 +375,7 @@ public class WikiDataEditor : Editor
private bool DrawItem(WikiItem item, int listIndex)
{
if (!_foldouts.ContainsKey(item.Id))
_foldouts[item.Id] = true;
_foldouts[item.Id] = false;
bool doDelete = false;

View File

@ -9,6 +9,8 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Globalization;
using System.Linq;
using Logic.AI;
using Logic.CrashSight;
using MemoryPack;
@ -23,6 +25,9 @@ namespace RuntimeData
{
public class GameRecordManager
{
private const string EndedArchiveMigrationMarkerFileName = "game_record_ended_archive_migration_v2.marker";
private const string DuplicateRecordCleanupMarkerFileName = "game_record_strict_duplicate_cleanup_v2.marker";
public static GameRecordManager Instance = new GameRecordManager();
private GameRecordData _gameRecord;
@ -235,10 +240,10 @@ namespace RuntimeData
}
// 统一保存 GameRecordData避免 Add/Remove/Upsert 到处重复序列化逻辑。
private void SaveGameRecordData()
private bool SaveGameRecordData()
{
byte[] bytes = TH1Serialization.Serialize(_gameRecord);
FileTools.SafeWriteFile(Application.persistentDataPath + "/../Config/game_record.dat", bytes);
return FileTools.SafeWriteFile(Application.persistentDataPath + "/../Config/game_record.dat", bytes);
}
public void RefreshGameRecord()
@ -278,6 +283,597 @@ namespace RuntimeData
_gameRecord ??= new GameRecordData();
_gameRecord.Records ??= new List<GameRecord>();
var duplicateCleanupChecked = ShouldRunDuplicateRecordCleanup(path, out var duplicateCleanupConfigRoot);
var duplicateCleanupChanged = false;
var duplicateRemovedCount = 0;
if (duplicateCleanupChecked)
duplicateCleanupChanged = RemoveDuplicateEndedRecords(out duplicateRemovedCount);
var migrated = TryMigrateMissingEndedRecords(path, out var migrationConfigRoot, out var importedCount, out var skippedCount);
if (duplicateCleanupChecked && migrated && RemoveDuplicateEndedRecords(out var postMigrationRemovedCount))
{
duplicateCleanupChanged = true;
duplicateRemovedCount += postMigrationRemovedCount;
}
var dataChanged = duplicateCleanupChanged || migrated;
var saved = !dataChanged || SaveGameRecordData();
if (duplicateCleanupChecked && saved)
WriteDuplicateRecordCleanupMarker(duplicateCleanupConfigRoot, duplicateRemovedCount);
if (migrated)
{
if (saved) WriteEndedArchiveMigrationMarker(migrationConfigRoot, importedCount, skippedCount);
}
else if (!string.IsNullOrEmpty(migrationConfigRoot) && skippedCount == 0 && saved)
{
WriteEndedArchiveMigrationMarker(migrationConfigRoot, importedCount, skippedCount);
}
}
private bool ShouldRunDuplicateRecordCleanup(string recordPath, out string configRoot)
{
configRoot = Path.GetDirectoryName(recordPath);
if (string.IsNullOrEmpty(configRoot) || !Directory.Exists(configRoot)) return false;
return !File.Exists(GetDuplicateRecordCleanupMarkerPath(configRoot));
}
private bool RemoveDuplicateEndedRecords(out int removedCount)
{
removedCount = 0;
var records = _gameRecord?.Records;
if (records == null || records.Count <= 1) return false;
var keyToBestIndex = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
var removeIndexes = new HashSet<int>();
for (var i = 0; i < records.Count; i++)
{
var record = records[i];
if (record == null || record.RecordKind != GameRecordKind.Ended) continue;
var duplicateIndex = FindDuplicateRecordIndex(record, keyToBestIndex, records, removeIndexes);
if (duplicateIndex < 0)
{
AddDuplicateRecordKeys(record, i, keyToBestIndex);
continue;
}
var duplicateRecord = records[duplicateIndex];
if (IsBetterDuplicateRecord(record, duplicateRecord))
{
MergeDuplicateRecordArchiveIndex(record, duplicateRecord);
removeIndexes.Add(duplicateIndex);
AddDuplicateRecordKeys(record, i, keyToBestIndex);
}
else
{
MergeDuplicateRecordArchiveIndex(duplicateRecord, record);
removeIndexes.Add(i);
}
}
if (removeIndexes.Count == 0) return false;
foreach (var index in removeIndexes.OrderByDescending(index => index))
{
records.RemoveAt(index);
removedCount++;
}
LogSystem.LogInfo($"[GameRecord] 清理重复历史记录 removed={removedCount}, total={records.Count}");
return removedCount > 0;
}
private int FindDuplicateRecordIndex(
GameRecord record,
Dictionary<string, int> keyToBestIndex,
List<GameRecord> records,
HashSet<int> removeIndexes)
{
foreach (var key in GetDuplicateRecordKeys(record))
{
if (!keyToBestIndex.TryGetValue(key, out var existingIndex)) continue;
if (existingIndex < 0 || existingIndex >= records.Count) continue;
if (removeIndexes.Contains(existingIndex)) continue;
var existingRecord = records[existingIndex];
if (!GetDuplicateRecordKeys(existingRecord).Contains(key, StringComparer.OrdinalIgnoreCase)) continue;
if (ShouldTreatAsDuplicateByKey(key, record, existingRecord))
return existingIndex;
}
return -1;
}
private void AddDuplicateRecordKeys(
GameRecord record,
int index,
Dictionary<string, int> keyToBestIndex)
{
foreach (var key in GetDuplicateRecordKeys(record))
keyToBestIndex[key] = index;
}
private bool ShouldTreatAsDuplicateByKey(string key, GameRecord left, GameRecord right)
{
if (left == null || right == null) return false;
if (!IsMigratedRecord(left) && !IsMigratedRecord(right)) return false;
if (BothHaveDifferentNonZeroMapId(left, right)) return false;
if (key.StartsWith("ended-map-exact:", StringComparison.OrdinalIgnoreCase)) return true;
if (!key.StartsWith("ended-visible-exact:", StringComparison.OrdinalIgnoreCase)) return false;
return true;
}
private bool IsBetterDuplicateRecord(GameRecord candidate, GameRecord current)
{
if (IsMigratedRecord(candidate) != IsMigratedRecord(current))
return !IsMigratedRecord(candidate);
var candidateQuality = GetDuplicateRecordQuality(candidate);
var currentQuality = GetDuplicateRecordQuality(current);
return candidateQuality > currentQuality;
}
private int GetDuplicateRecordQuality(GameRecord record)
{
if (record == null) return 0;
var quality = 0;
if (HasUsableArchiveIndex(record)) quality += 100;
if (!IsMigratedRecord(record)) quality += 20;
if (!string.IsNullOrEmpty(record.GameVersion)) quality += 5;
if (record.GameVersionId != 0) quality += 5;
if (!string.IsNullOrEmpty(record.EndArchiveId)) quality += 4;
if (!string.IsNullOrEmpty(record.BeginArchiveId)) quality += 3;
if (!string.IsNullOrEmpty(record.RecordId)) quality += 1;
return quality;
}
private bool HasUsableArchiveIndex(GameRecord record)
{
return record != null
&& !record.DiscardArchiveIndex
&& (!string.IsNullOrEmpty(record.BeginArchiveId)
|| !string.IsNullOrEmpty(record.EndArchiveId));
}
private bool MergeDuplicateRecordArchiveIndex(GameRecord keep, GameRecord remove)
{
if (keep == null || remove == null) return false;
var changed = false;
if (string.IsNullOrEmpty(keep.BeginArchiveId) && !string.IsNullOrEmpty(remove.BeginArchiveId))
{
keep.BeginArchiveId = remove.BeginArchiveId;
changed = true;
}
if (string.IsNullOrEmpty(keep.EndArchiveId) && !string.IsNullOrEmpty(remove.EndArchiveId))
{
keep.EndArchiveId = remove.EndArchiveId;
changed = true;
}
if (keep.DiscardArchiveIndex && HasUsableArchiveIndex(remove))
{
keep.DiscardArchiveIndex = false;
changed = true;
}
return changed;
}
private bool BothHaveDifferentNonZeroMapId(GameRecord left, GameRecord right)
{
return left?.MapID != 0
&& right?.MapID != 0
&& left.MapID != right.MapID;
}
private bool TryMigrateMissingEndedRecords(
string recordPath,
out string configRoot,
out int importedCount,
out int skippedCount)
{
configRoot = Path.GetDirectoryName(recordPath);
importedCount = 0;
skippedCount = 0;
if (string.IsNullOrEmpty(configRoot) || !Directory.Exists(configRoot)) return false;
if (HasCompletedEndedArchiveMigration(configRoot))
{
configRoot = null;
return false;
}
var changed = false;
var existingKeys = BuildExistingRecordKeySet();
foreach (var path in EnumerateEndedArchiveFiles(configRoot))
{
var archiveKey = GetArchiveMigrationKeyFromPath(path, configRoot);
if (!string.IsNullOrEmpty(archiveKey) && existingKeys.Contains(archiveKey)) continue;
if (!TryCreateMigratedEndedRecord(path, configRoot, out var record))
{
skippedCount++;
continue;
}
if (TryFindSafeDuplicateRecord(record, _gameRecord.Records, existingKeys, out var existingRecord))
{
if (MergeDuplicateRecordArchiveIndex(existingRecord, record)) changed = true;
AddRecordMigrationKeys(existingRecord, existingKeys);
continue;
}
_gameRecord.Records.Add(record);
AddRecordMigrationKeys(record, existingKeys);
importedCount++;
changed = true;
}
if (importedCount > 0 || skippedCount > 0)
{
LogSystem.LogInfo(
$"[GameRecord] 结束记录迁移完成 imported={importedCount}, skipped={skippedCount}, total={_gameRecord.Records.Count}");
}
return changed;
}
private bool HasCompletedEndedArchiveMigration(string configRoot)
{
return File.Exists(GetEndedArchiveMigrationMarkerPath(configRoot));
}
private void WriteEndedArchiveMigrationMarker(string configRoot, int importedCount, int skippedCount)
{
try
{
var text =
$"completedUtc={DateTime.UtcNow:O}\n" +
$"imported={importedCount}\n" +
$"skipped={skippedCount}\n" +
$"total={_gameRecord?.Records?.Count ?? 0}\n";
File.WriteAllText(GetEndedArchiveMigrationMarkerPath(configRoot), text);
}
catch (Exception ex)
{
LogSystem.LogWarning($"[GameRecord] 写入结束记录迁移标记失败: {ex.Message}");
}
}
private string GetEndedArchiveMigrationMarkerPath(string configRoot)
{
return Path.Combine(configRoot, EndedArchiveMigrationMarkerFileName);
}
private void WriteDuplicateRecordCleanupMarker(string configRoot, int removedCount)
{
if (string.IsNullOrEmpty(configRoot)) return;
try
{
var text =
$"completedUtc={DateTime.UtcNow:O}\n" +
$"removed={removedCount}\n" +
$"total={_gameRecord?.Records?.Count ?? 0}\n";
File.WriteAllText(GetDuplicateRecordCleanupMarkerPath(configRoot), text);
}
catch (Exception ex)
{
LogSystem.LogWarning($"[GameRecord] 写入重复历史记录清理标记失败: {ex.Message}");
}
}
private string GetDuplicateRecordCleanupMarkerPath(string configRoot)
{
return Path.Combine(configRoot, DuplicateRecordCleanupMarkerFileName);
}
private HashSet<string> BuildExistingRecordKeySet()
{
var keys = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
foreach (var record in _gameRecord.Records)
{
if (record == null) continue;
AddRecordMigrationKeys(record, keys);
}
return keys;
}
internal static IEnumerable<string> EnumerateEndedArchiveFiles(string configRoot)
{
var newEndDirectory = Path.Combine(configRoot, "GameArchives", "end");
foreach (var path in EnumerateArchiveFiles(newEndDirectory, "*.dat"))
yield return path;
foreach (var path in EnumerateArchiveFiles(configRoot, "map_archive_end*.dat"))
yield return path;
}
private static IEnumerable<string> EnumerateArchiveFiles(string directory, string pattern)
{
if (!Directory.Exists(directory)) yield break;
IEnumerable<string> files;
try
{
files = Directory.EnumerateFiles(directory, pattern, SearchOption.TopDirectoryOnly)
.Where(path => !path.EndsWith(".bak", StringComparison.OrdinalIgnoreCase)
&& !path.EndsWith(".tmp", StringComparison.OrdinalIgnoreCase))
.OrderBy(File.GetLastWriteTimeUtc)
.ToList();
}
catch (Exception ex)
{
LogSystem.LogError($"[GameRecord] 枚举结束存档失败: {directory} | {ex.Message}");
yield break;
}
foreach (var path in files)
yield return path;
}
private bool TryCreateMigratedEndedRecord(
string archivePath,
string configRoot,
out GameRecord record)
{
record = null;
var map = ReadMigrationArchive(archivePath);
if (!TryBuildMigratedEndedRecord(map, archivePath, out record)) return false;
var endArchiveId = TryGetNewEndArchiveId(archivePath, configRoot);
if (!string.IsNullOrEmpty(endArchiveId))
{
record.RecordId = $"migrated-end-{endArchiveId}";
record.EndArchiveId = endArchiveId;
record.BeginArchiveId = string.Empty;
}
else
{
var legacyId = Path.GetFileNameWithoutExtension(archivePath);
record.RecordId = $"migrated-legacy-{legacyId}";
record.BeginArchiveId = string.Empty;
record.EndArchiveId = string.Empty;
record.DiscardArchiveIndex = true;
}
return true;
}
private bool TryBuildMigratedEndedRecord(MapData map, string archivePath, out GameRecord record)
{
record = null;
if (!IsMigrationMapUsable(map)) return false;
var matchSettlement = MatchSettlementInfo.NormalizeType(map.MapConfig.MatchSettlement);
if (matchSettlement == MatchSettlementType.Tutor) return false;
var player = TryGetMigrationPlayer(map);
if (player == null) return false;
var playerCount = map.MapConfig.PlayerCount;
if (playerCount == 0) playerCount = (uint)(map.PlayerMap?.PlayerDataList?.Count ?? 0);
record = new GameRecord
{
Mode = map.MapConfig.GameMode,
AIDiff = map.MapConfig.AIDiff,
Turn = player.Turn,
PlayerCivId = player.PlayerCivId,
PlayerForceId = player.PlayerForceId,
Score = player.PlayerScore,
Time = File.GetLastWriteTime(archivePath).ToString("yyyy.MM.dd HH:mm"),
CityCount = TryGetMigrationCityCount(map, player.Id),
MapWidth = map.MapConfig.Width,
MapHeight = map.MapConfig.Height,
PlayerCount = playerCount,
MatchSettlement = matchSettlement,
MapID = map.MapID,
NetMode = TryGetMigrationNetMode(map, archivePath),
GameVersion = string.Empty,
GameVersionId = 0,
RecordKind = GameRecordKind.Ended,
RecordName = string.Empty,
BeginArchiveId = string.Empty,
ContinueArchiveId = string.Empty,
EndArchiveId = string.Empty,
HasHostControlledPlayer = TryGetMigrationHasHostControlledPlayer(map),
DiscardArchiveIndex = false,
};
return true;
}
internal static MapData ReadMigrationArchive(string archivePath)
{
try
{
if (!File.Exists(archivePath)) return null;
var bytes = File.ReadAllBytes(archivePath);
return MapData.DeserializeArchiveBytes(bytes);
}
catch (Exception ex)
{
LogSystem.LogError($"[GameRecord] 读取结束存档迁移失败: {archivePath} | {ex.Message}");
return null;
}
}
internal static bool IsMigrationMapUsable(MapData map)
{
return map != null
&& map.MapConfig != null
&& map.PlayerMap?.PlayerDataList != null
&& map.PlayerMap.PlayerDataList.Exists(player => player != null);
}
internal static PlayerData TryGetMigrationPlayer(MapData map)
{
var playerMap = map?.PlayerMap;
if (playerMap?.PlayerDataList == null) return null;
try
{
if (playerMap.SelfPlayerId != 0 &&
playerMap.GetPlayerDataByPlayerID(playerMap.SelfPlayerId, out var selfPlayer) &&
selfPlayer != null)
return selfPlayer;
}
catch
{
// Legacy saves can miss ignored runtime lookup fields.
}
return playerMap.PlayerDataList.FirstOrDefault(player => player != null);
}
private uint TryGetMigrationCityCount(MapData map, uint playerId)
{
try
{
return (uint)Math.Max(0, map.GetCityCount(playerId));
}
catch
{
return 0;
}
}
private NetMode TryGetMigrationNetMode(MapData map, string archivePath)
{
if (map?.Net?.Mode == NetMode.Single || map?.Net?.Mode == NetMode.Multi)
return map.Net.Mode;
var fileName = Path.GetFileName(archivePath);
return fileName.IndexOf("_multi_", StringComparison.OrdinalIgnoreCase) >= 0
? NetMode.Multi
: NetMode.Single;
}
private bool TryGetMigrationHasHostControlledPlayer(MapData map)
{
try
{
return map?.MapConfig?.HasHostControlledPlayer() == true;
}
catch
{
return false;
}
}
private static string TryGetNewEndArchiveId(string archivePath, string configRoot)
{
var newEndDirectory = Path.GetFullPath(Path.Combine(configRoot, "GameArchives", "end"));
var fullPath = Path.GetFullPath(archivePath);
if (!fullPath.StartsWith(newEndDirectory + Path.DirectorySeparatorChar, StringComparison.OrdinalIgnoreCase))
return string.Empty;
return Path.GetFileNameWithoutExtension(fullPath);
}
private static string GetArchiveMigrationKeyFromPath(string archivePath, string configRoot)
{
var newEndArchiveId = TryGetNewEndArchiveId(archivePath, configRoot);
if (!string.IsNullOrEmpty(newEndArchiveId)) return $"end:{newEndArchiveId}";
var legacyId = Path.GetFileNameWithoutExtension(archivePath);
return string.IsNullOrEmpty(legacyId) ? string.Empty : $"record:migrated-legacy-{legacyId}";
}
private bool TryFindSafeDuplicateRecord(
GameRecord record,
List<GameRecord> existingRecords,
HashSet<string> existingKeys,
out GameRecord duplicateRecord)
{
duplicateRecord = null;
if (record == null || existingRecords == null || existingRecords.Count == 0) return false;
if (!string.IsNullOrEmpty(record.EndArchiveId) && existingKeys.Contains($"end:{record.EndArchiveId}"))
{
duplicateRecord = existingRecords.FirstOrDefault(existing =>
existing != null && existing.EndArchiveId == record.EndArchiveId);
return duplicateRecord != null;
}
if (!string.IsNullOrEmpty(record.RecordId) && existingKeys.Contains($"record:{record.RecordId}"))
{
duplicateRecord = existingRecords.FirstOrDefault(existing =>
existing != null && existing.RecordId == record.RecordId);
return duplicateRecord != null;
}
foreach (var existing in existingRecords)
{
if (existing == null || existing.RecordKind != GameRecordKind.Ended) continue;
foreach (var key in GetDuplicateRecordKeys(record))
{
if (!existingKeys.Contains(key)) continue;
if (!GetDuplicateRecordKeys(existing).Contains(key, StringComparer.OrdinalIgnoreCase)) continue;
if (!ShouldTreatAsDuplicateByKey(key, record, existing)) continue;
duplicateRecord = existing;
return true;
}
}
return false;
}
private void AddRecordMigrationKeys(GameRecord record, HashSet<string> keys)
{
if (!string.IsNullOrEmpty(record.EndArchiveId)) keys.Add($"end:{record.EndArchiveId}");
if (!string.IsNullOrEmpty(record.RecordId)) keys.Add($"record:{record.RecordId}");
foreach (var key in GetDuplicateRecordKeys(record))
keys.Add(key);
}
private IEnumerable<string> GetDuplicateRecordKeys(GameRecord record)
{
if (record == null) yield break;
if (record.MapID != 0)
{
yield return string.Join("|",
"ended-map-exact",
record.MapID.ToString(CultureInfo.InvariantCulture),
GetStrictDuplicateVisibleKey(record));
}
yield return string.Join("|", "ended-visible-exact", GetStrictDuplicateVisibleKey(record));
}
private string GetStrictDuplicateVisibleKey(GameRecord record)
{
return string.Join("|",
record.Mode.ToString(),
record.AIDiff.ToString(),
record.NetMode.ToString(),
record.PlayerCivId.ToString(CultureInfo.InvariantCulture),
record.PlayerForceId.ToString(CultureInfo.InvariantCulture),
record.Time ?? string.Empty,
record.PlayerCount.ToString(CultureInfo.InvariantCulture),
record.Turn.ToString(CultureInfo.InvariantCulture),
record.Score.ToString("R", CultureInfo.InvariantCulture));
}
private bool IsMigratedRecord(GameRecord record)
{
return record != null
&& !string.IsNullOrEmpty(record.RecordId)
&& record.RecordId.StartsWith("migrated-", StringComparison.OrdinalIgnoreCase);
}
}

View File

@ -59,7 +59,7 @@ namespace Logic
private float[,] _heightMap;
private const int SmoothIterations = 3; //平滑次数
private const float NearbyEnemyCapitalRateForRealPlayer = 0.15f;
private const float NearbyEnemyCapitalRateForRealPlayer = 0.8f;
private const int NearbyEnemyCapitalDistance = 3;
private const int SeaStartStarfishRadius = 2;
private const int SeaStartStarfishMinCount = 4;
@ -999,7 +999,7 @@ namespace Logic
}
}
FillRemainingPlayerCivOrigins(origins, available);
FillRemainingPlayerCivOrigins(mapData, origins, available);
return origins;
}
@ -1095,17 +1095,47 @@ namespace Logic
return false;
}
private void FillRemainingPlayerCivOrigins(List<MapPosition> origins, List<MapPosition> available)
private void FillRemainingPlayerCivOrigins(MapData mapData, List<MapPosition> origins, List<MapPosition> available)
{
for (int i = 0; i < origins.Count; i++)
{
if (origins[i] != null) continue;
if (available.Count == 0) break;
var origin = SelectBestOriginCandidate(available, origins);
var candidates = GetOriginCandidates(mapData, origins, available, i);
var origin = SelectBestOriginCandidate(candidates, origins);
AssignPlayerCivOrigin(origins, available, i, origin);
}
}
private List<MapPosition> GetOriginCandidates(
MapData mapData,
List<MapPosition> origins,
List<MapPosition> available,
int playerIndex)
{
if (!ShouldSkipNearbyEnemyCapital(mapData)) return available;
var candidates = new List<MapPosition>();
foreach (var candidate in available)
{
var tooClose = false;
for (int i = 0; i < origins.Count; i++)
{
if (origins[i] == null) continue;
if (!IsEnemyPlayerIndex(mapData, playerIndex, i)) continue;
if (ChebyshevDistance(candidate, origins[i]) <= NearbyEnemyCapitalDistance)
{
tooClose = true;
break;
}
}
if (!tooClose) candidates.Add(candidate);
}
return candidates.Count > 0 ? candidates : available;
}
private void AssignPlayerCivOrigin(
List<MapPosition> origins,
List<MapPosition> available,

View File

@ -40,10 +40,7 @@ namespace Logic.Skill
}
else
{
for (int i = 0; i < FearLevel; i++)
{
info.DamageTarget.AddOrOverrideSkill(SkillType.KomeijiFear, mapData, info.DamageOrigin.Id);
}
AddFearLevelsWithoutExplosion(mapData, info.DamageOrigin, info.DamageTarget);
}
if (mapData != Main.MapData) return;
@ -109,5 +106,39 @@ namespace Logic.Skill
}
target.Renderer(mapData)?.SyncStatusWithUnitSkills();
}
private static void AddFearLevelsWithoutExplosion(MapData mapData, UnitData origin, UnitData target)
{
bool isNewSkill = false;
if (!target.GetSkill(SkillType.KomeijiFear, out var skill))
{
skill = SkillFactory.GetSkillBySkillType(SkillType.KomeijiFear);
if (skill == null) return;
target.Skills.Add(skill);
isNewSkill = true;
if (skill.HasLevel && skill.AutoDisappear)
{
skill.SetLevel(0);
}
}
if (!skill.HasLevel) return;
skill.SetLevel(skill.Level + FearLevel);
if (skill.Level < FearLevel)
{
skill.SetLevel(FearLevel);
}
if (mapData.GetPlayerDataByUnitId(origin.Id, out _) && origin.HeroTask(mapData) != null)
{
origin.HeroTask(mapData).OnAddSkillLevels(mapData, SkillType.KomeijiFear, FearLevel);
}
if (isNewSkill)
{
skill.OnSkillAdd(mapData, origin.Id);
}
target.Renderer(mapData)?.SyncStatusWithUnitSkills();
}
}
}

View File

@ -32,6 +32,7 @@ namespace Logic.Skill
{
if (info.DamageTarget == null || info.DamageOrigin == null) return;
if (info.DamageType != DamageType.ActiveAttack && info.DamageType != DamageType.CounterAttack) return;
if (info.DamageOrigin.GetSkill(SkillType.FearMakerPro, out _)) return;
// 如果对方拥有KomeijiFearImmune则免疫恐惧
if (info.DamageTarget.GetSkill(SkillType.KomeijiFearImmune, out _)) return;

View File

@ -335,6 +335,7 @@ namespace Logic.Skill
var dmg = sameUnion ? _bigUnluckyFriendDmg : _bigUnluckyEnemyDmg;
var canBeKilled = unit.CanBeKilled(mapData);
var visualCollector = ActionVisualEventCollector.Current;
var targetRenderer = mapData == Main.MapData ? unit.Renderer(mapData) : null;
var dmgInfo = visualCollector != null && mapData == Main.MapData
? visualCollector.SettleDamageWithVisual(
originUnit,
@ -348,22 +349,32 @@ namespace Logic.Skill
if (dmgInfo?.DamageTargetGrid == null) continue;
if (visualCollector != null && mapData == Main.MapData) continue;
//处理视觉
if (dmgInfo.DamageTargetGrid.InMainSight())
if (mapData == Main.MapData)
{
RegisterOrRunTimer(() =>
{
if (!TryGetLiveGrid(map, tmpGridId, out var tmpGrid)) return;
tmpGrid.Renderer(map)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Hurt));
tmpGrid.Renderer(map)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Damage,dmg));
var gridRenderer = tmpGrid.Renderer(map);
if (tmpGrid.InMainSight())
{
gridRenderer?.PlayVFXInSight(new GridVFXParams(GridVFXType.Hurt));
gridRenderer?.PlayVFXInSight(new GridVFXParams(GridVFXType.Damage,dmg));
}
if (dmgInfo.IsKill)
{
tmpGrid.Renderer(map)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
if (canBeKilled)
tmpGrid.Renderer(map)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Die));
if (tmpGrid.InMainSight())
{
gridRenderer?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
if (canBeKilled)
gridRenderer?.PlayVFXInSight(new GridVFXParams(GridVFXType.Die));
}
targetRenderer?.Die();
gridRenderer?.InstantUpdateGrid();
MapRenderer.Instance?.UpdateAroundHighlight(map, tmpGrid);
return;
}
if (TryGetLiveUnit(map, tmpUnitId, out var liveUnit))
liveUnit.Renderer(map)?.InstantUpdateUnit(showoff: true);
(targetRenderer ?? liveUnit.Renderer(map))?.InstantUpdateUnit(showoff: true);
},(projInfo?.AnimTime ?? 0f )+ waitTime,"SANAEDIVINE OMIKUJI BigUnlucky Anim");
}
@ -400,6 +411,7 @@ namespace Logic.Skill
{
var canBeKilled = unit.CanBeKilled(mapData);
var visualCollector = ActionVisualEventCollector.Current;
var targetRenderer = mapData == Main.MapData ? unit.Renderer(mapData) : null;
var dmgInfo = visualCollector != null && mapData == Main.MapData
? visualCollector.SettleDamageWithVisual(
originUnit,
@ -413,23 +425,33 @@ namespace Logic.Skill
if (dmgInfo?.DamageTargetGrid == null) continue;
if (visualCollector != null && mapData == Main.MapData) continue;
//处理视觉
if (dmgInfo.DamageTargetGrid.InMainSight())
if (mapData == Main.MapData)
{
RegisterOrRunTimer(() =>
{
if (!TryGetLiveGrid(map, tmpGridId, out var tmpGrid)) return;
tmpGrid.Renderer(map)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Hurt));
tmpGrid.Renderer(map)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Damage,4));
var gridRenderer = tmpGrid.Renderer(map);
if (tmpGrid.InMainSight())
{
gridRenderer?.PlayVFXInSight(new GridVFXParams(GridVFXType.Hurt));
gridRenderer?.PlayVFXInSight(new GridVFXParams(GridVFXType.Damage,4));
}
if (dmgInfo.IsKill)
{
tmpGrid.Renderer(map)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
if (canBeKilled)
tmpGrid.Renderer(map)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Die));
if (tmpGrid.InMainSight())
{
gridRenderer?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
if (canBeKilled)
gridRenderer?.PlayVFXInSight(new GridVFXParams(GridVFXType.Die));
}
targetRenderer?.Die();
gridRenderer?.InstantUpdateGrid();
MapRenderer.Instance?.UpdateAroundHighlight(map, tmpGrid);
return;
}
if (TryGetLiveUnit(map, tmpUnitId, out var liveUnit))
liveUnit.Renderer(map)?.InstantUpdateUnit(showoff: true);
(targetRenderer ?? liveUnit.Renderer(map))?.InstantUpdateUnit(showoff: true);
},(projInfo?.AnimTime ?? 0f) + waitTime,"SANAEDIVINE OMIKUJI BigUnlucky Anim");
}

View File

@ -35,7 +35,7 @@ namespace Logic.Skill
public override void OnDamageOther(MapData mapData, SettlementInfo info)
{
if (info.DamageTarget == null || info.DamageOrigin == null) return;
if (info.DamageType != DamageType.ActiveAttack && info.DamageType != DamageType.CounterAttack) return;
if (info.DamageType != DamageType.ActiveAttack) return;
info.DamageTarget.AddOrOverrideSkill(SkillType.KomeijiFear, mapData, info.DamageOrigin.Id);

View File

@ -34,7 +34,8 @@ namespace Logic.Skill
public override void OnDamageOther(MapData mapData, SettlementInfo info)
{
if (info.DamageType != DamageType.ActiveAttack || info.DamageOrigin == null || info.DamageTarget == null) return;
if (info.DamageOrigin == null || info.DamageTarget == null) return;
if (info.DamageType != DamageType.ActiveAttack && info.DamageType != DamageType.CounterAttack) return;
// 给被攻击的目标添加 SkillBan
info.DamageTarget.AddOrOverrideSkill(SkillType.SkillBan, mapData, info.DamageOrigin.Id);
@ -43,7 +44,9 @@ namespace Logic.Skill
if (mapData != Main.MapData) return;
if (!info.DamageTarget.IsAlive()) return;
int phase = AnimPhase.AttackImpact + 50;
int phase = info.DamageType == DamageType.ActiveAttack
? AnimPhase.AttackImpact + 50
: AnimPhase.CounterImpact + 50;
var scope = PresentationManager.CurrentScope;
if (scope != null)

View File

@ -6,12 +6,8 @@
*/
using RuntimeData;
using System;
using System.Collections.Generic;
using System.Linq;
using MemoryPack;
using TH1_Logic.Core;
using UnityEngine;
namespace Logic.Skill
{
@ -33,31 +29,20 @@ namespace Logic.Skill
{
if (info.DamageType != DamageType.DelayAttack && info.DamageType != DamageType.Splash) return;
if (!info.IsKill || info.IsDeathReplaced || info.DamageTarget == null || info.DamageTargetGrid == null) return;
if (!info.IsKill || info.IsDeathReplaced || info.DamageOrigin == null || info.DamageTarget == null
|| info.DamageTargetGrid == null || info.DamageTargetCity == null) return;
if (info.DamageTarget.TreatedAsHero(mapData, info.DamageTarget)) return;
if (!TryGetBonePileReviveType(info.DamageTarget, out var reviveType)) return;
if (!mapData.GetPlayerDataByUnitId(info.DamageOrigin.Id, out var player)) return;
if (!mapData.GetCapitalCityDataByPlayerId(player.Id, out var capitalCity)) return;
var fullType = new UnitFullType();
fullType.UnitType = UnitType.BonePile;
if (!info.DamageTargetGrid.RealUnit(mapData,out var _) && mapData.CheckLandTypeForGrid(fullType, info.DamageTargetGrid))
var fullType = new UnitFullType { UnitType = UnitType.BonePile };
if (!info.DamageTargetGrid.RealUnit(mapData, out _)
&& mapData.CheckLandTypeForGrid(fullType, info.DamageTargetGrid)
&& mapData.CheckLandTypeForGrid(reviveType, info.DamageTargetGrid))
{
if (!mapData.AddUnitData(info.DamageTargetGrid.Id, capitalCity.Id, fullType, out var bone)) return;
if(bone.GetSkill(SkillType.BonePile, out var skill) && skill is BonePileSkill)
{
var bonePile = skill as BonePileSkill;
bonePile.TargetType = info.DamageTarget.UnitFullType;
bonePile.TargetCityId = info.DamageTargetCity.Id;
bone.Health = UnitData.CeilPositiveToInt(bone.GetMaxHealth() * 0.25f);
}
var boneGrid = bone.Grid(mapData);
if (boneGrid != null)
{
var sightRadius = boneGrid.Feature == TerrainFeature.Mountain ? 2 : 1;
Main.PlayerLogic.UpdateSightByRadius_LogicView(mapData, player, boneGrid, sightRadius);
}
bone.Renderer(mapData)?.InstantUpdateUnit(true);
CreateBonePile(mapData, player, capitalCity, info.DamageTargetCity, info.DamageTargetGrid, fullType, reviveType);
}
else
{
@ -67,30 +52,49 @@ namespace Logic.Skill
foreach (var grid in aroundBuf)
{
if (grid == info.DamageTargetGrid) continue;
if (grid.RealUnit(mapData,out var _)) continue;
if(!mapData.CheckLandTypeForGrid(fullType, grid))continue;
if (grid.RealUnit(mapData, out _)) continue;
if (!mapData.CheckLandTypeForGrid(fullType, grid)) continue;
if (!mapData.CheckLandTypeForGrid(reviveType, grid)) continue;
randomList.Add(grid);
}
ReturnAroundBuf();
if (randomList.Count == 0) return;
var index = mapData.Net.GetRandom(mapData).Next(0, randomList.Count - 1); // 生成 index
if (!mapData.AddUnitData(randomList[index].Id, capitalCity.Id, fullType, out var bone)) return;
if(bone.GetSkill(SkillType.BonePile, out var skill) && skill is BonePileSkill)
{
var bonePile = skill as BonePileSkill;
bonePile.TargetType = info.DamageTarget.UnitFullType;
bonePile.TargetCityId = info.DamageTargetCity.Id;
bone.Health = UnitData.CeilPositiveToInt(bone.GetMaxHealth() * 0.25f);
}
var boneGrid = bone.Grid(mapData);
if (boneGrid != null)
{
var sightRadius = boneGrid.Feature == TerrainFeature.Mountain ? 2 : 1;
Main.PlayerLogic.UpdateSightByRadius_LogicView(mapData, player, boneGrid, sightRadius);
}
bone.Renderer(mapData)?.InstantUpdateUnit(true);
var index = mapData.Net.GetRandom(mapData).Next(0, randomList.Count);
CreateBonePile(mapData, player, capitalCity, info.DamageTargetCity, randomList[index], fullType, reviveType);
}
}
private static void CreateBonePile(MapData mapData, PlayerData player, CityData capitalCity, CityData targetCity,
GridData grid, UnitFullType boneFullType, UnitFullType reviveType)
{
if (!mapData.AddUnitData(grid.Id, capitalCity.Id, boneFullType, out var bone)) return;
if (bone.GetSkill(SkillType.BonePile, out var skill) && skill is BonePileSkill bonePile)
{
bonePile.TargetType = reviveType;
bonePile.TargetCityId = targetCity.Id;
bone.Health = UnitData.CeilPositiveToInt(bone.GetMaxHealth() * 0.25f);
}
var boneGrid = bone.Grid(mapData);
if (boneGrid != null)
{
var sightRadius = boneGrid.Feature == TerrainFeature.Mountain ? 2 : 1;
Main.PlayerLogic.UpdateSightByRadius_LogicView(mapData, player, boneGrid, sightRadius);
}
bone.Renderer(mapData)?.InstantUpdateUnit(true);
}
private static bool TryGetBonePileReviveType(UnitData target, out UnitFullType reviveType)
{
reviveType = target.UnitFullType;
var targetLandType = target.GetLandType();
if (targetLandType is not (LandType.WaterAndAshore or LandType.WaterOnly)) return true;
var carryType = target.CarryUnitFullType;
if (carryType.UnitType == UnitType.None) return false;
reviveType = carryType;
return true;
}
}
}

View File

@ -40,7 +40,7 @@ namespace Logic.Skill
{
if (old is UtsuhoDelayActSkill oldDelay && oldDelay.Path != null && oldDelay.Path.Count > 0)
{
Path = oldDelay.Path;
Path = new List<Vector2Int>(oldDelay.Path);
break;
}
}
@ -49,7 +49,7 @@ namespace Logic.Skill
// 外部直接调用即可
public void DelayMove(UnitData self, GridData grid, MapData mapData, MoveType moveType, List<Vector2Int> path = null)
{
Path = path;
Path = BuildDelayMovePath(self, grid, mapData, path);
if(self.UnitLevel < 4)
self.AddOrOverrideSkill(SkillType.UtsuhoReadyMove, mapData, self.Id);
else
@ -57,6 +57,75 @@ namespace Logic.Skill
self.ClearActionPoint();
self.Renderer(mapData)?.InstantUpdateUnit(false);
}
private static List<Vector2Int> BuildDelayMovePath(UnitData self, GridData targetGrid, MapData mapData,
List<Vector2Int> path)
{
var originGrid = self?.Grid(mapData);
if (originGrid == null || targetGrid == null)
return path != null ? new List<Vector2Int>(path) : new List<Vector2Int>();
var origin = originGrid.Pos.V2();
var target = targetGrid.Pos.V2();
var shouldUseDirectFlightPath = self.GetSkill(SkillType.UtsuhoBase, out _)
|| path == null
|| path.Count == 0
|| path[0] != origin
|| path[^1] != target;
return shouldUseDirectFlightPath
? BuildDirectFlightPath(origin, target)
: new List<Vector2Int>(path);
}
private static List<Vector2Int> BuildDirectFlightPath(Vector2Int origin, Vector2Int target)
{
var result = new List<Vector2Int> { origin };
if (origin == target) return result;
int x = origin.x;
int y = origin.y;
int dx = Math.Abs(target.x - origin.x);
int dy = Math.Abs(target.y - origin.y);
int sx = target.x.CompareTo(origin.x);
int sy = target.y.CompareTo(origin.y);
if (dx >= dy)
{
int error = dx / 2;
while (x != target.x)
{
x += sx;
error -= dy;
if (error < 0 && y != target.y)
{
y += sy;
error += dx;
}
result.Add(new Vector2Int(x, y));
}
}
else
{
int error = dy / 2;
while (y != target.y)
{
y += sy;
error -= dx;
if (error < 0 && x != target.x)
{
x += sx;
error += dy;
}
result.Add(new Vector2Int(x, y));
}
}
if (result[^1] != target) result.Add(target);
return result;
}
}
}

View File

@ -1842,15 +1842,16 @@ namespace Logic
if (!unitData.IsAlive())
return;
//在进入下一个回合前,如果可以回血自动回血
if (unitData.Health < unitData.GetMaxHealth() && unitData.GetActionPoint(ActionPointType.Capture) > 0)
//在进入下一个回合前,如果可以回血自动回血;恐惧会抵消本次回血,即使满血也应被清除
var hasKomeijiFear = unitData.GetSkill(SkillType.KomeijiFear, out _);
if ((unitData.Health < unitData.GetMaxHealth() || hasKomeijiFear) && unitData.GetActionPoint(ActionPointType.Capture) > 0)
{
if (mapData.GetGridDataByUnitId(unitData.Id, out var grid)
&& mapData.GetPlayerDataByUnitId(unitData.Id, out var player)
)
{
//如果有KomeijiFear消除恐惧替代本次回血
if (unitData.GetSkill(SkillType.KomeijiFear, out _))
if (hasKomeijiFear)
{
unitData.RemoveSkill(SkillType.KomeijiFear, mapData);
grid.Renderer(mapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Heal));

View File

@ -36,6 +36,7 @@ namespace TH1_Logic.MatchConfig
SmallTypeSkillUnique = 102,
SmallTypeSkillPositive = 103,
SmallTypeSkillNegative = 104,
SmallTypeSkillBase = 105,
SmallTypeTechGroup = 110,
SmallTypeTechAtom= 111,
SmallTypeActionActive = 120,

Some files were not shown because too many files have changed in this diff Show More