//#define NO_SOUND using Cryville.Audio.Source; using Cryville.Crtr.Event; using System; using System.Collections.Generic; using System.IO; namespace Cryville.Crtr { public class ChartHandler : ContainerHandler { //private StampedState cs; public Chart chart; //readonly Dictionary sounds = new Dictionary(); readonly List sounds = new List(); public ChartHandler(Chart _chart, DirectoryInfo dir) : base() { if (dir == null) throw new ArgumentNullException("dir"); chart = _chart; /*foreach (Chart.Group g in chart.groups) { var gh = new GroupHandler(g, this); // cs.AddChild(new StampedState(new StampedState(chart, sevs))); }*/ //PrehandleEvents(); } public override string TypeName { get { return "chart"; } } public override void PreInit() { base.PreInit(); } public override void Init() { base.Init(); #if !NO_SOUND /*foreach (Chart.Sound ev in chart.sounds) { sounds.Add(ev, new LibavFileAudioSource( Game.GameDataPath + "/songs/" + ev.id + "/.ogg" )); Logger.Log("main", 0, "Load", "Loading song: {0}", ev.id); }*/ #endif } public override void Dispose() { if (Disposed) return; base.Dispose(); // foreach (var h in handlers) h.Dispose(); foreach (var s in sounds) s.Dispose(); } /*List sevs = new List(); public void PrehandleEvents() { EventPrehandler ph = new EventPrehandler( chart, chart.motions.Cast() .Concat(chart.signs.Cast()) .Concat(chart.sounds.Cast()) ); // foreach (var h in handlers) h.StartPrehandler(ph); ph.Forward(ev => { if (ev is Chart.Sound) { Chart.Sound tev = (Chart.Sound)ev; sevs.Add(new StampedEvent.PlaySound() { Time = ph.Time - tev.offset + Settings.Default.SoundOffset, Event = tev }); } // foreach (var h in handlers) h.PrehandleToTime(ph.Time); }); sevs = sevs.Concat(ph.Result).ToList(); cs = new StampedState(chart, sevs); // foreach (var h in handlers) h.EndPrehandler(cs); }*/ public override void Update(ContainerState s, StampedEvent ev) { base.Update(s, ev); if (s.CloneType == 16) { if (ev == null) { } else if (ev.Unstamped == null) { } else if (ev.Unstamped is Chart.Sound) { Chart.Sound tev = (Chart.Sound)ev.Unstamped; var source = new LibavFileAudioSource( Game.GameDataPath + "/songs/" + tev.id + "/.ogg" ); source.SelectStream(); sounds.Add(source); Game.AudioSession.Sequence( s.Time - tev.offset + ChartPlayer.soundOffset, source ); /*var l = new List { new StampedEvent.PlaySound() { Time = s.Time - tev.offset + ChartPlayer.soundOffset, Container = chart, Unstamped = tev } }; cs.Bus.IssuePatch(l);*/ } } } public override void ExUpdate(ContainerState s, StampedEvent ev) { base.ExUpdate(s, ev); if (s.CloneType == 0) { /*#if !NO_SOUND if (ev is StampedEvent.PlaySound) { StampedEvent.PlaySound tev = (StampedEvent.PlaySound)ev; // sounds[tev.Event.file.ToLower()].audioSource.time = toTime - cs.Time; sounds[tev.Unstamped.id].audioSource.Play(); } #endif*/ } } public override void EndUpdate(ContainerState s) { base.EndUpdate(s); // TODO End of chart } /*public void SendInput(int id, TouchPhase phase, Vector2 pos) { // Vector2 jpos = Camera.main.ScreenToWorldPoint(new Vector3(pos.x, pos.y, -cameraZ)); /*foreach (var h in handlers) { h.SendInput(id, phase, jpos); }* } int hits = 0; int misses = 0; public void ReportJudge(bool hit) { if (hit) hits++; else misses++; GameObject.Find("Status").GetComponent().text = string.Format("Hits: {0}\nMisses: {1}", hits, misses); }*/ } /*public class ChartState : ChartEventStateBase { public ChartState(Chart c) : base( c, c.motions.Cast() .Concat(c.signs.Cast()) .Concat(c.sounds.Cast()) ) { } protected override void Handle(Chart.Event ev) { /*if (ev is Chart.Signature) { Chart.Signature tev = (Chart.Signature)ev; float tempo = tev.tempo; if (tempo != 0) Tempo = tempo; }* base.Handle(ev); } }*/ }