private void addObservers() {
        //Human Hand, Graveyard, and Library totals
        {//make sure to not interfer with anything below, since this is a very long method
            Observer o = new Observer() {
                public void update(Observable a, Object b) {
                    playerHandValue.setText("" + AllZone.getHumanHand().size());
                    playerGraveValue.setText("" + AllZone.getHumanGraveyard().size());
                    playerLibraryValue.setText("" + AllZone.getHumanLibrary().size());
                    playerFBValue.setText("" + CardFactoryUtil.getExternalZoneActivationCards(AllZone.getHumanPlayer()).size());
                    playerRemovedValue.setText("" + AllZone.getHumanExile().size());

                }
            };
            AllZone.getHumanHand().addObserver(o);
            AllZone.getHumanGraveyard().addObserver(o);
            AllZone.getHumanLibrary().addObserver(o);
        }

        //opponent Hand, Graveyard, and Library totals
        {//make sure to not interfer with anything below, since this is a very long method
            Observer o = new Observer() {
                public void update(Observable a, Object b) {
                    oppHandValue.setText("" + AllZone.getComputerHand().size());
                    oppGraveValue.setText("" + AllZone.getComputerGraveyard().size());
                    oppLibraryValue.setText("" + AllZone.getComputerLibrary().size());
                    oppRemovedValue.setText("" + AllZone.getComputerExile().size());
                }
            };
            AllZone.getComputerHand().addObserver(o);
            AllZone.getComputerGraveyard().addObserver(o);
            AllZone.getComputerLibrary().addObserver(o);
        }


        //opponent life
        oppLifeLabel.setText("" + AllZone.getComputerPlayer().getLife());
        AllZone.getComputerPlayer().addObserver(new Observer() {
            public void update(Observable a, Object b) {
                int life = AllZone.getComputerPlayer().getLife();
                oppLifeLabel.setText("" + life);
            }
        });
        AllZone.getComputerPlayer().updateObservers();

        if (AllZone.getQuestData() != null) {
            File base = ForgeProps.getFile(IMAGE_ICON);
            String iconName = "";
            if (Constant.Quest.oppIconName[0] != null) {
                iconName = Constant.Quest.oppIconName[0];
                File file = new File(base, iconName);
                ImageIcon icon = new ImageIcon(file.toString());
                oppIconLabel.setIcon(icon);
                oppIconLabel.setAlignmentX(100);

            }
        }

        oppPCLabel.setText("Poison Counters: " + AllZone.getComputerPlayer().getPoisonCounters());
        AllZone.getComputerPlayer().addObserver(new Observer() {
            public void update(Observable a, Object b) {
                int pcs = AllZone.getComputerPlayer().getPoisonCounters();
                oppPCLabel.setText("Poison Counters: " + pcs);
            }
        });
        AllZone.getComputerPlayer().updateObservers();

        //player life
        playerLifeLabel.setText("" + AllZone.getHumanPlayer().getLife());
        AllZone.getHumanPlayer().addObserver(new Observer() {
            public void update(Observable a, Object b) {
                int life = AllZone.getHumanPlayer().getLife();
                playerLifeLabel.setText("" + life);
            }
        });
        AllZone.getHumanPlayer().updateObservers();

        playerPCLabel.setText("Poison Counters: " + AllZone.getHumanPlayer().getPoisonCounters());
        AllZone.getHumanPlayer().addObserver(new Observer() {
            public void update(Observable a, Object b) {
                int pcs = AllZone.getHumanPlayer().getPoisonCounters();
                playerPCLabel.setText("Poison Counters: " + pcs);
            }
        });
        AllZone.getHumanPlayer().updateObservers();

        //stack
        AllZone.getStack().addObserver(new Observer() {
            public void update(Observable a, Object b) {
                stackPanel.removeAll();
                MagicStack stack = AllZone.getStack();
                int count = 1;
                JLabel label;

                for (int i = stack.size() - 1; 0 <= i; i--) {
                    label = new JLabel("" + (count++) + ". " + stack.peekInstance(i).getStackDescription());

                    //update card detail
                    final CardPanel cardPanel = new CardPanel(stack.peekInstance(i).getSourceCard());
                    cardPanel.setLayout(new BorderLayout());
                    cardPanel.add(label);
                    cardPanel.addMouseMotionListener(new MouseMotionAdapter() {

                        @Override
                        public void mouseMoved(MouseEvent me) {
                            setCard(cardPanel.getCard());
                        }//mouseMoved
                    });

                    stackPanel.add(cardPanel);
                }

                stackPanel.revalidate();
                stackPanel.repaint();

                okButton.requestFocusInWindow();

            }
        });
        AllZone.getStack().updateObservers();
        //END, stack


        //self hand
        AllZone.getHumanHand().addObserver(new Observer() {
            public void update(Observable a, Object b) {
                PlayerZone pZone = (PlayerZone) a;
                HandArea p = playerHandPanel;
                ;

                Card c[] = AllZoneUtil.getCardsInZone(pZone).toArray();

                List<Card> tmp, diff;
                tmp = new ArrayList<Card>();
                for (arcane.ui.CardPanel cpa : p.cardPanels)
                    tmp.add(cpa.gameCard);
                diff = new ArrayList<Card>(tmp);
                diff.removeAll(Arrays.asList(c));
                if (diff.size() == p.cardPanels.size())
                    p.clear();
                else {
                    for (Card card : diff) {
                        p.removeCardPanel(p.getCardPanel(card.getUniqueNumber()));
                    }
                }
                diff = new ArrayList<Card>(Arrays.asList(c));
                diff.removeAll(tmp);

                int fromZoneX = 0, fromZoneY = 0;
                Rectangle pb = playerLibraryValue.getBounds();
                Point zoneLocation = SwingUtilities.convertPoint(playerLibraryValue, Math.round(pb.width / 2.0f), Math.round(pb.height / 2.0f), layeredPane);
                fromZoneX = zoneLocation.x;
                fromZoneY = zoneLocation.y;
                int startWidth, startX, startY;
                startWidth = 10;
                startX = fromZoneX - Math.round(startWidth / 2.0f);
                startY = fromZoneY - Math.round(Math.round(startWidth * arcane.ui.CardPanel.ASPECT_RATIO) / 2.0f);

                int endWidth, endX, endY;
                arcane.ui.CardPanel toPanel = null;

                for (Card card : diff) {
                    toPanel = p.addCard(card);
                    endWidth = toPanel.getCardWidth();
                    Point toPos = SwingUtilities.convertPoint(playerHandPanel, toPanel.getCardLocation(), layeredPane);
                    endX = toPos.x;
                    endY = toPos.y;
                    arcane.ui.CardPanel animationPanel = new arcane.ui.CardPanel(card);
                    if (isShowing())
                        Animation.moveCard(startX, startY, startWidth, endX, endY, endWidth, animationPanel, toPanel, layeredPane, 500);
                    else
                        Animation.moveCard(toPanel);
                }
            }
        });
        AllZone.getHumanHand().updateObservers();
        //END, self hand

        //self play
        AllZone.getHumanBattlefield().addObserver(new Observer() {
            public void update(Observable a, Object b) {
                PlayerZone pZone = (PlayerZone) a;

                Card c[] = AllZoneUtil.getCardsInZone(pZone).toArray();

                GuiDisplayUtil.setupPlayZone(playerPlayPanel, c);
            }
        });
        AllZone.getHumanBattlefield().updateObservers();
        //END - self play


        //computer play
        AllZone.getComputerBattlefield().addObserver(new Observer() {
            public void update(Observable a, Object b) {
                PlayerZone pZone = (PlayerZone) a;

                Card c[] = AllZoneUtil.getCardsInZone(pZone).toArray();

                GuiDisplayUtil.setupPlayZone(oppPlayPanel, c);
            }
        });
        AllZone.getComputerBattlefield().updateObservers();
        //END - computer play

    }//addObservers()