diff --git a/core/src/main/assets/interfaces/icons.png b/core/src/main/assets/interfaces/icons.png index 9577abc0b..2ffc63cf9 100644 Binary files a/core/src/main/assets/interfaces/icons.png and b/core/src/main/assets/interfaces/icons.png differ diff --git a/core/src/main/assets/messages/scenes/scenes.properties b/core/src/main/assets/messages/scenes/scenes.properties index 0395a8155..a826f6acb 100644 --- a/core/src/main/assets/messages/scenes/scenes.properties +++ b/core/src/main/assets/messages/scenes/scenes.properties @@ -50,6 +50,16 @@ scenes.heroselectscene.title=Choose Your Hero scenes.heroselectscene.options=Game Options scenes.heroselectscene.custom_seed=Custom Seed scenes.heroselectscene.daily=Daily Run +scenes.heroselectscene.daily_desc=Every day a new game is available that is the same for everyone! This 'daily run' generates the same dungeon for every person who plays it (so long as they are also playing the same game version).\n\nYou can take as long as you like to complete a daily run, but can only have one active at a time. _Daily runs are not eligible for badges and have their own separate rankings page._\n\nWould you like to start today's daily with your currently selected hero and challenges? +scenes.heroselectscene.daily_yes=Yes +scenes.heroselectscene.daily_no=No +scenes.heroselectscene.daily_unavailable=A new daily run is available every day at midnight UTC +scenes.heroselectscene.daily_unavailable_long=It seems you've started a daily that's in the future! This can happen if you recently changed timezones, or if you changed your system clock. _Your next daily will be available in %d days._ +scenes.heroselectscene.daily_existing=You already have a daily run in progress. You must end that run before starting another daily. +scenes.heroselectscene.daily_seconds=%d Seconds +scenes.heroselectscene.daily_minutes=%d Minutes +scenes.heroselectscene.daily_hours=%d Hours +scenes.heroselectscene.daily_30_hours=30+ Hours scenes.heroselectscene.custom_seed_title=Enter a Custom Seed scenes.heroselectscene.custom_seed_desc=The same seed and game version always generate the same dungeon! Seeds are nine uppercase letters (e.g. ABC-DEF-GHI), but you can enter anything you want and the game will convert it. _Games with a custom seed cannot earn badges, contribute to games played, and appear at the bottom of the rankings page._ scenes.heroselectscene.custom_seed_duplicate=You already have a regular game in progress with that seed. You must end that game before using that custom seed. diff --git a/core/src/main/assets/messages/windows/windows.properties b/core/src/main/assets/messages/windows/windows.properties index 1a909c4ed..7752523f6 100644 --- a/core/src/main/assets/messages/windows/windows.properties +++ b/core/src/main/assets/messages/windows/windows.properties @@ -48,6 +48,7 @@ windows.wndgameinprogress.gold=Gold Collected windows.wndgameinprogress.depth=Maximum Depth windows.wndgameinprogress.dungeon_seed=Dungeon Seed windows.wndgameinprogress.custom_seed=_Custom Seed_ +windows.wndgameinprogress.daily_for=_Daily For_ windows.wndgameinprogress.continue=Continue windows.wndgameinprogress.erase=Erase windows.wndgameinprogress.erase_warn_title=Are you sure you want to delete this save? @@ -66,6 +67,7 @@ windows.wndhero$statstab.gold=Gold Collected windows.wndhero$statstab.depth=Maximum Depth windows.wndhero$statstab.dungeon_seed=Dungeon Seed windows.wndhero$statstab.custom_seed=_Custom Seed_ +windows.wndhero$statstab.daily_for=_Daily For_ windows.wndheroinfo.talents=talents windows.wndheroinfo.talents_msg=The hero gains one talent point each time they level up. Higher tier talents appear after defeating the second boss. @@ -163,6 +165,8 @@ windows.wndranking$statstab.duration=Game Duration windows.wndranking$statstab.depth=Maximum Depth windows.wndranking$statstab.ascent=Highest Ascent windows.wndranking$statstab.seed=Dungeon Seed +windows.wndranking$statstab.custom_seed=_Custom Seed_ +windows.wndranking$statstab.daily_for=_Daily For_ windows.wndranking$statstab.enemies=Mobs Killed windows.wndranking$statstab.gold=Gold Collected windows.wndranking$statstab.food=Food Eaten diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java index 123cf02e5..755326b56 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java @@ -82,8 +82,11 @@ import com.watabou.utils.Random; import com.watabou.utils.SparseArray; import java.io.IOException; +import java.text.DateFormat; import java.util.ArrayList; +import java.util.Date; import java.util.HashSet; +import java.util.TimeZone; public class Dungeon { @@ -182,6 +185,7 @@ public class Dungeon { public static int initialVersion; public static int version; + public static boolean daily; public static String customSeedText = ""; public static long seed; @@ -191,7 +195,12 @@ public class Dungeon { challenges = SPDSettings.challenges(); mobsToChampion = -1; - if (!SPDSettings.customSeed().isEmpty()){ + if (daily) { + seed = SPDSettings.lastDaily(); + DateFormat format = DateFormat.getDateInstance(); + format.setTimeZone(TimeZone.getTimeZone("UTC")); + customSeedText = format.format(new Date(seed)); + } else if (!SPDSettings.customSeed().isEmpty()){ customSeedText = SPDSettings.customSeed(); seed = DungeonSeed.convertFromText(customSeedText); } else { @@ -498,6 +507,7 @@ public class Dungeon { private static final String VERSION = "version"; private static final String SEED = "seed"; private static final String CUSTOM_SEED = "custom_seed"; + private static final String DAILY = "daily"; private static final String CHALLENGES = "challenges"; private static final String MOBS_TO_CHAMPION = "mobs_to_champion"; private static final String HERO = "hero"; @@ -521,6 +531,7 @@ public class Dungeon { bundle.put( VERSION, version = Game.versionCode ); bundle.put( SEED, seed ); bundle.put( CUSTOM_SEED, customSeedText ); + bundle.put( DAILY, daily ); bundle.put( CHALLENGES, challenges ); bundle.put( MOBS_TO_CHAMPION, mobsToChampion ); bundle.put( HERO, hero ); @@ -598,7 +609,7 @@ public class Dungeon { saveGame( GamesInProgress.curSlot ); saveLevel( GamesInProgress.curSlot ); - GamesInProgress.set( GamesInProgress.curSlot, depth, challenges, seed, customSeedText, hero ); + GamesInProgress.set( GamesInProgress.curSlot, depth, challenges, seed, customSeedText, daily, hero ); } } @@ -622,6 +633,7 @@ public class Dungeon { seed = bundle.contains( SEED ) ? bundle.getLong( SEED ) : DungeonSeed.randomSeed(); customSeedText = bundle.getString( CUSTOM_SEED ); + daily = bundle.getBoolean( DAILY ); Actor.clear(); Actor.restoreNextID( bundle ); @@ -756,6 +768,7 @@ public class Dungeon { info.challenges = bundle.getInt( CHALLENGES ); info.seed = bundle.getLong( SEED ); info.customSeed = bundle.getString( CUSTOM_SEED ); + info.daily = bundle.getBoolean( DAILY ); Hero.preview( info, bundle.getBundle( HERO ) ); Statistics.preview( info, bundle ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/GamesInProgress.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/GamesInProgress.java index b09eeb3c3..8fe82362d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/GamesInProgress.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/GamesInProgress.java @@ -126,7 +126,7 @@ public class GamesInProgress { } } - public static void set(int slot, int depth, int challenges, long seed, String customSeed, + public static void set(int slot, int depth, int challenges, long seed, String customSeed, boolean daily, Hero hero) { Info info = new Info(); info.slot = slot; @@ -136,6 +136,7 @@ public class GamesInProgress { info.seed = seed; info.customSeed = customSeed; + info.daily = daily; info.level = hero.lvl; info.str = hero.STR; @@ -171,6 +172,7 @@ public class GamesInProgress { public long seed; public String customSeed; + public boolean daily; public int level; public int str; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Rankings.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Rankings.java index 5edc7f424..fdfb49446 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Rankings.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Rankings.java @@ -64,6 +64,12 @@ public enum Rankings { public void submit( boolean win, Class cause ) { load(); + + //TODO need separate storage for daily data + //when loading data, make sure to check for latestDaily errors and correct + if (Dungeon.daily){ + return; + } Record rec = new Record(); @@ -185,13 +191,15 @@ public enum Rankings { return Statistics.totalScore; } - public static final String HERO = "hero"; - public static final String STATS = "stats"; - public static final String BADGES = "badges"; - public static final String HANDLERS = "handlers"; - public static final String CHALLENGES = "challenges"; + public static final String HERO = "hero"; + public static final String STATS = "stats"; + public static final String BADGES = "badges"; + public static final String HANDLERS = "handlers"; + public static final String CHALLENGES = "challenges"; public static final String GAME_VERSION = "game_version"; - public static final String SEED = "seed"; + public static final String SEED = "seed"; + public static final String CUSTOM_SEED = "custom_seed"; + public static final String DAILY = "daily"; public void saveGameData(Record rec){ rec.gameData = new Bundle(); @@ -248,6 +256,8 @@ public enum Rankings { rec.gameData.put( GAME_VERSION, Dungeon.initialVersion ); rec.gameData.put( SEED, Dungeon.seed ); + rec.gameData.put( CUSTOM_SEED, Dungeon.customSeedText ); + rec.gameData.put( DAILY, Dungeon.daily ); } public void loadGameData(Record rec){ @@ -284,8 +294,12 @@ public enum Rankings { if (rec.gameData.contains(SEED)){ Dungeon.seed = rec.gameData.getLong(SEED); + Dungeon.customSeedText = rec.gameData.getString(CUSTOM_SEED); + Dungeon.daily = rec.gameData.getBoolean(DAILY); } else { Dungeon.seed = -1; + Dungeon.customSeedText = ""; + Dungeon.daily = false; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDSettings.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDSettings.java index 4e4914c5a..605b4ae71 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDSettings.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDSettings.java @@ -181,6 +181,7 @@ public class SPDSettings extends GameSettings { public static final String KEY_LAST_CLASS = "last_class"; public static final String KEY_CHALLENGES = "challenges"; public static final String KEY_CUSTOM_SEED = "custom_seed"; + public static final String KEY_LAST_DAILY = "last_daily"; public static final String KEY_INTRO = "intro"; public static final String KEY_SUPPORT_NAGGED= "support_nagged"; @@ -217,6 +218,14 @@ public class SPDSettings extends GameSettings { return getString( KEY_CUSTOM_SEED, "", 20); } + public static void lastDaily( long value ){ + put( KEY_LAST_DAILY, value ); + } + + public static long lastDaily() { + return getLong( KEY_LAST_DAILY, 0); + } + public static void supportNagged( boolean value ) { put( KEY_SUPPORT_NAGGED, value ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/HeroSelectScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/HeroSelectScene.java index b189b3487..4b82a3475 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/HeroSelectScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/HeroSelectScene.java @@ -38,6 +38,7 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.Icons; import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; import com.shatteredpixel.shatteredpixeldungeon.ui.StyledButton; import com.shatteredpixel.shatteredpixeldungeon.ui.Window; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndOptions; import com.shatteredpixel.shatteredpixeldungeon.windows.WndTextInput; import com.shatteredpixel.shatteredpixeldungeon.utils.DungeonSeed; import com.shatteredpixel.shatteredpixeldungeon.windows.WndChallenges; @@ -420,8 +421,100 @@ public class HeroSelectScene extends PixelScene { buttons.add(seedButton); add(seedButton); - //TODO does nothing atm - StyledButton dailyButton = new StyledButton(Chrome.Type.BLANK, Messages.get(HeroSelectScene.class, "daily"), 6); + StyledButton dailyButton = new StyledButton(Chrome.Type.BLANK, Messages.get(HeroSelectScene.class, "daily"), 6){ + + private static final long SECOND = 1000; + private static final long MINUTE = 60 * SECOND; + private static final long HOUR = 60 * MINUTE; + private static final long DAY = 24 * HOUR; + + @Override + protected void onClick() { + super.onClick(); + + long diff = (SPDSettings.lastDaily() + DAY) - Game.realTime; + if (diff > 0){ + if (diff > 30*HOUR){ + ShatteredPixelDungeon.scene().addToFront(new WndMessage(Messages.get(HeroSelectScene.class, "daily_unavailable_long", (diff / DAY)+1))); + } else { + ShatteredPixelDungeon.scene().addToFront(new WndMessage(Messages.get(HeroSelectScene.class, "daily_unavailable"))); + } + return; + } + + for (GamesInProgress.Info game : GamesInProgress.checkAll()){ + if (game.daily){ + ShatteredPixelDungeon.scene().addToFront(new WndMessage(Messages.get(HeroSelectScene.class, "daily_existing"))); + return; + } + } + + Image icon = Icons.get(Icons.CALENDAR); + icon.hardlight(0.5f, 1f, 2f); + ShatteredPixelDungeon.scene().addToFront(new WndOptions( + icon, + Messages.get(HeroSelectScene.class, "daily"), + Messages.get(HeroSelectScene.class, "daily_desc"), + Messages.get(HeroSelectScene.class, "daily_yes"), + Messages.get(HeroSelectScene.class, "daily_no")){ + @Override + protected void onSelect(int index) { + if (index == 0){ + long time = Game.realTime - (Game.realTime % DAY); + + //earliest possible daily for v1.3.0 is June 20 2022 + //which is 19,163 days after Jan 1 1970 + time = Math.max(time, 19_163 * DAY); + + SPDSettings.lastDaily(time); + + Dungeon.hero = null; + Dungeon.daily = true; + ActionIndicator.action = null; + InterlevelScene.mode = InterlevelScene.Mode.DESCEND; + + Game.switchScene( InterlevelScene.class ); + } + } + }); + } + + private long timeToUpdate = 0; + + @Override + public void update() { + super.update(); + + if (Game.realTime > timeToUpdate){ + long diff = (SPDSettings.lastDaily() + DAY) - Game.realTime; + if (diff > 0){ + //<1 minute + if (diff < MINUTE){ + text(Messages.get(HeroSelectScene.class, "daily_seconds", (diff / SECOND)+1)); + timeToUpdate = Game.realTime + SECOND; + //<1 hour + } else if (diff < HOUR){ + text(Messages.get(HeroSelectScene.class, "daily_minutes", (diff / MINUTE)+1)); + timeToUpdate = Game.realTime + 5*SECOND; + //<30 hours (a few extra in case of timezone shenanigans) + } else if (diff < (DAY + 6*HOUR)) { + text(Messages.get(HeroSelectScene.class, "daily_hours", (diff / HOUR)+1)); + timeToUpdate = Game.realTime + 5*MINUTE; + //>30 hours, probably a cheater! + } else { + text(Messages.get(HeroSelectScene.class, "daily_30_hours")); + timeToUpdate = Game.realTime + 20*MINUTE; + } + textColor(0x888888); + } else { + text(Messages.get(HeroSelectScene.class, "daily")); + textColor(0xFFFFFF); + timeToUpdate = Long.MAX_VALUE; + } + } + + } + }; dailyButton.leftJustify = true; dailyButton.icon(Icons.get(Icons.CALENDAR)); add(dailyButton); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/StartScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/StartScene.java index 60211467c..f0bd4bfaa 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/StartScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/StartScene.java @@ -203,7 +203,9 @@ public class StartScene extends PixelScene { level.resetColor(); } - if (!info.customSeed.isEmpty()){ + if (info.daily){ + steps.hardlight(0.5f, 1f, 2f); + } else if (!info.customSeed.isEmpty()){ steps.hardlight(1f, 1.5f, 0.67f); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Icons.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Icons.java index 1edf85439..48eb5ca03 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Icons.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Icons.java @@ -303,28 +303,36 @@ public enum Icons { icon.frame( icon.texture.uvRectBySize( 40, 72, 8, 8 ) ); break; case DEPTH: - icon.frame( icon.texture.uvRectBySize( 48, 64 + (Dungeon.customSeedText.isEmpty() ? 0 : 8), 6, 7 ) ); + int ofs = Dungeon.daily ? 16 : (!Dungeon.customSeedText.isEmpty() ? 8 : 0); + icon.frame( icon.texture.uvRectBySize( 48, 64 + ofs, 6, 7 ) ); break; case DEPTH_CHASM: - icon.frame( icon.texture.uvRectBySize( 56, 64 + (Dungeon.customSeedText.isEmpty() ? 0 : 8), 7, 7 ) ); + ofs = Dungeon.daily ? 16 : (!Dungeon.customSeedText.isEmpty() ? 8 : 0); + icon.frame( icon.texture.uvRectBySize( 56, 64 + ofs, 7, 7 ) ); break; case DEPTH_WATER: - icon.frame( icon.texture.uvRectBySize( 64, 64 + (Dungeon.customSeedText.isEmpty() ? 0 : 8), 7, 7 ) ); + ofs = Dungeon.daily ? 16 : (!Dungeon.customSeedText.isEmpty() ? 8 : 0); + icon.frame( icon.texture.uvRectBySize( 64, 64 + ofs, 7, 7 ) ); break; case DEPTH_GRASS: - icon.frame( icon.texture.uvRectBySize( 72, 64 + (Dungeon.customSeedText.isEmpty() ? 0 : 8), 7, 7 ) ); + ofs = Dungeon.daily ? 16 : (!Dungeon.customSeedText.isEmpty() ? 8 : 0); + icon.frame( icon.texture.uvRectBySize( 72, 64 + ofs, 7, 7 ) ); break; case DEPTH_DARK: - icon.frame( icon.texture.uvRectBySize( 80, 64 + (Dungeon.customSeedText.isEmpty() ? 0 : 8), 7, 7 ) ); + ofs = Dungeon.daily ? 16 : (!Dungeon.customSeedText.isEmpty() ? 8 : 0); + icon.frame( icon.texture.uvRectBySize( 80, 64 + ofs, 7, 7 ) ); break; case DEPTH_LARGE: - icon.frame( icon.texture.uvRectBySize( 88, 64 + (Dungeon.customSeedText.isEmpty() ? 0 : 8), 7, 7 ) ); + ofs = Dungeon.daily ? 16 : (!Dungeon.customSeedText.isEmpty() ? 8 : 0); + icon.frame( icon.texture.uvRectBySize( 88, 64 + ofs, 7, 7 ) ); break; case DEPTH_TRAPS: - icon.frame( icon.texture.uvRectBySize( 96, 64 + (Dungeon.customSeedText.isEmpty() ? 0 : 8), 7, 7 ) ); + ofs = Dungeon.daily ? 16 : (!Dungeon.customSeedText.isEmpty() ? 8 : 0); + icon.frame( icon.texture.uvRectBySize( 96, 64 + ofs, 7, 7 ) ); break; case DEPTH_SECRETS: - icon.frame( icon.texture.uvRectBySize( 104, 64 + (Dungeon.customSeedText.isEmpty() ? 0 : 8), 7, 7 ) ); + ofs = Dungeon.daily ? 16 : (!Dungeon.customSeedText.isEmpty() ? 8 : 0); + icon.frame( icon.texture.uvRectBySize( 104, 64 + ofs, 7, 7 ) ); break; case CHAL_COUNT: icon.frame( icon.texture.uvRectBySize( 112, 64, 7, 7 ) ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGameInProgress.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGameInProgress.java index e3886f7d6..a7fb0a366 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGameInProgress.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGameInProgress.java @@ -103,7 +103,9 @@ public class WndGameInProgress extends Window { pos += GAP; statSlot( Messages.get(this, "gold"), info.goldCollected ); statSlot( Messages.get(this, "depth"), info.maxDepth ); - if (!info.customSeed.isEmpty()){ + if (info.daily) { + statSlot( Messages.get(this, "daily_for"), "_" + info.customSeed + "_" ); + } else if (!info.customSeed.isEmpty()){ statSlot( Messages.get(this, "custom_seed"), "_" + info.customSeed + "_" ); } else { statSlot( Messages.get(this, "dungeon_seed"), DungeonSeed.convertToCode(info.seed) ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndHero.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndHero.java index 3c3fb4a74..9c3ba958e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndHero.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndHero.java @@ -185,7 +185,9 @@ public class WndHero extends WndTabbed { statSlot( Messages.get(this, "gold"), Statistics.goldCollected ); statSlot( Messages.get(this, "depth"), Statistics.deepestFloor ); - if (!Dungeon.customSeedText.isEmpty()){ + if (Dungeon.daily){ + statSlot( Messages.get(this, "daily_for"), "_" + Dungeon.customSeedText + "_" ); + } else if (!Dungeon.customSeedText.isEmpty()){ statSlot( Messages.get(this, "custom_seed"), "_" + Dungeon.customSeedText + "_" ); } else { statSlot( Messages.get(this, "dungeon_seed"), DungeonSeed.convertToCode(Dungeon.seed) ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRanking.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRanking.java index 09841d030..6d9052fd6 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRanking.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRanking.java @@ -216,7 +216,13 @@ public class WndRanking extends WndTabbed { pos = statSlot(this, Messages.get(this, "ascent"), num.format(Statistics.highestAscent), pos); } if (Dungeon.seed != -1) { - pos = statSlot(this, Messages.get(this, "seed"), DungeonSeed.convertToCode(Dungeon.seed), pos); + if (Dungeon.daily){ + pos = statSlot(this, Messages.get(this, "daily_for"), "_" + DungeonSeed.convertToCode(Dungeon.seed) + "_", pos); + } else if (!Dungeon.customSeedText.isEmpty()){ + pos = statSlot(this, Messages.get(this, "custom_seed"), "_" + DungeonSeed.convertToCode(Dungeon.seed) + "_", pos); + } else { + pos = statSlot(this, Messages.get(this, "seed"), DungeonSeed.convertToCode(Dungeon.seed), pos); + } } else { pos += GAP + 5; }