kavlax 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.mkd +74 -0
- data/Rakefile +44 -0
- data/VERSION +1 -0
- data/bin/kavlax +136 -0
- data/lib/hengband.rb +4 -0
- data/lib/hengband/item.rb +155 -0
- data/lib/hengband/player.rb +41 -0
- metadata +73 -0
data/README.mkd
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
kavlax
|
2
|
+
======
|
3
|
+
|
4
|
+
507 :名@無@し:2010/03/25(木) 16:54:03 ID:???
|
5
|
+
とある・・・
|
6
|
+
|
7
|
+
508 :名@無@し:2010/03/25(木) 17:23:54 ID:???
|
8
|
+
目玉の・・・
|
9
|
+
|
10
|
+
509 :名@無@し:2010/03/25(木) 17:25:51 ID:???
|
11
|
+
『オマラックス』
|
12
|
+
|
13
|
+
511 :名@無@し:2010/03/25(木) 19:09:56 ID:???
|
14
|
+
>>507-509
|
15
|
+
お前ら・・
|
16
|
+
|
17
|
+
512 :名@無@し:2010/03/25(木) 19:12:06 ID:???
|
18
|
+
そこは多首のカブラックスだろ
|
19
|
+
|
20
|
+
kavlax は、ローグライクゲーム変愚蛮怒のプレイ記録から
|
21
|
+
持ち物などの情報を取り出し、一覧表示したりするツールです。
|
22
|
+
|
23
|
+
インストール
|
24
|
+
------------
|
25
|
+
|
26
|
+
Ruby 1.9.xが必要です。(※1.8は非対応です。理由は作者の怠慢です)
|
27
|
+
|
28
|
+
RubyGemsでインストールします。
|
29
|
+
|
30
|
+
$ sudo gem install kavlax
|
31
|
+
|
32
|
+
するとkavlaxコマンドが使えるようになります(GUIは今のところありません)
|
33
|
+
|
34
|
+
$ kavlax
|
35
|
+
(ヘルプが表示される)
|
36
|
+
|
37
|
+
できること
|
38
|
+
---------
|
39
|
+
|
40
|
+
耐性パズルの補助ツールとして使うことを考えています。
|
41
|
+
|
42
|
+
### 持ち物一覧
|
43
|
+
$ kavlax list ~/.angband/Hengband/<プレイヤー名>.txt
|
44
|
+
|
45
|
+
種類別に表示します。たぶん分類が間違ってるものがあるので見つけたら
|
46
|
+
twitter(@yhara)とか任意の手段でお知らせください。
|
47
|
+
|
48
|
+
### 耐性別持ち物一覧
|
49
|
+
$ kavlax resists ~/.angband/Hengband/<プレイヤー名>.txt
|
50
|
+
|
51
|
+
耐性別に表示します(※未実装)
|
52
|
+
|
53
|
+
### いらなさそうな装備の検出
|
54
|
+
$ kavlax shiwake ~/.angband/Hengband/<プレイヤー名>.txt
|
55
|
+
|
56
|
+
耐性・攻撃力/防御力が上位互換なものがあればいらなさそうと判断します。
|
57
|
+
|
58
|
+
※いまのところ仕分け人は/邪とか+腕とか+速とかは見てないので、信用しすぎないように
|
59
|
+
|
60
|
+
ライブラリとして使う
|
61
|
+
--------------------
|
62
|
+
|
63
|
+
どういう用途か分かりませんが一応ライブラリとして使うこともできます。
|
64
|
+
|
65
|
+
$ sudo gem install kavlax
|
66
|
+
|
67
|
+
require 'hengband'
|
68
|
+
p Hengband::Item.parse_file(ARGV[0])
|
69
|
+
|
70
|
+
その他
|
71
|
+
-----
|
72
|
+
MIT License
|
73
|
+
|
74
|
+
* [ソースコード(github)](http://github.com/yhara/kavlax)
|
data/Rakefile
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
#
|
2
|
+
# Rakefile to creating gems
|
3
|
+
#
|
4
|
+
# configurations:
|
5
|
+
PROJECT_NAME = File.basename(File.dirname(__FILE__))
|
6
|
+
|
7
|
+
begin
|
8
|
+
require 'jeweler'
|
9
|
+
rescue LoadError
|
10
|
+
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
11
|
+
end
|
12
|
+
|
13
|
+
Jeweler::Tasks.new do |gemspec|
|
14
|
+
gemspec.name = "#{PROJECT_NAME}"
|
15
|
+
gemspec.summary = "A tool for Hengband, a rogue-like game"
|
16
|
+
gemspec.email = "yutaka.hara/at/gmail.com"
|
17
|
+
gemspec.homepage = "http://github.com/yhara/#{PROJECT_NAME}"
|
18
|
+
gemspec.description = gemspec.summary
|
19
|
+
gemspec.authors = ["Yutaka HARA"]
|
20
|
+
end
|
21
|
+
|
22
|
+
desc "install current source as a gem"
|
23
|
+
task :dogfood => [:gemspec, :build] do
|
24
|
+
sh "sudo gem install pkg/#{PROJECT_NAME}-#{File.read("VERSION").chomp}.gem"
|
25
|
+
end
|
26
|
+
|
27
|
+
desc "uninstall the installed gem"
|
28
|
+
task :undogfood do
|
29
|
+
sh "sudo gem uninstall #{PROJECT_NAME}"
|
30
|
+
end
|
31
|
+
|
32
|
+
desc "uninstall, then install current source as gem"
|
33
|
+
task :redogfood => [:undogfood, :dogfood]
|
34
|
+
|
35
|
+
desc "uninstall temporary gem and install from github"
|
36
|
+
task :nodogfood do
|
37
|
+
sh "sudo gem uninstall #{PROJECT_NAME}"
|
38
|
+
sh "sudo gem install yhara-#{PROJECT_NAME}"
|
39
|
+
end
|
40
|
+
|
41
|
+
desc "check for gem to be built"
|
42
|
+
task :stalk do
|
43
|
+
sh "gemstalk yhara #{PROJECT_NAME}"
|
44
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.0
|
data/bin/kavlax
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# coding: utf-8
|
3
|
+
|
4
|
+
require_relative "../lib/hengband"
|
5
|
+
|
6
|
+
class Kavlax
|
7
|
+
COMMANDS = {
|
8
|
+
list: "アイテム一覧",
|
9
|
+
resists: "耐性別アイテム一覧",
|
10
|
+
shiwake: "いらなそうなアイテム検出",
|
11
|
+
random: "ランダムに装備を選ぶ",
|
12
|
+
auto: "全自動耐性パズル",
|
13
|
+
help: "このメッセージを表示",
|
14
|
+
}
|
15
|
+
|
16
|
+
def initialize(argv=ARGV.dup)
|
17
|
+
@command, @recfile = *argv
|
18
|
+
end
|
19
|
+
|
20
|
+
def run
|
21
|
+
if COMMANDS.key?(@command.to_sym)
|
22
|
+
items = Hengband::Item.parse_file(@recfile)
|
23
|
+
__send__ @command, items
|
24
|
+
else
|
25
|
+
help
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def help
|
30
|
+
puts "usage: #$0 <command> ~/.angband/Hengband/<player>.txt"
|
31
|
+
puts "commands:"
|
32
|
+
COMMANDS.each do |name, desc|
|
33
|
+
puts " #{name}: #{desc}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def list(items)
|
38
|
+
puts items.sort.map{|x|
|
39
|
+
[
|
40
|
+
x.type, " ",
|
41
|
+
(x.damage if x.type == :weapon),
|
42
|
+
(x.defence if x.defence?),
|
43
|
+
" ", x.line,
|
44
|
+
].join
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
48
|
+
def resists(items)
|
49
|
+
{
|
50
|
+
res: ["r", "酸電火冷毒閃暗破盲乱轟獄因沌劣恐".chars],
|
51
|
+
imm: ["*", "酸電火冷".chars],
|
52
|
+
aura: ["[", "炎電冷魔瞬".chars],
|
53
|
+
misc: ["", "易減投反麻視経遅活浮明警倍射瞬怒祝忌".chars],
|
54
|
+
esp: ["~", "感邪善無個人竜オト巨デ死動".chars],
|
55
|
+
}.each do |kind, (prefix, flags)|
|
56
|
+
flags.each do |s|
|
57
|
+
puts "----- #{prefix}#{s}: "
|
58
|
+
items.find_all{|x|
|
59
|
+
x.flags[kind].include? s}.each do |x|
|
60
|
+
puts " #{x.line}"
|
61
|
+
end
|
62
|
+
puts
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def shiwake(items)
|
68
|
+
def find_upper_compat(x, xs)
|
69
|
+
xs.find{|u|
|
70
|
+
x.flags[:res].all?{|res| u.flags[:res].include?(res)} and
|
71
|
+
x.flags[:imm].all?{|imm| u.flags[:imm].include?(imm)} and
|
72
|
+
(if x.defence? then u.defence >= x.defence else true end) and
|
73
|
+
(if x.type == :weapon then u.damage >= x.damage else true end)
|
74
|
+
}
|
75
|
+
end
|
76
|
+
|
77
|
+
items.group_by(&:type).each do |type, xs|
|
78
|
+
puts
|
79
|
+
puts "-- #{type}"
|
80
|
+
xs.each do |x|
|
81
|
+
if u = find_upper_compat(x, xs - [x])
|
82
|
+
puts "* #{x.line} は、"
|
83
|
+
puts " #{u.line} でいいんじゃない?"
|
84
|
+
puts
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def random(items)
|
91
|
+
player = Hengband::Player.new(items)
|
92
|
+
player.wear_random
|
93
|
+
puts player.wearings
|
94
|
+
puts player.resists
|
95
|
+
end
|
96
|
+
|
97
|
+
def auto(items)
|
98
|
+
items = items.group_by(&:type)
|
99
|
+
def pick(items)
|
100
|
+
my = {
|
101
|
+
a: items[:weapon].sample,
|
102
|
+
b: items[:weapon].sample,
|
103
|
+
c: items[:bow].sample,
|
104
|
+
d: items[:ring].sample,
|
105
|
+
e: items[:ring].sample,
|
106
|
+
f: items[:neck].sample,
|
107
|
+
g: items[:light].sample,
|
108
|
+
h: items[:armor].sample,
|
109
|
+
i: items[:cloak].sample,
|
110
|
+
j: items[:head].sample,
|
111
|
+
k: items[:hands].sample,
|
112
|
+
l: items[:feet].sample,
|
113
|
+
}
|
114
|
+
end
|
115
|
+
|
116
|
+
def res(my)
|
117
|
+
my.values.map{|x| x.flags[:res]}.inject(:+).uniq
|
118
|
+
end
|
119
|
+
|
120
|
+
def try(items)
|
121
|
+
begin
|
122
|
+
my = pick(items)
|
123
|
+
end until res(my).size == 16
|
124
|
+
my.each do |k, v|
|
125
|
+
puts "#{k}) #{v}"
|
126
|
+
end
|
127
|
+
puts res(my).join
|
128
|
+
end
|
129
|
+
|
130
|
+
try(items)
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
|
135
|
+
|
136
|
+
Kavlax.new.run
|
data/lib/hengband.rb
ADDED
@@ -0,0 +1,155 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Hengband
|
4
|
+
class Item
|
5
|
+
include Comparable
|
6
|
+
|
7
|
+
RE_HEADER = /\w\) /
|
8
|
+
RE_NUMBER = /\d+([本巻服冊着振足枚つ個]|切れ)の /
|
9
|
+
RE_NAME = /(?<name>.+?) ?/
|
10
|
+
RE_BOW = /\(x(?<bow_pow>\d+)\) ?/
|
11
|
+
RE_DICE = /\((?<dice_num>\d+)d(?<dice_val>\d+)\) ?/
|
12
|
+
RE_OFFENSE = /\((?<off_acc>[+-]\d+)(,(?<off_dam>[+-]\d+))?\) ?/
|
13
|
+
RE_DEFENSE = /\[((?<def_base>\d+),)?(?<def_plus>[+-]\d+)\] ?/
|
14
|
+
RE_PVAL = /\((?<pval>[+-]\d+).*?\) ?/
|
15
|
+
RE_FLAGS = /\{(?<flags>.*?)\}/
|
16
|
+
|
17
|
+
UNIDENTIFIED = /\{特別製|高級品|上質|並\}/
|
18
|
+
REXP_ITEM = /#{RE_HEADER}#{RE_NUMBER}?#{RE_NAME
|
19
|
+
}#{RE_BOW}?#{RE_DICE}?#{RE_OFFENSE}?#{RE_DEFENSE}?#{RE_PVAL}?#{RE_FLAGS}?$/
|
20
|
+
|
21
|
+
def self.parse_file(path)
|
22
|
+
in_list = false
|
23
|
+
File.open(path, "r:euc-jp:utf-8"){|f| f.read}.lines.map{|line|
|
24
|
+
case line
|
25
|
+
when /\[キャラクタの装備\]/
|
26
|
+
in_list = true
|
27
|
+
nil
|
28
|
+
when UNIDENTIFIED
|
29
|
+
nil
|
30
|
+
when REXP_ITEM
|
31
|
+
Item.new(line) if in_list
|
32
|
+
when /\[博物館のアイテム\]/
|
33
|
+
in_list = false
|
34
|
+
nil
|
35
|
+
else
|
36
|
+
#$stderr.puts line.encode("utf-8")
|
37
|
+
end
|
38
|
+
}.compact
|
39
|
+
end
|
40
|
+
|
41
|
+
def initialize(line)
|
42
|
+
@line = line.chomp
|
43
|
+
REXP_ITEM.match(@line) do |m|
|
44
|
+
@name = m[:name]
|
45
|
+
@bow_pow = m[:bow_pow] && m[:bow_pow].to_i
|
46
|
+
@dice_num = m[:dice_num] && m[:dice_num].to_i
|
47
|
+
@dice_val = m[:dice_val] && m[:dice_val].to_i
|
48
|
+
@off_acc = m[:off_acc] && m[:off_acc].to_i
|
49
|
+
@off_dam = m[:off_dam] && m[:off_dam].to_i
|
50
|
+
@def_base = m[:def_base] && m[:def_base].to_i
|
51
|
+
@def_plus = m[:def_plus] && m[:def_plus].to_i
|
52
|
+
@pval = m[:pval] && m[:pval].to_i
|
53
|
+
@flags = parse_flags(m[:flags])
|
54
|
+
@type = guess_type(@name)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
attr_reader :line, :name, :type, :flags
|
58
|
+
attr_reader :bow_pow, :dice_num, :dice_val, :off_acc, :off_dam,
|
59
|
+
:def_base, :def_plus, :pval
|
60
|
+
|
61
|
+
TYPES = [:weapon, :shield, :bow, :ring, :neck, :light,
|
62
|
+
:armor, :cloak, :head, :hands, :feet, :other]
|
63
|
+
|
64
|
+
def defence
|
65
|
+
@def_plus and (@def_base + @def_plus)
|
66
|
+
end
|
67
|
+
|
68
|
+
def defence?
|
69
|
+
[:shield, :armor, :cloak, :head, :hands, :feet].include? @type
|
70
|
+
end
|
71
|
+
|
72
|
+
def damage
|
73
|
+
@dice_num and (@dice_num * (@dice_val/2.0) + @off_dam)
|
74
|
+
end
|
75
|
+
|
76
|
+
def to_s
|
77
|
+
[ @name, " ",
|
78
|
+
("{r#{flags[:res].join}}" unless flags[:res].empty?),
|
79
|
+
].join
|
80
|
+
end
|
81
|
+
|
82
|
+
def <=>(other)
|
83
|
+
if @type != other.type
|
84
|
+
TYPES.index(@type).to_i - TYPES.index(other.type).to_i
|
85
|
+
else
|
86
|
+
case
|
87
|
+
when defence?
|
88
|
+
other.defence - self.defence
|
89
|
+
when @type == :weapon
|
90
|
+
other.damage - self.damage
|
91
|
+
else
|
92
|
+
0
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
|
99
|
+
RE_CURSED = /呪われている, /
|
100
|
+
RE_PLUS = /\+([攻速腕知賢器耐魅道隠探赤掘]+)/
|
101
|
+
RE_IMM = /\*([酸電火冷]+)/
|
102
|
+
RE_RES = /r([酸電火冷毒閃暗破盲乱轟獄因沌劣恐]+)/
|
103
|
+
RE_MISC = /;([易減投反麻視経遅活浮明警倍射瞬怒祝忌]+)/
|
104
|
+
RE_AURA = /\[([炎電冷魔瞬]+)/
|
105
|
+
RE_BRAND = /\|([酸電焼凍毒沌吸震切理]+)/
|
106
|
+
RE_KILL = /X([邪人龍オト巨デ死動]+)/
|
107
|
+
RE_SLAY = /\/([邪人龍オト巨デ死動]+)/
|
108
|
+
RE_ESP = /~([感邪善無個人竜オト巨デ死動]+)/
|
109
|
+
RE_SUST = /\(([腕知賢器耐魅]+)/
|
110
|
+
|
111
|
+
def parse_flags(str)
|
112
|
+
Hash.new{ [] }.tap{|h|
|
113
|
+
h[:plus] = $1.chars.to_a if RE_PLUS =~ str
|
114
|
+
h[:imm] = $1.chars.to_a if RE_IMM =~ str
|
115
|
+
h[:res] = $1.chars.to_a if RE_RES =~ str
|
116
|
+
h[:misc] = $1.chars.to_a if RE_MISC =~ str
|
117
|
+
h[:aura] = $1.chars.to_a if RE_AURA =~ str
|
118
|
+
h[:brand] = $1.chars.to_a if RE_BRAND =~ str
|
119
|
+
h[:kill] = $1.chars.to_a if RE_KILL =~ str
|
120
|
+
h[:slay] = $1.chars.to_a if RE_SLAY =~ str
|
121
|
+
h[:esp] = $1.chars.to_a if RE_ESP =~ str
|
122
|
+
h[:sust] = $1.chars.to_a if RE_SUST =~ str
|
123
|
+
}
|
124
|
+
end
|
125
|
+
|
126
|
+
def guess_type(name)
|
127
|
+
case name
|
128
|
+
when /パイク|グレイブ|ダガー|マン・ゴーシュ|サーベル|クレイモア|シミター|ブレード|ソード|カタナ|メイス|スピア|トライデント|クォータースタッフ|ウォー・ハンマー|アックス|ムチ|シャベル|つるはし|脇差し|大鎌|薙刀|鉄棒|忍者刀|青龍刀|六尺棒/
|
129
|
+
:weapon
|
130
|
+
when /シールド|盾|鏡/
|
131
|
+
:shield
|
132
|
+
when /スリング|・ボウ|クロスボウ|弓|進化する銃/
|
133
|
+
:bow
|
134
|
+
when /指輪/
|
135
|
+
:ring
|
136
|
+
when /アミュレット|ペンダント|首飾り|首輪/
|
137
|
+
:neck
|
138
|
+
when /のランプ|石|星|白熱灯|玻璃瓶|勾玉/
|
139
|
+
:light
|
140
|
+
when /ジャケット|メイル|アーマー|[^グ]ローブ|よろい|かたびら|胴丸/
|
141
|
+
:armor
|
142
|
+
when /クローク/
|
143
|
+
:cloak
|
144
|
+
when /ヘルメット|ヘルム|帽子|兜|笠|冠/
|
145
|
+
:head
|
146
|
+
when /ガントレット|グローブ|セスタス/
|
147
|
+
:hands
|
148
|
+
when /靴|ブーツ/
|
149
|
+
:feet
|
150
|
+
else
|
151
|
+
:other
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Hengband
|
4
|
+
class Player
|
5
|
+
EQUIP_PLACES = [:r_arm, :l_arm, :bow, :r_finger, :l_finger,
|
6
|
+
:neck, :light, :body, :outer, :head, :hands, :feet]
|
7
|
+
EQUIPPABLES = [[:weapon, :shield], [:weapon, :shield], [:bow],
|
8
|
+
[:ring], [:ring], [:neck], [:light], [:armor], [:cloak],
|
9
|
+
[:head], [:hands], [:feet]]
|
10
|
+
|
11
|
+
def initialize(inventory = [])
|
12
|
+
@inventory = inventory
|
13
|
+
@equips = {}.tap{|h|
|
14
|
+
EQUIP_PLACES.each{|name| h[name] = nil}
|
15
|
+
}
|
16
|
+
end
|
17
|
+
attr_reader :equips
|
18
|
+
|
19
|
+
def wear_random
|
20
|
+
EQUIP_PLACES.zip(EQUIPPABLES).each do |name, types|
|
21
|
+
item = @inventory.find_all{|x| types.include? x.type}.sample
|
22
|
+
@equips[name] = item
|
23
|
+
end
|
24
|
+
self
|
25
|
+
end
|
26
|
+
|
27
|
+
def wearings
|
28
|
+
i = "`"
|
29
|
+
EQUIP_PLACES.map{|name|
|
30
|
+
i.succ!
|
31
|
+
"#{i}) #{@equips[name]}"
|
32
|
+
}.join("\n")
|
33
|
+
end
|
34
|
+
|
35
|
+
def resists
|
36
|
+
@equips.map{|name, x| x.flags[:res] + x.flags[:imm]}.inject(:+).uniq.join
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
metadata
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: kavlax
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 31
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 0.0.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Yutaka HARA
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-06-04 00:00:00 +09:00
|
19
|
+
default_executable: kavlax
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: A tool for Hengband, a rogue-like game
|
23
|
+
email: yutaka.hara/at/gmail.com
|
24
|
+
executables:
|
25
|
+
- kavlax
|
26
|
+
extensions: []
|
27
|
+
|
28
|
+
extra_rdoc_files:
|
29
|
+
- README.mkd
|
30
|
+
files:
|
31
|
+
- README.mkd
|
32
|
+
- Rakefile
|
33
|
+
- VERSION
|
34
|
+
- bin/kavlax
|
35
|
+
- lib/hengband.rb
|
36
|
+
- lib/hengband/item.rb
|
37
|
+
- lib/hengband/player.rb
|
38
|
+
has_rdoc: true
|
39
|
+
homepage: http://github.com/yhara/kavlax
|
40
|
+
licenses: []
|
41
|
+
|
42
|
+
post_install_message:
|
43
|
+
rdoc_options:
|
44
|
+
- --charset=UTF-8
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
none: false
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
hash: 3
|
53
|
+
segments:
|
54
|
+
- 0
|
55
|
+
version: "0"
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 3
|
62
|
+
segments:
|
63
|
+
- 0
|
64
|
+
version: "0"
|
65
|
+
requirements: []
|
66
|
+
|
67
|
+
rubyforge_project:
|
68
|
+
rubygems_version: 1.3.7
|
69
|
+
signing_key:
|
70
|
+
specification_version: 3
|
71
|
+
summary: A tool for Hengband, a rogue-like game
|
72
|
+
test_files: []
|
73
|
+
|