Compare commits
No commits in common. "a00ea237eb9260be307ff50a74d408ee1dca3b01" and "221eb42c3b355c930cfa46813dd035fe0929cb92" have entirely different histories.
a00ea237eb
...
221eb42c3b
@ -5,19 +5,11 @@ from odoo.http import request, Response
|
||||
|
||||
|
||||
def _json(data):
|
||||
"""返回 UTF-8 JSON 响应,并附加本地跨域调试头。"""
|
||||
origin = request.httprequest.headers.get('Origin', '')
|
||||
resp = Response(
|
||||
"""返回 UTF-8 JSON 响应。"""
|
||||
return Response(
|
||||
json.dumps(data, ensure_ascii=False),
|
||||
content_type='application/json; charset=utf-8',
|
||||
)
|
||||
# 允许 127.0.0.1:8888 本地前端跨域调试(生产环境走 nginx 同域,无需此头)
|
||||
if origin.startswith('http://127.0.0.1:') or origin.startswith('http://localhost:'):
|
||||
resp.headers['Access-Control-Allow-Origin'] = origin
|
||||
resp.headers['Access-Control-Allow-Credentials'] = 'true'
|
||||
resp.headers['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS'
|
||||
resp.headers['Access-Control-Allow-Headers'] = 'Content-Type'
|
||||
return resp
|
||||
|
||||
|
||||
def _post_body():
|
||||
@ -84,52 +76,6 @@ class GameApiController(http.Controller):
|
||||
})
|
||||
return _json({'groups': groups})
|
||||
|
||||
@http.route('/game/api/currencies', type='http', auth='public', methods=['GET'], csrf=False)
|
||||
def currencies(self, **kw):
|
||||
"""货币等级:按 level 排序返回。"""
|
||||
recs = request.env['game.currency'].sudo().search_read(
|
||||
[], ['id', 'level', 'name', 'desc', 'rate'], order='level asc'
|
||||
)
|
||||
return _json({
|
||||
'items': [{
|
||||
'id': r['id'],
|
||||
'level': r['level'],
|
||||
'name': r['name'],
|
||||
'desc': r['desc'] or '',
|
||||
'rate': r['rate'] or 1,
|
||||
} for r in recs]
|
||||
})
|
||||
|
||||
@http.route('/game/api/pages', type='http', auth='public', methods=['GET'], csrf=False)
|
||||
def pages(self, **kw):
|
||||
"""页面板块:返回所有生效板块及其条目。"""
|
||||
pages = request.env['game.page'].sudo().search_read(
|
||||
[('active', '=', True)],
|
||||
['id', 'key', 'title', 'subtitle', 'body_html'],
|
||||
order='sequence asc'
|
||||
)
|
||||
out = []
|
||||
for p in pages:
|
||||
items = request.env['game.page.item'].sudo().search_read(
|
||||
[('page_id', '=', p['id'])],
|
||||
['id', 'icon', 'title', 'desc'],
|
||||
order='sequence asc'
|
||||
)
|
||||
out.append({
|
||||
'id': p['id'],
|
||||
'key': p['key'],
|
||||
'title': p['title'],
|
||||
'subtitle': p.get('subtitle') or '',
|
||||
'body_html': p.get('body_html') or '',
|
||||
'items': [{
|
||||
'id': it['id'],
|
||||
'icon': it.get('icon') or '',
|
||||
'title': it.get('title') or '',
|
||||
'desc': it.get('desc') or '',
|
||||
} for it in items],
|
||||
})
|
||||
return _json({'items': out})
|
||||
|
||||
@http.route('/game/api/threads', type='http', auth='public', methods=['GET'], csrf=False)
|
||||
def threads(self, **kw):
|
||||
"""论坛主题(含回复),按置顶+时间排序。"""
|
||||
|
||||
@ -4,50 +4,50 @@
|
||||
<!-- ============ 规则 / 等级制度(基于官网) ============ -->
|
||||
<!-- 世界等级 · 五阶段 -->
|
||||
<record id="rule_world_1" model="game.rule">
|
||||
<field name="type">world</field><field name="level">1</field><field name="name">凡墟</field>
|
||||
<field name="desc"><![CDATA[万物生灵尚处蒙昧凡土,天地灵气稀薄,各族散居荒野,无族群联盟与政权,只求狩猎采集求生,一切秩序遵循自然法则。]]></field>
|
||||
<field name="type">world</field><field name="level">1</field><field name="name">蒙昧</field>
|
||||
<field name="desc"><![CDATA[文明萌芽,仅基础采集与居住,无势力概念,事件以自然为主。]]></field>
|
||||
</record>
|
||||
<record id="rule_world_2" model="game.rule">
|
||||
<field name="type">world</field><field name="level">2</field><field name="name">灵启</field>
|
||||
<field name="desc"><![CDATA[天地灵气复苏觉醒,各族聚拢形成聚落,诞生劳作分工、屋舍营建与物物交换,不同族群率先凝聚部族,世间初代势力自此诞生。]]></field>
|
||||
<field name="type">world</field><field name="level">2</field><field name="name">聚落</field>
|
||||
<field name="desc"><![CDATA[出现村落与分工,解锁基础建造与贸易,可建立首个势力。]]></field>
|
||||
</record>
|
||||
<record id="rule_world_3" model="game.rule">
|
||||
<field name="type">world</field><field name="level">3</field><field name="name">玄界</field>
|
||||
<field name="desc"><![CDATA[各族部落兼并融合,广袤大地形成多元族群共治的完整疆域,征伐、道统、造物三大发展路线并行;各族大能、上古秘闻等传奇事件不断现世,玄荒文明迎来鼎盛割据时代。]]></field>
|
||||
<field name="type">world</field><field name="level">3</field><field name="name">王国</field>
|
||||
<field name="desc"><![CDATA[统一政权成形,解锁军事/宗教/科技分支,传奇事件开始频现。]]></field>
|
||||
</record>
|
||||
<record id="rule_world_4" model="game.rule">
|
||||
<field name="type">world</field><field name="level">4</field><field name="name">穹冥</field>
|
||||
<field name="desc"><![CDATA[生灵突破地表桎梏,打通地底深渊与浩瀚星空,天地上下各界尽数纳入族群管辖;各类上古神器、本命法器完整解锁,文明疆域遍布天地穹苍。]]></field>
|
||||
<field name="type">world</field><field name="level">4</field><field name="name">文明</field>
|
||||
<field name="desc"><![CDATA[跨层互通成熟,地下与星空纳入治理,神器与装备体系全开。]]></field>
|
||||
</record>
|
||||
<record id="rule_world_5" model="game.rule">
|
||||
<field name="type">world</field><field name="level">5</field><field name="name">溯元</field>
|
||||
<field name="desc"><![CDATA[各族顶尖文明勘破这片天地的诞生本源,挣脱本世界规则束缚,可踏上飞升之路、往复轮回,前往更高维度开启全新文明演化。]]></field>
|
||||
<field name="type">world</field><field name="level">5</field><field name="name">飞升</field>
|
||||
<field name="desc"><![CDATA[文明触及世界本质,可开启飞升轮回,进入更高维的演化实验。]]></field>
|
||||
</record>
|
||||
|
||||
<!-- 势力等级 · Lv.1-6 -->
|
||||
<record id="rule_faction_1" model="game.rule">
|
||||
<field name="type">faction</field><field name="level">1</field><field name="name">墟族</field>
|
||||
<field name="desc"><![CDATA[血缘小群体,蛮荒无制度。]]></field>
|
||||
<field name="type">faction</field><field name="level">1</field><field name="name">部族</field>
|
||||
<field name="desc"><![CDATA[血缘纽带的小群体,无正式制度。]]></field>
|
||||
</record>
|
||||
<record id="rule_faction_2" model="game.rule">
|
||||
<field name="type">faction</field><field name="level">2</field><field name="name">灵聚</field>
|
||||
<field name="desc"><![CDATA[灵气聚落联盟,初步治理与贸易。]]></field>
|
||||
<field name="type">faction</field><field name="level">2</field><field name="name">城邦</field>
|
||||
<field name="desc"><![CDATA[多聚落联盟,出现雏形治理与税收。]]></field>
|
||||
</record>
|
||||
<record id="rule_faction_3" model="game.rule">
|
||||
<field name="type">faction</field><field name="level">3</field><field name="name">玄邑</field>
|
||||
<field name="desc"><![CDATA[疆域整合,军法、道规体系完善。]]></field>
|
||||
<field name="type">faction</field><field name="level">3</field><field name="name">公国</field>
|
||||
<field name="desc"><![CDATA[领地整合,常备军与法典成型。]]></field>
|
||||
</record>
|
||||
<record id="rule_faction_4" model="game.rule">
|
||||
<field name="type">faction</field><field name="level">4</field><field name="name">冥朝</field>
|
||||
<field name="desc"><![CDATA[一统大地,掌控地下浅层资源调度。]]></field>
|
||||
<field name="type">faction</field><field name="level">4</field><field name="name">王国</field>
|
||||
<field name="desc"><![CDATA[统一王朝,跨层资源调度能力。]]></field>
|
||||
</record>
|
||||
<record id="rule_faction_5" model="game.rule">
|
||||
<field name="type">faction</field><field name="level">5</field><field name="name">穹统</field>
|
||||
<field name="desc"><![CDATA[天地大陆霸主,穿梭星空深渊作战。]]></field>
|
||||
<field name="type">faction</field><field name="level">5</field><field name="name">帝国</field>
|
||||
<field name="desc"><![CDATA[大陆级霸权,可发起跨世界行动。]]></field>
|
||||
</record>
|
||||
<record id="rule_faction_6" model="game.rule">
|
||||
<field name="type">faction</field><field name="level">6</field><field name="name">溯盟</field>
|
||||
<field name="desc"><![CDATA[多维文明联合体,触及世界本源博弈。]]></field>
|
||||
<field name="type">faction</field><field name="level">6</field><field name="name">星盟</field>
|
||||
<field name="desc"><![CDATA[联结多方世界,参与宏观文明博弈。]]></field>
|
||||
</record>
|
||||
|
||||
<!-- 人物角色等级 · Lv.1-12 -->
|
||||
@ -64,32 +64,6 @@
|
||||
<record id="rule_char_11" model="game.rule"><field name="type">character</field><field name="level">11</field><field name="name">圣者</field><field name="desc"><![CDATA[被信仰托举的意志。]]></field></record>
|
||||
<record id="rule_char_12" model="game.rule"><field name="type">character</field><field name="level">12</field><field name="name">永恒</field><field name="desc"><![CDATA[超越生死的世界锚点。]]></field></record>
|
||||
|
||||
<!-- ============ 货币等级 · Lv.1-6 ============ -->
|
||||
<record id="currency_1" model="game.currency">
|
||||
<field name="level">1</field><field name="name">墟铢</field><field name="rate">100</field>
|
||||
<field name="desc"><![CDATA[凡俗通用零钱,以贝壳、骨片、碎石铸成。100 墟铢 = 1 灵币。]]></field>
|
||||
</record>
|
||||
<record id="currency_2" model="game.currency">
|
||||
<field name="level">2</field><field name="name">灵币</field><field name="rate">100</field>
|
||||
<field name="desc"><![CDATA[蕴含微量灵气的金属铸币,聚落以上势力日常使用。100 灵币 = 1 玄锭。]]></field>
|
||||
</record>
|
||||
<record id="currency_3" model="game.currency">
|
||||
<field name="level">3</field><field name="name">玄锭</field><field name="rate">100</field>
|
||||
<field name="desc"><![CDATA[刻有玄纹的稀有锭块,用于高价值交易与功法图纸。100 玄锭 = 1 冥玉。]]></field>
|
||||
</record>
|
||||
<record id="currency_4" model="game.currency">
|
||||
<field name="level">4</field><field name="name">冥玉</field><field name="rate">100</field>
|
||||
<field name="desc"><![CDATA[产自地底深渊的幽暗玉石,蕴含浓郁能量。100 冥玉 = 1 穹鎏。]]></field>
|
||||
</record>
|
||||
<record id="currency_5" model="game.currency">
|
||||
<field name="level">5</field><field name="name">穹鎏</field><field name="rate">100</field>
|
||||
<field name="desc"><![CDATA[来自星空矿脉的稀有鎏金晶体,跨层贸易硬通货。100 穹鎏 = 1 元玺。]]></field>
|
||||
</record>
|
||||
<record id="currency_6" model="game.currency">
|
||||
<field name="level">6</field><field name="name">元玺</field><field name="rate">1</field>
|
||||
<field name="desc"><![CDATA[追溯世界本源凝聚而成的至高货币,可兑换神器、传说事件与维度权限。]]></field>
|
||||
</record>
|
||||
|
||||
<!-- ============ 图鉴样例(每类 1 条,供用户参考扩展;按分类+子级分组) ============ -->
|
||||
<record id="codex_race_sample" model="game.codex.entry">
|
||||
<field name="cat">race</field><field name="sub">龙裔</field><field name="name">龙裔</field><field name="tier">传说</field>
|
||||
@ -132,121 +106,4 @@
|
||||
<field name="body_html"><![CDATA[<p>宇森官网第一阶段上线:介绍 / 规则 / 图鉴 / 论坛 / 公告 五块,单页切换呈现。欢迎园丁们入驻。</p>]]></field>
|
||||
</record>
|
||||
|
||||
<!-- ============ 页面板块 ============ -->
|
||||
<!-- 特色 -->
|
||||
<record id="page_features" model="game.page">
|
||||
<field name="key">features</field>
|
||||
<field name="title">游戏特色</field>
|
||||
<field name="subtitle">CORE FEATURES</field>
|
||||
<field name="sequence">10</field>
|
||||
</record>
|
||||
<record id="page_features_item_1" model="game.page.item">
|
||||
<field name="page_id" ref="page_features"/>
|
||||
<field name="sequence">10</field>
|
||||
<field name="icon">🌐</field>
|
||||
<field name="title">垂直五层世界</field>
|
||||
<field name="desc">从地心熔岩到陨石星空,文明在五个垂直切面中同时生长,每一层都有独立的生态、资源与事件池。</field>
|
||||
</record>
|
||||
<record id="page_features_item_2" model="game.page.item">
|
||||
<field name="page_id" ref="page_features"/>
|
||||
<field name="sequence">20</field>
|
||||
<field name="icon">🌱</field>
|
||||
<field name="title">自发演化</field>
|
||||
<field name="desc">不是脚本,不是关卡。文明自己生长、分裂、兼并、飞升——每一次开局都是一部独一无二的编年史。</field>
|
||||
</record>
|
||||
<record id="page_features_item_3" model="game.page.item">
|
||||
<field name="page_id" ref="page_features"/>
|
||||
<field name="sequence">30</field>
|
||||
<field name="icon">🧑🌾</field>
|
||||
<field name="title">园丁视角</field>
|
||||
<field name="desc">你不是英雄,也不是上帝。你是园丁——播种灵气、引导势力、守望文明,在关键节点轻推一把,让世界自洽前行。</field>
|
||||
</record>
|
||||
<record id="page_features_item_4" model="game.page.item">
|
||||
<field name="page_id" ref="page_features"/>
|
||||
<field name="sequence">40</field>
|
||||
<field name="icon">⚖️</field>
|
||||
<field name="title">三维等级联动</field>
|
||||
<field name="desc">世界等级定舞台上限,势力等级定群体进度,角色等级定个体极限。三者交叉构成无限策略空间。</field>
|
||||
</record>
|
||||
<record id="page_features_item_5" model="game.page.item">
|
||||
<field name="page_id" ref="page_features"/>
|
||||
<field name="sequence">50</field>
|
||||
<field name="icon">💰</field>
|
||||
<field name="title">六档货币体系</field>
|
||||
<field name="desc">从墟铢到元玺,百进制兑换贯穿五层世界。跨层贸易、资源调度、神器交易构成完整经济闭环。</field>
|
||||
</record>
|
||||
<record id="page_features_item_6" model="game.page.item">
|
||||
<field name="page_id" ref="page_features"/>
|
||||
<field name="sequence">60</field>
|
||||
<field name="icon">🎭</field>
|
||||
<field name="title">活的个体</field>
|
||||
<field name="desc">每个 NPC 都有独立的天赋、性格与成长轨迹。英雄在历练中觉醒,传奇在时间中自发生成,无人是棋子。</field>
|
||||
</record>
|
||||
|
||||
<!-- 背景 -->
|
||||
<record id="page_background" model="game.page">
|
||||
<field name="key">background</field>
|
||||
<field name="title">世界起源</field>
|
||||
<field name="subtitle">BACKGROUND</field>
|
||||
<field name="sequence">20</field>
|
||||
<field name="body_html"><![CDATA[<p>天地初开,混沌未分。一缕灵气自地心涌出,沿垂直切面向上攀爬——穿透岩层、跨越地表、掠过云海、直抵星空。五层世界自此苏醒。</p>
|
||||
<p>地表层最先活过来。灵气稀薄,但足够点燃文明的火种。各族散居荒野,狩猎采集,以血缘结群,在蒙昧的凡土上挣扎求生。这是<b style="color:#fff">凡墟</b>。</p>
|
||||
<p>而后灵气渐浓,天地共振。聚落涌现,分工萌芽,物物交换催生最早的势力。灵启的时代,文明开始有了形状。</p>
|
||||
<p>再往后,是兼并、是征伐、是道统与造物的竞逐。<b style="color:#fff">玄界</b>的大地上,多元族群共治的完整疆域成形,传奇事件如潮涌来。</p>
|
||||
<p>直到有一天,有人掘穿了地表之下的黑暗,有人驾着浮空石飞上了云海。地下深渊与浩瀚星空同时向文明敞开——<b style="color:#fff">穹冥</b>时代,天地上下尽数纳入管辖。</p>
|
||||
<p>最终,顶尖文明勘破了这片天地的诞生本源。他们追溯灵气的源头,在地心深处找到了答案。飞升、轮回、更高维度的演化实验——<b style="color:#fff">溯元</b>,不是终点,而是新的起点。</p>
|
||||
<p style="margin-top:22px;color:var(--gold);font-style:italic;">而你,是这一切的园丁。</p>]]></field>
|
||||
</record>
|
||||
<record id="page_bg_layer_1" model="game.page.item">
|
||||
<field name="page_id" ref="page_background"/>
|
||||
<field name="sequence">10</field>
|
||||
<field name="icon">✦</field>
|
||||
<field name="title">星空层</field>
|
||||
<field name="desc">陨石科技带 · 穹鎏产地</field>
|
||||
</record>
|
||||
<record id="page_bg_layer_2" model="game.page.item">
|
||||
<field name="page_id" ref="page_background"/>
|
||||
<field name="sequence">20</field>
|
||||
<field name="icon">✦</field>
|
||||
<field name="title">天空层</field>
|
||||
<field name="desc">云朵地基块 · 浮空城邦</field>
|
||||
</record>
|
||||
<record id="page_bg_layer_3" model="game.page.item">
|
||||
<field name="page_id" ref="page_background"/>
|
||||
<field name="sequence">30</field>
|
||||
<field name="icon">✦</field>
|
||||
<field name="title">地表层</field>
|
||||
<field name="desc">文明发源地 · 主舞台</field>
|
||||
</record>
|
||||
<record id="page_bg_layer_4" model="game.page.item">
|
||||
<field name="page_id" ref="page_background"/>
|
||||
<field name="sequence">40</field>
|
||||
<field name="icon">✦</field>
|
||||
<field name="title">地下层</field>
|
||||
<field name="desc">矿脉深渊 · 冥玉产地</field>
|
||||
</record>
|
||||
<record id="page_bg_layer_5" model="game.page.item">
|
||||
<field name="page_id" ref="page_background"/>
|
||||
<field name="sequence">50</field>
|
||||
<field name="icon">✦</field>
|
||||
<field name="title">地心层</field>
|
||||
<field name="desc">本源之地 · 元玺凝聚</field>
|
||||
</record>
|
||||
|
||||
<!-- 致玩家 -->
|
||||
<record id="page_letter" model="game.page">
|
||||
<field name="key">letter</field>
|
||||
<field name="title">致园丁</field>
|
||||
<field name="subtitle">A LETTER TO GARDENERS</field>
|
||||
<field name="sequence">30</field>
|
||||
<field name="body_html"><![CDATA[<p>致每一位踏入宇森的园丁:</p>
|
||||
<p>感谢你来到这里。</p>
|
||||
<p>宇森不是一款传统的策略游戏。这里没有关卡,没有通关,没有固定的胜利条件。我们想做的,是一个<span class="hl">会自己呼吸的世界</span>——你播下一颗种子,它自己长成一片森林;你引导一个族群,它自己走出一段历史。</p>
|
||||
<p>你是园丁,不是上帝。你不能命令谁去做什么,但你可以改变土壤、调节灵气、在关键节点轻轻推一把。文明的走向由无数个体的选择汇聚而成,而你只是其中一股温柔的力。</p>
|
||||
<p>这个世界有五层。从地心到星空,每一层都有自己的生态和故事。文明会从地表的凡墟开始,一路向上向下生长,直到触及世界的本源。这个过程可能很慢,也可能充满意外——但那正是我们想要的。</p>
|
||||
<p>我们还在生长。宇森目前处于早期阶段,很多系统仍在打磨。但你看到的每一个种族、每一件神器、每一段传奇事件,都是这个世界真实存在的一部分。它们会随着版本的推进越来越厚,越来越活。</p>
|
||||
<p>如果你在这里找到了哪怕一刻的沉浸感,那就是我们最大的成功。</p>
|
||||
<p>欢迎播种。</p>]]></field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
|
||||
@ -2,5 +2,3 @@ from . import codex
|
||||
from . import forum
|
||||
from . import announcement
|
||||
from . import rule
|
||||
from . import currency
|
||||
from . import page
|
||||
|
||||
@ -1,42 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from odoo import models, fields, api
|
||||
|
||||
|
||||
class GameCurrency(models.Model):
|
||||
_name = 'game.currency'
|
||||
_description = '游戏货币等级'
|
||||
_order = 'level asc'
|
||||
|
||||
level = fields.Integer(string='等级', required=True)
|
||||
name = fields.Char(string='名称', required=True)
|
||||
desc = fields.Text(string='描述')
|
||||
rate = fields.Integer(
|
||||
string='兑换比例',
|
||||
default=1,
|
||||
help='多少单位本货币可兑换 1 单位下一等级货币。例如 100 墟铢 = 1 灵币,则墟铢的 rate 为 100。'
|
||||
)
|
||||
|
||||
@api.model
|
||||
def convert(self, amount, from_level, to_level):
|
||||
"""按等级汇率将 amount 从 from_level 换算为 to_level 货币。
|
||||
|
||||
汇率方向:低等级 → 高等级 为除以 rate,高等级 → 低等级 为乘以 rate。
|
||||
最高等级货币(元玺)的 rate 固定为 1,仅作占位。
|
||||
"""
|
||||
if from_level == to_level:
|
||||
return amount
|
||||
currencies = self.search_read([], ['level', 'rate'], order='level asc')
|
||||
rate_map = {c['level']: c['rate'] or 1 for c in currencies}
|
||||
|
||||
if from_level < to_level:
|
||||
# 低等级 → 高等级:逐级除以兑换比例
|
||||
result = amount
|
||||
for lv in range(from_level, to_level):
|
||||
result = result / rate_map.get(lv, 1)
|
||||
return result
|
||||
else:
|
||||
# 高等级 → 低等级:逐级乘以兑换比例
|
||||
result = amount
|
||||
for lv in range(to_level, from_level):
|
||||
result = result * rate_map.get(lv, 1)
|
||||
return result
|
||||
@ -9,9 +9,3 @@ access_game_announcement,game.announcement public,model_game_announcement,base.g
|
||||
access_game_announcement_user,game.announcement user,model_game_announcement,base.group_user,1,1,1,1
|
||||
access_game_rule,game.rule public,model_game_rule,base.group_public,1,0,0,0
|
||||
access_game_rule_user,game.rule user,model_game_rule,base.group_user,1,1,1,1
|
||||
access_game_currency,game.currency public,model_game_currency,base.group_public,1,0,0,0
|
||||
access_game_currency_user,game.currency user,model_game_currency,base.group_user,1,1,1,1
|
||||
access_game_page,game.page public,model_game_page,base.group_public,1,0,0,0
|
||||
access_game_page_user,game.page user,model_game_page,base.group_user,1,1,1,1
|
||||
access_game_page_item,game.page.item public,model_game_page_item,base.group_public,1,0,0,0
|
||||
access_game_page_item_user,game.page.item user,model_game_page_item,base.group_user,1,1,1,1
|
||||
|
||||
|
@ -61,68 +61,6 @@
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- ============ 货币等级 ============ -->
|
||||
<record id="action_game_currency" model="ir.actions.act_window">
|
||||
<field name="name">货币等级</field>
|
||||
<field name="res_model">game.currency</field>
|
||||
<field name="view_mode">list,form</field>
|
||||
</record>
|
||||
<menuitem id="menu_game_currency" name="货币等级" parent="menu_game_root" action="action_game_currency" sequence="25"/>
|
||||
<record id="view_game_currency_list" model="ir.ui.view">
|
||||
<field name="name">game.currency.list</field>
|
||||
<field name="model">game.currency</field>
|
||||
<field name="arch" type="xml">
|
||||
<list><field name="level"/><field name="name"/><field name="rate"/></list>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_game_currency_form" model="ir.ui.view">
|
||||
<field name="name">game.currency.form</field>
|
||||
<field name="model">game.currency</field>
|
||||
<field name="arch" type="xml">
|
||||
<form><group><field name="level"/><field name="name"/><field name="rate"/></group><field name="desc"/></form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- ============ 页面板块 ============ -->
|
||||
<record id="action_game_page" model="ir.actions.act_window">
|
||||
<field name="name">页面板块</field>
|
||||
<field name="res_model">game.page</field>
|
||||
<field name="view_mode">list,form</field>
|
||||
</record>
|
||||
<menuitem id="menu_game_page" name="页面板块" parent="menu_game_root" action="action_game_page" sequence="27"/>
|
||||
<record id="view_game_page_list" model="ir.ui.view">
|
||||
<field name="name">game.page.list</field>
|
||||
<field name="model">game.page</field>
|
||||
<field name="arch" type="xml">
|
||||
<list>
|
||||
<field name="sequence"/><field name="key"/><field name="title"/><field name="subtitle"/><field name="active"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_game_page_form" model="ir.ui.view">
|
||||
<field name="name">game.page.form</field>
|
||||
<field name="model">game.page</field>
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<group>
|
||||
<field name="key"/><field name="title"/><field name="subtitle"/><field name="sequence"/><field name="active"/>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="正文" name="body">
|
||||
<field name="body_html" widget="html" options="{'collaborative': true}"/>
|
||||
</page>
|
||||
<page string="条目" name="items">
|
||||
<field name="item_ids">
|
||||
<list editable="bottom">
|
||||
<field name="sequence" widget="handle"/><field name="icon"/><field name="title"/><field name="desc"/>
|
||||
</list>
|
||||
</field>
|
||||
</page>
|
||||
</notebook>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- ============ 论坛(放后面) ============ -->
|
||||
<menuitem id="menu_game_forum" name="论坛" parent="menu_game_root" sequence="30"/>
|
||||
<record id="action_game_forum_thread" model="ir.actions.act_window">
|
||||
|
||||
@ -1,62 +1,43 @@
|
||||
// 宇森游戏 · 前端与 Odoo 通信层
|
||||
// 本地调试:前端 8888 -> Odoo 8069(跨域,带调试 CORS 头)
|
||||
// 生产部署:前端与 Odoo 同域,由 nginx 代理 /game/*。
|
||||
|
||||
const API_CONFIG = {
|
||||
base: (location.hostname === '127.0.0.1' && location.port === '8888')
|
||||
? 'http://127.0.0.1:8069'
|
||||
: (location.hostname === 'localhost' && location.port === '8888')
|
||||
? 'http://127.0.0.1:8069'
|
||||
: '',
|
||||
db: (location.hostname === '127.0.0.1' && location.port === '8888') ? 'study' : 'game',
|
||||
};
|
||||
|
||||
const _cred = API_CONFIG.base ? 'include' : 'same-origin';
|
||||
|
||||
function _url(path) {
|
||||
return `${API_CONFIG.base}${path}?db=${API_CONFIG.db}`;
|
||||
}
|
||||
// 所有接口同源(yt.pengyuthon.cn),由 nginx 代理 /game/* 到 Odoo(game 库)。
|
||||
// 关键点:Odoo 通过 URL 上的 ?db=game 选定数据库(与 game.conf 的 /web/login?db=game 一致),
|
||||
// 否则请求到达时未选中库,控制器路由找不到 → 404。因此所有调用都带 ?db=game。
|
||||
// 登录态通过 Odoo session cookie 保持,fetch 带 credentials:'same-origin'。
|
||||
|
||||
const API = {
|
||||
async me() {
|
||||
return (await fetch(_url('/game/api/me'), { credentials: _cred })).json();
|
||||
return (await fetch('/game/api/me?db=game', { credentials: 'same-origin' })).json();
|
||||
},
|
||||
async login(login, password) {
|
||||
return (await fetch(_url('/game/api/login'), {
|
||||
method: 'POST', credentials: _cred,
|
||||
return (await fetch('/game/api/login?db=game', {
|
||||
method: 'POST', credentials: 'same-origin',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ login, password }),
|
||||
})).json();
|
||||
},
|
||||
async register(payload) {
|
||||
return (await fetch(_url('/game/api/register'), {
|
||||
method: 'POST', credentials: _cred,
|
||||
return (await fetch('/game/api/register?db=game', {
|
||||
method: 'POST', credentials: 'same-origin',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(payload),
|
||||
})).json();
|
||||
},
|
||||
async logout() {
|
||||
return (await fetch(_url('/game/api/logout'), {
|
||||
method: 'POST', credentials: _cred,
|
||||
return (await fetch('/game/api/logout?db=game', {
|
||||
method: 'POST', credentials: 'same-origin',
|
||||
})).json();
|
||||
},
|
||||
async codex() {
|
||||
return (await fetch(_url('/game/api/codex'), { credentials: _cred })).json();
|
||||
return (await fetch('/game/api/codex?db=game', { credentials: 'same-origin' })).json();
|
||||
},
|
||||
async rules() {
|
||||
return (await fetch(_url('/game/api/rules'), { credentials: _cred })).json();
|
||||
},
|
||||
async currencies() {
|
||||
return (await fetch(_url('/game/api/currencies'), { credentials: _cred })).json();
|
||||
},
|
||||
async pages() {
|
||||
return (await fetch(_url('/game/api/pages'), { credentials: _cred })).json();
|
||||
return (await fetch('/game/api/rules?db=game', { credentials: 'same-origin' })).json();
|
||||
},
|
||||
async threads() {
|
||||
return (await fetch(_url('/game/api/threads'), { credentials: _cred })).json();
|
||||
return (await fetch('/game/api/threads?db=game', { credentials: 'same-origin' })).json();
|
||||
},
|
||||
async announcements() {
|
||||
return (await fetch(_url('/game/api/announcements'), { credentials: _cred })).json();
|
||||
return (await fetch('/game/api/announcements?db=game', { credentials: 'same-origin' })).json();
|
||||
},
|
||||
// ---------- 沙盘记忆(yt_world 模块) ----------
|
||||
async world() {
|
||||
|
||||
@ -1,43 +1,6 @@
|
||||
// 宇森官网 · 公开页数据打通(图鉴/规则/论坛/公告 从 Odoo 取数)
|
||||
// 依赖 assets/game-api.js
|
||||
|
||||
// ---------- 页面板块(特色 / 背景 / 致玩家) ----------
|
||||
async function loadPages(){
|
||||
try {
|
||||
const d = await API.pages();
|
||||
const pages = (d && d.items) || [];
|
||||
pages.forEach(p => {
|
||||
if (p.key === 'features') renderFeatures(p);
|
||||
else if (p.key === 'background') renderBackground(p);
|
||||
else if (p.key === 'letter') renderLetter(p);
|
||||
});
|
||||
} catch (e) { /* 失败时保留 HTML 中的静态兜底内容 */ }
|
||||
}
|
||||
|
||||
function renderFeatures(p){
|
||||
const sec = document.getElementById('features');
|
||||
if (!sec) return;
|
||||
const items = (p.items || []).map(it =>
|
||||
`<div class="card"><div class="ic">${it.icon || ''}</div><h3>${it.title || ''}</h3><p>${it.desc || ''}</p></div>`
|
||||
).join('');
|
||||
sec.innerHTML = `<div class="sec-title">${p.title || '游戏特色'}<small>${p.subtitle || ''}</small></div><div class="grid">${items}</div>`;
|
||||
}
|
||||
|
||||
function renderBackground(p){
|
||||
const sec = document.getElementById('background');
|
||||
if (!sec) return;
|
||||
const layers = (p.items || []).map((it, idx) =>
|
||||
`<div class="layer l${idx + 1}"><div class="lt">${it.title || ''}</div><div class="ld">${it.desc || ''}</div><span class="star">${it.icon || '✦'}</span></div>`
|
||||
).join('');
|
||||
sec.innerHTML = `<div class="layers">${layers}</div><div class="bg-text"><h2>${p.title || '世界起源'}</h2>${p.body_html || ''}</div>`;
|
||||
}
|
||||
|
||||
function renderLetter(p){
|
||||
const sec = document.getElementById('letter');
|
||||
if (!sec) return;
|
||||
sec.innerHTML = `<div class="letter-wrap"><h2>${p.title || ''}</h2><div class="lt-sub">${p.subtitle || ''}</div><div class="lt-body">${p.body_html || ''}</div><div class="lt-sign">—— 宇森开发组</div></div>`;
|
||||
}
|
||||
|
||||
// ---------- 规则 ----------
|
||||
async function loadRules(){
|
||||
const el = document.querySelector('#rules .rules-scroll');
|
||||
@ -45,7 +8,7 @@ async function loadRules(){
|
||||
try {
|
||||
const d = await API.rules();
|
||||
const groups = (d && d.groups) || [];
|
||||
if (!groups.length){ return; }
|
||||
if (!groups.length){ el.innerHTML = '<div class="tdesc">暂无规则数据</div>'; return; }
|
||||
el.innerHTML = groups.map(g => {
|
||||
const rows = (g.items || []).map(it => {
|
||||
const lvl = (it.level != null) ? ('Lv.' + it.level) : (g.key === 'world' ? '阶段' : '');
|
||||
@ -100,7 +63,6 @@ async function loadAnnounce(){
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
loadPages();
|
||||
loadRules();
|
||||
loadForum();
|
||||
loadAnnounce();
|
||||
|
||||
68
index.html
68
index.html
@ -173,25 +173,12 @@
|
||||
.note .body{font-size:14px;color:var(--text);line-height:1.7;}
|
||||
.note.pin{box-shadow:var(--glow);}
|
||||
|
||||
/* ===== 致玩家 ===== */
|
||||
#letter{align-items:center;justify-content:center;}
|
||||
#letter .letter-wrap{max-width:680px;width:100%;overflow-y:auto;padding:10px 20px;}
|
||||
#letter .letter-wrap h2{font-family:"ZCOOL QingKe HuangYou",sans-serif;font-size:30px;letter-spacing:4px;color:#fff;text-shadow:0 0 18px rgba(139,92,246,.5);margin-bottom:6px;text-align:center;}
|
||||
#letter .letter-wrap .lt-sub{text-align:center;font-family:"Press Start 2P",monospace;font-size:9px;color:var(--magenta);letter-spacing:1px;margin-bottom:28px;}
|
||||
#letter .letter-wrap .lt-body{font-size:15px;color:var(--text-dim);line-height:2.1;}
|
||||
#letter .letter-wrap .lt-body p{margin-bottom:16px;}
|
||||
#letter .letter-wrap .lt-body p:first-child{font-size:17px;color:#fff;font-weight:500;}
|
||||
#letter .letter-wrap .lt-body .hl{color:var(--gold);font-weight:500;}
|
||||
#letter .letter-wrap .lt-sign{text-align:right;margin-top:28px;font-size:14px;color:var(--magenta);font-style:italic;}
|
||||
|
||||
@media (max-width:900px){
|
||||
.grid{grid-template-columns:repeat(2,1fr);}
|
||||
#background,#forum{flex-direction:column;overflow-y:auto;}
|
||||
.layers,.f-cats{flex:none;}
|
||||
.hero .copy h1{font-size:42px;}
|
||||
.nav button{padding:8px 10px;font-size:13px;}
|
||||
.nav{overflow-x:auto;scrollbar-width:none;}
|
||||
.nav::-webkit-scrollbar{display:none;}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
@ -201,13 +188,10 @@
|
||||
<div class="logo"><span class="cn">宇森</span></div>
|
||||
<nav class="nav">
|
||||
<button data-tab="intro" class="active">介绍</button>
|
||||
<button data-tab="features">特色</button>
|
||||
<button data-tab="background">背景</button>
|
||||
<button data-tab="rules">规则</button>
|
||||
<button data-tab="codex">图鉴</button>
|
||||
<button data-tab="rules">规则</button>
|
||||
<button data-tab="forum">论坛</button>
|
||||
<button data-tab="announce">公告</button>
|
||||
<button data-tab="letter">致玩家</button>
|
||||
</nav>
|
||||
<div class="spacer"></div>
|
||||
<div class="user-box" id="userBox"></div>
|
||||
@ -233,41 +217,38 @@
|
||||
</section>
|
||||
|
||||
<!-- ===== 特色 ===== -->
|
||||
<section class="panel" id="features"></section>
|
||||
|
||||
|
||||
<!-- ===== 背景 ===== -->
|
||||
<section class="panel" id="background"></section>
|
||||
|
||||
|
||||
<!-- ===== 规则 ===== -->
|
||||
<section class="panel" id="rules">
|
||||
<div class="sec-title">等级制度<small>TIERS & RANK SYSTEM</small></div>
|
||||
<div class="rules-scroll">
|
||||
<!-- ① 世界等级 · 五阶段 -->
|
||||
<div class="rule-block">
|
||||
<h3>① 世界等级 · 五阶段</h3>
|
||||
<p class="rule-intro">世界从凡墟到溯元的整体进化阶段,决定可解锁的内容深度与事件池上限。园丁对世界施加的影响会推动阶段跃迁——这是文明能"发生什么"的舞台上限。</p>
|
||||
<p class="rule-intro">世界从蒙昧到飞升的整体进化阶段,决定可解锁的内容深度与事件池上限。园丁对世界施加的影响会推动阶段跃迁——这是文明能"发生什么"的舞台上限。</p>
|
||||
<div class="tier-list">
|
||||
<div class="tier-row"><span class="tn">阶段一</span><span class="tname">凡墟</span><span class="tdesc">万物生灵尚处蒙昧凡土,天地灵气稀薄,各族散居荒野,无族群联盟与政权,只求狩猎采集求生,一切秩序遵循自然法则。</span></div>
|
||||
<div class="tier-row"><span class="tn">阶段二</span><span class="tname">灵启</span><span class="tdesc">天地灵气复苏觉醒,各族聚拢形成聚落,诞生劳作分工、屋舍营建与物物交换,不同族群率先凝聚部族,世间初代势力自此诞生。</span></div>
|
||||
<div class="tier-row"><span class="tn">阶段三</span><span class="tname">玄界</span><span class="tdesc">各族部落兼并融合,广袤大地形成多元族群共治的完整疆域,征伐、道统、造物三大发展路线并行;各族大能、上古秘闻等传奇事件不断现世,玄荒文明迎来鼎盛割据时代。</span></div>
|
||||
<div class="tier-row"><span class="tn">阶段四</span><span class="tname">穹冥</span><span class="tdesc">生灵突破地表桎梏,打通地底深渊与浩瀚星空,天地上下各界尽数纳入族群管辖;各类上古神器、本命法器完整解锁,文明疆域遍布天地穹苍。</span></div>
|
||||
<div class="tier-row"><span class="tn">阶段五</span><span class="tname">溯元</span><span class="tdesc">各族顶尖文明勘破这片天地的诞生本源,挣脱本世界规则束缚,可踏上飞升之路、往复轮回,前往更高维度开启全新文明演化。</span></div>
|
||||
<div class="tier-row"><span class="tn">阶段一</span><span class="tname">蒙昧</span><span class="tdesc">文明萌芽,仅基础采集与居住,无势力概念,事件以自然为主。</span></div>
|
||||
<div class="tier-row"><span class="tn">阶段二</span><span class="tname">聚落</span><span class="tdesc">出现村落与分工,解锁基础建造与贸易,可建立首个势力。</span></div>
|
||||
<div class="tier-row"><span class="tn">阶段三</span><span class="tname">王国</span><span class="tdesc">统一政权成形,解锁军事/宗教/科技分支,传奇事件开始频现。</span></div>
|
||||
<div class="tier-row"><span class="tn">阶段四</span><span class="tname">文明</span><span class="tdesc">跨层互通成熟,地下与星空纳入治理,神器与装备体系全开。</span></div>
|
||||
<div class="tier-row"><span class="tn">阶段五</span><span class="tname">飞升</span><span class="tdesc">文明触及世界本质,可开启飞升轮回,进入更高维的演化实验。</span></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ② 势力等级 -->
|
||||
<div class="rule-block">
|
||||
<h3>② 势力等级</h3>
|
||||
<p class="rule-intro">文明内部群体的聚合度,由人口、领土、影响力累计。势力等级越高,可调动的世界资源与外交权重越大——决定文明"能调动什么"。</p>
|
||||
<div class="tier-list">
|
||||
<div class="tier-row"><span class="tn">Lv.1</span><span class="tname">墟族</span><span class="tdesc">血缘小群体,蛮荒无制度。</span></div>
|
||||
<div class="tier-row"><span class="tn">Lv.2</span><span class="tname">灵聚</span><span class="tdesc">灵气聚落联盟,初步治理与贸易。</span></div>
|
||||
<div class="tier-row"><span class="tn">Lv.3</span><span class="tname">玄邑</span><span class="tdesc">疆域整合,军法、道规体系完善。</span></div>
|
||||
<div class="tier-row"><span class="tn">Lv.4</span><span class="tname">冥朝</span><span class="tdesc">一统大地,掌控地下浅层资源调度。</span></div>
|
||||
<div class="tier-row"><span class="tn">Lv.5</span><span class="tname">穹统</span><span class="tdesc">天地大陆霸主,穿梭星空深渊作战。</span></div>
|
||||
<div class="tier-row"><span class="tn">Lv.6</span><span class="tname">溯盟</span><span class="tdesc">多维文明联合体,触及世界本源博弈。</span></div>
|
||||
<div class="tier-row"><span class="tn">Lv.1</span><span class="tname">部族</span><span class="tdesc">血缘纽带的小群体,无正式制度。</span></div>
|
||||
<div class="tier-row"><span class="tn">Lv.2</span><span class="tname">城邦</span><span class="tdesc">多聚落联盟,出现雏形治理与税收。</span></div>
|
||||
<div class="tier-row"><span class="tn">Lv.3</span><span class="tname">公国</span><span class="tdesc">领地整合,常备军与法典成型。</span></div>
|
||||
<div class="tier-row"><span class="tn">Lv.4</span><span class="tname">王国</span><span class="tdesc">统一王朝,跨层资源调度能力。</span></div>
|
||||
<div class="tier-row"><span class="tn">Lv.5</span><span class="tname">帝国</span><span class="tdesc">大陆级霸权,可发起跨世界行动。</span></div>
|
||||
<div class="tier-row"><span class="tn">Lv.6</span><span class="tname">星盟</span><span class="tdesc">联结多方世界,参与宏观文明博弈。</span></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ③ 人物角色等级 -->
|
||||
<div class="rule-block">
|
||||
<h3>③ 人物角色等级 · 十二阶段</h3>
|
||||
<p class="rule-intro">个体(英雄 / 领袖 / 特殊 NPC)的成长阶序,通过历练、天赋点亮与装备积累提升,影响可承担的职责与战力——决定个体"能做成什么"。</p>
|
||||
@ -286,24 +267,10 @@
|
||||
<div class="tier-row"><span class="tn">Lv.12</span><span class="tname">永恒</span><span class="tdesc">超越生死的世界锚点。</span></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ④ 制度说明 -->
|
||||
<div class="rule-block">
|
||||
<h3>④ 制度说明</h3>
|
||||
<p class="rule-intro">三者相互独立又彼此加成:<b style="color:#fff">世界等级</b>是舞台上限,决定能发生什么;<b style="color:#fff">势力等级</b>是群体进度,决定能调动什么;<b style="color:#fff">角色等级</b>是个体成长,决定能做成什么。园丁的核心策略,是在三者间分配有限的引导资源,让文明自洽地向上演化。<br><br>跃迁逻辑:角色历练与装备积累→提升势力实力→推动世界阶段跃迁→解锁更深内容(更深的地下层、更远的星空层、更强的神器)。每一级提升都会扩大可叙事的事件池,世界因此越活越厚。</p>
|
||||
</div>
|
||||
<!-- ⑤ 货币等级 -->
|
||||
<div class="rule-block">
|
||||
<h3>⑤ 货币等级 · 六档</h3>
|
||||
<p class="rule-intro">文明流通的价值尺度,从凡俗零钱到本源货币,越稀有的货币可交易的资源层级越高——决定文明"能交换什么"。<br><br><b style="color:#fff">兑换规则:</b>100 低等级货币 = 1 高等级货币。</p>
|
||||
<div class="tier-list">
|
||||
<div class="tier-row"><span class="tn">Lv.1</span><span class="tname">墟铢</span><span class="tdesc">凡俗通用零钱,以贝壳、骨片、碎石铸成。<b>100 墟铢 = 1 灵币</b></span></div>
|
||||
<div class="tier-row"><span class="tn">Lv.2</span><span class="tname">灵币</span><span class="tdesc">蕴含微量灵气的金属铸币,聚落以上势力日常使用。<b>100 灵币 = 1 玄锭</b></span></div>
|
||||
<div class="tier-row"><span class="tn">Lv.3</span><span class="tname">玄锭</span><span class="tdesc">刻有玄纹的稀有锭块,用于高价值交易与功法图纸。<b>100 玄锭 = 1 冥玉</b></span></div>
|
||||
<div class="tier-row"><span class="tn">Lv.4</span><span class="tname">冥玉</span><span class="tdesc">产自地底深渊的幽暗玉石,蕴含浓郁能量。<b>100 冥玉 = 1 穹鎏</b></span></div>
|
||||
<div class="tier-row"><span class="tn">Lv.5</span><span class="tname">穹鎏</span><span class="tdesc">来自星空矿脉的稀有鎏金晶体,跨层贸易硬通货。<b>100 穹鎏 = 1 元玺</b></span></div>
|
||||
<div class="tier-row"><span class="tn">Lv.6</span><span class="tname">元玺</span><span class="tdesc">追溯世界本源凝聚而成的至高货币,可兑换神器、传说事件与维度权限。</span></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@ -354,16 +321,13 @@
|
||||
<section class="panel" id="announce">
|
||||
<div class="sec-title">公告<small>ANNOUNCEMENTS</small></div>
|
||||
<div class="notes">
|
||||
<div class="note pin"><div class="date">2026.07.09</div><div class="body">宇森官网第一阶段上线:介绍 / 特色 / 背景 / 规则 / 图鉴 / 论坛 / 公告 / 致玩家 八块,单页切换呈现,介绍页即概念宣传片。</div></div>
|
||||
<div class="note pin"><div class="date">2026.07.09</div><div class="body">宇森官网第一阶段上线:介绍 / 特色 / 背景 / 规则 / 图鉴 / 论坛 / 公告 七块,单页切换呈现,介绍页即概念宣传片。</div></div>
|
||||
<div class="note"><div class="date">2026.07.09</div><div class="body">图鉴系统升级:种族 204 条、系别/性格/天赋/神器/传奇事件全面扩量,装备槽位对齐 头/手/胸/裤/鞋/戒指(双)/项链/宝物;全部缩略图改为程序化矢量插画,零 AI 生图。</div></div>
|
||||
<div class="note"><div class="date">2026.07.08</div><div class="body">概念宣传片《垂直生长》完成,呈现五层世界自上而下生长的镜头语言(天空层改为云朵地基块,星空层改为陨石科技带)。</div></div>
|
||||
<div class="note"><div class="date">2026.07.01</div><div class="body">园丁视角核心玩法原型启动,首版六边形地图与活 NPC 验证中。</div></div>
|
||||
<div class="note"><div class="date">2026.06.20</div><div class="body">图鉴系统规划确定:种族 / 建筑 / 生物 / 神器 四大类目,美术持续补充中。</div></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ===== 致玩家 ===== -->
|
||||
<section class="panel" id="letter"></section>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<base href="https://yt.pengyuthon.cn/">
|
||||
<title>宇森 · 世界沙盘</title>
|
||||
<style>
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<base href="https://yt.pengyuthon.cn/">
|
||||
<title>宇森</title>
|
||||
<style>
|
||||
* { margin:0; padding:0; box-sizing:border-box; }
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<base href="https://yt.pengyuthon.cn/">
|
||||
<title>游戏介绍 — 宇森</title>
|
||||
<style>
|
||||
* { margin:0; padding:0; box-sizing:border-box; }
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<base href="https://yt.pengyuthon.cn/">
|
||||
<title>平台架构 — 宇森</title>
|
||||
<style>
|
||||
* { margin:0; padding:0; box-sizing:border-box; }
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<base href="https://yt.pengyuthon.cn/">
|
||||
<title>种族 — 宇森</title>
|
||||
<style>
|
||||
* { margin:0; padding:0; box-sizing:border-box; }
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<base href="https://yt.pengyuthon.cn/">
|
||||
<title>世界结构 — 宇森</title>
|
||||
<style>
|
||||
* { margin:0; padding:0; box-sizing:border-box; }
|
||||
|
||||
Loading…
Reference in New Issue
Block a user