OSDN Git Service

#36433 CONFIGURATIONで、BufferdInputをOFFからONに切り替えできない問題を修正。
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / ステージ / 04.コンフィグ / COption.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Linq;\r
4 using System.Text;\r
5 using System.Threading.Tasks;\r
6 using System.Runtime.Serialization;\r
7 using System.Diagnostics;\r
8 using FDK;\r
9 \r
10 namespace DTXMania\r
11 {\r
12         public delegate void VoidFunc();\r
13 \r
14         /// <summary>\r
15         /// Option 基底クラス。\r
16         /// 注意:値の参照は Value プロパティを使ってください。\r
17         /// 一部のクラスは暗黙的な型変換を実装していますが、\r
18         /// オプションクラスインスタンス同士の等価比較には気をつけてください。\r
19         /// </summary>\r
20         [DataContract]\r
21         public abstract class COptionBase\r
22         {\r
23                 public EOptionType type;\r
24                 /// <summary>\r
25                 /// コンフィグ画面におけるこの項目を表す文字列。\r
26                 /// </summary>\r
27                 public string label;\r
28 \r
29                 /// <summary>\r
30                 /// 説明。Properties.Resources から取得してください。\r
31                 /// </summary>\r
32                 public string explanation;\r
33 \r
34                 /// <summary>\r
35                 /// OnEnter で用いる動作。たとえば、この値によってほかのオプションに制約を与える場合などに\r
36                 /// その処理を登録しておけば、値の確定後実行されます。\r
37                 /// </summary>\r
38                 public VoidFunc OnEnterDelegate;\r
39 \r
40                 /// <summary>\r
41                 /// 決定動作。OnEnterDelegate メンバに動作を登録します。\r
42                 /// </summary>\r
43                 public void OnEnter()\r
44                 {\r
45                         if (OnEnterDelegate != null)\r
46                         {\r
47                                 OnEnterDelegate();\r
48                         }\r
49                 }\r
50 \r
51                 /// <summary>\r
52                 /// 前の項目値動作。順序付け可能な値からなるオプションは相応に実装する必要があります。\r
53                 /// </summary>\r
54                 public virtual void OnPrevious()\r
55                 {\r
56                 }\r
57 \r
58                 /// <summary>\r
59                 /// アイテムインデックス。\r
60                 /// </summary>\r
61                 public virtual int Index\r
62                 {\r
63                         get\r
64                         {\r
65                                 return 0;\r
66                         }\r
67                         set\r
68                         {\r
69 \r
70                         }\r
71                 }\r
72 \r
73                 /// <summary>\r
74                 /// OnPrevious の逆順序用。\r
75                 /// </summary>\r
76                 public virtual void OnNext()\r
77                 {\r
78                 }\r
79         }\r
80 \r
81         /// <summary>\r
82         /// Option 基底クラス。\r
83         /// DataContract により XML へのシリアライズ、XML からのデシリアライズが可能です。\r
84         /// </summary>\r
85         /// <typeparam name="T">このオプションの型。</typeparam>\r
86         [DataContract]\r
87         public abstract class COption<T> : COptionBase\r
88         {\r
89                 [DataMember]\r
90                 protected T val;\r
91 \r
92                 public virtual T Value\r
93                 {\r
94                         get\r
95                         {\r
96                                 return val;\r
97                         }\r
98                         set\r
99                         {\r
100                                 val = value;\r
101                         }\r
102                 }\r
103         }\r
104 \r
105         [DataContract]\r
106         public class COptionBool : COption<bool>\r
107         {\r
108                 public static implicit operator bool (COptionBool b)\r
109                 {\r
110                         return b.Value;\r
111                 }\r
112 \r
113                 public override int Index\r
114                 {\r
115                         get\r
116                         {\r
117                                 return val ? 1 : 0;\r
118                         }\r
119                 }\r
120 \r
121                 public COptionBool(bool init)\r
122                 {\r
123                         val = init;\r
124                 }\r
125 \r
126                 public override void OnNext()\r
127                 {\r
128                         OnPrevious();\r
129                 }\r
130 \r
131                 public override void OnPrevious()\r
132                 {\r
133                         val = !val;\r
134                 }\r
135 \r
136                 public override string ToString()\r
137                 {\r
138                         CResources cr = CDTXMania.Instance.Resources;\r
139                         return val ? cr.Label("strCfgOn") : cr.Label("strCfgOff");\r
140                 }\r
141 \r
142                 public void Initialize(string lbl, string expl)\r
143                 {\r
144                         label = lbl;\r
145                         explanation = expl;\r
146                 }\r
147         }\r
148 \r
149         [DataContract]\r
150         public class COptionInteger : COption<int>\r
151         {\r
152                 public int nStep;\r
153                 private int nMin;\r
154                 private int nMax;\r
155 \r
156                 public static implicit operator int (COptionInteger n)\r
157                 {\r
158                         return n.Value;\r
159                 }\r
160 \r
161                 public override int Index\r
162                 {\r
163                         get\r
164                         {\r
165                                 return val;\r
166                         }\r
167                 }\r
168 \r
169                 public COptionInteger(int init)\r
170                 {\r
171                         nMin = int.MinValue;\r
172                         nMax = int.MaxValue;\r
173                         val = init;\r
174                 }\r
175 \r
176                 public override int Value\r
177                 {\r
178                         get\r
179                         {\r
180                                 return base.Value;\r
181                         }\r
182 \r
183                         set\r
184                         {\r
185                                 base.Value = value;\r
186                                 LimitValue();\r
187                         }\r
188                 }\r
189 \r
190                 private void LimitValue()\r
191                 {\r
192                         if (val >= nMax)\r
193                         {\r
194                                 val = nMax - 1;\r
195                         }\r
196                         if (val < nMin)\r
197                         {\r
198                                 val = nMin;\r
199                         }\r
200                 }\r
201 \r
202                 public override void OnNext()\r
203                 {\r
204                         val+=nStep;\r
205                         LimitValue();\r
206                 }\r
207 \r
208                 public override void OnPrevious()\r
209                 {\r
210                         val-=nStep;\r
211                         LimitValue();\r
212                 }\r
213 \r
214                 public Converter<int, string> ValueFormatter;\r
215 \r
216                 public override string ToString()\r
217                 {\r
218                         string ret = "";\r
219                         if (ValueFormatter != null)\r
220                         {\r
221                                 ret = ValueFormatter(val);\r
222                         }\r
223                         else\r
224                         {\r
225                                 ret = val.ToString();\r
226                         }\r
227                         return ret;\r
228                 }\r
229 \r
230                 public void Initialize(string lbl, string expl, int min = int.MinValue, int max = int.MaxValue, int step = 1)\r
231                 {\r
232                         label = lbl;\r
233                         explanation = expl;\r
234                         nMin = min;\r
235                         nMax = max;\r
236                         nStep = step;\r
237                 }\r
238         }\r
239 \r
240         public interface IOptionList\r
241         {\r
242 \r
243         }\r
244 \r
245         [DataContract]\r
246         public abstract class COptionList<T> : COption<T>, IOptionList\r
247         {\r
248                 protected T[] vals;\r
249                 protected int ptr;\r
250                 public int Length { get; protected set; }\r
251 \r
252                 public T this[int idx]\r
253                 {\r
254                         get\r
255                         {\r
256                                 return vals[idx];\r
257                         }\r
258                 }\r
259 \r
260                 public override T Value\r
261                 {\r
262                         get\r
263                         {\r
264                                 return base.Value;\r
265                         }\r
266 \r
267                         set\r
268                         {\r
269                                 base.Value = value;\r
270                                 for (int i = 0; i < Length; ++i)\r
271                                 {\r
272                                         if (vals[i].Equals(value))\r
273                                         {\r
274                                                 ptr = i;\r
275                                         }\r
276                                 }\r
277                         }\r
278                 }\r
279 \r
280                 public override int Index\r
281                 {\r
282                         get\r
283                         {\r
284                                 return ptr;\r
285                         }\r
286                         set\r
287                         {\r
288                                 ptr = value;\r
289                                 if (ptr >= Length) ptr = Length - 1;\r
290                                 if (ptr < 0) ptr = 0;\r
291                                 val = vals[ptr];\r
292                         }\r
293                 }\r
294 \r
295                 public override void OnNext()\r
296                 {\r
297                         ++ptr;\r
298                         if (ptr >= Length)\r
299                         {\r
300                                 ptr = 0;\r
301                         }\r
302                         val = vals[ptr];\r
303                 }\r
304 \r
305                 public override void OnPrevious()\r
306                 {\r
307                         --ptr;\r
308                         if (ptr < 0)\r
309                         {\r
310                                 ptr = Length - 1;\r
311                         }\r
312                         val = vals[ptr];\r
313                 }\r
314 \r
315                 public override string ToString()\r
316                 {\r
317                         return val.ToString();\r
318                 }\r
319 \r
320         }\r
321 \r
322 \r
323         /// <summary>\r
324         /// 列挙定数用オプションアイテム。\r
325         /// </summary>\r
326         /// <typeparam name="E">\r
327         /// 列挙型。ただし、列挙型以外を渡してもコンパイル時エラーとならないので注意してください。(where 制約不可)\r
328         /// また E のメンバに負の値を持つメンバを入れると意図した順番になりません。</typeparam>\r
329         [DataContract]\r
330         public class COptionEnum<E> : COptionList<E> where E : struct\r
331         {\r
332                 public static implicit operator E(COptionEnum<E> e)\r
333                 {\r
334                         return e.Value;\r
335                 }\r
336 \r
337                 /// <summary>\r
338                 /// リフレクションから列挙定数の集合を取得し、内部ポインタでまわします。\r
339                 /// ※実行時型情報の扱いは基本的に重いので注意してください。\r
340                 /// </summary>\r
341                 public COptionEnum(E init)\r
342                 {\r
343                         val = init;\r
344                 }\r
345 \r
346                 public void Initialize(string lbl, string expl, Type type)\r
347                 {\r
348                         label = lbl;\r
349                         explanation = expl;\r
350 \r
351                         Length = type.GetEnumValues().Length;\r
352                         vals = new E[Length];\r
353                         int initptr = -1;\r
354                         ptr = 0;\r
355                         foreach (E t in typeof(E).GetEnumValues())\r
356                         {\r
357                                 if (t.Equals(val))\r
358                                 {\r
359                                         initptr = ptr;\r
360                                 }\r
361                                 vals[ptr] = t;\r
362                                 ++ptr;\r
363                         }\r
364                         if (initptr == -1)\r
365                         {\r
366                                 val = vals[0];\r
367                                 ptr = 0;\r
368                         }\r
369                         else\r
370                         {\r
371                                 ptr = initptr;\r
372                         }\r
373                 }\r
374 \r
375         }\r
376 \r
377         [DataContract]\r
378         public class COptionString : COption<string>\r
379         {\r
380                 public static implicit operator string (COptionString s)\r
381                 {\r
382                         return s.Value;\r
383                 }\r
384 \r
385                 public COptionString(string init)\r
386                 {\r
387                         val = init;\r
388                 }\r
389 \r
390                 public void Initialize(string lbl, string expl)\r
391                 {\r
392                         label = lbl;\r
393                         explanation = expl;\r
394                 }\r
395 \r
396                 public override string ToString()\r
397                 {\r
398                         return val;\r
399                 }\r
400         }\r
401 \r
402         [DataContract]\r
403         public class COptionStringList : COptionList<string>\r
404         {\r
405                 public COptionStringList(string init)\r
406                 {\r
407                         val = init;\r
408                 }\r
409 \r
410                 public void Initialize(string lbl, string expl, string[] initvals)\r
411                 {\r
412                         label = lbl;\r
413                         explanation = expl;\r
414 \r
415                         Length = initvals.Length;\r
416                         vals = new string[Length];\r
417                         int initptr = -1;\r
418                         ptr = 0;\r
419                         foreach (var t in initvals)\r
420                         {\r
421                                 if (t == val)\r
422                                 {\r
423                                         initptr = ptr;\r
424                                 }\r
425                                 vals[ptr] = t;\r
426                                 ++ptr;\r
427                         }\r
428 \r
429                         if (initptr == -1)\r
430                         {\r
431                                 val = vals[0];\r
432                                 ptr = 0;\r
433                         }\r
434                         else\r
435                         {\r
436                                 ptr = initptr;\r
437                         }\r
438                 }\r
439         }\r
440 \r
441         [DataContract]\r
442         public class COptionFloat : COption<float>\r
443         {\r
444                 public static implicit operator float (COptionFloat f)\r
445                 {\r
446                         return f.Value;\r
447                 }\r
448 \r
449                 public COptionFloat(float init)\r
450                 {\r
451                         val = init;\r
452                 }\r
453 \r
454                 public void Initialize(string lbl, string expl)\r
455                 {\r
456                         label = lbl;\r
457                         explanation = expl;\r
458                 }\r
459 \r
460                 public override string ToString()\r
461                 {\r
462                         return val.ToString();\r
463                 }\r
464         }\r
465 \r
466         public class COptionLabel : COptionString\r
467         {\r
468                 public COptionLabel(string lbl, string expl)\r
469                         : base("")\r
470                 {\r
471                         type = EOptionType.Other;\r
472                         label = lbl;\r
473                         explanation = expl;\r
474                 }\r
475         }\r
476 \r
477         [DataContract]\r
478         public class COptionDictionary<K, V> : COption<Dictionary<K, V>>\r
479         {\r
480                 public V this[K t]\r
481                 {\r
482                         get\r
483                         {\r
484                                 return Value[t];\r
485                         }\r
486                 }\r
487         }\r
488 \r
489         [DataContract]\r
490         public class COptionKeyAssign : COption<CKeyAssign>\r
491         {\r
492                 public EInputDevice 入力デバイス\r
493                 {\r
494                         get\r
495                         {\r
496                                 return Value.InputDevice;\r
497                         }\r
498                         set\r
499                         {\r
500                                 Value.InputDevice = value;\r
501                         }\r
502                 }\r
503 \r
504                 public int ID\r
505                 {\r
506                         get\r
507                         {\r
508                                 return Value.ID;\r
509                         }\r
510                         set\r
511                         {\r
512                                 Value.ID = value;\r
513                         }\r
514                 }\r
515 \r
516                 public int コード\r
517                 {\r
518                         get\r
519                         {\r
520                                 return Value.Code;\r
521                         }\r
522                         set\r
523                         {\r
524                                 Value.Code = value;\r
525                         }\r
526                 }\r
527 \r
528                 public COptionKeyAssign()\r
529                 {\r
530                         val = new CKeyAssign(EInputDevice.Unknown, 0, 0);\r
531                 }\r
532 \r
533                 public void Reset()\r
534                 {\r
535                         Value.InputDevice = EInputDevice.Unknown;\r
536                         Value.ID = 0;\r
537                         Value.Code = 0;\r
538                 }\r
539 \r
540                 public void CopyFrom(CKeyAssign t)\r
541                 {\r
542                         Value.InputDevice = t.InputDevice;\r
543                         Value.ID = t.ID;\r
544                         Value.Code = t.Code;\r
545                 }\r
546         }\r
547 \r
548         [DataContract]\r
549         public class COptionPadBool : STPadValue<COptionBool>\r
550         {\r
551                 private bool DetermineAssignValue(EThreeState state)\r
552                 {\r
553                         return state == EThreeState.On ? true : state == EThreeState.Off ? false : false;\r
554                 }\r
555 \r
556                 public bool bIsAutoHH\r
557                 {\r
558                         get\r
559                         {\r
560                                 return !LC && HH && !SD && !BD && !HT && !LT && !FT && !CY && !RD && HHO;\r
561                         }\r
562                 }\r
563 \r
564                 public bool bIsAutoBD\r
565                 {\r
566                         get\r
567                         {\r
568                                 return !LC && !HH && !SD && BD && !HT && !LT && !FT && !CY && !RD && !HHO;\r
569                         }\r
570                 }\r
571 \r
572                 public bool bIsAutoNeck(EPart e)\r
573                 {\r
574                         bool ret = false;\r
575                         if (e == EPart.Guitar)\r
576                         {\r
577                                 ret = GtR && GtG && GtB && !GtPick;\r
578                         }\r
579                         else if (e == EPart.Bass)\r
580                         {\r
581                                 ret = BsR && BsG && BsB && !BsPick;\r
582                         }\r
583                         return ret;\r
584                 }\r
585 \r
586                 public bool bIsAutoPick(EPart e)\r
587                 {\r
588                         bool ret = false;\r
589                         if (e == EPart.Guitar)\r
590                         {\r
591                                 ret = !GtR && !GtG && !GtB && GtPick;\r
592                         }\r
593                         else if (e == EPart.Bass)\r
594                         {\r
595                                 ret = !BsR && !BsG && !BsB && BsPick;\r
596                         }\r
597                         return ret;\r
598                 }\r
599 \r
600                 public void SetAutoHH()\r
601                 {\r
602                         Set(EPart.Drums, EThreeState.Off);\r
603                         HH.Value = true;\r
604                 }\r
605 \r
606                 public void SetAutoBD()\r
607                 {\r
608                         Set(EPart.Drums, EThreeState.Off);\r
609                         BD.Value = true;\r
610                 }\r
611 \r
612                 public void SetAutoPick(EPart e)\r
613                 {\r
614                         Set(e, EThreeState.Off);\r
615                         if (e == EPart.Drums)\r
616                         {\r
617                                 GtPick.Value = true;\r
618                         }\r
619                         else if (e == EPart.Bass)\r
620                         {\r
621                                 BsPick.Value = true;\r
622                         }\r
623                 }\r
624 \r
625                 public void SetAutoNeck(EPart e)\r
626                 {\r
627                         Set(e, EThreeState.Off);\r
628                         if (e == EPart.Drums)\r
629                         {\r
630                                 GtR.Value = true;\r
631                                 GtG.Value = true;\r
632                                 GtB.Value = true;\r
633                         }\r
634                         else if (e == EPart.Bass)\r
635                         {\r
636                                 BsR.Value = true;\r
637                                 BsG.Value = true;\r
638                                 BsB.Value = true;\r
639                         }\r
640                 }\r
641 \r
642                 public void Set(EPart e, EThreeState state)\r
643                 {\r
644                         bool val = DetermineAssignValue(state);\r
645                         if (EThreeState.X != state)\r
646                         {\r
647                                 if (e == EPart.Drums)\r
648                                 {\r
649                                         LC.Value = HH.Value = HHO.Value = SD.Value =\r
650                                                         BD.Value = HT.Value = LT.Value = FT.Value = CY.Value = RD.Value = val;\r
651                                 }\r
652                                 else if (e == EPart.Guitar)\r
653                                 {\r
654                                         GtR.Value = GtG.Value = GtB.Value = GtPick.Value = GtWail.Value = val;\r
655                                 }\r
656                                 else if (e == EPart.Bass)\r
657                                 {\r
658                                         BsR.Value = BsG.Value = BsB.Value = BsPick.Value = BsWail.Value = val;\r
659                                 }\r
660                         }\r
661                 }\r
662 \r
663                 public bool IsAllFalse(EPart x)\r
664                 {\r
665                         bool ret = false;\r
666                         if (x == EPart.Guitar)\r
667                         {\r
668                                 ret = !GtR && !GtG && !GtB && !GtPick && !GtWail;\r
669                         }\r
670                         else if (x == EPart.Bass)\r
671                         {\r
672                                 ret = !BsR && !BsG && !BsB && !BsPick && !BsWail;\r
673                         }\r
674                         else if (x == EPart.Drums)\r
675                         {\r
676                                 ret = !LC && !HH && !SD && !BD && !HT && !LT && !FT && !CY && !RD && !HHO;\r
677                         }\r
678                         return ret;\r
679                 }\r
680 \r
681                 public bool IsAllTrue(EPart x)\r
682                 {\r
683                         bool ret = false;\r
684                         if (x == EPart.Guitar)\r
685                         {\r
686                                 ret = GtR && GtG && GtB && GtPick && GtWail;\r
687                         }\r
688                         else if (x == EPart.Bass)\r
689                         {\r
690                                 ret = BsR && BsG && BsB && BsPick && BsWail;\r
691                         }\r
692                         else if (x == EPart.Drums)\r
693                         {\r
694                                 ret = LC && HH && SD && BD && HT && LT && FT && CY && RD && HHO;\r
695                         }\r
696                         return ret;\r
697                 }\r
698         }\r
699 \r
700 }\r