简单看了看 Unlight 的源代码。
从 Cfox 那里听说了这款将近十年前的页游 Unlight。游戏公司前几年因为运营不善而倒闭,前段时间发布消息说要开放游戏图片素材和游戏源代码。上周已经全部上传到 GitHub 了。
Unlight 并没有当今手游那样精彩华丽,但是因为独特的对战系统和游戏设计,即使在倒闭这么多年后的今天,也有大批玩家期待着游戏能够复活。虽然我并不是 Unlight 玩家,了解到这个游戏的时候似乎也只剩下一个模拟器可以用,但是我对这款游戏还是非常感兴趣的。
游戏的客户端和服务器端分别用了 ActionScript 和 Ruby,作为 Ruby 萌新使用者,这个游戏源代码的开源也是一个值得我研究和学习的机会。
客户端
客户端用的是 ActionScript。ActionScript 没接触过,看不懂,今天先跳过。
服务器端
服务器端是用 Ruby 写的,打开 server/
迎面一个 Gemfile
,基本上就能知道 Unlight 的服务器端用了什么样的技术。
source :rubygems
gem 'dalli', '~>2.0.2'
gem 'eventmachine'
gem 'mysql2','~>0.3.7'
gem 'oauth','~>0.4.5'
gem 'RocketAMF','~>0.2.1'
gem 'rspec','~>2.11.0'
gem 'sequel','~>4.0'
gem 'RubyInline','~>3.12.4'
gem 'sqlite3','~>1.3.11'
gem 'daemons'
gem 'gmp'
Unlight 用的基本上都是一些常见的技术,MySQL、SQLite、OAuth 这些,而且用的第三方 gem 并不多。说起来,我自己在用 Ruby 做自用程序的时候并不会用到 MySQL 而是 SQLite;这里用 MySQL 应该是考虑到了可扩展性和可靠性?OAuth 应该是为了让用户用第三方平台登录?
总之先看看服务器端的目录吧……
bin/
各种不同功能服务器的启动指令+一键重启data/
游戏的资料,包括本地化档案。db/
空的lib/
空的script/
看起来是辅助类的脚本文件src/
Unlight 的主程序Gemfile
Rakefile
bin/
这个目录里面有一堆东西,看起来很恐怖,但其实长得都差不多。拿第一个 authserver
和第二个 chatserver
对比,发现并没有什么鸟区别。
require 'rubygems'
require 'daemons'
options = {
:app_name => "ul_authserver",
:dir_mode => :normal,
:dir => 'pids',
:backtrace => true,
# :monitor => true,
:log_output => true
}
f = File.join(File.expand_path(__FILE__).gsub!("/bin/authserver",""), "/src")
Dir.chdir(File.join(File.expand_path(__FILE__).gsub!("authserver","")))
Daemons.run("#{f}/authentication.rb",options)
require 'daemons'
能确保这个服务器常驻后台。之所以采用这么多文件是为了减小服务器压力?matchserver
一共有 17 个,好多……
data
放数据的地方,其实没什么好说的。里面放的 csv 文件要导入到 MySQL 里面。
db/
和 lib/
两个文件夹是空的,所以我也懒得管他了。
script/
这个文件夹放了不少辅助类的脚本。比如最新添加进来的 update_ranking.rb
似乎是用来更新玩家排行榜的。
$:.unshift(File.join(File.expand_path("."), "src"))
require 'pathname'
require 'unlight'
module Unlight
case THIS_SERVER
when SERVER_SB then
WeeklyDuelRanking.update_ranking(SERVER_SB)
EstimationRanking::update_total_duel_ranking(SERVER_SB)
TotalEventRanking::start_up(SERVER_SB)
end
end
比较引起我注意的是 import_csv_data.rb
。这个脚本可以把 /data/csv
里面的数据导入到一个 MySQL 数据库里面。
if `pwd`.chomp == "/home/unlight/svn/trunk/app/server"
puts "このスクリプトはここで使用してはいけません"
exit
end
opt = OptionParser.new
$VER_OVERWRITE = false
$VER_NUMBERING = false
$VER_RESTART = false
over_text = "(ドロップモード:すべて捨てて作り直します。時間がかかりますが正確です )"
opt.on('-n', '--numbering') {|v|
$VER_NUMBERING = true
over_text = "(ナンバリングモード:数値で指定されたファイルのみ更新します)"
}
opt.on('-r', '--restart') {|v|
$VER_RESTART = true
over_text = "(再開モード:数値で指定されたファイル以降を更新します)"
}
opt.parse!(ARGV)
if $VER_NUMBERING && $VER_RESTART
puts "Option n, r は同時に指定出来ません。"
exit
end
$arg = ARGV.shift
puts "serverに存在するcsvdataでインポートしますか (sb)" + over_text
$arg = gets.chomp
@m_set = []
LANGUAGE_SET = /_tcn$|_en$|_scn$|_kr$|_fr$|_ina$|_thai$/
MESSAGES = { "sb" => "SandBox"}
DATABASES = {
"192.168.1.14:5001" => "SandBox",
}
这一段内容似乎是初始化的一些设置,下面的 csv_import(dir, local) 是导入用的本体。
这个目录下面的东西感觉很杂,感觉什么都有,但是目前似乎用不上,所以暂时跳过其他文件。
src/
此处是游戏本体。文件好多,不想一个一个看了……下面是 src/
下更多的目录和我对其用途的理解:
constants/
一些常数。这里面定义的似乎是类似于玩家等级或者游戏里 bot 的操作和难度等等controller/
控制器,处理各种各样的 requestmodel/
模型,和数据库挂钩,更新玩家数据net/
涉及到了加密,我看到了 session 什么的 crypt 什么的,应该是负责客户端和服务器端的通信protocol/
游戏本体和各个服务器之间的信息交流rule/
定义了各种各样的游戏规则
有两个 rb_orig 的文件,需要重命名的。
这里面的文件今天就先不看了……明天再更新吧。
仅有一条评论
2019年08月09日 • 回复
「文件好多,不想一个一个看了」wwwwww