青云仙缘单机版

剑 御 清 风  ·  仙 缘 有 定

御剑
✓
御 剑
近战爆发 · 身法灵动
御剑冲刺取敌首级,万剑归宗
玄法
✓
玄 法
远程群攻 · 呼风唤火
冰锥天火覆雨翻云,凤舞九天
金刚
✓
金 刚
近战御敌 · 铜墙铁壁
聚怪承伤护盾反震,一夫当关
灵汐
✓
灵 汐
远程御灵 · 治疗召唤
唤灵助战妙手回春,生生不息
影刃
✓
影 刃
近战刺杀 · 高爆高机动
隐于暗影背刺穿心,千刃杀
♂男
♀女
鼠标左键点击地面移动 / 点击怪物攻击  |  WASD 移动  |  1-4 释放技能  |  空格闪避  |  F 上下坐骑  |  R 一键拾取  |  I 背包  |  C 角色
神品降世
TIAN JIE
天 阶 降 世
/* ================= 云存档 / Cloudflare 后端对接 ================= 设计原则: 1) 默认完全关闭,纯本地玩不受任何影响(localStorage 仍是主存档)。 2) 开启方式:地址加 ?cloud=1 且 window.QY_CLOUD_BASE 指向已部署的后端根地址; 或 localStorage.setItem('qy_cloud','1') + 'qy_cloud_base' 写死域名。 3) 只做"存档上云 + 读档优先"两件事;排行榜/仙市等后续再接。 4) 失败一律静默回退到本地,绝不因为网络问题卡住开局。 */ (function(){ 'use strict'; var BASE = window.QY_CLOUD_BASE || (function(){ try{ var q = location.search.indexOf('cloud=1') >= 0; var b = localStorage.getItem('qy_cloud_base') || ''; var on = q || localStorage.getItem('qy_cloud') === '1'; return on ? b : ''; }catch(_){ return ''; } })(); var TOKEN_KEY = 'qy_token', SAVE_KEY_CLOUD = 'qy_cloud_saved_at'; var PUSH_DELAY = 8000; // 存档后 8s 内合并推送,避免频繁写 D1 var pushTimer = null, pushing = false, lastErr = ''; function tok(){ try{ return localStorage.getItem(TOKEN_KEY) || ''; }catch(_){ return ''; } } function setTok(t){ try{ t ? localStorage.setItem(TOKEN_KEY, t) : localStorage.removeItem(TOKEN_KEY); }catch(_){} } function enabled(){ return !!BASE; } function api(path, opt){ opt = opt || {}; var h = { 'Content-Type': 'application/json' }; if(tok()) h['Authorization'] = 'Bearer ' + tok(); return fetch(BASE.replace(/\/$/, '') + path, { method: opt.method || 'GET', headers: h, body: opt.body ? JSON.stringify(opt.body) : undefined, credentials: 'omit' }).then(function(r){ return r.text().then(function(t){ var j = null; try{ j = JSON.parse(t); }catch(_){} if(!r.ok) throw new Error((j && (j.error || j.message)) || ('HTTP ' + r.status)); return j; }); }); } /* ---------- 账号 ---------- */ function register(name, pass){ return api('/api/auth/register', { method:'POST', body:{ name:name, pass:pass } }) .then(function(r){ if(r && r.token) setTok(r.token); return r; }); } function login(name, pass){ return api('/api/auth/login', { method:'POST', body:{ name:name, pass:pass } }) .then(function(r){ if(r && r.token) setTok(r.token); return r; }); } function logout(){ setTok(''); } /* ---------- 存档 ---------- */ function localSave(){ try{ return JSON.parse(localStorage.getItem('qingyun_save_v1') || 'null'); }catch(_){ return null; } } // 推送:把当前本地存档整体上传(服务端做版本号比较,旧版本不覆盖新版本) function pushNow(){ if(!enabled() || !tok()) return Promise.resolve(null); if(pushing) return Promise.resolve(null); var data = localSave(); if(!data) return Promise.resolve(null); pushing = true; return api('/api/save', { method:'PUT', body:{ save:data, savedAt:Date.now() } }) .then(function(r){ try{ localStorage.setItem(SAVE_KEY_CLOUD, String((r && r.savedAt) || Date.now())); }catch(_){} lastErr = ''; return r; }) .catch(function(e){ lastErr = String(e && e.message || e); console.warn('[cloud] 推送失败,继续用本地存档', lastErr); return null; }) .then(function(r){ pushing = false; return r; }); } function queuePush(){ if(!enabled() || !tok()) return; if(pushTimer) clearTimeout(pushTimer); pushTimer = setTimeout(function(){ pushTimer = null; pushNow(); }, PUSH_DELAY); } // 拉取:仅在"云端比自己新"时覆盖本地,避免把本地进度冲掉 function pullToLocal(){ if(!enabled() || !tok()) return Promise.resolve(null); return api('/api/save', { method:'GET' }) .then(function(r){ if(!r || !r.save) return null; var localAt = Number(localStorage.getItem(SAVE_KEY_CLOUD) || 0); var remoteAt = Number(r.savedAt || 0); var local = localSave(); if(local && remoteAt <= localAt) return null; // 本地不更旧 if(local && !r.force && remoteAt <= localAt) return null; try{ localStorage.setItem('qingyun_save_v1', JSON.stringify(r.save)); localStorage.setItem(SAVE_KEY_CLOUD, String(remoteAt)); }catch(_){} return r.save; }) .catch(function(e){ console.warn('[cloud] 拉取失败', e && e.message); return null; }); } /* ---------- 排行榜(只读展示,可选调用) ---------- */ function leaderboard(kind){ return api('/api/leaderboard?kind=' + encodeURIComponent(kind || 'level')); } /* ---------- 挂到全局 ---------- */ window.QYCloud = { enabled: enabled, base: function(){ return BASE; }, register: register, login: login, logout: logout, token: tok, pushNow: pushNow, pullToLocal: pullToLocal, leaderboard: leaderboard, status: function(){ return { enabled: enabled(), base: BASE, loggedIn: !!tok(), pushing: pushing, lastError: lastErr }; } }; // 把 saveGame 包一层:本地写完再排队上云(不改变原函数行为) if(typeof window.saveGame === 'function'){ var _save = window.saveGame; window.saveGame = function(){ var r = _save.apply(this, arguments); queuePush(); return r; }; } // 启动时先尝试拉云端存档(这里早于进入游戏,正常 loadGame 会用到刚写回的本地存档) if(enabled() && tok()){ pullToLocal(); } })();