这几天实在是太忙了,已经有4天没写博客了。上次的博客还是【111@365】。今天准备写一篇技术博客,继续解读noname。

【前情提要】上一篇根据electron的标准,按图索骥,package.json->main.js->app.html->redirect.js->index.js,对这几个文件的内容进行了简要的解读,发现了第一次安装程序初始化的内容(主要在index.js完成),真正的程序入口还是没有浮出水面。本期继续探索。

上一篇还提到redirect.js文件把game.js、package.js、update.js、config.js放到onload事件当中,随着app.html打开而自动加载。那这几个文件都有什么内容,都干什么事情呢?今天我们来一探究竟。

 1、先看update.js文件,这个文件内容很简单,只有一个全局变量window.noname_update,里面记录了,升级后版本号,原原版本号,升级日志,本次升级的文件。以最新1.9.98.6为例,增加了地藏王、孟婆,修改了杨彪、陈登、界张嶷(yi)的bug,涉及到的文件有card/extra.js等。内容如下:

window.noname_update={version:'1.9.98.6',update:'1.9.98.5.1',changeLog:['杨彪,陈登,界张嶷','地藏王,孟婆','bug修复',],files:['card/extra.js',//'card/huanlekapai.js',//'card/sp.js','card/standard.js',//'card/swd.js',//'card/mtg.js',//'card/guozhan.js',//'card/gwent.js',//'card/yunchou.js',//'card/zhenfa.js',//'card/zhulu.js','character/diy.js',//'character/extra.js',//'character/hearth.js',//'character/gujian.js',//'character/gwent.js',//'character/hearth.js','character/mobile.js',//'character/mtg.js',//'character/old.js','character/refresh.js','character/shenhua.js','character/sp.js',//'character/tw.js','character/standard.js',//'character/swd.js',//'character/xianjian.js',//'character/xinghuoliaoyuan.js','character/yijiang.js',//'character/yxs.js',//'extension/boss/extension.js',//'layout/default/layout.css',//'layout/nova/layout.css',//'mode/identity.js','mode/doudizhu.js','mode/guozhan.js',//'mode/chess.js',//'mode/tafang.js',//'mode/single.js',//'mode/stone.js',//'mode/brawl.js',//'mode/versus.js','mode/boss.js','game/game.js',//'game/NoSleep.js',//'game/config.js',//'game/package.js',//'game/asset.js',//'game/source.js','theme/style/hp/xinglass.css','theme/style/hp/xinround.css','theme/style/hp/image/xinglass1.png','theme/style/hp/image/xinglass2.png','theme/style/hp/image/xinglass3.png','theme/style/hp/image/xinglass4.png','theme/style/hp/image/xinround1.png','theme/style/hp/image/xinround2.png','theme/style/hp/image/xinround3.png','theme/style/hp/image/xinround4.png',]
};

2、再来看看config.js,这个里面也是只有一个全局变量window.conifg,里面各种参数,比如禁表、玩家名称、超时设置、身份、游戏模式等的配置文件。内容如下:

window.config={forbidai:['ns_liuzhang','xin_yuji','re_yuji'],forbidai_user:[],forbidall:[],forbidstone:['zhugedan','pal_xuanxiao','hs_malfurion','lusu','chenlin','hs_siwangzhiyi','gjqt_bailitusu','yuanshao','swd_anka','swd_nicole','daqiao','re_daqiao','hs_xuanzhuanjijia','zhuran','huatuo','swd_tuwei','hs_guldan','wangyi','caoang','swd_guyue','swd_rongshuang','swd_jiangziya','guojia','re_guojia','shen_caocao','swd_qiner','caopi','hs_yngvar','guansuo','gjqt_aruan','swd_hanluo','hs_anduin','swd_huanglei','yxs_yujix','yxs_luzhishen','swd_muyun','ow_tianshi','pal_yuejinzhao','hs_antonidas','xushi','hs_lreno'],forbidchess:['hetaihou','swd_kangnalishi'],forbidboss:['caiwenji','gjqt_aruan','pal_xuanxiao','swd_hupo'],forbiddouble:['zhugedan','swd_kangnalishi','dongzhuo','wutugu','hs_siwangzhiyi','hs_ronghejuren','hs_shanlingjuren'],forbidthreecard:['qiankunbiao','shenhuofeiya','gw_ciguhanshuang','gw_birinongwu','gw_qinpendayu','gw_poxiao'],all:{sgscharacters:['standard','shenhua','xinghuoliaoyuan','refresh','yijiang','sp','extra','old','mobile','tw'],sgscards:['standard','extra','sp','guozhan','zhulu'],sgsmodes:['identity','guozhan','versus','doudizhu','single','brawl','connect'],stockmode:['identity','guozhan','versus','boss','doudizhu','single','chess','stone','connect','brawl','tafang'],stockextension:['boss','cardpile','coin','wuxing'],layout:['default','newlayout'],theme:['woodden','music','simple'],card_font:['xiaozhuan','huangcao','caoshu','xingshu'],double_hp:['hejiansan','pingjun','zuidazhi','zuixiaozhi','zonghe'],image_background_filter:['default','blur','gray','sepia','invert','saturate','contrast','hue','brightness'],},game:'sgs',duration:500,hoveration:1000,doubleclick_intro:true,cheat:false,volumn_background:8,volumn_audio:8,connect_avatar:'caocao',connect_nickname:'无名玩家',config_menu:true,auto_popped_config:true,auto_popped_history:false,auto_skill:true,auto_confirm:true,enable_drag:true,enable_pressure:false,pressure_taptic:true,hover_handcard:true,hover_all:true,right_info:true,longpress_info:true,long_info:true,background_music:'music_default',background_audio:true,background_speak:true,glow_phase:'yellow',die_move:'flip',skin:{},gameRecord:{},extensionInfo:{},autoskilllist:[],hiddenModePack:[],hiddenCharacterPack:[],hiddenCardPack:[],hiddenPlayPack:[],hiddenBackgroundPack:[],customBackgroundPack:[],favouriteCharacter:[],favouriteMode:[],recentIP:[],vintageSkills:[],alteredSkills:[],brokenFile:[],theme:'woodden',layout:'mobile',card_style:'default',cardback_style:'default',hp_style:'default',image_character:'default',image_background:'default',asset_image:true,asset_font:true,card_font:'xiaozhuan',show_statusbar_ios:'off',show_statusbar_android:false,show_name:true,show_replay:false,show_round_menu:true,show_pause:true,show_auto:true,show_volumn:true,show_cardpile:true,only_fullskin:true,show_connect:true,show_wuxie:false,show_wuxie_self:true,show_stat:true,show_playerids:true,show_scrollbar:false,mousewheel:true,fold_card:true,threed_card:false,vertical_scroll:false,handcard_scroll:0,animation:true,skill_animation_type:'default',paused:false,title:false,button_press:true,damage_shake:true,log_highlight:true,player_border:'normal',radius_size:'default',modeconfig:false,gameconfig:false,appearence:false,video:'20',coin:0,intro:'i',right_click:'pause',sort:'type_sort',cards:['standard','ex','extra','sp','classic','basic'],characters:['standard','shenhua','sp','yijiang','refresh','xinghuoliaoyuan','mobile','extra'],connect_characters:[],connect_cards:[],plays:[],extensions:[],banned:[],bannedcards:[],forbidlist:[],bannedpile:{},customcardpile:{},addedpile:{},mode:'identity',mode_config:{global:{player_number:8,auto_identity:'off',double_character:false,save_progress:true,free_choose:true,swap:true,change_identity:true,battle_number:3,double_hp:'pingjun',},identity:{identity:[['zhu','fan'],['zhu','nei','fan'],['zhu','zhong','nei','fan'],['zhu','zhong','nei','fan','fan'],['zhu','zhong','nei','fan','fan','fan'],['zhu','zhong','zhong','nei','fan','fan','fan'],['zhu','zhong','zhong','nei','fan','fan','fan','fan'],],choice:{zhu:3,zhong:4,nei:5,fan:3,},show_identity:true,difficulty:'normal',dierestart:true},guozhan:{difficulty:'normal',initshow_draw:'mark',dierestart:true},},current_mode:{},customforbid:[],forbid:[['huashen'],['rehuashen'],['xinmanjuan'],//['xinleiji','fuji'],['xinleiji','xinfu_jijun'],['reluanji','jueqing'],['lianying','rende'],['lianying','anxian'],['lianying','yinguo'],['lianying','qingjian'],['boss_juejing','rende'],['boss_juejing','anxian'],['boss_juejing','yinguo'],['boss_juejing','qingjian'],['shangshi','rende'],['shangshi','anxian'],['shangshi','yinguo'],['shangshi','qingjian'],['rende','relianying'],['anxian','relianying'],['yinguo','relianying'],['shenxing','relianying'],['qingjian','relianying'],['rende','yuling'],['anxian','yuling'],['yinguo','yuling'],['qingjian','yuling'],//['qingnang','yiji'],//['qingnang','reyiji'],//['qingjian','tuntian'],// ['yiji','tuntian'],// ['reyiji','tuntian'],['tuntian','guidao'],['tuntian','tiandao'],['tuntian','huanshi'],// ['tuntian','guicai'],// ['jiang','chongzhen'],// ['fenji','yuling'],['jiushi','guixin'],['xiuhua','qiaoxie'],['xiuhua','xuanfeng'],['xiuhua','duanxing'],['xiuhua','xiaoji'],['xiuhua','xiaoji'],// ['jiushi','jushou'],// ['jiushi','kuiwei'],['zishu','xinfu_songsang'],['zishu','shenxing'],]
};

 3、再看package.js,同样的,就一个全局变量,window.noname_package,里面存放了,所有的武将包、卡牌包、模式包、背景图片、样式等。内容如下:

window.noname_package={character:{standard:'标准',refresh:'界限突破',shenhua:'神话再临',xinghuoliaoyuan:'星火燎原',yijiang:'一将成名',sp:'SP',extra:'神将',       mobile:'移动版',old:'怀旧',diy:'DIY',tw:'外服武将',yxs:'英雄杀',hearth:'炉石传说',gwent:'昆特牌',mtg:'万智牌',ow:'守望先锋',swd:'轩辕剑',gujian:'古剑奇谭',xianjian:'仙剑奇侠传',},card:{standard:'标准',extra:'军争',sp:'SP',guozhan:'国战',zhulu:'逐鹿天下',zhenfa:'阵法',yunchou:'运筹帷幄',swd:'轩辕剑',gujian:'古剑奇谭',hearth:'炉石传说',gwent:'昆特牌',mtg:'万智牌',huanlekapai:'欢乐卡牌',},play:{boss:'诸神降临',cardpile:'牌堆补充',wuxing:'五行生克',coin:'富甲天下',},mode:{identity:'身份',guozhan:'国战',versus:'对决',connect:'联机',boss:'挑战',doudizhu:'斗地主',single:'单挑',chess:'战棋',tafang:'塔防',stone:'炉石',brawl:'乱斗',},submode:{identity:{normal:'身份模式',zhong:'忠胆英杰',purple:'3v3v2',},guozhan:{normal:'国战模式',mingjiang:'明将国战'},versus:{four:'四人对抗',three:'统率三军',two:'欢乐成双',jiange:'守卫剑阁',siguo:'四国争霸',standard:'自由对决'},chess:{combat:'战棋模式',three:'战棋统率',leader:'战棋君主'},single:{normal:'新1v1',},},background:{planetarian_bg:'星梦',ol_bg:'龙纹',heaven_bg:'红烧',kyoani_bg:'京都',key_bg:'键社',zhulin_bg:'竹林',shengshi_bg:'盛世',taoyuan_bg:'桃园',zhanhuo_bg:'战火',huangtian_bg:'黄天',september_bg:'九月',yinxiang_bg:'印象',zhanyun_bg:'战云',beipan_bg:'背叛',lanting_bg:'兰亭',lingju_bg:'灵雎',sanying_bg:'三英',wangshi_bg:'往事',xiongxin_bg:'雄心',xinsha_bg:'新杀',noname_bg:'璀璨',wuming_bg:'无名',},music:{music_phliosophy:'Philosophy of ours',music_diaochan:'貂蝉',music_shezhan:'舌战群儒',music_danji:'千里走单骑',music_jifeng:'祭风',music_jilve:'极略',},font:{xiaozhuan:'小篆',xinwei:'新魏',huangcao:'黄草',yuanli:'楷体',xingkai:'行楷',shousha:'手杀',},theme:{woodden:'木纹',music:'音乐',simple:'简约'}
};

☆☆☆☆☆4.最后,让我们来看重头戏,game.js,绝大多数功能都在这个js里面完成。整个文件有50849行,是的你没看错,一个程序文件有5万多行,而且没有注释,可以想象下解读的难度。不过不怕,咱们还是一点一点来。内容太多就不贴了,先看全局。整个文件,有一个自动执行(有小括弧包含着)的函数构成,这个函数,有6个复杂的变量,并在最后调用了其中一个变量的一个子函数lib.init.init(),看来,正在的程序入口,应该就是他了。截图如下:

(中午时间,抽空写的,先到这儿吧。去吃饭了,还得准备下午的会议。下期继续解读game.js,万里长征踏上了第一步,感觉距离找到程序运行框架和需要的api越来越近了。)

【115@365】三国杀开源系列之六-入口文件解读相关推荐

  1. 【115@365】三国杀开源系列之七-game.js解读之lib.init.init

    通过上期的解读,我们发现,程序的疑似入口可能是有5万多行代码的game.js(因为自动加载的程序里,update.js.config.js.package.js都只有一个全局环境变量,所以排除掉),而 ...

  2. 【122@365】三国杀开源系列之八-game.js解读之lib.init.init(比较乱,附首页的html)

    上周好忙,一直没空写东西.今天五一,昨天和朋友们玩儿到凌晨4点多,6点多又醒来,睡意消退,刷了一会儿手机,决定起来继续看看noname的代码吧,不出一个阶段性成果,心里总是不踏实. 上次解读到疑似程序 ...

  3. 三国杀开源系列之一104@365

    (此文原在新浪博客上发的,但是新浪博客的插入代码实在是不友好,忍无可忍的情况下,又回到csdn上重新写一遍.) 一直想写一系列的系列教程,这么多年挖了很多大坑一直没有填(坑都在小本本上记着,欠下的债迟 ...

  4. 三国杀开源系列之四-工程目录分析107@365

    整个工程的根目录如下: 文件(夹) 说明 .eslintrc.json ESLint(js代码错误检测)的配置文件 .gitignore git版本管理工具生成的文件(请无视) audio 各种配音文 ...

  5. 三国杀开源系列之二105@365

    (此文原在新浪博客上发的,但是新浪博客的插入代码实在是不友好,忍无可忍的情况下,又回到csdn上重新写一遍.) 今天,加班搞的比较晚,在公司了也是经历了很多事.希望自己越来越好.继续写noname的教 ...

  6. 三国杀开源系列之三106@365

    昨天已经成功的新建了第一个扩展英雄和第一个技能,但是看了下代码,虽然大部分都能猜的出来是什么意思,但是没有api实在是让人很痛苦.今天先把第一个技能解读写出来,然后下一步不准备再写新技能了,先理一下整 ...

  7. 三国杀开源系列之九-vscode调试electron

    好久没填这个系列的坑了,最近有朋友问,所以就更一篇.主要内容是写vscode调试electron的方法. 这个noname的三国杀框架用js写的,没有任何参考文档,调试梳理代码非常麻烦.最开始使用了s ...

  8. go开源文件服务器框架,golang微服务框架go-zero系列-4:go-zero文件服务

    golang微服务框架go-zero系列-4:go-zero文件服务 go-zero本身支持文件服务,但是我们需要写相关的handler文件,本文目的在于 不写任何一个和文件相关的handler 如果 ...

  9. 源码解读_入口开始解读Vue源码系列(二)——new Vue 的故事

    作者:muwoo 转发链接:https://github.com/muwoo/blogs/blob/master/src/Vue/2.md 目录 入口开始解读Vue源码系列(一)--造物创世 入口开始 ...

  10. 「视频直播技术详解」系列之六:现代播放器原理

    ​关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 本系列文章大纲如下: ...

最新文章

  1. 蹦球传说诺基亚java_bouncetales蹦球传说
  2. leetcode143 重排链表
  3. 热备份路由协议(HSRP)
  4. java setstate,5.state更新流程(setState里到底发生了什么)
  5. [PAT] 02-线性结构2 Reversing Linked List(单向链表的逆转) - C语言实现
  6. echarts中国地图及经纬度json
  7. Eclipse 切换 SVN 地址
  8. Android studio app登录界面设计
  9. NOIP2017提高组题解(待填坑)
  10. New Year Snowmen codeforces 140C
  11. ad16 导入dwg_AD16怎样精确导入CAD文件
  12. Hash一致性算法(分片机制)
  13. jquery触屏幻灯片
  14. 8088CPU有多少根数据线和地址线?为什么8根数据线却说是16位数据线?
  15. 如何通过数据分析,提升游戏次日留存
  16. Java微信公众平台开发(十六)--微信网页授权(OAuth2.0授权)获取用户基本信息
  17. 神奇的魔术师——简单工厂模式
  18. DX11(零)-前言
  19. 淘宝api Python 接口升级 3.0 版本 主要解决图片上传问题
  20. 福到了 python

热门文章

  1. TP5和TP3.2区别
  2. 网络恶趣实验——二层广播风暴
  3. 2020电赛F题总结回顾(openmv实现视觉)
  4. Excel技能树系列05:TEXT函数,IF函数和INDEX+MATCH组合查找函数
  5. 定义fact(n)函数,调用函数,返回值
  6. LRC 文件格式定义
  7. (转)Intel Atom处理器详细指标及市场前景
  8. 777 权限 android,Android linux系统644、755、777权限详解
  9. linux中目录权限777,Linux文件和目录的777、755、644权限解释
  10. 矩形波 matlab,Matlab的方波函数