Source code: org/zazof/jtegServer/StartMH.java
1 package org.zazof.jtegServer;
2
3 import java.util.*;
4 import org.apache.log4j.Category;
5
6 /**
7 * This MessageHandler process "start" messages.
8 */
9 public class StartMH extends MessageHandler{
10
11 public StartMH(){
12 }
13
14 protected void processMessage(Message m){
15 int nbPlayers; String result;
16 PlayerContainer pc = m.getGameController().getPlayerContainer();
17 nbPlayers = pc.getNumberPlayers();
18 // check if there are at least 2 players
19 if (nbPlayers < 2){
20 result = "error=start";
21 m.getPlayer().sendMessage(result);
22 return;
23 }
24 // set every player as ACTIVE
25 Enumeration players = pc.getElements();
26 while (players.hasMoreElements()){
27 Player p = (Player) players.nextElement();
28 p.setStatus(Player.IDLE);
29 }
30 m.getPlayer().setStatus(Player.STARTED);
31 // initializes the countries
32 initCountries(pc, m.getWorld());
33 // build an StartAnswer to send to the players
34 StartAnswer sa = getStatus(m.getGameController(), m.getWorld());
35 pc.sendMessage(sa);
36 Player fichasPlayer = (Player) pc.getElements().nextElement();
37 result = "modalidad=0,0;fichas=" + fichasPlayer.getID() + ",5";
38 // should the result also be sent to the observers?
39 pc.sendMessage(result);
40 }
41
42 /**
43 * initializes the countries
44 */
45 private void initCountries(PlayerContainer pc, World w){
46 Random r = new Random();
47 int nbPlayers = pc.getNumberPlayers();
48 int maxCountries[] = new int[20]; // nb countries owned by player i
49 // each player gets nb countries
50 int nb = w.getNbCountries() / nbPlayers;
51 for(int i=0; i<nbPlayers; i++){
52 maxCountries[i] = nb;
53 }
54 // and some players get 1 more
55 int rest = w.getNbCountries() % nbPlayers;
56 for(int i=0; i<rest; i++){
57 maxCountries[nbPlayers-i]++;
58 }
59 // assign countries to the players
60 for(int i = 0; i<w.getNbCountries(); i++){
61 int a = r.nextInt(nbPlayers);
62 if (maxCountries[a] > 0){
63 maxCountries[a]--;
64 w.getCountry(i).setOwner(pc.getPlayer(a));
65 w.getCountry(i).setArmies(1);
66 }else{
67 i--; // give it another try
68 }
69 }
70 }
71
72 /**
73 * @return status message
74 */
75 private StartAnswer getStatus(GameController g, World w){
76 Player p;
77 StartAnswer a = new StartAnswer();
78 PlayerContainer players = g.getPlayerContainer();
79 Vector ps = players.getPlayers();
80 a.set("nbPlayers", Integer.toString(ps.size()));
81 for(int i = 0; i < ps.size(); i++){
82 p = (Player) ps.elementAt(i);
83 a.set("name_" + i, p.getName());
84 a.set("color_" + i, Integer.toString(p.getColor()));
85 a.set("id_" + i, Integer.toString(p.getID()));
86 a.set("status_" + i, Integer.toString(p.getStatus()));
87 a.set("countries_" + i, Integer.toString(w.countCountries(p)));
88 a.set("armies_" + i, Integer.toString(w.countArmies(p)));
89 }
90 return a;
91 }
92
93 }