Changed action cards logic. x14
All checks were successful
gitea/JBunker/pipeline/head This commit looks good

This commit is contained in:
Michael Wain 2025-04-13 04:22:18 +03:00
parent d8e47ee70b
commit 8c14b04ee4
11 changed files with 182 additions and 17 deletions

View File

@ -5,6 +5,7 @@ public interface Constants {
String REMOVE_PLAYER = "Игрок %s покидает бункер."; String REMOVE_PLAYER = "Игрок %s покидает бункер.";
String ENDVOTE = "Голосование окончено."; String ENDVOTE = "Голосование окончено.";
String DRAW = "Ничья. Никто не уходит из игры."; String DRAW = "Ничья. Никто не уходит из игры.";
String DRAW_GONE = "Ничья. Из игры уходит случайный игрок.";
String GROUP_SET = "Чат выбран."; String GROUP_SET = "Чат выбран.";
String INTERRUPT_GAME = "Игра остановлена."; String INTERRUPT_GAME = "Игра остановлена.";
String USER_VOTED = "%s проголосовал."; String USER_VOTED = "%s проголосовал.";
@ -81,4 +82,24 @@ public interface Constants {
String RESURRECTION_CARD = "Воскресить игрока"; String RESURRECTION_CARD = "Воскресить игрока";
String RESURRECTION_CARD_TRIGGERED = "Вы воскресили игрока %s"; String RESURRECTION_CARD_TRIGGERED = "Вы воскресили игрока %s";
String FOOD_SUPPLY_COND = "В бункере есть запас еды на месяц.";
String POWER_MALFUNCTION = "Генератор проработает от силы 10 дней, а потом сломается";
String STRUCTURAL_ISSUES = "В стенах бункера есть трещины, землятресение он не переживет.";
String MEDS_SUPPLY_COND = "В бункере есть запас лекарств";
String AI_STUFF_COND = "В бункере есть панель управления с ИИ. Главное чтобы не выключился свет.";
String WHISPERS_COND = "В этом месте есть что-то странное, обитатели иногда говорят, что слышат чужие разговоры за стенами, хотя там никого нет.";
String AIR_COND = "В бункере что-то источает отвратительный аромат. Здесь даже Шура Стоун не поможет.";
String MAX_TIE_NONE = "В этом раунде выбывает тот, за кого проголосовало большинство. При ничье никто не выбывает";
String MAX_TIE_RANDOM = "В этом раунде выбывает тот, за кого проголосовало большинство. При ничье выбывает случайный игрок.";
String LEAST_VOTES_OUT = "В этом раунде выбывает тот, за кого меньше всего голосов отдали.";
} }

View File

@ -0,0 +1,7 @@
package com.alterdekim.javabot.bot;
public enum VotingType {
MaxTieNone,
MaxTieRandom,
LeastVotesOut
}

View File

@ -0,0 +1,12 @@
package com.alterdekim.javabot.bot.conditions;
import com.alterdekim.javabot.Constants;
import com.alterdekim.javabot.components.BunkerBot;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
public class AIStuff implements ConditionCard {
@Override
public void executeCard(BunkerBot bot, String chatId) {
bot.sendApi(new SendMessage(chatId, Constants.AI_STUFF_COND));
}
}

View File

@ -0,0 +1,12 @@
package com.alterdekim.javabot.bot.conditions;
import com.alterdekim.javabot.Constants;
import com.alterdekim.javabot.components.BunkerBot;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
public class AirStuff implements ConditionCard {
@Override
public void executeCard(BunkerBot bot, String chatId) {
bot.sendApi(new SendMessage(chatId, Constants.AIR_COND));
}
}

View File

@ -0,0 +1,8 @@
package com.alterdekim.javabot.bot.conditions;
import com.alterdekim.javabot.components.BunkerBot;
public interface ConditionCard {
void executeCard(BunkerBot bot, String chatId);
}

View File

@ -0,0 +1,13 @@
package com.alterdekim.javabot.bot.conditions;
import com.alterdekim.javabot.Constants;
import com.alterdekim.javabot.components.BunkerBot;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
public class FoodSupply implements ConditionCard {
@Override
public void executeCard(BunkerBot bot, String chatId) {
bot.liveFormula.add(5.0d / 100.0d);
bot.sendApi(new SendMessage(chatId, Constants.FOOD_SUPPLY_COND));
}
}

View File

@ -0,0 +1,13 @@
package com.alterdekim.javabot.bot.conditions;
import com.alterdekim.javabot.Constants;
import com.alterdekim.javabot.components.BunkerBot;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
public class MedicalSupply implements ConditionCard {
@Override
public void executeCard(BunkerBot bot, String chatId) {
bot.liveFormula.add(5.0d / 100.0d);
bot.sendApi(new SendMessage(chatId, Constants.MEDS_SUPPLY_COND));
}
}

View File

