1 Star 8 Fork 3

锅巴汉化/cookieClicker

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
minigameGrimoire.js 20.79 KB
一键复制 编辑 原始数据 按行查看 历史
zhaolinxu 提交于 2017-12-31 16:17 . 汉化
var M={};
M.parent=Game.Objects['Wizard tower'];
M.parent.minigame=M;
M.launch=function()
{
var M=this;
M.name=M.parent.minigameName;
M.init=function(div)
{
//populate div with html and initialize values
M.spells={
'conjure baked goods':{
name:'召唤烘焙食品',
desc:'一下获得半个小时的饼干秒产量,你的饼干最大上限的15%。',
failDesc:'触发一个15分钟的冻结,并减少你15分钟的饼干每秒产量。',
icon:[21,11],
costMin:2,
costPercent:0.4,
win:function()
{
var val=Math.max(7,Math.min(Game.cookies*0.15,Game.cookiesPs*60*30));
Game.Earn(val);
Game.Notify('召唤烘焙食品!','你通过魔法获得 <b>'+Beautify(val)+' 饼干'+(val==1?'':'')+'</b> 从稀薄的空气中。',[21,11],6);
Game.Popup('<div style="font-size:80%;">+'+Beautify(val)+' 饼干'+(val==1?'':'')+'!</div>',Game.mouseX,Game.mouseY);
},
fail:function()
{
var buff=Game.gainBuff('clot',60*15,0.5);
var val=Math.min(Game.cookies*0.15,Game.cookiesPs*60*15)+13;
val=Math.min(Game.cookies,val);
Game.Spend(val);
Game.Notify(buff.name,buff.desc,buff.icon,6);
Game.Popup('<div style="font-size:80%;">适得其反!<br>召唤失败!失去了 '+Beautify(val)+' 饼干'+(val==1?'':'')+'!</div>',Game.mouseX,Game.mouseY);
},
},
'hand of fate':{
name:'命运之手',
desc:'召唤一个随机的黄金饼干。每个现有黄金饼干让这个法术+ 15%更有可能会适得其反。',
failDesc:'召唤一个不走运的愤怒饼干。',
icon:[22,11],
costMin:10,
costPercent:0.6,
failFunc:function(fail)
{
return fail+0.15*Game.shimmerTypes['golden'].n;
},
win:function()
{
var newShimmer=new Game.shimmer('golden',{noWrath:true});
var choices=[];
choices.push('frenzy','multiply cookies');
if (!Game.hasBuff('龙之飞舞')) choices.push('click frenzy');
if (Math.random()<0.1) choices.push('chain cookie','cookie storm','blab');
if (Game.BuildingsOwned>=10 && Math.random()<0.25) choices.push('building special');
//if (Math.random()<0.2) choices.push('clot','cursed finger','ruin cookies');
if (Math.random()<0.15) choices=['饼干风暴掉落'];
if (Math.random()<0.0001) choices.push('free sugar lump');
newShimmer.force=choose(choices);
if (newShimmer.force=='饼干风暴掉落')
{
newShimmer.sizeMult=Math.random()*0.75+0.25;
}
Game.Popup('<div style="font-size:80%;">有前途的命运!</div>',Game.mouseX,Game.mouseY);
},
fail:function()
{
var newShimmer=new Game.shimmer('golden',{wrath:true});
var choices=[];
choices.push('clot','ruin cookies');
if (Math.random()<0.1) choices.push('cursed finger','blood frenzy');
if (Math.random()<0.003) choices.push('free sugar lump');
if (Math.random()<0.1) choices=['blab'];
newShimmer.force=choose(choices);
Game.Popup('<div style="font-size:80%;">适得其反!<br>险恶的命运!</div>',Game.mouseX,Game.mouseY);
},
},
'stretch time':{
name:'拉伸时间',
desc:'所有激活的效果将延长10%的持续时间(最多延长5分钟)',
failDesc:'所有激活的效果将缩短10%的持续时间(最多缩短5分钟)',
icon:[23,11],
costMin:8,
costPercent:0.2,
win:function()
{
var changed=0;
for (var i in Game.buffs)
{
var me=Game.buffs[i];
var gain=Math.min(Game.fps*60*5,me.maxTime*0.1);
me.maxTime+=gain;
me.time+=gain;
changed++;
}
if (changed==0){Game.Popup('<div style="font-size:80%;">没有Buff改变!</div>',Game.mouseX,Game.mouseY);return -1;}
Game.Popup('<div style="font-size:80%;">快!Buff持续时间加长了。</div>',Game.mouseX,Game.mouseY);
},
fail:function()
{
var changed=0;
for (var i in Game.buffs)
{
var me=Game.buffs[i];
var loss=Math.min(Game.fps*60*10,me.time*0.2);
me.time-=loss;
me.time=Math.max(me.time,0);
changed++;
}
if (changed==0){Game.Popup('<div style="font-size:80%;">没有Buff改变!</div>',Game.mouseX,Game.mouseY);return -1;}
Game.Popup('<div style="font-size:80%;">适得其反!<br>嘶! Buff持续时间缩短了。</div>',Game.mouseX,Game.mouseY);
},
},
'spontaneous edifice':{
name:'自发大厦',
desc:'如果你有两倍的现在的饼干,咒语就会选择一个你能负担得起的随机建筑,免费赠送给你。所选建筑的数量必须在400以下,并且不能是你建造数量的最多的(除非它是你唯一的)。',
failDesc:'失去一个随机的建筑。',
icon:[24,11],
costMin:20,
costPercent:0.75,
win:function()
{
var buildings=[];
var max=0;
var n=0;
for (var i in Game.Objects)
{
if (Game.Objects[i].amount>max) max=Game.Objects[i].amount;
if (Game.Objects[i].amount>0) n++;
}
for (var i in Game.Objects)
{if ((Game.Objects[i].amount<max || n==1) && Game.Objects[i].getPrice()<=Game.cookies*2 && Game.Objects[i].amount<400) buildings.push(Game.Objects[i]);}
if (buildings.length==0){Game.Popup('<div style="font-size:80%;">没有建筑可以改进!</div>',Game.mouseX,Game.mouseY);return -1;}
var building=choose(buildings);
building.buyFree(1);
Game.Popup('<div style="font-size:80%;">一个新 '+building.single+'<br>冲出地面。</div>',Game.mouseX,Game.mouseY);
},
fail:function()
{
if (Game.BuildingsOwned==0){Game.Popup('<div style="font-size:80%;">适得其反,但是没有建筑可以摧毁!</div>',Game.mouseX,Game.mouseY);return -1;}
var buildings=[];
for (var i in Game.Objects)
{if (Game.Objects[i].amount>0) buildings.push(Game.Objects[i]);}
var building=choose(buildings);
building.sacrifice(1);
Game.Popup('<div style="font-size:80%;">适得其反!<br>你的一个 '+building.plural+'<br>在一股烟雾中消失。</div>',Game.mouseX,Game.mouseY);
},
},
'haggler\'s charm':{
name:'砍价的魅力',
desc:'升级的价格在1分钟内降低了2%。',
failDesc:'升级费用在一小时内增加了2%。<q>那是什么咒语?给我钱!</q>',
icon:[25,11],
costMin:10,
costPercent:0.1,
win:function()
{
Game.killBuff('砍价的魅力');
var buff=Game.gainBuff('haggler luck',60,2);
Game.Popup('<div style="font-size:80%;">升级更便宜!</div>',Game.mouseX,Game.mouseY);
},
fail:function()
{
Game.killBuff('Haggler\'s luck');
var buff=Game.gainBuff('haggler misery',60*60,2);
Game.Popup('<div style="font-size:80%;">适得其反!<br>升级价格变高!</div>',Game.mouseX,Game.mouseY);
},
},
'summon crafty pixies':{
name:'召唤狡猾的小妖精',
desc:'建筑在1分钟内便宜2%。',
failDesc:'1小时内,建筑价格上涨了2%。',
icon:[26,11],
costMin:10,
costPercent:0.2,
win:function()
{
Game.killBuff('肮脏的妖精');
var buff=Game.gainBuff('pixie luck',60,2);
Game.Popup('<div style="font-size:80%;">狡猾的小妖精!<br>建筑更便宜了!</div>',Game.mouseX,Game.mouseY);
},
fail:function()
{
Game.killBuff('狡猾的小妖精');
var buff=Game.gainBuff('pixie misery',60*60,2);
Game.Popup('<div style="font-size:80%;">适得其反!<br>肮脏的妖精!<br>建筑价格更高!</div>',Game.mouseX,Game.mouseY);
},
},
'gambler\'s fever dream':{
name:'赌徒的狂热梦',
desc:'以一半的魔法成本随机施法,两次回火的几率。',
icon:[27,11],
costMin:3,
costPercent:0.05,
win:function()
{
var spells=[];
var selfCost=M.getSpellCost(M.spells['gambler\'s fever dream']);
for (var i in M.spells)
{if (i!='gambler\'s fever dream' && (M.magic-selfCost)>=M.getSpellCost(M.spells[i])*0.5) spells.push(M.spells[i]);}
if (spells.length==0){Game.Popup('<div style="font-size:80%;">没有符合条件的法术!</div>',Game.mouseX,Game.mouseY);return -1;}
var spell=choose(spells);
var cost=M.getSpellCost(spell)*0.5;
setTimeout(function(){
var out=M.castSpell(spell,{cost:cost,failChanceMax:0.5,passthrough:true});
if (!out)
{
M.magic+=selfCost;
setTimeout(function(){
Game.Popup('<div style="font-size:80%;">这太糟糕了!<br>魔法退还。</div>',Game.mouseX,Game.mouseY);
},1500);
}
},1000);
Game.Popup('<div style="font-size:80%;">释放 '+spell.name+'<br>消耗 '+Beautify(cost)+' 魔法...</div>',Game.mouseX,Game.mouseY);
},
},
'resurrect abomination':{
name:'复活可憎之物',
desc:'如果条件满足,立即召唤起皱纹。',
failDesc:'打开你的皱纹。',
icon:[28,11],
costMin:20,
costPercent:0.1,
win:function()
{
var out=Game.SpawnWrinkler();
if (!out){Game.Popup('<div style="font-size:80%;">无法产生皱纹!</div>',Game.mouseX,Game.mouseY);return -1;}
Game.Popup('<div style="font-size:80%;">起来,我的宝贝!</div>',Game.mouseX,Game.mouseY);
},
fail:function()
{
var out=Game.PopRandomWrinkler();
if (!out){Game.Popup('<div style="font-size:80%;">适得其反!<br>但没有人受伤。</div>',Game.mouseX,Game.mouseY);return -1;}
Game.Popup('<div style="font-size:80%;">适得其反!<br>又长又丑...</div>',Game.mouseX,Game.mouseY);
},
},
'diminish ineptitude':{
name:'减少无能',
desc:'法术的不良效果在接下来的5分钟内减少10次。',
failDesc:'法术的不良效果在接下来的10分钟内增加5次。',
icon:[29,11],
costMin:5,
costPercent:0.2,
win:function()
{
Game.killBuff('魔法无能');
var buff=Game.gainBuff('magic adept',5*60,10);
Game.Popup('<div style="font-size:80%;">无能!</div>',Game.mouseX,Game.mouseY);
},
fail:function()
{
Game.killBuff('魔法专家');
var buff=Game.gainBuff('magic inept',10*60,5);
Game.Popup('<div style="font-size:80%;">适得其反!<br>无能放大!</div>',Game.mouseX,Game.mouseY);
},
},
};
M.spellsById=[];var n=0;
for (var i in M.spells){M.spells[i].id=n;M.spellsById[n]=M.spells[i];n++;}
M.computeMagicM=function()
{
var towers=Math.max(M.parent.amount,1);
var lvl=Math.max(M.parent.level,1);
M.magicM=Math.floor(4+Math.pow(towers,0.6)+Math.log((towers+(lvl-1)*10)/15+1)*15);
//old formula :
/*
M.magicM=8+Math.min(M.parent.amount,M.parent.level*5)+Math.ceil(M.parent.amount/10);
if (M.magicM>200)
{
//diminishing returns starting at 200, being 5% as fast by 400
var x=M.magicM;
var top=x-200;
top/=200;
var top2=top;
top*=(1-top/2);
if (top2>=1) top=0.5;
top=top*0.95+top2*0.05;
top*=200;
x=top+200;
M.magicM=x;
}
*/
M.magic=Math.min(M.magicM,M.magic);
}
M.getFailChance=function(spell)
{
var failChance=0.15;
if (Game.hasBuff('魔法专家')) failChance*=0.1;
if (Game.hasBuff('魔法无能')) failChance*=5;
if (spell.failFunc) failChance=spell.failFunc(failChance);
return failChance;
}
M.castSpell=function(spell,obj)
{
var obj=obj||{};
var out=0;
var cost=0;
var fail=false;
if (typeof obj.cost!=='undefined') cost=obj.cost; else cost=M.getSpellCost(spell);
if (M.magic<cost) return false;
var failChance=M.getFailChance(spell);
if (typeof obj.failChanceSet!=='undefined') failChance=obj.failChanceSet;
if (typeof obj.failChanceAdd!=='undefined') failChance+=obj.failChanceAdd;
if (typeof obj.failChanceMult!=='undefined') failChance*=obj.failChanceMult;
if (typeof obj.failChanceMax!=='undefined') failChance=Math.max(failChance,obj.failChanceMax);
Math.seedrandom(Game.seed+'/'+M.spellsCastTotal);
if (!spell.fail || Math.random()<(1-failChance)) {out=spell.win();} else {fail=true;out=spell.fail();}
Math.seedrandom();
if (out!=-1)
{
if (!spell.passthrough && !obj.passthrough)
{
M.spellsCast++;
M.spellsCastTotal++;
if (M.spellsCastTotal>=9) Game.Win('圣经');
if (M.spellsCastTotal>=99) Game.Win('我是天才');
if (M.spellsCastTotal>=999) Game.Win('巫师就是你');
}
M.magic-=cost;
M.magic=Math.max(0,M.magic);
var rect=l('grimoireSpell'+spell.id).getBoundingClientRect();
Game.SparkleAt((rect.left+rect.right)/2,(rect.top+rect.bottom)/2-24);
if (fail) PlaySound('snd/spellFail.mp3',0.75); else PlaySound('snd/spell.mp3',0.75);
return true;
}
PlaySound('snd/spellFail.mp3',0.75);
return false;
}
M.getSpellCost=function(spell)
{
var out=spell.costMin;
if (spell.costPercent) out+=M.magicM*spell.costPercent;
return Math.floor(out);
}
M.getSpellCostBreakdown=function(spell)
{
var str='';
if (spell.costPercent) str+=Beautify(spell.costMin)+' 魔法 +'+Beautify(Math.ceil(spell.costPercent*100))+'% 魔法上限';
else str+=Beautify(spell.costMin)+' 魔法';
return str;
}
M.spellTooltip=function(id)
{
return function(){
var me=M.spellsById[id];
me.icon=me.icon||[28,12];
var cost=Beautify(M.getSpellCost(me));
var costBreakdown=M.getSpellCostBreakdown(me);
if (cost!=costBreakdown) costBreakdown=' <small>('+costBreakdown+')</small>'; else costBreakdown='';
var backfire=M.getFailChance(me);
var str='<div style="padding:8px 4px;min-width:350px;">'+
'<div class="icon" style="float:left;margin-left:-8px;margin-top:-8px;background-position:'+(-me.icon[0]*48)+'px '+(-me.icon[1]*48)+'px;"></div>'+
'<div class="name">'+me.name+'</div>'+
'<div>魔法成本 : <b style="color:#'+(cost<=M.magic?'6f6':'f66')+';">'+cost+'</b>'+costBreakdown+'</div>'+
(me.fail?('<div><small>负面效果出现几率 : <b style="color:#f66">'+Math.ceil(100*backfire)+'%</b></small></div>'):'')+
'<div class="line"></div><div class="description"><b>正面效果 :</b> '+me.desc+(me.failDesc?('<div style="height:8px;"></div><b>负面效果 :</b> '+me.failDesc):'')+'</div></div>';
return str;
};
}
var str='';
str+='<style>'+
'#grimoireBG{background:url(img/shadedBorders.png),url(img/grimoireBG.png);background-size:100% 100%,auto;position:absolute;left:0px;right:0px;top:0px;bottom:16px;}'+
'#grimoireContent{position:relative;box-sizing:border-box;padding:4px 24px;}'+
'#grimoireBar{max-width:95%;margin:4px auto;height:16px;}'+
'#grimoireBarFull{transform:scale(1,2);transform-origin:50% 0;height:50%;}'+
'#grimoireBarText{transform:scale(1,0.8);width:100%;position:absolute;left:0px;top:0px;text-align:center;color:#fff;text-shadow:-1px 1px #000,0px 0px 4px #000,0px 0px 6px #000;margin-top:2px;}'+
'#grimoireSpells{text-align:center;width:100%;padding:8px;box-sizing:border-box;}'+
'.grimoireIcon{pointer-events:none;margin:2px 6px 0px 6px;width:48px;height:48px;opacity:0.8;position:relative;}'+
'.grimoirePrice{pointer-events:none;}'+
'.grimoireSpell{box-shadow:4px 4px 4px #000;cursor:pointer;position:relative;color:#f33;opacity:0.8;text-shadow:0px 0px 4px #000,0px 0px 6px #000;font-weight:bold;font-size:12px;display:inline-block;width:60px;height:74px;background:url(img/spellBG.png);}'+
'.grimoireSpell.ready{color:rgba(255,255,255,0.8);opacity:1;}'+
'.grimoireSpell.ready:hover{color:#fff;}'+
'.grimoireSpell:hover{box-shadow:6px 6px 6px 2px #000;z-index:1000000001;top:-1px;}'+
'.grimoireSpell:active{top:1px;}'+
'.grimoireSpell.ready .grimoireIcon{opacity:1;}'+
'.grimoireSpell:hover{background-position:0px -74px;} .grimoireSpell:active{background-position:0px 74px;}'+
'.grimoireSpell:nth-child(4n+1){background-position:-60px 0px;} .grimoireSpell:nth-child(4n+1):hover{background-position:-60px -74px;} .grimoireSpell:nth-child(4n+1):active{background-position:-60px 74px;}'+
'.grimoireSpell:nth-child(4n+2){background-position:-120px 0px;} .grimoireSpell:nth-child(4n+2):hover{background-position:-120px -74px;} .grimoireSpell:nth-child(4n+2):active{background-position:-120px 74px;}'+
'.grimoireSpell:nth-child(4n+3){background-position:-180px 0px;} .grimoireSpell:nth-child(4n+3):hover{background-position:-180px -74px;} .grimoireSpell:nth-child(4n+3):active{background-position:-180px 74px;}'+
'.grimoireSpell:hover .grimoireIcon{top:-1px;}'+
'.grimoireSpell.ready:hover .grimoireIcon{animation-name:bounce;animation-iteration-count:infinite;animation-duration:0.8s;}'+
'#grimoireLumpRefill{cursor:pointer;width:48px;height:48px;position:absolute;left:-40px;top:-17px;transform:scale(0.5);z-index:1000;transition:transform 0.05s;}'+
'#grimoireLumpRefill:hover{transform:scale(1);}'+
'#grimoireLumpRefill:active{transform:scale(0.4);}'+
'#grimoireInfo{text-align:center;font-size:11px;margin-top:12px;color:rgba(255,255,255,0.75);text-shadow:-1px 1px 0px #000;}'+
'</style>';
str+='<div id="grimoireBG"></div>';
str+='<div id="grimoireContent">';
str+='<div id="grimoireSpells">';//did you know adding class="shadowFilter" to this cancels the "z-index:1000000001" that displays the selected spell above the tooltip? stacking orders are silly https://philipwalton.com/articles/what-no-one-told-you-about-z-index/
for (var i in M.spells)
{
var me=M.spells[i];
var icon=me.icon||[28,12];
str+='<div class="grimoireSpell titleFont" id="grimoireSpell'+me.id+'" '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.spellTooltip('+me.id+')','this')+'><div class="usesIcon shadowFilter grimoireIcon" style="background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div><div class="grimoirePrice" id="grimoirePrice'+me.id+'">-</div></div>';
}
str+='</div>';
var icon=[29,14];
str+='<div id="grimoireBar" class="smallFramed meterContainer"><div '+Game.getTooltip('<div style="padding:8px;width:300px;font-size:11px;text-align:center;">点击重新填充 <b>100 单位</b> 你的魔法表<br> 消耗 <span class="price lump">1 糖块</span>.</div>')+' id="grimoireLumpRefill" class="usesIcon shadowFilter" style="background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div><div id="grimoireBarFull" class="meter filling"></div><div id="grimoireBarText" class="titleFont"></div><div '+Game.getTooltip('<div style="padding:8px;width:300px;font-size:11px;text-align:center;">这是你的魔法表。每个法术都需要魔法。<div class="line"></div>您的最大魔法量取决于您的<b>魔法塔</b>的数量, 以及它们的等级<div class="line"></div>随着时间的推移,魔法会被重新填满。你的魔法表越低,它的填充速度就越慢。</div>')+' style="position:absolute;left:0px;top:0px;right:0px;bottom:0px;"></div></div>';
str+='<div id="grimoireInfo"></div>';
str+='</div>';
div.innerHTML=str;
M.magicBarL=l('grimoireBar');
M.magicBarFullL=l('grimoireBarFull');
M.magicBarTextL=l('grimoireBarText');
M.lumpRefill=l('grimoireLumpRefill');
M.infoL=l('grimoireInfo');
for (var i in M.spells)
{
var me=M.spells[i];
AddEvent(l('grimoireSpell'+me.id),'click',function(spell){return function(){PlaySound('snd/tick.mp3');M.castSpell(spell);}}(me));
}
AddEvent(M.lumpRefill,'click',function(){
if (Game.lumps>=1 && M.magic<M.magicM)
{
M.magic+=100;
M.magic=Math.min(M.magic,M.magicM);
Game.lumps-=1;
PlaySound('snd/pop'+Math.floor(Math.random()*3+1)+'.mp3',0.75);
}
});
M.computeMagicM();
M.magic=M.magicM;
M.spellsCast=0;
M.spellsCastTotal=0;
//M.parent.switchMinigame(1);
}
M.save=function()
{
//output cannot use ",", ";" or "|"
var str=''+
parseFloat(M.magic)+' '+
parseInt(Math.floor(M.spellsCast))+' '+
parseInt(Math.floor(M.spellsCastTotal))
;
return str;
}
M.load=function(str)
{
//interpret str; called after .init
//note : not actually called in the Game's load; see "minigameSave" in main.js
if (!str) return false;
var i=0;
var spl=str.split(' ');
M.computeMagicM();
M.magic=parseFloat(spl[i++]||M.magicM);
M.spellsCast=parseInt(spl[i++]||0);
M.spellsCastTotal=parseInt(spl[i++]||0);
}
M.reset=function()
{
M.computeMagicM();
M.magic=M.magicM;
M.spellsCast=0;
}
M.logic=function()
{
//run each frame
if (Game.T%5==0) {M.computeMagicM();}
M.magicPS=Math.max(0.002,Math.pow(M.magic/Math.max(M.magicM,100),0.5))*0.002;
M.magic+=M.magicPS;
M.magic=Math.min(M.magic,M.magicM);
if (Game.T%5==0)
{
for (var i in M.spells)
{
var me=M.spells[i];
var cost=M.getSpellCost(me);
l('grimoirePrice'+me.id).innerHTML=Beautify(cost);
if (M.magic<cost) l('grimoireSpell'+me.id).className='grimoireSpell titleFont';
else l('grimoireSpell'+me.id).className='grimoireSpell titleFont ready';
}
}
}
M.draw=function()
{
//run each draw frame
M.magicBarTextL.innerHTML=Math.min(Math.floor(M.magicM),Beautify(M.magic))+'/'+Beautify(Math.floor(M.magicM))+(M.magic<M.magicM?(' (+'+Beautify((M.magicPS||0)*Game.fps,2)+'/s)'):'');
M.magicBarFullL.style.width=((M.magic/M.magicM)*100)+'%';
M.magicBarL.style.width=(M.magicM*3)+'px';
M.infoL.innerHTML='施放法术 : '+Beautify(M.spellsCast)+' (累计 : '+Beautify(M.spellsCastTotal)+')';
}
M.init(l('rowSpecial'+M.parent.id));
}
var M=0;
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
JavaScript
1
https://gitee.com/likexia/cookieClicker.git
git@gitee.com:likexia/cookieClicker.git
likexia
cookieClicker
cookieClicker
master

搜索帮助

23e8dbc6 1850385 7e0993f3 1850385