OSDN Git Service

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