default •

简单看了看 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/

这个目录里面有一堆东西,看起来很恐怖,但其实长得都差不多。拿第一个 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/ 下更多的目录和我对其用途的理解:

有两个 rb_orig 的文件,需要重命名的。

这里面的文件今天就先不看了……明天再更新吧。

💫 Comment 

仅有一条评论

  1. Cfox
    Cfox
    2019年08月09日 • 回复

    「文件好多,不想一个一个看了」wwwwww