通过上期的解读,我们发现,程序的疑似入口可能是有5万多行代码的game.js(因为自动加载的程序里,update.js、config.js、package.js都只有一个全局环境变量,所以排除掉),而这个js文件,只有一个函数,6个变量,在程序的最后调用了lib.init.init(),方法,所以,本期重点讲解这个方法,这个方法,有1431行,内容太多源码就不贴了,只贴个截图吧。
1、下面开始逐段阶段,第一段,根据游戏运行目录路径,对lib.configprefix进行赋值
if(typeof __dirname==='string'&&__dirname.length){
var dirsplit=__dirname.split('/');
for(var i=0;i<dirsplit.length;i++){
if(dirsplit[i]){
var c=dirsplit[i][0];
lib.configprefix+=/[A-Z]|[a-z]/.test(c)?c:'_';
}
}
lib.configprefix+='_';
}
判断__dirname当前目录的绝对路径是不是string型,并且长度大于0,如果是,则以'/'为分隔符进行分割,然后循环取分割后的各数组的第一个字母,如果是a~z或者A~Z,则在lib.configprefix中赋上该值,如果不是26个英文字母,则赋值为下划线,这个的用处是区别同一台电脑,多个游戏版本用的,后面会讲到。不过在windows下运行,如果是在nodejs环境中运行,可以取到盘符,例如(d:\game\noname)由于分割是“/”而不是“\”,所以只能取到d,那么lib.configprefix=noname_0.9_d_;如果在浏览器中运行,__dirname未定义,所以是空,lib.configprefix保持初始化不变,仍然是noname_0.9_。如果把这段改改,把spilt('/')改为split('\\'),则最终会变成lib.configprefix=noname_0.9_dgn_
2、第二段,设置重置游戏的超时时间,并清除cordovalLoadTimeout(不明所以)
window.resetGameTimeout=setTimeout(lib.init.reset,parseInt(localStorage.getItem(lib.configprefix+'loadtime'))||5000);
if(window.cordovaLoadTimeout){
clearTimeout(window.cordovaLoadTimeout);
delete window.cordovaLoadTimeout;
}
如果那noname多个版本放到不同路径,lib.configprefix就会不一样,见上面解析,这样就可以分别进行设置。
3、第三段,移除第一个连接为app/color.css的link(不明所以)
var links=document.head.querySelectorAll('link');
for(var i=0;i<links.length;i++){
if(links[i].href.indexOf('app/color.css')!=-1){
links[i].remove();
break;
}
}
4、第四段,设置联机游戏的地址,如果没有配置过,则设置为默认lib.hallURL=noname.mobi
var index=window.location.href.indexOf('index.html?server=');
if(index!=-1){
window.isNonameServer=window.location.href.slice(index+18);
window.nodb=true;
}
else{
index=localStorage.getItem(lib.configprefix+'asserver');
if(index){
window.isNonameServer=index;
window.isNonameServerIp=lib.hallURL;
}
}
5、第五段,设置游戏的背景图片
var htmlbg=localStorage.getItem(lib.configprefix+'background');
if(htmlbg){
if(htmlbg[0]=='['){
try{
htmlbg=JSON.parse(htmlbg);
htmlbg=htmlbg[get.rand(htmlbg.length)];
if(htmlbg.indexOf('custom_')==0){
throw('err');
}
_status.htmlbg=htmlbg;
}
catch(e){
htmlbg=null;
}
}
if(htmlbg){
document.documentElement.style.backgroundImage='url("'+lib.assetURL+'image/background/'+htmlbg+'.jpg")';
document.documentElement.style.backgroundSize='cover';
document.documentElement.style.backgroundPosition='50% 50%';
}
}
6、第六段,给lib中的几个变量赋值,这个赋值很厉害了,直接把另外4个大的复杂参数,直接当成了lib的子变量。(这里有可能会是坑,很多初始化的工作,有可能直接在这几个复杂的子变量里执行了,这样有可能还是会掩盖程序的真正入口。先慢慢分析这看吧。)
lib.get=get;
lib.ui=ui;
lib.ai=ai;
lib.game=game;
7、接下来好大一段,分别是“HTMLDivElement.prototype”和“Array.prototype”开头的一堆函数,是为了给所有的div对象以及array对象增加一些自定义的属性。比如HTMLDivElement.prototype.animate是增加动画的,HTMLDivElement.prototype.hide设置隐藏等。
8、接下来,window.onkeydown,设置一些快捷键。(暂时不解读,需要改的时候再看)
9、接下来,window.onload,如果用的是非windows设备,即lib.device有值,则把cordova.js加进去。(cordova.js是css+html+js的又一个跨平台的框架,跟electron很像)。
10、接下来,window.onerror,捕获错误信息的方法。包括报错的event事件、报错的步骤step,打印报错的信息等。
11、接下来,如果有更新,window.noname_update为真,则进行更新。(暂时不解读,需要的时候再看)
(今天先到这儿吧,有点儿头疼。回家了先)