From 96bc701ba7a01b940ad5910d85c7b6958ac4a141 Mon Sep 17 00:00:00 2001
From: Joe Zhao <ztuowen@gmail.com>
Date: Sat, 6 Dec 2014 19:48:28 +0800
Subject: Restructuring & workflow construction

---
 Main.java                      |  3 +-
 aux/set/Aside.java             | 45 -----------------------
 aux/set/Hand.java              | 10 ++---
 aux/set/Meld.java              | 45 +++++++++++++++++++++++
 engine/Action.java             | 83 +++++++++++++++++++++++++++++++++++++++---
 engine/Engine.java             | 15 +++++---
 engine/Logger.java             |  7 ++++
 player/CmdPlayerHandler.java   | 47 ++++++++++++++++++++++++
 player/GenericPlayer.java      |  6 ++-
 player/PlayerActionServer.java |  6 +++
 player/human/LocalHuman.java   |  2 +-
 tools/Alert.java               | 21 +++++++++++
 tools/Deck.java                |  4 +-
 13 files changed, 227 insertions(+), 67 deletions(-)
 delete mode 100644 aux/set/Aside.java
 create mode 100644 aux/set/Meld.java
 create mode 100644 player/CmdPlayerHandler.java
 create mode 100644 tools/Alert.java

diff --git a/Main.java b/Main.java
index fe91efc..ac92463 100644
--- a/Main.java
+++ b/Main.java
@@ -2,6 +2,7 @@ package mahjong;
 
 import mahjong.aux.set.CardSet;
 import mahjong.aux.set.Set;
+import mahjong.engine.Action;
 import mahjong.player.human.LocalHuman;
 import mahjong.tools.Timer;
 
@@ -32,6 +33,6 @@ public class Main {
         timer.tock();
         System.out.println(timer.elapse());
 
-        LocalHuman local=new LocalHuman("Joe");
+        System.out.println(new Action(new Action(Action.Type.System,Action.Place.Info,Action.Act.Info,"Test").toString()).toString());
     }
 }
diff --git a/aux/set/Aside.java b/aux/set/Aside.java
deleted file mode 100644
index 2a3b530..0000000
--- a/aux/set/Aside.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package mahjong.aux.set;
-
-import mahjong.aux.Card;
-import mahjong.player.GenericPlayer;
-
-/**
- * Created by joe on 12/2/14.
- */
-public class Aside {
-    public enum Type {Chi,Peng,aGang,mGang,jGang};
-
-    private Type type;
-    private Card[] rep;
-    private int from;
-
-    public Aside(Card[] rep,Type type,int from)
-    {
-        this.rep=rep;
-        this.type=type;
-        this.from=from;
-    }
-
-    public Aside(Card[] rep,Type type)
-    {
-        this.rep=rep;
-        this.type=type;
-        this.from= 0;
-    }
-
-    public Card[] getRep() {
-        return rep;
-    }
-
-    public int getFrom() {
-        return from;
-    }
-
-    public Type getType() {
-        return type;
-    }
-
-    public void setFrom(int from) {
-        this.from = from;
-    }
-}
diff --git a/aux/set/Hand.java b/aux/set/Hand.java
index a66944f..a865a90 100644
--- a/aux/set/Hand.java
+++ b/aux/set/Hand.java
@@ -23,19 +23,19 @@ public class Hand extends Set {
         super(cards);
     }
 
