001    package jagafa.scores;
002    
003    import jagafa.rule.CoiffeurRules;
004    import jagafa.rule.ObenRules;
005    import jagafa.rule.RuleSet;
006    import jagafa.rule.UntenRules;
007    
008    import java.util.Iterator;
009    import java.util.LinkedHashMap;
010    import java.util.Map;
011    
012    public class SchieberScoreTable extends AbstractScoreTable implements ScoreTable {
013    
014            private static final Integer SINGLE = new Integer(1);
015    
016            private static final Integer DOUBLE = new Integer(2);
017    
018            private int winningScore_;
019    
020            private Map<RuleSet, Integer> rlist;
021    
022            public SchieberScoreTable(int winningScore) {
023                    super();
024                    this.setCanChangePlayer(true);
025                    this.winningScore_ = winningScore;
026                    rlist = new LinkedHashMap<RuleSet, Integer>();
027                    rlist.put(new ObenRules(), SINGLE);
028                    rlist.put(new UntenRules(), SINGLE);
029                    /*rlist.put(new TrumpfRules(0), SINGLE);
030                    rlist.put(new TrumpfRules(1), SINGLE);
031                    rlist.put(new TrumpfRules(2), SINGLE);
032                    rlist.put(new TrumpfRules(3), SINGLE);*/
033                    //rlist.put(new SlalomObenStartRules(),SINGLE);
034                    rlist.put(new CoiffeurRules(), SINGLE);
035                    Iterator<RuleSet> ruleIter = rlist.keySet().iterator();
036    
037                    while (ruleIter.hasNext()) {
038                            this.activateRule(ruleIter.next());
039                    }
040                    this.choosingPlayer_ = this.getStartPlayer();
041            }
042    
043            @Override
044            public void addScores(int[] scores, RuleSet rules) {
045                    if (rules==null) {
046                            return;
047                    }
048                    /* TODO: Add functionality for MATCH score */
049                    int mult = this.getMultiplier(rules);
050    
051                    for (int i = 0; i < scores.length; i++) {
052                            scores[i] *= mult;
053                    }
054                    super.addScores(scores, rules);
055                    this.setCanChangePlayer(true);
056                    int roundsPlayed = this.roundsPlayed();
057                    
058                    while (roundsPlayed>=4) {
059                            roundsPlayed-=4;
060                    }
061                    this.setStartPlayer(roundsPlayed);
062                    
063            }
064    
065            public boolean isGameOver() {
066                    int scores[] = this.getScores();
067    
068                    int scoreTeam1 = scores[0] + scores[2];
069                    int scoreTeam2 = scores[1] + scores[3];
070    
071                    if (scoreTeam1 >= this.winningScore_) {
072                            this.setCanChangePlayer(true);
073                            return true;
074                    }
075                    if (scoreTeam2 >= this.winningScore_) {
076                            this.setCanChangePlayer(true);
077                            return true;
078                    }
079                    return false;
080            }
081    
082            public int getMultiplier(RuleSet rule) {
083                    return (Integer) this.rlist.get(rule);
084            }
085    
086            
087            /**
088             * Schieben, falls noch möglich
089             */
090            public boolean changeChoosingPlayer() {
091                    
092                    if (this.canChangeChoosingPlayer()) {
093                            int starter = this.getStartPlayer();
094                            
095                            
096                            starter += 2;
097                            while (starter>=4) {
098                                    starter -= 4;
099                            }
100                            
101                            this.setChoosingPlayer(starter);
102                            this.setStartPlayer(starter);
103                            this.setCanChangePlayer(false);
104                            System.out.println("Hand over!");
105                            return true;
106                    } else {
107                            return false;
108                    }
109    
110            }
111    
112            
113            
114            
115            public int getChoosingPlayer() {
116                    if (this.choosingPlayer_==-1) {
117                            this.choosingPlayer_ = this.getStartPlayer();
118                    }
119                    
120                    return this.choosingPlayer_;
121            }
122    
123            
124            public int getStartPlayer() {
125                    if (!this.canChangeChoosingPlayer()) {
126                            return this.getChoosingPlayer();
127                    }
128                    
129                    return super.getStartPlayer();
130            }
131            
132            public int getWinningScore() {
133                    return this.winningScore_;
134            }
135    
136    }