From 7c15d593f5f583fc819835f7c0265137beb9c270 Mon Sep 17 00:00:00 2001 From: syeyoung Date: Sat, 20 Feb 2021 01:23:37 +0900 Subject: button solver, some tweaks --- .../dungeonsguide/dungeon/DungeonContext.java | 13 ++- .../dungeon/doorfinder/CatacombDataProvider.java | 17 ++++ .../doorfinder/DungeonSpecificDataProvider.java | 2 + .../features/impl/dungeon/FeatureDungeonScore.java | 21 +++- .../pathfinding/NodeProcessorDungeonRoom.java | 2 + .../roomprocessor/ProcessorFactory.java | 1 + .../roomprocessor/RoomProcessorButtonSolver.java | 112 +++++++++++++++++++++ .../bossfight/BossfightProcessorBonzo.java | 5 - 8 files changed, 163 insertions(+), 10 deletions(-) create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/RoomProcessorButtonSolver.java (limited to 'src/main/java') diff --git a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/DungeonContext.java b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/DungeonContext.java index ee4ce4cc..6f162a5c 100755 --- a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/DungeonContext.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/DungeonContext.java @@ -56,6 +56,14 @@ public class DungeonContext { @Setter private BlockPos bossroomSpawnPos = null; + @Getter + @Setter + private boolean trapRoomGen = false; + + @Getter + @Setter + private boolean gotMimic = false; + @Getter @Setter private BossfightProcessor bossfightProcessor; @@ -66,7 +74,8 @@ public class DungeonContext { public DungeonContext(World world) { this.world = world; mapProcessor = new MapProcessor(this); - + DungeonSpecificDataProvider doorFinder = DungeonSpecificDataProviderRegistry.getDoorFinder(((SkyblockStatus) e.getDungeonsGuide().getSkyblockStatus()).getDungeonName()); + trapRoomGen = doorFinder.isTrapSpawn(e.getDungeonsGuide().getSkyblockStatus().getDungeonName()); } @@ -115,6 +124,8 @@ public class DungeonContext { if (dr != null) { dr.setTotalSecrets(secrets2); } + } else if (component.getFormattedText().contains("$DG-Mimic")) { + gotMimic = true; } } } diff --git a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/CatacombDataProvider.java b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/CatacombDataProvider.java index d39418bd..0c874458 100755 --- a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/CatacombDataProvider.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/CatacombDataProvider.java @@ -92,4 +92,21 @@ public class CatacombDataProvider implements DungeonSpecificDataProvider { } return null; } + + @Override + public boolean isTrapSpawn(String dungeonName) { + String floor = dungeonName.substring(14).trim(); + if (floor.equals("F3")) { + return true; + } else if (floor.equals("F4")) { + return true; + } else if (floor.equals("F5")) { + return true; + } else if (floor.equals("F6")) { + return true; + } else if (floor.equals("F7")) { + return true; + } + return false; + } } diff --git a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/DungeonSpecificDataProvider.java b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/DungeonSpecificDataProvider.java index 3103adf0..4cc0e677 100755 --- a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/DungeonSpecificDataProvider.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/DungeonSpecificDataProvider.java @@ -12,4 +12,6 @@ public interface DungeonSpecificDataProvider { Vector2d findDoorOffset(World w, String dungeonName); BossfightProcessor createBossfightProcessor(World w, String dungeonName); + + boolean isTrapSpawn(String dungeonName); } \ No newline at end of file diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeatureDungeonScore.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeatureDungeonScore.java index f3fd44d3..4c774d20 100644 --- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeatureDungeonScore.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeatureDungeonScore.java @@ -190,17 +190,23 @@ public class FeatureDungeonScore extends TextHUDFeature { skill -= FeatureRegistry.DUNGEON_DEATHS.getTotalDeaths() * 2; int totalCompRooms= 0; boolean bossroomFound = false; + boolean traproomFound = false; for (DungeonRoom dungeonRoom : context.getDungeonRoomList()) { if (dungeonRoom.getColor() == 74) bossroomFound = true; + if (dungeonRoom.getColor() == 62) traproomFound = true; if (dungeonRoom.getCurrentState() != DungeonRoom.RoomState.DISCOVERED) totalCompRooms += dungeonRoom.getUnitPoints().size(); if (dungeonRoom.getColor() == 66 && dungeonRoom.getCurrentState() == DungeonRoom.RoomState.DISCOVERED) skill -= 10; if (dungeonRoom.getColor() == 74 && dungeonRoom.getCurrentState() == DungeonRoom.RoomState.DISCOVERED) skill += 1; + if (dungeonRoom.getColor() == 62 && dungeonRoom.getCurrentState() == DungeonRoom.RoomState.DISCOVERED) + skill += 1; + skill += dungeonRoom.getCurrentState().getScoreModifier(); } if (!bossroomFound) skill += 1; + if (!traproomFound && context.isTrapRoomGen()) skill += 1; skill -= getUndiscoveredPuzzles() * 10; skill -= (getTotalRooms() - totalCompRooms) * 4; skill = MathHelper.clamp_int(skill, 0, 100); @@ -225,17 +231,24 @@ public class FeatureDungeonScore extends TextHUDFeature { int time = 0; { double timeModifier; + int timeModifierModifier = + e.getDungeonsGuide().getSkyblockStatus().getDungeonName().substring(14).trim().equals("F2") ? -120 : 0; if (context.getBossRoomEnterSeconds() != -1) { - timeModifier = Math.max(0, context.getBossRoomEnterSeconds() - 1200); + timeModifier = Math.max(0, context.getBossRoomEnterSeconds() - timeModifierModifier); } else { - timeModifier = Math.max(0, FeatureRegistry.DUNGEON_SBTIME.getTimeElapsed() / 1000 - 1200); + timeModifier = Math.max(0, FeatureRegistry.DUNGEON_SBTIME.getTimeElapsed() / 1000 - timeModifierModifier); } - time = MathHelper.clamp_int((int) Math.floor(100 - 2.2 * timeModifier), 0, 100); + + if (timeModifier <= 1320) time = 100; + else if (timeModifier <= 1420) time = (int) Math.ceil(232 - 0.1 * timeModifier); + else if (timeModifier <= 1820) time = (int) Math.ceil(161 - 0.05 * timeModifier); + else if (timeModifier < 3920) time = (int) Math.ceil(392/3.0 - (1/30.0) * timeModifier); } int bonus = 0; int tombs; { bonus += tombs = MathHelper.clamp_int(FeatureRegistry.DUNGEON_TOMBS.getTombsFound(), 0, 5); + if (context.isGotMimic()) bonus += 2; } // amazing thing @@ -272,7 +285,7 @@ public class FeatureDungeonScore extends TextHUDFeature { String currentLetter = getLetter(current); String nextLetter= getNextLetter(currentLetter); if (nextLetter == null) { - actualBit.add(new StyledText(nextLetter+" Expected","nextScore")); + actualBit.add(new StyledText("S+ Expected","nextScore")); return actualBit; } int req = getScoreRequirement(nextLetter); diff --git a/src/main/java/kr/syeyoung/dungeonsguide/pathfinding/NodeProcessorDungeonRoom.java b/src/main/java/kr/syeyoung/dungeonsguide/pathfinding/NodeProcessorDungeonRoom.java index 256673ba..5ec6c84d 100644 --- a/src/main/java/kr/syeyoung/dungeonsguide/pathfinding/NodeProcessorDungeonRoom.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/pathfinding/NodeProcessorDungeonRoom.java @@ -89,6 +89,8 @@ public class NodeProcessorDungeonRoom extends NodeProcessor { || state.getBlock() == Blocks.trapdoor || state.getBlock() == Blocks.iron_trapdoor || state.getBlock() == Blocks.wooden_button || state.getBlock() == Blocks.stone_button || state.getBlock() == Blocks.fire || state.getBlock() == Blocks.torch + || state.getBlock() == Blocks.rail || state.getBlock() == Blocks.golden_rail + || state.getBlock() == Blocks.activator_rail || state.getBlock() == Blocks.activator_rail || (state == Blocks.stone.getStateFromMeta(2)); } } diff --git a/src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/ProcessorFactory.java b/src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/ProcessorFactory.java index 6574c170..6415eb6f 100755 --- a/src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/ProcessorFactory.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/ProcessorFactory.java @@ -26,6 +26,7 @@ public class ProcessorFactory { static { registerRoomProcessor("default", new GeneralRoomProcessor.Generator()); + registerRoomProcessor("button_5", new RoomProcessorButtonSolver.Generator()); registerRoomProcessor("puzzle_water_solver", new RoomProcessorWaterPuzzle.Generator()); registerRoomProcessor("puzzle_teleport_solver", new RoomProcessorTeleportMazeSolver.Generator()); registerRoomProcessor("puzzle_riddle_solver", new RoomProcessorRiddle.Generator()); diff --git a/src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/RoomProcessorButtonSolver.java b/src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/RoomProcessorButtonSolver.java new file mode 100644 index 00000000..92bd9edb --- /dev/null +++ b/src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/RoomProcessorButtonSolver.java @@ -0,0 +1,112 @@ +package kr.syeyoung.dungeonsguide.roomprocessor; + +import kr.syeyoung.dungeonsguide.dungeon.data.OffsetPointSet; +import kr.syeyoung.dungeonsguide.dungeon.roomfinder.DungeonRoom; +import kr.syeyoung.dungeonsguide.utils.RenderUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.util.BlockPos; +import net.minecraft.util.IChatComponent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; + +import java.awt.*; +import java.util.Arrays; + +public class RoomProcessorButtonSolver extends GeneralRoomProcessor { + public RoomProcessorButtonSolver(DungeonRoom dungeonRoom) { + super(dungeonRoom); + + OffsetPointSet ops = (OffsetPointSet) dungeonRoom.getDungeonRoomInfo().getProperties().get("buttons"); + if (ops == null) { + bugged = true; + return; + } + + buttons = new BlockPos[12]; + woods = new BlockPos[12]; + for (int i = 0; i < ops.getOffsetPointList().size(); i++) { + buttons[i] = ops.getOffsetPointList().get(i).getBlockPos(dungeonRoom); + woods[i] = buttons[i].add(0,-1,0); + } + } + + private boolean bugged; + + private BlockPos[] buttons; + private BlockPos[] woods; + + private long clicked; + private int clickedButton = -1; + + private int[] result = new int[12]; + + @Override + public void onInteractBlock(PlayerInteractEvent event) { + super.onInteractBlock(event); + if (bugged) return; + + if (event.action != PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK) return; + for (int i = 0; i < buttons.length; i++) { + if (event.pos.equals(buttons[i])) { + clicked = System.currentTimeMillis(); + clickedButton = i; + return; + } + } + } + + @Override + public void chatReceived(IChatComponent chat) { + super.chatReceived(chat); + if (bugged) return; + + if (clickedButton == -1) return; + if (clicked + 500 < System.currentTimeMillis()) return; + + String msg = chat.getFormattedText(); + if (msg.equals("§r§cThis button doesn't seem to do anything...§r")) { + result[clickedButton] = -1; + clickedButton = -1; + } else if (msg.equals("§r§aThis button seems connected to something§r")) { + Arrays.fill(result, -1); + if (clickedButton % 4 != 0) result[clickedButton - 1] = 1; + if (clickedButton % 4 != 3) result[clickedButton + 1] = 1; + clickedButton = -1; + } else if (msg.equals("§r§aClick! you Hear the sound of a door opening§r")) { + Arrays.fill(result, -1); + result[clickedButton] = 2; + clickedButton = -1; + } + } + + @Override + public void drawWorld(float partialTicks) { + super.drawWorld(partialTicks); + if (bugged) return; + if (Minecraft.getMinecraft().thePlayer.getPosition().distanceSq(woods[6]) > 100) return; + + + for (int i = 0; i < woods.length; i++) { + int data = result[i]; + BlockPos pos = woods[i]; + + if (data == 0) { + RenderUtils.highlightBlock(pos, new Color(0, 255, 255, 50), partialTicks, false); + } else if (data == -1) { + RenderUtils.highlightBlock(pos, new Color(255, 0, 0, 50), partialTicks, false); + } else if (data == 1) { + RenderUtils.highlightBlock(pos, new Color(0, 255, 0, 50), partialTicks, false); + } else if (data == 2) { + RenderUtils.highlightBlock(pos, new Color(0, 255, 0, 100), partialTicks, false); + } + } + } + + public static class Generator implements RoomProcessorGenerator { + @Override + public RoomProcessorButtonSolver createNew(DungeonRoom dungeonRoom) { + RoomProcessorButtonSolver defaultRoomProcessor = new RoomProcessorButtonSolver(dungeonRoom); + return defaultRoomProcessor; + } + } +} diff --git a/src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bossfight/BossfightProcessorBonzo.java b/src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bossfight/BossfightProcessorBonzo.java index a7efef0c..05722565 100644 --- a/src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bossfight/BossfightProcessorBonzo.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bossfight/BossfightProcessorBonzo.java @@ -15,11 +15,6 @@ public class BossfightProcessorBonzo extends GeneralBossfightProcessor { .signatureMsg("§r§c[BOSS] Bonzo §r§f: Gratz for making it this far, but I’m basically unbeatable.§r") .nextPhase("fight-1").build() ); - /* - * §r§cThis button doesn't seem to do anything...§r - * §r§aThis button seems connected to something§r - * §r§aClick! you Hear the sound of a door opening§r - * */ addPhase(GeneralBossfightProcessor.PhaseData.builder() .phase("fight-1") -- cgit