🎮ArcadeLab

怪物X联盟 · 官方原版被动技能

by TurboBolt40
487 lines27.1 KB
▶ Play
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>怪物X联盟 · 官方原版被动技能</title>
<style>
  * { margin:0; padding:0; box-sizing:border-box; }
  body {
    font-family:"Microsoft YaHei","PingFang SC",sans-serif;
    background:linear-gradient(135deg,#1a1a2e 0%,#16213e 50%,#0f3460 100%);
    color:#eee; min-height:100vh; padding:8px;
  }
  #app { max-width:840px; margin:0 auto; }
  h1 {
    text-align:center; font-size:22px; margin-bottom:2px;
    background:linear-gradient(90deg,#e94560,#f5a623);
    -webkit-background-clip:text; -webkit-text-fill-color:transparent;
    letter-spacing:2px;
  }
  .subtitle { text-align:center; color:#888; font-size:11px; margin-bottom:10px; }
  .panel {
    background:rgba(255,255,255,0.04); border-radius:12px; padding:10px;
    margin-bottom:8px; border:1px solid rgba(255,255,255,0.06);
  }
  .battlefield { display:flex; justify-content:space-between; align-items:flex-end; gap:8px; }
  .combatant { flex:1; }
  .combatant.foe { text-align:right; }
  .monster-art { font-size:52px; line-height:1; margin:4px 0; filter:drop-shadow(0 4px 6px rgba(0,0,0,.5)); }
  .name-row { display:flex; justify-content:space-between; align-items:center; font-weight:bold; }
  .foe .name-row { flex-direction:row-reverse; }
  .lv { font-size:11px; color:#f5a623; }
  .hp-bar { height:12px; background:#333; border-radius:6px; overflow:hidden; margin:3px 0; border:1px solid rgba(255,255,255,.1); }
  .hp-fill { height:100%; background:linear-gradient(90deg,#2ecc71,#27ae60); transition:width .3s ease; border-radius:6px; }
  .hp-fill.mid { background:linear-gradient(90deg,#f5a623,#e67e22); }
  .hp-fill.low { background:linear-gradient(90deg,#e74c3c,#c0392b); }
  .hp-text { font-size:10px; color:#aaa; }
  .type-badge { display:inline-block; padding:1px 7px; border-radius:10px; font-size:10px; margin-left:5px; color:#fff; }
  .vs { font-size:18px; color:#e94560; align-self:center; font-weight:bold; }
  .skills { display:grid; grid-template-columns:1fr 1fr; gap:5px; margin-top:6px; }
  button {
    font-family:inherit; cursor:pointer; border:none; border-radius:8px;
    padding:8px 9px; font-size:12px; color:#fff; transition:.12s;
    background:rgba(255,255,255,0.08); border:1px solid rgba(255,255,255,0.1);
  }
  button:hover:not(:disabled) { transform:translateY(-1px); filter:brightness(1.15); }
  button:disabled { opacity:.35; cursor:not-allowed; }
  .skill-btn { text-align:left; }
  .skill-btn .pp { float:right; color:#999; font-size:10px; }
  .skill-btn .passive { font-size:9px; color:#f5a623; display:block; margin-top:2px; line-height:1.3; }
  .cat { font-size:9px; padding:1px 5px; border-radius:6px; margin-right:4px; }
  .cat.phys { background:#c0392b; }
  .cat.magic { background:#2980b9; }
  .cat.status { background:#27ae60; }
  .action-row { display:grid; grid-template-columns:repeat(4,1fr); gap:5px; }
  .btn-catch { background:linear-gradient(90deg,#e94560,#c62a74); }
  .btn-bag { background:linear-gradient(90deg,#16a085,#138d75); }
  .btn-run { background:linear-gradient(90deg,#7f8c8d,#636e72); }
  .btn-next { background:linear-gradient(90deg,#2980b9,#1f618d); }
  .log {
    height:100px; overflow-y:auto; font-size:11px; line-height:1.5;
    background:rgba(0,0,0,0.3); border-radius:8px; padding:6px 8px;
  }
  .log p { margin:2px 0; }
  .log .dmg { color:#e74c3c; }
  .log .heal { color:#2ecc71; }
  .log .info { color:#3498db; }
  .log .sys { color:#f5a623; }
  .log .passive { color:#d35400; font-style:italic; }
  .map-bar { display:flex; flex-wrap:wrap; gap:4px; }
  .map-node { padding:3px 7px; border-radius:10px; font-size:10px; background:rgba(255,255,255,0.06); border:1px solid transparent; }
  .map-node.active { border-color:#f5a623; color:#f5a623; }
  .map-node.cleared { color:#2ecc71; }
  .map-node.boss { color:#e94560; font-weight:bold; }
  .team-strip { display:flex; gap:5px; flex-wrap:wrap; }
  .team-member {
    padding:4px 7px; border-radius:8px; font-size:10px;
    background:rgba(255,255,255,0.05); border:1px solid rgba(255,255,255,0.08);
    cursor:pointer; transition:.12s;
  }
  .team-member:hover { border-color:#f5a623; }
  .team-member.active { border-color:#2ecc71; background:rgba(46,204,113,0.12); }
  .team-member.fainted { opacity:.4; }
  .modal-mask {
    position:fixed; inset:0; background:rgba(0,0,0,0.7);
    display:none; align-items:center; justify-content:center; z-index:50; padding:14px;
  }
  .modal-mask.show { display:flex; }
  .modal {
    background:#1a1a2e; border-radius:14px; padding:18px;
    max-width:460px; width:100%; max-height:80vh; overflow-y:auto;
    border:1px solid rgba(255,255,255,0.1);
  }
  .modal h2 { color:#f5a623; margin-bottom:10px; text-align:center; font-size:16px; }
  .close-btn { margin-top:12px; width:100%; background:linear-gradient(90deg,#e94560,#c62a74); }
  .hint { font-size:10px; color:#555; text-align:center; margin-top:5px; }
  .topbar { display:flex; justify-content:space-between; align-items:center; margin-bottom:6px; font-size:12px; }
  .coins { color:#f5a623; font-weight:bold; }
  .toolbar { display:flex; gap:4px; }
  .toolbar button { padding:4px 7px; font-size:10px; }
  .buff-icons { font-size:10px; color:#f5a623; margin-left:4px; }
  @media(max-width:480px){
    .skills,.action-row { grid-template-columns:1fr 1fr; }
    .monster-art { font-size:40px; }
    h1 { font-size:18px; }
  }
</style>
</head>
<body>
<div id="app">
  <h1>⚔️ 怪物X联盟 · 官方原版</h1>
  <div class="subtitle">魁星岛 · 被动技能完全还原</div>

  <div class="panel">
    <div class="topbar">
      <div>🗺️ <span id="stageName">孢子林</span> · 第 <span id="stageIdx">1</span>/<span id="stageTotal">8</span> 关</div>
      <div class="coins">💰 <span id="coins">100</span> | 🧪 <span id="balls">5</span></div>
    </div>
    <div class="map-bar" id="mapBar"></div>
  </div>

  <div class="panel">
    <div class="battlefield">
      <div class="combatant foe">
        <div class="monster-art" id="foeArt">👾</div>
        <div class="name-row">
          <span id="foeName">野生怪物</span>
          <span class="lv">Lv.<span id="foeLv">1</span></span>
        </div>
        <span class="type-badge" id="foeType" style="background:#666">普通</span>
        <div class="hp-bar"><div class="hp-fill" id="foeHpBar"></div></div>
        <div class="hp-text"><span id="foeHp">30</span>/<span id="foeMaxHp">30</span></div>
        <div class="buff-icons" id="foeBuff"></div>
      </div>
      <div class="vs">VS</div>
      <div class="combatant">
        <div class="monster-art" id="myArt">🐣</div>
        <div class="name-row">
          <span id="myName">??</span>
          <span class="lv">Lv.<span id="myLv">1</span></span>
        </div>
        <span class="type-badge" id="myType" style="background:#666">普通</span>
        <div class="hp-bar"><div class="hp-fill" id="myHpBar"></div></div>
        <div class="hp-text"><span id="myHp">30</span>/<span id="myMaxHp">30</span> · EXP <span id="myExp">0</span>/<span id="myNextExp">20</span></div>
        <div class="buff-icons" id="myBuff"></div>
      </div>
    </div>

    <div class="skills" id="skillPanel"></div>

    <div class="action-row" style="margin-top:6px">
      <button class="btn-catch" onclick="doCatch()">🧪 捕捉(<span id="ballCount">5</span>)</button>
      <button class="btn-bag" onclick="usePotion()">🧪 药水(<span id="potions">2</span>)</button>
      <button class="btn-run" onclick="runAway()">🏃 逃跑</button>
      <button class="btn-next" onclick="nextStage()" id="nextBtn" style="display:none">➡️ 下一关</button>
    </div>
  </div>

  <div class="panel">
    <div style="font-size:10px;color:#888;margin-bottom:3px">⚔️ 战斗日志(被动触发橙色高亮)</div>
    <div class="log" id="log"></div>
  </div>

  <div class="panel">
    <div style="font-size:10px;color:#888;margin-bottom:4px">🎒 我的队伍</div>
    <div class="team-strip" id="teamStrip"></div>
    <div class="toolbar" style="margin-top:6px">
      <button onclick="openDex()">📖 图鉴</button>
      <button onclick="openHelp()">❓ 玩法</button>
      <button onclick="resetGame()">🔄 重置</button>
    </div>
    <div class="hint">💡 飞叶快刀:攻击时25%几率+物攻8%(满级16%),完全还原官方</div>
  </div>
</div>

<div class="modal-mask" id="modalMask">
  <div class="modal" id="modalContent"></div>
</div>

<script>
/* ============ 系别 / 相克 ============ */
const TYPES = {
  火:{color:'#e74c3c'}, 水:{color:'#3498db'}, 草:{color:'#2ecc71'},
  电:{color:'#f5d020'}, 地:{color:'#b9770e'}, 飞行:{color:'#a8e6cf'},
  格斗:{color:'#e67e22'}, 超能:{color:'#9b59b6'}, 鬼:{color:'#34495e'},
  龙:{color:'#e84393'}, 普通:{color:'#95a5a6'}
};
const WEAK = {
  火:['草','飞行'], 水:['火','地'], 草:['水','地'],
  电:['水','飞行'], 地:['电','火','格斗'], 飞行:['草','虫'],
  格斗:['普通','超能'], 超能:['格斗','鬼'], 鬼:['超能','鬼'],
  龙:['龙'], 普通:[]
};
function typeMult(atk, def){
  if(WEAK[atk] && WEAK[atk].includes(def)) return 1.2;
  if(WEAK[def] && WEAK[def].includes(atk)) return 0.6;
  return 1.0;
}

/* ============ 官方原版技能数据(据《怪物X联盟》官网技能大全) ============
   passive 结构:
   { trigger:'attack'|'defend'|'enter'|'anytime',
     chance: 触发概率(%),
     effect: 'atk_up'|'matk_up'|'def_up'|'mdef_up'|'spd_up'|'heal'|'enemy_atk_down'|'extra_action'|'crit'|'evade',
     value: 百分比或数值,
     turns: 持续回合(1=单次),
     isMagic: 是否魔法类加成 }
*/
const SKILLS = {
  // —— 通用技能(官网数据)——
  撞击:{cat:'phys', power:18, pp:25, type:'普通', desc:'基础物理攻击',
    passive:{trigger:'attack', chance:20, effect:'atk_up', value:21, turns:1, isMagic:false}},
  拍打:{cat:'phys', power:16, pp:25, type:'普通', desc:'拍打攻击',
    passive:{trigger:'attack', chance:20, effect:'atk_up', value:15, turns:1, isMagic:false}},
  爪击:{cat:'phys', power:18, pp:25, type:'普通', desc:'爪击',
    passive:{trigger:'attack', chance:20, effect:'atk_up', value:15, turns:1, isMagic:false}},
  连环踢:{cat:'phys', power:18, pp:25, type:'普通', desc:'连续踢击',
    passive:{trigger:'attack', chance:20, effect:'atk_up', value:15, turns:1, isMagic:false}},
  万吨重拳:{cat:'phys', power:30, pp:10, type:'普通', desc:'重拳出击',
    passive:{trigger:'attack', chance:18, effect:'atk_up', value:50, turns:1, isMagic:false}},
  大巴掌:{cat:'phys', power:22, pp:18, type:'普通', desc:'大力巴掌',
    passive:{trigger:'attack', chance:20, effect:'atk_up', value:20, turns:1, isMagic:false}},
  瞬影斩:{cat:'phys', power:25, pp:15, type:'dark', desc:'幻影斩击',
    passive:{trigger:'attack', chance:40, effect:'atk_up', value:14, turns:1, isMagic:false}},
  血饮:{cat:'phys', power:25, pp:12, type:'鬼', desc:'吸取生命',
    passive:{trigger:'attack', chance:50, effect:'heal', value:9, turns:1, isMagic:false}},
  秘法爆表:{cat:'magic', power:25, pp:15, type:'超能', desc:'魔法爆发',
    passive:{trigger:'attack', chance:36, effect:'matk_up', value:13, turns:1, isMagic:true}},
  魔能崩坏:{cat:'magic', power:30, pp:8, type:'超能', desc:'削弱魔防',
    passive:{trigger:'attack', chance:66, effect:'enemy_mdef_down', value:34, turns:4, isMagic:true}},
  次元破碎:{cat:'magic', power:40, pp:5, type:'超能', desc:'次元力量',
    passive:{trigger:'attack', chance:36, effect:'matk_up', value:100, turns:1, isMagic:true}},
  激怒:{cat:'status', power:0, pp:10, type:'普通', desc:'防御时激怒',
    passive:{trigger:'defend', chance:8, effect:'crit', value:100, turns:3, isMagic:false}},
  弹性皮肤:{cat:'status', power:0, pp:15, type:'普通', desc:'防御时加物防',
    passive:{trigger:'defend', chance:15, effect:'def_up', value:20, turns:3, isMagic:false}},
  硬邦邦:{cat:'status', power:0, pp:15, type:'普通', desc:'防御时加物防',
    passive:{trigger:'defend', chance:18, effect:'def_up', value:25, turns:3, isMagic:false}},
  铁甲:{cat:'status', power:0, pp:15, type:'普通', desc:'防御时加物防',
    passive:{trigger:'defend', chance:21, effect:'def_up', value:30, turns:3, isMagic:false}},
  摇摆:{cat:'status', power:0, pp:15, type:'普通', desc:'降低敌人物防',
    passive:{trigger:'anytime', chance:15, effect:'enemy_def_down', value:20, turns:3, isMagic:false}},
  吼叫:{cat:'status', power:0, pp:15, type:'普通', desc:'降低敌人物攻',
    passive:{trigger:'anytime', chance:15, effect:'enemy_atk_down', value:20, turns:3, isMagic:false}},
  天怒:{cat:'status', power:0, pp:5, type:'普通', desc:'进场加物攻',
    passive:{trigger:'enter', chance:80, effect:'atk_up', value:10, turns:65535, isMagic:false}},
  血性狂暴:{cat:'status', power:0, pp:5, type:'普通', desc:'进场加物攻',
    passive:{trigger:'enter', chance:80, effect:'atk_up', value:15, turns:65535, isMagic:false}},

  // —— 草系技能(官网数据)——
  藤鞭:{cat:'phys', power:18, pp:25, type:'草', desc:'藤蔓抽击',
    passive:{trigger:'attack', chance:25, effect:'atk_up', value:4, turns:1, isMagic:false}},
  飞叶快刀:{cat:'phys', power:22, pp:20, type:'草', desc:'锋利叶刃',
    passive:{trigger:'attack', chance:25, effect:'atk_up', value:8, turns:1, isMagic:false}},
  刀叶:{cat:'phys', power:26, pp:15, type:'草', desc:'刀刃叶片',
    passive:{trigger:'attack', chance:25, effect:'atk_up', value:20, turns:1, isMagic:false}},
  种子炸弹:{cat:'magic', power:24, pp:15, type:'草', desc:'种子爆破',
    passive:{trigger:'attack', chance:20, effect:'matk_up', value:16, turns:1, isMagic:true}},
  阳光烈焰:{cat:'magic', power:45, pp:8, type:'草', desc:'日光能量',
    passive:{trigger:'attack', chance:20, effect:'matk_up', value:30, turns:1, isMagic:true}},
  飞叶风暴:{cat:'status', power:0, pp:5, type:'草', desc:'进场加物攻',
    passive:{trigger:'enter', chance:100, effect:'atk_up', value:8, turns:65535, isMagic:false}},
  吸取:{cat:'magic', power:20, pp:15, type:'草', desc:'吸取生命',
    passive:{trigger:'attack', chance:10, effect:'heal', value:2, turns:10, isMagic:true}},
  究极吸取:{cat:'magic', power:35, pp:8, type:'草', desc:'强力吸取',
    passive:{trigger:'attack', chance:10, effect:'heal', value:5, turns:6, isMagic:true}},
  麻醉粉:{cat:'status', power:0, pp:10, type:'草', desc:'使敌人麻醉',
    passive:{trigger:'anytime', chance:10, effect:'enemy_skip', value:1, turns:1, isMagic:false}},
  催眠粉:{cat:'status', power:0, pp:8, type:'草', desc:'使敌人催眠',
    passive:{trigger:'anytime', chance:20, effect:'enemy_skip', value:1, turns:1, isMagic:false}},
  滋养:{cat:'status', power:0, pp:10, type:'草', desc:'恢复生命',
    passive:{trigger:'anytime', chance:7, effect:'heal', value:4, turns:5, isMagic:false}},
  愈合:{cat:'status', power:0, pp:8, type:'草', desc:'治疗伤口',
    passive:{trigger:'anytime', chance:10, effect:'heal_once', value:10, turns:1, isMagic:false}},
  能量护盾:{cat:'status', power:0, pp:15, type:'草', desc:'防御时加魔防',
    passive:{trigger:'defend', chance:30, effect:'mdef_up', value:20, turns:1, isMagic:true}},

  // —— 火系技能 ——
  火花:{cat:'magic', power:22, pp:20, type:'火', desc:'小型火焰',
    passive:{trigger:'attack', chance:10, effect:'burn', value:10, turns:3, isMagic:true}},
  喷射火焰:{cat:'magic', power:40, pp:10, type:'火', desc:'喷射烈焰',
    passive:{trigger:'attack', chance:15, effect:'burn', value:15, turns:3, isMagic:true}},
  浴火重生:{cat:'status', power:0, pp:8, type:'火', desc:'防御时回血',
    passive:{trigger:'defend', chance:10, effect:'heal_once', value:15, turns:1, isMagic:false}},
  火焰之舞:{cat:'magic', power:35, pp:12, type:'火', desc:'火焰之舞',
    passive:{trigger:'attack', chance:15, effect:'matk_up', value:20, turns:1, isMagic:true}},

  // —— 水系技能 ——
  水枪:{cat:'magic', power:22, pp:20, type:'水', desc:'高压水流',
    passive:{trigger:'attack', chance:12, effect:'enemy_atk_down', value:10, turns:3, isMagic:true}},
  冲浪:{cat:'magic', power:40, pp:10, type:'水', desc:'巨浪拍击',
    passive:{trigger:'attack', chance:15, effect:'enemy_atk_down', value:15, turns:3, isMagic:true}},

  // —— 电系技能 ——
  电击:{cat:'magic', power:22, pp:20, type:'电', desc:'电流冲击',
    passive:{trigger:'attack', chance:8, effect:'paralyze', value:1, turns:2, isMagic:true}},
  十万伏特:{cat:'magic', power:42, pp:10, type:'电', desc:'雷电轰击',
    passive:{trigger:'attack', chance:12, effect:'paralyze', value:1, turns:2, isMagic:true}},

  // —— 飞行系技能 ——
  啄击:{cat:'phys', power:20, pp:22, type:'飞行', desc:'尖喙啄击', passive:null},
  空气斩:{cat:'phys', power:38, pp:12, type:'飞行', desc:'空气刃',
    passive:{trigger:'attack', chance:10, effect:'enemy_skip', value:1, turns:1, isMagic:false}},

  // —— 格斗系技能 ——
  空手切:{cat:'phys', power:20, pp:22, type:'格斗', desc:'手刀',
    passive:{trigger:'attack', chance:20, effect:'atk_up', value:15, turns:1, isMagic:false}},
  爆裂拳:{cat:'phys', power:24, pp:18, type:'格斗', desc:'爆裂拳击',
    passive:{trigger:'attack', chance:20, effect:'crit', value:30, turns:1, isMagic:false}},
  气合拳:{cat:'phys', power:42, pp:10, type:'格斗', desc:'蓄力拳',
    passive:{trigger:'attack', chance:25, effect:'crit', value:40, turns:1, isMagic:false}},
  连击:{cat:'phys', power:18, pp:15, type:'格斗', desc:'连续攻击',
    passive:{trigger:'attack', chance:10, effect:'extra_action', value:1, turns:1, isMagic:false}},
  格斗领域:{cat:'status', power:0, pp:5, type:'格斗', desc:'进场加速',
    passive:{trigger:'enter', chance:80, effect:'spd_up', value:20, turns:65535, isMagic:false}},

  // —— 超能系技能 ——
  念力:{cat:'magic', power:22, pp:20, type:'超能', desc:'精神冲击',
    passive:{trigger:'attack', chance:20, effect:'matk_up', value:15, turns:1, isMagic:true}},
  精神波动:{cat:'magic', power:24, pp:18, type:'超能', desc:'精神波',
    passive:{trigger:'attack', chance:20, effect:'matk_up', value:15, turns:1, isMagic:true}},
  冥想:{cat:'status', power:0, pp:15, type:'超能', desc:'冥想聚气',
    passive:{trigger:'attack', chance:15, effect:'matk_up', value:20, turns:1, isMagic:true}},
  神圣光幕:{cat:'status', power:0, pp:5, type:'超能', desc:'进场加魔攻',
    passive:{trigger:'enter', chance:80, effect:'matk_up', value:10, turns:65535, isMagic:true}},

  // —— 鬼系技能 ——
  暗影拳:{cat:'magic', power:22, pp:20, type:'鬼', desc:'幽冥拳',
    passive:{trigger:'attack', chance:20, effect:'matk_up', value:15, turns:1, isMagic:true}},
  暗影球:{cat:'magic', power:40, pp:10, type:'鬼', desc:'怨念球',
    passive:{trigger:'attack', chance:20, effect:'lifesteal', value:30, turns:1, isMagic:true}},
  诅咒:{cat:'magic', power:25, pp:12, type:'鬼', desc:'诅咒',
    passive:{trigger:'attack', chance:15, effect:'enemy_atk_down', value:25, turns:6, isMagic:true}},

  // —— 地系技能 ——
  震级:{cat:'phys', power:24, pp:18, type:'地', desc:'地震',
    passive:{trigger:'attack', chance:10, effect:'enemy_atk_down', value:15, turns:3, isMagic:false}},
  大地之力:{cat:'magic', power:42, pp:10, type:'地', desc:'地脉能量',
    passive:{trigger:'attack', chance:15, effect:'atk_up', value:20, turns:1, isMagic:false}},

  // —— 龙系技能 ——
  龙息:{cat:'magic', power:24, pp:18, type:'龙', desc:'龙之吐息',
    passive:{trigger:'attack', chance:15, effect:'atk_up', value:25, turns:1, isMagic:false}},
  龙星群:{cat:'magic', power:45, pp:8, type:'龙', desc:'流星雨',
    passive:{trigger:'attack', chance:20, effect:'matk_up', value:30, turns:1, isMagic:true}},

  // —— 辅助技能 ——
  铁壁:{cat:'status', power:0, pp:15, type:'普通', desc:'自身物防+',
    passive:{trigger:'defend', chance:100, effect:'def_up', value:5, turns:1, isMagic:false}},
  治愈:{cat:'status', power:0, pp:8, type:'普通', desc:'恢复30%HP',
    passive:{trigger:'anytime', chance:100, effect:'heal_once', value:30, turns:1, isMagic:false}}
};

// 宠物模板(基于官方图鉴数据)
const SPECIES = {
  喇叭芽:{tier:'D', type:'草', base:{hp:30,atk:33,def:23,spd:29,matk:32,mdef:19},
    art:'🌱', skills:['飞叶快刀','撞击'], evolveTo:'食人花', evolveLv:12, habitat:'孢子林'},
  花蜗牛:{tier:'C', type:'草', base:{hp:43,atk:41,def:45,spd:29,matk:22,mdef:28},
    art:'🐌', skills:['飞叶快刀','弹性皮肤','种子炸弹'], evolveTo:null, evolveLv:0, habitat:'神秘林'},
  大食叶:{tier:'C', type:'草', base:{hp:43,atk:50,def:20,spd:23,matk:33,mdef:30},
    art:'🌿', skills:['吸取','飞叶快刀'], evolveTo:null, evolveLv:0, habitat:'巨兽矿野'},
  火炮喇叭:{tier:'B', type:'草', base:{hp:44,atk:61,def:30,spd:41,matk:31,mdef:39},
    art:'🌻', skills:['连环踢','飞叶快刀','阳光烈焰'], evolveTo:null, evolveLv:0, habitat:'太阳井'},
  食人花:{tier:'B', type:'草', base:{hp:49,atk:66,def:30,spd:38,matk:43,mdef:42},
    art:'🌺', skills:['吸取','飞叶快刀','究极吸取','种子炸弹'], evolveTo:null, evolveLv:0, habitat:'远征哨岗'},
  洋葱头:{tier:'A', type:'格斗', base:{hp:45,atk:75,def:58,spd:40,matk:43,mdef:58},
    art:'🥷', skills:['空手切','反击','十字拳','格斗领域'], evolveTo:null, evolveLv:0, habitat:'远古墓地'},
  凤凰花:{tier:'A', type:'火', base:{hp:45,atk:52,def:45,spd:39,matk:72,mdef:60},
    art:'🌻', skills:['藤鞭','摇摆','究极吸取','火焰之舞','浴火重生'], evolveTo:null, evolveLv:0, habitat:'太阳井'},
  孔雀花:{tier:'A', type:'草', base:{hp:41,atk:49,def:41,spd:32,matk:57,mdef:50},
    art:'🦚', skills:['藤鞭','摇摆','究极吸取','阳光烈焰'], evolveTo:null, evolveLv:0, habitat:'裂赤峡谷'},
  蕾丝朵:{tier:'A', type:'草', base:{hp:42,atk:51,def:46,spd:27,matk:56,mdef:48},
    art:'🌸', skills:['吸取','种子炸弹','阳光烈焰','草之誓言'], evolveTo:null, evolveLv:0, habitat:'天堂城'},
  女王贵妇:{tier:'A', type:'草', base:{hp:50,atk:60,def:53,spd:34,matk:66,mdef:60},
    art:'👑', skills:['吸取','种子炸弹','阳光烈焰','草之誓言'], evolveTo:null, evolveLv:0, habitat:'天堂城'},
  劲帕奇:{tier:'A', type:'飞行', base:{hp:40,atk:68,def:38,spd:57,matk:62,mdef:48},
    art:'🦅', skills:['电击','十万伏特','空气斩'], evolveTo:null, evolveLv:0, habitat:'天域'},
  仙人掌:{tier:'A', type:'格斗', base:{hp:41,atk:76,def:56,spd:39,matk:42,mdef:56},
    art:'🌵', skills:['爆裂拳','气合拳','连击'], evolveTo:null, evolveLv:0, habitat:'远古墓地'},
  不死鸟:{tier:'B', type:'火', base:{hp:36,atk:35,def:35,spd:38,matk:54,mdef:50},
    art:'🐦🔥', skills:['火花','喷射火焰','治愈'], evolveTo:null, evolveLv:0, habitat:'赫里奥斯'},
  魅灵:{tier:'B', type:'鬼', base:{hp:40,atk:32,def:39,spd:50,matk:61,mdef:37},
    art:'👻', skills:['暗影拳','暗影球','念力'], evolveTo:null, evolveLv:0, habitat:'弗瑞斯'},
  双角巨龙:{tier:'S', type:'龙', base:{hp:55,atk:58,def:56,spd:50,matk:70,mdef:58},
    art:'🐲', skills:['龙息','龙星群','大地之力'], evolveTo:null, evolveLv:0, habitat:'神秘林'},
  霹雳弹:{tier:'S', type:'电', base:{hp:28,atk:8,def:40,spd:20,matk:200,mdef:40},
    art:'💣', skills:['电击','十万伏特','精神波动'], evolveTo:null, evolveLv:0, habitat:'虚无之地'},
  泰坦:{tier:'S', type:'普通', base:{hp:70,atk:68,def:62,spd:35,matk:52,mdef:44},
    art:'🗿', skills:['撞击','万吨重拳','铁甲','天怒'], evolveTo:null, evolveLv:0, habitat:'天堂城'}
};

const STAGES = [
  {name:'孢子林', wilds:['喇叭芽','花蜗牛','大食叶'], lvRange:[1,3], boss:null},
  {name:'神秘林', wilds:['花蜗牛','大食叶','喇叭芽'], lvRange:[4,6], boss:{species:'双角巨龙', lv:8}},
  {name:'巨兽矿野', wilds:['大食叶','火炮喇叭'], lvRange:[7,9], boss:null},
  {name:'远征哨岗', wilds:['食人花','火炮喇叭'], lvRange:[10,12], boss:null},
  {name:'太阳井', wilds:['凤凰花','火炮喇叭','不死鸟'], lvRange:[13,15], boss:{species:'凤凰花', lv:16}},
  {name:'赫里奥斯', wilds:['不死鸟','凤凰花'], lvRange:[16,18], boss:null},
  {name:'天域', wilds:['劲帕奇','不死鸟'], lvRange:[18,20], boss:null},
  {name:'龙之首脊', wilds:['劲帕奇','魅灵','双角巨龙'], lvRange:[20,22], boss:{species:'双角巨龙', lv:25}}
];

/* ============ 游戏状态 ============ */
let G = null;
function defaultState(){
  const starter = makeMon('喇叭芽', 1);
  return {
    stage:0, coins:100, balls:5, potions:2,
    team:[starter], active:0,
    cleared:new Array(STAGES.length).fill(false),
    dex:{}, dexSeen:{}
  };
}

function makeMon(speciesName, lv){
  const sp = SPECIES[speciesName];
  const b = sp.base;
  const mult = 1 + (lv-1)*0.12;
  return {
    species:speciesName, lv, type:sp.type, tier:sp.tier, art:sp.art,
    maxHp: Math.floor(b.hp * mult), hp: Math.floor(b.hp * mult),
    atk: Math.floor(b.atk * mult), def: Math.floor(b.def * mult),
    matk: Math.floor(b.matk * mult), mdef: Math.floor(b.mdef * mult),
    spd: Math.floor(b.spd * mult),
    exp:0, nextExp: 20 + lv*10,
    skills: sp.skills.map(n => ({name:n, ...SKILLS[n], maxpp:SKILLS[n].pp, pp:SKILLS[n].pp})),
    buffs:{atk:0, def:0, matk:0, mdef:0, spd:0},
    buffTurns:{},
    status:{}
  };
}

function rand(a,b){ return Math.floor(Math.random()*(b-a+1))+a; }
function clamp(v,a,b){ return Math.max(a,Math.min(b,v)); }

/* ============ 战斗逻辑 ============ */
let foe = null, inBattle = false, busy = false;

function getStat(m, stat){
  const base = m[stat];
  const buff = m.buffs[stat] || 0;
  return base + buff;
}

function calcDamage(attacker, defender, skill){
  const atkStat = skill.cat==='phys' ? getStat(attacker,'atk') : getStat(attacker,'matk');
  const defStat = skill.cat==='phys' ? getStat(defender,'def') : getStat(defender,'mdef');
  let dmg = skill.power * (atkStat / Math.max(1, defStat)) * 0.8;
  dmg *= typeMult(skill.type, defender.type);
  dmg *= 0.85 + Math.random()*0.3;
  return Math.max(1, Math.floor(dmg));
}

function logMsg(msg, cls=''){
  const el = document.getElementById('log');
  const p = document.createElement('p');
  p.className = cls; p.textContent = msg;
  el.appendChild(p); el.scrollTop = el.scrollHeight;
}

function applyPassive(user, enemy, skill, dmgDealt){
  const p = skill.passive;
  if(!p) return;
  // 触发判定
  if(Math.random()*100 > p.chance) return;

  switch(p.effect){
    case 'atk_up': {
      const boost = Math.floor(getStat(user,'atk') * p.value / 100);
      user.buffs.atk += boost;
      logMsg(`  🎯【被动】${skill.name}触发:${user.species}物攻+${boost}!`, 'passive');
      break;
    }
    case 'matk_up': {
      const boost = Math.floor(getStat(user,'matk') * p.value / 100);
      user.buffs.matk += boost;
      logMsg(`  🎯【被动】${skill.name}触发:${user.species}魔攻+${boost}!`, 'passive');
      break;
    }
    case 'def_up': {
      const boost = Math.floor(getStat(user,'def') * p.value / 100);
      user.buffs.def += boost;
      logMsg(`  🎯【被动】${skill.name}触发:${user.species}物防+${boost}!`, 'passive');
      break;
    }
    case 'mdef_up': {

Game Source: 怪物X联盟 · 官方原版被动技能

Creator: TurboBolt40

Libraries: none

Complexity: complex (487 lines, 27.1 KB)

The full source code is displayed above on this page.

Remix Instructions

To remix this game, copy the source code above and modify it. Add a ARCADELAB header at the top with "remix_of: x-turbobolt40-mt38qine" to link back to the original. Then publish at arcadelab.ai/publish.