Update Beta21-p1
This commit is contained in:
parent
41dacc5d3d
commit
32f380c522
|
@ -17,7 +17,7 @@ allprojects {
|
|||
appPackageName = 'com.ansdomagiclingpixeldungeon.ling'
|
||||
|
||||
appVersionCode =700720
|
||||
appVersionName = '0.6.0.0-Beta20.75'
|
||||
appVersionName = '0.6.0.0-Beta21-p1'
|
||||
|
||||
appJavaCompatibility = JavaVersion.VERSION_1_8
|
||||
|
||||
|
|
|
@ -1,4 +1,8 @@
|
|||
###MLPD
|
||||
actors.mobs.bosses.crossdiedtower.dead=控制目标已丢失,已自动摧毁……
|
||||
actors.mobs.bosses.crossdiedtower.name=激光十字晶柱
|
||||
actors.mobs.bosses.crossdiedtower.desc=发射神秘的激光,对敌人造成伤害……
|
||||
|
||||
actors.mobs.bosses.firemagicdied.name=浊焰魔女
|
||||
actors.mobs.bosses.firemagicdied.desc=曾经是翼绫的护法之一,因为大火事件被地表三巨头怀疑,逃亡到了雪凛峡谷……\n\n被当时的商人领主给收养,现在,她是雪凛峡谷的守护之神……
|
||||
actors.mobs.bosses.firemagicdied.go=%s,吾乃浊焰的化身,你必将受到正义的审判……
|
||||
|
|
|
@ -1,4 +1,15 @@
|
|||
###MLPD
|
||||
items.artifacts.goldiron.name=镀金铁砧
|
||||
items.artifacts.goldiron.desc=待补充
|
||||
|
||||
items.bombs.laserpython.name=激光十字晶柱召唤器
|
||||
items.bombs.laserpython.desc=这枚召唤器会在爆炸后立刻生成一个十字晶柱。
|
||||
items.bombs.laserpython.didnot_pick=你无法拾取该物品……
|
||||
|
||||
items.weapon.melee.endingblade.ac_lastcrystal=Γ激光晶柱Γ
|
||||
items.weapon.melee.endingblade.ac_diedghost=✦死亡宣告✦
|
||||
items.weapon.melee.endingblade.ac_healreset=_亡者归来_
|
||||
|
||||
items.artifacts.wraithamulet.name=暗金宝石护符
|
||||
items.artifacts.wraithamulet.desc=来自于异世界的产物,能使自己进入虚无化。当护符能量足够多的时候,你还可以对敌人实行一次暗夜袭击,护符能量将会随着时间自动恢复。\n\n这个护符是证明给强者之人用的,冰雪魔女已经输的心服口服,现在她将此护身符给予给你。
|
||||
items.artifacts.wraithamulet.ac_ghost=遁入虚无
|
||||
|
@ -84,6 +95,8 @@ items.quest.skeletongold.wow=染血金币发出诡异的光芒,你感到下层
|
|||
|
||||
items.weapon.melee.endingblade.name=终焉
|
||||
items.weapon.melee.endingblade.desc=不知道从哪来的一个拆开的场记板,貌似沾染了焰之诅咒,有着强大的侵蚀能力。\n\n这个武器在攻击敌人的时候有概率造成_即死_效果,在汲取一定魔力后会产生新的能力。
|
||||
items.weapon.melee.endingblade.cursed=当你装备上这个武器后,一股无形的力量将你束缚住……
|
||||
items.weapon.melee.endingblade.donot_eqip=终焉的诅咒已经浸染你的身体,你无力脱下它。
|
||||
|
||||
#MLPDSTOREYBOOKS
|
||||
|
||||
|
@ -1245,6 +1258,8 @@ items.scrolls.scrollofremovecurse.inv_title=选择一件要净化的物品
|
|||
items.scrolls.scrollofremovecurse.cleansed=你的道具闪耀着净化的光芒,一股恶毒的能量从中消散。
|
||||
items.scrolls.scrollofremovecurse.not_cleansed=你的道具闪耀着净化的光芒,不过什么也没发生。
|
||||
items.scrolls.scrollofremovecurse.desc=卷轴上的咒语能够瞬间清除指定的一件武器、护甲、法杖、戒指或神器上的诅咒。
|
||||
items.scrolls.scrollofremovecurse.=卷轴上的咒语能够瞬间清除指定的一件武器、护甲、法杖、戒指或神器上的诅咒。
|
||||
items.scrolls.scrollofremovecurse.strmagic=你的终焉散发出血红的光束,你的净化卷轴灰飞烟灭了……
|
||||
|
||||
items.scrolls.scrollofteleportation.name=传送卷轴
|
||||
items.scrolls.scrollofteleportation.tele=眨眼之间你就被传送到本层的另外一个位置。
|
||||
|
@ -1970,6 +1985,7 @@ items.weapon.weapon.identify=你对手中的武器已经足够熟悉并将其完
|
|||
items.weapon.weapon.too_heavy=因为你的力量不足,该武器会降低你的攻速和精准,并让你无法偷袭。
|
||||
items.weapon.weapon.excess_str=你的额外力量让你在使用这件武器时最多能够造成_%d点额外伤害_。
|
||||
items.weapon.weapon.incompatible=不同属性的魔法相冲突,消除了武器上的附魔!
|
||||
items.weapon.weapon.nxt_cursed=净化的光芒闪过,但终焉上面的诅咒仍然没有被解除……
|
||||
items.weapon.weapon.cursed_worn=由于这件武器被诅咒,你无法将其放下。
|
||||
items.weapon.weapon.cursed=你能感觉到这件武器里潜伏着一股充满恶意的魔力。
|
||||
items.weapon.weapon.not_cursed=这件武器没有被诅咒。
|
||||
|
|
BIN
core/src/main/assets/sprites/items/died.png
Normal file
BIN
core/src/main/assets/sprites/items/died.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 274 B |
Binary file not shown.
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 70 KiB |
|
@ -278,7 +278,10 @@ public class Assets {
|
|||
public static final String KEEPERKING = "sprites/npc/ShopKing.png";
|
||||
|
||||
//BOSS
|
||||
public static final String DIED = "sprites/items/died.png";
|
||||
|
||||
public static final String CRID = "sprites/boss/ColdGuard.png";
|
||||
|
||||
public static final String FRAS = "sprites/boss/FireMagicGirl.png";
|
||||
public static final String NECROREDEX = "sprites/boss/rednecromancer_ex.png";
|
||||
public static final String SLIMEPRINCESS = "sprites/boss/SlimePrincess.png";
|
||||
|
|
|
@ -71,13 +71,13 @@ public class Challenges {
|
|||
"sbsg",
|
||||
"exsg",
|
||||
"stronger_bosses",
|
||||
"light&black",
|
||||
//"light&black",
|
||||
"pro",
|
||||
};
|
||||
|
||||
public static final int[] MASKS = {
|
||||
NO_FOOD, NO_ARMOR, NO_HEALING, NO_HERBALISM, SWARM_INTELLIGENCE, DARKNESS, NO_SCROLLS
|
||||
, AQUAPHOBIA, CHAMPION_ENEMIES,RLPT,SBSG,EXSG,STRONGER_BOSSES,LIGHTBLACK,PRO,
|
||||
, AQUAPHOBIA, CHAMPION_ENEMIES,RLPT,SBSG,EXSG,STRONGER_BOSSES,PRO,
|
||||
};
|
||||
public String name;
|
||||
|
||||
|
|
|
@ -387,7 +387,7 @@ public class Dungeon {
|
|||
if (Dungeon.isChallenged(RLPT)) {
|
||||
switch (depth) {
|
||||
case 0:
|
||||
level = new ShopBossLevel();
|
||||
level = new ZeroLevel();
|
||||
break;
|
||||
case 1:
|
||||
case 2:
|
||||
|
|
|
@ -0,0 +1,125 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.actors.buffs;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.CrossDiedTower;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Beam;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.PointF;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
public class CrossTownProc extends Buff {
|
||||
|
||||
public int towerPosLing;
|
||||
private int stateLoop = 0;
|
||||
|
||||
private void beamProc(Ballistica b) {
|
||||
for (int j : b.path) {
|
||||
if (j == b.sourcePos) continue;
|
||||
Char ch = findChar(j);
|
||||
if (ch != null) {
|
||||
if (ch.alignment == Char.Alignment.ENEMY) {
|
||||
ch.damage(Random.IntRange(5, 19), CrossDiedTower.class);
|
||||
Buff.affect(ch, Cripple.class, 2f);
|
||||
if (ch == Dungeon.hero && !ch.isAlive()) {
|
||||
Dungeon.fail(getClass());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean act() {
|
||||
PointF p = DungeonTilemap.raisedTileCenterToWorld(towerPosLing);
|
||||
if (stateLoop == 1) {
|
||||
stateLoop++;
|
||||
FloatingText.show(p.x, p.y, "+", 0x5580FF);
|
||||
} else if (stateLoop == 2) {
|
||||
int w = Dungeon.level.width();
|
||||
int[] tile = {w, -w, 1, -1};
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
Ballistica b = new Ballistica(towerPosLing, towerPosLing + tile[i], Ballistica.STOP_SOLID);
|
||||
target.sprite.parent.add(new Beam.DeathRay(DungeonTilemap.raisedTileCenterToWorld(b.sourcePos), DungeonTilemap.raisedTileCenterToWorld(b.collisionPos)));
|
||||
beamProc(b);
|
||||
}
|
||||
stateLoop++;
|
||||
} else if (stateLoop == 4) {
|
||||
stateLoop++;
|
||||
FloatingText.show(p.x, p.y, "x", 0xFF8055);
|
||||
} else if (stateLoop == 5) {
|
||||
int w = Dungeon.level.width();
|
||||
int[] tile = {w + 1, w - 1, -w + 1, -w - 1};
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
Ballistica b = new Ballistica(towerPosLing, towerPosLing + tile[i], Ballistica.STOP_SOLID);
|
||||
target.sprite.parent.add(new Beam.LightRay(DungeonTilemap.raisedTileCenterToWorld(b.sourcePos), DungeonTilemap.raisedTileCenterToWorld(b.collisionPos)));
|
||||
beamProc(b);
|
||||
}
|
||||
stateLoop++;
|
||||
} else if (stateLoop == 6) {
|
||||
stateLoop++;
|
||||
FloatingText.show(p.x, p.y, "S", 0x00ffff);
|
||||
} else if (stateLoop == 7) {
|
||||
int w = Dungeon.level.width();
|
||||
int[] tile = {w, w - 5, -w + 5, -w};
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
Ballistica b = new Ballistica(towerPosLing, towerPosLing + tile[i], Ballistica.IGNORE_SOFT_SOLID);
|
||||
target.sprite.parent.add(new Beam.DeathRayS(DungeonTilemap.raisedTileCenterToWorld(b.sourcePos),
|
||||
DungeonTilemap.raisedTileCenterToWorld(b.collisionPos)));
|
||||
beamProc(b);
|
||||
}
|
||||
stateLoop++;
|
||||
} else if (stateLoop == 10) {
|
||||
stateLoop++;
|
||||
FloatingText.show(p.x, p.y, "※", 0x00ffff);
|
||||
} else if (stateLoop == 11) {
|
||||
int w = Dungeon.level.width();
|
||||
int[] tile = {w + 1, w - 1, -w + 1, -w - 1};
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
Ballistica b = new Ballistica(towerPosLing, towerPosLing + tile[i], Ballistica.STOP_SOLID);
|
||||
target.sprite.parent.add(new Beam.DeathRay(DungeonTilemap.raisedTileCenterToWorld(b.sourcePos), DungeonTilemap.raisedTileCenterToWorld(b.collisionPos)));
|
||||
beamProc(b);
|
||||
}
|
||||
if (stateLoop == 11) {
|
||||
int wx = Dungeon.level.width();
|
||||
int[] tilex = {w, -wx, 1, -1};
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
Ballistica b = new Ballistica(towerPosLing, towerPosLing + tilex[i], Ballistica.STOP_SOLID);
|
||||
target.sprite.parent.add(new Beam.DeathRayS(DungeonTilemap.raisedTileCenterToWorld(b.sourcePos),
|
||||
DungeonTilemap.raisedTileCenterToWorld(b.collisionPos)));
|
||||
beamProc(b);
|
||||
}
|
||||
}
|
||||
stateLoop = 0;
|
||||
} else if (stateLoop == 0 || stateLoop == 3|| stateLoop == 8|| stateLoop == 9) {
|
||||
stateLoop++;
|
||||
} else {
|
||||
stateLoop = 0;
|
||||
}
|
||||
// }
|
||||
|
||||
spend(TICK);
|
||||
return true;
|
||||
}
|
||||
|
||||
private static final String SHOCKER_POS = "shocker_pos";
|
||||
private static final String SHOCKING_ORDINALS = "shocking_ordinals";
|
||||
|
||||
@Override
|
||||
public void storeInBundle(Bundle bundle) {
|
||||
super.storeInBundle(bundle);
|
||||
bundle.put(SHOCKER_POS, towerPosLing);
|
||||
bundle.put(SHOCKING_ORDINALS, stateLoop);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void restoreFromBundle(Bundle bundle) {
|
||||
super.restoreFromBundle(bundle);
|
||||
towerPosLing = bundle.getInt(SHOCKER_POS);
|
||||
stateLoop = bundle.getInt(SHOCKING_ORDINALS);
|
||||
}
|
||||
}
|
||||
|
|
@ -63,6 +63,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.bags.BookBag;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.items.bags.HerbBag;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.bags.KingBag;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.bags.VelvetPouch;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.bombs.LaserPython;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.BrokenBooks;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.DeepBloodBooks;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.GrassKingBooks;
|
||||
|
@ -78,7 +79,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.lightblack.OilLantern;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.items.lightblack.OilPotion;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.AlchemicalCatalyst;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfExperience;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfFrost;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfInvisibility;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLightningShiledX;
|
||||
|
@ -95,6 +95,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfIdentify;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfLullaby;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMapping;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRage;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRemoveCurse;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTerror;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTransmutation;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade;
|
||||
|
@ -177,9 +178,10 @@ public enum HeroClass {
|
|||
if (Dungeon.isChallenged(Challenges.PRO)){
|
||||
new FrozenCarpaccio().quantity(11).identify().collect();
|
||||
new FireFishSword().quantity(1).identify().collect();
|
||||
new LaserPython().quantity(100).identify().collect();
|
||||
new PotionOfInvisibility().quantity(45).identify().collect();
|
||||
new PotionOfPurity().quantity(45).identify().collect();
|
||||
Buff.affect(hero, ChampionHero.AntiMagic.class, 1234567890f);
|
||||
Buff.affect(hero, ChampionHero.AntiMagic.class, 50000f);
|
||||
new AlchemicalCatalyst().quantity(45).identify().collect();
|
||||
new EtherealChains().quantity(1).identify().collect();
|
||||
new ScrollOfIdentify().quantity(45).identify().collect();
|
||||
|
@ -238,7 +240,7 @@ public enum HeroClass {
|
|||
new FireFishSword().quantity(1).identify().collect();
|
||||
new EndingBlade().quantity(1).identify().collect();
|
||||
new PotionOfDragonKingBreath().quantity(1).identify().collect();
|
||||
new PotionOfFrost().quantity(100).identify().collect();
|
||||
new ScrollOfRemoveCurse().quantity(100).identify().collect();
|
||||
new WandOfBlueFuck().quantity(1).identify().collect();
|
||||
new ScrollOfFlameCursed().quantity(10).identify().collect();
|
||||
new PotionOfLightningShiled().quantity(42).collect();
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses;
|
||||
|
||||
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.CrossTownProc;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.CrossDiedSprites;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
|
||||
public class CrossDiedTower extends Mob {
|
||||
|
||||
{
|
||||
spriteClass = CrossDiedSprites.class;
|
||||
|
||||
HP = HT = 1;
|
||||
maxLvl = -1;
|
||||
|
||||
properties.add(Property.MINIBOSS);
|
||||
properties.add(Property.INORGANIC);
|
||||
properties.add(Property.ELECTRIC);
|
||||
properties.add(Property.IMMOVABLE);
|
||||
|
||||
state = HUNTING;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void damage( int dmg, Object src ) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add( Buff buff ) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean act() {
|
||||
|
||||
if (Dungeon.level.heroFOV[pos]) {
|
||||
spend(TICK);
|
||||
} else {
|
||||
//失去范围
|
||||
for (Mob mob : (Iterable<Mob>)Dungeon.level.mobs.clone()) {
|
||||
if (mob instanceof CrossDiedTower) {
|
||||
mob.die( true );
|
||||
}
|
||||
}
|
||||
for (Buff buff : hero.buffs()) {
|
||||
if (buff instanceof CrossTownProc) {
|
||||
buff.detach();
|
||||
}
|
||||
}
|
||||
GLog.n(Messages.get(this,"dead"));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -6,6 +6,7 @@ import static com.shatteredpixel.shatteredpixeldungeon.levels.ShopBossLevel.CryS
|
|||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Badges;
|
||||
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.Amok;
|
||||
|
@ -21,9 +22,11 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LifeLink;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ShopLimitLock;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Bee;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.BlackHost;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ColdGurad;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.DM100;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Eye;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Monk;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.SRPDICLRPRO;
|
||||
|
@ -40,6 +43,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.Flare;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.TargetedCell;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.EnergyParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.PurpleParticle;
|
||||
|
@ -62,6 +66,7 @@ import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
import com.watabou.noosa.Camera;
|
||||
import com.watabou.noosa.Game;
|
||||
import com.watabou.noosa.audio.Music;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.noosa.particles.Emitter;
|
||||
|
@ -217,6 +222,12 @@ public class FireMagicDied extends Mob implements Callback {
|
|||
private int beamCD = 23;
|
||||
private float summonCooldown = 0;
|
||||
private float abilityCooldown = 6;
|
||||
|
||||
private static final int MIN_ABILITY_CD = 7;
|
||||
private static final int MAX_ABILITY_CD = 12;
|
||||
private ArrayList<Integer> targetedCells = new ArrayList<>();
|
||||
private int lastHeroPos;
|
||||
|
||||
private static final int MIN_COOLDOWN = 7;
|
||||
private static final int MAX_COOLDOWN = 11;
|
||||
private int summonsMade = 0;
|
||||
|
@ -345,7 +356,22 @@ public class FireMagicDied extends Mob implements Callback {
|
|||
|
||||
@Override
|
||||
public boolean act() {
|
||||
if (phase == 1 && HP <= 400) {
|
||||
if (phase == 1 && HP <= 350) {
|
||||
doYogLasers();
|
||||
actScanning();
|
||||
if (Dungeon.level.water[pos] && HP < HT) {
|
||||
HP += healInc;
|
||||
|
||||
if (Dungeon.level.heroFOV[pos]) {
|
||||
sprite.emitter().burst(Speck.factory(Speck.HEALING), healInc);
|
||||
}
|
||||
if (HP * 2 > HT) {
|
||||
BossHealthBar.bleed(false);
|
||||
((FireMagicGirlSprite) sprite).spray(false);
|
||||
HP = Math.min(HP, HT);
|
||||
}
|
||||
}
|
||||
}else if (phase == 2 && HP <= 300) {
|
||||
|
||||
if (summonCooldown <= 0 && summonSubject(3)){
|
||||
summonsMade++;
|
||||
|
@ -411,9 +437,9 @@ public class FireMagicDied extends Mob implements Callback {
|
|||
abilityCooldown--;
|
||||
}
|
||||
|
||||
} else if (phase == 2){
|
||||
} else if (phase == 3){
|
||||
if (summonSubject(2)) summonsMade++;
|
||||
} else if (phase == 3 && buffs(FireMagicDied.Summoning.class).size() < 4){
|
||||
} else if (phase == 4 && buffs(FireMagicDied.Summoning.class).size() < 4){
|
||||
actPhaseTwoSummon();
|
||||
return true;
|
||||
}
|
||||
|
@ -437,40 +463,39 @@ public class FireMagicDied extends Mob implements Callback {
|
|||
return super.act();
|
||||
}
|
||||
private static final String PHASE = "phase";
|
||||
private static final String ABILITY_CD = "ability_cd";
|
||||
private static final String SUMMON_CD = "summon_cd";
|
||||
private static final String SUMMONS_MADE = "summons_made";
|
||||
private int wave=0;
|
||||
private static final String TARGETED_CELLS = "targeted_cells";
|
||||
|
||||
private static final String SUMMON_CD = "summon_cd";
|
||||
private static final String ABILITY_CD = "ability_cd";
|
||||
private static final String LAST_ABILITY = "last_ability";
|
||||
@Override
|
||||
public void storeInBundle(Bundle bundle) {
|
||||
super.storeInBundle(bundle);
|
||||
bundle.put( PHASE, phase );
|
||||
bundle.put( SUMMONS_MADE, summonsMade );
|
||||
bundle.put( SUMMON_CD, summonCooldown );
|
||||
bundle.put( ABILITY_CD, abilityCooldown );
|
||||
bundle.put( LAST_ABILITY, lastAbility );
|
||||
bundle.put("wavePhase2", wave);
|
||||
pumpedUp = bundle.getInt( PUMPEDUP );
|
||||
if (state != SLEEPING) BossHealthBar.assignBoss(this);
|
||||
if ((HP*2 <= HT)) BossHealthBar.bleed(true);
|
||||
bundle.put(PHASE, phase);
|
||||
|
||||
//if check is for pre-0.9.3 saves
|
||||
healInc = bundle.getInt(HEALINC);
|
||||
bundle.put( PUMPEDUP , pumpedUp );
|
||||
bundle.put( HEALINC, healInc );
|
||||
bundle.put(ABILITY_CD, abilityCooldown);
|
||||
bundle.put(SUMMON_CD, summonCooldown);
|
||||
|
||||
int[] bundleArr = new int[targetedCells.size()];
|
||||
for (int i = 0; i < targetedCells.size(); i++){
|
||||
bundleArr[i] = targetedCells.get(i);
|
||||
}
|
||||
bundle.put(TARGETED_CELLS, bundleArr);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void restoreFromBundle(Bundle bundle) {
|
||||
super.restoreFromBundle(bundle);
|
||||
phase = bundle.getInt( PHASE );
|
||||
summonsMade = bundle.getInt( SUMMONS_MADE );
|
||||
summonCooldown = bundle.getFloat( SUMMON_CD );
|
||||
abilityCooldown = bundle.getFloat( ABILITY_CD );
|
||||
lastAbility = bundle.getInt( LAST_ABILITY );
|
||||
wave = bundle.getInt("wavePhase2");
|
||||
phase = bundle.getInt(PHASE);
|
||||
if (phase != 0) BossHealthBar.assignBoss(this);
|
||||
|
||||
abilityCooldown = bundle.getFloat(ABILITY_CD);
|
||||
summonCooldown = bundle.getFloat(SUMMON_CD);
|
||||
|
||||
for (int i : bundle.getIntArray(TARGETED_CELLS)){
|
||||
targetedCells.add(i);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -677,6 +702,7 @@ public class FireMagicDied extends Mob implements Callback {
|
|||
}
|
||||
//properties.add(Property.IMMOVABLE);
|
||||
ScrollOfTeleportation.appear(this, ShopBossLevel.throneling);
|
||||
doYogLasers();
|
||||
sprite.centerEmitter().start( Speck.factory( Speck.SCREAM ), 0.4f, 2 );
|
||||
Sample.INSTANCE.play( Assets.Sounds.CHALLENGE );
|
||||
phase = 2;
|
||||
|
@ -715,7 +741,8 @@ public class FireMagicDied extends Mob implements Callback {
|
|||
beamCD = 40 + 8 - (phase == 10 ? 38 : 0);
|
||||
sprite.showStatus(0xff0000, Messages.get(this, "dead"));
|
||||
|
||||
} else if (phase == 3 && preHP > 50 && HP <= 50){
|
||||
} else if (phase == 3 && preHP > 80 && HP <= 80){
|
||||
doYogLasers();
|
||||
yell( Messages.get(this, "losing") );
|
||||
}
|
||||
|
||||
|
@ -766,6 +793,7 @@ public class FireMagicDied extends Mob implements Callback {
|
|||
public void notice() {
|
||||
super.notice();
|
||||
BossHealthBar.assignBoss(this);
|
||||
ShatteredPixelDungeon.seamlessResetScene();
|
||||
Music.INSTANCE.play(Assets.BGM_FRBOSS, true);
|
||||
yell( Messages.get(this, "notice") );
|
||||
//summon();
|
||||
|
@ -1111,7 +1139,73 @@ public class FireMagicDied extends Mob implements Callback {
|
|||
}
|
||||
}
|
||||
|
||||
//第四阶段
|
||||
//Next Level 4
|
||||
public void doYogLasers(){
|
||||
boolean terrainAffected = false;
|
||||
HashSet<Char> affected = new HashSet<>();
|
||||
//delay fire on a rooted hero
|
||||
if (!enemy.rooted) {
|
||||
for (int i : targetedCells) {
|
||||
Ballistica b = new Ballistica(i, lastHeroPos, Ballistica.WONT_STOP);
|
||||
//shoot beams
|
||||
sprite.parent.add(new Beam.DeathRayS(DungeonTilemap.raisedTileCenterToWorld(i),
|
||||
DungeonTilemap.raisedTileCenterToWorld(b.collisionPos)));
|
||||
for (int p : b.path) {
|
||||
Char ch = Actor.findChar(p);
|
||||
if (ch != null && (ch.alignment != alignment || ch instanceof Bee)) {
|
||||
affected.add(ch);
|
||||
}
|
||||
if (Dungeon.level.flamable[p]) {
|
||||
Dungeon.level.destroy(p);
|
||||
GameScene.updateMap(p);
|
||||
terrainAffected = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (terrainAffected) {
|
||||
Dungeon.observe();
|
||||
}
|
||||
for (Char ch : affected) {
|
||||
ch.damage(Random.NormalIntRange(60, 121), new Eye.DeathGaze());
|
||||
|
||||
if (Dungeon.level.heroFOV[pos]) {
|
||||
ch.sprite.flash();
|
||||
CellEmitter.center(pos).burst(Speck.factory(Speck.COIN), Random.IntRange(2, 3));
|
||||
}
|
||||
if (!ch.isAlive() && ch == Dungeon.hero) {
|
||||
Dungeon.fail(getClass());
|
||||
GLog.n(Messages.get(Char.class, "kill", name()));
|
||||
}
|
||||
}
|
||||
targetedCells.clear();
|
||||
}
|
||||
|
||||
if (abilityCooldown <= 0 && HP < HT*0.8f){
|
||||
lastHeroPos = enemy.pos;
|
||||
|
||||
int beams = (int) (4 + (HP * 1.0f / HT)*4);
|
||||
for (int i = 0; i < beams; i++){
|
||||
int randompos = Random.Int(Dungeon.level.width()) + Dungeon.level.width()*2;
|
||||
targetedCells.add(randompos);
|
||||
}
|
||||
|
||||
for (int i : targetedCells){
|
||||
Ballistica b = new Ballistica(i, Dungeon.hero.pos, Ballistica.WONT_STOP);
|
||||
for (int p : b.path){
|
||||
Game.scene().addToFront(new TargetedCell(p, 0xFF0000));
|
||||
}
|
||||
}
|
||||
|
||||
spend(TICK*1.5f);
|
||||
Dungeon.hero.interrupt();
|
||||
|
||||
abilityCooldown += Random.NormalFloat(MIN_ABILITY_CD - 2*(1 - (HP * 1f / HT)), MAX_ABILITY_CD - 5*(1 - (HP * 1f / HT)));
|
||||
} else {
|
||||
spend(TICK);
|
||||
}
|
||||
if (abilityCooldown > 0) abilityCooldown--;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void move(int step) {
|
||||
|
||||
|
@ -1237,11 +1331,11 @@ public class FireMagicDied extends Mob implements Callback {
|
|||
public void detach() {
|
||||
super.detach();
|
||||
for (Mob m : Dungeon.level.mobs.toArray(new Mob[0])){
|
||||
if (m instanceof FireMagicDied ){
|
||||
m.damage(10, this);
|
||||
}
|
||||
}
|
||||
if (m instanceof FireMagicDied ){
|
||||
m.damage(10, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -33,7 +33,7 @@ public class NullDied extends NTNPC {
|
|||
public void flee() {
|
||||
destroy();
|
||||
Dungeon.level.seal();
|
||||
GameScene.flash(0x8000FFFF);
|
||||
GameScene.flash(0x80FF0000);
|
||||
sprite.killAndErase();
|
||||
CellEmitter.get( pos ).burst(SnowParticle.FACTORY, 6 );
|
||||
CellEmitter.get( pos ).burst(EnergyParticle.FACTORY, 6 );
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs;
|
|||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.EnergyParticle;
|
||||
|
|
|
@ -146,7 +146,7 @@ public class CloakOfShadows extends Artifact {
|
|||
BloodBat bat = new BloodBat();
|
||||
bat.pos = respawnPoints.get(Random.index( respawnPoints ));
|
||||
bat.HP = bat.HT = 18 + BloodBat.level * 2;
|
||||
((BloodBat) bat).defenseSkill = 4 + BloodBat.level*2;
|
||||
bat.defenseSkill = 4 + BloodBat.level*2;
|
||||
bat.state = bat.WANDERING;
|
||||
GameScene.add(bat);
|
||||
bat.sprite.emitter().burst(Speck.factory(Speck.STAR), 10);
|
||||
|
|
|
@ -0,0 +1,435 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.items.artifacts;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfEnergy;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.windows.WndOptions;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.noosa.particles.Emitter;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class GoldIron extends Artifact {
|
||||
|
||||
{
|
||||
image = ItemSpriteSheet.Gold_Iron;
|
||||
|
||||
levelCap = 5;
|
||||
|
||||
charge = 5+level();
|
||||
partialCharge = 0;
|
||||
chargeCap = 5+level();
|
||||
|
||||
defaultAction = AC_ACTIVATE;
|
||||
}
|
||||
|
||||
public static final String AC_ACTIVATE = "ACTIVATE";
|
||||
|
||||
//keeps track of generated sandbags.
|
||||
public int sandBags = 0;
|
||||
|
||||
@Override
|
||||
public ArrayList<String> actions(Hero hero ) {
|
||||
ArrayList<String> actions = super.actions( hero );
|
||||
if (isEquipped( hero ) && !cursed && (charge > 0 || activeBuff != null)) {
|
||||
actions.add(AC_ACTIVATE);
|
||||
}
|
||||
return actions;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute( Hero hero, String action ) {
|
||||
|
||||
super.execute(hero, action);
|
||||
|
||||
if (action.equals(AC_ACTIVATE)){
|
||||
|
||||
if (!isEquipped( hero )) GLog.i( Messages.get(Artifact.class, "need_to_equip") );
|
||||
else if (activeBuff != null) {
|
||||
if (activeBuff instanceof GoldIron.timeStasis) { //do nothing
|
||||
} else {
|
||||
activeBuff.detach();
|
||||
GLog.i( Messages.get(this, "deactivate") );
|
||||
}
|
||||
} else if (charge <= 0) GLog.i( Messages.get(this, "no_charge") );
|
||||
else if (cursed) GLog.i( Messages.get(this, "cursed") );
|
||||
else GameScene.show(
|
||||
new WndOptions(new ItemSprite(this),
|
||||
Messages.titleCase(name()),
|
||||
Messages.get(this, "prompt"),
|
||||
Messages.get(this, "stasis"),
|
||||
Messages.get(this, "freeze")) {
|
||||
@Override
|
||||
protected void onSelect(int index) {
|
||||
if (index == 0) {
|
||||
GLog.i( Messages.get(GoldIron.class, "onstasis") );
|
||||
GameScene.flash(0x80FFFFFF);
|
||||
Sample.INSTANCE.play(Assets.Sounds.TELEPORT);
|
||||
|
||||
activeBuff = new GoldIron.timeStasis();
|
||||
Talent.onArtifactUsed(Dungeon.hero);
|
||||
activeBuff.attachTo(Dungeon.hero);
|
||||
} else if (index == 1) {
|
||||
GLog.i( Messages.get(GoldIron.class, "onfreeze") );
|
||||
GameScene.flash(0x80FFFFFF);
|
||||
Sample.INSTANCE.play(Assets.Sounds.TELEPORT);
|
||||
|
||||
activeBuff = new GoldIron.timeFreeze();
|
||||
Talent.onArtifactUsed(Dungeon.hero);
|
||||
activeBuff.attachTo(Dungeon.hero);
|
||||
((GoldIron.timeFreeze)activeBuff).processTime(0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void activate(Char ch) {
|
||||
super.activate(ch);
|
||||
if (activeBuff != null)
|
||||
activeBuff.attachTo(ch);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean doUnequip(Hero hero, boolean collect, boolean single) {
|
||||
if (super.doUnequip(hero, collect, single)){
|
||||
if (activeBuff != null){
|
||||
activeBuff.detach();
|
||||
activeBuff = null;
|
||||
}
|
||||
return true;
|
||||
} else
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ArtifactBuff passiveBuff() {
|
||||
return new GoldIron.hourglassRecharge();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void charge(Hero target, float amount) {
|
||||
if (charge < chargeCap){
|
||||
partialCharge += 0.25f*amount;
|
||||
if (partialCharge >= 1){
|
||||
partialCharge--;
|
||||
charge++;
|
||||
updateQuickslot();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Item upgrade() {
|
||||
chargeCap+= 1;
|
||||
|
||||
//for artifact transmutation.
|
||||
while (level()+1 > sandBags)
|
||||
sandBags ++;
|
||||
|
||||
return super.upgrade();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String desc() {
|
||||
String desc = super.desc();
|
||||
|
||||
if (isEquipped( Dungeon.hero )){
|
||||
if (!cursed) {
|
||||
if (level() < levelCap )
|
||||
desc += "\n\n" + Messages.get(this, "desc_hint");
|
||||
|
||||
} else
|
||||
desc += "\n\n" + Messages.get(this, "desc_cursed");
|
||||
}
|
||||
return desc;
|
||||
}
|
||||
|
||||
|
||||
private static final String SANDBAGS = "sandbags";
|
||||
private static final String BUFF = "buff";
|
||||
|
||||
@Override
|
||||
public void storeInBundle( Bundle bundle ) {
|
||||
super.storeInBundle(bundle);
|
||||
bundle.put( SANDBAGS, sandBags );
|
||||
|
||||
if (activeBuff != null)
|
||||
bundle.put( BUFF , activeBuff );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void restoreFromBundle( Bundle bundle ) {
|
||||
super.restoreFromBundle(bundle);
|
||||
sandBags = bundle.getInt( SANDBAGS );
|
||||
|
||||
//these buffs belong to hourglass, need to handle unbundling within the hourglass class.
|
||||
if (bundle.contains( BUFF )){
|
||||
Bundle buffBundle = bundle.getBundle( BUFF );
|
||||
|
||||
if (buffBundle.contains( GoldIron.timeFreeze.PRESSES ))
|
||||
activeBuff = new GoldIron.timeFreeze();
|
||||
else
|
||||
activeBuff = new GoldIron.timeStasis();
|
||||
|
||||
activeBuff.restoreFromBundle(buffBundle);
|
||||
}
|
||||
}
|
||||
|
||||
public class hourglassRecharge extends ArtifactBuff {
|
||||
@Override
|
||||
public boolean act() {
|
||||
|
||||
LockedFloor lock = target.buff(LockedFloor.class);
|
||||
if (charge < chargeCap && !cursed && (lock == null || lock.regenOn())) {
|
||||
//90 turns to charge at full, 60 turns to charge at 0/10
|
||||
float chargeGain = 1 / (90f - (chargeCap - charge)*3f);
|
||||
chargeGain *= RingOfEnergy.artifactChargeMultiplier(target);
|
||||
partialCharge += chargeGain;
|
||||
|
||||
if (partialCharge >= 1) {
|
||||
partialCharge --;
|
||||
charge ++;
|
||||
|
||||
if (charge == chargeCap){
|
||||
partialCharge = 0;
|
||||
}
|
||||
}
|
||||
} else if (cursed && Random.Int(10) == 0)
|
||||
((Hero) target).spend( TICK );
|
||||
|
||||
updateQuickslot();
|
||||
|
||||
spend( TICK );
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public class timeStasis extends ArtifactBuff {
|
||||
|
||||
{
|
||||
type = buffType.POSITIVE;
|
||||
actPriority = BUFF_PRIO-3; //acts after all other buffs, so they are prevented
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean attachTo(Char target) {
|
||||
|
||||
if (super.attachTo(target)) {
|
||||
|
||||
Invisibility.dispel();
|
||||
|
||||
int usedCharge = Math.min(charge, 2);
|
||||
//buffs always act last, so the stasis buff should end a turn early.
|
||||
spend(5*usedCharge);
|
||||
|
||||
//shouldn't punish the player for going into stasis frequently
|
||||
Hunger hunger = Buff.affect(target, Hunger.class);
|
||||
if (hunger != null && !hunger.isStarving()) {
|
||||
hunger.satisfy(5 * usedCharge);
|
||||
}
|
||||
|
||||
charge -= usedCharge;
|
||||
|
||||
target.invisible++;
|
||||
target.paralysed++;
|
||||
target.next();
|
||||
|
||||
updateQuickslot();
|
||||
|
||||
if (Dungeon.hero != null) {
|
||||
Dungeon.observe();
|
||||
}
|
||||
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean act() {
|
||||
detach();
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void detach() {
|
||||
if (target.invisible > 0) target.invisible--;
|
||||
if (target.paralysed > 0) target.paralysed--;
|
||||
super.detach();
|
||||
activeBuff = null;
|
||||
Dungeon.observe();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fx(boolean on) {
|
||||
if (on) target.sprite.add( CharSprite.State.INVISIBLE );
|
||||
else if (target.invisible == 0) target.sprite.remove( CharSprite.State.INVISIBLE );
|
||||
}
|
||||
}
|
||||
|
||||
public class timeFreeze extends ArtifactBuff {
|
||||
|
||||
{
|
||||
type = buffType.POSITIVE;
|
||||
}
|
||||
|
||||
float turnsToCost = 0f;
|
||||
|
||||
ArrayList<Integer> presses = new ArrayList<>();
|
||||
|
||||
public void processTime(float time){
|
||||
turnsToCost -= time;
|
||||
|
||||
//use 1/1,000 to account for rounding errors
|
||||
while (turnsToCost < -0.001f){
|
||||
turnsToCost += 2f;
|
||||
charge --;
|
||||
}
|
||||
|
||||
updateQuickslot();
|
||||
|
||||
if (charge < 0){
|
||||
charge = 0;
|
||||
detach();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void setDelayedPress(int cell){
|
||||
if (!presses.contains(cell))
|
||||
presses.add(cell);
|
||||
}
|
||||
|
||||
public void triggerPresses(){
|
||||
for (int cell : presses)
|
||||
Dungeon.level.pressCell(cell);
|
||||
|
||||
presses = new ArrayList<>();
|
||||
}
|
||||
|
||||
public void disarmPressedTraps(){
|
||||
for (int cell : presses){
|
||||
Trap t = Dungeon.level.traps.get(cell);
|
||||
if (t != null && t.disarmedByActivation) t.disarm();
|
||||
}
|
||||
|
||||
presses = new ArrayList<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void detach(){
|
||||
updateQuickslot();
|
||||
super.detach();
|
||||
activeBuff = null;
|
||||
triggerPresses();
|
||||
target.next();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fx(boolean on) {
|
||||
Emitter.freezeEmitters = on;
|
||||
if (on){
|
||||
for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])) {
|
||||
if (mob.sprite != null) mob.sprite.add(CharSprite.State.PARALYSED);
|
||||
}
|
||||
} else {
|
||||
for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])) {
|
||||
if (mob.paralysed <= 0) mob.sprite.remove(CharSprite.State.PARALYSED);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static final String PRESSES = "presses";
|
||||
private static final String TURNSTOCOST = "turnsToCost";
|
||||
|
||||
@Override
|
||||
public void storeInBundle(Bundle bundle) {
|
||||
super.storeInBundle(bundle);
|
||||
|
||||
int[] values = new int[presses.size()];
|
||||
for (int i = 0; i < values.length; i ++)
|
||||
values[i] = presses.get(i);
|
||||
bundle.put( PRESSES , values );
|
||||
|
||||
bundle.put( TURNSTOCOST , turnsToCost);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void restoreFromBundle(Bundle bundle) {
|
||||
super.restoreFromBundle(bundle);
|
||||
|
||||
int[] values = bundle.getIntArray( PRESSES );
|
||||
for (int value : values)
|
||||
presses.add(value);
|
||||
|
||||
turnsToCost = bundle.getFloat( TURNSTOCOST );
|
||||
}
|
||||
}
|
||||
|
||||
public static class sandBag extends Item {
|
||||
|
||||
{
|
||||
image = ItemSpriteSheet.SANDBAG;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean doPickUp(Hero hero, int pos) {
|
||||
GoldIron hourglass = hero.belongings.getItem( GoldIron.class );
|
||||
if (hourglass != null && !hourglass.cursed) {
|
||||
hourglass.upgrade();
|
||||
Sample.INSTANCE.play( Assets.Sounds.DEWDROP );
|
||||
if (hourglass.level() == hourglass.levelCap)
|
||||
GLog.p( Messages.get(this, "maxlevel") );
|
||||
else
|
||||
GLog.i( Messages.get(this, "levelup") );
|
||||
GameScene.pickUp(this, pos);
|
||||
hero.spendAndNext(TIME_TO_PICK_UP);
|
||||
return true;
|
||||
} else {
|
||||
GLog.w( Messages.get(this, "no_hourglass") );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int value() {
|
||||
return 20;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isUpgradable() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIdentified() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -74,7 +74,7 @@ public class Bomb extends Item {
|
|||
public Fuse fuse;
|
||||
|
||||
//FIXME using a static variable for this is kinda gross, should be a better way
|
||||
private static boolean lightingFuse = false;
|
||||
protected static boolean lightingFuse = false;
|
||||
|
||||
private static final String AC_LIGHTTHROW = "LIGHTTHROW";
|
||||
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.items.bombs;
|
||||
|
||||
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.CrossTownProc;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.CrossDiedTower;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
|
||||
public class LaserPython extends Bomb {
|
||||
|
||||
{
|
||||
image = ItemSpriteSheet.LASERPYTHON;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void explode(int cell) {
|
||||
super.explode(cell);
|
||||
CrossDiedTower csp = new CrossDiedTower();
|
||||
csp.pos = cell;
|
||||
GameScene.add(csp);
|
||||
Buff.append(hero, CrossTownProc.class).towerPosLing = cell;
|
||||
|
||||
Sample.INSTANCE.play(Assets.Sounds.BURNING);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean doPickUp(Hero hero, int pos) {
|
||||
GLog.w( Messages.get(this, "didnot_pick") );
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemSprite.Glowing glowing() {
|
||||
return fuse != null ? new ItemSprite.Glowing( 0x268065, 0.6f) : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int value() {
|
||||
//prices of ingredients
|
||||
return quantity * (20 + 30);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
.class public Lcom/shatteredpixel/shatteredpixeldungeon/items/quest/GoldBAo;
|
||||
.super Lcom/shatteredpixel/shatteredpixeldungeon/items/Item;
|
||||
.source "GoldBAo.java"
|
||||
|
||||
|
||||
# direct methods
|
||||
.method public constructor <init>()V
|
||||
.registers 2
|
||||
|
||||
.prologue
|
||||
.line 28
|
||||
invoke-direct {p0}, Lcom/shatteredpixel/shatteredpixeldungeon/items/Item;-><init>()V
|
||||
|
||||
.line 31
|
||||
sget v0, Lcom/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet;->DG21:I
|
||||
|
||||
iput v0, p0, Lcom/shatteredpixel/shatteredpixeldungeon/items/quest/GoldBAo;->image:I
|
||||
|
||||
.line 32
|
||||
return-void
|
||||
.end method
|
||||
|
||||
|
||||
# virtual methods
|
||||
.method public isIdentified()Z
|
||||
.registers 2
|
||||
|
||||
.prologue
|
||||
.line 41
|
||||
const/4 v0, 0x1
|
||||
|
||||
return v0
|
||||
.end method
|
||||
|
||||
.method public isUpgradable()Z
|
||||
.registers 2
|
||||
|
||||
.prologue
|
||||
.line 36
|
||||
const/4 v0, 0x0
|
||||
|
||||
return v0
|
||||
.end method
|
||||
|
||||
.method public value()I
|
||||
.registers 4
|
||||
|
||||
.prologue
|
||||
.line 45
|
||||
iget v0, p0, Lcom/shatteredpixel/shatteredpixeldungeon/items/quest/GoldBAo;->quantity:I
|
||||
|
||||
const/16 v1, 0x9c4
|
||||
|
||||
const/16 v2, 0x157c
|
||||
|
||||
invoke-static {v1, v2}, Lcom/watabou/utils/Random;->Int(II)I
|
||||
|
||||
move-result v1
|
||||
|
||||
mul-int/2addr v0, v1
|
||||
|
||||
return v0
|
||||
.end method
|
|
@ -21,7 +21,8 @@
|
|||
|
||||
package com.shatteredpixel.shatteredpixeldungeon.items.scrolls;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Degrade;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||
|
@ -32,6 +33,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.EndingBlade;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
|
@ -49,7 +51,7 @@ public class ScrollOfRemoveCurse extends InventoryScroll {
|
|||
}
|
||||
|
||||
public static boolean uncursable( Item item ){
|
||||
if (item.isEquipped(Dungeon.hero) && Dungeon.hero.buff(Degrade.class) != null) {
|
||||
if (item.isEquipped(hero) && hero.buff(Degrade.class) != null) {
|
||||
return true;
|
||||
} if ((item instanceof EquipableItem || item instanceof Wand) && ((!item.isIdentified() && !item.cursedKnown) || item.cursed)){
|
||||
return true;
|
||||
|
@ -64,7 +66,12 @@ public class ScrollOfRemoveCurse extends InventoryScroll {
|
|||
|
||||
@Override
|
||||
protected void onItemSelected(Item item) {
|
||||
new Flare( 6, 32 ).show( curUser.sprite, 2f ) ;
|
||||
|
||||
if(item instanceof EndingBlade) {
|
||||
new Flare( 6, 32 ).color( 0xff0000, true ).show( curUser.sprite, 2f );
|
||||
} else {
|
||||
new Flare(6, 32).show(curUser.sprite, 2f);
|
||||
}
|
||||
|
||||
boolean procced = uncurse( curUser, item );
|
||||
|
||||
|
@ -75,6 +82,8 @@ public class ScrollOfRemoveCurse extends InventoryScroll {
|
|||
|
||||
if (procced) {
|
||||
GLog.p( Messages.get(this, "cleansed") );
|
||||
} else if(item instanceof EndingBlade) {
|
||||
GLog.n(Messages.get(ScrollOfRemoveCurse.class, "strmagic"));
|
||||
} else {
|
||||
GLog.i( Messages.get(this, "not_cleansed") );
|
||||
}
|
||||
|
@ -86,9 +95,13 @@ public class ScrollOfRemoveCurse extends InventoryScroll {
|
|||
for (Item item : items) {
|
||||
if (item != null) {
|
||||
item.cursedKnown = true;
|
||||
if (item.cursed) {
|
||||
procced = true;
|
||||
item.cursed = false;
|
||||
if (item instanceof EndingBlade) {
|
||||
item.cursed = true;
|
||||
} else {
|
||||
if (item.cursed) {
|
||||
procced = true;
|
||||
item.cursed = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (item instanceof Weapon){
|
||||
|
|
|
@ -1,54 +1,185 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Badges;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.bombs.LaserPython;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Grim;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
import com.watabou.utils.Random;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
import com.watabou.utils.Bundle;
|
||||
|
||||
public class EndingBlade extends MeleeWeapon{
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class EndingBlade extends Weapon {
|
||||
{
|
||||
image = ItemSpriteSheet.ENDDIED;
|
||||
tier = 4;
|
||||
DLY = 2f;
|
||||
cursed = true;
|
||||
}
|
||||
|
||||
//三大基础静态固定字节
|
||||
public static final String AC_LASERCRYSTAL = "lastcrystal";
|
||||
public static final String AC_DIEDGHOST = "diedghost";
|
||||
public static final String AC_HEALRESET = "healreset";
|
||||
|
||||
@Override
|
||||
public ArrayList<String> actions(Hero hero ) {
|
||||
ArrayList<String> actions = super.actions( hero );
|
||||
if(isEquipped( hero )) {
|
||||
//激光晶柱
|
||||
actions.add(AC_LASERCRYSTAL);
|
||||
//亡灵宣告
|
||||
actions.add(AC_DIEDGHOST);
|
||||
//再生之力
|
||||
actions.add(AC_HEALRESET);
|
||||
|
||||
}
|
||||
return actions;
|
||||
}
|
||||
|
||||
public int fireenergy;
|
||||
|
||||
private boolean firstx=true;
|
||||
|
||||
private static final String FIRST = "first";
|
||||
|
||||
@Override
|
||||
public void storeInBundle(Bundle bundle) {
|
||||
super.storeInBundle(bundle);
|
||||
bundle.put(FIRST, firstx);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void restoreFromBundle(Bundle bundle) {
|
||||
super.restoreFromBundle(bundle);
|
||||
firstx = bundle.getBoolean(FIRST);
|
||||
}
|
||||
|
||||
public String desc() {
|
||||
return Messages.get(this, "desc")+"\n\n"+fireenergy;
|
||||
}
|
||||
|
||||
//每100点浊焰能量自动升级
|
||||
@Override
|
||||
public int level() {
|
||||
return fireenergy/100;
|
||||
}
|
||||
|
||||
public void execute( Hero hero, String action ) {
|
||||
super.execute( hero, action );
|
||||
|
||||
switch (action) {
|
||||
case AC_LASERCRYSTAL:
|
||||
if(level >= 4 && firstx){
|
||||
firstx = false;
|
||||
new LaserPython().quantity(1).identify().collect();
|
||||
GLog.n("你突然感觉你的背包鼓鼓的……");
|
||||
} else if(!firstx) {
|
||||
GLog.n("你尚未使用激光晶柱,无法继续使用");
|
||||
} else {
|
||||
GLog.n("等级不足");
|
||||
}
|
||||
break;
|
||||
case AC_DIEDGHOST:
|
||||
GLog.p("2");
|
||||
break;
|
||||
case AC_HEALRESET:
|
||||
GLog.w("3");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public int STRReq(int C) {
|
||||
return 25;
|
||||
}//力量需求
|
||||
|
||||
public int proc(Weapon weapon, Char attacker, Char defender, int damage ) {
|
||||
|
||||
int enemyHealth = defender.HP - damage;
|
||||
if (enemyHealth <= 0) return damage;
|
||||
|
||||
float maxChance = 0.5f;
|
||||
float chance = maxChance;
|
||||
|
||||
if (Random.Float() < chance) {
|
||||
|
||||
defender.damage( defender.HP, this );
|
||||
defender.sprite.emitter().burst( ShadowParticle.UP, 5 );
|
||||
|
||||
if (!defender.isAlive() && attacker instanceof Hero
|
||||
//this prevents unstable from triggering grim achievement
|
||||
&& weapon.hasEnchant(Grim.class, attacker)) {
|
||||
Badges.validateGrimWeapon();
|
||||
}
|
||||
return 15+level;
|
||||
}
|
||||
|
||||
public int proc(Char attacker, Char defender, int damage ) {
|
||||
//常规加+1浊焰能量
|
||||
++this.fireenergy;
|
||||
if(level >= 10){
|
||||
fireenergy += 0;
|
||||
//武器最高级
|
||||
} else if(defender.properties().contains(Char.Property.BOSS) && defender.HP <= damage){
|
||||
//目标Boss血量小于实际伤害判定为死亡,+20浊焰能量
|
||||
this.fireenergy+=20;
|
||||
} else if(defender.properties().contains(Char.Property.MINIBOSS) && defender.HP <= damage){
|
||||
//目标迷你Boss血量小于实际伤害判定为死亡,+10浊焰能量
|
||||
this.fireenergy+=10;
|
||||
} else if (defender.HP <= damage){
|
||||
//目标血量小于实际伤害判定为死亡,+5浊焰能量
|
||||
this.fireenergy+=5;
|
||||
}
|
||||
|
||||
return damage;
|
||||
return super.proc(attacker, defender, damage);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String statsInfo(){
|
||||
return Messages.get(EndingBlade.class,"stats_desc");
|
||||
}//添加新文本
|
||||
public boolean isUpgradable() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public int tier;
|
||||
|
||||
@Override
|
||||
public String info() {
|
||||
|
||||
String info = desc();
|
||||
|
||||
if (levelKnown) {
|
||||
info += "\n\n" + Messages.get(MeleeWeapon.class, "stats_known", tier, augment.damageFactor(min()), augment.damageFactor(max()), STRReq());
|
||||
if (STRReq() > Dungeon.hero.STR()) {
|
||||
info += " " + Messages.get(Weapon.class, "too_heavy");
|
||||
} else if (Dungeon.hero.STR() > STRReq()){
|
||||
info += " " + Messages.get(Weapon.class, "excess_str", Dungeon.hero.STR() - STRReq());
|
||||
}
|
||||
} else {
|
||||
info += "\n\n" + Messages.get(MeleeWeapon.class, "stats_unknown", tier, min(0), max(0), STRReq(0));
|
||||
if (STRReq(0) > Dungeon.hero.STR()) {
|
||||
info += " " + Messages.get(MeleeWeapon.class, "probably_too_heavy");
|
||||
}
|
||||
}
|
||||
|
||||
switch (augment) {
|
||||
case SPEED:
|
||||
info += " " + Messages.get(Weapon.class, "faster");
|
||||
break;
|
||||
case DAMAGE:
|
||||
info += " " + Messages.get(Weapon.class, "stronger");
|
||||
break;
|
||||
case NONE:
|
||||
}
|
||||
|
||||
if (enchantment != null && (cursedKnown || !enchantment.curse())){
|
||||
info += "\n\n" + Messages.get(Weapon.class, "enchanted", enchantment.name());
|
||||
info += " " + Messages.get(enchantment, "desc");
|
||||
}
|
||||
|
||||
if (cursed && isEquipped( Dungeon.hero )) {
|
||||
info += "\n\n" + Messages.get(Weapon.class, "cursed_worn");
|
||||
} else if (cursedKnown && cursed) {
|
||||
info += "\n\n" + Messages.get(Weapon.class, "cursed");
|
||||
} else if (!isIdentified() && cursedKnown){
|
||||
info += "\n\n" + Messages.get(Weapon.class, "not_cursed");
|
||||
}
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int min(int lvl) {
|
||||
return 10;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int max(int lvl) {
|
||||
return 15;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,7 +13,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.RandomBuff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Unstable;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
import com.watabou.utils.Bundle;
|
||||
|
||||
public class LockSword extends MeleeWeapon {
|
||||
|
@ -34,7 +33,7 @@ public class LockSword extends MeleeWeapon {
|
|||
|
||||
public int image() {
|
||||
if (this.level() == 3 && Dungeon.hero.buff(RandomBuff.class) != null){
|
||||
GLog.n("谢谢你为我升级……");
|
||||
//GLog.n("谢谢你为我升级……");
|
||||
for (Buff buff : hero.buffs()) {
|
||||
if (buff instanceof RandomBuff) {
|
||||
buff.detach();
|
||||
|
|
|
@ -8,6 +8,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.CrystalDiedTower;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.FireMagicDied;
|
||||
|
@ -273,11 +274,19 @@ public class ShopBossLevel extends Level {
|
|||
}
|
||||
|
||||
public String tilesTex() {
|
||||
return Assets.Environment.TILES_COLD;
|
||||
if (Dungeon.hero.buff(LockedFloor.class)!=null) {
|
||||
return Assets.Environment.TILES_DIED;
|
||||
} else {
|
||||
return Assets.Environment.TILES_COLD;
|
||||
}
|
||||
}
|
||||
|
||||
public String waterTex() {
|
||||
return Assets.Environment.WATER_COLD;
|
||||
if (Dungeon.hero.buff(LockedFloor.class)!=null) {
|
||||
return Assets.Environment.WATER_HALLS;
|
||||
} else {
|
||||
return Assets.Environment.WATER_COLD;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -27,8 +27,10 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bleeding;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.CrossTownProc;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.CrossDiedTower;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.spells.FeatherFall;
|
||||
|
@ -70,6 +72,16 @@ public class Chasm implements Hero.Doom {
|
|||
if (index == 0) {
|
||||
if (Dungeon.hero.pos == heroPos) {
|
||||
jumpConfirmed = true;
|
||||
for (Buff buff : hero.buffs()) {
|
||||
if (buff instanceof CrossTownProc) {
|
||||
buff.detach();
|
||||
}
|
||||
}
|
||||
for (Mob mob : (Iterable<Mob>)Dungeon.level.mobs.clone()) {
|
||||
if (mob instanceof CrossDiedTower) {
|
||||
mob.die( true );
|
||||
}
|
||||
}
|
||||
hero.resume();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -182,7 +182,7 @@ public class InterlevelScene extends PixelScene {
|
|||
fadeTime += 0.9f; //adds 1 second total
|
||||
//speed up transition when debugging
|
||||
} else if (DeviceCompat.isDebug()){
|
||||
fadeTime = 0.9f;
|
||||
fadeTime = 0.1f;
|
||||
}
|
||||
|
||||
SkinnedBlock bg = new SkinnedBlock(Camera.main.width, Camera.main.height, loadingAsset ){
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.sprites;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.watabou.noosa.TextureFilm;
|
||||
|
||||
public class CrossDiedSprites extends MobSprite {
|
||||
|
||||
public CrossDiedSprites() {
|
||||
super();
|
||||
|
||||
texture(Assets.Sprites.DIED);
|
||||
|
||||
TextureFilm frames = new TextureFilm(texture, 16, 16);
|
||||
|
||||
idle = new Animation(2, true);
|
||||
idle.frames(frames, 0, 0, 0, 0);
|
||||
|
||||
run = new Animation(10, true);
|
||||
run.frames(frames, 0, 0, 0, 0);
|
||||
|
||||
attack = new Animation(15, false);
|
||||
attack.frames(frames, 0, 0, 0, 0);
|
||||
|
||||
die = new Animation(10, false);
|
||||
die.frames(frames, 0, 0, 0, 0);
|
||||
|
||||
play(idle);
|
||||
}
|
||||
}
|
|
@ -433,6 +433,7 @@ public class ItemSpriteSheet {
|
|||
public static final int ARTIFACT_ROSE1 = ARTIFACTS+20;
|
||||
public static final int ARTIFACT_ROSE2 = ARTIFACTS+21;
|
||||
public static final int ARTIFACT_ROSE3 = ARTIFACTS+22;
|
||||
public static final int Gold_Iron = ARTIFACTS+23;
|
||||
static{
|
||||
assignItemRect(ARTIFACT_CLOAK, 9, 15);
|
||||
assignItemRect(ARTIFACT_ARMBAND, 16, 13);
|
||||
|
@ -457,6 +458,7 @@ public class ItemSpriteSheet {
|
|||
assignItemRect(ARTIFACT_ROSE1, 14, 14);
|
||||
assignItemRect(ARTIFACT_ROSE2, 14, 14);
|
||||
assignItemRect(ARTIFACT_ROSE3, 14, 14);
|
||||
assignItemRect(Gold_Iron, 16, 16);
|
||||
}
|
||||
|
||||
//16 free slots
|
||||
|
@ -768,6 +770,7 @@ public class ItemSpriteSheet {
|
|||
public static final int NOKING= MAINBOOKINDEX+7;
|
||||
public static final int FIRELIYD= MAINBOOKINDEX+8;
|
||||
public static final int FBK= MAINBOOKINDEX+9;
|
||||
public static final int LASERPYTHON= MAINBOOKINDEX+10;
|
||||
|
||||
private static final int MAINPALYBOOKS = xy(1, 40);
|
||||
public static final int MONEYBOOKS= MAINPALYBOOKS+1;
|
||||
|
|
|
@ -129,7 +129,7 @@ public class RenderedTextBlock extends Component {
|
|||
Θ = 蓝色
|
||||
Ξ = 粉色
|
||||
Π = 紫色
|
||||
Σ = 黑色
|
||||
✦ = 黑色
|
||||
_ = 青色 */
|
||||
|
||||
if (str.equals("_") && highlightingEnabled){
|
||||
|
|
|
@ -267,6 +267,9 @@ public class StatusPane extends Component {
|
|||
|
||||
//buffs.setPos( x + 31, y );
|
||||
|
||||
//下半段
|
||||
puresoul.visible = false;
|
||||
|
||||
busy.x = x + bg.width + 1;
|
||||
busy.y = y + bg.height - 9;
|
||||
} else {
|
||||
|
|
Loading…
Reference in New Issue
Block a user