🎮ArcadeLab

熊出没·森林求生记

by TurboTurtle24
585 lines27.5 KB
▶ Play
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>熊出没·森林求生记</title>
    <style>
        *{box-sizing:border-box;margin:0;padding:0;font-family:"Microsoft Yahei",monospace}
        body{background:#1a2418;color:#e6e2c3;padding:16px;min-height:100vh}
        .container{max-width:700px;margin:0 auto;background:#2c382a;padding:20px;border-radius:10px;border:2px solid #8b7355}
        .title{text-align:center;font-size:22px;color:#ffd770;margin-bottom:16px}
        .role-tag{text-align:center;color:#948064;font-size:14px;margin-bottom:10px}
        .status-bar{display:flex;justify-content:space-between;font-size:14px;color:#c8c29e;margin-bottom:12px;padding-bottom:8px;border-bottom:1px solid #55604f;flex-wrap:wrap;gap:8px}
        #text-box{min-height:280px;white-space:pre-wrap;line-height:1.7;font-size:16px;margin-bottom:20px}
        .option-item{background:#44523f;margin:8px 0;padding:12px 14px;border-radius:6px;border:1px solid #948064;cursor:pointer;transition:0.2s}
        .option-item:hover{background:#586852}
        .modal{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.85);display:none;align-items:center;justify-content:center;padding:20px;z-index:99}
        .modal-box{background:#2c382a;padding:24px;border-radius:10px;border:2px solid #ffd770;max-width:500px;width:100%;max-height:85vh;overflow-y:auto}
        .modal-title{font-size:20px;color:#ffd770;margin-bottom:12px;text-align:center}
        .modal-content{margin-bottom:18px;line-height:1.7;white-space:pre-wrap}
        .modal-btn{padding:10px 20px;background:#6b5438;color:#fff;border:none;border-radius:6px;cursor:pointer;margin:4px}
        .achievement-toast{position:fixed;top:20px;right:20px;background:#382b1c;color:#ffd770;padding:10px 14px;border-radius:6px;opacity:0;transition:0.4s;z-index:999}
        .tab-area{margin-top:12px;display:flex;gap:8px;flex-wrap:wrap;justify-content:center}
        .tab-btn{padding:8px 12px;margin:4px;background:#44523f;border:1px solid #948064;color:#e6e2c3;border-radius:4px;cursor:pointer}
    </style>
</head>
<body>
<div class="container">
    <div class="title">熊出没·森林求生记</div>
    <div class="role-tag" id="role-tag">选择角色开启冒险</div>
    <div class="status-bar">
        <div>体力:<span id="hp">100</span></div>
        <div id="favor-box" style="display:none">熊二好感:<span id="favor">60</span></div>
        <div id="wake-box" style="display:none">苏醒值:<span id="wake">0</span>/100</div>
        <div>已解锁成就:<span id="ach-count">0</span>/20</div>
    </div>
    <div id="text-box"></div>
    <div id="option-wrap"></div>
    <div class="tab-area">
        <button class="tab-btn" onclick="showAchievement()">查看成就图鉴</button>
        <button class="tab-btn" onclick="showEnding()">查看结局图鉴</button>
        <button class="tab-btn" onclick="backToSelect()">返回角色选择</button>
    </div>
</div>

<div class="modal" id="modal">
    <div class="modal-box">
        <div class="modal-title" id="modal-title"></div>
        <div class="modal-content" id="modal-body"></div>
        <div style="text-align:center">
            <button class="modal-btn" onclick="closeModal()">关闭</button>
            <button class="modal-btn" id="restart-btn" onclick="restartSameRole()" style="display:none">再来一次</button>
        </div>
    </div>
</div>

<div class="achievement-toast" id="toast"></div>

<script>
const gameData={
    hp:100,
    favor:60,
    wake:0,
    role:'',
    achievements:{
        bee_stung:{name:"蜜蜂受害者",desc:"被蜜蜂蛰伤游戏失败",unlock:false},
        tree_crush:{name:"大树压身",desc:"逃跑被砍倒的大树砸中",unlock:false},
        trap_master:{name:"陷阱大师",desc:"让熊二掉入陷阱",unlock:false},
        boss_angry:{name:"被李老板开除",desc:"接电话气喘被李老板嫌弃",unlock:false},
        ignore_call:{name:"无视老板",desc:"不接李老板电话依旧被开除",unlock:false},
        boss_impressed:{name:"老板赏识",desc:"把手机丢给狗熊获得李老板认可",unlock:false},
        nut_throw:{name:"坚果引诱",desc:"用坚果引开狗熊",unlock:false},
        mirror_trick:{name:"镜中幻象",desc:"用镜子迷惑狗熊",unlock:false},
        toy_car:{name:"玩具诱惑",desc:"丢玩具车吸引狗熊注意力",unlock:false},
        kind_heart:{name:"好心肠",desc:"捡到松果赠予狗熊",unlock:false},
        negotiate_expert:{name:"谈判专家",desc:"和狗熊和平谈判成功",unlock:false},
        dance_bear:{name:"与熊共舞",desc:"达成隐藏结局",unlock:false},
        wood_king:{name:"伐木工之王",desc:"成功砍树逃离森林",unlock:false},
        rescue_fail:{name:"营救失败",desc:"熊二被光头强抓走,营救失败",unlock:false},
        rescue_ok:{name:"救弟英雄",desc:"成功救出熊二",unlock:false},
        good_bro:{name:"俺们是好兄弟",desc:"熊二好感度达到80以上",unlock:false},
        full_stomach:{name:"满载而归",desc:"成功找到食物回到树洞",unlock:false},
        forest_guard:{name:"森林守护者",desc:"赶走光头强救下小动物",unlock:false},
        trash_king:{name:"最强垃圾桶",desc:"幻觉里什么都吃",unlock:false},
        air_bear:{name:"第一熊",desc:"靠空气就能转化能量",unlock:false},
        steal_success:{name:"偷粮大师",desc:"成功从光头强家偷走食物",unlock:false}
    },
    endings:{
        e1:{name:"结局1:蜂蛰惨败",desc:"敲下蜂蜜,被蜜蜂群蛰伤,游戏失败",unlock:false},
        e2:{name:"结局2:大树之灾",desc:"慌忙逃跑,被自己砍倒的大树砸中",unlock:false},
        e3:{name:"结局3:陷阱妙计",desc:"熊二落入陷阱,暂时脱险",unlock:false},
        e4:{name:"结局4:老板暴怒",desc:"接电话气喘吁吁,直接被李老板开除",unlock:false},
        e5:{name:"结局5:拒绝工作",desc:"不接电话,依旧被李老板开除",unlock:false},
        e6:{name:"结局6:老板看好",desc:"把手机扔给狗熊,得到李老板赏识",unlock:false},
        e7:{name:"结局7:坚果脱身",desc:"用坚果引走狗熊,安全离开",unlock:false},
        e8:{name:"结局8:镜子迷惑",desc:"镜子迷惑狗熊,侥幸脱身",unlock:false},
        e9:{name:"结局9:玩具诱敌",desc:"玩具车吸引狗熊,成功逃走",unlock:false},
        e10:{name:"结局10:和平谈判",desc:"交出松果,和狗熊达成和平协议",unlock:false},
        e11:{name:"隐藏结局:与熊共舞",desc:"放弃砍树,和狗熊在森林快乐玩耍",unlock:false},
        b1:{name:"熊线结局1:平淡兄弟",desc:"好感不足40,救出熊二但关系变淡",unlock:false},
        b2:{name:"熊线结局2:老样子",desc:"好感40-80,兄弟还是老样子",unlock:false},
        b3:{name:"熊线结局3:俺们是好兄弟",desc:"好感80+,过命的好兄弟",unlock:false},
        b4:{name:"熊线结局4:满载而归",desc:"找到食物顺利回树洞",unlock:false},
        b5:{name:"熊线结局5:森林守护者",desc:"赶走光头强救下小动物",unlock:false},
        b6:{name:"熊线结局6:饿死树洞",desc:"躺平不找吃的,最后饿死",unlock:false},
        b7:{name:"熊线结局7:最强垃圾桶",desc:"幻觉里什么都往嘴里塞",unlock:false},
        b8:{name:"熊线结局8:空气第一熊",desc:"靠呼吸就能活,熊界传奇",unlock:false},
        b9:{name:"熊线结局9:落荒而逃",desc:"潜入被发现,被肥波赶跑",unlock:false},
        b10:{name:"熊线结局10:偷粮大师",desc:"成功从光头强家偷走食物",unlock:false},
        b11:{name:"熊线结局11:惊醒光头强",desc:"动静太大被光头强抓住",unlock:false}
    },
    currentNode:"select_role"
}

const selectNode={
    text:"欢迎来到狗熊岭!\n你想扮演谁开始冒险?",
    options:[
        {text:"扮演光头强:砍树求生大冒险",next:"start_ggq",role:"ggq"},
        {text:"扮演熊大:树洞觅食大作战",next:"start_xiongda",role:"xiongda"}
    ]
}

const ggqNodes={
    start_ggq:{
        text:"【开篇】\n你是光头强,正在森林里砍树。刚把大树砍得摇摇欲坠,忽然听见沉重的脚步声。\n熊二慢悠悠出现在你的面前,眼睛直勾勾盯着树上的蜂蜜蜂巢。\n你现在面临三个选择:",
        options:[
            {text:"1.敲下树上蜂蜜送给熊二,把他引走",next:"opt1_bee"},
            {text:"2.转身直接拼命逃走",next:"opt2_tree"},
            {text:"3.原地不动,静观其变",next:"opt3_trap"}
        ]
    },
    opt1_bee:{
        text:"你举起斧头,狠狠敲向树上的蜂巢。\n“哗啦!”蜂巢掉落,大量蜜蜂倾巢而出!\n无数蜜蜂朝着你疯狂扑过来,你被蛰得浑身是包,痛得倒地不起。",
        options:[],
        end:"e1",
        ach:["bee_stung"]
    },
    opt2_tree:{
        text:"你二话不说扭头狂奔。可你刚刚砍的大树失去支撑轰然倒下!\n大树朝着你的方向砸落,你来不及躲闪,被大树狠狠压住,动弹不得。",
        options:[],
        end:"e2",
        ach:["tree_crush"]
    },
    opt3_trap:{
        text:"你站在原地没有乱动。熊二看见你,大吼一声朝着你猛冲过来!\n他完全没有注意脚下,一脚踩空,“扑通”一声掉进你之前布置好的大坑陷阱里,在坑底嗷嗷大叫。\n熊二被困住,你趁机赶紧往后跑。没跑多远,熊大从树林里冲出来,两只狗熊开始追赶你!\n就在这时,你的手机响了,是李老板打来的电话。",
        options:[
            {text:"1.接电话,和李老板说话",next:"call_ans"},
            {text:"2.直接不接电话,继续逃跑",next:"call_ignore"},
            {text:"3.接起电话,把手机扔向两只狗熊",next:"call_throw"}
        ],
        ach:["trap_master"]
    },
    call_ans:{
        text:"你一边大口喘气一边接起电话,跑得上气不接下气,说话断断续续。\n李老板在电话那头听你气喘吁吁,听不清你在说什么,十分不满。\n“光头强!你干什么呢!干活一点都不专心,你被开除了!”\n电话直接挂断,你失去工作。",
        options:[],
        end:"e4",
        ach:["boss_angry"]
    },
    call_ignore:{
        text:"你无视手机铃声,只顾拼命逃跑。\n李老板反复打了好几次电话,一直无人接听。\n没过多久,收到短信通知:光头强,你不用再来干活了,你被开除。",
        options:[],
        end:"e5",
        ach:["ignore_call"]
    },
    call_throw:{
        text:"你迅速接起电话,反手一把将手机朝着狗熊的方向扔过去!\n手机落在熊大面前,李老板的声音从手机传出。\n熊大、熊二对着手机吼叫,阵阵熊叫声传到电话那头。\n李老板听完大喜:“光头强!你居然在和狗熊搏斗!太英勇了!好好干!”\n电话挂断,李老板对你十分看好。\n两只狗熊被手机吸引,暂时放缓追击。你来到一片林间空地,手上有三样东西:一袋坚果、一面小镜子、一辆玩具小汽车。你可以选一样用来引开狗熊。",
        options:[
            {text:"1.抛出坚果袋,用坚果引走狗熊",next:"nut_escape"},
            {text:"2.举起镜子,利用反光迷惑狗熊",next:"mirror_escape"},
            {text:"3.扔出玩具小汽车吸引狗熊",next:"toy_escape"}
        ],
        ach:["boss_impressed"]
    },
    nut_escape:{
        text:"你把一袋坚果全部丢出去。坚果散落一地。\n熊大、熊二闻到食物气味,立刻被坚果吸引过去,埋头吃坚果,不再追赶你。\n你趁机快步离开森林,成功脱身。",
        options:[],
        end:"e7",
        ach:["nut_throw"]
    },
    mirror_escape:{
        text:"你举起小镜子,阳光反射出刺眼亮光,照向两只狗熊。\n狗熊被强光晃得睁不开眼,慌乱后退。\n趁着狗熊混乱的间隙,你抓紧机会逃离这片树林。",
        options:[],
        end:"e8",
        ach:["mirror_trick"]
    },
    toy_escape:{
        text:"你把玩具小汽车扔出去,小车飞快向前跑动。\n熊大、熊二好奇地追着小汽车跑远。\n你抓住机会,平安离开森林。",
        options:[],
        end:"e9",
        ach:["toy_car"]
    }
}

const xiongdaNodes={
    start_xiongda:{
        text:"【熊大线·开篇】\n你是熊大,树洞家里的存粮吃光了,熊二抱着肚子喊饿。\n看着空荡荡的粮仓,你得拿个主意。",
        options:[
            {text:"1.让熊二出去找吃的",next:"xiong2_go"},
            {text:"2.俺自己出去找吃的",next:"self_go"},
            {text:"3.不找了,躺平歇会儿",next:"lie_down"},
            {text:"4.去光头强家借点吃的",next:"go_qiangjia"}
        ]
    },
    xiong2_go:{
        text:"你打发熊二出去找吃的。\n结果左等右等,半天不见熊二回来。\n你出去一打听,才知道熊二因为贪吃蜂蜜,被光头强抓回小木屋了!\n你得赶紧想办法救熊二。",
        options:[
            {text:"1.引开肥波,从后门撬锁进去",next:"rescue_feibo"},
            {text:"2.装成可怜熊,在门口求光头强",next:"rescue_beg"},
            {text:"3.偷偷摸进去,偷钥匙救人",next:"rescue_key"}
        ]
    },
    rescue_feibo:{
        text:"你捡了根树枝,把肥波从后门引开。\n你趁机撬锁,可锁太结实,弄了半天弄不开。\n动静太大,光头强听见声音拿着扫把冲出来,把你赶跑了。\n熊二没救成,你还挨了一扫帚。",
        options:[],
        end:"b1",
        ach:["rescue_fail"],
        favorChange:-20
    },
    rescue_beg:{
        text:"你蹲在门口,装成可怜巴巴的样子,跟光头强说好话。\n光头强看你可怜,又想起熊二偷吃蜂蜜的样子,气不打一处来。\n“偷吃还有理了?不给!”\n他砰的一声关上门,你白跑一趟。",
        options:[],
        end:"b1",
        ach:["rescue_fail"],
        favorChange:-15
    },
    rescue_key:{
        text:"你偷偷从窗户摸进去,看见钥匙挂在墙上。\n你小心翼翼拿下钥匙,刚要去开笼子门,熊二看见你激动得大喊:“熊大!”\n这一喊把光头强惊动了。\n紧急关头,你快速打开笼子,拉起熊二就跑。\n慌慌张张逃回树洞,总算把熊二救出来了。",
        options:[],
        end:"b2",
        ach:["rescue_ok"],
        favorChange:25
    },
    self_go:{
        text:"你自己出门找吃的。\n走着走着,听见远处传来“咚咚咚”的砍树声。\n是光头强在砍树!树旁边就是蹦蹦的家,还有地鼠的洞,俩小家伙都在危险里。\n你现在怎么办?",
        options:[
            {text:"1.不管砍树,先去找吃的",next:"find_food"},
            {text:"2.赶走光头强,救小动物",next:"stop_ggq"}
        ]
    },
    find_food:{
        text:"你没管砍树的事,专心找吃的。\n没多久,你找到一篮子野果,还有半罐蜂蜜。\n你抱着吃的开开心心回树洞,和熊二饱餐了一顿。",
        options:[],
        end:"b4",
        ach:["full_stomach"]
    },
    stop_ggq:{
        text:"你决定赶走光头强。\n你躲在树后面想办法,怎么才能把他吓跑?",
        options:[
            {text:"1.大吼一声,冲出去吓唬他",next:"stop_roar"},
            {text:"2.扔石头砸他的帽子",next:"stop_stone"},
            {text:"3.装成树精吓唬他",next:"stop_tree"}
        ]
    },
    stop_roar:{
        text:"你大吼一声冲出去!\n光头强吓了一跳,回头看见是熊,吓得丢下斧头就跑。\n蹦蹦和地鼠都得救了,为了感谢你,它们把自己存的坚果和松果都送给了你。\n你带着食物高高兴兴回了家。",
        options:[],
        end:"b5",
        ach:["forest_guard"]
    },
    stop_stone:{
        text:"你扔出一块石头,正好砸掉光头强的帽子。\n光头强以为有人偷袭,吓得抱着头就跑。\n蹦蹦和地鼠得救了,它们把存的食物分给你当谢礼。\n你满载而归。",
        options:[],
        end:"b5",
        ach:["forest_guard"]
    },
    stop_tree:{
        text:"你披上树叶,装成树精的样子,慢慢晃到光头强身后。\n光头强一回头看见“树精”,吓得魂都飞了,连斧头都不要了,撒腿就跑。\n蹦蹦和地鼠都笑坏了,它们把家里的好吃的都拿出来感谢你。",
        options:[],
        end:"b5",
        ach:["forest_guard"]
    },
    lie_down:{
        text:"你往地上一躺,寻思歇会儿再说。\n躺着躺着,肚子越来越饿,慢慢开始眼花了。\n旁边爬过来一只毛毛虫,看起来...好像很好吃?",
        options:[
            {text:"吃!啥都吃!",next:"eat_worm"},
            {text:"不吃,俺才不吃虫子",next:"no_eat_worm"}
        ]
    },
    eat_worm:{
        text:"你抓起毛毛虫就往嘴里塞。\n嚼了嚼,味儿好像还不错?\n接着眼前出现一片树叶,绿油油的,看起来也挺香...",
        options:[
            {text:"吃树叶",next:"eat_leaf"},
            {text:"不吃",next:"no_eat_leaf"}
        ],
        ach:["trash_king"]
    },
    no_eat_worm:{
        text:"你扭过头不吃虫子。\n可眼前突然出现一个大鸡腿,油光锃亮,香气扑鼻。\n饿极了的你,吃还是不吃?",
        options:[
            {text:"吃鸡腿!",next:"eat_chicken"},
            {text:"不吃,肯定是幻觉",next:"no_eat_chicken"}
        ]
    },
    eat_leaf:{
        text:"你抓起树叶咔咔啃。\n啃着啃着,你感觉越吃越不对劲儿...\n低头一看,你正抱着熊二的脚在啃!\n熊二疼得直叫唤:“熊大!你啃俺脚干啥!”\n可你已经饿疯了,最后还是饿死在了树洞里。",
        options:[],
        end:"b6",
        ach:["trash_king"]
    },
    no_eat_leaf:{
        text:"你强忍着不吃树叶。\n可眼前又出现了蜂蜜、坚果、烤鱼...\n你死死闭着眼,什么都不吃,觉得自己靠呼吸就能活。\n最后你真的...饿死了。",
        options:[],
        end:"b8",
        ach:["air_bear"]
    },
    eat_chicken:{
        text:"你扑上去抱着鸡腿就啃。\n啃着啃着,你感觉味儿不对...\n低头一看,你正抱着熊二的脚猛啃!\n熊二疼得直跳:“熊大!你疯啦!”\n可你已经饿得失神了,最后还是饿死了。",
        options:[],
        end:"b6",
        ach:["trash_king"]
    },
    no_eat_chicken:{
        text:"你认定是幻觉,坚决不吃。\n你告诉自己:熊是铁,饭是钢,但是俺熊大靠空气就能活!\n你就这么躺着呼吸,最后...真的饿死了。",
        options:[],
        end:"b8",
        ach:["air_bear"]
    },
    go_qiangjia:{
        text:"你决定去光头强家借点吃的。\n来到小木屋跟前,怎么进去呢?",
        options:[
            {text:"1.走正门,敲敲门",next:"door_in"},
            {text:"2.翻窗户进去",next:"window_in"}
        ]
    },
    window_in:{
        text:"你扒着窗户往里翻。\n结果刚探出头,就看见肥波正趴在窗台上睡觉!\n肥波被你惊醒,“喵”的一声炸毛,对着你又抓又挠。\n你被挠得鼻青脸肿,从窗户上掉下来,落荒而逃。",
        options:[],
        end:"b9",
        ach:["rescue_fail"]
    },
    door_in:{
        text:"你推了推门,门没锁。\n你轻手轻脚走进去,客厅里没人。\n现在怎么办?",
        options:[
            {text:"1.到处搜查找食物",next:"search_all"},
            {text:"2.先躲起来,等时机",next:"hide_wait"},
            {text:"3.直接去冰箱搜",next:"fridge_search"}
        ],
        wakeAdd:10
    },
    search_all:{
        text:"你在客厅里翻箱倒柜找吃的。\n动静有点大,肥波从卧室里出来了!\n肥波看见你,弓起背就要叫。",
        options:[
            {text:"1.打晕肥波",next:"hit_feibo"},
            {text:"2.不管他,继续找",next:"ignore_feibo"}
        ],
        wakeAdd:20
    },
    fridge_search:{
        text:"你直奔冰箱,拉开冰箱门。\n里面有面包、香肠、还有咸鱼!\n你正往怀里塞吃的,肥波从卧室跑出来了!\n肥波看见你,张嘴就要叫。",
        options:[
            {text:"1.打晕肥波",next:"hit_feibo"},
            {text:"2.不管他,接着拿",next:"ignore_feibo"}
        ],
        wakeAdd:25
    },
    hide_wait:{
        text:"你躲在沙发后面,屏住呼吸。\n过了一会儿,肥波从卧室出来溜达了一圈,又回去睡觉了。\n你松了口气,可以继续行动了。",
        options:[
            {text:"1.赶紧去冰箱拿吃的",next:"fridge_safe"},
            {text:"2.再到处搜搜",next:"search_safe"}
        ]
    },
    hit_feibo:{
        text:"你上去一下把肥波打晕。\n可肥波倒下的时候撞翻了脸盆,“哐当”一声巨响。\n光头强被吵醒了,从卧室冲出来,把你抓了个正着。",
        options:[],
        end:"b11",
        ach:["rescue_fail"]
    },
    ignore_feibo:{
        text:"你不理肥波,接着找吃的。\n肥波“喵呜”大叫一声,声音特别大。\n光头强被叫醒了,拿着棍子从卧室冲出来。\n你见势不妙,赶紧逃跑,吃的也没拿到。",
        options:[],
        end:"b9",
        ach:["rescue_fail"]
    },
    fridge_safe:{
        text:"你轻手轻脚打开冰箱,拿上面包和香肠。\n刚要走,你看见还有一条咸鱼。\n这时候肥波好像又要醒了。",
        options:[
            {text:"1.拿上咸鱼赶紧跑",next:"take_fish_run"},
            {text:"2.把咸鱼扔给肥波",next:"throw_fish"}
        ]
    },
    search_safe:{
        text:"你又搜了一会儿,找到半盒饼干。\n正准备走,肥波又出来了。\n你手里正好有刚找到的咸鱼。",
        options:[
            {text:"1.扔咸鱼引开肥波",next:"throw_fish"},
            {text:"2.赶紧跑",next:"run_fast"}
        ]
    },
    throw_fish:{
        text:"你把咸鱼扔出去。\n肥波看见咸鱼,立刻扑过去啃,完全不管你了。\n你抱着食物,轻轻松松溜出了小木屋。\n回到树洞,和熊二美美地吃了一顿。",
        options:[],
        end:"b10",
        ach:["steal_success"]
    },
    take_fish_run:{
        text:"你拿上咸鱼赶紧跑。\n可肥波还是醒了,追着你叫。\n你跑得快,总算逃出来了,吃的也没丢。\n回到树洞,和熊二饱餐一顿。",
        options:[],
        end:"b10",
        ach:["steal_success"]
    },
    run_fast:{
        text:"你抱着吃的赶紧跑。\n肥波在后面追,可它跑不过你。\n你顺利逃回树洞,满载而归。",
        options:[],
        end:"b10",
        ach:["steal_success"]
    }
}

const nodes={};
nodes.select_role=selectNode;
Object.assign(nodes,ggqNodes);
Object.assign(nodes,xiongdaNodes);

const textBox=document.getElementById("text-box");
const optionWrap=document.getElementById("option-wrap");
const modal=document.getElementById("modal");
const modalTitle=document.getElementById("modal-title");
const modalBody=document.getElementById("modal-body");
const toast=document.getElementById("toast");
const hpDom=document.getElementById("hp");
const favorBox=document.getElementById("favor-box");
const favorDom=document.getElementById("favor");
const wakeBox=document.getElementById("wake-box");
const wakeDom=document.getElementById("wake");
const achCountDom=document.getElementById("ach-count");
const roleTag=document.getElementById("role-tag");
const restartBtn=document.getElementById("restart-btn");

function showToast(text){
    toast.innerText="🏆解锁成就:"+text;
    toast.style.opacity="1";
    setTimeout(()=>{toast.style.opacity="0"},2000);
}

function unlockAch(achList){
    for(let id of achList){
        if(!gameData.achievements[id]) continue;
        if(!gameData.achievements[id].unlock){
            gameData.achievements[id].unlock=true;
            showToast(gameData.achievements[id].name);
        }
    }
    achCountDom.innerText=Object.values(gameData.achievements).filter(x=>x.unlock).length;
}

function unlockEnd(endId){
    if(gameData.endings[endId]){
        gameData.endings[endId].unlock=true;
    }
}

function closeModal(){
    modal.style.display="none";
}

function showModal(title,body){
    modalTitle.innerText=title;
    modalBody.innerText=body;
    modal.style.display="flex";
}

function showAchievement(){
    let html="";
    for(let k in gameData.achievements){
        let a=gameData.achievements[k];
        html+=`【${a.unlock?"✅":"🔒"}】${a.name}:${a.desc}\n`;
    }
    showModal("🏆成就图鉴",html);
}

function showEnding(){
    let html="";
    for(let k in gameData.endings){
        let e=gameData.endings[k];
        html+=`【${e.unlock?"✅":"🔒"}】${e.name}:${e.desc}\n`;
    }
    showModal("📜结局图鉴",html);
}

function updateStatus(){
    hpDom.innerText=gameData.hp;
    favorDom.innerText=gameData.favor;
    wakeDom.innerText=gameData.wake;
    
    if(gameData.role==='xiongda'){
        favorBox.style.display="inline";
        wakeBox.style.display="none";
        if(nodes[gameData.currentNode] && nodes[gameData.currentNode].wakeAdd){
            wakeBox.style.display="inline";
        }
    }else{
        favorBox.style.display="none";
        wakeBox.style.display="none";
    }
}

function getEndingByFavor(){
    if(gameData.favor >= 80){
        unlockAch(["good_bro"]);
        return "b3";
    }else if(gameData.favor >= 40){
        return "b2";
    }else{
        return "b1";
    }
}

function renderNode(){
    const node=nodes[gameData.currentNode];
    if(!node) return;
    
    textBox.innerText=node.text;
    optionWrap.innerHTML="";
    
    if(node.favorChange){
        gameData.favor = Math.max(0, Math.min(100, gameData.favor + node.favorChange));
    }
    if(node.wakeAdd){
        gameData.wake += node.wakeAdd;
    }
    
    updateStatus();

    if(node.end){
        let finalEnd = node.end;
        if(node.end === "b1" || node.end === "b2"){
            finalEnd = getEndingByFavor();
        }
        
        unlockAch(node.ach||[]);
        unlockEnd(finalEnd);
        const e=gameData.endings[finalEnd];
        restartBtn.style.display="inline-block";
        showModal("🎮游戏结束",`${e.name}\n${e.desc}\n\n点击关闭可以查看图鉴`);
        return;
    }

    node.options.forEach((opt,idx)=>{
        const div=document.createElement("div");
        div.className="option-item";
        div.innerText=opt.text;
        div.onclick=()=>{
            if(opt.role){
                gameData.role = opt.role;
                roleTag.innerText = opt.role==='ggq' ? "当前角色:光头强" : "当前角色:熊大";
                if(opt.role === 'xiongda'){
                    gameData.favor = 60;
                    gameData.wake = 0;
                }
            }
            gameData.currentNode=opt.next;
            renderNode();
        }
        optionWrap.appendChild(div);
    })
}

function restartSameRole(){
    closeModal();
    gameData.hp=100;
    gameData.favor=60;
    gameData.wake=0;
    if(gameData.role === 'ggq'){
        gameData.currentNode = "start_ggq";
    }else{
        gameData.currentNode = "start_xiongda";
    }
    renderNode();
}

function backToSelect(){
    gameData.hp=100;
    gameData.favor=60;
    gameData.wake=0;
    gameData.role='';
    roleTag.innerText="选择角色开启冒险";
    gameData.currentNode="select_role";
    renderNode();
}

renderNode();
</script>
</body>
</html>

Game Source: 熊出没·森林求生记

Creator: TurboTurtle24

Libraries: none

Complexity: complex (585 lines, 27.5 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: game-turboturtle24" to link back to the original. Then publish at arcadelab.ai/publish.