/// <summary> /// Parse a single playtest. /// </summary> /// <param name="fileName">The path to the playtest file</param> public void ParsePlaytest(string fileName) { if (File.Exists(fileName)) { using (StreamReader sr = File.OpenText(fileName)) { string line = ""; Match mapMatch = null; DWFrame tmpFrame = null; line = sr.ReadLine(); if (!mapRE.IsMatch(line)) { throw new Exception("KP Error: Unrecognized map line: " + line); } mapMatch = mapRE.Match(line); currentMap = mapMatch.Groups["mapName"].Value; knowledgeTree[currentMap] = new Dictionary<int, Dictionary<PositionSelector, Dictionary<PositionSelector, LinkedList<DWFrame>>>>(); while ((line = sr.ReadLine()) != null) { tmpFrame = currentFrame; currentFrame = new DWFrame(); if (tmpFrame == null) { currentFrame.isHead = true; } else { tmpFrame.nextFrame = currentFrame; } currentFrame.prevFrame = tmpFrame; parseTimeAndScore(line); while (sr.Peek() != 't' && sr.Peek() != -1) { line = sr.ReadLine(); parsePlayerAndDisk(line); } putFrameInTree(); } } } else { throw new FileNotFoundException("File not found! " + Directory.GetCurrentDirectory() + fileName); } }
private void updateTimer(float gameTime) { timer -= gameTime; if (timer > Constants.TIMEMILLIS) { time.setText("start in " + ((int)(timer / 1000 + 1) - Constants.TIMEMILLIS / 1000) + " s"); time.setColor(Color.White); large.setEnabled(true); large.setText(" " + ((int)(timer / 1000 + 1) - Constants.TIMEMILLIS / 1000) + "..."); } else if (timer < 0) { time.setText("Game over!"); time.setColor(Color.White); int winner = 0; if (players[1].score > players[winner].score) winner = 1; if (players[2].score > players[winner].score) winner = 2; if (players[3].score > players[winner].score) winner = 3; large.setEnabled(true); large.setText("Player " + (winner + 1) + " wins!"); switch (winner) { case 0: large.setColor(new Color(1f, 0.2f, 0.2f)); break; case 1: large.setColor(new Color(1f, 1f, 0.2f)); break; case 2: large.setColor(new Color(0.2f, 1f, 0.2f)); break; case 3: large.setColor(new Color(0.2f, 0.2f, 1f)); break; } } else { time.setText((int)(timer / 1000 + 1) + "s"); time.setColor(new Color((float)Math.Sin(timer / 100 + 1.6) / 2 + 1f, (float)Math.Sin(timer / 100 + 3.1) / 2 + 1f, (float)Math.Sin(timer / 100 + 0.0) / 2 + 1f)); if (timer + 2000 > Constants.TIMEMILLIS) large.setEnabled(true); else large.setEnabled(false); large.setText("Begin!"); } if (current != null) current = current.nextFrame; querytimer += gameTime; if (querytimer > Constants.QUERY_TIME || current == null) { Vector2[] disks = new Vector2[4]; Vector2[] pls = new Vector2[4]; int i = 0, a = 0; foreach (Player p in players) { disks[i] = p.disk.getPosition(); pls[i] = p.animation.position; i++; if (p.alive) a++; } LinkedList<DWFrame> frames = Game1.kp.Map(mapname.Split('/')[1]).PlayersAlive(a).DiskPositions(disks).PlayerPositions(pls); if (frames.Count > 0) { start = null; foreach (DWFrame fr in frames) { if (Rand.Float() > 0.8f) { start = fr; break; } } if (start == null) start = frames.First.Value; current = start; } querytimer = 0; } }