@ -0,0 +1,13 @@
package com.alterdekim.javabot.bot.conditions;
import com.alterdekim.javabot.Constants;
import com.alterdekim.javabot.components.BunkerBot;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
public class PowerMalfunction implements ConditionCard {
@Override
public void executeCard(BunkerBot bot, String chatId) {
bot.liveFormula.sub(5.0d / 100.0d);
bot.sendApi(new SendMessage(chatId, Constants.POWER_MALFUNCTION));
}
}

View File

@ -0,0 +1,13 @@
package com.alterdekim.javabot.bot.conditions;
import com.alterdekim.javabot.Constants;
import com.alterdekim.javabot.components.BunkerBot;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
public class StructuralIssues implements ConditionCard {
@Override
public void executeCard(BunkerBot bot, String chatId) {
bot.liveFormula.sub(5.0d / 100.0d);
bot.sendApi(new SendMessage(chatId, Constants.STRUCTURAL_ISSUES));
}
}

View File

@ -0,0 +1,12 @@
package com.alterdekim.javabot.bot.conditions;
import com.alterdekim.javabot.Constants;
import com.alterdekim.javabot.components.BunkerBot;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
public class Whispers implements ConditionCard {
@Override
public void executeCard(BunkerBot bot, String chatId) {
bot.sendApi(new SendMessage(chatId, Constants.WHISPERS_COND));
}
}

View File

