Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #! ruby -Ks
- #読み込み
- require 'kconv'
- require 'dxruby'
- require_relative 'ayame'
- #####頻出動作を管理するクラスソースファイル#####
- ##キャラ立ち絵描写用クラス##
- class Class_chara
- def initialize
- @body , @face= [],[]
- @body << @sample_body1 = Image.load('sample_pass/body_sample1.png')
- @body << @sample_body2 = Image.load('sample_pass/body_sample2.png')
- @body << @sample_body3 = Image.load('sample_pass/body_sample3.png')
- @face << @sample_face1 = Image.load('sample_pass/face_sample1.png')
- @face << @sample_face2 = Image.load('sample_pass/face_sample2.png')
- @face << @sample_face3 = Image.load('sample_pass/face_sample3.png')
- end
- def draw(x,y,centeredx,centeredy,body,face,calp)
- body = @body.length + body if body < 0
- face = @face.length + face if face < 0
- calp = 255 if calp > 255
- calp = 0 if calp < 0
- x += @body[body].width / 2 if centeredx == true
- y += @body[body].width / 2 if centeredy == true
- Window.draw_ex(x,y,@body[body],:alpha=>calp)
- Window.draw_ex(x,y,@face[face],:alpha=>calp)
- end
- end
- ##背景、オブジェクト画像描写用クラス##
- class Class_image
- def initialize
- @background , @object = [] , []
- @background << @sample_background1 = Image.load('sample_pass/background_sample1.png')
- @background << @sample_background2 = Image.load('sample_pass/background_sample2.png')
- @background << @sample_background3 = Image.load('sample_pass/background_sample3.png')
- @object << @sample_object = Image.load('sample_pass/object_sample1.png')
- @object << @sample_object = Image.load('sample_pass/object_sample2.png')
- @object << @sample_object = Image.load('sample_pass/object_sample3.png')
- end
- def draw_background(background)
- Window.draw_ex(0,0, @background[background])
- end
- def draw_object(object,x,y,falp)
- Window.draw_ex(x,y,@object[object],:alpha=>falp)
- end
- end
- ##文章、ボタン描写用クラス##
- class Class_sentence
- def initialize
- end
- def draw_sentence(x,y,sentence,font_size,font_type,effect,color_ary,edge_color_ary)
- b_bold,b_itaric,b_edge = false,false,false
- b_bold = true if effect.include?("b")
- b_itaric = true if effect.include?("i")
- b_edge = true if effect.include?("e")
- hashs = {color:color_ary,bold:b_bold,itaric:b_itaric,edge:b_edge,edge_color:edge_color_ary}
- Window.draw_font(x,y,sentence,Font.new(font_size,font_type),hash=hashs)
- end
- def draw_button(x,y,sentence,font_size,font_type)
- font = Font.new(font_size,font_type)
- button_size = [x..x + font.getWidth(sentence) , y..y + font.size]
- if button_size[0].include?($xpoint) && button_size[1].include?($ypoint)
- color_ary , pushed = [255,122,122] , true
- else
- color_ary , pushed = [0,0,0] , false
- end
- hashs = {color: [255,255,255] ,edge: true , edge_color: color_ary}
- Window.draw_font_ex(x,y, sentence ,font, hash=hashs)
- if pushed == true
- return true
- else
- return false
- end
- end
- end
- ##サウンド処理クラス##
- class Class_sound
- def initialize
- @music , @sound = [] , []
- @music << @sample_music1 = Ayame.new('sample_pass/music_sample1.mp3')
- @music << @sample_music2 = Ayame.new('sample_pass/music_sample2.mp3')
- @music << @sample_music3 = Ayame.new('sample_pass/music_sample3.mp3')
- @sound << @sample_sound1 = Sound.new('sample_pass/sound_sample1.wav')
- @sound << @sample_sound2 = Sound.new('sample_pass/sound_sample2.wav')
- @sound << @sample_sound3 = Sound.new('sample_pass/sound_sample3.wav')
- end
- def music_play(music,vol)
- music = @music.length + music if music < 0
- @music[music].play(0,0)
- @music[music].set_volume(vol,0)
- end
- def music_stop(music)
- music = @music.length + music if music < 0
- @music[music].stop(0)
- end
- def music_pause(music)
- @music[music].pause
- end
- def music_resume(music)
- @music[music].resume
- end
- def music_onoff(music,vol)
- music = @music.length + music if music < 0
- if @music[music].finished?
- @music[music].play(0,0)
- @music[music].set_volume(vol,0)
- else
- @music[music].stop(0)
- end
- end
- def music_change(newmusic,vol)
- newmusic = @music.length + newmusic if newmusic < 0
- t = @music.length
- t.times do |t|
- unless t == newmusic
- @music[t].stop(0)
- else
- @music[newmusic].play(0,0) if @music[newmusic].finished?
- @music[newmusic].set_volume(vol,0)
- end
- end
- end
- def silent
- t = @music.length
- t.times{|t| @music[t].stop(0)}
- end
- def sound(sound)
- @sound[sound].play
- end
- end
- ##固定データの変更に用いる。こう行わないと後述記述しているeach上のパラメータ変更が適用できない。##
- class Class_param_edit
- def initialize
- end
- def do(data,type)
- case type
- when 0
- $sample_param[0] = data[1] if data[0] == 0 || data[0] == "フラグ1"
- $sample_param[1] = data[1] if data[0] == 1 || data[1] == "フラグ2"
- $sample_param[2] = data[1] if data[0] == 2 || data[2] == "フラグ3"
- when 1
- $sample_param[0] += data[1] if data[0] == 0 || data[0] == "フラグ1"
- $sample_param[1] += data[1] if data[0] == 1 || data[1] == "フラグ2"
- $sample_param[2] += data[1] if data[0] == 2 || data[2] == "フラグ3"
- when 2
- $sample_param[0] *= data[1] if data[0] == 0 || data[0] == "フラグ1"
- $sample_param[1] *= data[1] if data[0] == 1 || data[1] == "フラグ2"
- $sample_param[2] *= data[1] if data[0] == 2 || data[2] == "フラグ3"
- end
- end
- end
- ###上4つのクラスはどこからでも参照ができるクラスとなる。
- $g_chara , $g_image , $g_sentence , $g_sound = Class_chara.new , Class_image.new , Class_sentence.new , Class_sound.new
- ######上全てのクラスを参照するノベルエンジンクラス######
- class Class_novel
- ##@event_if_ary、@event_wait_ary、@event_result_ary は基本途中変化しないのでここだけの動作でよし。
- def initialize
- @param = Class_param_edit.new
- @days = 0
- @pages = 0
- @trucepoint = 0
- @time = 0
- @calp = 0
- @falp = 0
- @sensor_list = [[],[]]
- =begin
- リファレンス。
- @event_if_ary は発生条件。
- [※1 [※2 [※3 [※4 [条件パロメータ,数値,以上?以下?範囲内?、範囲外?],...],発生イベント],...],...]
- ※1:ここの区切りで日、ここでは一季節ごとという事を決める。 ※2:ここの、区切りでイベント開始判定順を決める。条件がnilの場合必ず実行されるイベントになる。
- 複数イベントを同日に置く場合前に置けば優先度が高まる、最後にはnil条件を入れておく。※3:※4:1イベントを起こすための条件は何個でも置ける。
- eg:[nil,[[[0,3,"up"],[1,3,"up"]],1],[nil,2]]
- @event_result_ary はイベント結果。
- [※1 [※2 [※3<正答度,判定>,[※4[※5<パラム引数,変化量>],...],※6>次イベント],...],...]
- ※1:@daysが基準。※2:複数置ける。※3:正答度に対してどう判定するか
- ※4:複数置ける。※5:左の値はClass_param_edit参照 ※6:ホームに戻るには-1,そうでなく別イベントを条件無視で発動するのはここを設定。
- eg:[nil,[[2,"up",[[0,3],[1,-4]],-1],[2,"down",[[0,3],[1,-4]],2]]]
- @event_wait_ary は最終ボタン待ち時間。
- [※1 [※2>タイム1,タイム2,タイム3,...,タイムX],...]
- ※1:@daysが基準。※2:ここの順番は@pagesを基準とする。だんだん値が高くなるか同じになっているのがベスト。
- eg:[nil,[100,200,200,200,300]]
- @event_soundeffects_ary は効果音を@time(フレームタイム)で指定。
- [※1 [※2[※3<タイム1,効果音引数>],[タイム1,効果音引数],[タイム1,効果音引数],...,[タイム1,効果音引数]],...]
- ※1:@daysが基準。※2:ここの順番は@pagesを基準とする。だんだん値が高くなるか同じになっているのがベスト。※3:左で設定した@timeになった時右の効果音を鳴らす。
- eg:[nil,[[50,0],[150,1],[250,2]]]
- @event_images_ary は画像、音楽。[※1 [※2 [背景番号,[[OBJ番号1,X座標1,Y座標1,α1],..,[OBJ番号2,X座標2,Y座標2,α2]],[音楽番号,音量],立ち位置x,立ち位置y,センターX,センターY,※3<ボディ,表情,[<※4>]]]]
- ※1:@daysが基準。※2:@pagesが基準。※3 特に理由が無ければ現在の標準ボディを指定できるようにすればいい。※4フラグを入れる。様々なのでここでは割愛
- eg:[nil,[[2,[[0,100,200,255],[1,400,300,122]],[0,80],120,300,false,false,0,2,[]],[1,[[4,200,300,255],[1,200,300,122]],[1,100],320,360,false,true,1,1,["α再定義"]]]]
- @event_sentence_aryは通常文章の内容。[※1 [※2 [※3 [x,y,文章,フォントサイズ,フォントタイプ,エフェクト,色,エッジの色,表示タイム範囲],...],...],...]
- ※1:@daysが基準。日に依存しないので連続イベントも起こせる。 ※2:@pagesが基準。 ※3:何個でも置けるが文字がかぶらないように。
- eg:[nil,[[[20,100,"これはさんぷる",24,"メイリオ","bi",[255,255,255],[0,0,0],20..60],[20,200,"ぷるぷる",18,"メイリオ","e",[255,255,255],[122,122,122],40..200]]]]
- @event_button_ary は条件分岐ボタン。[※1 [※2 [※3 [X座標,Y座標,文章,フォントサイズ,フォントタイプ,表示タイム範囲,正答数値,※4>正答方向,[※5 [※6>パラム名前,パラム変更値],ページ番号],...],...],...],...]
- ※1:@daysが基準。※2:@pagesが基準。 ※3:何個でも置けるが文字がかぶらないように。※4:"up","down","just","reverse"がある。※5:複数置ける。※6:名前はClass_param_edit参照。
- eg:[nil,[[[200,200,"次へ",24,"メイリオ",200..200,3,"up",[[0,3],[1,-3],1]],[200,300,"こっちだよ",24,"メイリオ",200..200,2,"down",[[1,3],[2,-3]],2]]]]
- 記述法(sentence,button,image)=>@daysが変わる時は1インデントずらす(でこぼこ記述) @pagesが変わる時は改行する。同じ分岐源からもしくは同じ分岐先の行はくっつける。
- 記述法(if,result,wait,soundeffects)=>@daysが変わる時は1インデントずらす(でこぼこ記述)
- 全て最初の値にはnilを入れること。上記のように。
- =end
- @event_if_ary = [nil,
- [[[[0,3,"up"],[1,3,"up"]],1],[[nil,2]]]]
- @event_result_ary = [nil,
- [[2,"up",[[0,3],[1,-4]],-1],[2,"down",[[0,3],[1,-4]],-1]]]
- @event_wait_ary = [nil,
- [100,200,200,200,300]]
- @event_soundeffects_ary = [nil,
- [[50,0],[150,1],[250,2]]]
- @event_images_ary = [nil,
- [[2,[[0,100,200,255],[1,400,300,122]],[0,80],120,300,false,false,0,2,[]],
- [1,[[2,200,300,255],[1,200,300,122]],[1,100],320,360,false,true,1,1,["α再定義"]],[1,[[2,200,300,255],[1,200,300,122]],[1,100],320,360,false,true,1,1,["α再定義"]],[1,[[2,200,300,255],[1,200,300,122]],[1,100],320,360,false,true,1,1,["α再定義"]],
- [0,[[0,100,100,255],[2,200,100,122]],[2,50],300,400,true,false,2,0,["非表示"]]]]
- @event_sentence_ary = [nil,
- [[[20,100,"これはさんぷる",24,"メイリオ","bi",[255,255,255],[0,0,0],20..100],[20,200,"ぷるぷる",18,"メイリオ","e",[255,255,255],[122,122,122],60..100]],
- [[20,100,"一の選択",24,"メイリオ","",[255,255,255],[0,0,0],100..200],[20,200,"のーまる",18,"メイリオ","",[255,122,122],[122,122,122],150..200]],
- [[20,100,"二の選択",24,"メイリオ","",[255,255,255],[0,0,0],100..200],[20,200,"あっぷあっぷ",18,"メイリオ","",[122,255,122],[122,122,122],150..200]],
- [[20,100,"三の選択",24,"メイリオ","",[255,255,255],[0,0,0],100..200],[20,200,"だうんだうん",18,"メイリオ","",[122,122,255],[122,122,122],150..200]],
- [[20,100,"終点",24,"メイリオ","b",[255,255,255],[0,0,0],200..300],[20,200,"おわり",18,"メイリオ","b",[255,255,255],[122,122,122],200..300]]]]
- @event_button_ary = [nil,
- [[[200,200,"次へ",24,"メイリオ",100..100,3,"up",[[0,1],[1,-3]],1],[200,300,"こっちだよ",24,"メイリオ",100..100,2,"down",[[1,2],[2,-3]],2],[200,400,"いやこっちだよ",24,"メイリオ",100..100,0,"just",[[0,3],[1,-3]],3]],
- [[200,200,"終点へ",24,"メイリオ",200..200,0,"up",[],4]],
- [[200,200,"終点へ",24,"メイリオ",200..200,0,"up",[],4]],
- [[200,200,"終点へ",24,"メイリオ",200..200,0,"up",[],4]],
- [[200,200,"おわり",24,"メイリオ",300..300,0,"up",[],-1]]]]
- end
- ##@event_soundeffects_ary、@event_sentence_ary、@event_button_ary、@event_images_ary を再定義し、イベント中の変化に対応。常に動作してると重いので@pagesの変化時のみ実行する。
- def reinit
- @event_soundeffects_ary = [nil,
- [[50,0],[150,1],[250,2]]]
- @event_images_ary = [nil,
- [[2,[[0,100,200,255],[1,400,300,122]],[0,80],120,300,false,false,0,2,[]],
- [1,[[2,200,300,255],[1,200,300,122]],[1,100],320,360,false,true,1,1,["α再定義"]],[1,[[2,200,300,255],[1,200,300,122]],[1,100],320,360,false,true,1,1,["α再定義"]],[1,[[2,200,300,255],[1,200,300,122]],[1,100],320,360,false,true,1,1,["α再定義"]],
- [0,[[0,100,100,255],[2,200,100,122]],[2,50],300,400,true,false,2,0,["非表示"]]]]
- @event_sentence_ary = [nil,
- [[[20,100,"これはさんぷる",24,"メイリオ","bi",[255,255,255],[0,0,0],20..100],[20,200,"ぷるぷる",18,"メイリオ","e",[255,255,255],[122,122,122],60..100]],
- [[20,100,"一の選択",24,"メイリオ","",[255,255,255],[0,0,0],100..200],[20,200,"のーまる",18,"メイリオ","",[255,122,122],[122,122,122],150..200]],
- [[20,100,"二の選択",24,"メイリオ","",[255,255,255],[0,0,0],100..200],[20,200,"あっぷあっぷ",18,"メイリオ","",[122,255,122],[122,122,122],150..200]],
- [[20,100,"三の選択",24,"メイリオ","",[255,255,255],[0,0,0],100..200],[20,200,"だうんだうん",18,"メイリオ","",[122,122,255],[122,122,122],150..200]],
- [[20,100,"終点",24,"メイリオ","b",[255,255,255],[0,0,0],200..300],[20,200,"おわり",18,"メイリオ","b",[255,255,255],[122,122,122],200..300]]]]
- @event_button_ary = [nil,
- [[[200,200,"次へ",24,"メイリオ",100..100,3,"up",[[0,3],[1,-3]],1],[200,300,"こっちだよ",24,"メイリオ",100..100,2,"down",[[1,3],[2,-3]],2],[200,400,"いやこっちだよ",24,"メイリオ",100..100,0,"just",[[0,3],[1,-3]],3]],
- [[200,200,"終点へ",24,"メイリオ",200..200,0,"up",[],4]],
- [[200,200,"終点へ",24,"メイリオ",200..200,0,"up",[],4]],
- [[200,200,"終点へ",24,"メイリオ",200..200,0,"up",[],4]],
- [[200,200,"おわり",24,"メイリオ",300..300,0,"up",[],300]]]]
- end
- ##原則初回のみ。
- def ifs(days) #恐らくやってくる値は日。
- if @event_if_ary[days] != nil #nil防止策
- $g_sound.silent #全曲をストップ
- @event_if_ary[days].each do |s| #その日の起こせるイベントを前から見る。
- if s[0] == nil #無条件イベント
- @days = s[1]
- $g_sound.music_play(@event_images_ary[@days][@pages][2][0],@event_images_ary[@days][@pages][2][1]) #初回音楽は何であれもう一度最初から奏でる。
- return s[1] #イベント番号を返す
- end
- s[0].each do |c|
- case c[2]
- when "up"
- if c[0] >= c[1]
- @days = s[1]
- $g_sound.music_play(@event_images_ary[@days][@pages][2][0],@event_images_ary[@days][@pages][2][1])
- return s[1]
- end
- when "down"
- if c[0] <= c[1]
- @days = s[1]
- $g_sound.music_play(@event_images_ary[@days][@pages][2][0],@event_images_ary[@days][@pages][2][1])
- return s[1]
- end
- when "range"
- if c[1].include?(c[0])
- @days = s[1]
- $g_sound.music_play(@event_images_ary[@days][@pages][2][0],@event_images_ary[@days][@pages][2][1])
- return s[1]
- end
- when "out"
- unless c[1].include?(c[0])
- @days = s[1]
- $g_sound.music_play(@event_images_ary[@days][@pages][2][0],@event_images_ary[@days][@pages][2][1])
- return s[1]
- end
- when "just"
- if c[0] == c[1]
- @days = s[1]
- $g_sound.music_play(@event_images_ary[@days][@pages][2][0],@event_images_ary[@days][@pages][2][1])
- return s[1]
- end
- end
- end
- end
- else
- return -1 #その日実行できるイベントが無い場合はホームにブーメラン。
- end
- end
- ##@pagesが変化つまりボタンを押した瞬間。音楽変わる、再定義が起こる。
- def mind(page)
- if @pages != page
- page = @pages
- if @event_images_ary[@days][@pages][1] != nil #nilを設定していた場合全曲を止める
- $g_sound.music_change(@event_images_ary[@days][@pages][2][0],@event_images_ary[@days][@pages][2][1])
- else
- $g_sound.silent
- end
- checkout = [page , true] #配列にして返す。
- return checkout
- end
- checkout = [page , false]
- return checkout
- end
- ##文、ボタンを動作させる。
- def sentence
- @sensor_list = []
- #↓文字の描写は1行で一括!!nil防止有り
- @event_sentence_ary[@days][@pages].each{|s| $g_sentence.draw_sentence(s[0],s[1],s[2],s[3],s[4],s[5],s[6],s[7]) if s[8].include?(@time)} if @event_sentence_ary[@days] != nil
- #ボタンの押し判定リストの生成
- num = 0
- if @event_button_ary[@days] != nil
- @event_button_ary[@days][@pages].each do |s|
- if s[5].include?(@time)
- @sensor_list << [$g_sentence.draw_button(s[0],s[1],s[2],s[3],s[4]), [s[6] , s[7] , s[8] , s[9]]]
- else
- @sensor_list << [false,false]
- end
- num += 1
- end
- #結果をここで処理
- @sensor_list.each do |r|
- if r[0] == true and Input.mousePush?(M_LBUTTON)
- case r[1][1]
- when "up"
- @trucepoint += r[1][0]
- when "down"
- @trucepoint -= r[1][0]
- when "just"
- @trucepoint = r[1][0]
- when "reverse"
- @trucepoint = -1 * r[1][0]
- end
- r[1][2].each{|d| @param.do(d,1) } if r[1][2] != [[]] #外部クラス @param (Class_param_edit) を用いないと能力を変更できない。
- @pages = r[1][3]
- break #複数ボタン押しを防ぐ為にブレイク
- end
- end
- end
- end
- ##環境操作または効果音をタイムラインで指定して鳴らす。(現在効果音のみ)
- def effects
- #↓サウンドは1行で一括!!#
- @event_soundeffects_ary[@days].each{|s| $g_sound.sound(s[1]) if s[0] == @time} if @event_soundeffects_ary[@days] != nil
- end
- ##各描写系フラグメントを追加できる。
- def draw
- if @event_images_ary[@days] != nil
- num_image,num_objects= @event_images_ary[@days][@pages][0],@event_images_ary[@days][@pages][1]
- x,y,cx,cy,num_body,num_face,calp = @event_images_ary[@days][@pages][3],@event_images_ary[@days][@pages][4],@event_images_ary[@days][@pages][5],@event_images_ary[@days][@pages][6],@event_images_ary[@days][@pages][7],@event_images_ary[@days][@pages][8],@calp
- $g_image.draw_background(num_image)
- num_objects.each{|v| $g_image.draw_object(v[0],v[1],v[2],v[3])}
- $g_chara.draw(x,y,cx,cy,num_body,num_face,calp) unless @event_images_ary[@days][@pages][9].include?("非表示")
- @calp = 0 if @event_images_ary[@days][@pages][9].include?("α再定義") #<=フラグメントの一例。
- end
- end
- ##イベントの最終結果がここに来る。
- def result(days)
- if @pages == 300 and @event_result_ary[@days] != nil #最終分岐を1ボタンにし、@pagesの指定を300にすること。
- clear = false
- @event_result_ary[@days].each do |p|
- case p[1]
- when "up"
- clear = true if @trucepoint >= p[0]
- when "down"
- clear = true if @trucepoint <= p[0]
- when "just"
- clear = true if @trucepoint == p[0]
- when "range"
- clear = true if p[0].include?(@trucepoint)
- when "out"
- clear = true unless p[0].include?(@trucepoint)
- end
- if clear == true
- p[2].each{|d| @param.do(d,1) } if p[2] != [[]] #外部クラス @param (Class_param_edit) を用いないと能力を変更できない。
- return p[3]
- end
- end
- else
- return days
- end
- end
- ##進行時間がここで一括調整できる。
- def time
- if @event_wait_ary[@days] != nil
- @calp += 5 if @calp < 255
- @time += 1.00 unless Input.keyDown?(K_SPACE)
- @time = @event_wait_ary[@days][@pages] if @time >= @event_wait_ary[@days][@pages]
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement