前言
不知道为啥,一款开源的文字类web游戏——《人生重开模拟器》突然爆火,好奇玩了一会儿,发现这游戏其实和抽奖差不多,容易激发人的赌徒心理。倍感无聊,决定修改一下,给游戏添加个外挂天赋,毕竟重生总得带点什么逆天功能才合理的嘛。
游戏代码不是很复杂,来来回回几个js文件,如果你要修改面板属性之类的其他东西,也是如此。这里以添加一个“不灭金身”天赋为例。
游戏官方源码:https://github.com/VickScarlet/lifeRestart
配置数据
天赋 talent.json
添加:
"1135": { //与id一致
"id": 1135, //根据原有数据情况进行修改,不要和原有数据id相同
"name": "不灭金身", //天赋名
"description": "体质小于1时体质+10且死亡后会复活", //天赋说明
"condition": "STR<1", //触发天赋的条件
"grade": 3, //稀有度,越高越稀有
"effect": {
"STR": 10 //体质+10
}
}
剧情 event.json
修改:
"10000": {
"id": 10000,
"event": "你死了。",
"effect": {
"LIF": -1
},
"NoRandom": 1
},
如下:
"10000": {
"id": 10000,
"event": "你死了。",
"effect": {
"LIF": -1
},
"NoRandom": 1,
"branch": [
"TLT?[1135]:40062" // TLT?[不灭金身天赋id]:对应的剧情id
]
},
添加:
"40062": { //与id一致
"id": 40062, //根据原有数据情况进行修改,不要和原有数据id相同
"event": "你是神选之子,拥有不灭金身,原地复活,又开始了新的人生。", //剧情说明
"effect": {
"LIF": 1 //生命+1
},
"branch": [
"AGE>499:40050" //目前的游戏设定最高500岁(不修仙99岁),大于499时必须死,看情况修改
],
"NoRandom": 1 //非随机事件
}
修改代码
life.js
添加方法:
talentCheat(){
return this.#talent.talentCheat();
}
talent.js
添加方法:
talentCheat(){
return this.#talents;
}
app.js
添加一个按钮:
<button id="cheat" class="sponsor" style="margin:30px">神选之子</button>
如下:
const talentPage = $(`
<div id="main">
<div class="head" style="font-size: 1.6rem">天赋抽卡</div>
<button id="random" class="mainbtn" style="position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%);"">10连抽!</button>
<ul id="talents" class="selectlist"></ul>
<button id="next" class="mainbtn">请选择3个</button>
<button id="cheat" class="sponsor" style="margin:30px">神选之子</button>
</div>
`);
跳过随机天赋列表:
if(talent.id==1135){ //配置的天赋id
return true; //如果天赋列表中随机到【不灭金身】天赋则跳过本次循环
}
如下:
talentPage
.find('#random')
.click(()=>{
talentPage.find('#random').hide();
const ul = talentPage.find('#talents');
this.#life.talentRandom()
.forEach(talent=>{
if(talent.id==1135){ //配置的不灭金身天赋id
return true; //如果天赋列表中随机到【不灭金身】天赋则跳过本次循环
}
const li = createTalent(talent);
ul.append(li);
//其余代码略……
修改方法:
const createTalent = ({ grade, name, description }) => {
return $(`<li class="grade${grade}b">${name}(${description})</li>`)
};
如下:
const createTalent = ({ id, grade, name, description }) => {
return $(`<li id="tId_${id}" class="grade${grade}b">${name}(${description})</li>`)
};
添加方法:
talentPage
.find('#cheat')
.click(()=>{
talentPage.find('#cheat').hide();
const talent = this.#life.talentCheat()[1135]; //配置的不灭金身天赋id
const talent2 = this.#life.talentCheat()[1048];
const ul = talentPage.find('#talents');
ul.children()[0].remove();
ul.find('#tId_1048').remove();
const li = createTalent(talent);
ul.append(li);
li.click(()=>{
if(li.hasClass('selected')) {
li.removeClass('selected')
this.#talentSelected.delete(talent);
this.#talentSelected.delete(talent2);
if(this.#talentSelected.size<3) {
talentPage.find('#next').text('请选择3个')
}
} else {
if(this.#talentSelected.size==3) {
this.hint('只能选3个天赋');
return;
}
this.hint(`选择【不灭金身】的同时会附带【神秘的小盒子】,占用两个天赋位`);
const exclusive = this.#life.exclusive(
Array.from(this.#talentSelected).map(({id})=>id),
talent.id
);
if(exclusive != null) {
for(const { name, id } of this.#talentSelected) {
if(id == exclusive) {
this.hint(`与已选择的天赋【${name}】冲突`);
return;
}
}
return;
}
li.addClass('selected');
this.#talentSelected.add(talent);
this.#talentSelected.add(talent2);
if(this.#talentSelected.size==3) {
talentPage.find('#next').text('开始新人生')
}
}
});
})
选择天赋时显示按钮:
talentPage.find('#cheat').show();
如下:
//以上代码略……
if (exclusive != null) {
for (const { name, id } of this.#talentSelected) {
if (id == exclusive) {
this.hint(`与已选择的天赋【${name}】冲突`);
return;
}
}
return;
}
li.addClass('selected');
this.#talentSelected.add(talent);
if (this.#talentSelected.size == 3) {
talentPage.find('#next').text('开始新人生')
}
}
});
});
talentPage.find('#next').show();
talentPage.find('#cheat').show();
选择天赋前隐藏按钮:
talentPage.find('#cheat').hide();
如下:
talent: {
page: talentPage,
talentList: talentPage.find('#talents'),
btnRandom: talentPage.find('#random'),
btnNext: talentPage.find('#next'),
pressEnter: () => {
const talentList = this.#pages.talent.talentList;
const btnRandom = this.#pages.talent.btnRandom;
const btnNext = this.#pages.talent.btnNext;
if (talentList.children().length) {
btnNext.click();
} else {
btnRandom.click();
}
},
clear: () => {
this.#currentPage = 'talent';
talentPage.find('ul.selectlist').empty();
talentPage.find('#random').show();
talentPage.find('#cheat').hide();
this.#totalMax = 20;
},
},
效果预览