Update 0.6.4.0-Beta6

This commit is contained in:
LingASDJ 2023-08-05 04:33:11 +08:00
parent 55c461c780
commit 4ccd2b0cbe
45 changed files with 443 additions and 184 deletions

View File

@ -18,8 +18,8 @@ allprojects {
appName = 'Magic Ling Pixel Dungeon'
appPackageName = 'com.ansdomagiclingpixeldungeon.ling'
appVersionCode =901300
appVersionName = '0.6.4.0-Beta4'
appVersionCode =901500
appVersionName = '0.6.4.0-Beta6'
appJavaCompatibility = JavaVersion.VERSION_11

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -295,8 +295,8 @@ actors.mobs.npcs.nulldiedto.talk_f=祝你好运,冒险家。我这里也提供
actors.mobs.npcs.nulldiedto.talk_g=冒险家,我们又见面了。我担心你接下来的路程,所以又来帮助你了。
actors.mobs.npcs.nulldiedto.talk_h=祝你好运,冒险家。我这里也提供一点帮助你压制不明力量的东西——当然,是得花钱的。
actors.mobs.npcs.nulldiedto.talk_i=冒险家,正如我之前所说。有一股邪恶,阴冷却强大的力量正在向外溢出,而能量点就在这扭曲裂缝的下方。而其实水晶之心一直在你的背包里面
actors.mobs.npcs.nulldiedto.talk_j=现在的选择权在你,冒险家。继续还是妥协这一切,通过水晶离开这里,还是斩草除根,一切选择权已经交给你了!
actors.mobs.npcs.nulldiedto.talk_i=冒险家,正如我之前所说。有一股邪恶,阴冷却强大的力量正在向外溢出,而能量点就在这更深的下方。
actors.mobs.npcs.nulldiedto.talk_j=但是由于某位的到来,你现在还不能前往那里找死,所以你先暂时别急着去那里……
actors.mobs.npcs.nulldiedto.talk_k=DMZERO已经彻底被摧毁了冒险家干的不错。
actors.mobs.npcs.nulldiedto.talk_l=冒险家,或许你真的是衪的救世主。

View File

@ -235,11 +235,13 @@ items.books.bookslist.hellfirebooks.desc=燃尽了一切,真理在何处显存
items.books.bookslist.hellfirebooks.author=--圣火魔女
items.books.bookslist.hellfirebooks.ac_read=尚未完成
items.weapon.melee.icefishsword.name=尚方宝剑
items.weapon.melee.icefishsword.name=寒冷的尚方宝剑
items.weapon.melee.icefishsword.desc=神秘的鱼类,来源未知。\n\n对可视敌人造成冻伤和流血效果但是似乎有些腥。
items.weapon.melee.icefishsword.cook=%s经过寒冷的肆虐再次变回冰冷的尚方宝剑……
items.weapon.melee.firefishsword.name=煮熟的尚方宝剑
items.weapon.melee.firefishsword.desc=神秘的鱼类,来源未知。\n\n对可视敌人造成燃烧和幻惑效果闻起来挺好吃的。
items.weapon.melee.firefishsword.resetling=%s经过烈焰的烘烤变熟了, 但是似乎有点糊了...,不过剑身看起来更加锋利了。
items.scrolls.scroll.agesx=你不能在抢劫时阅读任何卷轴!击败守卫首领以获得解除!
items.spells.beaconofreturning.zerobuy=你企图使用返回晶柱逃离本层!!!
@ -408,7 +410,7 @@ items.bags.herbbag.name=食物袋
items.bags.herbbag.desc=一个小袋子装你的食物。
items.bags.kingbag.name=红宝石魔袋
items.bags.kingbag.desc=矮人国王的€定制背包€,好东西,就要齐分享!
items.scrolls.scrollofupgrade.ac_upgrade=使用所有升级
items.weapon.melee.runicblade.name=贤者之剑
items.weapon.melee.runicblade.stats_desc=这把武器可以在战斗中获得更多的伤害!
@ -422,7 +424,7 @@ items.weapon.melee.runicblade.desc=这把武器据说曾经是300年前贤者使
\n,
items.weapon.melee.locksword.name=归溯钥剑
items.weapon.melee.locksword.desc=来自神秘国度的一把失落神剑,形态像是巨大化的钥匙。据说这把剑能够通过战斗的积累而改变外貌,或许还能在一些特别的地方开启东西,不知道是否真实。该武器无法升级,但可以在战斗中渐渐变强。\n\n武器的战斗经验:
items.weapon.melee.locksword.desc=来自神秘国度的一把失落神剑,形态像是巨大化的钥匙。据说这把剑能够通过战斗的积累而改变外貌,或许还能在一些特别的地方开启东西,不知道是否真实。该武器无法升级,但可以在战斗中通过猎杀敌人渐渐变强,据说还能通过吸收钥匙获得更多经验。\n\n经验:
items.weapon.melee.locksword.stats_desc=这把武器会在攻击时不断积累经验,到达一定阶段时会变化造型,并赋予或加强紊乱附魔的效果与增加固定伤害值。
items.weapon.melee.locksword.ac_interlevel_tp=远古遗迹
items.weapon.melee.locksword.go_interlevel=探索之外
@ -1483,6 +1485,11 @@ items.scrolls.scrollofupgrade.inv_title=选择一件要升级的物品
items.scrolls.scrollofupgrade.weaken_curse=升级卷轴减弱了物品上的诅咒。
items.scrolls.scrollofupgrade.remove_curse=升级卷轴净化了物品上的诅咒!
items.scrolls.scrollofupgrade.desc=这张卷轴可以升级一件物品,提升其品质。法杖的魔力及充能数会获得提升,武器和护甲可以造成或吸收更多的伤害,戒指的效果将会增强。\n\n这张卷轴甚至偶尔能减弱甚至驱散诅咒效果不过不如祛邪卷轴那么稳定。\n\n卷轴的魔力也会影响甚至消除武器的附魔或护甲的刻印。从+4开始升级装备可能会消除附魔或刻印在+8或者更高等级则会必定消除。
items.scrolls.scrollofupgrade.ac_upgrade=使用所有升级
items.scrolls.scrollofupgrade.upgradeall_title=三思而后行!!!
items.scrolls.scrollofupgrade.upgradeall_desc=你确定要使用所有升级卷轴吗?这将会消耗你背包所有的升级卷轴来升级你选定的物品。
items.scrolls.scrollofupgrade.upgradeall_confirm=是的,我要升级!
items.scrolls.scrollofupgrade.upgradeall_cancel=不,我再想想。
@ -2038,7 +2045,7 @@ items.weapon.melee.sai.attacker=迅猛一击,回血成功!
items.weapon.melee.scimitar.name=弯刀
items.weapon.melee.scimitar.stats_desc=这是一把比较快的武器。
items.weapon.melee.scimitar.desc=一把厚重的弯刀。它的形状能让它进行更快但不甚强力的攻击。
f
items.weapon.melee.spear.name=长矛
items.weapon.melee.spear.stats_desc=这是一件相当缓慢的武器。\n这把武器有额外的攻击距离。
items.weapon.melee.spear.desc=这是一根装着锋锐铁刺的细长木杆。

View File

@ -236,7 +236,7 @@ badges$badge.drawf_head.title=“旧时代”的终结
badges$badge.drawf_head.desc=击败矮人将军,让他从诅咒中解脱。
badges$badge.brcler.title=起始归一
badges$badge.brcler.desc=尽管死灵法师创造了这个恐怖的机器但你已经粉碎了DM-ZERO的阴谋现在是时候回归正常生活了。\n[完成首领对决]
badges$badge.brcler.desc=尽管死灵法师创造了这个恐怖的机器但你已经粉碎了DM-ZERO的阴谋现在是时候回归正常生活了。\n[击败最终兵器-DM-ZERO未实装]
badges$badge.take_item.title=宝藏探索者
badges$badge.take_item.desc=获得宝藏迷宫的三个隐藏宝藏,切记,对决不是拟态王的本意。

View File

@ -550,6 +550,6 @@ ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x80=1.修复灯火值不扣减的错
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x81=1.优化灯火体验\n其他错误修复。
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x82=1.修复商店抢劫的一些错误\n2.修复部分崩溃错误\n3.修复Beta2古神无限循环的错误\n4.修复黄金时代的一些错误\n5.修复部分徽章获取错误问题
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x82=1.修复商店抢劫的一些错误\n2.修复部分崩溃错误\n3.修复Beta2古神无限循环的错误\n4.修复黄金时代的一些错误\n5.修复部分徽章获取错误问题\n6.修复部分成就无法获得的问题\n7.改善部分房间不会在1层生成为隐藏层\n7.修复商人的一些错误\n8.修复部分怪物掉落问题
//ui.changelist.mlpd.vm0_5_x_changes.xxx//

View File

@ -150,19 +150,9 @@ windows.bosssettingwindows.boss_3 = 救赎寒冰公主
windows.bosssettingwindows.boss_4 = 对峙矮人将军
windows.bosssettingwindows.boss_5 = 直面水晶意志
windows.bosssettingwindows.boss_unselect = 该领袖正在调查中
windows.bosssettingwindows.bossattack=支付金币挑战该领袖?
windows.bosssettingwindows.bossgold=在游戏中,随着你探索的深度,你可能遇到一些突发事件,从而走向不同的路线。\n\n如果你不想去调查可以支付一笔资金来强制挑战当你不想要的时候金币随时可以完全返还给你。但如果你已经进行了挑战金币将不能返还给你。\n\n染血金币控制终端---霜落帝国出品。\n\n本次需要支付的金币_
windows.bosssettingwindows.bug=购买通行证
windows.bosssettingwindows.not_yet=取消
windows.bosssettingwindows.no_money=ERROR:你的金币不够,无法购买通行证。
windows.bosssettingwindows.no_level=ERROR:不能在交界处退还金币。
windows.bosssettingwindows.getboss=染血金币控制终端已经为你打开一条秘密通道,其路径通往:
windows.bosssettingwindows.takenotapplic=你已取消挑战此领袖,已返还金币:
windows.bosssettingwindows.cancal=ERROR:用户取消购买,已自动关闭。
windows.bosssettingwindows.boss_unselect_0 = 深入熔岩洞穴(未实装)
windows.bosssettingwindows.boss_unselect_1 = 探寻宝藏迷宫(调查中)
windows.bosssettingwindows.boss_unselect_4 = 直面水晶意志(未实装)
windows.bosssettingwindows.dm300=DM-300
windows.bosssettingwindows.ice=冰雪魔女

View File

@ -1,20 +0,0 @@
package com.shatteredpixel.shatteredpixeldungeon;
public class DLC {
public static final int BOSSRUSH = 1;
public static final int BACKGO = 2;
public static final int MAX_VALUE = 4;
public static final String[] NAME_IDS = {
"bossrush",
"kling"
};
public static final int[] MASKS = {
BOSSRUSH,BACKGO
};
public String name;
}

View File

@ -5,6 +5,7 @@ import static com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero.badLante
import static com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero.goodLanterFire;
import static com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene.cure;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff.MagicGirlSayKill;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff.MagicGirlSayMoneyMore;
@ -33,12 +34,10 @@ public class Nyctophobia extends Buff implements Hero.Doom {
public boolean act() {
if(hero.lanterfire == 90){
cure( Dungeon.hero );
goodLanterFire();
spend(20f);
}
if (hero.lanterfire < 51 && hero.lanterfire>31) {
cure( Dungeon.hero );
badLanterFire();
@ -80,8 +79,8 @@ public class Nyctophobia extends Buff implements Hero.Doom {
return true;
}
if (hero.lanterfire >= 0 ) {
hero.damageLantern(1+Dungeon.depth/8);
spend(10f+(float) Dungeon.depth/8);
hero.damageLantern(1+Challenges.activeChallenges()/5);
spend(20f-(float) Dungeon.depth/5);
} else {
spend(STEP);
}

View File

@ -89,11 +89,13 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfMysticalEnergy;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.AquaBlast;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.MagicalInfusion;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfAnmy;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfCorruption;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFrost;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfMagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfRegrowth;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfScale;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.hightwand.WandOfHightHunderStorm;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.SpiritBow;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.BloodthirstyThorn;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Dagger;
@ -162,11 +164,12 @@ public enum HeroClass {
//new Amulet().quantity(1).identify().collect();
new TengusMask().quantity(1).identify().collect();
new TimekeepersHourglass().quantity(1).identify().collect();
new WandOfAnmy().quantity(1).identify().collect();
Buff.affect(hero, ChampionHero.AntiMagic.class, 50000f);
new WraithAmulet().quantity(1).identify().collect();
new BloodthirstyThorn().quantity(1).identify().collect();
new PotionOfLightStromCloud().quantity(10).identify().collect();
new WandOfHightHunderStorm().quantity(1).identify().collect();
new WashCrime().quantity(1).identify().collect();
new MagicTorch().quantity(1).identify().collect();
new LamellarArmor().quantity(1).identify().collect();

View File

@ -16,7 +16,6 @@ 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.sprites.GooSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.SlimePrincessSprite;
import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
@ -88,7 +87,7 @@ public class SlimePrincess extends Mob {
}
if (HP*2 > HT) {
BossHealthBar.bleed(false);
((GooSprite)sprite).spray(false);
//((GooSprite)sprite).spray(false);
HP = Math.min(HP, HT);
}
} else {
@ -135,7 +134,7 @@ public class SlimePrincess extends Mob {
super.updateSpriteState();
if (pumpedUp > 0){
((GooSprite)sprite).pumpUp( pumpedUp );
//((GooSprite)sprite).pumpUp( pumpedUp );
}
}
@ -143,7 +142,7 @@ public class SlimePrincess extends Mob {
protected boolean doAttack( Char enemy ) {
if (pumpedUp == 1) {
pumpedUp++;
((GooSprite)sprite).pumpUp( pumpedUp );
//((GooSprite)sprite).pumpUp( pumpedUp );
spend( attackDelay() );
@ -154,13 +153,13 @@ public class SlimePrincess extends Mob {
if (visible) {
if (pumpedUp >= 2) {
((GooSprite) sprite).pumpAttack();
//((GooSprite) sprite).pumpAttack();
} else {
sprite.attack(enemy.pos);
}
} else {
if (pumpedUp >= 2){
((GooSprite)sprite).triggerEmitters();
// ((GooSprite)sprite).triggerEmitters();
}
attack( enemy );
spend( attackDelay() );
@ -175,7 +174,7 @@ public class SlimePrincess extends Mob {
pumpedUp++;
}
((GooSprite)sprite).pumpUp( pumpedUp );
//((GooSprite)sprite).pumpUp( pumpedUp );
if (Dungeon.level.heroFOV[pos]) {
sprite.showStatus( CharSprite.NEGATIVE, Messages.get(this, "!!!") );
@ -215,7 +214,7 @@ public class SlimePrincess extends Mob {
if ((HP*2 <= HT) && !bleeding){
BossHealthBar.bleed(true);
sprite.showStatus(CharSprite.NEGATIVE, Messages.get(this, "enraged"));
((GooSprite)sprite).spray(true);
//((GooSprite)sprite).spray(true);
yell(Messages.get(this, "gluuurp"));
}
LockedFloor lock = Dungeon.hero.buff(LockedFloor.class);

View File

@ -1,6 +1,12 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.AQUAPHOBIA;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.EXSG;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.RLPT;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.SBSG;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.Statistics;
@ -478,6 +484,22 @@ public class YogDzewa extends Mob {
}
}
if(Dungeon.isChallenged(RLPT)){
Badges.GOODRLPT();
}
if(Dungeon.isChallenged(AQUAPHOBIA)){
Badges.CLEARWATER();
}
if(Dungeon.isChallenged(SBSG)){
Badges.BIGX();
}
if(Dungeon.isChallenged(EXSG)){
Badges.EXSG();
}
updateVisibility(Dungeon.level);
GameScene.bossSlain();

View File

@ -87,9 +87,10 @@ public class SakaFishBoss extends Boss {
if (!Dungeon.level.mobs.contains(this)){
return;
}
if (dmg >= 25){
//takes 5/6/7/8/9/10 dmg at 5/7/10/14/19/25 incoming dmg
AncientMysteryCityBossLevel.State level = ((AncientMysteryCityBossLevel)Dungeon.level).pro();
if (level==AncientMysteryCityBossLevel.State.FALL_BOSS){
dmg = 10 + (int)(Math.sqrt(2*(dmg - 4) + 1) - 1)/2;
} else if (dmg >= 20){
dmg = 14 + (int)(Math.sqrt(8*(dmg - 4) + 1) - 1)/2;
}
@ -109,7 +110,7 @@ public class SakaFishBoss extends Boss {
lock.addTime(dmg*3f);
}
AncientMysteryCityBossLevel.State level = ((AncientMysteryCityBossLevel)Dungeon.level).pro();
//phase 1 of the fight is over
if (HP <= HT/2 && level==AncientMysteryCityBossLevel.State.TWO_BOSS){
HP = (HT/2);
@ -144,14 +145,11 @@ public class SakaFishBoss extends Boss {
@Override
public int damageRoll() {
int min = 20;
int max = (HP*2 <= HT) ? 20 : 10;
if (pumpedUp > 0) {
pumpedUp = 0;
return Random.NormalIntRange( min*3, max*3 );
} else {
return Random.NormalIntRange( min, max );
}
AncientMysteryCityBossLevel.State level = ((AncientMysteryCityBossLevel)Dungeon.level).pro();
if(level==AncientMysteryCityBossLevel.State.FALL_BOSS)
return Random.NormalIntRange(40, 75);
else
return Random.NormalIntRange(30, 40);
}
@Override
@ -170,7 +168,7 @@ public class SakaFishBoss extends Boss {
@Override
public int drRoll() {
AncientMysteryCityBossLevel.State level = ((AncientMysteryCityBossLevel)Dungeon.level).pro();
return level == AncientMysteryCityBossLevel.State.FALL_BOSS ? 5 : 15;
return level == AncientMysteryCityBossLevel.State.FALL_BOSS ? 10 : 45;
}
@ -263,8 +261,6 @@ public class SakaFishBoss extends Boss {
Dungeon.level.unseal();
GetBossLoot();
GameScene.bossSlain();
Dungeon.level.drop( new CrystalKey( Dungeon.depth ), pos ).sprite.drop();
@ -278,9 +274,9 @@ public class SakaFishBoss extends Boss {
Dungeon.level.drop( new SakaMeat(), pos + ofs ).sprite.drop( pos );
}
Dungeon.level.drop( new WaterSoul(), pos-1 ).sprite.drop();
Dungeon.level.drop( new WaterSoul(), pos ).sprite.drop();
Dungeon.level.drop( new SakaFishSketon(), pos ).sprite.drop();
Dungeon.level.drop( new WaterSoul(), pos+1 ).sprite.drop();
Dungeon.level.drop( new WaterSoul(), pos ).sprite.drop();
Badges.KILLSAKA();
@ -455,7 +451,7 @@ public class SakaFishBoss extends Boss {
public void call() {
AncientMysteryCityBossLevel.State level = ((AncientMysteryCityBossLevel)Dungeon.level).pro();
if (leapVictim != null && alignment != leapVictim.alignment){
enemy.damage( Random.NormalIntRange( 20, 40 ), this );
enemy.damage( Random.NormalIntRange( 40, 60 ), this );
if(level == AncientMysteryCityBossLevel.State.FALL_BOSS){
//三阶段 魔法风暴
FishStorm(sprite.ch);
@ -540,7 +536,7 @@ public class SakaFishBoss extends Boss {
int oldPos = pos;
if (target != -1 && getCloser( target )) {
spend( 6f );
spend( 1f );
return moveSprite( oldPos, pos );
} else {
@ -582,7 +578,7 @@ public class SakaFishBoss extends Boss {
}
if (hit( this, ch, true )) {
ch.damage( Random.NormalIntRange( 20, 40 ), new DeathGaze() );
ch.damage( Random.NormalIntRange( 30, 60 ), new DeathGaze() );
if(level == AncientMysteryCityBossLevel.State.FALL_BOSS){
dropRocks(enemy);
}
@ -626,7 +622,7 @@ public class SakaFishBoss extends Boss {
ray.path.get(ray.dist),
null
);
if( Dungeon.level.water[ray.path.get(ray.dist)]){
if( Dungeon.level.water[ray.path.get(ray.dist)] || Random.Int(10)==0){
GameScene.add(Blob.seed(ray.path.get(ray.dist), 30, FrostFire.class));
Level.set(ray.path.get(ray.dist), Terrain.EMPTY);
GameScene.updateMap( ray.path.get(ray.dist) );

View File

@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
@ -69,7 +70,6 @@ public class ImpShopkeeper extends Shopkeeper {
heap.destroy();
}
}
destroy();
sprite.emitter().burst( Speck.factory( Speck.WOOL ), 15 );
@ -78,7 +78,8 @@ public class ImpShopkeeper extends Shopkeeper {
@Override
public void destroy() {
super.destroy();
HP = 0;
Actor.remove( this );
for (Heap heap: Dungeon.level.heaps.valueList()) {
if (heap.type == Heap.Type.FOR_SALE) {
if (ShatteredPixelDungeon.scene() instanceof GameScene) {

View File

@ -1,12 +1,18 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle;
import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
import com.shatteredpixel.shatteredpixeldungeon.journal.Notes;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.NxhySprite;
public class Nxhy extends Shopkeeper {
@ -39,6 +45,11 @@ public class Nxhy extends Shopkeeper {
flee();
}
@Override
public int defenseSkill( Char enemy ) {
return 0;
}
@Override
public void add( Buff buff ) {
flee();
@ -48,16 +59,22 @@ public class Nxhy extends Shopkeeper {
public void flee() {
destroy();
Notes.remove(Notes.Landmark.SHOP);
CellEmitter.get(pos).burst(ElmoParticle.FACTORY, 6);
hero.sprite.burst(15597568, 9);
sprite.killAndErase();
CellEmitter.get( pos ).burst( ElmoParticle.FACTORY, 6 );
}
@Override
public void destroy() {
super.destroy();
Actor.remove( this );
HP = 0;
for (Heap heap: Dungeon.level.heaps.valueList()) {
if (heap.type == Heap.Type.FOR_SALE) {
CellEmitter.get( heap.pos ).burst( ElmoParticle.FACTORY, 4 );
if (ShatteredPixelDungeon.scene() instanceof GameScene) {
CellEmitter.get(heap.pos).burst(ElmoParticle.FACTORY, 4);
}
if (heap.size() == 1) {
heap.destroy();
} else {

View File

@ -64,7 +64,7 @@ public class Shopkeeper extends NPC {
properties.add(Property.IMMOVABLE);
}
public static int MAX_BUYBACK_HISTORY = 4;
public static int MAX_BUYBACK_HISTORY = 3;
public ArrayList<Item> buybackItems = new ArrayList<>();
public static boolean seenBefore = false;
@Override

View File

@ -40,14 +40,18 @@ import com.shatteredpixel.shatteredpixeldungeon.items.food.MysteryMeat;
import com.shatteredpixel.shatteredpixeldungeon.items.journal.DocumentPage;
import com.shatteredpixel.shatteredpixeldungeon.items.journal.Guidebook;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlame;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfWealth;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.FireFishSword;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.IceFishSword;
import com.shatteredpixel.shatteredpixeldungeon.journal.Document;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Bundlable;
import com.watabou.utils.Bundle;
@ -93,6 +97,8 @@ public class Heap implements Bundlable {
break;
case WHITETOMB:
ScrollOfTeleportation.appear( hero,hero.pos+5 );
new PotionOfLiquidFlame().quantity(1).identify().collect();
GLog.n("你在探索的时候,你发现了一瓶液态火焰药水,你收集了它,但同时被传入了墓穴的中央……");
break;
case TELECRYSTL:
ScrollOfTeleportation.appear( hero,level.entrance );
@ -222,6 +228,9 @@ public class Heap implements Bundlable {
} else if (item instanceof Dewdrop) {
items.remove( item );
evaporated = true;
} else if (item instanceof IceFishSword) {
replace( item, FireFishSword.resetling( (IceFishSword) item ) );
evaporated = true;
} else if (item instanceof MysteryMeat || item instanceof FrozenCarpaccio) {
replace( item, ChargrilledMeat.cook( item.quantity ) );
burnt = true;
@ -320,7 +329,10 @@ public class Heap implements Bundlable {
boolean frozen = false;
for (Item item : items.toArray( new Item[0] )) {
if (item instanceof MysteryMeat) {
replace( item, FrozenCarpaccio.cook( (MysteryMeat)item ) );
replace(item, FrozenCarpaccio.cook((MysteryMeat) item));
frozen = true;
} else if (item instanceof FireFishSword) {
replace(item, IceFishSword.cook((FireFishSword) item));
frozen = true;
} else if (item instanceof Potion && !item.unique) {
items.remove(item);

View File

@ -76,7 +76,7 @@ public class Item implements Bundlable {
public int flasks;
protected int quantity = 1;
protected int quantity = 1;
public boolean dropsDownHeap = false;
public int level = 0;

View File

@ -22,10 +22,13 @@
package com.shatteredpixel.shatteredpixeldungeon.items.keys;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.LockSword;
import com.shatteredpixel.shatteredpixeldungeon.journal.Notes;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndJournal;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Bundle;
@ -54,6 +57,13 @@ public abstract class Key extends Item {
Sample.INSTANCE.play( Assets.Sounds.ITEM );
hero.spendAndNext( TIME_TO_PICK_UP );
GameScene.updateKeyDisplay();
if(hero.belongings.weapon instanceof LockSword){
LockSword weapon = (LockSword)hero.belongings.weapon;
weapon.lvl += 15*(Dungeon.depth/5);
hero.sprite.showStatus(0x123456ff, String.valueOf(15*(Dungeon.depth/5)));
GLog.p("归溯钥剑吸收了地牢钥匙中的残余魔力,你感觉它似乎变得更加强大了。");
}
return true;
}

View File

@ -6,6 +6,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.lightblack;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LighS;
@ -37,7 +38,7 @@ public class OilLantern extends Item {
private static final String TXT_STATUS = "%d%%";
private boolean active = false;
private int charge = 100;
private int charge = 100+Challenges.activeChallenges()/5*50;
public int flasks = 0;
public OilLantern() {

View File

@ -5,9 +5,10 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.scenes.InterlevelScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.Game;
import java.util.ArrayList;
@ -37,7 +38,8 @@ public class SakaFishSketon extends Item {
GLog.w(Messages.get(this,"cannot_send"));
return;
}
GameScene.show(new BackGoKey.WndSelectLevel());
InterlevelScene.mode = InterlevelScene.Mode.RETURN;
Game.switchScene(InterlevelScene.class);
}
}

View File

@ -48,7 +48,7 @@ public abstract class InventoryScroll extends Scroll {
GameScene.selectItem( itemSelector );
}
private void confirmCancelation() {
void confirmCancelation() {
GameScene.show( new WndOptions(new ItemSprite(this),
Messages.titleCase(name()),
Messages.get(this, "warning"),
@ -70,7 +70,7 @@ public abstract class InventoryScroll extends Scroll {
} );
}
private String inventoryTitle(){
String inventoryTitle(){
return Messages.get(this, "inv_title");
}

View File

@ -21,10 +21,13 @@
package com.shatteredpixel.shatteredpixeldungeon.items.scrolls;
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.buffs.Blindness;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Degrade;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
@ -32,15 +35,26 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.UnstableSpellbook;
import com.shatteredpixel.shatteredpixeldungeon.items.bags.Bag;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.Icons;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndOptions;
import com.watabou.noosa.audio.Sample;
import java.util.ArrayList;
public class ScrollOfUpgrade extends InventoryScroll {
public static final String AC_UPGRADE = "UPGRADE";
{
icon = ItemSpriteSheet.Icons.SCROLL_UPGRADE;
preferredBag = Belongings.Backpack.class;
@ -53,11 +67,54 @@ public class ScrollOfUpgrade extends InventoryScroll {
return item.isUpgradable();
}
@Override
public void execute(Hero hero, String action) {
super.execute(hero, action);
if (action.equals(AC_UPGRADE)){
if (hero.buff(MagicImmune.class) != null){
GLog.w( Messages.get(this, "no_magic") );
} else if (hero.buff( Blindness.class ) != null) {
GLog.w( Messages.get(this, "blinded") );
} else if (hero.buff(UnstableSpellbook.bookRecharge.class) != null
&& hero.buff(UnstableSpellbook.bookRecharge.class).isCursed()){
GLog.n( Messages.get(this, "cursed") );
} else {
GameScene.show(new WndOptions(Icons.get(Icons.WARNING),
Messages.get(this, "upgradeall_title"),
Messages.get(this, "upgradeall_desc"),
Messages.get(this, "upgradeall_confirm"),
Messages.get(this, "upgradeall_cancel") ){
@Override
protected void onSelect(int index) {
if (index == 0){
curUser = hero;
curItem = detachAll( hero.belongings.backpack );
GameScene.selectItem( itemSelector2);
}
}
});
}
}
}
@Override
public ArrayList<String> actions(Hero hero) {
ArrayList<String> actions = super.actions( hero );
if (isIdentified() && !anonymous) actions.add(AC_UPGRADE);
return actions;
}
@Override
protected void onItemSelected( Item item ) {
upgrade( curUser );
upgradeItem(item);
Talent.onUpgradeScrollUsed( Dungeon.hero );
}
private void upgradeItem(Item item) {
Degrade.detach( curUser, Degrade.class );
//logic for telling the user when item properties change from upgrades
@ -109,13 +166,11 @@ public class ScrollOfUpgrade extends InventoryScroll {
item.upgrade();
}
Talent.onUpgradeScrollUsed( Dungeon.hero );
Badges.validateItemLevelAquired( item );
Badges.validateItemLevelAquired(item);
Statistics.upgradesUsed++;
Badges.validateMageUnlock();
}
public static void upgrade( Hero hero ) {
hero.sprite.emitter().start( Speck.factory( Speck.UP ), 0.2f, 3 );
}
@ -129,7 +184,7 @@ public class ScrollOfUpgrade extends InventoryScroll {
GLog.p( Messages.get(ScrollOfUpgrade.class, "remove_curse") );
hero.sprite.emitter().start( ShadowParticle.UP, 0.05f, 10 );
}
@Override
public int value() {
return isKnown() ? 50 * quantity : super.value();
@ -139,4 +194,94 @@ public class ScrollOfUpgrade extends InventoryScroll {
public int energyVal() {
return isKnown() ? 8 * quantity : super.energyVal();
}
}
protected WndBag.ItemSelector itemSelector2 = new WndBag.ItemSelector() {
@Override
public String textPrompt() {
return inventoryTitle();
}
@Override
public Class<? extends Bag> preferredBag() {
return preferredBag;
}
@Override
public boolean itemSelectable(Item item) {
return usableOnItem(item);
}
@Override
public void onSelect( Item item ) {
//FIXME this safety check shouldn't be necessary
//it would be better to eliminate the curItem static variable.
if (!(curItem instanceof InventoryScroll)){
return;
}
if (item != null) {
// time for some copypaste
Degrade.detach( curUser, Degrade.class );
if (item instanceof Weapon){
Weapon w = (Weapon) item;
boolean wasCursed = w.cursed;
boolean hadCursedEnchant = w.hasCurseEnchant();
for (int i = 0; i < curItem.quantity(); i++)
w.upgrade();
if (w.cursedKnown && hadCursedEnchant && !w.hasCurseEnchant()){
removeCurse( Dungeon.hero );
} else if (w.cursedKnown && wasCursed && !w.cursed){
weakenCurse( Dungeon.hero );
}
} else if (item instanceof Armor){
Armor a = (Armor) item;
boolean wasCursed = a.cursed;
boolean hadCursedGlyph = a.hasCurseGlyph();
for (int i = 0; i < curItem.quantity(); i++)
a.upgrade();
if (a.cursedKnown && hadCursedGlyph && !a.hasCurseGlyph()){
removeCurse( Dungeon.hero );
} else if (a.cursedKnown && wasCursed && !a.cursed){
weakenCurse( Dungeon.hero );
}
} else if (item instanceof Wand || item instanceof Ring) {
boolean wasCursed = item.cursed;
for (int i = 0; i < curItem.quantity(); i++)
item.upgrade();
if (item.cursedKnown && wasCursed && !item.cursed){
removeCurse( Dungeon.hero );
}
} else {
for (int i = 0; i < curItem.quantity(); i++)
item.upgrade();
}
((InventoryScroll)curItem).readAnimation();
Sample.INSTANCE.play( Assets.Sounds.READ );
Badges.validateItemLevelAquired(item);
Statistics.upgradesUsed += curItem.quantity();
Badges.validateMageUnlock();
} else if (identifiedByUse && !((Scroll)curItem).anonymous) {
((InventoryScroll)curItem).confirmCancelation();
} else if (!((Scroll)curItem).anonymous) {
curItem.collect( curUser.belongings.backpack );
}
}
};
}

View File

@ -2,7 +2,6 @@ package com.shatteredpixel.shatteredpixeldungeon.items.wands;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
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.blobs.Fire;
@ -35,9 +34,19 @@ public class WandOfAnmy extends DamageWand {
bones = true;
}
public ArrayList<String> actions( Hero hero ) {
ArrayList<String> actions = new ArrayList<>();
if (curCharges > 0 || !curChargeKnown) {
actions.add( AC_ZAP );
}
actions.remove(AC_DROP);
actions.remove(AC_THROW);
return actions;
}
@Override
public ArrayList<String> actions(Hero hero) {
return new ArrayList<>(); //yup, no dropping this one
public int value() {
return 0;
}
public static class AllyToRestart extends AllyBuff {
@ -56,7 +65,7 @@ public class WandOfAnmy extends DamageWand {
public void fx(boolean on) {
if (on) {
target.sprite.add(CharSprite.State.SHIELDED);
Statistics.TryUsedAnmy = true;
//Statistics.TryUsedAnmy = true;
}
else
target.sprite.remove(CharSprite.State.SHIELDED);
@ -129,10 +138,10 @@ public class WandOfAnmy extends DamageWand {
ch.damage(damage, this);
Sample.INSTANCE.play( Assets.Sounds.HIT_MAGIC, 1, 1.1f * Random.Float(0.87f, 1.15f) );
if (ch.isAlive() && !Statistics.TryUsedAnmy && (!ch.properties().contains(Char.Property.BOSS) || !ch.properties().contains(Char.Property.MINIBOSS))){
if (ch.isAlive() && (!ch.properties().contains(Char.Property.BOSS))){
Buff.affect(ch, AllyToRestart.class);
} else {
GLog.n("不能影响Boss和精英怪,也不能在使用后继续在本层使用,每层仅限一次使用");
GLog.n("不能影响Boss");
}
} else {
Dungeon.level.pressCell(bolt.collisionPos);

View File

@ -9,9 +9,13 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hex;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.utils.Callback;
import com.watabou.utils.Random;
public class FireFishSword extends MeleeWeapon{
@ -22,22 +26,38 @@ public class FireFishSword extends MeleeWeapon{
tier = 6;
ACC = 2.90f; //20% boost to accuracy
DLY = 1.6f; //2x speed
cursed = true;
enchant(Enchantment.randomCurse());
}
public static Weapon resetling(IceFishSword ingredient ) {
FireFishSword result = new FireFishSword();
result.quantity = ingredient.quantity();
result.identify();
result.level = ingredient.level;
if(ingredient.customName != null){
result.customName = ingredient.customName;
}
GLog.n(Messages.get( FireFishSword.class, "resetling"),result.name());
return result;
}
@Override
public int max(int lvl) {
return 3*(tier+1) + //45 base, up from 30
lvl*(tier+1); //scaling unchanged
}
@Override
public int min(int lvl) {
return 1*(tier+5) + //45 base, up from 30
lvl*(tier+1); //scaling unchanged
return (tier + 1)+ + //10 base, down from 20
lvl*Math.round(1.0f*(tier+1)); //scaling unchanged
}
@Override
public int max(int lvl) {
return 2*(tier+2) + //10 base, down from 20
lvl*Math.round(1.0f*(tier+1)); //scaling unchanged
}
public void bolt(Integer target, final Mob mob){
if (target != null) {
@ -71,7 +91,7 @@ public class FireFishSword extends MeleeWeapon{
}
public int proc(Char attacker, Char defender, int damage) {
if(attacker instanceof Hero){
if(attacker instanceof Hero && Random.Int(10)==3){
for(Mob mob : ((Hero) attacker).visibleEnemiesList()){
bolt(mob.pos, mob);
}

View File

@ -17,6 +17,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.utils.Callback;
import com.watabou.utils.Random;
@ -34,6 +35,20 @@ public class IceFishSword extends Weapon {
enchant(Enchantment.randomCurse());
}
public static Weapon cook(FireFishSword ingredient ) {
IceFishSword result = new IceFishSword();
/** 传递数量,链接等级 自动鉴定 */
result.quantity = ingredient.quantity();
result.level = ingredient.level;
result.identify();
//双形态武器测试 如果有自定义名字 需要传递名字
if(ingredient.customName != null){
result.customName = ingredient.customName;
}
GLog.b(Messages.get( IceFishSword.class, "cook",result.name()));
return result;
}
@Override
public Item upgrade() {
return upgrade(false);
@ -132,20 +147,20 @@ public class IceFishSword extends Weapon {
@Override
public int min(int lvl) {
return (Dungeon.depth / 5 + tier + 1)+ + //10 base, down from 20
return (tier + 2)+ + //10 base, down from 20
lvl*Math.round(1.0f*(tier+1)); //scaling unchanged
}
@Override
public int max(int lvl) {
return 2*(Dungeon.depth/5+tier+1) + //10 base, down from 20
return 2*(tier+3) + //10 base, down from 20
lvl*Math.round(1.0f*(tier+1)); //scaling unchanged
}
public int proc(Char attacker, Char defender, int damage) {
if(attacker instanceof Hero && Random.Float()<0.2f){
if(attacker instanceof Hero && Random.Int(10)==3){
for(Mob mob : ((Hero) attacker).visibleEnemiesList()){
bolt(mob.pos, mob);
}

View File

@ -32,7 +32,7 @@ import java.util.ArrayList;
public class LockSword extends MeleeWeapon {
private int lvl = 0;
public int lvl = 0;
public LockSword() {
super.image = ItemSpriteSheet.DG3;
@ -67,7 +67,7 @@ public class LockSword extends MeleeWeapon {
if (index == 0) {
InterlevelScene.mode = InterlevelScene.Mode.ANCITYBOSS;
Game.switchScene(InterlevelScene.class);
lvl -= 500;
lvl -= 300;
}
}
});
@ -124,18 +124,18 @@ public class LockSword extends MeleeWeapon {
public int proc(Char attacker, Char defender, int damage ) {
int dmg;
LockedFloor lock = Dungeon.hero.buff(LockedFloor.class);
if (lvl >= 1000) {
lvl += 1;
} else if (defender.properties().contains(Char.Property.BOSS) && defender.HP <= damage && lvl <= 1000) {
//目标Boss血量小于实际伤害判定为死亡,+100
lvl += 50;
} else if (defender.properties().contains(Char.Property.MINIBOSS) && defender.HP <= damage && lvl <= 1000) {
//目标迷你Boss血量小于实际伤害判定为死亡,+30
lvl += 20;
} else if (defender.HP <= damage && lvl <= 1000) {
//目标血量小于实际伤害判定为死亡,+15
lvl += 10;
} else if (defender.properties().contains(Char.Property.BOSS) && defender.HP <= damage && lvl <= 1000 && lock == null) {
//目标Boss血量小于实际伤害判定为死亡,+9
lvl += 9;
} else if (defender.properties().contains(Char.Property.MINIBOSS) && defender.HP <= damage && lvl <= 1000 && lock == null) {
//目标迷你Boss血量小于实际伤害判定为死亡,+7
lvl += 7;
} else if (defender.HP <= damage && lvl <= 1000 && lock == null) {
//目标血量小于实际伤害判定为死亡,+5
lvl += 5;
}
if (lvl>= 900) {

View File

@ -61,7 +61,7 @@ public class Sai extends MeleeWeapon {
//50x0.1+7x0.5+1=10+3.5+1=15
if(attacker.HP >= attacker.HT){
GLog.p("血量已满!无法回血");
} else if (Random.Float()<0.35f) {
} else if (Random.Int(10)==2) {
R = (int) (attacker.HT * 0.1 + (buffedLvl() * 0.5) + 1.5);
attacker.HP +=attacker.HT * 0.1 + (buffedLvl()) + 1.5;
attacker.sprite.showStatus(CharSprite.POSITIVE, ("+" + R + "HP"));
@ -75,7 +75,13 @@ public class Sai extends MeleeWeapon {
@Override
public int max(int lvl) {
return Math.round(1.2f*(tier+1)) + //10 base, down from 20
lvl*Math.round(0.8f*(tier+1)); //+2 per level, down from +4
lvl*Math.round(1.2f*(tier+1)); //+2 per level, down from +4
}
@Override
public int min(int lvl) {
return Math.round(0.74f*(tier+1)) + //10 base, down from 20
lvl*Math.round(0.65f*(tier+1)); //+2 per level, down from +4
}
}

View File

@ -38,8 +38,8 @@ public class WarHammer extends MeleeWeapon {
hitSoundPitch = 1f;
tier = 5;
ACC = 1.90f; //20% boost to accuracy
DLY = 1.50f; //2x speed
ACC = 1.90f; //90% boost to accuracy
DLY = 1.50f; //1.5x speed
}
@Override

View File

@ -1,5 +1,6 @@
package com.shatteredpixel.shatteredpixeldungeon.levels;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import static com.shatteredpixel.shatteredpixeldungeon.levels.AncientMysteryCityBossLevel.State.END_BOSS;
import static com.shatteredpixel.shatteredpixeldungeon.levels.AncientMysteryCityBossLevel.State.FALL_BOSS;
@ -134,6 +135,8 @@ public class AncientMysteryCityBossLevel extends Level{
private static final short S = Terrain.BOOKSHELF;
private static final short A = Terrain.EXIT;
private static final int[] WorldRoomShort = {
L,L,L,L,L,L,L,L,L,L,L,L,W,W,W,L,L,L,L,L,L,L,L,L,L,L,L,
L,R,R,R,R,R,R,L,R,R,R,D,E,R,E,W,R,R,R,L,R,R,R,R,R,R,L,
@ -159,7 +162,7 @@ public class AncientMysteryCityBossLevel extends Level{
L,R,R,R,W,R,R,W,R,R,R,R,R,R,R,R,R,R,R,W,R,R,W,R,R,R,L,
L,L,L,L,W,W,R,R,R,R,R,R,R,R,R,R,R,R,R,R,K,D,W,L,L,L,L,
L,R,R,L,L,W,E,C,R,R,R,R,R,R,R,R,R,R,R,C,E,W,L,L,R,R,L,
L,R,R,R,L,W,W,D,R,R,R,R,R,R,R,R,R,R,R,D,W,W,L,R,R,R,L,
L,R,R,R,L,W,W,D,R,R,R,R,R,A,R,R,R,R,R,D,W,W,L,R,R,R,L,
L,R,L,R,L,W,W,W,W,W,W,W,W,G,W,W,W,W,W,W,W,W,L,R,L,R,L,
L,R,R,R,L,R,R,W,L,R,R,R,E,L,E,R,R,R,R,W,R,R,L,R,R,R,L,
L,L,R,L,L,R,W,W,W,L,R,S,S,L,S,S,R,L,W,W,W,R,L,L,R,L,L,
@ -221,7 +224,7 @@ public class AncientMysteryCityBossLevel extends Level{
super.occupyCell( ch );
boolean isTrue = ch.pos == LDBossDoor && ch == Dungeon.hero && Dungeon.level.distance(ch.pos, entrance) >= 2;
boolean isTrue = ch.pos == LDBossDoor && ch == hero && Dungeon.level.distance(ch.pos, entrance) >= 2;
//如果有生物来到BossDoor的下一个坐标且生物是玩家那么触发seal() .
if (map[getBossDoor] == Terrain.DOOR && isTrue || map[getBossDoor] == Terrain.EMBERS && isTrue) {
@ -239,7 +242,7 @@ public class AncientMysteryCityBossLevel extends Level{
}
}
//GLog.w(String.valueOf(hero.pos));
GLog.w(String.valueOf(hero.pos));
}

View File

@ -56,7 +56,7 @@ public class AncityLevel extends Level {
case 85:
return Terrain.LOCKED_EXIT;
case 17:
return Dungeon.depth == 27 ? Terrain.CHASM : Terrain.EXIT;
return Terrain.EXIT;
case 83:
return Dungeon.depth == 17 || Dungeon.depth == 27 ? Terrain.ENTRANCE : 14;
case 99:

View File

@ -109,7 +109,7 @@ public class LevelRules {
if ((Statistics.boss_enhance & 0x4) != 0) {
return new CavesGirlDeadLevel();
} else {
return Random.Float() <= 0.4f ? new CaveTwoBossLevel() : new CaveTwoBossLevel();
return Random.Float() <= 0.4f ? new CaveTwoBossLevel() : new NewCavesBossLevel();
}
case 16:
case 17:

View File

@ -5,6 +5,7 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special;
import static com.shatteredpixel.shatteredpixeldungeon.Statistics.lanterfireactive;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
@ -29,6 +30,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.food.Food;
import com.shatteredpixel.shatteredpixeldungeon.items.food.MeatPie;
import com.shatteredpixel.shatteredpixeldungeon.items.food.SmallRation;
import com.shatteredpixel.shatteredpixeldungeon.items.lightblack.OilPotion;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfIdentify;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMapping;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRemoveCurse;
@ -144,7 +146,12 @@ public class NxhyShopRoom extends SpecialRoom {
itemsToSpawn2.add(Generator.randomUsingDefaults(Generator.Category.WAND));
if(lanterfireactive) {
itemsToSpawn2.add(new OilPotion());
if(Challenges.activeChallenges() > 6){
itemsToSpawn2.add(new OilPotion());
itemsToSpawn2.add(new OilPotion());
} else {
itemsToSpawn2.add(new OilPotion());
}
}
itemsToSpawn2.add(new ScrollOfIdentify());
@ -158,8 +165,8 @@ public class NxhyShopRoom extends SpecialRoom {
break;
case 3:
case 4:
itemsToSpawn2.add(new YellowSunBooks());
itemsToSpawn2.add(new GrassKingBooks());
itemsToSpawn2.add(new YellowSunBooks().quantity(3));
itemsToSpawn2.add(new GrassKingBooks().quantity(3));
break;
case 5:
itemsToSpawn2.add(new MeatPie());
@ -174,7 +181,7 @@ public class NxhyShopRoom extends SpecialRoom {
}
itemsToSpawn2.add(item);
}
itemsToSpawn2.add(new SmallRation());
itemsToSpawn2.add(new PotionOfHealing());
itemsToSpawn2.add(new SmallRation());
int Int = Random.Int(4);
if (Int == 0) {
@ -190,13 +197,13 @@ public class NxhyShopRoom extends SpecialRoom {
int bags = 0;
int i3 = Dungeon.depth;
if (i3 == 6) {
bags = (int) Math.ceil((double) (((float) (5 - hourglass.sandBags)) * 0.2f));
bags = (int) Math.ceil(((float) (5 - hourglass.sandBags)) * 0.2f);
} else if (i3 == 11) {
bags = (int) Math.ceil((double) (((float) (3 - hourglass.sandBags)) * 0.25f));
bags = (int) Math.ceil(((float) (3 - hourglass.sandBags)) * 0.25f);
} else if (i3 == 16) {
bags = (int) Math.ceil((double) (((float) (5 - hourglass.sandBags)) * 0.5f));
bags = (int) Math.ceil(((float) (5 - hourglass.sandBags)) * 0.5f);
} else if (i3 == 20 || i3 == 21) {
bags = (int) Math.ceil((double) (((float) (5 - hourglass.sandBags)) * 0.8f));
bags = (int) Math.ceil(((float) (5 - hourglass.sandBags)) * 0.8f);
}
for (int i4 = 1; i4 <= bags; i4++) {
itemsToSpawn2.add(new TimekeepersHourglass.sandBag());

View File

@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special;
import static com.shatteredpixel.shatteredpixeldungeon.Statistics.lanterfireactive;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
@ -211,9 +212,15 @@ public class ShopRoom extends SpecialRoom {
itemsToSpawn.add( Generator.randomUsingDefaults( Generator.Category.POTION ) );
if(lanterfireactive) {
itemsToSpawn.add(new OilPotion());
if(Challenges.activeChallenges() > 6){
itemsToSpawn.add(new OilPotion());
itemsToSpawn.add(new OilPotion());
} else {
itemsToSpawn.add(new OilPotion());
}
}
itemsToSpawn.add( new ScrollOfIdentify() );
itemsToSpawn.add( new ScrollOfRemoveCurse() );
itemsToSpawn.add( new ScrollOfMagicMapping() );

View File

@ -79,6 +79,8 @@ public class EyeRoom extends SpecialRoom {
// 绘制眼瞳
Painter.set(level, doorX, doorY - 3, Terrain.PEDESTAL);
Painter.set(level, doorX, doorY,Terrain.BARRICADE);
int chestPos = (top + 6) * level.width() + left + 6;
/** 套五个宝箱 */

View File

@ -117,7 +117,12 @@ public class YinYangRoom extends SpecialRoom {
Painter.set(level,right - 1,bottom - 1,Terrain.WALL);
for (Door door : connected.values()) {
door.set(Door.Type.HIDDEN);
if(Dungeon.depth == 1){
door.set(Door.Type.REGULAR);
} else {
door.set(Door.Type.HIDDEN);
}
}
level.addItemToSpawn( new CrystalKey( Dungeon.depth ) );

View File

@ -495,18 +495,25 @@ public class GameScene extends PixelScene {
break;
}
} else {
Banner mapnameSlain = new Banner( BannerSprites.get( BannerSprites.Type.NULL ) );
switch (Dungeon.depth) {
case 0:
WndStory.showChapter( WndStory.ID_FOREST );
break;
case 1:
WndStory.showChapter( WndStory.ID_SEWERS );
mapnameSlain.texture( "interfaces/mapname/forest.png" );
mapnameSlain.show( 0x00FF00, 0.6f, 3f );
scene.showBanner( mapnameSlain );
break;
case 5:
WndStory.showChapter( WndStory.ID_SEWERSBOSS );
break;
case 6:
WndStory.showChapter( WndStory.ID_PRISON );
mapnameSlain.texture( "interfaces/mapname/prison.png" );
mapnameSlain.show( Window.MLPD_COLOR, 0.6f, 3f );
scene.showBanner( mapnameSlain );
break;
case 10:
if((Statistics.boss_enhance & 0x2) != 0 || Statistics.mimicking) {
@ -517,12 +524,21 @@ public class GameScene extends PixelScene {
break;
case 11:
WndStory.showChapter( WndStory.ID_CAVES );
mapnameSlain.texture( "interfaces/mapname/caves.png" );
mapnameSlain.show( Window.Pink_COLOR, 0.6f, 3f );
scene.showBanner( mapnameSlain );
break;
case 16:
WndStory.showChapter( WndStory.ID_CITY );
mapnameSlain.texture( "interfaces/mapname/dwarf.png" );
mapnameSlain.show( Window.CBLACK, 0.6f, 3f );
scene.showBanner( mapnameSlain );
break;
case 21:
WndStory.showChapter( WndStory.ID_HALLS );
mapnameSlain.texture( "interfaces/mapname/halls.png" );
mapnameSlain.show( Window.RED_COLOR, 0.6f, 3f );
scene.showBanner( mapnameSlain );
break;
case 26:
WndStory.showChapter( WndStory.ID_CHAPTONEEND );

View File

@ -115,7 +115,7 @@ public class vM0_6_7_X_Changes {
}
public static void add_v0_6_55_Changes( ArrayList<ChangeInfo> changeInfos ) {
ChangeInfo changes = new ChangeInfo("v0.6.4.0-Beta2-4", true, "");
ChangeInfo changes = new ChangeInfo("v0.6.4.0-Beta2-6", true, "");
changes.hardlight(Window.TITLE_COLOR);
changeInfos.add(changes);
@ -123,9 +123,18 @@ public class vM0_6_7_X_Changes {
changes.hardlight(Window.GREEN_COLOR);
changeInfos.add(changes);
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.FIREFISHSWORD), ("尚方宝剑"),
("尚方宝剑属性重新优化,并且拥有两个形态的弱切换。具体怎么切换,看你们自己探索了")));
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.LANTERNB), ("深度调查"),
("娱乐模式改名为深度调查,并且追加黄金时代新娱乐模式。")));
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.SCROLL_LAGUZ), ("升级卷轴"),
("现在追加一个使用全部升级卷轴的按钮")));
changes.addButton(new ChangeButton(Icons.get(Icons.DISPLAY), ("游戏内区域文本"),
("现在每个大区有区域文本,给各位更加身临其境的感觉")));
Image a = new SakaFishBossSprites();
a.scale.set(PixelScene.align(0.72f));
changes.addButton(new ChangeButton(a, "新Boss:萨卡班甲鱼",
@ -135,12 +144,24 @@ public class vM0_6_7_X_Changes {
changes.hardlight(Window.CYELLOW);
changeInfos.add(changes);
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.WAND_KCX), ("再生法杖"),
("修复一些问题,并且可以持续使用。")));
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.CHALLANEESICON_15), ("挑战加成"),
("在高挑中,提灯的容量更多,商店售卖更多灯油,但灯火的每次减少可能会加剧!")));
changes.addButton(new ChangeButton(Icons.get(Icons.CHALLENGE_ON), ("支离破碎"),
("支离破碎进行了一些怪组优化")));
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.GREATSHIELD), ("5阶武器"),
("现在5阶武器生成平均化")));
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.SAI), ("吸血鬼刀"),
("优化数值,调整吸血权重。")));
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG3), ("归溯钥剑"),
("现在只能在怪物那里获得极少经验,更多经验应该通过装备此武器后拾取钥匙吸收能量。")));
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_06X82")));

View File

@ -1,21 +1,14 @@
package com.shatteredpixel.shatteredpixeldungeon.windows;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.depth;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
import com.shatteredpixel.shatteredpixeldungeon.Statistics;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.CheckBox;
import com.shatteredpixel.shatteredpixeldungeon.ui.Icons;
import com.shatteredpixel.shatteredpixeldungeon.ui.OptionSlider;
import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock;
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import java.util.ArrayList;
@ -48,34 +41,6 @@ public class BossSettingWindows extends Window {
icon.copy( Icons.get( checked ? Icons.CHECKED : Icons.UNCHECKED ) );
}
}
@Override
protected void onClick() {
if(!checked){
ShatteredPixelDungeon.scene().add(new WndOptions(new ItemSprite(ItemSpriteSheet.GOLD),
Messages.get(BossSettingWindows.class,"bossattack"),
Messages.get(BossSettingWindows.class,"bossgold")+((finalI+1) * (Math.max(depth / 5,
1)) * 200 ),
Messages.get(BossSettingWindows.class,"bug"),Messages.get(BossSettingWindows.class,
"not_yet")) {
@Override
protected void onSelect(int index) {
if (index == 0 && Dungeon.gold >= ((finalI+1) * (Math.max(depth / 5, 1)) * 200 )) {
checked( !checked );
Dungeon.gold -= ((finalI+1) * (Math.max(depth / 5, 1)) * 200 );
GLog.w(Messages.get(BossSettingWindows.class,"getboss")+Messages.get(BossSettingWindows.class, "boss_"+ (finalI + 1)));
} else if (index == 1) {
GLog.w(Messages.get(BossSettingWindows.class, "cancal"));
} else if (Dungeon.gold < ((finalI + 1) * (Math.max(depth / 10, 1)) * 200)) {
GLog.w(Messages.get(BossSettingWindows.class, "no_money"));
}
}
});
} else {
checked(false);
GLog.b(Messages.get(BossSettingWindows.class,"takenotapplic")+((finalI+1) * (Math.max(depth / 5, 1)) * 200 ));
Dungeon.gold += ((finalI+1) * (Math.max(depth / 5, 1)) * 200 );
}
}
};
cb.setRect(GAP, pos, WIDTH - GAP * 2, BOX_HEIGHT);
@ -84,12 +49,11 @@ public class BossSettingWindows extends Window {
cbs.add(cb);
pos += BOX_HEIGHT + GAP;
//1 拟态王
if(i == 1 && !Badges.isUnlocked(Badges.Badge.KILL_SM) || i == 0 || i==4){
cb.alpha(0.4f);
cb.active=false;
cb.checked(false);
cb.text(Messages.get(this, "boss_unselect"));
cb.text(Messages.get(this, "boss_unselect_"+i));
} else {
cb.checked((Statistics.boss_enhance & (1<<i)) >0);
cb.enable(Statistics.deepestFloor < (5+i*5));