Erste mapping-Funktionen im Parser
This commit is contained in:
189
src/Parser.cs
189
src/Parser.cs
@@ -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 ()
|
||||||
|
|||||||
Reference in New Issue
Block a user