@ -5,6 +5,7 @@ import com.alterdekim.javabot.Commands;
import com.alterdekim.javabot.Constants; import com.alterdekim.javabot.Constants;
import com.alterdekim.javabot.TelegramConfig; import com.alterdekim.javabot.TelegramConfig;
import com.alterdekim.javabot.bot.cards.*; import com.alterdekim.javabot.bot.cards.*;
import com.alterdekim.javabot.bot.conditions.*;
import com.alterdekim.javabot.entities.*; import com.alterdekim.javabot.entities.*;
import com.alterdekim.javabot.service.*; import com.alterdekim.javabot.service.*;
import com.alterdekim.javabot.util.*; import com.alterdekim.javabot.util.*;
@ -54,6 +55,7 @@ public class BunkerBot extends TelegramLongPollingBot {
private final DisasterService disasterService; private final DisasterService disasterService;
private final SynergyService synergyService; private final SynergyService synergyService;
private List<Class<? extends ActionCard>> actionCards; private List<Class<? extends ActionCard>> actionCards;
private List<ConditionCard> condCards;
public final RandomComponent random; public final RandomComponent random;
@ -63,6 +65,8 @@ public class BunkerBot extends TelegramLongPollingBot {
public LiveFormula liveFormula; public LiveFormula liveFormula;
private VotingType votingType;
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public BunkerBot(TelegramConfig telegramConfig, public BunkerBot(TelegramConfig telegramConfig,
BioService bioService, BioService bioService,
@ -95,7 +99,9 @@ public class BunkerBot extends TelegramLongPollingBot {
Sabotage.class, Sabotage.class,
GodsWillCard.class, GodsWillCard.class,
StealActionCard.class, StealActionCard.class,
ResurrectionCard.class)); ResurrectionCard.class
));
this.condCards = List.of(new AirStuff(), new AIStuff(), new FoodSupply(), new MedicalSupply(), new PowerMalfunction(), new StructuralIssues(), new Whispers());
this.random = randomComponent; this.random = randomComponent;
this.dayNightFields = new DayNightFields(); this.dayNightFields = new DayNightFields();
this.linkedQueue = new ConcurrentLinkedQueue<>(); this.linkedQueue = new ConcurrentLinkedQueue<>();
@ -190,7 +196,7 @@ public class BunkerBot extends TelegramLongPollingBot {
private void startGame() { private void startGame() {
if( gameState != GameState.JOINING ) if( gameState != GameState.JOINING )
return; return;
if(players.size() < 1) { // TODO: change to 2 if(players.size() < 2) { // TODO: change to 2
sendApi(new SendMessage(groupId, Constants.PLAYERS_LESS_THAN_ZERO)); sendApi(new SendMessage(groupId, Constants.PLAYERS_LESS_THAN_ZERO));
return; return;
} }
@ -202,7 +208,8 @@ public class BunkerBot extends TelegramLongPollingBot {
this.liveFormula.setSynergies(synergyService.getAllSynergies()); this.liveFormula.setSynergies(synergyService.getAllSynergies());
Disaster d = (Disaster) BotUtils.getRandomFromList(disasterService.getAllDisasters(), random); Disaster d = (Disaster) BotUtils.getRandomFromList(disasterService.getAllDisasters(), random);
sendApi(new SendMessage(groupId, getStringById(d.getDescTextId()))); sendApi(new SendMessage(groupId, getStringById(d.getDescTextId())));
//sendApi(new SendMessage(groupId, String.format(Constants.BUNKER_STATS, ))); ConditionCard conditionCard = (ConditionCard) BotUtils.getRandomFromList(this.condCards, this.random);
conditionCard.executeCard(this, groupId);
List<Bio> bios = bioService.getAllBios(); List<Bio> bios = bioService.getAllBios();
List<Work> works = workService.getAllWorks(); List<Work> works = workService.getAllWorks();
List<Luggage> luggs = luggageService.getAllLuggages(); List<Luggage> luggs = luggageService.getAllLuggages();
@ -369,6 +376,12 @@ public class BunkerBot extends TelegramLongPollingBot {
sendApi(new SendMessage(groupId, String.format(Constants.DAY_MESSAGE, p))); sendApi(new SendMessage(groupId, String.format(Constants.DAY_MESSAGE, p)));
} }
this.last_p = p; this.last_p = p;
this.votingType = (VotingType) BotUtils.getRandomFromList(new ArrayList<>(List.of(VotingType.MaxTieRandom, VotingType.MaxTieNone, VotingType.LeastVotesOut)), this.random);
sendApi(new SendMessage(groupId, switch (this.votingType) {
case MaxTieNone -> Constants.MAX_TIE_NONE;
case MaxTieRandom -> Constants.MAX_TIE_RANDOM;
case LeastVotesOut -> Constants.LEAST_VOTES_OUT;
}));
sendApi(new SendMessage(groupId, dayNightFields.getDayMessage())); sendApi(new SendMessage(groupId, dayNightFields.getDayMessage()));
dayNightFields.setDayMessage(""); dayNightFields.setDayMessage("");
setAllNotAnswered(); setAllNotAnswered();
@ -442,15 +455,41 @@ public class BunkerBot extends TelegramLongPollingBot {
} }
private void endVote() { private void endVote() {
Integer max = dayNightFields.getPoll().values().stream().max(Integer::compareTo).orElse(0); switch (this.votingType) {
long count = dayNightFields.getPoll().values().stream().filter(p -> p.equals(max)).count(); case MaxTieNone -> {
SendMessage sendMessage = new SendMessage(groupId, Constants.ENDVOTE); Integer max = dayNightFields.getPoll().values().stream().max(Integer::compareTo).orElse(0);
if( count > 1 ) { long count = dayNightFields.getPoll().values().stream().filter(p -> p.equals(max)).count();
sendMessage = new SendMessage(groupId, Constants.DRAW); SendMessage sendMessage = new SendMessage(groupId, Constants.ENDVOTE);
} else { if( count > 1 ) {
removeVotePlayers(max); sendMessage = new SendMessage(groupId, Constants.DRAW);
} else {
removeVotePlayers(max);
}
sendApi(sendMessage);
}
case MaxTieRandom -> {
Integer max = dayNightFields.getPoll().values().stream().max(Integer::compareTo).orElse(0);
long count = dayNightFields.getPoll().values().stream().filter(p -> p.equals(max)).count();
SendMessage sendMessage = new SendMessage(groupId, Constants.ENDVOTE);
if( count > 1 ) {
int p_index = this.random.nextInt(this.players.size());
sendMessage = new SendMessage(groupId, Constants.DRAW_GONE);
sendApi(new SendMessage(groupId, String.format(Constants.REMOVE_PLAYER, players.get(p_index).getFirstName())));
dead_players.add(players.get(p_index));
players.remove(p_index);
} else {
removeVotePlayers(max);
}
sendApi(sendMessage);
}
case LeastVotesOut -> {
Integer min = dayNightFields.getPoll().values().stream().min(Integer::compareTo).orElse(0);
SendMessage sendMessage = new SendMessage(groupId, Constants.ENDVOTE);
removeVotePlayers(min);
sendApi(sendMessage);
}
} }
sendApi(sendMessage);
if( !checkEndGame() ) { if( !checkEndGame() ) {
doNight(); doNight();
return; return;
@ -476,15 +515,17 @@ public class BunkerBot extends TelegramLongPollingBot {
} }
private void removeVotePlayers(Integer max) { private void removeVotePlayers(Integer max) {
dayNightFields.getPoll() var first = dayNightFields.getPoll()
.entrySet() .entrySet()
.stream() .stream()
.filter(e -> e.getValue().equals(max)) .filter(e -> e.getValue().equals(max))
.forEach(i -> { .findFirst();
sendApi(new SendMessage(groupId, String.format(Constants.REMOVE_PLAYER, players.get(i.getKey()).getFirstName()))); if( first.isPresent() ) {
dead_players.add(players.get(i.getKey().intValue())); var i = first.get();
players.remove(i.getKey().intValue()); sendApi(new SendMessage(groupId, String.format(Constants.REMOVE_PLAYER, players.get(i.getKey()).getFirstName())));
}); dead_players.add(players.get(i.getKey().intValue()));
players.remove(i.getKey().intValue());
}
} }
private void interruptGame() { private void interruptGame() {