root/Code/oMaE/oMaE/MiniGames/BaseChanger.cs @ 119

Revision 119, 5.6 KB (checked in by acarter, 2 years ago)

Committed in semi-stable state

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Microsoft.Xna.Framework;
6using Microsoft.Xna.Framework.Audio;
7using Microsoft.Xna.Framework.Content;
8using Microsoft.Xna.Framework.GamerServices;
9using Microsoft.Xna.Framework.Graphics;
10using Microsoft.Xna.Framework.Input;
11using Microsoft.Xna.Framework.Media;
12using Serializables;
13using oMaE.Widgets;
14
15namespace oMaE.MiniGames
16{
17    /// <summary>
18    /// Teaches kids how to change bases.
19    /// </summary>
20    public class BaseChanger : MiniGame
21    {
22        /// <summary>
23        /// The target number.
24        /// </summary>
25        public String Target;
26        /// <summary>
27        /// The target base.
28        /// </summary>
29        public int TargetBase;
30        /// <summary>
31        /// The value of the Target in TargetBase.
32        /// </summary>
33        private int TargetValue
34        {
35            get
36            {
37                int val = 0;
38                for (int i = 0; i < Target.Length; ++i)
39                {
40                    val *= TargetBase;
41                    val += int.Parse(Target.Substring(i, 1), System.Globalization.NumberStyles.HexNumber);
42                }
43                return val;
44            }
45        }
46        /// <summary>
47        /// The base the user is in.
48        /// </summary>
49        public int Base;
50        /// <summary>
51        /// The number of digits the user has available.
52        /// </summary>
53        public int Digits;
54        /// <summary>
55        /// Total sum of the digits at last check.
56        /// </summary>
57        public int Sum;
58
59        /// <summary>
60        /// Whether the answer is correct.
61        /// </summary>
62        public override bool Correct
63        {
64            get
65            {
66                Sum = 0;
67                for (int i = 0; i < Digits; ++i)
68                {
69                    Sum *= Base;
70                    Sum += selectors[i].Value;
71                    playerValues[i].Target = playerValues[i].Value;
72                }
73                int j = Sum;
74                for (int i = 0; i < Target.Length; ++i)
75                {
76                    int delta = (Math.Min(gameValues[i].MaxValue, j) / gameValues[i].MinIncrement) * gameValues[i].MinIncrement;
77                    gameValues[i].Value = delta;
78                    j -= delta;
79                }
80                return Sum == TargetValue;
81            }
82        }
83
84        private DigitSelect[] selectors, selected;
85        private Blocks[] playerValues, gameValues;
86        /// <summary>
87        /// Creates a new base changer game from the serializable.
88        /// </summary>
89        /// <param name="game">The game.</param>
90        public BaseChanger(BaseChangerGame game) : base(game)
91        {
92            Target = game.Target;
93            TargetBase = game.TargetBase;
94            Base = game.Base;
95            Digits = game.Digits;
96
97        }
98        /// <summary>
99        /// Initializes the base changer.
100        /// </summary>
101        public override void Initialize()
102        {
103            selectors = new DigitSelect[Digits];
104            playerValues = new Blocks[Digits];
105            for (int i = 0; i < Digits; ++i)
106            {
107                Rectangle loc = new Rectangle(100 + (600 * i / (Digits - 1)), 450, 0, 0);
108                loc.Inflate(25, 25);
109                selectors[i] = new DigitSelect(loc, Base, 0);
110                playerValues[i] = new Blocks(Base, Digits - i - 1, Base - 1, new Vector2(100 + (600 * i / (Digits - 1)), 390));
111                playerValues[i].Location -= new Vector2(playerValues[i].Width / 2, playerValues[i].Height);
112                selectors[i].Hitbox.Offset(0, -playerValues[i].Height / 2 + 25);
113                selectors[i].Hitbox.Inflate(0, playerValues[i].Height / 2 + 25);
114            }
115            children.AddRange(selectors);
116            children.AddRange(playerValues);
117
118            selected = new DigitSelect[Target.ToString().Length];
119            gameValues = new Blocks[Target.ToString().Length];
120            for (int i = 0; i < Target.ToString().Length; ++i)
121            {
122                Rectangle loc = new Rectangle(100 + (600 * i / (Target.ToString().Length - 1)), 100, 0, 0);
123                loc.Inflate(25, 25);
124                selected[i] = new DigitSelect(loc, TargetBase, int.Parse(Target.ToString().Substring(i, 1)));
125               
126                selected[i].Updating = false;
127                gameValues[i] = new Blocks(TargetBase, TargetBase.ToString().Length - i - 1, TargetBase - 1, new Vector2(100 + (600 * i / (Target.ToString().Length - 1)), 150));
128                gameValues[i].Location -= new Vector2(gameValues[i].Width / 2, 0);
129            }
130            children.AddRange(selected);
131            children.AddRange(gameValues);
132
133            base.Initialize();
134        }
135        /// <summary>
136        /// Updates the base changer.
137        /// </summary>
138        public override void Update()
139        {
140
141            for (int i = 0; i < selected.Length; ++i)
142                gameValues[i].Target = gameValues[i].MinIncrement * selected[i].Value;
143            for (int i = 0; i < selectors.Length; ++i)
144                playerValues[i].Value = playerValues[i].MinIncrement * selectors[i].Value;
145            base.Update();
146        }
147        public override void Draw(Screen2D screen)
148        {
149            screen.DrawText(string.Format("Convert {0} in base {1} to base {2}.", Target, TargetBase, Base), new Vector2(30, 10), TextHorizontal.LEFT, TextVertical.TOP, Color.White);
150            base.Draw();
151        }
152    }
153}
Note: See TracBrowser for help on using the browser.