# 关于Neos项目上线的一些碎碎念

## 关于Neos
Neos是一个网页版的游戏王对战平台，兼容萌卡社区研发的[srvpro](https://github.com/mycard/srvpro)服务器，支持和ygopro客户端联机对战。因为我最喜欢游戏王第二代主角游城十代，因此以他的招牌怪兽卡Neos（尼奥斯）来命名。

## 毕业的那个夏天
在2022年6月份的时候，我处于即将大学本科毕业，进入社会参与工作之际。 虽然从事的行业是互联网行业而非游戏行业，但我始终存在一颗想要参与游戏研发的心， 希望有一天能参与像[只狼](https://zh.wikipedia.org/zh-cn/%E9%9A%BB%E7%8B%BC%EF%BC%9A%E6%9A%97%E5%BD%B1%E9%9B%99%E6%AD%BB) 这样能给玩家带来心灵上震撼的艺术作品的研发工作，同时也向往着像[刀剑神域](https://zh.wikipedia.org/wiki/%E5%88%80%E5%8A%8D%E7%A5%9E%E5%9F%9F) 这样充满冒险元素的空想世界。

萌生想制作Web版ygopro想法的契机是临近毕业时，那时候论文答辩也通过了，于是和同学一起玩游戏王卡牌游戏。

游戏王是我童年时最喜欢的日漫（99年生），当时小学每周五最期待的就是放学回家在香港台上看粤语版游戏王动漫。 那时候收集了很大一箱游戏王卡牌，可惜在上初中后都扔掉了。

当时从同学那边听说现在游戏王卡牌游戏还是有很大一部分团体在玩，甚至国内还有社区伙伴制作的同人对战平台[ygopro](https://ygopro.org/) 的时候，还是挺惊讶的。玩了几局，发现ygopro完成度非常得高，基本上所有卡的效果都能正确处理。

因为当时也没事，于是去看了下ygopro的源码，在逐渐了解整个的运作流程后，自然而然地产生想要制作Web版ygopro的想法（目前只支持PC/Android平台）。 现在回想，不太清楚当时的脑回路了，不过大概可以总结为以下几点：

-	对游戏王怀有童年情结；
-	对游戏开发念念不忘；
-	希望可以拓展下技术栈，包括前端和后端（目前我在工作中是偏Rust/C++的系统技术栈，之前大学时也是偏底层技术栈）；
-	[主要]希望在工作之余做一些自己喜欢的东西。

## 前期的摸索和调研
前期的调研或者说直到现在，整个项目推进过程中遇到的最大问题是ygopro的工程规范比较糟糕，前后端如何交互没有任何文档，只能通过阅读源码进行推理得出；源码组织得较为混乱，很多协议设计得也不甚合理。回想起来，这件事情自己能一直坚持做到现在，甚至完成了上线流程，属实不易。

当我把源码阅读得差不多，大概理解了ygopro的整体架构后，遇到了第一个棘手的问题：ygopro后端当时只支持原生TCP协议，不支持Websocket协议，而浏览器上只能通过Websocket协议建立全双工的网络连接。

因为是在项目初期，自己没有信心去找萌卡社区（也就是负责维护ygopro项目的社区）的开发者们沟通如何解决这个问题（当时想着自己可能只是一时心血来潮，不好意思直接去打扰他们）。于是自己想了一个解决方案：在前端和ygopro后端之间设计一个代理层，负责转发来自ygopro后端的TCP请求和前端的Websocket请求。[ygopro-proxy](https://github.com/DarkNeos/ygopro-proxy)是当时用Golang编写的这个代理层的实现。

这里不得不补充一些信息：当时的我是一个彻头彻尾的前端和Go语言小白，React和Golang都是从那时候开始接触学习的。

简而言之，前期遇到了大大小小的种种困难，但最终还是想办法摸爬滚打地跨过了，代理层ygopro-proxy能正常运作，自己也逐渐熟悉了ygopro的一些简单的前后端交互协议，并且实现了加入房间的功能。

## 加入萌卡社区
从前期开始过了大概三个月时间的时候，我对ygopro的整体架构和代码熟悉地差不多了，然后在[萌卡社区论坛](https://ygobbs.com/)上发了一篇[帖子](https://ygobbs.com/t/ygopro%E7%BD%91%E9%A1%B5%E7%89%88%E5%BC%80%E5%8F%91%E8%AE%A1%E5%88%92%EF%BC%88%E7%94%BB%E9%A5%BC%EF%BC%89/364099)，告知社区有这么一号人，不知天高地厚想要写一个网页版ygopro。

萌卡社区负责人找到我，我说我们约个腾讯会议聊吧，最终他把萌卡的创始人也拉上，我们那天晚上聊了3个小时。会议结论有三个：

- 我正式加入萌卡社区主导网页版ygopro的研发
- 可以抛弃ygopro-proxy代理层，萌卡社区的开发人员会帮忙做Websocket的支持
- 加油

第二天我在萌卡的Gitlab组织下创建了[仓库](https://code.mycard.moe/mycard/Neos)，搭好了CI，然后网页版ygopro，也就是Neos，于2022年10月16日正式进入研发阶段。

## 三年疫情的结束
2022年12月必定是被历史记载的月份，因为国内长达三年的疫情，终于放开了。14亿人被新冠偷走的三年，终于过去了。

北京不可避免地受到了第一波病毒的进攻，我们公司组内的同事前前后后都阳了一遍，最严重的烧了7，8天高烧。幸运地是我自己的症状不是那么严重，只烧了一天，后面虽然比较咳嗽，精神状态不太好，其他都还行。

当时居家办公了比较长的时间，那段时间是项目进展最快的阶段，工作日我写完需求后就在写Neos项目（由于我比较熟悉自己的业务，因此需求完成得快且质量有保障），经常是到晚上7点吃完饭就开始写，写到12点左右睡觉。周末时间更加充裕，早上刚起来的时候最精神，因此经常早上9点多起来吃点早餐就开始写Neos，写到中午一点吃中午饭，下午休息娱乐，晚上又继续写。当然也并不是所有空闲时间都在写Neos，自己也会去奥森跑跑步，和同组的实习生在北京周边游玩。

北京在11月到12月中旬的封控使得大家的生活太过于压抑了，放开后好像一股春风吹过，拂走了空气中的灰尘和负面情绪。对于我个人而言，虽然自己平时比较宅，而且也阳了，但明显感觉一扫之前的阴霾，充满了干劲，开始期待明年春暖花开的时候。

## 曙光
可能是写得多了对前端开发更熟练了，也可能是一直以来的努力慢慢生根发芽了，Neos项目慢慢完善了起来。

慢慢地可以展示手牌了。

慢慢地可以通常召唤了。

慢慢地可以处理怪兽效果了。

。。。

慢慢地Neos可以完成一些简单对局了。

## 上线
决定要上线是在2023年的春节前，我觉得这个玩意我写了这么久，看起来像那么回事了，虽然还有很多地方需要完善，但我写了这么久，基本上不可能跑路了，那就上线吧！

上线前我找萌卡负责人聊，我说这个玩意我做到这种程度了，想上个线，萌卡可以提供个域名还有服务器来部署下吗。萌卡负责人说你这界面这么丑，功能还缺这么多，先别急着上线吧。

我自己也心知肚明，Neos目前的完成度确实不是那么好，但想到自己埋头苦干了这么久，想要一些回馈，不然不知道还能不能坚持下去。于是就自己去买了个`neos.moe`的域名，在阿里云服务器上通过Nginx部署上线了。同时还顺带构建了Gitlab CI/CD流程，使得每次想要更新网站只需要提交代码就好。这时候是2023年2月19日。

上线之后，长舒一口气，有种勇者讨伐了魔王后，面对破烂不堪的世界的感觉，虽前路依旧遥远，我心如初。

## 寄语
我一直在追求一样语言上表达不出来的东西，当回顾动漫《强风吹拂》，当梅西卡塔尔世界杯圆梦，当只狼斩断不死，让神子复归常人，当路飞挑战四皇，自己都能闻到这个东西的味道。。。我觉得他们最幸福的时刻不是在梦想成真那一刻，而是在追逐的过程，就像梅西最耀眼莫过于在绿茵场上驰骋。
