-
Notifications
You must be signed in to change notification settings - Fork 0
/
config.rb
347 lines (287 loc) · 8.17 KB
/
config.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
#!ruby -Ks
# -*- mode: ruby; encoding: sjis -*-
# Last updated: <2013/08/04 20:25:04 +0900>
#
# 設定ファイル関係のクラス
require 'singleton'
require 'dxruby'
require 'win32ole'
require_relative 'ayame'
require_relative 'seq'
require_relative 'imagedata'
require_relative 'animekind'
# ----------------------------------------
#
# === 設定ファイル管理用
#
# グローバル変数相当
#
class Conf
include Singleton
VER_NUM = "0.0.1"
APPLI_NAME = "Anime PV Easy Maker ZERO"
APPLI_TITLE = APPLI_NAME + " " + VER_NUM
APPLI_ICON = 'appli_icon.ico'
# 設定ファイル名
DEFAULT_INI = "_setting.txt"
# ファイルやフォルダの場所の初期値
DEF_INI = {
'screenwidth' => 640,
'screenheight' => 360,
'fps' => 24,
'seqimgoutmode' => 0,
'sshotsave' => 1,
'soundfile' => 'sampledata/sample1.mp3',
'imgdir' => 'sampledata/image1',
'savefile' => '_log.txt',
'outdir' => 'output',
'definebat' => 'img2avi_def.bat',
}
# 数値として扱う項目
VALUE_KEY = ['screenwidth', 'screenheight', 'fps', 'seqimgoutmode', 'sshotsave']
# パスとして扱う項目
PATH_KEY = ['soundfile', 'imgdir', 'savefile', 'outdir', 'definebat']
# サンプルファイルの場所
DEF_INI_NONE = {
'sound' => 'sampledata/sample1.mp3',
'image' => 'sampledata/image1',
}
# 読み込めるサウンド種類(ファイル選択ダイアログ使用時に利用)
SNDEXT = [["ogg, wav, mp3", "*.ogg;*.wav;*.mp3"], ["all(*.*)", "*.*"]]
# 読み込める画像種類(ファイル選択ダイアログ使用時に利用)
IMGEXT = [["bmp, jpg, png", "*.bmp;*.jpg;*.png"], ["all(*.*)", "*.*"]]
# 読み込める画像種類(ファイル選択ダイアログ使用時に利用)
OUTDIREXT = [["all(*.*)", "*.*"]]
# 連番画像出力フォーマット。seqimgoutmode と対応
OutFmt = Struct.new("OutFmt", :ext, :fmt)
OUT_FMT = [
OutFmt.new('.bmp', FORMAT_BMP),
OutFmt.new('.jpg', FORMAT_JPG),
OutFmt.new('.png', FORMAT_PNG),
]
BGCOL_DEF = [241, 196, 15] # 標準として使う背景色
# 利用できるウインドウサイズ
SCR_SIZE = [
[512, 288],
[512, 384],
[640, 360],
[640, 480],
[800, 450],
[800, 600],
[1280, 720],
]
# 利用できるFPS
FPS_LIST = [ 24, 30 ]
# 初期化処理
def initialize
if (defined?(Ocra))
# Ocra でコンパイル中ならここを通る
puts "Use Ocra"
end
fpath = ENV['OCRA_EXECUTABLE'] || $0 # Ocra対策
@cdir = File.expand_path(File.dirname(fpath))
@conf_fname = File.expand_path(@cdir + '/' + DEFAULT_INI)
@key_tbl = AnimeKind.load_key_table(@cdir)
@ini = Hash.new
@bgcol_def = BGCOL_DEF
@play_only_mode = false
@outmode_enable = false
@imgdt = ImageData.new
@click_se_req = false
@font10 = Font.new(10, 'MS ゴシック')
@font12 = Font.new(12, 'MS ゴシック')
@app = FolderSelect.get_app
read_config
conv_string_to_int
check_file_exist
end
attr_accessor :ini, :bgcol_def, :imgdt, :click_se_req, :font10, :font12, :font_large, :font_large2, :app
# カレントフォルダのパスを返す (最後に'/'はついてない)
def get_current_dir
return @cdir
end
# 設定値を初期化
def init_config_default
DEF_INI.each_key do |key|
v = DEF_INI[key]
@ini[key] = (PATH_KEY.include?(key))? (@cdir + '/' + v) : v
end
end
# 数値を持つはずの設定値を数値に変換
def conv_string_to_int
VALUE_KEY.each { |key| @ini[key] = @ini[key].to_i }
end
# 設定ファイルを読み込み
def read_config
init_config_default
if File.exist?(@conf_fname)
f = File.open(@conf_fname)
f.each_line do |l|
l.chomp!
if l =~ /^(.+) = (.+)$/
@ini[$1] = $2
end
end
f.close
conv_string_to_int
return true
else
write_config
return false
end
end
# 設定ファイルを書き込み
def write_config
s = ""
@ini.each_key { |key| s += sprintf("%s = %s\n", key, @ini[key].to_s) }
f = File.open(@conf_fname, "w")
f.write(s)
f.close
end
# ユーザが用意したファイルが無ければサンプルファイル群を使うように指定
def check_file_exist
unless check_sound_exist?(@ini['soundfile'])
@ini['soundfile'] = @cdir + '/' + DEF_INI_NONE['sound']
end
unless check_images_exist?(@ini['imgdir'])
@ini['imgdir'] = @cdir + '/' + DEF_INI_NONE['image']
end
end
# サウンドファイルが存在するか調べる
def check_sound_exist?(path)
return File.exist?(path)
end
# 画像ファイル群が存在するか調べる
def check_images_exist?(imgdir)
imgfiles = Dir.glob(imgdir + '/*.{jpg,png,bmp}').sort
return (imgfiles.length == 0)? false : true
end
# 値を変更
def set_value(key, value)
@ini[key] = value
end
# 値を読み取り
def get_value(key)
return @ini[key]
end
# 連番画像出力モードか否かを返す
def outmode?
return @outmode_enable
end
# 連番画像出力モードフラグを無効化
def clear_outmode
@outmode_enable = false
end
# 連番画像出力モードフラグを有効化
def set_outmode
@outmode_enable = true
end
# 連番画像出力のインデックス値を取得
def get_outmode_index
return @ini['seqimgoutmode']
end
# 連番画像出力の拡張子を取得
def get_outmode_ext
return OUT_FMT[@ini['seqimgoutmode']].ext
end
# 連番画像出力の画像フォーマットを取得
def get_outmode_format
return OUT_FMT[@ini['seqimgoutmode']].fmt
end
# 連番画像出力モード値をインクリメント
def inc_outmode
@ini['seqimgoutmode'] = (@ini['seqimgoutmode'] + 1) % OUT_FMT.length
write_config
end
# 連番画像出力モード値をデクリメント
def dec_outmode
nmax = OUT_FMT.length
@ini['seqimgoutmode'] = (@ini['seqimgoutmode'] - 1 + nmax) % nmax
write_config
end
# 再生モードか否かを返す
def playmode?
return @play_only_mode
end
# 再生モードフラグを無効化
def clear_playmode
@play_only_mode = false
end
# 再生モードフラグを有効化
def set_playmode
@play_only_mode = true
end
# fps設定値を返す
def get_fps
return @ini['fps']
end
# fps値を変更
def set_fps(fpsv)
@ini['fps'] = fpsv
write_config
end
# 画面サイズを返す
def get_screen_size
return @ini['screenwidth'].to_i, @ini['screenheight'].to_i
end
# 画面サイズを変更
def set_screen_size(w, h)
@ini['screenwidth'] = w
@ini['screenheight'] = h
write_config
end
# 受け付けるキーボードの一覧情報を返す
def get_key_tbl
return @key_tbl
end
# 連番画像書き出し時の処理方法種類を返す
#
# true :: 画面に描画+スクリーンショット保存
# false :: 内部生成+イメージ保存
def screenshot_save?
return (@ini['sshotsave'] == 0)? false : true
end
# 連番画像書き出し時の処理方法を切り替える
def change_screenshot_savemode
@ini['sshotsave'] = (@ini['sshotsave'] == 0)? 1 : 0
end
# ログファイル(記録ファイル)のパスを返す
def get_log_path
return @ini['savefile']
end
# ログファイル(記録ファイル)のパスを変更する
def set_log_path(fpath)
@ini['savefile'] = File.expand_path(fpath)
write_config
end
# 画像リソースフォルダのパスを返す ('/'が最後につく)
def get_res_dir
return get_current_dir + '/res/' # 全ファイルはこのリソースパスを使う
end
# アプリアイコンのパスを返す
def get_appli_icon_path
return get_res_dir + APPLI_ICON
end
# ffmpeg用のバッチファイル(定義部分のみ)を出力
def output_ffmpeg_bat
outfn = @ini['definebat']
odir = @ini['outdir'].gsub("/", "\\")
inmusic = @ini['soundfile'].gsub("/", "\\")
ext = get_outmode_ext
fpsv = @ini['fps']
l = [
"set OUTDIR=#{odir}",
"set INMUSIC=\"#{inmusic}\"",
"set INIMAGE=\"%OUTDIR%\\%%08d#{ext}\"",
"set OUTAVI=\"%OUTDIR%\\output.avi\"",
"set OUTMP4=\"%OUTDIR%\\output.mp4\"",
"set TMPWAV=\"%OUTDIR%\\music.wav\"",
"set PASSLOG=\".\\passlog\"",
"set FPSV=#{fpsv}",
"",
]
f = File.open(outfn, 'w')
f.write(l.join("\n"))
f.close
end
end