/*
* Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod
* Copyright (C) 2021 cyoung06
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
package kr.syeyoung.dungeonsguide.features.impl.boss;
import com.google.common.base.Supplier;
import kr.syeyoung.dungeonsguide.DungeonsGuide;
import kr.syeyoung.dungeonsguide.SkyblockStatus;
import kr.syeyoung.dungeonsguide.config.guiconfig.ConfigPanelCreator;
import kr.syeyoung.dungeonsguide.config.guiconfig.MFeatureEdit;
import kr.syeyoung.dungeonsguide.config.guiconfig.MParameterEdit;
import kr.syeyoung.dungeonsguide.config.guiconfig.RootConfigPanel;
import kr.syeyoung.dungeonsguide.config.types.AColor;
import kr.syeyoung.dungeonsguide.dungeon.DungeonContext;
import kr.syeyoung.dungeonsguide.dungeon.roomfinder.DungeonRoom;
import kr.syeyoung.dungeonsguide.features.FeatureParameter;
import kr.syeyoung.dungeonsguide.features.FeatureRegistry;
import kr.syeyoung.dungeonsguide.features.SimpleFeature;
import kr.syeyoung.dungeonsguide.features.impl.dungeon.FeatureDungeonScore;
import kr.syeyoung.dungeonsguide.features.text.*;
import kr.syeyoung.dungeonsguide.gui.MPanel;
import kr.syeyoung.dungeonsguide.utils.TextUtils;
import java.util.*;
public class FeatureWarningOnPortal extends SimpleFeature implements StyledTextProvider {
public FeatureWarningOnPortal() {
super("Dungeon.Blood Room", "Score Warning on Watcher portal", "Display warnings such as\n- 'NOT ALL ROOMS DISCOVERED'\n- 'NOT ALL ROOMS COMPLETED'\n- 'Expected Score: 304'\n- 'MISSING 3 CRYPTS'\non portal", "bossfight.warningonportal");
this.parameters.put("textStyles", new FeatureParameter>("textStyles", "", "", new ArrayList(), "list_textStyle"));
getStyles().add(new TextStyle("warning", new AColor(255, 0,0,255), new AColor(255, 255,255,255), false));
getStyles().add(new TextStyle("field_name", new AColor(255, 72,255,255), new AColor(0, 0,0,0), false));
getStyles().add(new TextStyle("field_separator", new AColor(204, 204,204,255), new AColor(0, 0,0,0), false));
getStyles().add(new TextStyle("field_value", new AColor(255, 255,0,255), new AColor(0, 0,0,0), false));
getStyles().add(new TextStyle("field_etc", new AColor(204, 204,204,255), new AColor(0, 0,0,0), false));
}
private static final List dummyText = new ArrayList();
static {
dummyText.add(new StyledText("!!!WARNING!!! <- text changes in boss-room\n", "warning"));
dummyText.add(new StyledText("Total Secrets","field_name"));
dummyText.add(new StyledText(": ","field_separator"));
dummyText.add(new StyledText("103/100 of 50","field_value"));
dummyText.add(new StyledText("(103% 41.2 Explorer)","field_etc"));
dummyText.add(new StyledText("Crypts","field_name"));
dummyText.add(new StyledText(": ","field_separator"));
dummyText.add(new StyledText("5/5\n","field_value"));
dummyText.add(new StyledText("Deaths","field_name"));
dummyText.add(new StyledText(": ","field_separator"));
dummyText.add(new StyledText("0\n","field_value"));
dummyText.add(new StyledText("Score Estimate","field_name"));
dummyText.add(new StyledText(": ","field_separator"));
dummyText.add(new StyledText("1000 ","field_value"));
dummyText.add(new StyledText("(S++++)\n","field_etc"));
dummyText.add(new StyledText("Skill","field_name"));
dummyText.add(new StyledText(": ","field_separator"));
dummyText.add(new StyledText("100 ","field_value"));
dummyText.add(new StyledText("(0 Deaths: 0 pts)\n","field_etc"));
dummyText.add(new StyledText("Explorer","field_name"));
dummyText.add(new StyledText(": ","field_separator"));
dummyText.add(new StyledText("100 ","field_value"));
dummyText.add(new StyledText("(100% + secrets)\n","field_etc"));
dummyText.add(new StyledText("Time","field_name"));
dummyText.add(new StyledText(": ","field_separator"));
dummyText.add(new StyledText("100 ","field_value"));
dummyText.add(new StyledText("(-30m 29s)\n","field_etc"));
dummyText.add(new StyledText("Bonus","field_name"));
dummyText.add(new StyledText(": ","field_separator"));
dummyText.add(new StyledText("5\n","field_value"));
}
@Override
public List getDummyText() {
return dummyText;
}
SkyblockStatus skyblockStatus = DungeonsGuide.getDungeonsGuide().getSkyblockStatus();
@Override
public List getText() {
ArrayList texts = new ArrayList();
DungeonContext context = skyblockStatus.getContext();
FeatureDungeonScore.ScoreCalculation scoreCalculation = FeatureRegistry.DUNGEON_SCORE.calculateScore();
boolean failed = context.getDungeonRoomList().stream().anyMatch(a -> a.getCurrentState() == DungeonRoom.RoomState.FAILED);
if (context.getMapProcessor().getUndiscoveredRoom() > 0) {
texts.add(new StyledText("There are at least "+context.getMapProcessor().getUndiscoveredRoom()+" undiscovered rooms!\n", "warning"));
} else if (failed) {
texts.add(new StyledText("There is a failed puzzle room! Yikes!\n", "warning"));
} else if (!scoreCalculation.isFullyCleared()) {
texts.add(new StyledText("Some rooms are not fully cleared!\n", "warning"));
} else if (scoreCalculation.getTombs() < 5) {
texts.add(new StyledText("Only less than 5 crypts are blown up!\n", "warning"));
} else {
texts.add(new StyledText("\n", "warning"));
}
texts.add(new StyledText("Total Secrets","field_name"));
texts.add(new StyledText(": ","field_separator"));
texts.add(new StyledText(scoreCalculation.getSecrets() +"/" + scoreCalculation.getEffectiveTotalSecrets()+" of "+scoreCalculation.getTotalSecrets(),"field_value"));
texts.add(new StyledText(" ("+(int)(scoreCalculation.getSecrets() / (float)scoreCalculation.getEffectiveTotalSecrets() * 100.0f)+"% "+(int)Math.ceil(scoreCalculation.getSecrets() / (float)scoreCalculation.getEffectiveTotalSecrets() * 40.0f)+" Explorer)\n","field_etc"));
texts.add(new StyledText("Crypts","field_name"));
texts.add(new StyledText(": ","field_separator"));
texts.add(new StyledText(scoreCalculation.getTombs() +"/5\n","field_value"));
texts.add(new StyledText("Deaths","field_name"));
texts.add(new StyledText(": ","field_separator"));
texts.add(new StyledText(scoreCalculation.getDeaths() + "\n","field_value"));
int sum = scoreCalculation.getTime() + scoreCalculation.getExplorer() + scoreCalculation.getSkill() + scoreCalculation.getBonus();
texts.add(new StyledText("Score Estimate","field_name"));
texts.add(new StyledText(": ","field_separator"));
texts.add(new StyledText(sum+" ","field_value"));
texts.add(new StyledText("("+FeatureRegistry.DUNGEON_SCORE.getLetter(sum)+")\n","field_etc"));
texts.add(new StyledText("Skill","field_name"));
texts.add(new StyledText(": ","field_separator"));
texts.add(new StyledText(scoreCalculation.getSkill()+" ","field_value"));
texts.add(new StyledText("("+scoreCalculation.getDeaths()+" Deaths: "+(scoreCalculation.getDeaths() * -2)+" pts)\n","field_etc"));
texts.add(new StyledText("Explorer","field_name"));
texts.add(new StyledText(": ","field_separator"));
texts.add(new StyledText(scoreCalculation.getExplorer()+" ","field_value"));
texts.add(new StyledText("("+FeatureRegistry.DUNGEON_SCORE.getPercentage()+"% + secrets)\n","field_etc"));
texts.add(new StyledText("Time","field_name"));
texts.add(new StyledText(": ","field_separator"));
texts.add(new StyledText(scoreCalculation.getTime()+" ","field_value"));
texts.add(new StyledText("("+ TextUtils.formatTime(FeatureRegistry.DUNGEON_SBTIME.getTimeElapsed())+")\n","field_etc"));
texts.add(new StyledText("Bonus","field_name"));
texts.add(new StyledText(": ","field_separator"));
texts.add(new StyledText(scoreCalculation.getBonus()+"\n","field_value"));
return texts;
}
public List getStyles() {
return this.>getParameter("textStyles").getValue();
}
private Map stylesMap;
public Map getStylesMap() {
if (stylesMap == null) {
List styles = getStyles();
Map res = new HashMap();
for (TextStyle ts : styles) {
res.put(ts.getGroupName(), ts);
}
stylesMap = res;
}
return stylesMap;
}
@Override
public String getEditRoute(RootConfigPanel rootConfigPanel) {
ConfigPanelCreator.map.put("base." + getKey() , new Supplier() {
@Override
public MPanel get() {
MFeatureEdit featureEdit = new MFeatureEdit(FeatureWarningOnPortal.this, rootConfigPanel);
featureEdit.addParameterEdit("textStyles", new PanelTextParameterConfig(FeatureWarningOnPortal.this));
for (FeatureParameter parameter: getParameters()) {
if (parameter.getKey().equals("textStyles")) continue;
featureEdit.addParameterEdit(parameter.getKey(), new MParameterEdit(FeatureWarningOnPortal.this, parameter, rootConfigPanel));
}
return featureEdit;
}
});
return "base." + getKey() ;
}
}