Erste mapping-Funktionen im Parser

This commit is contained in:
2014-04-09 20:57:30 +02:00
parent 2adfa38dc3
commit 022704b942

View File

@@ -3,16 +3,33 @@ using System.Linq;
using System.Threading; using System.Threading;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Frontend;
namespace WorldOfPeacecraft namespace WorldOfPeacecraft
{ {
public class Parser public class Parser
{ {
public const string MessUpdate = "upd";
public const string MessDelete = "del";
public const string MessMap = "map";
public const string MessMessage = "mes";
public const string MessResult = "result";
public const string MessChallenge = "challenge";
public const string MessPlayer = "player";
public const string MessYourid = "yourid";
public const string MessTime = "time";
public const string MessOnline = "online";
public const string MessEntities = "ents";
public const string MessPlayers = "players";
public const string MessDragon = "dragon";
public const string MessMapcell = "cell";
private Queue<string> Buffer = new Queue<string> (); private Queue<string> Buffer = new Queue<string> ();
private AutoResetEvent BufferFilledEvent = new AutoResetEvent (false); private AutoResetEvent BufferFilledEvent = new AutoResetEvent (false);
private Thread ParserThread; private Thread ParserThread;
private LinkedList<string> Message; private LinkedList<string> Message;
private Regex LastLineRegex; private Regex LastLineRegex;
private Backend backend;
public Parser () public Parser ()
{ {
@@ -46,12 +63,178 @@ namespace WorldOfPeacecraft
return; return;
String[] aMessage = Enumerable.ToArray (Message); String[] aMessage = Enumerable.ToArray (Message);
Block mainBlock = new Block (aMessage, 0, aMessage.Length - 1); Block mainBlock = new Block (aMessage, 0, aMessage.Length - 1);
MapData (mainBlock); ProcessData (mainBlock);
} }
private void MapData (Block block) private void ProcessData (Block parentBlock)
{ {
// TODO Implement if (parentBlock.GetStringValue ("ans") != null) {
ProcessAnswer (parentBlock);
return;
}
CheckBlocksSize(parentBlock.GetBlocks(), 1, 1);
Block block = parentBlock.GetBlocks ().First.Value;
switch (block.GetName ()) {
case MessUpdate:
ProcessUpdate (block);
break;
case MessDelete:
ProcessDelete (block);
break;
case MessMap:
ProcessMap (block);
break;
case MessMessage:
ProcessMessage (block);
break;
case MessResult:
ProcessResult (block);
break;
case MessChallenge:
ProcessChallenge (block);
break;
case MessPlayer:
ProcessPlayer (block);
break;
case MessYourid:
ProcessYourid (block);
break;
case MessTime:
ProcessTime (block);
break;
case MessOnline:
ProcessOnline (block);
break;
case MessEntities:
ProcessEntities (block);
break;
case MessPlayers:
ProcessEntities (block);
break;
default:
ThrowUnknownBlockException (parentBlock, block);
break;
}
}
private void ProcessUpdate (Block updateBlock)
{
LinkedList<Block> blocks = updateBlock.GetBlocks ();
CheckBlocksSize (updateBlock, 1, 1);
Block block = blocks.First.Value;
switch (block.GetName ()) {
case MessDragon:
ProcessDragon (block);
break;
case MessPlayer:
ProcessPlayer (block);
break;
case MessMapcell:
ProcessMapcell (block);
break;
default:
ThrowUnknownBlockException (updateBlock, block);
break;
}
}
private void ProcessDelete (Block deleteBlock)
{
LinkedList<Block> blocks = deleteBlock;
CheckBlocksSize (deleteBlock, 1, 1);
Block block = blocks.First.Value;
switch (block.GetName ()) {
case MessPlayer:
Player player = MapPlayer(block);
backend.removePlayer(player);
break;
case MessDragon:
Dragon dragon = MapDragon(block);
backend.removeDragon(dragon);
break;
}
}
private void ProcessMap (Block block)
{
}
private void ProcessMessage (Block block)
{
}
private void ProcessAnswer (Block block)
{
}
private void ProcessResult (Block block)
{
}
private void ProcessChallenge (Block block)
{
}
private void ProcessPlayer (Block block)
{
}
private void ProcessYourid (Block block)
{
}
private void ProcessTime (Block block)
{
}
private void ProcessOnline (Block block)
{
}
private void ProcessEntities (Block block)
{
}
private void ProcessPlayers (Block block)
{
}
private void ProcessMapcell (Block block)
{
}
private void ProcessDragon (Block block)
{
}
private Dragon MapDragon (Block block)
{
}
private Player MapPlayer (Block block)
{
}
private void ThrowUnknownBlockException (Block parentBlock, Block childBlock)
{
throw new ParsingException("Unknown Block: '" + childBlock.GetName() + "' (as subblock of '" + parentBlock.GetName() + "')");
}
private void CheckBlocksSize (Block parentBlock, int min, int max)
{
LinkedList<Block> blocks = parentBlock.GetBlocks();
if (blocks.Count < min || (max >= 0 && blocks.Count > max)) {
if (min == max) {
throw new ParsingException("The block '" + parentBlock.GetName() + "' has to contain exactly '" + min + "' Block, but contained '" + blocks.Count + "'");
}
else if (max < 0) {
throw new ParsingException("The block '" + parentBlock.GetName() + "' has to contain at least '" + min + "' Blocks, but contained '" + blocks.Count + "'");
}
else {
throw new ParsingException("The block '" + parentBlock.GetName () + "' has to contain between '" + min + "' and '" + max + "' Blocks, but contained '" + blocks.Count + "'");
}
}
} }
private bool IsCompletePackage () private bool IsCompletePackage ()