-    public Vector<Aside> asides = new Vector<Aside>();
+    public Vector<Meld> melds = new Vector<Meld>();
 
     public void init()
     {
         cards.clear();
-        asides.clear();
+        melds.clear();
     }
 
     public boolean huAble(Card card)
     {
         boolean hu=false;
         accountant.add(card,1);
-        if (accountant.calTing(asides.size())==0)
+        if (accountant.calTing(melds.size())==0)
             hu=true;
         accountant.add(card,-1);
         return hu;
@@ -69,8 +69,8 @@ public class Hand extends Set {
 
     public boolean jiaGangAble(Card card)
     {
-        for (Aside i:asides)
-        if (i.getType()== Aside.Type.Peng && card.getStdId() == i.getRep()[0].getStdId())
+        for (Meld i:melds)
+        if (i.getType()== Meld.Type.Peng && card.getStdId() == i.getRep()[0].getStdId())
             return true;
         return false;
     }
diff --git a/aux/set/Meld.java b/aux/set/Meld.java
new file mode 100644
index 0000000..8da091b
--- /dev/null
+++ b/aux/set/Meld.java
@@ -0,0 +1,45 @@
+package mahjong.aux.set;
+
+import mahjong.aux.Card;
+import mahjong.player.GenericPlayer;
+
+/**
+ * Created by joe on 12/2/14.
+ */
+public class Meld {
+    public enum Type {Chi,Peng,aGang,mGang,jGang};
+
+    private Type type;
+    private Card[] rep;
+    private int from;
+
+    public Meld(Card[] rep,Type type,int from)
+    {
+        this.rep=rep;
+        this.type=type;
+        this.from=from;
+    }
+
+    public Meld(Card[] rep,Type type)
+    {
+        this.rep=rep;
+        this.type=type;
+        this.from= 0;
+    }
+
+    public Card[] getRep() {
+        return rep;
+    }
+
+    public int getFrom() {
+        return from;
+    }
+
+    public Type getType() {
+        return type;
+    }
+
+    public void setFrom(int from) {
+        this.from = from;
+    }
+}
diff --git a/engine/Action.java b/engine/Action.java
index 3009fa0..3f2f365 100644
--- a/engine/Action.java
+++ b/engine/Action.java
@@ -1,29 +1,38 @@
 package mahjong.engine;
 
+import java.util.Random;
+
 /**
  * Created by joe on 12/3/14.
+ * Action handles information passing between server and clients
  */
 public class Action {
     // TODO Generic action
     // Requirement: printable,parseable,coverage
     // Coverage: System,player
-    public enum Type {System,Player};
+    private static Random idGen = new Random();
+    private static int cnter = 0;
+    public enum Type {System,Player}
     // System info merely reflect system state
     // Player info pertaining to players;
-    public enum Place {Info,East,South,West,North};
-    public enum Act {Info,CardDraw,CardPut,Aside};
+    public enum Place {Info,East,South,West,North}
+    public enum Act {Info,Draw,Put,Meld}
 
     Type type;
     Act act;
     Place place;
     String message;
+    int guid;
 
-    public Type getType() {
-        return type;
+    public void newGUID()
+    {
+        this.guid=(idGen.nextInt()&0xFFF000)+cnter;
+        cnter = (cnter+1)&0xFFF;
     }
 
     public Action(Type type,Place place,Act act,String message)
     {
+        newGUID();
         this.type = type;
         this.place = place;
         this.act = act;
@@ -31,10 +40,72 @@ public class Action {
     }
     public Action(String str)
     {
+        String[] res=str.trim().split("\t");
+        guid = Integer.parseInt(res[0]);
+        switch (res[1].trim().toUpperCase().charAt(0))
+        {
+            case 'S':
+                type=Type.System;
+                break;
+            case 'P':
+                type=Type.Player;
+        }
+        switch (res[2].trim().toUpperCase().charAt(0))
+        {
+            case 'I':
+                place=Place.Info;
+                break;
+            case 'E':
+                place=Place.East;
+                break;
+            case 'S':
+                place=Place.South;
+                break;
+            case 'W':
+                place=Place.West;
+                break;
+            case 'N':
+                place=Place.North;
+        }
+        switch (res[3].trim().toUpperCase().charAt(0))
+        {
+            case 'I':
+                act=Act.Info;
+                break;
+            case 'D':
+                act=Act.Draw;
+                break;
+            case 'P':
+                act=Act.Put;
+                break;
+            case 'M':
+                act=Act.Meld;
+        }
+        message=res[4];
     }
 
     @Override
     public String toString() {
-        return super.toString();
+        return String.format("%d\t%c\t%c\t%c\t%s",guid,type.toString().charAt(0),place.toString().charAt(0),act.toString().charAt(0),message);
+    }
+
+    public Act getAct() {
+        return act;
+    }
+
+    public Place getPlace() {
+        return place;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public int getGuid() {
+        return guid;
+    }
+
+    public Type getType() {
+        return type;
     }
 }
diff --git a/engine/Engine.java b/engine/Engine.java
index 6a8773d..7507ca1 100644
--- a/engine/Engine.java
+++ b/engine/Engine.java
@@ -1,7 +1,7 @@
 package mahjong.engine;
 
 import mahjong.aux.Card;
-import mahjong.aux.set.Aside;
+import mahjong.aux.set.Meld;
 import mahjong.aux.set.Set;
 import mahjong.player.GenericPlayer;
 import mahjong.player.PlayerActionServer;
@@ -46,10 +46,15 @@ public class Engine {
         deck = Deck.generateDeck(true);
     }
 
-    public static void playerPutAsideCards(GenericPlayer player, Card card, Aside aside)
+    public boolean sync4Player(int id)
+    {
+        return (players[id].stateAlert(new Action(Action.Type.System, Action.Place.Info, Action.Act.Info,"Heartbeat")).getMessage().compareTo("ACK")==0);
+    }
+
+    public static void playerPutAsideCards(GenericPlayer player, Card card, Meld meld)
     {
         boolean mark=true;
-        for (Card asCard:aside.getRep())
+        for (Card asCard:meld.getRep())
             if (card.getId() == asCard.getId() && mark)
                 mark = true;
             else
@@ -58,7 +63,7 @@ public class Engine {
 
     public void mainLoop()
     {
-        start();
+        /*start();
         boolean hu=false;
         int pos=0;
         while (!hu && deck.getSize()>0)
@@ -97,6 +102,6 @@ public class Engine {
             //
 
             pos=(pos+1)%4;
-        }
+        }*/
     }
 }
diff --git a/engine/Logger.java b/engine/Logger.java
index fb56698..566fa08 100644
--- a/engine/Logger.java
+++ b/engine/Logger.java
@@ -19,6 +19,13 @@ public class Logger {
         actions.add(action);
     }
 
+    public int getLastGuidIndex()
+    {
+        if (actions.size()==0)
+            return -1;
+        return actions.lastElement().getGuid();
+    }
+
     @Override
     public String toString() {
         String str="";
diff --git a/player/CmdPlayerHandler.java b/player/CmdPlayerHandler.java
new file mode 100644
index 0000000..8d1e91b
--- /dev/null
+++ b/player/CmdPlayerHandler.java
@@ -0,0 +1,47 @@
+package mahjong.player;
+
+import mahjong.engine.Action;
+import mahjong.engine.Logger;
+
+/**
+ * Created by joe on 12/5/14.
+ */
+public class CmdPlayerHandler implements PlayerActionHandler {
+    GenericPlayer player;
+    Logger logger;
+
+    public CmdPlayerHandler(GenericPlayer player)
+    {
+        this.player = player;
+    }
+
+    @Override
+    public Action stateAlert(Action action) {
+        if (action.getType()== Action.Type.System)
+        {
+            // System info
+            if (action.getPlace() == Action.Place.Info)
+            {
+                if (action.getMessage().compareTo("") == 0)
+            }
+            else
+                switch (action.getPlace()) {
+                    case East:
+                    case South:
+                    case West:
+                    case North:
+                        break;
+                }
+        }
+        else
+        {
+        }
+        return null;
+    }
+
+    @Override
+    public void stateUpdate(Action action) {
+        if (action == null)
+            return;
+    }
+}
\ No newline at end of file
diff --git a/player/GenericPlayer.java b/player/GenericPlayer.java
index 23cea93..f1a9755 100644
--- a/player/GenericPlayer.java
+++ b/player/GenericPlayer.java
@@ -1,7 +1,7 @@
 package mahjong.player;
 
 import mahjong.aux.Card;
-import mahjong.aux.set.Aside;
+import mahjong.aux.set.Meld;
 import mahjong.aux.set.Hand;
 import mahjong.aux.set.Set;
 import mahjong.engine.Action;
@@ -22,7 +22,9 @@ public abstract class GenericPlayer {
     }
 
     public abstract Action stateAlert(Action action);
-    public abstract void stateUpdate(Action action);
+    public void stateUpdate(Action action)
+    {
+    }
 
     public void setScore(int score) {
         this.score = score;
diff --git a/player/PlayerActionServer.java b/player/PlayerActionServer.java
index 09d2417..9e126d4 100644
--- a/player/PlayerActionServer.java
+++ b/player/PlayerActionServer.java
@@ -2,6 +2,7 @@ package mahjong.player;
 
 import mahjong.aux.set.Hand;
 import mahjong.engine.Action;
+import mahjong.tools.Alert;
 
 /**
  * Created by joe on 12/4/14.
@@ -25,13 +26,18 @@ public class PlayerActionServer implements PlayerActionHandler {
         return name;
     }
 
+    @Override
     public Action stateAlert(Action action)
     {
+        Alert.Error(action==null,"Action can't be null in alert");
         return null;
     }
 
+    @Override
     public void stateUpdate(Action action)
     {
+        if (action == null)
+            return;
     }
 
     public int getScore() {
diff --git a/player/human/LocalHuman.java b/player/human/LocalHuman.java
index e04b89a..e9641dd 100644
--- a/player/human/LocalHuman.java
+++ b/player/human/LocalHuman.java
@@ -1,7 +1,7 @@
 package mahjong.player.human;
 
 import mahjong.aux.Card;
-import mahjong.aux.set.Aside;
+import mahjong.aux.set.Meld;
 import mahjong.aux.set.Hand;
 import mahjong.engine.Action;
 import mahjong.player.GenericPlayer;
diff --git a/tools/Alert.java b/tools/Alert.java
new file mode 100644
index 0000000..55d7838
--- /dev/null
+++ b/tools/Alert.java
@@ -0,0 +1,21 @@
+package mahjong.tools;
+
+/**
+ * Created by joe on 12/6/14.
+ */
+public class Alert {
+    public static void Error(boolean bool,String str)
+    {
+        if (bool)
+        {
+            System.out.println(str);
+            System.exit(1);
+        }
+    }
+
+    public static void Info(boolean bool,String str)
+    {
+        if (bool)
+            System.out.println(str);
+    }
+}
diff --git a/tools/Deck.java b/tools/Deck.java
index 6ff2cc9..0198e45 100644
--- a/tools/Deck.java
+++ b/tools/Deck.java
@@ -16,8 +16,8 @@ public class Deck {
             deck.add(new Card(CardSet.deckIds[i]));
         if (ex)
         {
-            deck.remove(new Card(":5s"));deck.remove(new Card(":5p"));deck.remove(new Card(":5m"));
-            deck.remove(new Card(":0s"));deck.remove(new Card(":0p"));deck.remove(new Card(":0m"));
+            deck.remove(new Card(":5s"));deck.remove(new Card(":5p"));deck.remove(new Card(":5p"));deck.remove(new Card(":5m"));
+            deck.remove(new Card(":0s"));deck.remove(new Card(":0p"));deck.remove(new Card(":0p"));deck.remove(new Card(":0m"));
         }
         return deck;
     }
-- 
cgit v1.2.3-70-g09d2