root/Code/oMaE/oMaE/MiniGames/Match.cs @ 60

Revision 60, 7.8 KB (checked in by acarter, 2 years ago)

Added checking in the Match minigame.

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 oMaE.Widgets;
13
14namespace oMaE.MiniGames
15{
16    using Overworld;
17    /// <summary>
18    /// The energy matching minigame.
19    /// </summary>
20    public class Match : MiniGame
21    {
22        private struct RadioPair { public RadioButton First, Second; public RadioPair(RadioButton first, RadioButton second) { First = first; Second = second; } }
23        // FIXME Base off of radio buttons and not locations.
24        private Dictionary<RadioButton, MatchImage> inputs = new Dictionary<RadioButton, MatchImage>(), outputs = new Dictionary<RadioButton, MatchImage>();
25        private int totalLines = 6;
26        private int validLines = 0;
27        private int seed;
28        private enum LINE_TYPE { NONE, NEW, WRONG, CORRECT };
29        RadioGroup radioGroup, matchGroup;
30        int[] offset = new int[]{22, 17, 0, 25, 38};
31        String[] energies = new String[] { "Kinetic Energy", "Electric Energy", "Chemical Energy", "Sound Energy", "Light Energy", "Thermal Energy", "Wind Energy" };
32        Dictionary<RadioPair, LINE_TYPE> pairs = new Dictionary<RadioPair, LINE_TYPE>();
33
34        public Match(int seed = 0)
35        {
36            this.seed = seed;
37        }
38        /// <summary>
39        /// Initializes the match minigame.
40        /// </summary>
41        public override void Initialize()
42        {
43            radioGroup = new RadioGroup();
44            children.Add(radioGroup);
45            for (int i = 0; i < 2; ++i)
46                for (int j = 0; j < energies.Length; ++j)
47                    radioGroup.addRadioButton(new Vector2(i == 0 ? 170 : 470, 40 * j + 120), energies[j], i == 0 ? TextLocation.LEFT : TextLocation.RIGHT);
48            matchGroup = new RadioGroup();
49            children.Add(matchGroup);
50            // FIXME
51            LinkedList<String[]> possibilities = new LinkedList<String[]>();
52            possibilities.AddLast(new String[] { "Sprites/drum", "Kinetic Energy", "Sound Energy"});
53            possibilities.AddLast(new String[] { "Sprites/microphone", "Sound Energy", "Electric Energy" });
54            possibilities.AddLast(new String[] { "Sprites/speaker", "Electric Energy", "Sound Energy" });
55            possibilities.AddLast(new String[] { "Sprites/lightbulb", "Electric Energy", "Light Energy" });
56            possibilities.AddLast(new String[] { "Sprites/windmill", "Wind Energy", "Electric Energy" });
57            for (int i = 0; i < 3; ++i)
58            {
59                int index = seed % possibilities.Count;
60                String[] temp = possibilities.ElementAt(index);
61                possibilities.Remove(temp);
62                int less_width = temp[0] == "Sprites/microphone" || temp[0] == "Sprites/windmill" ? 50 :
63                                 temp[0] == "Sprites/lightbulb" ? 32 : 0;
64                MatchImage image = new MatchImage(matchGroup, new Image2D(temp[0], new Rectangle(270 + less_width / 2, 70 + i * 120, 100 - less_width, 100)), temp[1], temp[2]);
65                children.Add(image);
66                inputs.Add(image.Left, image);
67                outputs.Add(image.Right, image);
68            }
69            base.Initialize();
70        }
71        /// <summary>
72        /// Updates the radio button pairs
73        /// </summary>
74        public override void Update()
75        {
76            if (radioGroup.ActiveButton != null && matchGroup.ActiveButton != null)
77            {
78                if((radioGroup.ActiveButton.Center.X < 250) ^ (outputs.ContainsKey(matchGroup.ActiveButton)))
79                {
80                    RadioPair pair = new RadioPair(radioGroup.ActiveButton, matchGroup.ActiveButton);
81                    if (!pairs.ContainsKey(pair))
82                        pairs.Add(pair, LINE_TYPE.NONE);
83
84                    if(pairs[pair] == LINE_TYPE.NONE && validLines < totalLines)
85                    {
86                        pairs[pair] = LINE_TYPE.NEW;
87                        validLines++;
88                    }
89                    else if (pairs[pair] == LINE_TYPE.NEW)
90                    {
91                        pairs[pair] = LINE_TYPE.NONE;
92                        validLines--;
93                    }
94                }
95                radioGroup.ClearActive();
96                matchGroup.ClearActive();
97            }
98            base.Update();
99        }
100        /// <summary>
101        /// Checks for correctness
102        /// </summary>
103        public override bool Correct
104        {
105            get
106            {
107                if(validLines != totalLines)
108                    return false;
109                Dictionary<RadioPair, LINE_TYPE> copy = new Dictionary<RadioPair, LINE_TYPE>(pairs);
110                foreach (KeyValuePair<RadioPair, LINE_TYPE> pair in pairs)
111                {
112                    if (pair.Value == LINE_TYPE.NEW)
113                    {
114                        if (inputs.ContainsKey(pair.Key.Second) && inputs[pair.Key.Second].From.Contains(pair.Key.First.Text)
115                            || outputs.ContainsKey(pair.Key.Second) && outputs[pair.Key.Second].To.Contains(pair.Key.First.Text))
116                        {
117                            copy[pair.Key] = LINE_TYPE.CORRECT;
118                        }
119                        else
120                        {
121                            copy[pair.Key] = LINE_TYPE.WRONG;
122                            validLines--;
123                        }
124                    }
125                }
126                pairs = copy;
127                return validLines == totalLines;
128            }
129        }
130        /// <summary>
131        /// Draws the match minigame.
132        /// </summary>
133        /// <param name="screen">The screen to be drawn to.</param>
134        /// <param name="gameState">The current game state.</param>
135        public override void Draw(Screen2D screen, GameState gameState)
136        {
137            if (radioGroup.ActiveButton != null)
138                screen.DrawLine(radioGroup.ActiveButton.Center, gameState.MousePos, Color.Black);
139            if (matchGroup.ActiveButton != null)
140                screen.DrawLine(matchGroup.ActiveButton.Center, gameState.MousePos, Color.Black);
141            foreach (KeyValuePair<RadioPair, LINE_TYPE> pair in pairs)
142            {
143                Color lineColor;
144                switch(pair.Value)
145                {
146                    case LINE_TYPE.NEW:
147                        lineColor = Color.White;
148                        break;
149                    case LINE_TYPE.CORRECT:
150                        lineColor = Color.DarkGreen;
151                        break;
152                    case LINE_TYPE.WRONG:
153                        lineColor = Color.Red;
154                        break;
155                    default:
156                        continue;
157                }
158                screen.DrawLine(pair.Key.First.Center, pair.Key.Second.Center, lineColor);
159            }
160            screen.DrawText("Match the images to the forms of energy that they convert", new Vector2(320, 10), TextHorizontal.CENTERED, TextVertical.TOP, Color.White);
161            screen.DrawText("Starts as", new Vector2(220, 60), TextHorizontal.CENTERED, TextVertical.TOP, Color.White);
162            screen.DrawText("and becomes", new Vector2(420, 60), TextHorizontal.CENTERED, TextVertical.TOP, Color.White);
163            screen.DrawText(String.Format("Currently matched {0}/{1} items", validLines, totalLines), new Vector2(800, 300), TextHorizontal.CENTERED, TextVertical.TOP, Color.White);
164            base.Draw(screen, gameState);
165        }
166    }
167}
Note: See TracBrowser for help on using the browser.