Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2005-10-31

[Ruby] BitChannel をハック

とりあえず BitChannel での日記が簡単に書けるようになった。機能は次のもの。

  • 「日記を書く(DiaryUser20051031)」リンクの作成
  • Diary ページと [[#diary]] で日記の一覧表示
  • 日記ページには自動でコメント欄を表示

これはもうハックと言っていいんじゃないの?

職場でうっかり rm -rf * で実行して以来、 blog ツールを使ってなかったがこれで職場でも日誌がつけられそうだ。

職場ではもうずっと BitChannel を使っていて、ユーザが二人なのでマルチユーザにも対応した。 しばらく使ってみて具合がよければここの日記の移行も考えてみる。あくまで日記ツールじゃなくて Wiki だと思うのだけどその辺どうでるかが楽しみ。

改造した部分のソースが汚いのでもっときれいに書き直したい。

2005-10-28

[Ruby] BitChannel を読む (2)

def _handle(req)
  mid = "handle_#{req.cmd || 'view'}"
  return nil unless respond_to?(mid, true)
  __send__(mid, req)
end

handler.rb にあるメソッド。

req.cmd || 'view'

にあるような || の使い方がいろいろなところで発見できる。これまで自分はこういうケースを

req.cmd ? req.cmd : 'view'

などと書いてしまっていた。これじゃ Dry に反している。

この _handle メソッドが cmd に与えられた文字列から各種コマンドに対応するメソッド、そして WikiPage クラスを呼び出している。なので handle_diary メソッドや DiaryPage クラス、 テンプレートになる diary.rhtml を追加すれば日記ページが作れそうだ。

--

いままで他人のソースを見るのが嫌いでソースを読むことを避けていたが、今回はソースを読むのがすごく楽しい。職場で見かけるソースとはまったく違ってものすごく読みやすく理解しやすい。この分なら以前から目標にしていた Lily と Nadoka のソース読みも楽しくできるかもしれない。

2005-10-27

[Ruby] BitChannel で日記を書く

とりあえず次のようにテンプレートに書けば書けるようにはなる。

<a href="index.cgi?cmd=view;name=<%= Time.now.strftime("%Y%m%d") %>" class="dangling">日記を書く</a>

あとはこうやって書いた日記を一覧表示する機能があればいいかな。

あれ index.cgi って直接書くのはやだな。

追記:

<%= cgi_url() %>

で url が取得出来る模倣。 cmd=view も cmd=edit とした方がよさそう。

<a href="<%= cgi_url() %>?cmd=edit;name=<%= Time.now.strftime("%Y%m%d") %>" class="dangling">日記を書く</a>
2005-10-27

mixi 日記の使いやすさ

うまくまとめられないのでコメントでなくこっちへ。

たださんが読むとは思っていなかったので困ってしまった。たださんのおっしゃるとおり気軽さはとても大きい。だから気軽さの部分も含めて手軽さと言ってしまった感はある。

でもそれだけじゃなくて mixi 日記の使いやすいところはあると思っていたのだけど、なかなか言葉にできない。

  • 写真をアップロードするのが楽 … 数が3つまでなのと表示位置固定という決めうち
  • 滅多に使わない日付入力とかトラックバックの入力インターフェースがないのですっきりしている
  • オレデザインより見やすく、入力用のテキストボックスのサイズもちょうどよい …… これはオレの問題
  • 記法が単純なので表示の都合をあれこれ考える余地がない

こういうようなところの総合的なバランスがいいのだとおもう。当然柔軟性とかカスタマイズ性に欠けるのだけど自分の場合はバランスがいいので逆にその制限にあわせて書く方が楽だと思ってしまった。他者の日記も同じデザイン&機能なので自他の日記ともに扱いが楽とか、コメントとか足跡機能によるアクセス者確認の手軽さもあるのだけどこれは SNS であるがゆえだからなあ。

意識出来ないけど自分のデザインがインターフェースに悪影響を及ぼしている可能性もあるかな。

2005-10-27

[Ruby] Ruby/SDL でシューティング

<URL:http://hoge.mine.nu/~koji/diary/?date=20051026#p01>

いいですね。こういうのを Ruby/SDL のサンプルに入れてほしい。

exe 形式で配布されてるのもいいです。

2005-10-27

[Ruby] BitChannel を読む

BitChannel のソースは美しい。初めてソースコードを美しいと思った。

--

lib/bitchannel/cgi.rb 次のようなコードがある。

wiki, = *@options

IRC でこれは次のコードと同じかという質問をしたところ

wiki = @options.first

「たぶん、今は同じ」とか、

@options = "hoge"; wiki = @options.first #=> えらー 
@options = "hoge"; wiki, = *@options; p wiki => "hoge"

のような解答を頂いた。

質問した直後に用事ができてしばらくして席に戻ってきたときにはもう別の難しい話に進展していて、口を挟むことができなかった……。

--

冗談はさておき、最近 自分にとって使いやすい blog ツールはどんなだろうとということを考えている。 tDiary は自分に blog ツールの便利さを教えてくれたすばらしいアプリケーションなんだけど、最近は mixi 日記の手軽さに負けている(あくまでオレ個人の中だけで)感があって何かもっといい blog 環境はないものかと模索している。

lily を参考にしながら rails で作ってみようかとも思うのだけど、 wiki に関してははこっちでも仕事でも RWiki → Hiki を経て BitChannel に落ち着いている。 BitChannel は大変気に入っている。でその BitChannel 上に日記を書いてしまえば便利かもと思い、いい方法がないか考え中。というわけで BitChannel を読んでいる。

あれ話の流れが変?まあいつものことだから。

2005-10-26

トップページ更新

ここ dGames のトップページを更新した。考えてみればあっちでは去年の夏からずっと lily を使っていたのだった。実は lily 歴が長い。

新しいページは LoveRubyNet を参考にした。 LoveRubyNet かっこいいなあ。

2005-10-25

同じエントリをこっちにも書いてみるテスト

lily を設置して気になったこと

ごめんなさい、よく知らないまま好き勝手に素人意見を書いてます。

  • .htaccess の改行コードが Windows のそれになっている模様
  • conf/lily.yaml にも一部 Windows のそれになっている行がある(追記:いろんなファイルで混在している模様)
  • 記事編集でタグを設定すると index.rb を開いたときに「Internal Server Error undefined method `u' for ERB::Util:Module」となる(このサーバー特有ぽい)→追記:http://technetium.matrix.jp/254nm/1128687864.html
  • アカウントの名前、IDの違いがわかりにくい
  • 「サイトのURL」に強制的に '/' が追加される
  • 「サイトのURL」を http://www.dgames.jp/dan5 (/) にするとスタイルシートが読み込まれなかった→追記:http://technetium.matrix.jp/254nm/lily/1128428266.html

またよくわからない(わかりにくい?)ところ

  • 記事編集のパスと名前。入力項目が多すぎて最初はとまどった

操作面

  • 記事編集の TrackBack 欄は使わないのでデフォルトは閉じていてほしい。→何かを押すと動的に開く感じに
  • プレビューが位置的に見づらい
2005-10-25

Lily 実験中

デザイン関係をカスタマイズしていたら日が暮れてしまった。慣れてきたらこの開発日記も向こうに移行させたいなあ。

2005-10-25

Lily を試してみる

久々に最新版を取得したところ開発がすごく進んでいた。いろいろ知りたいのでまずはテスト動作させてみる。実際に使ってみないとなんともわからないので以後 lily については lily で書いてみることにする。

<URL:http://www.dgames.jp/dan5/>

2005-10-21

[仕様] 戦闘システム仕様書

画像の説明

一昨日電車で書いた仕様書を張っておく。

2005-10-20

[仕様] 人形の戦闘ステータス

昨日は人形のパラメータ仕様を決め、電車の中で戦闘システムを書いた。小一時間の作業で非常にいい仕様ができた。最近はまっていたむらさま、サバゲー、フットサル、三国志大戦が融合した感じだ。

静的なもの

STR と MAG のみが成長するパラメータ(デフォルト値から最大 +9 まで成長)。

  • STR / Strength / 戦闘力 …… 1〜9
  • MAG / Magic / 魔力 …… 1〜9
  • SPD / Speed / 素早さ …… 1〜5
  • HP / Hp / HP …… job によって決まる防御力。低い方が優れている。10/10 〜 1/1
  • ability / アビリティー …… 複数あり

動的なもの

非戦闘地域のホームにて変更可能なパラメータ。

  • job / 職業 …… 戦場での能力タイプは job に大きく依存。ほんとは class にしたいけど予約語だしねぇ
  • special / 必殺技 …… アクティブな技を一個選択。変更可能
  • equipment / 装備品 …… アイテムを一個だけ装備出来る

その他の案

  • ステータス変化・異常 …… アイテムや魔法を使って一時的な状態変化を起こすことが可能
    • 育成型の人形が戦闘型の人形のステータスをアップさせる。育成型は自前寺院(異常回復)のような働きもする

非戦闘ステータス

  • LP / Lifepoint / ライフポイント …… 1〜12。寿命
  • Lv / Level / レベル …… 1〜9。job 別にそれぞれの Lv がある

--

シンプルな形にまとまった。主となる能力値は「戦闘力」と「魔力」の「素早さ」 3 つ。しかも成長するのは「戦闘力」と「魔力」の 2 つだけ。使える魔法等の技は一個だけ、装備出来るアイテムも一個だけ。レベルは必殺技を覚えるために必要なものでレベルの数値自体には直接の効力はない。

経験値というパラメータはない。アクティブにしている job のレベルが毎日自動的に 1 ずつ上がる。なのでレベル上げのための戦闘は不要だ。

2005-10-19

[仕様] システム構成概要

使用する言語は全て Ruby 。

クライアントのシステム構成

  1. Web ブラウザ
  2. Nadoka + 専用 bot
  3. ActiveScriptRuby + HTA(HTMLアプリケーション)
  4. プレイヤーの任意で IRC クライアント

2 と 3 があるので Ruby と Windows(+ActiveScriptRuby) 環境が必須。ただ将来的には 2 は Web サービスとして提供し、 3 は JavaScript に移植することで幅広いプラットフォームに対応させたい。 3 は HTMLアプリケーション以外になる可能性も十分にある。

当面ユーザーは Windows にて ActiveScriptRuby をインストールする必要がある。

Web インターフェースを除くとサーバー側と通信を行うのは 2 の Nadoka + bot 。 bot は irc を通さないメインサーバーと直接通信も行う。 3 は Nadoka が取得した情報を視覚化し Nadoka への操作を GUI 化するという位置づけになる。 2 と 3 の接続は drb が有力。

サーバーのシステム構成

  1. Linux + Ruby + MySQL
  2. Web インターフェースは Rails で実装
  3. チャットサーバーは ircd + Nadoka(+bot) で構成
  4. メインサーバーは XML-RPC (を使うのが今のところ有力)

http と irc を使ってネットワークを実現する。

チャットサーバーは会話以外にも同一エリア内の PC の視覚的なエフェクト情報の共有にも使われる。視覚効果や各種ゲームステータス情報はチャットサーバーを通してクライアントに送信されるため、メインサーバーは PC のアクションをクライアントか受け取る単方向通信である。

プレイヤーのインストールとプレー開始の手順

  1. ActiveScriptRuby のインストール
  2. クライアントのプログラムのダウンロード
  3. HTA ファイルを起動(このプログラムが自動的に Nadoka を起動)
  4. Web からユーザー登録とキャラクタ作成(その他の操作)

プレイヤーから Nadoka の存在は見えないようにする。任意で IRC クライアントを用いて Nadoka に接続することが可能。自前の Nadoka を利用することも可能(プレイヤーによる PC 操作ボットの開発等に便利)。

2005-10-19

[開発ログ] 調査期間終了

過去にも何度か同じようなことを書いたことがあるかもしれないが、そろそろ本当に開発を次のステージに進めたい。

考えてみればこれまでやってきたことはアイデア出しと技術的な部分な調査だった。ゲーム内容は自分が本当に納得のいく超理想的なものを作りたいみたいなスタンスだったのだがこれだと終わりがないので、これからは今までのアイデアを取捨選択して仕様を決めてゆくことにしよう。

まず最初の目標は ruby-list にアナウンスを投げるに十分なものを作ることだ。

しかし 1 年半くらいの期間(頓挫した前プロジェクトを含めれば2年以上だ)よくも飽きずにひとつのプロジェクトを続けているなと思う。空き時間を見つけては地道な作業を続けている自分に我ながら感心。いつからコツコツ型になったのだろう。

2005-10-17

[開発ログ] 引き続き ASR の描画テスト

ここ数日は地道に ASR を使った DHTM のテストを続けている。徐々に DHTM に慣れてきた。

作りやすいのだがリアルタイムに多数の標示物を動かしてゲーム画面を作ろうとしているので、どうしても速度的な所が問題になる。最終的には JavaScript で書き直すとすると、そこまでやるんだったら初めから Flash を使った方がましじゃないかとも思えてくるのだが、エディタだけで開発出来るぶん Flash より楽かもしれないなあと期待。

とりあえず JavaScript には手を着けずに ASR でクライアントのある程度の形を作ってみるつもり。これは HTA アプリなので Windows 上でかつ ASR をインストールしないと動かないものなんだけど。

2005-10-13

[開発ログ] ASR でプリミティブの描画テスト(2)

elm.innerHTML
elm.style

を書き換えて動かすと重いな。同時に 16 個とか動かすともうかなり処理落ち。ASR より JavaScript の方が速かったりするのだろうか。

2005-10-13

[開発ログ] ASR でプリミティブの描画テスト

2D プリミティブ(文字、画像、長方形)は表示出来た。 現状で Tk よりよいと思う点は

  • 画像の拡大縮小表示ができる
  • アニメーションに GIF アニメが使える
  • HTML なので馴染みやすい
  • IE の安定感
  • HTML なのでフラッシュムービーとか音も簡単に組み込めそう
  • 最終的に JavaScript に移植すれば非常に多くの環境で動く

あたりだろうか。デメリットとしては Tk は多角形(ポリゴン)が表示できたが HTML ではできなそう。

上記 2 つが嬉しくて、これができるとドラクエ 7 のような 3D っぽいキャラクタ表示が可能。

この手の実験的なコードを日記に張っておくと後にたいへん役立つので実験用スクリプトを張っておく。 Prim のインターフェースはまだまだいい加減。

test.hta

<html>
<head>
  <HTA:APPLICATION ID="ERProt"
    ApplicationName="ERProtOnASR"
  />
<script language="RubyScript">
$KCODE = "SJIS"
require 'main.rb'
</script>
</head>
<body onload="init" language="RubyScript">
<div id="top_div"></div>
</body>
</html>

main.rb

require 'er.rb'

def main_loop
	@counter += 1
	@font.elm.style.top = @counter * 4 % 480
end

def init
	@screen = init_window(640, 480, '#ccccff')
	@counter = 0

	@cwin = @screen.create_prim Box, :box01, 0,@screen.h-100,0, @screen.w-16, 100-16, '#ffcccc'
	@cwin.margin = "8 8"
	@cwin.padding = "8 8"
	@cwin.onmouseover = "__self__.test00"
	@cwin.create_prim Font, :id00, 0,0,0, 16, 'ABC'*20

	@font = Font.new :id01, 100,120,0, 16, 'ABC'
	@screen.add_prim @font
	@font.create_prim Font, :id02, 100,140,0, 16, 'ABC'
	@screen.create_prim Image, :image00, 140,100,0, 'i_31.gif'

	start_window(50, :main_loop)if @window
end

if $0 == __FILE__
	init
	puts @screen.html
end

er.rb

class Prim
	attr_accessor :id, :str, :src
	attr_accessor :margin, :padding, :bgcolor
	attr_accessor :position_type, :x, :y, :z, :w, :h, :size
	attr_accessor :onmouseover
	@@prims = {}
	@@window = nil
	def self.find(id)
		@@prims[id]
	end

	def self.window=(win)
		@@window = win
	end

	def initialize *arg
		@prims = []
		@html_tag = 'div'
		@position_type = 'absolute'
		([:id] + initialize_params).each do |meth|
			break unless v = arg.shift
			__send__ "#{meth}=", v
		end

		raise unless id.is_a? Symbol
		raise id.inspect if @@prims[id]
		@@prims[id] = self
	end

	def initialize_params
		[:x, :y, :z, :size, :str]
	end

	def create_prim klass, *arg
		@prims <<	klass.new(*arg)
		@prims.last
	end

	def add_prim prim
		@prims << prim
	end

	def inside_of_html
		str
	end

	def style_params
		params = []
		{
			:margin => 'margin',
			:padding => 'padding',
			:position_type => 'position',
			:y => 'top',
			:x => 'left',
			:w => 'width',
			:h => 'height',
			:bgcolor => 'background-color',
		}.each do |k, v|
			if __send__ k
				params << "#{v}:#{__send__ k}; "
			end
		end
		params
	end

	def events
		params = []
		{
			:onmouseover => 'onmouseover',
			#:setInterval => 'setInterval',
		}.each do |k, v|
			value = __send__ k
			if value
				params << %Q|#{v}="#{value.gsub('__self__', "Prim.find(:#{id})")}" |
			end
		end
		params
	end

	def html
		%Q|<#{@html_tag} id="#{id}" language="RubyScript" #{events.join}style="#{style_params.join}">\n#{inside_of_html}#{children_html}</#{@html_tag}>|
	end

	def children_html
		@prims.map{|prim| prim.html}.join("\n")
	end

	def elm
		@elm ||= @@window.__send__ id
	end

	def test00
		elm.style.width = "200"
		elm.style.backgroundColor = "#FF0000"
	end
end

class Font < Prim
end

class Box < Prim
	def initialize_params
		[:x, :y, :z, :w, :h, :bgcolor]
	end
end

class Image < Prim
	def initialize_params
		[:x, :y, :z, :src]
	end

	def inside_of_html
		%Q|<img src="#{src}">|
	end
end

def init_window(w, h, bgcolor)
	if @window
		Prim.window = @window
		@top_div = @window.top_div
		@window.resizeTo w+40, h+40
	end
	Box.new :__screen__, 0,0,0, w,h, bgcolor
end

def start_window(interval, func)
	@top_div.innerHTML = @screen.html
	@timer = @window.setInterval func.to_s, interval, "RubyScript"
end
2005-10-13

[アイデンティティ]Ruby でゲームを作るのは難しい

<URL:http://www.lostway.org/~tko/cgi-bin/bakagaiku.rb?bakaid=200510121>

にも話がありますが、確かに難しいですね。CGIとかなら話は別ですが。

オレの場合なんで Ruby にこだわるかというと、これはあくまで個人でゲームを作る場合の話ですが、普通の商用ソフトのようにバリバリのグラフィックを表現する方向で作っても勝負にならないんですよね。まあ勝負する気がないなら問題ないんですけど、こっちは真剣に FF と勝負しようとしてるわけで。

Ruby の開発のし易さは驚異的だと思いますし、個人でやっていく上でそれは大きな武器になるでしょう。

まあいまだに GUI についてはこれというものが見つけられずにいるわけですが。

2005-10-12

[開発ログ] ASR でクライアントを作成

するのはどうかと思って勉強中。今作っているものは HTA アプリとして動作するものになると思うが、作りやすくはある。 HTML をいまいちよくわかってないので今はその辺の勉強が主。

最終的に動作環境を多くしようとするなら JavaScript に移植すればいいという希望があるのもよい。

2005-10-11

[るびま] Rubyist Magazine 10号リリース

<URL:http://jp.rubyist.net/magazine/?0010>

出てました。今回はメイン PC が修理中でなにもやってません。

2005-10-10

so-net 退会

ほとんど使ってなかったので月500円の接続サービスを退会。

退会手続きに進むのに目立たないリンクを何回も押し続けなければいけないし、たくさんの退会理由アンケートにもれなく答えないと退会できない仕組みだった。くじけそうになったよ。

課金サービスをやるならここまでやらないと駄目か。