diff --git a/android/build.gradle b/android/build.gradle index 8d5e0dcd0..0c294b739 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -31,7 +31,6 @@ android { applicationIdSuffix ".indev" versionNameSuffix '-INDEV' dependencies { - releaseImplementation project(':services:updates:githubUpdates') releaseImplementation project(':services:news:shatteredNews') } } @@ -46,7 +45,6 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' dependencies { - releaseImplementation project(':services:updates:githubUpdates') releaseImplementation project(':services:news:shatteredNews') } } @@ -89,7 +87,7 @@ dependencies { //noinspection GradleDependency implementation "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion" - implementation project(path: ':services:updates:githubUpdates') + implementation project(path: ':services:news:shatteredNews') natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86" diff --git a/build.gradle b/build.gradle index 3ab5af5ce..89527a304 100644 --- a/build.gradle +++ b/build.gradle @@ -18,8 +18,8 @@ allprojects { appName = 'Magic Ling Pixel Dungeon' appPackageName = 'com.ansdomagiclingpixeldungeon.ling' - appVersionCode =900925 - appVersionName = '0.6.3.0-Beta5.0' + appVersionCode =900926 + appVersionName = '0.6.3.0-Beta5.1' appJavaCompatibility = JavaVersion.VERSION_11 diff --git a/core/src/main/assets/messages/actors/actors.properties b/core/src/main/assets/messages/actors/actors.properties index 301608a5a..99dffa533 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -273,6 +273,8 @@ actors.buffs.watersoulx.desc=水灵的祝福已经在你身上,现在你可以 actors.mobs.lb.blacksoul.name=暗影 actors.mobs.lb.blacksoul.desc=由于重生十字架的缘故,因此你再次重生了。但你先前的东西都被自己的暗影亡魂夺走了,杀死它,夺回自己的一切! +actors.mobs.lb.blacksoul.died_kill=来自深渊的力量将你彻底的吞噬了! +actors.mobs.lb.blacksoul$darkbolt.rankings_desc=暗影将你拉入了万丈深渊…… actors.mobs.bosses.crystaldiedtower.name=雪凛结晶 actors.mobs.bosses.crystaldiedtower.desc=来自于雪凛峡谷商人总部的神秘结晶……,激活后将周期性的发射激光。 diff --git a/core/src/main/assets/messages/scenes/scenes.properties b/core/src/main/assets/messages/scenes/scenes.properties index fc669bf20..e9f207103 100644 --- a/core/src/main/assets/messages/scenes/scenes.properties +++ b/core/src/main/assets/messages/scenes/scenes.properties @@ -68,7 +68,7 @@ scenes.interlevelscene.dialog_20=感谢_那些回忆_和_罗贝里_的大力支 scenes.interlevelscene.dialog_21=Hod:\n\n明明清了水却还带电,太屑了。 scenes.interlevelscene.dialog_22=笑笑就好:\n\n咒杖会意想不到的好用,敢赌吗? scenes.interlevelscene.dialog_23=lmk3:\n\n话说,为什么尚方宝剑不能吃呢? -scenes.interlevelscene.dialog_24=five:\n\n嬗变初始武器可能有惊喜哦。 +scenes.interlevelscene.dialog_24=地牢之外的风景,或许也值得一看。 scenes.interlevelscene.dialog_25=U3D:\n\n治疗该喝就得喝,别省。 scenes.interlevelscene.dialog_26=观察者:\n\n死亡不是终点,结束即为开始。 scenes.interlevelscene.dialog_27=楪祈喵:\n\n欢迎来到魔绫,享受这场狂宴吧。 @@ -81,6 +81,7 @@ scenes.interlevelscene.dialog_33=DMZERO,另一个时间线的幕后黑手。 scenes.interlevelscene.dialog_34=米缸:\n\n和黑猫一起做薄煎饼,Nya~ scenes.interlevelscene.dialog_35=啊哈,猜猜我是谁?:\n\n失败了再爬起来就行了 scenes.interlevelscene.dialog_36=楪祈喵:\n\n想不想炼铜?想不想涩涩?想是吧?肘,跟我去警察局解释吧 +scenes.interlevelscene.dialog_37=丛林的真相,并不是你想象的那样。 scenes.mlpdaboutscene.txt_mlpd=基于 _破碎的像素地牢v1.2.3_ \n\n 采用了_注解版;生存地牢;疯长地牢;经验地牢_的部分源代码。 scenes.mlpdaboutscene.ttl_ansdo=制作:答舟工作室 diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ChampionEnemy.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ChampionEnemy.java index 79cd5ecd8..e4ecc2e79 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ChampionEnemy.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ChampionEnemy.java @@ -192,7 +192,6 @@ public abstract class ChampionEnemy extends Buff { public boolean canAttackWithExtraReach(Char enemy) { //attack range of 2 /** 实现效果,此外还要关联CharSprite.java和Mob.java以实现远程效果*/ - if(Random.Float()<0.1f) { switch (Random.NormalIntRange(0,5)){ //默认为毒雾 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 d28499cea..b62368707 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 @@ -1965,16 +1965,20 @@ public class Hero extends Char { } //灯火值低于35死亡生成自己的邪恶面,并清空金币,将金币保存到json文件。(灵感:空洞骑士) - if(lanterfireactive && hero.lanterfire <= 35) { - BlackSoul s = new BlackSoul(); - s.pos = Dungeon.hero.pos; - s.gold = Dungeon.gold; - Dungeon.gold = 0; - s.state = s.SLEEPING; - GameScene.add(s); - Buff.affect(s, ChampionEnemy.DeadSoulSX.class); - Buff.affect(s, DeadSoul.class); - GameScene.flash(0x80FF0000); + for (Ankh i : belongings.getAllItems(Ankh.class)) { + if (ankh == null || i.isBlessed()) { + if (lanterfireactive && hero.lanterfire <= 35 && !i.isBlessed()) { + BlackSoul s = new BlackSoul(); + s.pos = Dungeon.hero.pos; + s.gold = Dungeon.gold; + Dungeon.gold = 0; + s.state = s.SLEEPING; + GameScene.add(s); + Buff.affect(s, ChampionEnemy.DeadSoulSX.class); + Buff.affect(s, DeadSoul.class); + GameScene.flash(0x80FF0000); + } + } } if(Statistics.fireGirlnoshopping && Dungeon.depth < 0){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/lb/BlackSoul.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/lb/BlackSoul.java index 72d9844a6..51acce7e7 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/lb/BlackSoul.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/lb/BlackSoul.java @@ -6,25 +6,34 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Degrade; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.SmokeParticle; import com.shatteredpixel.shatteredpixeldungeon.items.Gold; import com.shatteredpixel.shatteredpixeldungeon.items.LostBackpack; +import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.utils.BArray; +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.PathFinder; import com.watabou.utils.Random; -public class BlackSoul extends Mob { +public class BlackSoul extends Mob implements Callback { public int gold; { spriteClass = ShadowSprite.class; //与英雄成长阶级相同 - HP = HT = (20 + 5*(hero.lvl-1) + hero.HTBoost)/2; + HP = HT = (40 + 5*(hero.lvl-1) + hero.HTBoost)/2; immunities.add(AllyBuff.class); @@ -46,6 +55,16 @@ public class BlackSoul extends Mob { return hero.defenseSkill(target)+5; //equal to base hero attack skill } + + @Override + protected boolean canAttack( Char enemy ) { + if(Dungeon.hero.lvl >= 15) { + return new Ballistica(pos, enemy.pos, MagicMissile.WARD).collisionPos == enemy.pos; + } else { + return super.canAttack(enemy); + } + } + @Override public void die( Object cause ) { @@ -57,6 +76,11 @@ public class BlackSoul extends Mob { } + public void onZapComplete() { + zap(); + next(); + } + @Override public int damageRoll() { return hero.damageRoll()/2; @@ -65,6 +89,9 @@ public class BlackSoul extends Mob { @Override public int attackProc( Char enemy, int damage ) { damage = super.attackProc( enemy, damage ); + if(Dungeon.hero.lvl == 15) { + zap(); + } if (Random.Int(4) < hero.pointsInTalent(Talent.SHADOW_BLADE) && hero.belongings.weapon() != null){ return hero.belongings.weapon().proc( this, enemy, damage ); @@ -73,6 +100,54 @@ public class BlackSoul extends Mob { } } + public static class DarkBolt{} + public static int level = 1; + private static final float TIME_TO_ZAP = 2f; + + protected boolean doAttack( Char enemy ) { + + if (Dungeon.level.adjacent( pos, enemy.pos )) { + + return super.doAttack( enemy ); + + } else { + + if (sprite != null && (sprite.visible || enemy.sprite.visible)) { + sprite.zap( enemy.pos ); + return false; + } else { + zap(); + return true; + } + } + } + + @Override + public void call() { + next(); + } + private void zap() { + spend( TIME_TO_ZAP ); + + if (hit( this, enemy, true )) { + + if (enemy == Dungeon.hero && Random.Int( 2 ) == 0) { + Buff.prolong( enemy, Blindness.class, Degrade.DURATION ); + Sample.INSTANCE.play( Assets.Sounds.DEBUFF ); + } + + int dmg = hero.damageRoll()/2; + enemy.damage( dmg, new DarkBolt() ); + + if (enemy == Dungeon.hero && !enemy.isAlive()) { + Dungeon.fail( getClass() ); + GLog.n( Messages.get(this, "died_kill") ); + } + } else { + enemy.sprite.showStatus( CharSprite.NEUTRAL, enemy.defenseVerb() ); + } + } + @Override public int drRoll() { return hero.drRoll()/2; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/lb/ShadowSprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/lb/ShadowSprite.java index eea3e55d0..764389f13 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/lb/ShadowSprite.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/lb/ShadowSprite.java @@ -1,16 +1,38 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.lb; +import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; import com.shatteredpixel.shatteredpixeldungeon.sprites.HeroSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.MobSprite; import com.watabou.noosa.TextureFilm; +import com.watabou.noosa.audio.Sample; import com.watabou.noosa.particles.Emitter; import com.watabou.noosa.tweeners.Tweener; +import com.watabou.utils.Callback; public class ShadowSprite extends MobSprite { private Emitter smoke; + public void zap( int cell ) { + + turnTo( ch.pos , cell ); + play( zap ); + + MagicMissile.boltFromChar( parent, + MagicMissile.RAINBOW, + this, + cell, + new Callback() { + @Override + public void call() { + ((BlackSoul)ch).onZapComplete(); + } + } ); + Sample.INSTANCE.play( Assets.Sounds.ZAP ); + } + public ShadowSprite() { super(); @@ -30,6 +52,8 @@ public class ShadowSprite extends MobSprite { attack = new Animation(15, false); attack.frames(film, 13, 14, 15, 0); + zap = attack.clone(); + idle(); resetColor(); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/lightblack/OilLantern.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/lightblack/OilLantern.java index 8ffb1813a..a32a8ac11 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/lightblack/OilLantern.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/lightblack/OilLantern.java @@ -122,7 +122,7 @@ public class OilLantern extends Item { public void refill(Hero hero) { this.flasks--; - this.charge += Math.min(MAX_CHARGE,charge); + this.charge += Math.min(MAX_CHARGE,100); hero.spend(TIME_TO_USE); hero.busy(); Sample.INSTANCE.play(Assets.Sounds.DRINK, TIME_TO_USE, TIME_TO_USE, 1.2f); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/DwarfMasterBossLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/DwarfMasterBossLevel.java index 38c4110af..409466e7b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/DwarfMasterBossLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/DwarfMasterBossLevel.java @@ -458,4 +458,6 @@ public class DwarfMasterBossLevel extends Level { A,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,L,L,L,L,L,L,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,A, A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A, }; + + } 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 5e2ae9767..68dbf8f09 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/InterlevelScene.java @@ -85,7 +85,7 @@ public class InterlevelScene extends PixelScene { public static boolean fallIntoPit; - private static final int NUM_TIPS = 36; + private static final int NUM_TIPS = 37; private static ArrayList tipset; private RenderedTextBlock tip; 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 ac423822e..f6ba42fcb 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 @@ -111,7 +111,7 @@ public class vM0_6_7_X_Changes { } public static void add_v0_6_53_Changes( ArrayList changeInfos ) { - ChangeInfo changes = new ChangeInfo("v0.6.3.0-Beta5.0", true, ""); + ChangeInfo changes = new ChangeInfo("v0.6.3.0-Beta5-5.1", true, ""); changes.hardlight(Window.TITLE_COLOR); changeInfos.add(changes); @@ -125,6 +125,9 @@ public class vM0_6_7_X_Changes { changes.addButton(new ChangeButton(Icons.get(Icons.AUDIO), ("MLPD-原创音乐-丛林Boss通用曲-丛林尽头"), ("感谢Prohonor的制作,实装在丛林Boss区。"))); + changes.addButton(new ChangeButton(Icons.get(Icons.SKULL), ("暗影"), + ("暗影会学习你的属性面板,但会减半,随着楼层深入和英雄成长,暗影会变得更加强大。"))); + changes = new ChangeInfo("改动", false, null); changes.hardlight(Window.CYELLOW); changeInfos.add(changes); diff --git a/desktop/build.gradle b/desktop/build.gradle index 5e35d7017..d36ece7f8 100644 --- a/desktop/build.gradle +++ b/desktop/build.gradle @@ -127,6 +127,5 @@ dependencies { implementation "org.lwjgl:lwjgl-tinyfd:3.2.3:natives-macos" implementation "org.lwjgl:lwjgl-tinyfd:3.2.3:natives-linux" - implementation project(':services:updates:githubUpdates') implementation project(':services:news:shatteredNews') } \ No newline at end of file diff --git a/services/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/updates/AvailableUpdateData.java b/services/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/updates/AvailableUpdateData.java deleted file mode 100644 index 3e88dd5fa..000000000 --- a/services/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/updates/AvailableUpdateData.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Pixel Dungeon - * Copyright (C) 2012-2015 Oleg Dolya - * - * Shattered Pixel Dungeon - * Copyright (C) 2014-2022 Evan Debenham - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - */ - -package com.shatteredpixel.shatteredpixeldungeon.services.updates; - -public class AvailableUpdateData { - - public String versionName; - public int versionCode; - - public String desc; - - public String URL; - -} \ No newline at end of file diff --git a/services/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/updates/UpdateService.java b/services/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/updates/UpdateService.java deleted file mode 100644 index d39c04d8c..000000000 --- a/services/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/updates/UpdateService.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Pixel Dungeon - * Copyright (C) 2012-2015 Oleg Dolya - * - * Shattered Pixel Dungeon - * Copyright (C) 2014-2022 Evan Debenham - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - */ - -package com.shatteredpixel.shatteredpixeldungeon.services.updates; - -//TODO with install and review functionality, this service is less and less just about updates -// perhaps rename to PlatformService, StoreService, DistributionService, etc? -public abstract class UpdateService { - - public static abstract class UpdateResultCallback { - public abstract void onUpdateAvailable( AvailableUpdateData update ); - public abstract void onNoUpdateFound(); - public abstract void onConnectionFailed(); - } - - //whether the app is updateable via an ingame prompt (e.g. not a demo or an android instant app) - public abstract boolean isUpdateable(); - - //whether the service supports an opt-in channel for betas - public abstract boolean supportsBetaChannel(); - - public abstract void checkForUpdate( boolean useMetered, boolean includeBetas, UpdateResultCallback callback ); - - public abstract void initializeUpdate( AvailableUpdateData update ); - - //whether the app installable via an ingame prompt (e.g. a demo, or an android instant app) - public abstract boolean isInstallable(); - - public abstract void initializeInstall(); - - public static abstract class ReviewResultCallback { - public abstract void onComplete(); - } - - public abstract boolean supportsReviews(); - - public abstract void initializeReview( ReviewResultCallback callback ); - - public abstract void openReviewURI(); - -} diff --git a/settings.gradle b/settings.gradle index c43cd59b7..da66e41ac 100644 --- a/settings.gradle +++ b/settings.gradle @@ -8,8 +8,6 @@ include ':desktop' //service modules include ':services' - //updates -include ':services:updates:githubUpdates' - //news - include ':services:news:debugNews' - include ':services:news:shatteredNews' + +//news +include ':services:news:shatteredNews'