From 8c14b04ee4793987a35432c33cca40632fc54e24 Mon Sep 17 00:00:00 2001 From: alterwain Date: Sun, 13 Apr 2025 04:22:18 +0300 Subject: [PATCH] Changed action cards logic. x14 --- .../com/alterdekim/javabot/Constants.java | 21 ++++++ .../alterdekim/javabot/bot/VotingType.java | 7 ++ .../javabot/bot/conditions/AIStuff.java | 12 +++ .../javabot/bot/conditions/AirStuff.java | 12 +++ .../javabot/bot/conditions/ConditionCard.java | 8 ++ .../javabot/bot/conditions/FoodSupply.java | 13 ++++ .../javabot/bot/conditions/MedicalSupply.java | 13 ++++ .../bot/conditions/PowerMalfunction.java | 13 ++++ .../bot/conditions/StructuralIssues.java | 13 ++++ .../javabot/bot/conditions/Whispers.java | 12 +++ .../javabot/components/BunkerBot.java | 75 ++++++++++++++----- 11 files changed, 182 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/alterdekim/javabot/bot/VotingType.java create mode 100644 src/main/java/com/alterdekim/javabot/bot/conditions/AIStuff.java create mode 100644 src/main/java/com/alterdekim/javabot/bot/conditions/AirStuff.java create mode 100644 src/main/java/com/alterdekim/javabot/bot/conditions/ConditionCard.java create mode 100644 src/main/java/com/alterdekim/javabot/bot/conditions/FoodSupply.java create mode 100644 src/main/java/com/alterdekim/javabot/bot/conditions/MedicalSupply.java create mode 100644 src/main/java/com/alterdekim/javabot/bot/conditions/PowerMalfunction.java create mode 100644 src/main/java/com/alterdekim/javabot/bot/conditions/StructuralIssues.java create mode 100644 src/main/java/com/alterdekim/javabot/bot/conditions/Whispers.java diff --git a/src/main/java/com/alterdekim/javabot/Constants.java b/src/main/java/com/alterdekim/javabot/Constants.java index 78bdbd3..8179e9c 100644 --- a/src/main/java/com/alterdekim/javabot/Constants.java +++ b/src/main/java/com/alterdekim/javabot/Constants.java @@ -5,6 +5,7 @@ public interface Constants { String REMOVE_PLAYER = "Игрок %s покидает бункер."; String ENDVOTE = "Голосование окончено."; String DRAW = "Ничья. Никто не уходит из игры."; + String DRAW_GONE = "Ничья. Из игры уходит случайный игрок."; String GROUP_SET = "Чат выбран."; String INTERRUPT_GAME = "Игра остановлена."; String USER_VOTED = "%s проголосовал."; @@ -81,4 +82,24 @@ public interface Constants { String RESURRECTION_CARD = "Воскресить игрока"; 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 = "В этом раунде выбывает тот, за кого меньше всего голосов отдали."; } \ No newline at end of file diff --git a/src/main/java/com/alterdekim/javabot/bot/VotingType.java b/src/main/java/com/alterdekim/javabot/bot/VotingType.java new file mode 100644 index 0000000..73b72c9 --- /dev/null +++ b/src/main/java/com/alterdekim/javabot/bot/VotingType.java @@ -0,0 +1,7 @@ +package com.alterdekim.javabot.bot; + +public enum VotingType { + MaxTieNone, + MaxTieRandom, + LeastVotesOut +} diff --git a/src/main/java/com/alterdekim/javabot/bot/conditions/AIStuff.java b/src/main/java/com/alterdekim/javabot/bot/conditions/AIStuff.java new file mode 100644 index 0000000..576aeb4 --- /dev/null +++ b/src/main/java/com/alterdekim/javabot/bot/conditions/AIStuff.java @@ -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)); + } +} diff --git a/src/main/java/com/alterdekim/javabot/bot/conditions/AirStuff.java b/src/main/java/com/alterdekim/javabot/bot/conditions/AirStuff.java new file mode 100644 index 0000000..90cd5b9 --- /dev/null +++ b/src/main/java/com/alterdekim/javabot/bot/conditions/AirStuff.java @@ -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)); + } +} diff --git a/src/main/java/com/alterdekim/javabot/bot/conditions/ConditionCard.java b/src/main/java/com/alterdekim/javabot/bot/conditions/ConditionCard.java new file mode 100644 index 0000000..fb8172a --- /dev/null +++ b/src/main/java/com/alterdekim/javabot/bot/conditions/ConditionCard.java @@ -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); +} diff --git a/src/main/java/com/alterdekim/javabot/bot/conditions/FoodSupply.java b/src/main/java/com/alterdekim/javabot/bot/conditions/FoodSupply.java new file mode 100644 index 0000000..537205a --- /dev/null +++ b/src/main/java/com/alterdekim/javabot/bot/conditions/FoodSupply.java @@ -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)); + } +} diff --git a/src/main/java/com/alterdekim/javabot/bot/conditions/MedicalSupply.java b/src/main/java/com/alterdekim/javabot/bot/conditions/MedicalSupply.java new file mode 100644 index 0000000..717a8c8 --- /dev/null +++ b/src/main/java/com/alterdekim/javabot/bot/conditions/MedicalSupply.java @@ -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)); + } +} diff --git a/src/main/java/com/alterdekim/javabot/bot/conditions/PowerMalfunction.java b/src/main/java/com/alterdekim/javabot/bot/conditions/PowerMalfunction.java new file mode 100644 index 0000000..aedf01e --- /dev/null +++ b/src/main/java/com/alterdekim/javabot/bot/conditions/PowerMalfunction.java @@ -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)); + } +} diff --git a/src/main/java/com/alterdekim/javabot/bot/conditions/StructuralIssues.java b/src/main/java/com/alterdekim/javabot/bot/conditions/StructuralIssues.java new file mode 100644 index 0000000..7f13c63 --- /dev/null +++ b/src/main/java/com/alterdekim/javabot/bot/conditions/StructuralIssues.java @@ -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)); + } +} diff --git a/src/main/java/com/alterdekim/javabot/bot/conditions/Whispers.java b/src/main/java/com/alterdekim/javabot/bot/conditions/Whispers.java new file mode 100644 index 0000000..8c7100b --- /dev/null +++ b/src/main/java/com/alterdekim/javabot/bot/conditions/Whispers.java @@ -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)); + } +} diff --git a/src/main/java/com/alterdekim/javabot/components/BunkerBot.java b/src/main/java/com/alterdekim/javabot/components/BunkerBot.java index 43ae766..e37e30d 100644 --- a/src/main/java/com/alterdekim/javabot/components/BunkerBot.java +++ b/src/main/java/com/alterdekim/javabot/components/BunkerBot.java @@ -5,6 +5,7 @@ import com.alterdekim.javabot.Commands; import com.alterdekim.javabot.Constants; import com.alterdekim.javabot.TelegramConfig; import com.alterdekim.javabot.bot.cards.*; +import com.alterdekim.javabot.bot.conditions.*; import com.alterdekim.javabot.entities.*; import com.alterdekim.javabot.service.*; import com.alterdekim.javabot.util.*; @@ -54,6 +55,7 @@ public class BunkerBot extends TelegramLongPollingBot { private final DisasterService disasterService; private final SynergyService synergyService; private List> actionCards; + private List condCards; public final RandomComponent random; @@ -63,6 +65,8 @@ public class BunkerBot extends TelegramLongPollingBot { public LiveFormula liveFormula; + private VotingType votingType; + @SuppressWarnings("deprecation") public BunkerBot(TelegramConfig telegramConfig, BioService bioService, @@ -95,7 +99,9 @@ public class BunkerBot extends TelegramLongPollingBot { Sabotage.class, GodsWillCard.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.dayNightFields = new DayNightFields(); this.linkedQueue = new ConcurrentLinkedQueue<>(); @@ -190,7 +196,7 @@ public class BunkerBot extends TelegramLongPollingBot { private void startGame() { if( gameState != GameState.JOINING ) 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)); return; } @@ -202,7 +208,8 @@ public class BunkerBot extends TelegramLongPollingBot { this.liveFormula.setSynergies(synergyService.getAllSynergies()); Disaster d = (Disaster) BotUtils.getRandomFromList(disasterService.getAllDisasters(), random); 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 bios = bioService.getAllBios(); List works = workService.getAllWorks(); List luggs = luggageService.getAllLuggages(); @@ -369,6 +376,12 @@ public class BunkerBot extends TelegramLongPollingBot { sendApi(new SendMessage(groupId, String.format(Constants.DAY_MESSAGE, 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())); dayNightFields.setDayMessage(""); setAllNotAnswered(); @@ -442,15 +455,41 @@ public class BunkerBot extends TelegramLongPollingBot { } private void endVote() { - 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 ) { - sendMessage = new SendMessage(groupId, Constants.DRAW); - } else { - removeVotePlayers(max); + switch (this.votingType) { + case MaxTieNone -> { + 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 ) { + 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() ) { doNight(); return; @@ -476,15 +515,17 @@ public class BunkerBot extends TelegramLongPollingBot { } private void removeVotePlayers(Integer max) { - dayNightFields.getPoll() + var first = dayNightFields.getPoll() .entrySet() .stream() .filter(e -> e.getValue().equals(max)) - .forEach(i -> { - 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()); - }); + .findFirst(); + if( first.isPresent() ) { + var i = first.get(); + 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() {