diff --git a/build.gradle b/build.gradle index de5283bf8..6d0b75424 100644 --- a/build.gradle +++ b/build.gradle @@ -14,8 +14,8 @@ allprojects { appName = 'Shattered Pixel Dungeon' appPackageName = 'com.shatteredpixel.shatteredpixeldungeon' - appVersionCode = 668 - appVersionName = '1.4.3' + appVersionCode = 669 + appVersionName = '2.0.0-ALPHA-1' appJavaCompatibility = JavaVersion.VERSION_1_8 diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java index 23043d28a..9e1c32f7e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java @@ -78,7 +78,7 @@ public enum HeroClass { MAGE( HeroSubClass.BATTLEMAGE, HeroSubClass.WARLOCK ), ROGUE( HeroSubClass.ASSASSIN, HeroSubClass.FREERUNNER ), HUNTRESS( HeroSubClass.SNIPER, HeroSubClass.WARDEN ), - DUELIST( HeroSubClass.CHAMPION, HeroSubClass.MONK); + DUELIST( HeroSubClass.CHAMPION ); private HeroSubClass[] subClasses; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/WelcomeScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/WelcomeScene.java index 8126a4d45..7bd4781ca 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/WelcomeScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/WelcomeScene.java @@ -57,7 +57,7 @@ import java.util.Collections; public class WelcomeScene extends PixelScene { - private static final int LATEST_UPDATE = ShatteredPixelDungeon.v1_4_0; + private static final int LATEST_UPDATE = 668; //used so that the game does not keep showing the window forever if cleaning fails private static boolean triedCleaningTemp = false; @@ -205,6 +205,11 @@ public class WelcomeScene extends PixelScene { message += "\n" + Messages.get(this, "patch_translations"); } + + message = "Greeting Alpha testers, welcome to an early look at Shattered's new hero!\n\n" + + "Currently the entire Duelist base class is implemented, as well as one subclass and one armor ability. The Duelist's sprite and hero armor are also using placeholder visuals.\n\n" + + "Please let me know what you think! I'm going to try and add a second armor ability and fix any major issues before moving on to beta."; + } else { message = Messages.get(this, "what_msg"); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/v2_X_Changes.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/v2_X_Changes.java index 0cff1ca31..14d108a2d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/v2_X_Changes.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/v2_X_Changes.java @@ -21,13 +21,17 @@ package com.shatteredpixel.shatteredpixeldungeon.ui.changelist; +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroClass; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.ChangesScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; +import com.shatteredpixel.shatteredpixeldungeon.sprites.HeroSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.ui.Icons; import com.shatteredpixel.shatteredpixeldungeon.ui.Window; +import com.watabou.noosa.Image; import java.util.ArrayList; @@ -51,7 +55,7 @@ public class v2_X_Changes { //TODO public static void add_v2_0_Changes( ArrayList changeInfos ) { - ChangeInfo changes = new ChangeInfo("v2.0-BETA", true, ""); + ChangeInfo changes = new ChangeInfo("v2.0-ALPHA", true, ""); changes.hardlight(Window.TITLE_COLOR); changeInfos.add(changes); @@ -59,24 +63,233 @@ public class v2_X_Changes { changes.hardlight(Window.TITLE_COLOR); changeInfos.add(changes); - changes.addButton( new ChangeButton(Icons.get(Icons.SHPX), "Developer Commentary", - "_-_ Released October 4th, 2022\n" + - "_-_ 90 days after Shattered v1.3.0\n" + + changes.addButton( new ChangeButton(Icons.get(Icons.SHPX), "To-Do", + "While v2.0.0 has made it to alpha, there's still a fair bit of work to do! here's roughly what I have planned:\n\n" + + "Before Beta:\n" + + "_-_ Implement the Elemental Strike ability\n" + + "_-_ Substantially improve the Duelist's spritework. She needs hair!\n" + + "_-_ Fix any critical bugs or balance issues\n\n" + + "Before Release:\n" + + "_-_ Implement the Monk subclass\n" + + "_-_ Implement the 3rd armor ability\n" + + "_-_ Finish up Duelist visuals and any other small adjustments\n" + + "_-_ Fix any major bugs or balance issues")); + + changes.addButton(new ChangeButton(HeroSprite.avatar(HeroClass.DUELIST, 1), HeroClass.DUELIST.title(), + "_Shattered Pixel Dungeon has a new playable character!!_\n" + "\n" + - "Dev commentary will be added here in the future.")); + "The Duelist is an entire new hero class, _with a unique ability for every weapon in the game!_ She can be unlocked by earning a simple badge for equipping a T2 or higher weapon without a strength penalty. However, for the Beta she is unlocked by default!\n" + + "\n" + + "I want the Duelist to provide more interesting gameplay options for melee weapon focused builds, that have previously been fairly plain and simple compared to builds using other items.")); + + changes.addButton(new ChangeButton(HeroSprite.avatar(HeroClass.DUELIST, 4), "Duelist Subclasses", + "_The Duelist has two subclasses, with 3 more talents each!_\n" + + "\n" + + "_The Champion_ is a master of melee weapons who can equip a secondary weapon in addition to her primary one!\n" + + "\n" + + "_The Monk_ is a master of psychical technique, _but has not been finished yet._ Look out for the second subclass very soon!")); + + changes.addButton(new ChangeButton(HeroSprite.avatar(HeroClass.DUELIST, 6), "Duelist Armor Abilities", + "_The Duelist has three lategame armor abilities, with 3 more talents each!_\n" + + "\n" + + "_Challenge_ compels an enemy to fight the Duelist while all other enemies are temporarily frozen in time.\n" + + "\n" + + "_Elemental Strike_ produces a special effect that is based on the Duelist's weapon enchantment. _This ability has not been finished yet,_ look out for it very soon!\n" + + "\n" + + "_A third armor ability will be added before release!_")); changes = new ChangeInfo(Messages.get(ChangesScene.class, "changes"), false, null); changes.hardlight(CharSprite.WARNING); changeInfos.add(changes); + changes.addButton(new ChangeButton(Icons.get(Icons.STAIRS), "Ascension Challenge", + "I'm making a few adjustments to the ascension challenge to slightly increase the difficulty of some regions, while also reducing the pressure to kill enemies a little bit:\n" + + "\n" + + "_-_ Enemies to kill per floor reduced to 2 from 2.5. Thresholds for all amulet debuff effects adjusted to compensate\n" + + "\n" + + "_- Ripper demon_ spawn rate increased if player is ascending\n" + + "\n" + + "_- Monk & Warlock_ stat boost up to 1.5x from 1.33x\n" + + "_- Elemental & Ghoul_ stat boost up to 1.67x from 1.5x\n" + + "\n" + + "_- Crab & Slime_ stat boost up to 8x from 6x\n" + + "_- Swarm_ stat boost up to 8.5x from 6.5x\n" + + "_- Gnoll & Snake_ stat boost up to 9x from 7x\n" + + "_- Rat_ stat boost up to 10x from 8x")); + + changes.addButton(new ChangeButton(Icons.get(Icons.PREFS), Messages.get(ChangesScene.class, "misc") + " 1", + "_Highlights:_\n" + + "_-_ The game now remembers if the player removes the waterskin from their quickslot right after starting a run\n" + + "_-_ The damage warning vfx now always interrupts the hero, regardless of any other factors\n" + + "_-_ The deadly misstep badge can now also be unlocked with disintegration traps\n" + + "_-_ Added metamorphosis effects to the two remaining talents that previously couldn't be gained by metamorphosis\n" + + "_-_ Desktop users can now toggle fullscreen with right-alt + enter\n" + + "_-_ Added a setting to enable/disable playing music in background on desktop\n" + + "\n" + + "_Hero, Allies, & Enemies:_\n" + + "_-_ The hero can now also self-trample plants, in addition to grass\n" + + "_-_ Ripper demons will now try to leap even if their destination is blocked by terrain\n" + + "_-_ Knockback effects now round up after being halved vs. bosses")); + + changes.addButton(new ChangeButton(Icons.get(Icons.PREFS), Messages.get(ChangesScene.class, "misc") + " 2", + "_Effects:_\n" + + "_-_ Backup barrier now triggers before wand zaps fully resolve\n" + + "\n" + + "_Levelgen:_\n" + + "_-_ Adjusted the layout of sacrifice rooms to provide some cover from ranged enemies\n" + + "_-_ Secret rooms now never affect the generation of items in other rooms\n" + + "\n" + + "_Items:_\n" + + "_-_ Several artifacts now cancel invisibility when used\n" + + "_-_ Items no longer spawn on pitfall traps\n" + + "_-_ Ritual candles now light if they are placed correctly\n" + + "_-_ Item selectors now always open the main backpack if their preferred bag isn't present\n" + + "\n" + + "_Misc:_\n" + + "_-_ Updated the icons for several talents\n" + + "_-_ Healing no longer interrupts resting when HP is already full\n" + + "_-_ Updated various code libraries")); + + changes.addButton(new ChangeButton(new Image(Assets.Sprites.SPINNER, 144, 0, 16, 16), Messages.get(ChangesScene.class, "bugfixes") + " 1", + "Fixed the following bugs:\n" + + "\n" + + "_Highlights:_\n" + + "_-_ Softlocks caused by the warden using fadeleaf just as they start a boss fight\n" + + "_-_ Particle effects failing to appear in a bunch of rare cases\n" + + "_-_ AOE from gladiator's crush move invalidating Dwarf King's 'no weapons' badge\n" + + "_-_ Magic resistance being extremely effective against Grim traps at low HP\n" + + "_-_ Allies spawned by some armor abilities getting boosted stats during ascension\n" + + "\n" + + "_Effects:_\n" + + "_-_ Lethal momentum not triggering on kills made via enchantment\n" + + "_-_ Teleportation effects not being blocked by magic immunity\n" + + "_-_ Barkskin not reducing damage from things like bombs or the chalice of blood\n" + + "_-_ Magical fire not clearing regular fire if they are on the same tile\n" + + "_-_ Gladiator being able to riposte enemies who charmed him\n" + + "_-_ Iron Stomach talent cancelling fall damage in rare cases\n" + + "_-_ Time freeze causing various odd behaviour when triggering plants and traps\n" + + "_-_ Rare cases of earthroot armor and hold fast working after movement")); + + changes.addButton(new ChangeButton(new Image(Assets.Sprites.SPINNER, 144, 0, 16, 16), Messages.get(ChangesScene.class, "bugfixes") + " 2", + "_Items:_\n" + + "_-_ One upgrade being lost when transferring class armor with a warrior's seal attached\n" + + "_-_ Leftover darts being lost in rare cases when tipped darts have bonus durability\n" + + "_-_ Transmuting a dried rose deleting any items held by the ghost\n" + + "_-_ Alchemist's Toolkit not triggering the enhanced rings talent\n" + + "_-_ Wand of fireblast rarely shooting great distances\n" + + "_-_ Horn of plenty benefiting from artifact recharging much more than intended\n" + + "_-_ Magic immunity not blocking use of shield battery, cursed artifact effects, or wand recharging\n" + + "_-_ Cursed items still blocking equipment slots when lost via ankh revive\n" + + "_-_ Antimagic not reducing damage from enchantments\n" + + "_-_ Rare cases where cloak of shadows wouldn't spend a charge on activation\n" + + "_-_ Disarming traps rarely teleporting weapons into chests or graves\n" + + "_-_ Blacksmith failing to take his pickaxe back in rare cases\n" + + "_-_ Various rare errors with blacksmith reforging and resin boosted wands")); + + changes.addButton(new ChangeButton(new Image(Assets.Sprites.SPINNER, 144, 0, 16, 16), Messages.get(ChangesScene.class, "bugfixes") + " 3", + "_Allies & Enemies:_\n" + + "_-_ Rare cases of hero stacking onto enemies when trying to swap positions with an ally\n" + + "_-_ DM-300 not using abilities in its first phase in specific situations\n" + + "_-_ DM-201s rarely lobbing grenades through closed doors\n" + + "_-_ DM-300's rockfall attack very rarely having no delay\n" + + "_-_ Several on-kill effects incorrectly triggering when ghouls get downed, but not killed\n" + + "_-_ Soiled fist being able to see through shrouding fog\n" + + "_-_ Rare cases where the Imp's shop could appear without completing his quest\n" + + "_-_ Gladiator not gaining combo from attacking hiding mimics\n" + + "_-_ Demon spawners rapidly spawning ripper demons in very specific cases\n" + + "_-_ Rare cases where enemies couldn't be surprise attacked when in combat with allies\n" + + "_-_ Various rare errors with shock elemental electricity damage\n" + + "_-_ Evil eyes only resisting some disintegration effects\n" + + "_-_ Several rare issues with spinner web shooting\n" + + "_-_ Very rare cases where surprise attacks on mimics would fail\n" + + "_-_ Very rare pathfinding bugs with flying enemies")); + + changes.addButton(new ChangeButton(new Image(Assets.Sprites.SPINNER, 144, 0, 16, 16), Messages.get(ChangesScene.class, "bugfixes") + " 4", + "_UI/VFX:_\n" + + "_-_ Various minor audiovisual errors\n" + + "_-_ Various minor textual errors\n" + + "_-_ 'i' being incorrectly uppercased to 'I' in Turkish\n" + + "_-_ Auras from champion enemies being visible in the fog of war for one frame\n" + + "_-_ Very rare cases where Goo attack particles behaved incorrectly\n" + + "_-_ Damage warn vfx not accounting for hunger ignoring shielding\n" + + "_-_ Cases where very fast heroes would cause landmarks to not be recorded\n" + + "_-_ No error message being given when the mage uses elemental blast without a staff")); + changes = new ChangeInfo(Messages.get(ChangesScene.class, "buffs"), false, null); changes.hardlight(CharSprite.POSITIVE); changeInfos.add(changes); + changes.addButton( new ChangeButton(new ItemSprite(ItemSpriteSheet.RING_TOPAZ), "Item Buffs", + "I'm making several buffs to various items that could be performing a little better:\n" + + "\n" + + "_- Ring of Energy_ now also applies a recharging boost to hero armor abilities. All the boosts it gives are now standardized to +15%.\n" + + "_- Ring of Arcana_ enchantment boost up to +17.5% per level, from +15%\n" + + "\n" + + "_- Glyph of Repulsion_ now only knocks back enemies who are adjacent to the hero. This should make it slightly better versus ranged enemies.\n" + + "_- Glyph of Flow_ now grants +50% movespeed in water per level, up from +25%\n" + + "\n" + + "_- Horn of Plenty_ now gains 2 levels from being fed a pasty, up from 1.5\n" + + "_- Horn of Plenty_ now gains 4 levels from being fed a meat pie, up from 3")); + + changes.addButton( new ChangeButton(HeroSprite.avatar(HeroClass.MAGE, 6), "Hero Buffs", + "A couple buffs to the two worst performing armor abilities/talents:\n" + + "\n" + + "_- Shrug it Off_ now just directly boosts the damage resistance from endure to 60/68/74/80%, instead of reducing max damage taken\n" + + "\n" + + "_- Wild Magic_ now spends 0.5 wand charges at base. Conserved magic can reduce this to 0.1\n" + + "\n" + + "I expect the next update will include more hero balance changes, after the dust settles from the Duelist.")); + changes = new ChangeInfo(Messages.get(ChangesScene.class, "nerfs"), false, null); changes.hardlight(CharSprite.NEGATIVE); changeInfos.add(changes); + changes.addButton( new ChangeButton(new ItemSprite(ItemSpriteSheet.ROUND_SHIELD), "Major Item Nerfs", + "I'm also making several significant nerfs to items with standout winrates this update:\n" + + "\n" + + "_- Round Shield_ blocking per level reduced to 0-1 from 0-2, base damage increased to 3-12 from 3-10\n" + + "_- Greatshield_ blocking per level reduced to 0-2 from 0-3, base damage increased to 5-18 from 5-15\n" + + "\n" + + "_Wand of Corruption:_\n" + + "_-_ Corrupted enemies now die over 100 turns, down from 200\n" + + "_-_ Doomed bosses now take +67% damage, down from +100%\n" + + "_-_ Battlemage corruption on-hit base proc rate reduced to 1/6 from 1/4\n" + + "\n" + + "_Wand of Regrowth:_\n" + + "_-_ Base charge limit increased to 20 from 8\n" + + "_-_ Charge limit scaling substantially reduced at wand levels 4 to 9.\n" + + "\n" + + "_Chalice of Blood:_\n" + + "_-_ Prick damage increased by 5 at all levels\n" + + "_-_ Now grants 1.15x-5x healing, down from 0x-10x\n" + + "\n" + + "_- Ethereal chains_ charge from gaining exp reduced by 40%")); + + changes.addButton( new ChangeButton(new ItemSprite(ItemSpriteSheet.RING_RUBY), "Smaller Item Nerfs", + "There are also some more minor nerfs to items that are just doing a bit too well:\n" + + "\n" + + "_- Ring of Furor_ attack speed boost per level down to 9.05% from 10.5%\n" + + "_- Ring of Evasion_ dodge boost per level down to 12.5% from 15%\n" + + "\n" + + "_- Blocking_ enchantment now grants 2+item level shielding, down from max HP/10\n" + + "\n" + + "_- Timekeeper's Hourglass_ sand bag cost up to 30 from 20\n" + + "_- Alchemist's Toolkit_ now requires 6 energy per level, up from 5\n" + + "\n" + + "_- Wand of Fireblast_ base damage reduced to 1-2 from 1-6 when spending 1 charge, and 2-8 from 2-12 when spending 2 charges. This is to offset the relatively high amount of DOT the wand deals at low levels.")); + + changes.addButton( new ChangeButton(HeroSprite.avatar(HeroClass.ROGUE, 6), "Hero Nerfs", + "T1 Talents:\n" + + "_-_ Warrior's T1 ID talent renamed from _Armsmaster's Intuition_ to _Veteran's Intuition_. The talent now focuses more on armor, to contrast with the Duelist.\n" + + "\n" + + "Armor Abilities:\n" + + "_- Heroic Energy_ lightly nerfed to 12/23/32/40% charge speed boost, from 13/24/34/43%\n" + + "\n" + + "_- Double Jump_ charge cost reduction down to 16/30/41/50%, from 20/36/50/60%\n" + + "\n" + + "_- Smoke Bomb_ range down to 6 from 10\n" + + "_- Shadow Step_ charge cost reduction down to 16/30/41/50%, from 20/36/50/60%")); + } }