熊出没·森林求生记
by TurboTurtle24585 lines27.5 KB
<!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.