1
package com.vedant.mafia.backend;
3
import java.util.ArrayList;
6
import com.vedant.mafia.GameController;
7
import com.vedant.mafia.Message;
8
import com.vedant.mafia.MessageCentre;
10
public class GameRules {
16
private static final String SUGGESTIONS_TO_HITMAN = " suggested to kill ",
17
HITMAN_KILLED = " has already been killed. You may suggest a player for the next round";
19
public static GameEnd doesGameEnd(String votedOut){
20
Person roleVotedOut = GameController.db().getRole(votedOut);
21
GameController.db().remove(votedOut);
25
int index = GameController.db().types.indexOf(Person.MAFIA);
27
index = GameController.db().types.indexOf(Person.WITCH);
29
return GameEnd.NON_MAFIA_WIN;
31
GameController.db().types.remove(index);
32
GameController.db().types.add(index, Person.HITMAN);
36
default: // for non mafia
38
for(Person person: GameController.db().types)
41
switch(2*numNonMafia - GameController.db().types.size()){// ie difference between mafia and non mafia
43
if(GameController.db().types.contains(Person.ANGEL))
46
return GameEnd.MAFIA_WIN;
49
return GameEnd.GAME_DOES_NOT_END;
52
public static Message processRoundEndMessage(Set<Message> gameMessages, Message msg){
53
switch(GameController.db().getRole(msg.from).action){
56
if (isSleeping(gameMessages, msg.from))
57
message = String.valueOf(ReplyFromGod.CANT_SAY.ordinal());
58
else if (GameController.db().getRole(msg.to).thumbsUp())
59
message = String.valueOf(ReplyFromGod.YES.ordinal());
61
message = String.valueOf(ReplyFromGod.NO.ordinal());
62
return new Message(Message.GOD, msg.from, message);
64
throw new IllegalArgumentException("Cant process round end message: "+msg.toString());
67
public static String cityRisesToDeathOf(Set<Message> gameMessages){
68
for(Message msg: gameMessages){
69
if(msg.from.equals(GameController.db().getHitman())){
70
if(isSaved(gameMessages, msg.to))
76
throw new IllegalArgumentException("No message from hitman");
79
private static boolean isSaved(Set<Message> messages, String victim){
80
for(Message msg: messages){
81
if(GameController.db().getRole(msg.from).equals(Person.ANGEL)
82
&& msg.to.equals(victim) && !isSleeping(messages, msg.from))
88
private static boolean isSleeping(Set<Message> messages, String player) {
89
for(Message msg: messages){
90
if(GameController.db().getRole(msg.from).equals(Person.WITCH)
91
&& msg.to.equals(player))
97
public static boolean isGameMessage(String from){
98
switch(GameController.db().getRole(from).action){
106
public static Message processMessage(Message message){
107
switch(GameController.db().getRole(message.from)){
109
return new Message(message.from, GameController.db().getHitman(), message.to);
114
for(String player: GameController.db().names)
115
if(GameController.db().getRole(player).equals(Person.MAFIA))
116
MessageCentre.newProcessedMessage(new Message(message.from, player, message.to));
122
public static String generateInfo(Message message){
123
switch(GameController.db().getRole(message.to).action){
125
String[] mafia = message.from.split(Message.SEPARATOR);
126
String[] victims = message.message.split(Message.SEPARATOR);
127
StringBuilder userMsg = new StringBuilder();
128
for(int i = 0 ; i < mafia.length; i++){
129
userMsg.append(mafia[i]).append(SUGGESTIONS_TO_HITMAN).append(victims[i]);
130
if(i < mafia.length - 1)
131
userMsg.append("\n");
133
return userMsg.toString();
136
return message.message + HITMAN_KILLED;
138
throw new UnsupportedOperationException("cannot generate for message" + message.toString());
141
public static Message combineMessage(Message newMessage, Message oldMessage) {
142
switch(GameController.db().getRole(oldMessage.to)){
144
return new Message(oldMessage.from + Message.SEPARATOR + newMessage.from , oldMessage.to,
145
oldMessage.message + Message.SEPARATOR + newMessage.message);
147
throw new UnsupportedOperationException(
148
"cannnot combine " + oldMessage.toString() + " and " + newMessage.toString());
151
public static ArrayList<String> getList(String name, Message message){
152
switch (GameController.db().getRole(name).action) {
156
return GameController.db().names;
161
return createKillableList();
166
private static ArrayList<String> createKillableList(){
167
ArrayList<String> killable = new ArrayList<String>(
168
GameController.db().names);
169
for(String name: GameController.db().names){
170
Person person = GameController.db().getRole(name);
172
killable.remove(name);