game/assets/game-api.js
李鹏宇 e405eb7a07 feat: 网站布局统一化+公告卡片重做+地形素材归类+加载动画升级+底部栏拆分
- 网站 7 个页签统一内边距/宽度/滚动方式,去掉重复页头
- 公告卡片改为图文大卡(支持后台 image/title/pinned 字段)
- assets/terrain/ 拆 6 个子目录并同步 manifest + TERRAIN_ASSETS
- 删除 assets/art/(transition 图片已清空)
- 加载界面增加随机过渡背景图 + 深色压暗层
- 底部栏建造按钮拆为地形/移动/高度/管理 4 个独立按钮
- 侧面板改为从底部向上展开(WorldBox 风格)
- 删除视频背景文件(已回滚为静态 JPG)
- 新增 wc1.js(六边形地图渲染)、wc2.js(导航控件)
2026-07-24 23:39:49 +08:00

113 lines
4.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 宇森游戏 · 前端与 Odoo 通信层
// 本地调试:前端 8888 -> Odoo 8069跨域带调试 CORS 头)
// 生产部署:前端与 Odoo 同域,由 nginx 代理 /game/*。
// 库名说明:本地 Odoo 用 odoo.conf 钉死 yt_game线上游戏库名为 gamedbfilter 不含 yt_game
// game/* 走统一 API_CONFIG.dbyt_world/* 单独带 ?db=,按 WORLD_DB 区分本地/线上,避免 git 同步互相覆盖。
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',
};
// 世界(yt_world)所在库:本地 Odoo 钉 yt_game线上游戏库名为 game。按域名自适应git 同步不冲突。
const WORLD_DB = (location.hostname === '127.0.0.1' || location.hostname === 'localhost') ? 'yt_game' : 'game';
const _cred = API_CONFIG.base ? 'include' : 'same-origin';
function _url(path) {
return `${API_CONFIG.base}${path}?db=${API_CONFIG.db}`;
}
const API = {
async me() {
return (await fetch(_url('/game/api/me'), { credentials: _cred })).json();
},
async login(login, password) {
return (await fetch(_url('/game/api/login'), {
method: 'POST', credentials: _cred,
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,
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
})).json();
},
async logout() {
return (await fetch(_url('/game/api/logout'), {
method: 'POST', credentials: _cred,
})).json();
},
async codex() {
return (await fetch(_url('/game/api/codex'), { credentials: _cred })).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();
},
async threads() {
return (await fetch(_url('/game/api/threads'), { credentials: _cred })).json();
},
async announcements() {
return (await fetch(_url('/game/api/announcements'), { credentials: _cred })).json();
},
async story() {
return (await fetch(_url('/game/api/story'), { credentials: _cred })).json();
},
async storyChapter(cid) {
return (await fetch(_url('/game/api/story/chapter/' + cid), { credentials: _cred })).json();
},
// ---------- 沙盘记忆yt_world 模块) ----------
async world() {
return (await fetch('/yt_world/api/world?db=' + WORLD_DB, { credentials: 'same-origin' })).json();
},
async saveTiles(tiles) {
return (await fetch('/yt_world/api/tiles/save?db=' + WORLD_DB, {
method: 'POST', credentials: 'same-origin',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ tiles }),
})).json();
},
async saveSettings(settings) {
return (await fetch('/yt_world/api/settings?db=' + WORLD_DB, {
method: 'POST', credentials: 'same-origin',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ settings }),
})).json();
},
async renameWorld(name) {
return (await fetch('/yt_world/api/world/rename?db=' + WORLD_DB, {
method: 'POST', credentials: 'same-origin',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name }),
})).json();
},
// ---------- 世界数据 / 包裹后端接口预留yt_world 暂未实现路由,前端 mock 兜底) ----------
async worldData() {
try {
const r = await fetch('/yt_world/api/data?db=' + WORLD_DB, { credentials: 'same-origin' });
if (!r.ok) return null;
return await r.json();
} catch (e) { return null; }
},
async inventory() {
try {
const r = await fetch('/yt_world/api/inventory?db=' + WORLD_DB, { credentials: 'same-origin' });
if (!r.ok) return null;
return await r.json();
} catch (e) { return null; }
},
};