Update 0.6.0.0-Beta16
Fixed Bug And Commit
This commit is contained in:
parent
1e1287937e
commit
003ff37de5
|
@ -11,11 +11,13 @@ text.textchallenges.hint = 不输入即为随机种子
|
|||
text.textchallenges.delete_seed_input = 清除
|
||||
|
||||
actors.mobs.bloodbat$bloodbatrecharge.name=血影充能
|
||||
actors.mobs.bloodbat$bloodbatrecharge.desc=小血影正在充能,等待下一次和主人并肩作战的时候!
|
||||
actors.mobs.bloodbat$bloodbatrecharge.desc=小血影正在充能,等待下一次和主人并肩作战的时候!\n\n剩余充能时长:%s回合.
|
||||
|
||||
actors.mobs.bloodbat.name=血影蝙蝠
|
||||
actors.mobs.bloodbat.desc=极影铃虹的随身伙伴,为了主人的安全将会让一切试图伤害主人的家伙万劫不复。\n\n它的能力和主人紧密相连,主人的成长也会让小血影成长!
|
||||
|
||||
actors.mobs.dimandking$sacrificesubjectlistener.rankings_desc=被钻石宝箱王说教至死
|
||||
|
||||
actors.buffs.halomethaneburning.name=磷火缠身
|
||||
actors.buffs.halomethaneburning.heromsg=磷火像恶魔一样缠在了你的身上!
|
||||
actors.buffs.halomethaneburning.burnsup=%s被烧的渣都不剩了!
|
||||
|
@ -25,7 +27,6 @@ actors.buffs.halomethaneburning.desc=没什么比被磷火缠身更痛苦了。
|
|||
actors.buffs.halofireimblue.name=磷火审判
|
||||
actors.buffs.halofireimblue.desc=你被灌注了磷火的力量!\n\n所有物理攻击都可以使敌人磷火缠身。与此同时你对磷火,火焰完全免疫。\n\n剩余磷火审判效果时长:%s回合
|
||||
|
||||
|
||||
actors.mobs.slimeprincess.name=史莱姆公主
|
||||
actors.mobs.slimeprincess.notice=站住!入侵者!
|
||||
actors.mobs.slimeprincess.defeated=你的行为会被世人铭记!
|
||||
|
@ -175,6 +176,7 @@ actors.mobs.dimandking.teleport_1=立刻,驱赶此人!
|
|||
actors.mobs.dimandking.teleport_2=立即,拖住此人!
|
||||
actors.mobs.dimandking.buff_all=立刻解决此人!
|
||||
actors.mobs.dimandking.sacrifice=光荣的自爆吧!
|
||||
actors.mobs.dimandking.waring=钻石宝箱王正在使怪物激素上升,他们随时可能自爆,离他们远点!
|
||||
actors.mobs.dimandking.death_rattle=伙伴们,守住这里!
|
||||
actors.mobs.dimandking.more_summon=伙伴们,一起上!
|
||||
actors.mobs.dimandking.wave_1=伙伴们,想想你们的价值!
|
||||
|
|
|
@ -2,6 +2,16 @@
|
|||
items.scrolls.exotic.scrollofpolymorph.name=羊化秘卷
|
||||
items.scrolls.exotic.scrollofpolymorph.desc=这张秘卷富含强大的转换能力。当使用时,所有在使用者视野范围内的单位都将变形成一只魔法绵羊!\n\n这种变形过程是不可逆的,但不是所有敌人都会被影响。强大的敌人将抵抗这种魔法。同时变形后目标敌人身上的物品将会消失。
|
||||
|
||||
items.food.lightfood.name=闪电饭团
|
||||
items.food.lightfood.eat_msg=这个食物的味道棒极了!
|
||||
items.food.lightfood.desc=闪电饭团是冻肉和闪电种子加上口粮的综合产物。不仅可以使英雄获得治疗,还能立刻回满饥饿值,同时还能获得饭团的雷霆祝福。
|
||||
|
||||
items.weapon.missiles.darts.halodart.name=磷焰飞镖
|
||||
items.weapon.missiles.darts.halodart.desc=这些飞镖上涂着一种由磷焰花制成的药物,命中后会燃起磷焰。
|
||||
|
||||
items.weapon.missiles.darts.lightdart.name=辉耀飞镖
|
||||
items.weapon.missiles.darts.lightdart.desc=这些飞镖上涂着一种由闪电花制成的药物,命中目标后会激发目标的潜能。
|
||||
|
||||
items.stones.stoneofdeepenedsleep.name=沉睡符石
|
||||
items.stones.stoneofdeepenedsleep.desc=这颗符石被扔出后会对附近睡眠中的敌人施加魔法睡眠。陷入魔法睡眠的敌人会永远沉睡下去,除非受到外界打扰。
|
||||
|
||||
|
@ -30,6 +40,7 @@ items.potions.elixirs.elixirofdragonking.desc=饮用后,这瓶秘药会使饮
|
|||
items.potions.potionofliquidflamex.name=磷火药剂
|
||||
items.potions.potionofliquidflamex.desc=该药瓶里装着一种超级不稳定的化合物,一旦暴露在空气中就会猛烈地燃烧起来。\n\n_相比于一般的液火药剂,这个更加危险且更加致命!
|
||||
items.food.blandfruit.halofruit=磷火果
|
||||
items.food.blandfruit.lightfruit=闪电果
|
||||
|
||||
items.potions.potionoflightningshiledx.name=闪电药剂
|
||||
items.potions.potionoflightningshiledx.desc=该药剂融合了闪电花和电的综合化学效应,能在一段时间内。为玩家完全免疫电击伤害。
|
||||
|
|
|
@ -6,7 +6,8 @@ levels.features.chasm.jump=你确定要跳入洞口中?从这么高的地方
|
|||
levels.features.chasm.ondeath=你落地过猛摔死了……
|
||||
levels.features.chasm.rankings_desc=死于撞击
|
||||
|
||||
|
||||
levels.prisonlevel.statue=树
|
||||
levels.prisonlevel.statue_desc=地牢里面怎么会有树的存在?这令人匪夷所思!
|
||||
|
||||
###rooms
|
||||
levels.rooms.special.magicalfireroom$eternalfire.desc=这里树立着一面致密的魔法火墙。它是如此炽热,会点燃任何过于靠近的物体,你无法穿过它。它没有任何会自然熄灭的迹象,你只能另想办法来熄灭它。
|
||||
|
@ -225,9 +226,12 @@ levels.level.alchemy_desc=这口炼金釜中充满了魔力之水。物品可以
|
|||
levels.level.empty_well_desc=这座井已经枯竭了。
|
||||
|
||||
levels.prisonlevel.water_name=黯冷水潭
|
||||
levels.prisonlevel.water_desc=进入水潭中可熄灭身上的火焰。\n显然,这里危机四伏,但好在仍_有人在保护我们_。\n但是在一些魔力聚焦的地方无法影响到你。
|
||||
levels.prisonlevel.empty_deco_desc=其上仍残留着干涸的血迹。
|
||||
levels.prisonlevel.bookshelf_desc=这个书架可能是监狱图书馆的残留物。烧掉怎么样?
|
||||
|
||||
levels.sewerlevel.water_name=浑浊水潭
|
||||
levels.sewerlevel.empty_deco_desc=潮湿且发黄的苔藓覆盖其上。
|
||||
levels.sewerlevel.water_name=圣境水池
|
||||
levels.sewerlevel.water_desc=进入水潭中可熄灭身上的火焰。\n显然,这里的邪恶魔力十分微弱,你踩在水上面甚至有_圣境的力量_保护你前行。\n但是在一些魔力聚焦的地方无法影响到你。
|
||||
|
||||
levels.sewerlevel.empty_deco_desc=幽蓝且神秘的菌菇长在了这里。
|
||||
levels.sewerlevel.bookshelf_desc=这个书架塞满了没用的成功学书籍。烧掉怎么样?
|
||||
|
|
|
@ -450,6 +450,8 @@ ui.changelist.mlpd.vm0_5_x_changes.frlogs=尚待调查……
|
|||
|
||||
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x20=-1.支离破碎bug已修复\n2.部分符石文本缺失已修复\n3.0层饱食度问题已修复\n4.炼金移植有问题已修复\n5.药水文本缺失已修复\n6.钥匙材质有问题已修复\n7.怨灵血量异常已修复\n8.种子显示问题已修复\n9.快捷栏优化问题已修复\n10.初始升级卷轴,以及初始物品已修复\n12.奈亚子初始奖励异常已修复\n13.由于V1.2.3楼层名字导致部分BOSS超类闪退已修复\n14.精英强敌鬼磷文本缺失已修复\n15.炼金合成表已移植\n16.风行水上部分buff已经重做\n17.部分原始Java类已合并\n18.英雄类逻辑楼层应该为0已修复\n19.光Buff有问题已修复\n20.恶魔层贴图有问题已修复\n21.部分buff尚未定义在破碎123英雄类里面已修复\n22.尚方宝剑属性问题已修复
|
||||
|
||||
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x21=-1.修复了矮人国王的闪退问题\n-2.游戏性能优化\n-3.修复了钻石宝箱王的错误刷怪\n-去除了重生十字架的金色光环。
|
||||
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x21=-1.修复了矮人国王的闪退问题,但旧存档无法同步\n-2.游戏性能优化\n-3.修复了钻石宝箱王的错误刷怪\n-去除了重生十字架的金色光环。
|
||||
|
||||
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x22=-1.修复了两个种子缺失飞镖的问题\n-2.修复了小血影的闪退问题\n-3.修复了嬗变卷轴的崩溃问题\n-4.修复了新植物未刷新的问题
|
||||
|
||||
//ui.changelist.mlpd.vm0_5_x_changes.xxx//
|
|
@ -119,13 +119,13 @@ public class ShatteredPixelDungeon extends Game {
|
|||
com.shatteredpixel.shatteredpixeldungeon.levels.CavesBossLevel.EntranceOverhang.class,
|
||||
"com.shatteredpixel.shatteredpixeldungeon.levels.NewCavesBossLevel$EntranceOverhang" );
|
||||
com.watabou.utils.Bundle.addAlias(
|
||||
com.shatteredpixel.shatteredpixeldungeon.levels.CityBossLevel.class,
|
||||
com.shatteredpixel.shatteredpixeldungeon.levels.NewCityBossLevel.class,
|
||||
"com.shatteredpixel.shatteredpixeldungeon.levels.NewCityBossLevel" );
|
||||
com.watabou.utils.Bundle.addAlias(
|
||||
com.shatteredpixel.shatteredpixeldungeon.levels.CityBossLevel.CustomGroundVisuals.class,
|
||||
com.shatteredpixel.shatteredpixeldungeon.levels.NewCityBossLevel.CustomGroundVisuals.class,
|
||||
"com.shatteredpixel.shatteredpixeldungeon.levels.NewCityBossLevel$CustomGroundVisuals" );
|
||||
com.watabou.utils.Bundle.addAlias(
|
||||
com.shatteredpixel.shatteredpixeldungeon.levels.CityBossLevel.CustomWallVisuals.class,
|
||||
com.shatteredpixel.shatteredpixeldungeon.levels.NewCityBossLevel.CustomWallVisuals.class,
|
||||
"com.shatteredpixel.shatteredpixeldungeon.levels.NewCityBossLevel$CustomWallVisuals" );
|
||||
com.watabou.utils.Bundle.addAlias(
|
||||
com.shatteredpixel.shatteredpixeldungeon.levels.HallsBossLevel.class,
|
||||
|
|
|
@ -10,6 +10,8 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Degrade;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Marked;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.BlueBatSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
|
||||
|
@ -39,6 +41,15 @@ public class BloodBat extends Mob implements Callback {
|
|||
next();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canAttack( Char enemy ) {
|
||||
if(level >= 10) {
|
||||
return new Ballistica(pos, enemy.pos, MagicMissile.WARD).collisionPos == enemy.pos;
|
||||
} else {
|
||||
return super.canAttack(enemy);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void call() {
|
||||
next();
|
||||
|
@ -57,7 +68,7 @@ public class BloodBat extends Mob implements Callback {
|
|||
Sample.INSTANCE.play( Assets.Sounds.DEBUFF );
|
||||
}
|
||||
|
||||
int dmg = Random.NormalIntRange( 2, 4 );
|
||||
int dmg = Random.NormalIntRange( (4+level)*Dungeon.depth/5, (5+level)*Dungeon.depth/5 );
|
||||
enemy.damage( dmg, new BloodBat.DarkBolt() );
|
||||
|
||||
if (enemy == Dungeon.hero && !enemy.isAlive()) {
|
||||
|
@ -79,12 +90,7 @@ public class BloodBat extends Mob implements Callback {
|
|||
|
||||
@Override
|
||||
public int damageRoll() {
|
||||
if (Dungeon.hero.isSubclass(HeroSubClass.ASSASSIN)){
|
||||
int i = Random.NormalIntRange(0, level * 2);
|
||||
if (enemy.buff(Marked.class) != null) i *= enemy.buff(Marked.class).bonusDamage();
|
||||
return i;
|
||||
}
|
||||
return Random.NormalIntRange( level, 1 + level * 2 );
|
||||
return Random.NormalIntRange( (4+level)*Dungeon.depth/5, (5+level)*Dungeon.depth/5 );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -93,47 +99,25 @@ public class BloodBat extends Mob implements Callback {
|
|||
}
|
||||
|
||||
@Override
|
||||
public int attackSkill(Char target) {
|
||||
public int attackSkill(Char targetd) {
|
||||
return 4 + level * 2;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int attackProc(Char enemy, int damage) {
|
||||
if(level >= 2){
|
||||
zap();
|
||||
} else {
|
||||
if (Dungeon.hero.isSubclass(HeroSubClass.ASSASSIN)) Buff.affect(enemy, Marked.class).stack++;
|
||||
}
|
||||
|
||||
|
||||
return super.attackProc(enemy, damage);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Char chooseEnemy() {
|
||||
Char enemy = super.chooseEnemy();
|
||||
|
||||
int targetPos = Dungeon.hero.pos;
|
||||
int distance = Dungeon.hero.isSubclass(HeroSubClass.ASSASSIN) ? 99999 : 8;
|
||||
|
||||
//will never attack something far from their target
|
||||
if (enemy != null
|
||||
&& Dungeon.level.mobs.contains(enemy)
|
||||
&& (Dungeon.level.distance(enemy.pos, targetPos) <= distance)){
|
||||
((Mob)enemy).aggro(this);
|
||||
return enemy;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void updateHP(){
|
||||
level += 1;
|
||||
if (Dungeon.level != null) {
|
||||
for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])) {
|
||||
if (mob instanceof BloodBat) {
|
||||
mob.HP = mob.HT = 18 + level * 2;
|
||||
((BloodBat) mob).defenseSkill = 3 + level * 2;
|
||||
mob.HP = mob.HT = 18 + level * 4;
|
||||
((BloodBat) mob).defenseSkill = 3 + level * 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -45,6 +45,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.sprites.MimicSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.noosa.particles.Emitter;
|
||||
import com.watabou.utils.Bundle;
|
||||
|
@ -812,6 +813,7 @@ public class DimandKing extends Boss {
|
|||
charge = target.sprite.emitter();
|
||||
charge.autoKill = false;
|
||||
charge.pour( HalomethaneFlameParticle.FACTORY, 0.06f );
|
||||
GLog.n(Messages.get(DimandKing.class,"waring"));
|
||||
//charge.on = false;
|
||||
}else{
|
||||
if(charge != null) {
|
||||
|
|
|
@ -21,6 +21,8 @@
|
|||
|
||||
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
|
||||
|
||||
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.level;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Badges;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
|
@ -29,7 +31,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Freezing;
|
|||
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.effects.Lightning;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Splash;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfFrost;
|
||||
|
@ -196,32 +197,29 @@ public abstract class Elemental extends Mob {
|
|||
setSummonedALly();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static class FireElemental extends Elemental {
|
||||
|
||||
|
||||
{
|
||||
spriteClass = ElementalSprite.Fire.class;
|
||||
|
||||
|
||||
loot = new PotionOfLiquidFlame();
|
||||
lootChance = 1/8f;
|
||||
|
||||
|
||||
properties.add( Property.FIERY );
|
||||
|
||||
harmfulBuffs.add( com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Frost.class );
|
||||
harmfulBuffs.add( Chill.class );
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void meleeProc( Char enemy, int damage ) {
|
||||
if (Random.Int( 2 ) == 0 && !Dungeon.level.water[enemy.pos]) {
|
||||
if (Random.Int( 2 ) == 0 && !level.water[enemy.pos]) {
|
||||
Buff.affect( enemy, Burning.class ).reignite( enemy );
|
||||
if (enemy.sprite.visible) Splash.at( enemy.sprite.center(), sprite.blood(), 5);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void rangedProc( Char enemy ) {
|
||||
if (!Dungeon.level.water[enemy.pos]) {
|
||||
if (!level.water[enemy.pos]) {
|
||||
Buff.affect( enemy, Burning.class ).reignite( enemy, 4f );
|
||||
}
|
||||
if (enemy.sprite.visible) Splash.at( enemy.sprite.center(), sprite.blood(), 5);
|
||||
|
|
|
@ -128,6 +128,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Greatshield;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Greatsword;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.GreenSword;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.HandAxe;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.IceDewVialSword;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.IceFishSword;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.LockSword;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Longsword;
|
||||
|
@ -288,7 +289,7 @@ public class Generator {
|
|||
Dreamfoil.Seed.class,
|
||||
Starflower.Seed.class,
|
||||
AikeLaier.Seed.class,};
|
||||
SEED.defaultProbs = new float[]{ 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4,1 };
|
||||
SEED.defaultProbs = new float[]{ 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4,3};
|
||||
SEED.probs = SEED.defaultProbs.clone();
|
||||
|
||||
SCROLL.classes = new Class<?>[]{
|
||||
|
@ -399,9 +400,10 @@ public class Generator {
|
|||
WEP_T5.probs = new float[]{ 6, 5, 5, 4, 4, 4 };
|
||||
|
||||
WEP_T6.classes = new Class<?>[]{
|
||||
IceFishSword.class
|
||||
IceFishSword.class,
|
||||
IceDewVialSword.class
|
||||
};
|
||||
WEP_T6.probs = new float[]{ 1 };
|
||||
WEP_T6.probs = new float[]{ 1,0 };
|
||||
|
||||
//see Generator.randomArmor
|
||||
ARMOR.classes = new Class<?>[]{
|
||||
|
@ -584,7 +586,8 @@ public class Generator {
|
|||
Category.WEP_T2,
|
||||
Category.WEP_T3,
|
||||
Category.WEP_T4,
|
||||
Category.WEP_T5
|
||||
Category.WEP_T5,
|
||||
Category.WEP_T6
|
||||
};
|
||||
|
||||
public static MeleeWeapon randomWeapon(){
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
|
||||
package com.shatteredpixel.shatteredpixeldungeon.items.food;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||
|
@ -34,7 +33,9 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHaste;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfInvisibility;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLevitation;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLightningShiledX;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlame;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlameX;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfMindVision;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfParalyticGas;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfPurity;
|
||||
|
@ -43,7 +44,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfToxicGas;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.plants.Plant.Seed;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.plants.Sungrass;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
|
@ -123,6 +123,8 @@ public class Blandfruit extends Food {
|
|||
if (potionAttrib instanceof PotionOfPurity) return Messages.get(this, "dreamfruit");
|
||||
if (potionAttrib instanceof PotionOfExperience) return Messages.get(this, "starfruit");
|
||||
if (potionAttrib instanceof PotionOfHaste) return Messages.get(this, "swiftfruit");
|
||||
if (potionAttrib instanceof PotionOfLiquidFlameX) return Messages.get(this, "halofruit");
|
||||
if (potionAttrib instanceof PotionOfLightningShiledX) return Messages.get(this, "lightfruit");
|
||||
return super.name();
|
||||
}
|
||||
|
||||
|
@ -135,7 +137,8 @@ public class Blandfruit extends Food {
|
|||
if (potionAttrib instanceof PotionOfFrost
|
||||
|| potionAttrib instanceof PotionOfLiquidFlame
|
||||
|| potionAttrib instanceof PotionOfToxicGas
|
||||
|| potionAttrib instanceof PotionOfParalyticGas) {
|
||||
|| potionAttrib instanceof PotionOfParalyticGas
|
||||
||potionAttrib instanceof PotionOfLiquidFlameX) {
|
||||
desc += Messages.get(this, "desc_throw");
|
||||
} else {
|
||||
desc += Messages.get(this, "desc_eat");
|
||||
|
@ -172,6 +175,8 @@ public class Blandfruit extends Food {
|
|||
if (potionAttrib instanceof PotionOfPurity) potionGlow = new ItemSprite.Glowing( 0xC152AA );
|
||||
if (potionAttrib instanceof PotionOfExperience) potionGlow = new ItemSprite.Glowing( 0x404040 );
|
||||
if (potionAttrib instanceof PotionOfHaste) potionGlow = new ItemSprite.Glowing( 0xCCBB00 );
|
||||
if (potionAttrib instanceof PotionOfLiquidFlameX) potionGlow = new ItemSprite.Glowing( 0x00ffff );
|
||||
if (potionAttrib instanceof PotionOfLightningShiledX) potionGlow = new ItemSprite.Glowing( 0xFF4500 );
|
||||
|
||||
potionAttrib.setAction();
|
||||
defaultAction = potionAttrib.defaultAction;
|
||||
|
@ -194,7 +199,8 @@ public class Blandfruit extends Food {
|
|||
potionAttrib instanceof PotionOfParalyticGas ||
|
||||
potionAttrib instanceof PotionOfFrost ||
|
||||
potionAttrib instanceof PotionOfLevitation ||
|
||||
potionAttrib instanceof PotionOfPurity) {
|
||||
potionAttrib instanceof PotionOfPurity
|
||||
||potionAttrib instanceof PotionOfLiquidFlameX) {
|
||||
|
||||
potionAttrib.shatter( cell );
|
||||
Dungeon.level.drop(new Chunks(), cell).sprite.drop();
|
||||
|
|
|
@ -127,13 +127,13 @@ public class IceFishSword extends Weapon {
|
|||
|
||||
@Override
|
||||
public int min(int lvl) {
|
||||
return 4*(Dungeon.depth/5+tier+1) + //8 base, down from 10
|
||||
return 2*(Dungeon.depth/5+tier+1) + //8 base, down from 10
|
||||
lvl*(Dungeon.depth/5+tier+1); //scaling unchanged
|
||||
}
|
||||
|
||||
@Override
|
||||
public int max(int lvl) {
|
||||
return 6*(Dungeon.depth/5+tier+1) + //8 base, down from 10
|
||||
return 3*(Dungeon.depth/5+tier+1) + //8 base, down from 10
|
||||
lvl*(Dungeon.depth/5+tier+1); //scaling unchanged
|
||||
}
|
||||
|
||||
|
@ -149,6 +149,6 @@ public class IceFishSword extends Weapon {
|
|||
|
||||
@Override
|
||||
public int STRReq(int lvl) {
|
||||
return Dungeon.depth/5+18;
|
||||
return Dungeon.depth/5+16;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,6 +31,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfRegrowth;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.plants.AikeLaier;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.plants.Blindweed;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.plants.Dreamfoil;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.plants.Earthroot;
|
||||
|
@ -39,6 +40,7 @@ import com.shatteredpixel.shatteredpixeldungeon.plants.Firebloom;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.plants.Icecap;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.plants.Plant;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.plants.Rotberry;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.plants.SkyBlueFireBloom;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.plants.Sorrowmoss;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.plants.Starflower;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.plants.Stormvine;
|
||||
|
@ -184,6 +186,8 @@ public abstract class TippedDart extends Dart {
|
|||
types.put(Stormvine.Seed.class, ShockingDart.class);
|
||||
types.put(Sungrass.Seed.class, HealingDart.class);
|
||||
types.put(Swiftthistle.Seed.class, AdrenalineDart.class);
|
||||
types.put(SkyBlueFireBloom.Seed.class, HaloDart.class);
|
||||
types.put(AikeLaier.Seed.class, LightDart.class);
|
||||
}
|
||||
|
||||
public static TippedDart getTipped( Plant.Seed s, int quantity ){
|
||||
|
|
|
@ -1,654 +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 <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
package com.shatteredpixel.shatteredpixeldungeon.levels;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Bones;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.DwarfKing;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Imp;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.CityPainter;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.ImpShopRoom;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTilemap;
|
||||
import com.watabou.noosa.Game;
|
||||
import com.watabou.noosa.Group;
|
||||
import com.watabou.noosa.Tilemap;
|
||||
import com.watabou.noosa.audio.Music;
|
||||
import com.watabou.noosa.tweeners.AlphaTweener;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.Callback;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Point;
|
||||
import com.watabou.utils.Random;
|
||||
import com.watabou.utils.Rect;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
|
||||
public class CityBossLevel extends Level {
|
||||
|
||||
{
|
||||
color1 = 0x4b6636;
|
||||
color2 = 0xf2f2f2;
|
||||
}
|
||||
|
||||
private static int WIDTH = 15;
|
||||
private static int HEIGHT = 48;
|
||||
|
||||
private static final Rect entry = new Rect(1, 37, 14, 48);
|
||||
private static final Rect arena = new Rect(1, 25, 14, 38);
|
||||
private static final Rect end = new Rect(0, 0, 15, 22);
|
||||
|
||||
private static final int bottomDoor = 7 + (arena.bottom-1)*15;
|
||||
private static final int topDoor = 7 + arena.top*15;
|
||||
|
||||
public static final int throne;
|
||||
private static final int[] pedestals = new int[4];
|
||||
|
||||
static {
|
||||
Point c = arena.center();
|
||||
throne = c.x + (c.y) * WIDTH;
|
||||
pedestals[0] = c.x-3 + (c.y-3) * WIDTH;
|
||||
pedestals[1] = c.x+3 + (c.y-3) * WIDTH;
|
||||
pedestals[2] = c.x+3 + (c.y+3) * WIDTH;
|
||||
pedestals[3] = c.x-3 + (c.y+3) * WIDTH;
|
||||
}
|
||||
|
||||
private ImpShopRoom impShop;
|
||||
|
||||
@Override
|
||||
public void playLevelMusic() {
|
||||
if (locked){
|
||||
Music.INSTANCE.play(Assets.Music.CITY_BOSS, true);
|
||||
//if top door isn't unlocked
|
||||
} else if (map[topDoor] == Terrain.LOCKED_DOOR){
|
||||
Music.INSTANCE.end();
|
||||
} else {
|
||||
Music.INSTANCE.playTracks(
|
||||
new String[]{Assets.Music.CITY_1, Assets.Music.CITY_2, Assets.Music.CITY_2},
|
||||
new float[]{1, 1, 0.5f},
|
||||
false);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String tilesTex() {
|
||||
return Assets.Environment.TILES_CITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String waterTex() {
|
||||
return Assets.Environment.WATER_CITY;
|
||||
}
|
||||
|
||||
private static final String IMP_SHOP = "imp_shop";
|
||||
|
||||
@Override
|
||||
public void storeInBundle( Bundle bundle ) {
|
||||
super.storeInBundle( bundle );
|
||||
bundle.put( IMP_SHOP, impShop );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void restoreFromBundle( Bundle bundle ) {
|
||||
super.restoreFromBundle( bundle );
|
||||
impShop = (ImpShopRoom) bundle.get( IMP_SHOP );
|
||||
if (map[topDoor] != Terrain.LOCKED_DOOR && Imp.Quest.isCompleted() && !impShop.shopSpawned()){
|
||||
spawnShop();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean build() {
|
||||
|
||||
setSize(WIDTH, HEIGHT);
|
||||
|
||||
//entrance room
|
||||
Painter.fill(this, entry, Terrain.WALL);
|
||||
Painter.fill(this, entry, 1, Terrain.BOOKSHELF);
|
||||
Painter.fill(this, entry, 2, Terrain.EMPTY);
|
||||
|
||||
Painter.fill(this, entry.left+3, entry.top+3, 1, 5, Terrain.BOOKSHELF);
|
||||
Painter.fill(this, entry.right-4, entry.top+3, 1, 5, Terrain.BOOKSHELF);
|
||||
|
||||
Point c = entry.center();
|
||||
|
||||
Painter.fill(this, c.x-1, c.y-2, 3, 1, Terrain.STATUE);
|
||||
Painter.fill(this, c.x-1, c.y, 3, 1, Terrain.STATUE);
|
||||
Painter.fill(this, c.x-1, c.y+2, 3, 1, Terrain.STATUE);
|
||||
Painter.fill(this, c.x, entry.top+1, 1, 6, Terrain.EMPTY_SP);
|
||||
|
||||
Painter.set(this, c.x, entry.top, Terrain.DOOR);
|
||||
|
||||
entrance = c.x + (c.y+2)*width();
|
||||
Painter.set(this, entrance, Terrain.ENTRANCE);
|
||||
|
||||
//DK's throne room
|
||||
Painter.fillDiamond(this, arena, 1, Terrain.EMPTY);
|
||||
|
||||
Painter.fill(this, arena, 5, Terrain.EMPTY_SP);
|
||||
Painter.fill(this, arena, 6, Terrain.SIGN);
|
||||
|
||||
c = arena.center();
|
||||
Painter.set(this, c.x-3, c.y, Terrain.STATUE);
|
||||
Painter.set(this, c.x-4, c.y, Terrain.STATUE);
|
||||
Painter.set(this, c.x+3, c.y, Terrain.STATUE);
|
||||
Painter.set(this, c.x+4, c.y, Terrain.STATUE);
|
||||
|
||||
Painter.set(this, pedestals[0], Terrain.PEDESTAL);
|
||||
Painter.set(this, pedestals[1], Terrain.PEDESTAL);
|
||||
Painter.set(this, pedestals[2], Terrain.PEDESTAL);
|
||||
Painter.set(this, pedestals[3], Terrain.PEDESTAL);
|
||||
|
||||
Painter.set(this, c.x, arena.top, Terrain.LOCKED_DOOR);
|
||||
|
||||
//exit hallway
|
||||
Painter.fill(this, end, Terrain.CHASM);
|
||||
Painter.fill(this, end.left+4, end.top+5, 7, 18, Terrain.EMPTY);
|
||||
Painter.fill(this, end.left+4, end.top+5, 7, 4, Terrain.EXIT);
|
||||
exit = end.left+7 + (end.top+8)*width();
|
||||
|
||||
impShop = new ImpShopRoom();
|
||||
impShop.set(end.left+3, end.top+12, end.left+11, end.top+20);
|
||||
Painter.set(this, impShop.center(), Terrain.PEDESTAL);
|
||||
|
||||
Painter.set(this, impShop.left+2, impShop.top, Terrain.STATUE);
|
||||
Painter.set(this, impShop.left+6, impShop.top, Terrain.STATUE);
|
||||
|
||||
Painter.fill(this, end.left+5, end.bottom+1, 5, 1, Terrain.EMPTY);
|
||||
Painter.fill(this, end.left+6, end.bottom+2, 3, 1, Terrain.EMPTY);
|
||||
|
||||
new CityPainter().paint(this, null);
|
||||
|
||||
//pillars last, no deco on these
|
||||
Painter.fill(this, end.left+1, end.top+2, 2, 2, Terrain.WALL);
|
||||
Painter.fill(this, end.left+1, end.top+7, 2, 2, Terrain.WALL);
|
||||
Painter.fill(this, end.left+1, end.top+12, 2, 2, Terrain.WALL);
|
||||
Painter.fill(this, end.left+1, end.top+17, 2, 2, Terrain.WALL);
|
||||
|
||||
Painter.fill(this, end.right-3, end.top+2, 2, 2, Terrain.WALL);
|
||||
Painter.fill(this, end.right-3, end.top+7, 2, 2, Terrain.WALL);
|
||||
Painter.fill(this, end.right-3, end.top+12, 2, 2, Terrain.WALL);
|
||||
Painter.fill(this, end.right-3, end.top+17, 2, 2, Terrain.WALL);
|
||||
|
||||
CustomTilemap customVisuals = new CustomGroundVisuals();
|
||||
customVisuals.setRect(0, 0, width(), height());
|
||||
customTiles.add(customVisuals);
|
||||
|
||||
customVisuals = new CustomWallVisuals();
|
||||
customVisuals.setRect(0, 0, width(), height());
|
||||
customWalls.add(customVisuals);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//returns a random pedestal that doesn't already have a summon inbound on it
|
||||
public int getSummoningPos(){
|
||||
Mob king = getKing();
|
||||
HashSet<DwarfKing.Summoning> summons = king.buffs(DwarfKing.Summoning.class);
|
||||
ArrayList<Integer> positions = new ArrayList<>();
|
||||
for (int pedestal : pedestals) {
|
||||
boolean clear = true;
|
||||
for (DwarfKing.Summoning s : summons) {
|
||||
if (s.getPos() == pedestal) {
|
||||
clear = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (clear) {
|
||||
positions.add(pedestal);
|
||||
}
|
||||
}
|
||||
if (positions.isEmpty()){
|
||||
return -1;
|
||||
} else {
|
||||
return Random.element(positions);
|
||||
}
|
||||
}
|
||||
|
||||
private Mob getKing(){
|
||||
for (Mob m : mobs){
|
||||
if (m instanceof DwarfKing) return m;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void createMobs() {
|
||||
}
|
||||
|
||||
public Actor addRespawner() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void createItems() {
|
||||
Item item = Bones.get();
|
||||
if (item != null) {
|
||||
int pos;
|
||||
do {
|
||||
pos = randomRespawnCell(null);
|
||||
} while (pos == entrance);
|
||||
drop( item, pos ).setHauntedIfCursed().type = Heap.Type.REMAINS;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int randomRespawnCell( Char ch ) {
|
||||
int cell;
|
||||
do {
|
||||
cell = entrance + PathFinder.NEIGHBOURS8[Random.Int(8)];
|
||||
} while (!passable[cell]
|
||||
|| (Char.hasProp(ch, Char.Property.LARGE) && !openSpace[cell])
|
||||
|| Actor.findChar(cell) != null);
|
||||
return cell;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void occupyCell( Char ch ) {
|
||||
|
||||
super.occupyCell( ch );
|
||||
|
||||
if (map[bottomDoor] != Terrain.LOCKED_DOOR && map[topDoor] == Terrain.LOCKED_DOOR
|
||||
&& ch.pos < bottomDoor && ch == Dungeon.hero) {
|
||||
|
||||
seal();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void seal() {
|
||||
super.seal();
|
||||
|
||||
//moves intelligent allies with the hero, preferring closer pos to entrance door
|
||||
int doorPos = pointToCell(new Point(arena.left + arena.width()/2, arena.bottom));
|
||||
Mob.holdAllies(this, doorPos);
|
||||
Mob.restoreAllies(this, Dungeon.hero.pos, doorPos);
|
||||
|
||||
DwarfKing boss = new DwarfKing();
|
||||
boss.state = boss.WANDERING;
|
||||
boss.pos = pointToCell(arena.center());
|
||||
GameScene.add( boss );
|
||||
boss.beckon(Dungeon.hero.pos);
|
||||
|
||||
if (heroFOV[boss.pos]) {
|
||||
boss.notice();
|
||||
boss.sprite.alpha( 0 );
|
||||
boss.sprite.parent.add( new AlphaTweener( boss.sprite, 1, 0.1f ) );
|
||||
}
|
||||
|
||||
set( bottomDoor, Terrain.LOCKED_DOOR );
|
||||
GameScene.updateMap( bottomDoor );
|
||||
Dungeon.observe();
|
||||
|
||||
Game.runOnRenderThread(new Callback() {
|
||||
@Override
|
||||
public void call() {
|
||||
Music.INSTANCE.play(Assets.Music.CITY_BOSS, true);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unseal() {
|
||||
super.unseal();
|
||||
|
||||
set( bottomDoor, Terrain.DOOR );
|
||||
GameScene.updateMap( bottomDoor );
|
||||
|
||||
set( topDoor, Terrain.DOOR );
|
||||
GameScene.updateMap( topDoor );
|
||||
|
||||
if (Imp.Quest.isCompleted()) {
|
||||
spawnShop();
|
||||
}
|
||||
Dungeon.observe();
|
||||
|
||||
Game.runOnRenderThread(new Callback() {
|
||||
@Override
|
||||
public void call() {
|
||||
Music.INSTANCE.end();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void spawnShop(){
|
||||
while (impShop.itemCount() >= 7*(impShop.height()-2)){
|
||||
impShop.bottom++;
|
||||
}
|
||||
impShop.spawnShop(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String tileName( int tile ) {
|
||||
switch (tile) {
|
||||
case Terrain.WATER:
|
||||
return Messages.get(CityLevel.class, "water_name");
|
||||
case Terrain.HIGH_GRASS:
|
||||
return Messages.get(CityLevel.class, "high_grass_name");
|
||||
default:
|
||||
return super.tileName( tile );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String tileDesc(int tile) {
|
||||
switch (tile) {
|
||||
case Terrain.ENTRANCE:
|
||||
return Messages.get(CityLevel.class, "entrance_desc");
|
||||
case Terrain.EXIT:
|
||||
return Messages.get(CityLevel.class, "exit_desc");
|
||||
case Terrain.WALL_DECO:
|
||||
case Terrain.EMPTY_DECO:
|
||||
return Messages.get(CityLevel.class, "deco_desc");
|
||||
case Terrain.EMPTY_SP:
|
||||
return Messages.get(CityLevel.class, "sp_desc");
|
||||
case Terrain.STATUE:
|
||||
case Terrain.STATUE_SP:
|
||||
return Messages.get(CityLevel.class, "statue_desc");
|
||||
case Terrain.BOOKSHELF:
|
||||
return Messages.get(CityLevel.class, "bookshelf_desc");
|
||||
default:
|
||||
return super.tileDesc( tile );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Group addVisuals( ) {
|
||||
super.addVisuals();
|
||||
CityLevel.addCityVisuals(this, visuals);
|
||||
return visuals;
|
||||
}
|
||||
|
||||
public static class CustomGroundVisuals extends CustomTilemap {
|
||||
|
||||
{
|
||||
texture = Assets.Environment.CITY_BOSS;
|
||||
tileW = 15;
|
||||
tileH = 48;
|
||||
}
|
||||
|
||||
private static final int STAIR_ROWS = 7;
|
||||
|
||||
@Override
|
||||
public Tilemap create() {
|
||||
Tilemap v = super.create();
|
||||
int[] data = new int[tileW*tileH];
|
||||
|
||||
int[] map = Dungeon.level.map;
|
||||
|
||||
int stairsTop = -1;
|
||||
|
||||
//upper part of the level, mostly demon halls tiles
|
||||
for (int i = tileW; i < tileW*22; i++){
|
||||
|
||||
if (map[i] == Terrain.EXIT && stairsTop == -1){
|
||||
stairsTop = i;
|
||||
}
|
||||
|
||||
//pillars
|
||||
if (map[i] == Terrain.WALL && map[i-tileW] == Terrain.CHASM){
|
||||
data[i] = 13*8 + 6;
|
||||
data[++i] = 13*8 + 7;
|
||||
} else if (map[i] == Terrain.WALL && map[i-tileW] == Terrain.WALL){
|
||||
data[i] = 14*8 + 6;
|
||||
data[++i] = 14*8 + 7;
|
||||
} else if (i > tileW && map[i] == Terrain.CHASM && map[i-tileW] == Terrain.WALL) {
|
||||
data[i] = 15*8 + 6;
|
||||
data[++i] = 15*8 + 7;
|
||||
|
||||
//imp's pedestal
|
||||
} else if (map[i] == Terrain.PEDESTAL) {
|
||||
data[i] = 12*8 + 5;
|
||||
|
||||
//skull piles
|
||||
} else if (map[i] == Terrain.STATUE) {
|
||||
data[i] = 15*8 + 5;
|
||||
|
||||
//ground tiles
|
||||
} else if (map[i] == Terrain.EMPTY || map[i] == Terrain.EMPTY_DECO
|
||||
|| map[i] == Terrain.EMBERS || map[i] == Terrain.GRASS
|
||||
|| map[i] == Terrain.HIGH_GRASS || map[i] == Terrain.FURROWED_GRASS){
|
||||
|
||||
//final ground stiching with city tiles
|
||||
if (i/tileW == 21){
|
||||
data[i] = 11*8 + 0;
|
||||
data[++i] = 11*8 + 1;
|
||||
data[++i] = 11*8 + 2;
|
||||
data[++i] = 11*8 + 3;
|
||||
data[++i] = 11*8 + 4;
|
||||
data[++i] = 11*8 + 5;
|
||||
data[++i] = 11*8 + 6;
|
||||
} else {
|
||||
|
||||
//regular ground tiles
|
||||
if (map[i - 1] == Terrain.CHASM) {
|
||||
data[i] = 12 * 8 + 1;
|
||||
} else if (map[i + 1] == Terrain.CHASM) {
|
||||
data[i] = 12 * 8 + 3;
|
||||
} else if (map[i] == Terrain.EMPTY_DECO) {
|
||||
data[i] = 12 * 8 + 4;
|
||||
} else {
|
||||
data[i] = 12 * 8 + 2;
|
||||
}
|
||||
}
|
||||
|
||||
//otherwise no tile here
|
||||
} else {
|
||||
data[i] = -1;
|
||||
}
|
||||
}
|
||||
|
||||
//custom for stairs
|
||||
for (int i = 0; i < STAIR_ROWS; i++){
|
||||
for (int j = 0; j < 7; j++){
|
||||
data[stairsTop+j] = (i+4)*8 + j;
|
||||
}
|
||||
stairsTop += tileW;
|
||||
}
|
||||
|
||||
//lower part: statues, pedestals, and carpets
|
||||
for (int i = tileW*22; i < tileW * tileH; i++){
|
||||
|
||||
//pedestal spawners
|
||||
if (map[i] == Terrain.PEDESTAL){
|
||||
data[i] = 13*8 + 4;
|
||||
|
||||
//statues that should face left instead of right
|
||||
} else if (map[i] == Terrain.STATUE && i%tileW > 7) {
|
||||
data[i] = 15 * 8 + 4;
|
||||
|
||||
//carpet tiles
|
||||
} else if (map[i] == Terrain.EMPTY_SP) {
|
||||
//top row of DK's throne
|
||||
if (map[i + 1] == Terrain.EMPTY_SP && map[i + tileW] == Terrain.EMPTY_SP) {
|
||||
data[i] = 13 * 8 + 1;
|
||||
data[++i] = 13 * 8 + 2;
|
||||
data[++i] = 13 * 8 + 3;
|
||||
|
||||
//mid row of DK's throne
|
||||
}else if (map[i + 1] == Terrain.SIGN) {
|
||||
data[i] = 14 * 8 + 1;
|
||||
data[++i] = 14 * 8 + 2;
|
||||
data[++i] = 14 * 8 + 3;
|
||||
|
||||
//bottom row of DK's throne
|
||||
} else if (map[i+1] == Terrain.EMPTY_SP && map[i-tileW] == Terrain.EMPTY_SP){
|
||||
data[i] = 15*8 + 1;
|
||||
data[++i] = 15*8 + 2;
|
||||
data[++i] = 15*8 + 3;
|
||||
|
||||
//otherwise entrance carpet
|
||||
} else if (map[i-tileW] != Terrain.EMPTY_SP){
|
||||
data[i] = 13*8 + 0;
|
||||
} else if (map[i+tileW] != Terrain.EMPTY_SP){
|
||||
data[i] = 15*8 + 0;
|
||||
} else {
|
||||
data[i] = 14*8 + 0;
|
||||
}
|
||||
|
||||
//otherwise no tile here
|
||||
} else {
|
||||
data[i] = -1;
|
||||
}
|
||||
}
|
||||
|
||||
v.map( data, tileW );
|
||||
return v;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name(int tileX, int tileY) {
|
||||
int cell = (this.tileX + tileX) + (this.tileY + tileY)*tileW;
|
||||
|
||||
//demon halls tiles
|
||||
if (cell < Dungeon.level.width*22){
|
||||
if (Dungeon.level.map[cell] == Terrain.STATUE){
|
||||
return Messages.get(HallsLevel.class, "statue_name");
|
||||
}
|
||||
|
||||
//DK arena tiles
|
||||
} else {
|
||||
if (Dungeon.level.map[cell] == Terrain.SIGN){
|
||||
return Messages.get(CityBossLevel.class, "throne_name");
|
||||
} else if (Dungeon.level.map[cell] == Terrain.PEDESTAL){
|
||||
return Messages.get(CityBossLevel.class, "summoning_name");
|
||||
}
|
||||
}
|
||||
|
||||
return super.name(tileX, tileY);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String desc(int tileX, int tileY) {
|
||||
int cell = (this.tileX + tileX) + (this.tileY + tileY)*tileW;
|
||||
|
||||
//demon halls tiles
|
||||
if (cell < Dungeon.level.width*22){
|
||||
if (Dungeon.level.map[cell] == Terrain.EXIT){
|
||||
return Messages.get(HallsLevel.class, "exit_desc");
|
||||
} else if (Dungeon.level.map[cell] == Terrain.STATUE){
|
||||
return Messages.get(HallsLevel.class, "statue_desc");
|
||||
} else if (Dungeon.level.map[cell] == Terrain.EMPTY_DECO){
|
||||
return "";
|
||||
}
|
||||
|
||||
//DK arena tiles
|
||||
} else {
|
||||
if (Dungeon.level.map[cell] == Terrain.SIGN){
|
||||
return Messages.get(CityBossLevel.class, "throne_desc");
|
||||
} else if (Dungeon.level.map[cell] == Terrain.PEDESTAL){
|
||||
return Messages.get(CityBossLevel.class, "summoning_desc");
|
||||
}
|
||||
}
|
||||
|
||||
return super.desc(tileX, tileY);
|
||||
}
|
||||
}
|
||||
|
||||
public static class CustomWallVisuals extends CustomTilemap {
|
||||
{
|
||||
texture = Assets.Environment.CITY_BOSS;
|
||||
tileW = 15;
|
||||
tileH = 48;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Tilemap create() {
|
||||
Tilemap v = super.create();
|
||||
int[] data = new int[tileW*tileH];
|
||||
|
||||
int[] map = Dungeon.level.map;
|
||||
|
||||
int shadowTop = -1;
|
||||
|
||||
//upper part of the level, mostly demon halls tiles
|
||||
for (int i = tileW; i < tileW*21; i++) {
|
||||
|
||||
if (map[i] == Terrain.EXIT && shadowTop == -1){
|
||||
shadowTop = i - tileW*4;
|
||||
}
|
||||
|
||||
//pillars
|
||||
if (map[i] == Terrain.CHASM && map[i+tileW] == Terrain.WALL) {
|
||||
data[i] = 12*8 + 6;
|
||||
data[++i] = 12*8 + 7;
|
||||
} else if (map[i] == Terrain.WALL && map[i-tileW] == Terrain.CHASM) {
|
||||
data[i] = 13 * 8 + 6;
|
||||
data[++i] = 13 * 8 + 7;
|
||||
|
||||
//skull tops
|
||||
} else if (map[i+tileW] == Terrain.STATUE) {
|
||||
data[i] = 14*8 + 5;
|
||||
|
||||
//otherwise no tile here
|
||||
} else {
|
||||
data[i] = -1;
|
||||
}
|
||||
}
|
||||
|
||||
//custom shadow for stairs
|
||||
for (int i = 0; i < 8; i++){
|
||||
if (i < 4){
|
||||
data[shadowTop] = i*8 + 0;
|
||||
data[shadowTop+1] = data[shadowTop+2] = data[shadowTop+3] = data[shadowTop+4] =
|
||||
data[shadowTop+5] = data[shadowTop+6] = i*8 + 1;
|
||||
data[shadowTop+7] = i*8 + 2;
|
||||
} else {
|
||||
int j = i - 4;
|
||||
data[shadowTop] = j*8 + 3;
|
||||
data[shadowTop+1] = data[shadowTop+2] = data[shadowTop+3] = data[shadowTop+4] =
|
||||
data[shadowTop+5] = data[shadowTop+6] = j*8 + 4;
|
||||
data[shadowTop+7] = j*8 + 5;
|
||||
}
|
||||
|
||||
shadowTop += tileW;
|
||||
}
|
||||
|
||||
//lower part. Statues and DK's throne
|
||||
for (int i = tileW*21; i < tileW * tileH; i++){
|
||||
|
||||
//Statues that need to face left instead of right
|
||||
if (map[i] == Terrain.STATUE && i%tileW > 7){
|
||||
data[i-tileW] = 14*8 + 4;
|
||||
} else if (map[i] == Terrain.SIGN){
|
||||
data[i-tileW] = 13*8 + 5;
|
||||
}
|
||||
|
||||
//always no tile here (as the above statements are modifying previous tiles)
|
||||
data[i] = -1;
|
||||
}
|
||||
|
||||
v.map( data, tileW );
|
||||
return v;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -67,6 +67,8 @@ public class BlueBatSprite extends MobSprite {
|
|||
die = new Animation( 12, false );
|
||||
die.frames( frames, 4, 5, 6 );
|
||||
|
||||
zap = attack.clone();
|
||||
|
||||
play( idle );
|
||||
}
|
||||
|
||||
|
|
|
@ -18,10 +18,31 @@ import java.util.ArrayList;
|
|||
public class vM0_6_7_X_Changes {
|
||||
|
||||
public static void addAllChanges(ArrayList<ChangeInfo> changeInfos) {
|
||||
add_v0_6_2_Changes(changeInfos);
|
||||
add_v0_6_1_Changes(changeInfos);
|
||||
add_v0_6_0_Changes(changeInfos);
|
||||
}
|
||||
|
||||
public static void add_v0_6_2_Changes( ArrayList<ChangeInfo> changeInfos ) {
|
||||
ChangeInfo changes = new ChangeInfo("v0.6.0.0-BetaXVII", true, "");
|
||||
changes.hardlight(Window.TITLE_COLOR);
|
||||
changeInfos.add(changes);
|
||||
|
||||
changes = new ChangeInfo("改动", false, null);
|
||||
changes.hardlight(Window.SKYBULE_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_06X22")));
|
||||
|
||||
changes = new ChangeInfo("调整", false, null);
|
||||
changes.hardlight(Window.CYELLOW);
|
||||
changeInfos.add(changes);
|
||||
|
||||
changes.addButton(new ChangeButton(new BlueBatSprite(), ("小血影初始改动"),
|
||||
("小血影10级后将会开启远程攻击")));
|
||||
}
|
||||
|
||||
public static void add_v0_6_1_Changes( ArrayList<ChangeInfo> changeInfos ) {
|
||||
ChangeInfo changes = new ChangeInfo("v0.6.0.0-BetaXV", true, "");
|
||||
changes.hardlight(Window.TITLE_COLOR);
|
||||
|
|
|
@ -203,6 +203,8 @@ public class WndChallenges extends Window {
|
|||
pane.scrollTo(0, 0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
|
||||
|
|
|
@ -188,8 +188,7 @@ public class WndHero extends WndTabbed {
|
|||
statSlot( Messages.get(this, "gold"), Statistics.goldCollected );
|
||||
statSlot( Messages.get(this, "depth"), Statistics.deepestFloor );
|
||||
|
||||
statSlot( M.L(HeroStat.class,"seed_dungeon"), M.L(HeroStat.class, Statistics.isCustomSeed ?"seed_custom_yes":"seed_custom_no")
|
||||
+ "-" + DungeonSeed.convertToCode(Dungeon.seed).toUpperCase());
|
||||
statSlot( M.L(HeroStat.class,"seed_dungeon"), DungeonSeed.convertToCode(Dungeon.seed).toUpperCase());
|
||||
|
||||
pos += GAP;
|
||||
}
|
||||
|
|
|
@ -35,6 +35,7 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.sprites.HeroSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.BadgesGrid;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.BadgesList;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.Button;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.Icons;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.ItemSlot;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton;
|
||||
|
@ -47,7 +48,6 @@ import com.watabou.noosa.Game;
|
|||
import com.watabou.noosa.Group;
|
||||
import com.watabou.noosa.Image;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.Button;
|
||||
import com.watabou.noosa.ui.Component;
|
||||
|
||||
import java.util.Locale;
|
||||
|
|
Loading…
Reference in New Issue
Block a user