diff --git a/android/build.gradle b/android/build.gradle index 9df936213..cf0696e47 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -84,6 +84,7 @@ dependencies { // https://firebase.google.com/docs/android/setup#available-libraries + //noinspection GradleDependency implementation "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86" diff --git a/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidGame.java b/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidGame.java index 978ceaeca..a263a864b 100644 --- a/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidGame.java +++ b/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidGame.java @@ -50,7 +50,7 @@ public class AndroidGame extends AndroidApplication { public static AndroidApplication instance; private FirebaseAnalytics mFirebaseAnalytics; private static AndroidPlatformSupport support; - + @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -88,11 +88,11 @@ public class AndroidGame extends AndroidApplication { //UCEHandler.Builder builder = new UCEHandler.Builder(this); //builder.build(); + mFirebaseAnalytics = FirebaseAnalytics.getInstance(this); - if (SPDSettings.firebase()){ - FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true); - } + FirebaseCrashlytics.getInstance().setUserId(SPDSettings.customSeed()); + FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true); } else { @@ -101,20 +101,21 @@ public class AndroidGame extends AndroidApplication { //set desired orientation (if it exists) before initializing the app. if (SPDSettings.landscape() != null) { - instance.setRequestedOrientation( SPDSettings.landscape() ? + instance.setRequestedOrientation(Boolean.TRUE.equals(SPDSettings.landscape()) ? ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE : ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT ); } AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); config.depth = 0; - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) { - //use rgb565 on ICS devices for better performance - config.r = 5; - config.g = 6; - config.b = 5; - } - + +// if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) { +// //use rgb565 on ICS devices for better performance +// config.r = 5; +// config.g = 6; +// config.b = 5; +// } + config.useCompass = false; config.useAccelerometer = false; diff --git a/build.gradle b/build.gradle index 4efcf8421..cd2b3fc1c 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ allprojects { appPackageName = 'com.ansdomagiclingpixeldungeon.ling' appVersionCode =700720 - appVersionName = '0.6.0.0-Beta21-p1' + appVersionName = '0.6.0.0-Beta21-p2' appJavaCompatibility = JavaVersion.VERSION_1_8 diff --git a/core/src/main/assets/interfaces/badges.png b/core/src/main/assets/interfaces/badges.png index 0b9410bf7..41c0763ab 100644 Binary files a/core/src/main/assets/interfaces/badges.png and b/core/src/main/assets/interfaces/badges.png differ diff --git a/core/src/main/assets/messages/actors/actors.properties b/core/src/main/assets/messages/actors/actors.properties index 602f2e0af..bf4d3406e 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -294,6 +294,8 @@ actors.mobs.dimandking$dkmonk.rankings_desc=被钻石宝箱王说教至死 actors.mobs.dimandking$dkwarlock.rankings_desc=被钻石宝箱王说教至死 actors.mobs.dimandking.str_empower=认真模式开启! +actors.mobs.dimandking.wrning=钻石宝箱王:正在蓄力死亡射线,标记了一处地点…… + actors.mobs.redlunar.name=死灵大师 actors.mobs.redlunar.desc=那些回忆花重金雇的保镖,你看来已经引起了他的注意。 actors.mobs.redlunar.notice=0元购? diff --git a/core/src/main/assets/messages/items/items.properties b/core/src/main/assets/messages/items/items.properties index 9edccabcb..6e5100279 100644 --- a/core/src/main/assets/messages/items/items.properties +++ b/core/src/main/assets/messages/items/items.properties @@ -1,6 +1,6 @@ ###MLPD -items.artifacts.goldiron.name=镀金铁砧 -items.artifacts.goldiron.desc=待补充 +items.artifacts.goldiron.name=镀金铁锤 +items.artifacts.goldiron.desc=这曾是巨魔铁匠的锤子,其中蕴含了神奇的力量。\n\n因为你一不小心把巨魔镐子给搞丢了,巨魔委托你去杀死他的阴暗面。\n\n如今,你已完成巨魔的委托,这镀金铁锤便是巨魔给予你的礼物…… items.bombs.laserpython.name=激光十字晶柱召唤器 items.bombs.laserpython.desc=这枚召唤器会在爆炸后立刻生成一个十字晶柱。 @@ -80,24 +80,15 @@ items.quest.shopdiedbook.name=诅咒之书 items.quest.shopdiedbook.chill=这层的警报已经拉响,离开这里,快! items.quest.shopdiedbook.desc=当你准备抢劫的时候,商人向你丢了一本书,这本书蕴含了Γ诅咒的力量Γ的魔力,你无力将其扔掉,源源不断的Γ商人守卫军队Γ正在前来。你只能战斗!!!\n\n诅咒之书在身上时,英雄将受到Γ移速减缓一半,同时商店守卫军队将源源不断的出兵Γ来阻止你,你也无法离开本层。唯有击败Γ本层商店守卫首领Γ之后,才能解除诅咒之书的力量,获得店主的认可。\n\n_但同时,店主会因为缺货问题在下一大层无法开设商店,将在下下一大层重新恢复商店交易。_ -items.quest.skeletongold.name=染血骷髅金币 -items.quest.skeletongold.desc=在寒冰圣域发现的一枚刻有骷髅头的金币,沾染的血渍让这枚金币附着了能改变时空的魔力。抛动金币以扰动地牢的魔力流。 -items.quest.skeletongold.ac_select_one=Δ抛动一次金币Δ -items.quest.skeletongold.ac_select_two=Π抛动两次金币Π -items.quest.skeletongold.ac_select_three=Ξ抛动三次金币Ξ -items.quest.skeletongold.ac_select_how=使用方法和介绍 -items.quest.skeletongold.preventing=这里还没有寻找到强大的魔力流…… -items.quest.skeletongold.wow=染血金币发出诡异的光芒,你感到下层正在分崩离析…… - items.weapon.melee.endingblade.name=终焉 items.weapon.melee.endingblade.desc=不知道从哪来的一个拆开的场记板,貌似沾染了焰之诅咒,会随机产生_一种诅咒_,有着强大的侵蚀能力,一旦装备了它就无法脱身了……\n\n这个武器在攻击敌人的时候能吸收一定的浊焰能量,在汲取一定的浊焰能量后会产生新的能力以及自我升级。\n\n当前的浊焰能量: -items.weapon.melee.endingblade.desc_2=\n\n死亡宣告当前冷却值为: +items.weapon.melee.endingblade.desc_2=\n\n(通过打击敌人减掉)死亡宣告当前冷却值为: items.weapon.melee.endingblade.cursed=当你装备上这个武器后,一股无形的力量将你束缚住…… items.weapon.melee.endingblade.donot_eqip=终焉的诅咒已经浸染你的身体,你无力脱下它。 - +items.weapon.melee.endingblade.procced=终焉:审判一切,归于虚无!!! items.weapon.melee.endingblade.ac_lastcrystal=Γ激光晶柱Γ items.weapon.melee.endingblade.ac_diedghost=✦死亡宣告✦ -items.weapon.melee.endingblade.ac_healreset=_亡者归来_ +items.weapon.melee.endingblade.ac_healreset=_千里追魂_ #MLPDSTOREYBOOKS @@ -2021,6 +2012,11 @@ items.amulet.ac_end=返回主城 items.amulet.rankings_desc=获得水晶之心,而危机仍在 items.amulet.desc=击败了古神后,你发现了水晶之心。但是,前面不再有前进的道路了。莫非,本次旅程已经宣告结束了吗? +items.jamulet.name=水晶之心 +items.jamulet.ac_end=返回主城 +items.jamulet.rankings_desc=获得水晶之心,而危机仍在 +items.jamulet.desc=击败了古神后,你发现了水晶之心。但是,前面不再有前进的道路了。莫非,本次旅程已经宣告结束了吗? + items.ankh.name=重生十字架 items.ankh.ac_bless=祝福 items.ankh.bless=你用散发着治愈魔力的清水祝福了这枚重生十字架。 diff --git a/core/src/main/assets/messages/misc/misc.properties b/core/src/main/assets/messages/misc/misc.properties index ae55723ca..164699683 100644 --- a/core/src/main/assets/messages/misc/misc.properties +++ b/core/src/main/assets/messages/misc/misc.properties @@ -69,7 +69,9 @@ badges$badge.godd_make=老人与海\n累计完成老杖匠的全部任务\n\n_ badges$badge.clear_water=净化大师\n完成挑战:污泥浊水\n\n_奖励:敬请期待_ badges$badge.ghostdage=幽灵大哥\n_在幽灵处获得一次+4品质武器或护甲\n\n_(镀层需求:+5品质武器) -//badges$badge.ghostdage=幽灵大哥\n在幽灵处获得一次_+5_品质武器或护甲\n\nΞ你已成功镀层Ξ +badges$badge.dageto=幽灵大哥\n在幽灵处获得一次_+5_品质武器或护甲\n\nΞ你已成功镀层Ξ + +badges$badge.endied=终焉之旅\n\n_(获得终焉)_ badges$badge.halofire_died=死于磷火烈焰 badges$badge.happy_end=幸福结局 @@ -116,10 +118,10 @@ challenges.champion_enemies_desc=会升级的不止你一个!\n\n・普通敌 的机率拥有特殊的精英属性。\n・精英敌人刷出时会立即醒来。\n・精英敌人免疫腐化效果。\n\n精英敌人有七种:\n_烈焰(橙色):_ 近战伤害 \ +25% 且带有点燃效果,免疫火焰,死亡时引燃周围。\n_索敌(紫色):_ 近战伤害 +25%,近战范围 +8。\n_敌法(绿色):_ 受到伤害 -25%,拥有魔法免疫。\n_巨型(蓝色):_ 受到伤害 -75%,近战范围 +1,无法进入门与过道。\n_祝福(黄色):_ 精准与躲避 +200%。\n_成长(红色):_ 精准、躲避、攻击伤害与有效生命值 +20%。每过 3 回合会再增长 1%。\n_鬼磷(天蓝色):_ 近战伤害 +65% 且带有磷火效果,免疫火焰与磷火,死亡时引燃周围。 challenges.stronger_bosses=Π梦魇Boss -challenges.stronger_bosses_desc=这项挑战让挑战 Boss 变得更有挑战性了!\n\n_粘咕:_生命值 +20%\n_-_ 水中恢复量增长,每回合恢复 6 点生命\n_-_ 爆发攻击蓄力时间由 2 回合缩短至 1 回合\n_天狗:_生命 +25%\n_-_ 第一阶段:陷阱更加致命\n_-_ 第二阶段:技能频率更高\n_DM-300:_生命 +60%\n_-_ 能量塔更坚固。\n_-_ 技能频率更高,威力也更强大\n_-_ 超载时移动速度更高\n_-_ 击败时必掉落荆棘斗篷\n_矮人国王:_生命 +50%\n_-_ 整场战斗内召唤的随从都更强大\n_-_ 第一阶段:技能与召唤频率都更高\n_-_ 第二阶段:每轮额外召唤两个随从\n_-_ 第三阶段:生命值 +100%,召唤频率更高\n_Yog-Dzewa:_\n_-_ 同时召唤两个古神之拳!\n_-_ 激光攻击伤害 +60%\n_-_ 召唤更强大的随从 +challenges.stronger_bosses_desc=这项挑战让挑战 Boss 变得更有挑战性了!\n\n_粘咕:_生命值 +20%\n_-_ 水中恢复量增长,每回合恢复 3 点生命\n_-_ 爆发攻击蓄力时间由 2 回合缩短至 1 回合\n_天狗:_生命 +25%\n_-_ 第一阶段:陷阱更加致命\n_-_ 第二阶段:技能频率更高\n_钻石宝箱王_: 生命+20% \n_-_ 整场战斗出现额外技能\n_DM-300:_生命 +60%\n_-_ 能量塔更坚固。\n_-_ 技能频率更高,威力也更强大\n_-_ 超载时移动速度更高\n_-_ 击败时必掉落荆棘斗篷\n_矮人国王:_生命 +50%\n_-_ 整场战斗内召唤的随从都更强大\n_-_ 第一阶段:技能与召唤频率都更高\n_-_ 第二阶段:每轮额外召唤两个随从\n_-_ 第三阶段:生命值 +100%,召唤频率更高\n_Yog-Dzewa:_\n_-_ 同时召唤两个古神之拳!\n_-_ 激光攻击伤害 +60%\n_-_ 召唤更强大的随从 actors.char.aquaphobia=你受到了来自水的伤害! challenges.pro=Δ开发者模式Δ -challenges.pro_desc=注解版?\n开局_几乎是全物品_!同时,你将无法通关! +challenges.pro_desc=供测试和开发使用\n开局_几乎是全物品_!同时,你将无法通关!也无法记录在排行榜上面。 challenges.traditional = 现实之声-T1挑战 challenges.hard = 梦境之声-T2挑战 challenges.warning = 寻觅之声-T3挑战 @@ -143,5 +145,5 @@ dlc.bossrush_desc=被你击败过多次的首领们熟识了英雄的技能, dlc.back_go=逆流而上 dlc.back_go_desc=颠倒的一次的冒险,你能顺利离开这里吗?5大固定Boss则是在最终楼层出现。 -ld=\n_冰雪魔女:_\n_-_生命+25%\n_-_ 水中召唤的仆从更多\n-击败时必定掉落紫金宝石护符\n_矮人大师:_\n_-_ 致命技能更加频繁\n_-_ 生命值+50%\n-击败时必定掉落自然神圣护符\n_史莱姆王:_\n_-_ 生命值+100%\n_-_ 伤害更高,速度更快\n_-_ 在开局额外召唤豺狼诡术师,巨钳螃蟹,腐臭老鼠,蚀化史莱姆\n_-_ 击败时必定掉落凝胶手套\n_DM720:_\n_-_ 获得全新技能\n_-_ 击败时必定掉落DM150控制终端[尚未完成] +kill=\n_冰雪魔女:_\n_-_生命+25%\n_-_ 水中召唤的仆从更多\n-击败时必定掉落紫金宝石护符\n_矮人大师:_\n_-_ 致命技能更加频繁\n_-_ 生命值+50%\n-击败时必定掉落自然神圣护符\n_史莱姆王:_\n_-_ 生命值+100%\n_-_ 伤害更高,速度更快\n_-_ 在开局额外召唤豺狼诡术师,巨钳螃蟹,腐臭老鼠,蚀化史莱姆\n_-_ 击败时必定掉落凝胶手套\n_DM720:_\n_-_ 获得全新技能\n_-_ 击败时必定掉落DM150控制终端[尚未完成] diff --git a/core/src/main/assets/messages/ui/ui.properties b/core/src/main/assets/messages/ui/ui.properties index 8f502c634..0a5eacc80 100644 --- a/core/src/main/assets/messages/ui/ui.properties +++ b/core/src/main/assets/messages/ui/ui.properties @@ -465,4 +465,6 @@ ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x26=-1.修复了影子盗贼的崩溃 ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x28=-1.修复了矮人大师的问题\n-2.修复了部分楼层的错误生成 ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x29=-1.修复了不抢劫回归地牢也能获得东西的问题\n-2.修复了从雪凛峡谷回来后复活失效的问题 + +ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x30=-1.修复了浊焰魔女的错误崩溃\n-2.修复了终焉的错误生成\n-3.红龙之王机制改变,老存档已无法加载,请重新开启新档 //ui.changelist.mlpd.vm0_5_x_changes.xxx// \ No newline at end of file diff --git a/core/src/main/assets/messages/windows/windows.properties b/core/src/main/assets/messages/windows/windows.properties index 6de9bc51f..4c1fe9df2 100644 --- a/core/src/main/assets/messages/windows/windows.properties +++ b/core/src/main/assets/messages/windows/windows.properties @@ -2,6 +2,13 @@ windows.textchallenges.seed_custom_title = 种子 windows.textchallenges.hint = 不输入即为随机种子 windows.textchallenges.delete_seed_input = 清除 +windows.wndtextinput.enter_key=输入你的QQ号 +windows.wndgame.dialog_user=为了更好的在后续崩溃维护检查遇到一些问题,请在这里Ξ输入你的QQ号Ξ,如果开发者遇到问题将可能通过你的ID联系你询问详细崩溃情况。 +windows.wndtextinput.yes=确认 +windows.wndtextinput.no=稍后 + +windows.wndsettings$helptab.reset=重设你的用户ID + windows.wndsettings$helptab.title=辅助功能 windows.wndsettings$helptab.helpsettings=启用物品生成查询器 diff --git a/core/src/main/assets/music/Level4.ogg b/core/src/main/assets/music/Level4.ogg index 2547075b4..e38fb26b5 100644 Binary files a/core/src/main/assets/music/Level4.ogg and b/core/src/main/assets/music/Level4.ogg differ diff --git a/core/src/main/assets/music/nbpl.ogg b/core/src/main/assets/music/nbpl.ogg new file mode 100644 index 000000000..f03b1dd36 Binary files /dev/null and b/core/src/main/assets/music/nbpl.ogg differ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java index a450f7a47..35761f191 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java @@ -110,6 +110,7 @@ public class Badges { GODD_MAKE ( 82 ), CLEAR_WATER ( 83 ), GHOSTDAGE ( 84 ), + ENDIED ( 85 ), //gold PIRANHAS ( 64 ), //these names are a bit outdated, but it doesn't really matter. @@ -165,6 +166,7 @@ public class Badges { CHAMPION_4X ( 115 ), CHAMPION_5X ( 116 ), NYZ_SHOP ( 117 ), + DAGETO ( 118 ), //rudy FIREGIRL ( 128 ), @@ -380,6 +382,21 @@ public class Badges { displayBadge( badge ); } + public static void GhostDageCollected() { + Badge badge = null; + + if (!local.contains( Badge.GHOSTDAGE ) && Statistics.naiyaziCollected == 1) { + badge = Badge.GHOSTDAGE; + local.add( badge ); + } + if (!local.contains( Badge.DAGETO ) && Statistics.naiyaziCollected >= 2) { + addGlobal(badge); + badge = Badge.DAGETO; + } + local.add(badge); + displayBadge( badge ); + } + public static void validateLevelReached() { Badge badge = null; @@ -555,6 +572,14 @@ public class Badges { validateYASD(); } + public static void ENDDIED() { + Badge badge = Badge.ENDIED; + local.add( badge ); + displayBadge( badge ); + + validateYASD(); + } + public static void DeathRedNercols() { Badge badge = Badge.DEATH_FROM_FIRE; local.add( badge ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Rankings.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Rankings.java index 5d18e3732..fb9126537 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Rankings.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Rankings.java @@ -35,7 +35,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; import com.shatteredpixel.shatteredpixeldungeon.journal.Notes; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton; -import com.watabou.noosa.Game; import com.watabou.utils.Bundlable; import com.watabou.utils.Bundle; import com.watabou.utils.FileUtils; @@ -61,6 +60,10 @@ public enum Rankings { public void submit( boolean win, Class cause ) { + if(Dungeon.isChallenged(Challenges.PRO)){ + return; + } + load(); Record rec = new Record(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDSettings.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDSettings.java index 2bd55a91a..7e51fefa4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDSettings.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDSettings.java @@ -37,9 +37,19 @@ import java.util.Locale; public class SPDSettings extends GameSettings { //Version info - public static final String KEY_AUTH_KEY = "net_auth_key"; + public static final String KEY_CUSTOM_SEED = "Your_Key"; + public static final String KEY_CUSTOM_LING = "Your_Key"; + + public static void customSeed( String value ){ + put( KEY_CUSTOM_SEED, value ); + } + + public static String customSeed() { + return getString( KEY_CUSTOM_SEED, KEY_CUSTOM_LING, 20); + } + public static final String KEY_VERSION = "version"; - public static String DEFAULT_KEY = "debug"; + public static void quickslots( int value ){ put( KEY_QUICKSLOTS, value ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java index 2a511fe81..6fb5e999b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java @@ -33,6 +33,11 @@ import com.watabou.utils.PlatformSupport; public class ShatteredPixelDungeon extends Game { + public TitleScene net; + public static TitleScene net(){ + return ((ShatteredPixelDungeon)instance).net; + } + private static String log = ""; public static void appendLog(String string) { log += "\n\n" + string; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Statistics.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Statistics.java index 45f27987d..6dc320985 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Statistics.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Statistics.java @@ -55,6 +55,12 @@ public class Statistics { public static boolean deadshoppingdied = false; + public static boolean wangzheguilai = false; + + public static boolean endingbald = false; + + public static int dageCollected; + //Directly add float time will cause accuracy lose and stop timing if time is long enough //so use long to record seconds, float to count sub-seconds. //SPD-V1.3.2-ITEM SPAWN CODE @@ -89,6 +95,8 @@ public class Statistics { fireGirlnoshopping = false; deadshoppingdied = false; + wangzheguilai = false; + endingbald = false; second_elapsed = 0f; real_seconds = 0; @@ -121,6 +129,10 @@ public class Statistics { private static final String SHOPPINGDIED = "deadshoppingdied"; + private static final String WZGL = "wangzheguilai"; + + private static final String ENBR = "endingbald"; + private static final String EXLEVEL = "Exlevel"; public static void storeInBundle( Bundle bundle ) { @@ -148,6 +160,8 @@ public class Statistics { bundle.put( SHOPPINGDIED, deadshoppingdied ); + bundle.put( WZGL, wangzheguilai ); + //SPD bundle.put("real_time_passed", second_elapsed); bundle.put("real_seconds_passed", real_seconds); @@ -178,6 +192,8 @@ public class Statistics { fireGirlnoshopping = bundle.getBoolean( NOSHOPPING ); deadshoppingdied = bundle.getBoolean( SHOPPINGDIED ); + wangzheguilai = bundle.getBoolean( WZGL ); + //SPD second_elapsed = bundle.getFloat("real_time_passed"); real_seconds = bundle.getLong("real_seconds_passed"); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java index 1f2b639fb..1648e1d4e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java @@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.hero; import static com.shatteredpixel.shatteredpixeldungeon.Challenges.AQUAPHOBIA; import static com.shatteredpixel.shatteredpixeldungeon.Challenges.LIGHTBLACK; import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; +import static com.shatteredpixel.shatteredpixeldungeon.SPDSettings.HelpSettings; import static com.shatteredpixel.shatteredpixeldungeon.levels.Level.set; import com.shatteredpixel.shatteredpixeldungeon.Assets; @@ -376,7 +377,7 @@ public class Hero extends Char { pre.append("craft_vals_"); pre.append(csname); int[] trys = bundle.getIntArray(pre.toString()); - LinkedHashMap lname = new LinkedHashMap(); + LinkedHashMap lname = new LinkedHashMap(); for(int lisx = 0; lisx < enus.length && lisx < trys.length; ++lisx) { lname.put(enus[lisx], trys[lisx]); @@ -495,7 +496,13 @@ public class Hero extends Char { } Buff.affect( this, Regeneration.class ); Buff.affect( this, Hunger.class ); - Buff.affect(this, GameTracker.class); + + + if(HelpSettings()) { + Buff.affect(this, GameTracker.class); + } { + //Do Stauff + } } public int tier() { 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 7d22ba308..0a4569ddc 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 @@ -57,14 +57,13 @@ import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClothArmor; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.ChaliceOfBlood; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.CloakOfShadows; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose; -import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.EtherealChains; +import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.GoldIron; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.MasterThievesArmband; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TalismanOfForesight; import com.shatteredpixel.shatteredpixeldungeon.items.bags.BookBag; import com.shatteredpixel.shatteredpixeldungeon.items.bags.HerbBag; import com.shatteredpixel.shatteredpixeldungeon.items.bags.KingBag; import com.shatteredpixel.shatteredpixeldungeon.items.bags.VelvetPouch; -import com.shatteredpixel.shatteredpixeldungeon.items.bombs.LaserPython; import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.BrokenBooks; import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.DeepBloodBooks; import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.GrassKingBooks; @@ -78,7 +77,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.food.MeatPie; import com.shatteredpixel.shatteredpixeldungeon.items.food.PotionOfLightningShiled; import com.shatteredpixel.shatteredpixeldungeon.items.lightblack.OilLantern; import com.shatteredpixel.shatteredpixeldungeon.items.lightblack.OilPotion; -import com.shatteredpixel.shatteredpixeldungeon.items.potions.AlchemicalCatalyst; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfExperience; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfInvisibility; @@ -119,6 +117,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.BlackDog; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Dagger; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.EndingBlade; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.FireFishSword; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Gauntlet; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Gloves; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.GreenSword; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.IceFishSword; @@ -177,12 +176,11 @@ public enum HeroClass { if (Dungeon.isChallenged(Challenges.PRO)){ new FrozenCarpaccio().quantity(11).identify().collect(); new FireFishSword().quantity(1).identify().collect(); - new LaserPython().quantity(100).identify().collect(); new PotionOfInvisibility().quantity(45).identify().collect(); new LockSword().quantity(1).identify().collect(); Buff.affect(hero, ChampionHero.AntiMagic.class, 50000f); - new AlchemicalCatalyst().quantity(45).identify().collect(); - new EtherealChains().quantity(1).identify().collect(); + new Gauntlet().quantity(1).identify().collect(); + new GoldIron().quantity(1).identify().collect(); new ScrollOfIdentify().quantity(45).identify().collect(); new ScrollOfTransmutation().quantity(45).identify().collect(); new BeaconOfReturning().quantity(11).identify().collect(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DimandKing.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DimandKing.java index 3349146fa..5d67d6bd0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DimandKing.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DimandKing.java @@ -1,5 +1,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; +import static com.shatteredpixel.shatteredpixeldungeon.Challenges.STRONGER_BOSSES; + import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; @@ -22,6 +24,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.Flare; import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; +import com.shatteredpixel.shatteredpixeldungeon.effects.TargetedCell; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.EnergyParticle; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.HalomethaneFlameParticle; @@ -43,9 +46,12 @@ import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.MimicSprite; +import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap; import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar; import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; +import com.shatteredpixel.shatteredpixeldungeon.ui.Window; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.noosa.Game; import com.watabou.noosa.audio.Sample; import com.watabou.noosa.particles.Emitter; import com.watabou.utils.Bundle; @@ -63,8 +69,7 @@ public class DimandKing extends Boss { initBaseStatus(14, 23, 33, 22, 200, 5, 12); initStatus(120); properties.add(Property.UNDEAD); - HP=250; - HT=250; + HP = HT = Dungeon.isChallenged(STRONGER_BOSSES) ? 320 : 250; } private int phase = 1; @@ -95,6 +100,8 @@ public class DimandKing extends Boss { private static final String ABILITY_CD = "ability_cd"; private static final String LAST_ABILITY = "last_ability"; + private static final String TARGETED_CELLS = "targeted_cells"; + @Override public void storeInBundle(Bundle bundle) { super.storeInBundle(bundle); @@ -104,6 +111,13 @@ public class DimandKing extends Boss { bundle.put( ABILITY_CD, abilityCooldown ); bundle.put( LAST_ABILITY, lastAbility ); bundle.put("wavePhase2", wave); + + //暴力Boss + int[] bundleArr = new int[targetedCells.size()]; + for (int i = 0; i < targetedCells.size(); i++){ + bundleArr[i] = targetedCells.get(i); + } + bundle.put(TARGETED_CELLS, bundleArr); } @Override @@ -117,6 +131,13 @@ public class DimandKing extends Boss { wave = bundle.getInt("wavePhase2"); if (phase == 2) properties.add(Property.IMMOVABLE); + + //暴力Boss + int[] bundleArr = new int[targetedCells.size()]; + for (int i = 0; i < targetedCells.size(); i++){ + bundleArr[i] = targetedCells.get(i); + } + bundle.put(TARGETED_CELLS, bundleArr); } private void resetChanceMap(){ @@ -333,6 +354,9 @@ public class DimandKing extends Boss { if (bestPos != enemy.pos) ScrollOfTeleportation.appear(furthest, bestPos); yell(Messages.get(this, "teleport_" + Random.IntRange(1, 2))); + if(Dungeon.isChallenged(STRONGER_BOSSES)) { + doYogLasers(); + } return true; } return false; @@ -347,12 +371,18 @@ public class DimandKing extends Boss { } new Flare(5, 32).color(0xFF6060, false).show(sprite, 1.5f); yell(Messages.get(this,"buff_all")); + if(Dungeon.isChallenged(STRONGER_BOSSES)) { + doYogLasers(); + } } private void sacrificeSubject(){ Buff.affect(this, SacrificeSubjectListener.class, 3f); new Flare(6, 32).color(0xFF22FF, false).show(sprite, 1.5f); yell(Messages.get(this, "sacrifice")); + if(Dungeon.isChallenged(STRONGER_BOSSES)) { + doYogLasers(); + } } private void deathRattleSubject(){ @@ -370,6 +400,9 @@ public class DimandKing extends Boss { } new Flare(7, 32).color(0x303030, false).show(sprite, 1.5f); yell(Messages.get(this,"death_rattle")); + if(Dungeon.isChallenged(STRONGER_BOSSES)) { + doYogLasers(); + } } private void extraSummonSubject(){ @@ -378,6 +411,9 @@ public class DimandKing extends Boss { summonSubject(3); summonsMade++; yell(Messages.get(this, "more_summon")); + if(Dungeon.isChallenged(STRONGER_BOSSES)) { + doYogLasers(); + } new Flare(4, 32).color(0x4040FF, false).show(sprite, 1.5f); } @@ -949,4 +985,77 @@ public class DimandKing extends Boss { return super.attachTo(target); } } + + + private static final int MIN_ABILITY_CD = 7; + private int lastHeroPos; + private static final int MAX_ABILITY_CD = 12; + private ArrayList targetedCells = new ArrayList<>(); + + public void doYogLasers(){ + boolean terrainAffected = false; + HashSet affected = new HashSet<>(); + //delay fire on a rooted hero + if (!enemy.rooted) { + for (int i : targetedCells) { + Ballistica b = new Ballistica(i, lastHeroPos, Ballistica.WONT_STOP); + //shoot beams + sprite.parent.add(new Beam.DeathRayS(DungeonTilemap.raisedTileCenterToWorld(i), + DungeonTilemap.raisedTileCenterToWorld(b.collisionPos))); + for (int p : b.path) { + Char ch = Actor.findChar(p); + if (ch != null && (ch.alignment != alignment || ch instanceof Bee)) { + affected.add(ch); + } + if (Dungeon.level.flamable[p]) { + Dungeon.level.destroy(p); + GameScene.updateMap(p); + terrainAffected = true; + } + } + } + if (terrainAffected) { + Dungeon.observe(); + } + for (Char ch : affected) { + ch.damage(Random.NormalIntRange(30, 50), new Eye.DeathGaze()); + + if (Dungeon.level.heroFOV[pos]) { + ch.sprite.flash(); + CellEmitter.center(pos).burst(Speck.factory(Speck.COIN), Random.IntRange(2, 3)); + } + if (!ch.isAlive() && ch == Dungeon.hero) { + Dungeon.fail(getClass()); + GLog.n(Messages.get(Char.class, "kill", name())); + } + } + targetedCells.clear(); + } + + if (abilityCooldown <= 0 && HP < HT*0.8f){ + lastHeroPos = enemy.pos; + + int beams = (int) (4 + (HP * 1.0f / HT)*4); + for (int i = 0; i < beams; i++){ + int randompos = Random.Int(Dungeon.level.width()) + Dungeon.level.width()*2; + targetedCells.add(randompos); + } + + for (int i : targetedCells){ + Ballistica b = new Ballistica(i, Dungeon.hero.pos, Ballistica.WONT_STOP); + + for (int p : b.path){ + Game.scene().addToFront(new TargetedCell(p, Window.TITLE_COLOR)); + } + } + + spend(TICK*1.5f); + Dungeon.hero.interrupt(); + GLog.p(Messages.get(DimandKing.class, "wrning", name())); + abilityCooldown += Random.NormalFloat(MIN_ABILITY_CD - 2*(1 - (HP * 1f / HT)), MAX_ABILITY_CD - 5*(1 - (HP * 1f / HT))); + } else { + spend(TICK); + } + if (abilityCooldown > 0) abilityCooldown--; + } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Elemental.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Elemental.java index 6f6c9a491..1ce1457ce 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Elemental.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Elemental.java @@ -26,6 +26,7 @@ import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.level; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Freezing; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness; @@ -33,6 +34,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning; import com.shatteredpixel.shatteredpixeldungeon.effects.Lightning; import com.shatteredpixel.shatteredpixeldungeon.effects.Splash; +import com.shatteredpixel.shatteredpixeldungeon.items.Gold; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfFrost; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlame; import com.shatteredpixel.shatteredpixeldungeon.items.quest.Embers; @@ -40,12 +42,14 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRecharging import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTransmutation; import com.shatteredpixel.shatteredpixeldungeon.items.wands.CursedWand; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Shocking; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.EndingBlade; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ElementalSprite; import com.watabou.noosa.audio.Sample; import com.watabou.utils.Bundle; +import com.watabou.utils.PathFinder; import com.watabou.utils.Random; import java.util.ArrayList; @@ -217,6 +221,27 @@ public abstract class Elemental extends Mob { } } + @Override + public void die(Object cause) { + super.die(cause); + //机会 + int blobs = Random.chances(new float[]{0, 1, 0, 1, 0}); + + if(!Statistics.endingbald) { + for (int i = 0; i < blobs; i++) { + int ofs; + do { + ofs = PathFinder.NEIGHBOURS8[Random.NormalIntRange(1,1)]; + } while (!Dungeon.level.passable[pos + ofs]); + Dungeon.level.drop(new EndingBlade(), pos + ofs).sprite.drop(pos); + Badges.ENDDIED(); + Statistics.endingbald = true; + } + } else { + Dungeon.level.drop(new Gold().quantity(Random.Int(90, 120)), pos).sprite.drop(); + } + } + @Override protected void rangedProc( Char enemy ) { if (!level.water[enemy.pos]) { @@ -249,6 +274,9 @@ public abstract class Elemental extends Mob { public void die(Object cause) { super.die(cause); if (alignment == Alignment.ENEMY) Dungeon.level.drop( new Embers(), pos ).sprite.drop(); + + //机会 + Badges.KILL_COLDELE(); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/FireMagicDied.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/FireMagicDied.java index 71343c490..0646750db 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/FireMagicDied.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/FireMagicDied.java @@ -22,11 +22,9 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LifeLink; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ShopLimitLock; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Bee; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.BlackHost; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ColdGurad; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.DM100; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Eye; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Monk; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.SRPDICLRPRO; @@ -43,7 +41,6 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.Flare; import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; -import com.shatteredpixel.shatteredpixeldungeon.effects.TargetedCell; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.EnergyParticle; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.PurpleParticle; @@ -56,7 +53,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMappi import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade; import com.shatteredpixel.shatteredpixeldungeon.levels.ShopBossLevel; -import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; @@ -66,7 +62,6 @@ import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap; import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.watabou.noosa.Camera; -import com.watabou.noosa.Game; import com.watabou.noosa.audio.Music; import com.watabou.noosa.audio.Sample; import com.watabou.noosa.particles.Emitter; @@ -357,7 +352,6 @@ public class FireMagicDied extends Mob implements Callback { @Override public boolean act() { if (phase == 1 && HP <= 350) { - doYogLasers(); actScanning(); if (Dungeon.level.water[pos] && HP < HT) { HP += healInc; @@ -549,7 +543,7 @@ public class FireMagicDied extends Mob implements Callback { Sample.INSTANCE.play( Assets.Sounds.DEBUFF ); } - int dmg = Random.NormalIntRange( 12, 18 ); + int dmg = Random.NormalIntRange( 2, 4 ); for (Mob mob : Dungeon.level.mobs.toArray( new Mob[0] )) { if(Random.NormalIntRange(0,9)<4) { @@ -690,8 +684,6 @@ public class FireMagicDied extends Mob implements Callback { LockedFloor lock = Dungeon.hero.buff(LockedFloor.class); if (lock != null) lock.addTime(dmg*2); - super.damage(dmg, src); - if (phase == 1) { int dmgTaken = preHP - HP; abilityCooldown -= dmgTaken/8f; @@ -702,7 +694,7 @@ public class FireMagicDied extends Mob implements Callback { } //properties.add(Property.IMMOVABLE); ScrollOfTeleportation.appear(this, ShopBossLevel.throneling); - doYogLasers(); + //doYogLasers(); sprite.centerEmitter().start( Speck.factory( Speck.SCREAM ), 0.4f, 2 ); Sample.INSTANCE.play( Assets.Sounds.CHALLENGE ); phase = 2; @@ -742,7 +734,6 @@ public class FireMagicDied extends Mob implements Callback { sprite.showStatus(0xff0000, Messages.get(this, "dead")); } else if (phase == 3 && preHP > 80 && HP <= 80){ - doYogLasers(); yell( Messages.get(this, "losing") ); } @@ -752,12 +743,15 @@ public class FireMagicDied extends Mob implements Callback { GameScene.flash(0x80FFFFFF); } } + super.damage(dmg, src); } @Override public void die( Object cause ) { super.die( cause ); + ShatteredPixelDungeon.seamlessResetScene(); + Dungeon.level.drop(new BackGoKey().quantity(1).identify(), pos).sprite.drop(); Dungeon.level.drop(new ScrollOfMagicMapping().quantity(1).identify(), pos).sprite.drop(); Dungeon.level.drop(new ScrollOfUpgrade().quantity(3).identify(), pos).sprite.drop(); @@ -984,7 +978,7 @@ public class FireMagicDied extends Mob implements Callback { } } else { if (((FireMagicDied)target).phase == 2 && HP > 300){ - target.damage(10, new FireMagicDied.KingDamager()); + target.damage(30, new FireMagicDied.KingDamager()); } } @@ -1139,97 +1133,6 @@ public class FireMagicDied extends Mob implements Callback { } } - //Next Level 4 - public void doYogLasers(){ - boolean terrainAffected = false; - HashSet affected = new HashSet<>(); - //delay fire on a rooted hero - if (!enemy.rooted) { - for (int i : targetedCells) { - Ballistica b = new Ballistica(i, lastHeroPos, Ballistica.WONT_STOP); - //shoot beams - sprite.parent.add(new Beam.DeathRayS(DungeonTilemap.raisedTileCenterToWorld(i), - DungeonTilemap.raisedTileCenterToWorld(b.collisionPos))); - for (int p : b.path) { - Char ch = Actor.findChar(p); - if (ch != null && (ch.alignment != alignment || ch instanceof Bee)) { - affected.add(ch); - } - if (Dungeon.level.flamable[p]) { - Dungeon.level.destroy(p); - GameScene.updateMap(p); - terrainAffected = true; - } - } - } - if (terrainAffected) { - Dungeon.observe(); - } - for (Char ch : affected) { - ch.damage(Random.NormalIntRange(60, 121), new Eye.DeathGaze()); - - if (Dungeon.level.heroFOV[pos]) { - ch.sprite.flash(); - CellEmitter.center(pos).burst(Speck.factory(Speck.COIN), Random.IntRange(2, 3)); - } - if (!ch.isAlive() && ch == Dungeon.hero) { - Dungeon.fail(getClass()); - GLog.n(Messages.get(Char.class, "kill", name())); - } - } - targetedCells.clear(); - } - - if (abilityCooldown <= 0 && HP < HT*0.8f){ - lastHeroPos = enemy.pos; - - int beams = (int) (4 + (HP * 1.0f / HT)*4); - for (int i = 0; i < beams; i++){ - int randompos = Random.Int(Dungeon.level.width()) + Dungeon.level.width()*2; - targetedCells.add(randompos); - } - - for (int i : targetedCells){ - Ballistica b = new Ballistica(i, Dungeon.hero.pos, Ballistica.WONT_STOP); - for (int p : b.path){ - Game.scene().addToFront(new TargetedCell(p, 0xFF0000)); - } - } - - spend(TICK*1.5f); - Dungeon.hero.interrupt(); - - abilityCooldown += Random.NormalFloat(MIN_ABILITY_CD - 2*(1 - (HP * 1f / HT)), MAX_ABILITY_CD - 5*(1 - (HP * 1f / HT))); - } else { - spend(TICK); - } - if (abilityCooldown > 0) abilityCooldown--; - } - - @Override - public void move(int step) { - - super.move(step); - - Camera.main.shake( 1, 0.25f ); - if(HP < 250) { - if (Dungeon.level.map[step] == Terrain.WATER && state == HUNTING) { - Buff.affect(this, DwarfMaster.DKBarrior.class).setShield(50); - - if (Dungeon.level.water[pos] && HP < HT) { - if (Dungeon.level.heroFOV[pos]) { - sprite.emitter().burst(Speck.factory(Speck.HEALING), 1); - } - if (HP * 2 == HT) { - BossHealthBar.bleed(false); - } - HP++; - } - } - } - } - - //亡魂显现 public static class ColdGuradA extends ColdGurad { { @@ -1332,7 +1235,7 @@ public class FireMagicDied extends Mob implements Callback { super.detach(); for (Mob m : Dungeon.level.mobs.toArray(new Mob[0])){ if (m instanceof FireMagicDied ){ - m.damage(10, this); + m.damage(30, this); } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java index 7c1bb6895..d44927a72 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java @@ -24,7 +24,9 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs; import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.FetidRat; @@ -327,10 +329,18 @@ public class Ghost extends NPC { hero.sprite.showStatus( CharSprite.NEGATIVE, "+3!!!" ); } else if (itemLevelRoll < 0.95f){ hero.sprite.showStatus( CharSprite.POSITIVE, "+5!!!" ); + if(( !Badges.isUnlocked(Badges.Badge.DAGETO))) { + Statistics.dageCollected = 2; + Badges.GhostDageCollected(); + } itemLevel = 5; } else { itemLevel = 4; hero.sprite.showStatus( CharSprite.WARNING, "+4!!!" ); + if(( !Badges.isUnlocked(Badges.Badge.GHOSTDAGE))) { + Statistics.dageCollected = 1; + Badges.GhostDageCollected(); + } } weapon.upgrade(itemLevel); armor.upgrade(itemLevel); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/RedDragon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/RedDragon.java index 50f22193c..1313106dd 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/RedDragon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/RedDragon.java @@ -35,11 +35,12 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; -import com.shatteredpixel.shatteredpixeldungeon.items.armor.LeatherArmor; -import com.shatteredpixel.shatteredpixeldungeon.items.armor.MailArmor; -import com.shatteredpixel.shatteredpixeldungeon.items.armor.PlateArmor; -import com.shatteredpixel.shatteredpixeldungeon.items.armor.ScaleArmor; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.Artifact; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.BlizzardBrew; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.Brew; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.CausticBrew; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.InfernalBrew; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.ShockingBrew; import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ExoticScroll; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfAffection; @@ -237,7 +238,7 @@ public class RedDragon extends NPC { public static Ring weapon; public static Ring RingT; public static Artifact armor; - public static Armor food; + public static Brew food; public static ExoticScroll scrolls; public static Weapon.Enchantment enchant; @@ -308,7 +309,7 @@ public class RedDragon extends NPC { weapon = (Ring)node.get( WEAPON ); armor = (Artifact) node.get( ARMOR ); - food = (Armor) node.get( FOOD ); + food = (Brew) node.get( FOOD ); scrolls = (ExoticScroll) node.get( SCROLLS ); if (node.contains(ENCHANT)) { @@ -341,10 +342,10 @@ public class RedDragon extends NPC { //5 switch (Random.chances(new float[]{0, 0, 10, 6, 3, 1})){ default: - case 2: food = new LeatherArmor(); break; - case 3: food = new MailArmor(); break; - case 4: food = new ScaleArmor(); break; - case 5: food = new PlateArmor(); break; + case 2: food = new BlizzardBrew(); break; + case 3: food = new CausticBrew(); break; + case 4: food = new InfernalBrew(); break; + case 5: food = new ShockingBrew(); break; } //TODO Fixed Ring Spawn; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/GameTracker.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/GameTracker.java index 014f492c6..ca366cf92 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/GameTracker.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/ch/GameTracker.java @@ -14,7 +14,9 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.Artifact; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.Brew; import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ExoticScroll; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon; import com.shatteredpixel.shatteredpixeldungeon.levels.RegularLevel; @@ -88,6 +90,8 @@ public class GameTracker extends Buff { if(m instanceof RedDragon){ appendDesc(RedDragon.Quest.weapon, info, "QUEST_REWARD"); appendDesc(RedDragon.Quest.armor, info, "QUEST_REWARD"); + appendDesc(RedDragon.Quest.food, info, "QUEST_REWARD"); + appendDesc(RedDragon.Quest.scrolls, info, "QUEST_REWARD"); } if(m instanceof Imp){ appendDesc(Imp.Quest.reward, info, "QUEST_REWARD"); @@ -101,12 +105,12 @@ public class GameTracker extends Buff { if(item != null) { if ( ((item instanceof Weapon || item instanceof Armor) && item.level() > 0) - || (item instanceof Ring || item instanceof Wand || item instanceof Artifact) + || (item instanceof Ring || item instanceof Wand || item instanceof Artifact || item instanceof ExoticScroll|| item instanceof Brew) ) { String name = item.trueName(); int index = name.indexOf('+'); if(index > 0){ - name = name.substring(0, index - 3); + name = name.substring(0, index - 1); } info.append(prefix).append(name).append('+').append(item.level()).append(item.cursed ? " CURSED\n" : "\n"); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java index 65fffe011..ef79608db 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java @@ -365,6 +365,7 @@ public class Generator { WEP_T2.probs = new float[]{ 6, 5, 5, 4, 4 }; WEP_T3.classes = new Class[]{ + Gauntlet.class, Sword.class, Mace.class, Scimitar.class, @@ -374,9 +375,9 @@ public class Generator { SkyShield.class, Dairikyan.class, GreenSword.class, - LockSword.class, + }; - WEP_T3.probs = new float[]{ 6, 5, 5, 4, 0, 4 ,3,8,0,7}; + WEP_T3.probs = new float[]{ 1, 5, 5, 4, 0, 4 ,3,8,0,4}; WEP_T4.classes = new Class[]{ Longsword.class, @@ -390,12 +391,13 @@ public class Generator { WEP_T4.probs = new float[]{ 6, 5, 5, 4, 4, 4, 3 }; WEP_T5.classes = new Class[]{ + LockSword.class, Greatsword.class, WarHammer.class, Glaive.class, Greataxe.class, - Greatshield.class, - Gauntlet.class + Greatshield.class + }; WEP_T5.probs = new float[]{ 6, 5, 5, 4, 4, 4 }; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/GoldIron.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/GoldIron.java index cb32e15de..93470ab11 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/GoldIron.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/GoldIron.java @@ -8,7 +8,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; -import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfEnergy; @@ -16,10 +15,8 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; -import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; -import com.shatteredpixel.shatteredpixeldungeon.windows.WndOptions; import com.watabou.noosa.audio.Sample; import com.watabou.noosa.particles.Emitter; import com.watabou.utils.Bundle; @@ -37,11 +34,12 @@ public class GoldIron extends Artifact { charge = 5+level(); partialCharge = 0; chargeCap = 5+level(); - - defaultAction = AC_ACTIVATE; } - public static final String AC_ACTIVATE = "ACTIVATE"; + public static final String AC_STONETOGOLD = "stonegold"; + public static final String AC_ONEDINGYI = "onedingyi"; + public static final String AC_CONDONTXA = "condontxa"; + //keeps track of generated sandbags. public int sandBags = 0; @@ -50,7 +48,9 @@ public class GoldIron extends Artifact { public ArrayList actions(Hero hero ) { ArrayList actions = super.actions( hero ); if (isEquipped( hero ) && !cursed && (charge > 0 || activeBuff != null)) { - actions.add(AC_ACTIVATE); + actions.add(AC_STONETOGOLD); + actions.add(AC_ONEDINGYI); + actions.add(AC_CONDONTXA); } return actions; } @@ -60,46 +60,12 @@ public class GoldIron extends Artifact { super.execute(hero, action); - if (action.equals(AC_ACTIVATE)){ + if (action.equals(AC_STONETOGOLD)){ - if (!isEquipped( hero )) GLog.i( Messages.get(Artifact.class, "need_to_equip") ); - else if (activeBuff != null) { - if (activeBuff instanceof GoldIron.timeStasis) { //do nothing - } else { - activeBuff.detach(); - GLog.i( Messages.get(this, "deactivate") ); - } - } else if (charge <= 0) GLog.i( Messages.get(this, "no_charge") ); - else if (cursed) GLog.i( Messages.get(this, "cursed") ); - else GameScene.show( - new WndOptions(new ItemSprite(this), - Messages.titleCase(name()), - Messages.get(this, "prompt"), - Messages.get(this, "stasis"), - Messages.get(this, "freeze")) { - @Override - protected void onSelect(int index) { - if (index == 0) { - GLog.i( Messages.get(GoldIron.class, "onstasis") ); - GameScene.flash(0x80FFFFFF); - Sample.INSTANCE.play(Assets.Sounds.TELEPORT); + } else if (action.equals(AC_ONEDINGYI)) { - activeBuff = new GoldIron.timeStasis(); - Talent.onArtifactUsed(Dungeon.hero); - activeBuff.attachTo(Dungeon.hero); - } else if (index == 1) { - GLog.i( Messages.get(GoldIron.class, "onfreeze") ); - GameScene.flash(0x80FFFFFF); - Sample.INSTANCE.play(Assets.Sounds.TELEPORT); + } else if (action.equals(AC_CONDONTXA)) { - activeBuff = new GoldIron.timeFreeze(); - Talent.onArtifactUsed(Dungeon.hero); - activeBuff.attachTo(Dungeon.hero); - ((GoldIron.timeFreeze)activeBuff).processTime(0f); - } - } - } - ); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/EndingBlade.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/EndingBlade.java index 3784b28b2..c93a39139 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/EndingBlade.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/EndingBlade.java @@ -3,51 +3,32 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barrier; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Chill; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corrosion; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Doom; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Drowsy; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Frost; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hex; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicalSleep; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Ooze; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ScrollEmpower; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Slow; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.SoulMark; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Weakness; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Bee; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mimic; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Eye; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Piranha; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Statue; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Swarm; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Wraith; -import com.shatteredpixel.shatteredpixeldungeon.custom.utils.BallisticaReal; -import com.shatteredpixel.shatteredpixeldungeon.effects.Beam; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NPC; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; -import com.shatteredpixel.shatteredpixeldungeon.effects.particles.PurpleParticle; +import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; +import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShaftParticle; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TalismanOfForesight; import com.shatteredpixel.shatteredpixeldungeon.items.bombs.LaserPython; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRecharging; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfMagicMissile; @@ -67,12 +48,9 @@ import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.watabou.noosa.audio.Sample; import com.watabou.utils.Bundle; import com.watabou.utils.Callback; -import com.watabou.utils.Point; -import com.watabou.utils.PointF; import com.watabou.utils.Random; import java.util.ArrayList; -import java.util.HashMap; public class EndingBlade extends Weapon { @@ -134,7 +112,9 @@ public class EndingBlade extends Weapon { //每100点浊焰能量自动升级 @Override public int level() { - return fireenergy/100; + int level = Dungeon.hero == null ? 0 : fireenergy/100; + if (Dungeon.hero == null) level += 1; + return level; } private int TIME_TO_DIED = 0; public void execute( Hero hero, String action ) { @@ -142,14 +122,14 @@ public class EndingBlade extends Weapon { switch (action) { case AC_LASERCRYSTAL: - if(level >= 4 && firstx){ + if(level >= 3 && firstx){ firstx = false; new LaserPython().quantity(1).identify().collect(); GLog.n("你突然感觉你的背包鼓鼓的……"); } else if(!firstx) { GLog.n("你尚未使用激光晶柱,无法继续使用"); } else { - GLog.n("等级不足"); + GLog.n("等级不足,需求等级为3"); } break; case AC_DIEDGHOST: @@ -157,15 +137,37 @@ public class EndingBlade extends Weapon { curUser = hero; curItem = this; GameScene.selectCell(zapper); - TIME_TO_DIED = 20; } else if (TIME_TO_DIED != 0) { - GLog.n("道具正在冷却"); + GLog.n("技能正在冷却"); } else { - GLog.n("等级不足"); + GLog.n("等级不足,需求等级为5"); } break; case AC_HEALRESET: - GLog.w("3"); + if(level >= 7 && 0.30f >= (float)(hero.HP/hero.HT) && !Statistics.wangzheguilai) { + //0.30f >= (float)(hero.HP/hero.HT) + PotionOfHealing.cure( hero ); + hero.belongings.uncurseEquipped(); + hero.buff( Hunger.class ).satisfy( Hunger.STARVING ); + hero.HP = hero.HT; + hero.sprite.emitter().start( Speck.factory( Speck.HEALING ), 0.4f, 4 ); + CellEmitter.get( hero.pos ).start( ShaftParticle.FACTORY, 0.2f, 3 ); + Dungeon.hero.interrupt(); + GLog.p( Messages.get(this, "procced") ); + Statistics.wangzheguilai = true; + cursed = false; + for(Mob mob : Dungeon.level.mobs.toArray(new Mob[0])){ + if (!(mob instanceof NPC) ) { + mob.damage( Random.NormalIntRange( 30*(level/5), 50*(level/5) ), new Eye.DeathGaze() ); + } + } + } else if(Statistics.wangzheguilai) { + GLog.n("你本局已经使用千里追魂,无法再次使用。"); + } else if(level < 7) { + GLog.n("你的等级尚未达到7级以上,打败更多的怪物,鲜血会让你的武器变得更强……"); + } else if(0.30f <= (float)(hero.HP/hero.HT)) { + GLog.n("你的血量尚未低于30%,无法使用"); + } break; } } @@ -311,21 +313,7 @@ public class EndingBlade extends Weapon { curUser.spendAndNext( TIME_TO_ZAP ); } - protected int nReflections(int level){ - //return Math.min(2+level/3, 5); - return 5; - } - - protected float reflectionDamageFactor(int reflections){ - return 1f+0.1f*reflections*reflections; - } - public void onZap( Ballistica beam ) { - int count = 0; - for(BallisticaReal b: beams){ - onZapX(b, count); - ++count; - } Char ch = Actor.findChar(beam.collisionPos); if (ch != null){ @@ -336,104 +324,13 @@ public class EndingBlade extends Weapon { Mob enemy = (Mob) ch; - float corruptingPower = 3 + buffedLvl()/2f; + AllyBuff.affectAndLoot(enemy, curUser, Corruption.class); + TIME_TO_DIED = 30; - //base enemy resistance is usually based on their exp, but in special cases it is based on other criteria - float enemyResist = 1 + enemy.EXP; - if (ch instanceof Mimic || ch instanceof Statue){ - enemyResist = 1 + Dungeon.depth; - } else if (ch instanceof Piranha || ch instanceof Bee) { - enemyResist = 1 + Dungeon.depth/2f; - } else if (ch instanceof Wraith) { - //divide by 5 as wraiths are always at full HP and are therefore ~5x harder to corrupt - enemyResist = (1f + Dungeon.depth/3f) / 5f; - } else if (ch instanceof Swarm){ - //child swarms don't give exp, so we force this here. - enemyResist = 1 + 3; - } - - //100% health: 5x resist 75%: 3.25x resist 50%: 2x resist 25%: 1.25x resist - enemyResist *= 1 + 4*Math.pow(enemy.HP/(float)enemy.HT, 2); - - //debuffs placed on the enemy reduce their resistance - for (Buff buff : enemy.buffs()){ - if (MAJOR_DEBUFFS.containsKey(buff.getClass())) enemyResist *= (1f-MAJOR_DEBUFF_WEAKEN); - else if (MINOR_DEBUFFS.containsKey(buff.getClass())) enemyResist *= (1f-MINOR_DEBUFF_WEAKEN); - else if (buff.type == Buff.buffType.NEGATIVE) enemyResist *= (1f-MINOR_DEBUFF_WEAKEN); - } - - //cannot re-corrupt or doom an enemy, so give them a major debuff instead - if(enemy.buff(Corruption.class) != null || enemy.buff(Doom.class) != null){ - corruptingPower = enemyResist - 0.001f; - } - - if (corruptingPower > enemyResist){ - corruptEnemy( enemy ); - } else { - float debuffChance = corruptingPower / enemyResist; - if (Random.Float() < debuffChance){ - debuffEnemy( enemy, MAJOR_DEBUFFS); - } else { - debuffEnemy( enemy, MINOR_DEBUFFS); - } - } - - wandProc(ch, chargesPerCast()); Sample.INSTANCE.play( Assets.Sounds.HIT_MAGIC, 1, 0.8f * Random.Float(0.87f, 1.15f) ); } } - public void onZapX(BallisticaReal beam,int reflection) { - int level = buffedLvl(); - - int maxDistance = beam.dist; - - ArrayList chars = new ArrayList<>(); - - for (int c : beam.subPath((reflection>0?0:1), maxDistance)) { - //prevent self_damage - if(c==beam.sourceI && c==curUser.pos) continue; - - Char ch; - if ((ch = Actor.findChar( c )) != null) { - - chars.add( ch ); - } - - if (Dungeon.level.flamable[c]) { - Dungeon.level.destroy( c ); - GameScene.updateMap( c ); - - } - - CellEmitter.center( c ).burst( PurpleParticle.BURST, Random.IntRange( 1, 2 ) ); - - } - - - Dungeon.observe(); - - boolean alive = curUser.isAlive(); - - int lvl = level; - for (Char ch : chars) { - wandProc(ch, chargesPerCast()); - int damage = Math.round(2*reflectionDamageFactor(reflection)); - if(!ch.equals(curUser)) { - ch.damage(damage, this); - }else{ - ch.damage(damage/6, this); - } - ch.sprite.centerEmitter().burst( PurpleParticle.BURST, Random.IntRange( 1, 2 ) ); - ch.sprite.flash(); - } - - if (!curUser.isAlive() && alive) { - Dungeon.fail( getClass() ); - GLog.n(Messages.get(this, "ondeath")); - } - } - protected int chargesPerCast() { return 2; } @@ -457,72 +354,6 @@ public class EndingBlade extends Weapon { } } - private static final float MINOR_DEBUFF_WEAKEN = 1/4f; - private static final HashMap, Float> MINOR_DEBUFFS = new HashMap<>(); - static{ - MINOR_DEBUFFS.put(Weakness.class, 2f); - MINOR_DEBUFFS.put(Corruption.class, 2f); - MINOR_DEBUFFS.put(Cripple.class, 1f); - MINOR_DEBUFFS.put(Blindness.class, 1f); - MINOR_DEBUFFS.put(Terror.class, 1f); - - MINOR_DEBUFFS.put(Chill.class, 0f); - MINOR_DEBUFFS.put(Ooze.class, 0f); - MINOR_DEBUFFS.put(Corruption.class, 4f); - MINOR_DEBUFFS.put(Vertigo.class, 0f); - MINOR_DEBUFFS.put(Drowsy.class, 0f); - MINOR_DEBUFFS.put(Corruption.class, 10f); - MINOR_DEBUFFS.put(Burning.class, 0f); - MINOR_DEBUFFS.put(Poison.class, 0f); - } - - private static final float MAJOR_DEBUFF_WEAKEN = 1/2f; - private static final HashMap, Float> MAJOR_DEBUFFS = new HashMap<>(); - static{ - MAJOR_DEBUFFS.put(Corruption.class, 3f); - MAJOR_DEBUFFS.put(Slow.class, 2f); - MAJOR_DEBUFFS.put(Hex.class, 2f); - MAJOR_DEBUFFS.put(Paralysis.class, 1f); - - MAJOR_DEBUFFS.put(Corruption.class, 0f); - MAJOR_DEBUFFS.put(Corruption.class, 0f); - MAJOR_DEBUFFS.put(MagicalSleep.class, 0f); - MAJOR_DEBUFFS.put(SoulMark.class, 0f); - MAJOR_DEBUFFS.put(Corrosion.class, 0f); - MAJOR_DEBUFFS.put(Frost.class, 0f); - MAJOR_DEBUFFS.put(Doom.class, 0f); - } - - - - private void debuffEnemy( Mob enemy, HashMap, Float> category ){ - - //do not consider buffs which are already assigned, or that the enemy is immune to. - HashMap, Float> debuffs = new HashMap<>(category); - for (Buff existing : enemy.buffs()){ - if (debuffs.containsKey(existing.getClass())) { - debuffs.put(existing.getClass(), 0f); - } - } - for (Class toAssign : debuffs.keySet()){ - if (debuffs.get(toAssign) > 0 && enemy.isImmune(toAssign)){ - debuffs.put(toAssign, 0f); - } - } - - //all buffs with a > 0 chance are flavor buffs - Class debuffCls = (Class) Random.chances(debuffs); - - if (debuffCls != null){ - Buff.append(enemy, debuffCls, 6 + buffedLvl()*3); - } else { - //if no debuff can be applied (all are present), then go up one tier - if (category == MINOR_DEBUFFS) debuffEnemy( enemy, MAJOR_DEBUFFS); - else if (category == MAJOR_DEBUFFS) corruptEnemy( enemy ); - } - } - - private void corruptEnemy( Mob enemy ){ //cannot re-corrupt or doom an enemy, so give them a major debuff instead if(enemy.buff(Corruption.class) != null || enemy.buff(Doom.class) != null){ @@ -539,9 +370,6 @@ public class EndingBlade extends Weapon { } } - protected static ArrayList fxS = new ArrayList<>(); - protected static ArrayList fxE = new ArrayList<>(); - public void fxs(Ballistica beam, Callback callback) { MagicMissile.boltFromChar( curUser.sprite.parent, MagicMissile.SHADOW, @@ -549,129 +377,9 @@ public class EndingBlade extends Weapon { beam.collisionPos, callback); Sample.INSTANCE.play( Assets.Sounds.ZAP ); - buildBeams(beam); - int size = fxE.size(); - for(int i=0;i beams = new ArrayList<>(); - protected static ArrayList offset_1 = new ArrayList<>(); - protected void buildOffsetArray(int level){ - offset_1.clear(); - float offPerStep = 45f* (1.9f+level) / (1.9f+level*3f); - int maxDSB; - if(level>7){maxDSB = 0;} - else if(level>3){maxDSB = 0;} - else{maxDSB = 0;} - //offset_1.add(0f); - if(maxDSB>0) { - for (int i = -maxDSB; i < maxDSB + 1; ++i) { - offset_1.add(i * offPerStep / maxDSB); - } - }else{ - offset_1.add(0f); - } - - // if(level<9) return base_3; - //else return base_4; - } - - protected PointF pointToF(Point p){ - return new PointF(p.x, p.y); - } - - protected void addBeam(BallisticaReal beam){ - beams.add(beam); - fxS.add(beam.sourceF); - fxE.add(beam.collisionF); - } - - protected void buildBeams(Ballistica beam){ - fxS.clear(); - fxE.clear(); - beams.clear(); - buildOffsetArray(this.level()); - //addBeam(new Ballistica(beam.sourcePos, beam.collisionPos, Ballistica.STOP_SOLID | Ballistica.IGNORE_SOFT_SOLID)); - float angle = PointF.angle(new PointF(pointToF(Dungeon.level.cellToPoint(beam.sourcePos))), - new PointF(pointToF(Dungeon.level.cellToPoint(beam.collisionPos)))); - angle /= PointF.G2R; - if(angle<0f) angle += 360f; - //GLog.i("%f,", angle); - int scatter = offset_1.size(); - for(int i=0;i0; - boolean right = dx>0; - boolean horizontalWall = false; - boolean verticalWall = false; - - int xTile=(int)e.x; - if(e.x-(int)e.x<1e-5 && right){ - xTile-=1; - } - int yTile=(int)e.y; - if(e.y-(int)e.y<1e-5 && up){ - yTile-=1; - } - final int[] neigh = new int[]{-1, 1, -Dungeon.level.width(), Dungeon.level.width()}; - boolean[] isWall = new boolean[4]; - for(int i=0; i<4; ++i){ - isWall[i]=Dungeon.level.solid[xTile+yTile*Dungeon.level.width()+neigh[i]]; - } - if(e.x-(int)e.x<1e-5){ - verticalWall = (right && isWall[1]) || (!right && isWall[0]); - } - if(e.y-(int)e.y<1e-5){ - horizontalWall = (up && isWall[3]) || (!up && isWall[2]); - } - - if(horizontalWall != verticalWall){ - if(horizontalWall) return horizontalReflectAngle(angle); - else return verticalReflectAngle(angle); - }else if(horizontalWall && verticalWall){ - if(Math.abs(dx)= 10){ fireenergy += 0; //武器最高级 diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Gauntlet.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Gauntlet.java index 87f2fa6ee..70da16054 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Gauntlet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Gauntlet.java @@ -21,8 +21,6 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee; -import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; - import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; @@ -40,7 +38,7 @@ public class Gauntlet extends MeleeWeapon { hitSound = Assets.Sounds.HIT_CRUSH; hitSoundPitch = 1.2f; - tier = 5; + tier = 3; DLY = 0.25f; //2x speed } @@ -64,7 +62,7 @@ public class Gauntlet extends MeleeWeapon { return max(buffedLvl()); case 1: Buff.affect(defender, Burning.class).reignite(defender); - Buff.affect(hero, Cripple.class, Degrade.ADURATION); + Buff.affect(attacker, Cripple.class, Degrade.ADURATION); return super.proc(attacker, defender, damage); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/LockSword.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/LockSword.java index 86827243c..1c590cdd0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/LockSword.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/LockSword.java @@ -5,31 +5,35 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee; -import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; - -import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.RandomBuff; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Blazing; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Kinetic; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Shocking; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Unstable; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.watabou.utils.Bundle; public class LockSword extends MeleeWeapon { - public int lvl; + public int lvl = 0; public LockSword() { super.image = ItemSpriteSheet.DG3; - super.tier = 3; - if (this.lvl >= 150) { - super.image = ItemSpriteSheet.DG4; - } + super.tier = 5; + } - if (this.lvl >= 450) { - super.image = ItemSpriteSheet.DG5; - } + @Override + public int min(int lvl) { + return Math.round(1.0f*(tier+1)) + //15 base, down from 30 + lvl*Math.round(0.5f*(tier+1)); //+3 per level, down from +6 + } + + @Override + public int max(int lvl) { + + return Math.round(1.5f*(tier+1)) + //15 base, down from 30 + lvl*Math.round(0.5f*(tier+1)); //+3 per level, down from +6 } public String desc() { @@ -37,44 +41,57 @@ public class LockSword extends MeleeWeapon { } public int image() { - if (this.level() == 3 && Dungeon.hero.buff(RandomBuff.class) != null){ - //GLog.n("谢谢你为我升级……"); - for (Buff buff : hero.buffs()) { - if (buff instanceof RandomBuff) { - buff.detach(); - } - } - return image; + if (lvl == 150) { + super.image = ItemSpriteSheet.DG4; + } else if (lvl >= 350) { + super.image = ItemSpriteSheet.DG5; } return image; } - public int proc(Char var1, Char var2, int var3) { - ++this.lvl; - int var4 = var3; - if (this.lvl >= 150) { - var4 = (new Unstable()).proc(this, var1, var2, var3) + 3; - super.image = ItemSpriteSheet.DG4; + public int proc(Char attacker, Char defender, int damage ) { + ++lvl; + int dmg; + + if(level >= 10){ + lvl += 0; + } else if(defender.properties().contains(Char.Property.BOSS) && defender.HP <= damage){ + //目标Boss血量小于实际伤害判定为死亡,+20 + lvl+=20; + } else if(defender.properties().contains(Char.Property.MINIBOSS) && defender.HP <= damage){ + //目标迷你Boss血量小于实际伤害判定为死亡,+10 + lvl+=10; + } else if (defender.HP <= damage){ + //目标血量小于实际伤害判定为死亡,+5 + lvl+=5; } - var3 = var4; - if (this.lvl >= 450) { - var3 = (new Unstable()).proc(this, var1, var2, var4); - var3 = (new Unstable()).proc(this, var1, var2, var3) + 7; - super.image = ItemSpriteSheet.DG5; + if (level>= 8) { + dmg = (new Unstable()).proc(this, attacker, defender, damage) + 4; + damage = dmg; + } else if (level>= 6){ + dmg = (new Shocking()).proc(this, attacker, defender, damage) + 3; + damage = dmg; + } else if (level>= 4){ + dmg = (new Blazing()).proc(this, attacker, defender, damage) + 2; + damage = dmg; + } else if (level>= 2){ + dmg = (new Kinetic()).proc(this, attacker, defender, damage) + 1; + damage = dmg; } - return super.proc(var1, var2, var3); + return super.proc(attacker, defender, damage); + + } public void restoreFromBundle(Bundle var1) { super.restoreFromBundle(var1); super.image = ItemSpriteSheet.DG3; - if (this.lvl >= 150) { - super.image = ItemSpriteSheet.DG4; - } - if (this.lvl >= 450) { + if (lvl == 150) { + super.image = ItemSpriteSheet.DG4; + } else if (lvl >= 350) { super.image = ItemSpriteSheet.DG5; } @@ -84,11 +101,10 @@ public class LockSword extends MeleeWeapon { public void storeInBundle(Bundle var1) { super.storeInBundle(var1); super.image = ItemSpriteSheet.DG3; - if (this.lvl >= 150) { - super.image = ItemSpriteSheet.DG4; - } - if (this.lvl >= 450) { + if (lvl == 150) { + super.image = ItemSpriteSheet.DG4; + } else if (lvl >= 350) { super.image = ItemSpriteSheet.DG5; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/LastLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/LastLevel.java index 3cb972c55..cea87b7e0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/LastLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/LastLevel.java @@ -21,6 +21,8 @@ package com.shatteredpixel.shatteredpixeldungeon.levels; +import static com.shatteredpixel.shatteredpixeldungeon.Challenges.PRO; + import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Statistics; @@ -28,6 +30,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.items.Amulet; +import com.shatteredpixel.shatteredpixeldungeon.items.JAmulet; import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTilemap; @@ -154,7 +157,11 @@ public class LastLevel extends Level { @Override protected void createItems() { - drop( new Amulet(), exit ); + if(Dungeon.isChallenged(PRO)) { + drop(new JAmulet(), exit); + } else { + drop(new Amulet(), exit); + } } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java index 51c31fa1a..5099af764 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java @@ -182,7 +182,7 @@ public class InterlevelScene extends PixelScene { fadeTime += 0.9f; //adds 1 second total //speed up transition when debugging } else if (DeviceCompat.isDebug()){ - fadeTime = 0.1f; + fadeTime = 0.8f; } SkinnedBlock bg = new SkinnedBlock(Camera.main.width, Camera.main.height, loadingAsset ){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java index b170614fc..d98cebe19 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java @@ -7,9 +7,11 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.BlueBatSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ColdGuardSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.DiedMonkLoaderSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.FlameBoiSprite; +import com.shatteredpixel.shatteredpixeldungeon.sprites.GhostSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.sprites.KagenoNusujinSprite; +import com.shatteredpixel.shatteredpixeldungeon.sprites.MimicSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.SRPDHBLRTT; import com.shatteredpixel.shatteredpixeldungeon.sprites.ShopkKingSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.WFSprite; @@ -24,6 +26,8 @@ import java.util.ArrayList; public class vM0_6_7_X_Changes { public static void addAllChanges(ArrayList changeInfos) { + add_v0_6_10_Changes(changeInfos); + add_v0_6_9_Changes(changeInfos); add_v0_6_8_Changes(changeInfos); add_v0_6_7_Changes(changeInfos); add_v0_6_6_Changes(changeInfos); @@ -35,6 +39,64 @@ public class vM0_6_7_X_Changes { add_v0_6_0_Changes(changeInfos); } + public static void add_v0_6_10_Changes( ArrayList changeInfos ) { + ChangeInfo changes = new ChangeInfo("v0.6.0.0-Beta21-p1.2", true, ""); + changes.hardlight(Window.TITLE_COLOR); + changeInfos.add(changes); + + changes = new ChangeInfo("新内容", false, null); + changes.hardlight(Window.GREEN_COLOR); + changeInfos.add(changes); + + changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.ENDDIED), ("彩蛋武器:终焉"), + ("正式实装,击败火元素概率掉落"))); + + changes = new ChangeInfo("改动", false, null); + changes.hardlight(Window.CYELLOW); + changeInfos.add(changes); + + changes.addButton(new ChangeButton(new Image("sprites/spinner.png", 144, 0, 16, 16), (Messages.get(ChangesScene.class, "bugfixes")), + Messages.get(vM0_6_7_X_Changes.class, "bug_06X30"))); + + } + + public static void add_v0_6_9_Changes( ArrayList changeInfos ) { + ChangeInfo changes = new ChangeInfo("v0.6.0.0-Beta21-p1", true, ""); + changes.hardlight(Window.TITLE_COLOR); + changeInfos.add(changes); + + changes = new ChangeInfo("新内容", false, null); + changes.hardlight(Window.GREEN_COLOR); + changeInfos.add(changes); + + changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.ENDDIED), ("彩蛋武器:终焉"), + ("在命运的尽头,亦或者是命运的起点"))); + + changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.GAUNTLETS), ("碧灰双刃"), + ("武器降级到3阶"))); + + changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG3), ("钥匙剑"), + ("武器提格到5阶,进行了一定的重做"))); + + changes = new ChangeInfo("改动", false, null); + changes.hardlight(Window.CYELLOW); + changeInfos.add(changes); + + changes.addButton(new ChangeButton(new MimicSprite.Dimand(), ("钻石宝箱王"), + ("在梦魇Boss中出现新的技能"))); + + changes.addButton(new ChangeButton(new GhostSprite(), ("幽灵奖励改变"), + ("幽灵现在更能出现+3,以及+4,+5品种的武器或护甲"))); + + changes.addButton(new ChangeButton(Icons.get(Icons.CHANGES), ("药水癔症"), + ("暂时为以前的样子,后续会改善"))); + + changes.addButton(new ChangeButton(Icons.get(Icons.INFO), ("杂项改动"), + ("1.部分物品的显示逻辑更新\n2.用户ID系统\n3.调整红龙之王的奖励\n4.修复了一系列的Bug"))); + + + } + public static void add_v0_6_8_Changes( ArrayList changeInfos ) { ChangeInfo changes = new ChangeInfo("v0.6.0.0-Beta20.80", true, ""); changes.hardlight(Window.TITLE_COLOR); @@ -50,12 +112,6 @@ public class vM0_6_7_X_Changes { changes.addButton(new ChangeButton(new ShopkKingSprite(), ("商人领主商店终端"), ("交易使人快乐"))); - changes = new ChangeInfo("改动", false, null); - changes.hardlight(Window.GREEN_COLOR); - changeInfos.add(changes); - - changes.addButton(new ChangeButton(new Image("sprites/spinner.png", 144, 0, 16, 16), (Messages.get(ChangesScene.class, "bugfixes")), - Messages.get(vM0_6_7_X_Changes.class, "bug_06X29"))); } public static void add_v0_6_7_Changes( ArrayList changeInfos ) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/utils/DungeonSeed.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/utils/DungeonSeed.java index 97f872813..d31f94387 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/utils/DungeonSeed.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/utils/DungeonSeed.java @@ -26,6 +26,17 @@ import com.watabou.utils.Random; //This class defines the parameters for seeds in ShatteredPD and contains a few convenience methods public class DungeonSeed { + //USER NAME QQ + public static String formatText( String inputText ){ + try { + //if the seed matches a code, then just convert it to using the code system + return convertToCode(convertFromCode(inputText)); + } catch (IllegalArgumentException e){ + //otherwise just return the input text + return inputText; + } + } + private static long TOTAL_SEEDS = 5429503678976L; //26^9 possible seeds public static long randomSeed(){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java index e34bbbff0..991b5c98c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java @@ -21,6 +21,8 @@ package com.shatteredpixel.shatteredpixeldungeon.windows; +import static com.watabou.utils.DeviceCompat.isAndroid; + import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Chrome; import com.shatteredpixel.shatteredpixeldungeon.SPDSettings; @@ -270,7 +272,7 @@ public class WndSettings extends WndTabbed { add(optScale); } - if (DeviceCompat.isAndroid() && PixelScene.maxScreenZoom >= 2) { + if (isAndroid() && PixelScene.maxScreenZoom >= 2) { chkSaver = new CheckBox(Messages.get(this, "saver")) { @Override protected void onClick() { @@ -299,7 +301,7 @@ public class WndSettings extends WndTabbed { add( chkSaver ); } - if (DeviceCompat.isAndroid()) { + if (isAndroid()) { Boolean landscape = SPDSettings.landscape(); if (landscape == null){ landscape = Game.width > Game.height; @@ -685,6 +687,8 @@ public class WndSettings extends WndTabbed { ColorBlock sep1; CheckBox LockFing; + RedButton ResetButton; + @Override protected void createChildren() { title = PixelScene.renderTextBlock(Messages.get(this, "title"), 9); @@ -703,6 +707,17 @@ public class WndSettings extends WndTabbed { }; LockFing.checked(SPDSettings.HelpSettings()); add(LockFing); + + ResetButton = new RedButton(Messages.get(this, "reset")) { + @Override + protected void onClick() { + WndStartGame.showKeyInput(); + } + }; + if(isAndroid()) { + add(ResetButton); + } + } @Override @@ -718,8 +733,10 @@ public class WndSettings extends WndTabbed { if (width > 200){ LockFing.setRect(0, bottom, width, SLIDER_HEIGHT); + ResetButton.setRect(0, LockFing.bottom() + GAP, width, SLIDER_HEIGHT); } else { LockFing.setRect(0, bottom + GAP, width, SLIDER_HEIGHT); + ResetButton.setRect(0, LockFing.bottom() + GAP, width, SLIDER_HEIGHT); } height = LockFing.bottom(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java index c5a23d528..dc8c937a6 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java @@ -21,7 +21,10 @@ package com.shatteredpixel.shatteredpixeldungeon.windows; +import static com.shatteredpixel.shatteredpixeldungeon.SPDSettings.KEY_CUSTOM_LING; +import static com.shatteredpixel.shatteredpixeldungeon.SPDSettings.KEY_CUSTOM_SEED; import static com.shatteredpixel.shatteredpixeldungeon.ui.Icons.RENAME_OFF; +import static com.watabou.utils.DeviceCompat.isAndroid; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Badges; @@ -46,6 +49,8 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton; import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; import com.shatteredpixel.shatteredpixeldungeon.ui.StyledButton; import com.shatteredpixel.shatteredpixeldungeon.ui.Window; +import com.shatteredpixel.shatteredpixeldungeon.utils.DungeonSeed; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.watabou.noosa.ColorBlock; import com.watabou.noosa.Game; import com.watabou.noosa.Image; @@ -57,6 +62,23 @@ import java.util.ArrayList; public class WndStartGame extends Window { + public static void showKeyInput(){ + Game.runOnRenderThread(() -> ShatteredPixelDungeon.scene().add(new WndTextInput(Messages.get(WndTextInput.class,"enter_key"), Messages.get(WndGame.class, + "dialog_user"), SPDSettings.customSeed(), 10, false, Messages.get(WndTextInput.class,"yes"), + Messages.get(WndTextInput.class,"no")){ + @Override + public void onSelect(boolean positive, String text) { + text = DungeonSeed.formatText(text); + if(positive) { + SPDSettings.customSeed(text); + //抛出一个问题,保证初始化成功 + throw new RuntimeException("成功,信息已录入"); + } + } + })); + } + + private static final int WIDTH = 120; private static final int HEIGHT = 160; @@ -252,11 +274,15 @@ public class WndStartGame extends Window { ActionIndicator.action = null; InterlevelScene.mode = InterlevelScene.Mode.DESCEND; - if (SPDSettings.intro()) { + //匹配两个值以及为安卓才显示 + if(SPDSettings.customSeed().equals(KEY_CUSTOM_LING) && SPDSettings.customSeed().equals(KEY_CUSTOM_SEED) && isAndroid()){ + WndStartGame.showKeyInput(); + } else if (SPDSettings.intro()) { SPDSettings.intro( false ); Game.switchScene( IntroScene.class ); } else { Game.switchScene( InterlevelScene.class ); + GLog.n(SPDSettings.customSeed()); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndTextInput.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndTextInput.java index 6317c6c4d..268c08c2c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndTextInput.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndTextInput.java @@ -144,7 +144,8 @@ public class WndTextInput extends Window { } - @Override + + @Override public void offset(int xOffset, int yOffset) { super.offset(xOffset, yOffset); if (textBox != null){