kavlax 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
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,4 @@
1
+ # coding: utf-8
2
+
3
+ require_relative 'hengband/item.rb'
4
+ require_relative 'hengband/player.rb'
@@ -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
+