游戏王残局简化版

Annotation For script/ygopro_编译.html
Login

Annotation For script/ygopro_编译.html

Origin for each line in script/ygopro_编译.html from check-in cdf7904414:

3ee8d98272 2023-10-14    1: <!DOCTYPE html>
3ee8d98272 2023-10-14    2: <html xmlns="http://www.w3.org/1999/xhtml" lang xml:lang>
3ee8d98272 2023-10-14    3: <head>
3ee8d98272 2023-10-14    4:   <meta charset="utf-8" />
3ee8d98272 2023-10-14    5:   <meta name="generator" content="pandoc" />
3ee8d98272 2023-10-14    6:   <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
3ee8d98272 2023-10-14    7:   <title>ygopro_编译</title>
3ee8d98272 2023-10-14    8:   <style>
3ee8d98272 2023-10-14    9: code{white-space: pre-wrap;}
3ee8d98272 2023-10-14   10: span.smallcaps{font-variant: small-caps;}
3ee8d98272 2023-10-14   11: div.columns{display: flex; gap: min(4vw, 1.5em);}
3ee8d98272 2023-10-14   12: div.column{flex: auto; overflow-x: auto;}
3ee8d98272 2023-10-14   13: div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
3ee8d98272 2023-10-14   14: 
3ee8d98272 2023-10-14   15: ul.task-list[class]{list-style: none;}
3ee8d98272 2023-10-14   16: ul.task-list li input[type="checkbox"] {
3ee8d98272 2023-10-14   17: font-size: inherit;
3ee8d98272 2023-10-14   18: width: 0.8em;
3ee8d98272 2023-10-14   19: margin: 0 0.8em 0.2em -1.6em;
3ee8d98272 2023-10-14   20: vertical-align: middle;
3ee8d98272 2023-10-14   21: }
3ee8d98272 2023-10-14   22: .display.math{display: block; text-align: center; margin: 0.5rem auto;}
3ee8d98272 2023-10-14   23: </style>
3ee8d98272 2023-10-14   24:   <style type="text/css">@media screen and (min-aspect-ratio:1/1) {html {background-color: f8f8f8;background-image:linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%), linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%);background-size: 8px 8px;background-position: 0 0, 16px 8px;}body {border: solid #a0a0a0 1px ;border-radius: 20px ;padding: 26px ;margin: 16px ;color: #101010 ;background: linear-gradient(to right, #efefefff, #efefeffc);padding: 2em 11%;line-height: 2.1em;box-shadow: 0px 0px 1px rgba(160, 160, 160, 1), 0px 0px 1px rgba(160, 160, 160, 1);}}h1,h2,h3,h4,h5,h6 {font-size: 1.5em;color: #3F5770;border-bottom: 1px solid #dddddd;margin: 1.2em 0em;}a {list-style: none;border-right: 0.3em solid #5183C466;border-left: 0.3em solid #5183C466;padding: 0.2em 0.4em;margin-bottom: 0.2em;margin-top: 0.3em;background-color: white;text-decoration-color: blue;border-radius: 0.2em;}a:visited {color: blue;text-decoration-color: white;}a:active {color: red;}nav ul li {margin: 1.2em 0em;}p::before {}p {margin: 1.2em 0;letter-spacing: 0.15em;}.title {background-color: white;font-size: 2em;text-align: center;}b {background-color: white;list-style: none;border-right: 0.3em solid #5183C466;border-left: 0.3em solid #5183C466;padding: 0.2em 0.4em;margin-bottom: 0.2em;margin-top: 0.3em;border-radius: 0.2em;}details {border-bottom: 1px solid #dddddd;}details > summary {list-style: none;border-right: 0.3em solid #5183C466;border-left: 0.3em solid #5183C466;padding: 0.2em 0.4em;margin-bottom: 0.2em;margin-top: 0.3em;outline: none;border-radius: 0.2em;}pre {background: #f6f6f6;border-left: 0.5em solid #ccc;padding: 0.4em;border-radius: 0.2em;overflow-wrap:break-word;}pre:active {color: red;}code {font-family: "Verdana";}button {background: #ffffff;color: #20894d;}button:active {color: red;}</style>
3ee8d98272 2023-10-14   25:   <!--[if lt IE 9]>
3ee8d98272 2023-10-14   26:     <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
3ee8d98272 2023-10-14   27:   <![endif]-->
3ee8d98272 2023-10-14   28: </head>
3ee8d98272 2023-10-14   29: <body>
3ee8d98272 2023-10-14   30: <header id="title-block-header">
3ee8d98272 2023-10-14   31: <h1 class="title">ygopro_编译</h1>
3ee8d98272 2023-10-14   32: </header>
3ee8d98272 2023-10-14   33: <nav id="TOC" role="doc-toc">
3ee8d98272 2023-10-14   34: <ul>
3ee8d98272 2023-10-14   35: <li><a href="#前言" id="toc-前言"><span class="toc-section-number">1</span> 前言</a></li>
3ee8d98272 2023-10-14   36: <li><a href="#新建文件夹" id="toc-新建文件夹"><span class="toc-section-number">2</span> 新建文件夹</a></li>
bcc9116867 2023-10-14   37: <li><a href="#编译器" id="toc-编译器"><span class="toc-section-number">3</span> 编译器</a></li>
bcc9116867 2023-10-14   38: <li><a href="#lua" id="toc-lua"><span class="toc-section-number">4</span> lua</a></li>
3ee8d98272 2023-10-14   39: </ul>
3ee8d98272 2023-10-14   40: </nav>
3ee8d98272 2023-10-14   41: <h1 data-number="1" id="前言"><span class="header-section-number">1</span> 前言</h1>
3ee8d98272 2023-10-14   42: <p>来,走起,我们来编译一个小且可用的 ygopro 。</p>
edc8fb2581 2023-10-14   43: <p>功能不求全,<b>只要有</b>残局功能就够了。</p>
3ee8d98272 2023-10-14   44: <h1 data-number="2" id="新建文件夹"><span class="header-section-number">2</span> 新建文件夹</h1>
3ee8d98272 2023-10-14   45: <p>万事第一步,先新建个文件夹……</p>
3ee8d98272 2023-10-14   46: <p>然后,不做了,等一年后再来看,进度 0%,哈哈,这才是正常轨迹。</p>
edc8fb2581 2023-10-14   47: <p>上面虽然是玩笑话,但也估摸着是我的真实经历,只不过我这个拖延王<b>拖延了</b>大概六年。</p>
3ee8d98272 2023-10-14   48: <p>好了,给这个文件夹改名吧。</p>
3ee8d98272 2023-10-14   49: <p>我则取名叫:</p>
3ee8d98272 2023-10-14   50: <pre><code>ygopro</code></pre>
bcc9116867 2023-10-14   51: <h1 data-number="3" id="编译器"><span class="header-section-number">3</span> 编译器</h1>
edc8fb2581 2023-10-14   52: <p>编译时,一个<b>很麻烦</b>的东西就是编译器。</p>
edc8fb2581 2023-10-14   53: <p>很长一段时间,我都不知道到哪里去下编译器,也不知道编译器的名字叫什么。</p>
bcc9116867 2023-10-14   54: <p>像这种基础性的东西难道不应该有某某一个人把它们汇总起来让人随便下吗?</p>
bcc9116867 2023-10-14   55: <p>后来我发现,诶,还真有,但那人的网站在百度上很难搜。</p>
bcc9116867 2023-10-14   56: <p>现在的搜索引擎,早不名副其实了。</p>
5a88cadc45 2023-10-14   57: <p>我们要下载的编译器叫 msvc ,准确点,应该叫 MSVC 。</p>
5a88cadc45 2023-10-14   58: <p>不过我懒得换大小写,后文直接叫 msvc 了。</p>
5a88cadc45 2023-10-14   59: <p>msvc 是一家叫微软的公司出的,这公司现在很鸡贼,把 msvc
5a88cadc45 2023-10-14   60: 的下载页面给隐藏了,狂推 vs 的下载。</p>
5a88cadc45 2023-10-14   61: <pre><code>https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools</code></pre>
5a88cadc45 2023-10-14   62: <p>下载下来之后,会有一个 exe ,直接进行执行。</p>
5a88cadc45 2023-10-14   63: <p>然后就会有一大堆东西让你选,你挑着系统 sdk 与
5a88cadc45 2023-10-14   64: c++编译工具安装就行了。</p>
5a88cadc45 2023-10-14   65: <p>但这里会冒出来一个大问题:</p>
5a88cadc45 2023-10-14   66: <p>下不动!</p>
5a88cadc45 2023-10-14   67: <p>网络问题,我还真没法解决。</p>
5a88cadc45 2023-10-14   68: <p>中国的网络封锁太强,自己看情况想办法绕过去吧。</p>
5a88cadc45 2023-10-14   69: <p>就算我这写了一点解决网络问题的方法,以现在的封锁趋势,过一段时间也就不能用了。</p>
5a88cadc45 2023-10-14   70: <p>不过,你还是有可能下得动的,因为彻底封死网络会伤某些人的心,所以现在是采用人群分化的方法来封锁网络,顺便还能挑起人群之间的内部矛盾。</p>
edc8fb2581 2023-10-14   71: <p>安装好编译器之后,桌面上又没快捷方式,不知道该怎么打开。</p>
edc8fb2581 2023-10-14   72: <p>这时应该打开 windows 的搜索功能,用快捷键就能打开了,我用的是 win8.1
edc8fb2581 2023-10-14   73: 系统,可以用 win+s 组合键打开。</p>
edc8fb2581 2023-10-14   74: <p>然后输入:</p>
edc8fb2581 2023-10-14   75: <pre><code>comm</code></pre>
edc8fb2581 2023-10-14   76: <p>你查字典大概是查不到这单词的,因为这是我记不住那个完整名称而记下来的简写。</p>
edc8fb2581 2023-10-14   77: <p>全名应该是「命令行」这三个字的英文版。</p>
edc8fb2581 2023-10-14   78: <p>你输入这单词之后会出现一堆黑框框,选「不带 x64 」的黑框框打开。</p>
edc8fb2581 2023-10-14   79: <p>你这样打开之后,看起来它仅仅只是打开个 cmd
edc8fb2581 2023-10-14   80: 控制台而已,其实它调用了一堆脚本来设置各组件的环境变量。</p>
edc8fb2581 2023-10-14   81: <p>比较可惜的是,这些它设置的环境变量它不会告诉你,这就导致很多人其实做了无用功去重复做了这些脚本已经帮他们做好的事。</p>
edc8fb2581 2023-10-14   82: <p>到这里,编译器就准备好了。</p>
edc8fb2581 2023-10-14   83: <p>而且它也设置了 32 位的环境。</p>
bcc9116867 2023-10-14   84: <h1 data-number="4" id="lua"><span class="header-section-number">4</span> lua</h1>
bcc9116867 2023-10-14   85: <p>先下载 lua 的源码:</p>
bcc9116867 2023-10-14   86: <pre><code>https://www.lua.org/download.html</code></pre>
bcc9116867 2023-10-14   87: <p>直接下最新版本。</p>
bcc9116867 2023-10-14   88: <p>顺便一说, lua5.3 有 bug ,性能也不如 lua5.4 。</p>
bcc9116867 2023-10-14   89: <p>下完之后,解压,会出现一大堆文件,别怕。</p>
edc8fb2581 2023-10-14   90: <p>先在 ygopro 下建一个文件夹:</p>
edc8fb2581 2023-10-14   91: <pre><code>lib</code></pre>
edc8fb2581 2023-10-14   92: <p>现在的目录结构是:</p>
edc8fb2581 2023-10-14   93: <pre><code>ygopro
edc8fb2581 2023-10-14   94: |——|—— lib</code></pre>
edc8fb2581 2023-10-14   95: <p>再建一个文件夹:</p>
edc8fb2581 2023-10-14   96: <pre><code>ygopro
edc8fb2581 2023-10-14   97: |—— lib
edc8fb2581 2023-10-14   98: |——|—— lua</code></pre>
edc8fb2581 2023-10-14   99: <p>把 lua 源码的 src 文件夹复制过来:</p>
edc8fb2581 2023-10-14  100: <pre><code>ygopro
edc8fb2581 2023-10-14  101: |—— lib
edc8fb2581 2023-10-14  102: |——|—— lua
edc8fb2581 2023-10-14  103: |——|——|—— src</code></pre>
edc8fb2581 2023-10-14  104: <p>注意哦,不是光把文件复制过来就可以了,你自己本身也需要对这些源码的特性有一个基本的了解。</p>
edc8fb2581 2023-10-14  105: <p>比如 lua 的这个源码,就需要删除两个文件:</p>
edc8fb2581 2023-10-14  106: <pre><code>lua.c
edc8fb2581 2023-10-14  107: luac.c</code></pre>
edc8fb2581 2023-10-14  108: <p>这是因为这两个文件里都有主函数。</p>
edc8fb2581 2023-10-14  109: <p>这里要特别讲一下,什么叫主函数。</p>
edc8fb2581 2023-10-14  110: <p>主函数就是应用程序的入口函数,相当于一座城堡的大门,想进城堡旅游,就得进门,不然进不去的。</p>
edc8fb2581 2023-10-14  111: <p>有些人学程序学四个学期了仍然不知道什么是主函数,这其实都很正常,因为各人有各人的局限性。</p>
edc8fb2581 2023-10-14  112: <p>好了,接下来就要开始编译了。</p>
edc8fb2581 2023-10-14  113: <p>你也许会奇怪,这不是 lua 吗?</p>
edc8fb2581 2023-10-14  114: <p>又不是 ygopro 。</p>
edc8fb2581 2023-10-14  115: <p>怎么现在就要开始编译了?</p>
edc8fb2581 2023-10-14  116: <p>编译其实分两步,一步是编译,一步是连接。</p>
edc8fb2581 2023-10-14  117: <p>我们先编译,等到了最后再进行连接。</p>
edc8fb2581 2023-10-14  118: <p>打开之前下载的 msvc ,把它的目录转到 ygopro ,然后输入:</p>
edc8fb2581 2023-10-14  119: <pre><code>cl</code></pre>
edc8fb2581 2023-10-14  120: <p>然后应该会报错。</p>
edc8fb2581 2023-10-14  121: <p>加个参数:</p>
edc8fb2581 2023-10-14  122: <pre><code>cl /c ./lib/lua/src/*.c</code></pre>
edc8fb2581 2023-10-14  123: <p>那个梅花号是通配符,这样子会把那个目录下的所有后缀名为「 c
edc8fb2581 2023-10-14  124: 」的文件都给编译了。</p>
edc8fb2581 2023-10-14  125: <p>也许你会奇怪,这就编译完了?</p>
edc8fb2581 2023-10-14  126: <p>原来编译这么简单。</p>
edc8fb2581 2023-10-14  127: <p>别人都封装好了,当然简单了。</p>
edc8fb2581 2023-10-14  128: <p>其实就这么简单的事,窗户纸不捅破,就一直<b>做不了</b>。</p>
edc8fb2581 2023-10-14  129: <p>接下来,我们开优化:</p>
edc8fb2581 2023-10-14  130: <pre><code>cl /O2 /c ./lib/lua/src/*.c</code></pre>
edc8fb2581 2023-10-14  131: <p>代码速度慢一点,没啥大关系,还有编译器优化可以帮我们。</p>
edc8fb2581 2023-10-14  132: <p>接下来讲点底层。</p>
edc8fb2581 2023-10-14  133: <p>电脑里其实啥也没有,只有 01 ,我再强调一下,「 0 」、「 1 」。</p>
edc8fb2581 2023-10-14  134: <p>那这些 01 是怎么运行的?</p>
edc8fb2581 2023-10-14  135: <p>01
edc8fb2581 2023-10-14  136: 根本就运行不了,必须有东西承载着它们,而承载它们的那个东西理所应当就是计算机的底层吧?</p>
edc8fb2581 2023-10-14  137: <p>你可以把那个东西看成是一个开关,它明显有两种状态,一种是开,一种关。</p>
edc8fb2581 2023-10-14  138: <p>于是我们可以「把开叫做 0 ,把关叫做 1 」,也可以「把开叫做 1
edc8fb2581 2023-10-14  139: ,把关叫做 0 」</p>
edc8fb2581 2023-10-14  140: <p>但这样子,我们人与人之间就不好互相交流了,于是有些组织就给这些名字定了规范。</p>
edc8fb2581 2023-10-14  141: <p>好了,你现在已经把 01 与实物联系起来了,懂了。</p>
edc8fb2581 2023-10-14  142: <p>然后再把刚才的忘掉。</p>
edc8fb2581 2023-10-14  143: <p>因为刚才这个模型虽然合理,但其实是用来描述继电器的。</p>
edc8fb2581 2023-10-14  144: <p>计算机内部使用的是半导体——它会有一个高电平,一个低电平。</p>
edc8fb2581 2023-10-14  145: <p>于是我们可以像把开关的开关状态与 01
edc8fb2581 2023-10-14  146: 联系起来一样,把半导体的电平高低状态与 01 联系起来。</p>
edc8fb2581 2023-10-14  147: <p>这个所谓的电平具体是指啥,我已经忘了,不过总不外乎是「电压」、「电流」这些与电相关的量度。</p>
edc8fb2581 2023-10-14  148: <p>你小时候家里经常停电吗?</p>
edc8fb2581 2023-10-14  149: <p>如果有过停电或电烧电器的经历,那么应该会有「电不稳定」的印象。</p>
edc8fb2581 2023-10-14  150: <p>电平受制于电的不稳定,所以它是不精确的。</p>
edc8fb2581 2023-10-14  151: <p>电平是低于某个临界点,就属于低电平,高于某个临界点,就属于高电平。</p>
edc8fb2581 2023-10-14  152: <p>这个临界点是人定的。</p>
edc8fb2581 2023-10-14  153: <p>接下来,不讲底层了。</p>
cdf7904414 2023-10-14  154: <p>01 往上可以组建逻辑门,而汇编编程语言可以指导逻辑门的运行。</p>
cdf7904414 2023-10-14  155: <p>但问题在于各个商家给逻辑门定的汇编语言是不一样的,于是我们需要一个通用的汇编语言,而这就是
edc8fb2581 2023-10-14  156: c 语言的别称——「便携式汇编语言」。</p>
cdf7904414 2023-10-14  157: <p>一门编程语言可以大致分为三部分:语法、标准库、自定义库。</p>
cdf7904414 2023-10-14  158: <p>lua 会用到 c 语言的标准库,而我们从上面的过程可以看到系统肯定会有 c
cdf7904414 2023-10-14  159: 语言标准库。</p>
cdf7904414 2023-10-14  160: <p>加个参数:</p>
cdf7904414 2023-10-14  161: <pre><code>cl /MD /O2 /c ./lib/lua/src/*.c</code></pre>
cdf7904414 2023-10-14  162: <p>这样子, lua 就会采用系统自带的 c 语言标准库了。</p>
cdf7904414 2023-10-14  163: <p>但仅仅是这样子还不行,因为 ygopro 不是一个纯 c 语言的项目。</p>
cdf7904414 2023-10-14  164: <p>这里的 lua 需要采用 cpp ,也就是 c++的方式进行编译:</p>
cdf7904414 2023-10-14  165: <pre><code>cl /TP /MD /O2 /c ./lib/lua/src/*.c</code></pre>
cdf7904414 2023-10-14  166: <p>然后由于 cpp
cdf7904414 2023-10-14  167: 的特性,你会收到一堆报错,此时编译器会提醒你再加个参数:</p>
cdf7904414 2023-10-14  168: <pre><code>cl /EHsc /TP /MD /O2 /c ./lib/lua/src/*.c</code></pre>
cdf7904414 2023-10-14  169: <p>好,大功告成,这就算把 lua 编译完了。</p>
cdf7904414 2023-10-14  170: <p>不过,这时候,你的目录下会有一大堆的 obj 文件,不好看。</p>
cdf7904414 2023-10-14  171: <p>于是输入:</p>
cdf7904414 2023-10-14  172: <pre><code>lib /OUT:lua.lib *.obj</code></pre>
cdf7904414 2023-10-14  173: <p>这就把所有的 obj 文件合成了一个文件了。所以可以把 obj
cdf7904414 2023-10-14  174: 文件全部删了:</p>
cdf7904414 2023-10-14  175: <pre><code>del *.obj</code></pre>
cdf7904414 2023-10-14  176: <p>也就是说,我们由一堆文件中编译出了一个文件:</p>
cdf7904414 2023-10-14  177: <pre><code>lua.lib</code></pre>
3ee8d98272 2023-10-14  178: <script>
3ee8d98272 2023-10-14  179: 
3ee8d98272 2023-10-14  180: document.onclick = function(event) {
3ee8d98272 2023-10-14  181: 
3ee8d98272 2023-10-14  182:   var target = event.target
3ee8d98272 2023-10-14  183: 
3ee8d98272 2023-10-14  184:   if (target.tagName == "PRE"
3ee8d98272 2023-10-14  185:   || target.tagName == "CODE") {
3ee8d98272 2023-10-14  186:     if (window.getSelection().toString() !== "") {
3ee8d98272 2023-10-14  187:       return
3ee8d98272 2023-10-14  188:       }
3ee8d98272 2023-10-14  189:     var range = document.createRange();
3ee8d98272 2023-10-14  190:     range.selectNodeContents(target);
3ee8d98272 2023-10-14  191:     window.getSelection().removeAllRanges();
3ee8d98272 2023-10-14  192:     window.getSelection().addRange(range);
3ee8d98272 2023-10-14  193:     var successful = document.execCommand("copy");
3ee8d98272 2023-10-14  194:     target.removeAttribute("contenteditable");
3ee8d98272 2023-10-14  195:     window.getSelection().removeAllRanges();
3ee8d98272 2023-10-14  196:     }
3ee8d98272 2023-10-14  197: 
3ee8d98272 2023-10-14  198:   }
3ee8d98272 2023-10-14  199: 
3ee8d98272 2023-10-14  200: </script>
3ee8d98272 2023-10-14  201: </body>
3ee8d98272 2023-10-14  202: </html>