Update Beta21-p1
This commit is contained in:
parent
41dacc5d3d
commit
32f380c522
|
@ -17,7 +17,7 @@ allprojects {
|
||||||
appPackageName = 'com.ansdomagiclingpixeldungeon.ling'
|
appPackageName = 'com.ansdomagiclingpixeldungeon.ling'
|
||||||
|
|
||||||
appVersionCode =700720
|
appVersionCode =700720
|
||||||
appVersionName = '0.6.0.0-Beta20.75'
|
appVersionName = '0.6.0.0-Beta21-p1'
|
||||||
|
|
||||||
appJavaCompatibility = JavaVersion.VERSION_1_8
|
appJavaCompatibility = JavaVersion.VERSION_1_8
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
###MLPD
|
###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.name=浊焰魔女
|
||||||
actors.mobs.bosses.firemagicdied.desc=曾经是翼绫的护法之一,因为大火事件被地表三巨头怀疑,逃亡到了雪凛峡谷……\n\n被当时的商人领主给收养,现在,她是雪凛峡谷的守护之神……
|
actors.mobs.bosses.firemagicdied.desc=曾经是翼绫的护法之一,因为大火事件被地表三巨头怀疑,逃亡到了雪凛峡谷……\n\n被当时的商人领主给收养,现在,她是雪凛峡谷的守护之神……
|
||||||
actors.mobs.bosses.firemagicdied.go=%s,吾乃浊焰的化身,你必将受到正义的审判……
|
actors.mobs.bosses.firemagicdied.go=%s,吾乃浊焰的化身,你必将受到正义的审判……
|
||||||
|
|
|
@ -1,4 +1,15 @@
|
||||||
###MLPD
|
###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.name=暗金宝石护符
|
||||||
items.artifacts.wraithamulet.desc=来自于异世界的产物,能使自己进入虚无化。当护符能量足够多的时候,你还可以对敌人实行一次暗夜袭击,护符能量将会随着时间自动恢复。\n\n这个护符是证明给强者之人用的,冰雪魔女已经输的心服口服,现在她将此护身符给予给你。
|
items.artifacts.wraithamulet.desc=来自于异世界的产物,能使自己进入虚无化。当护符能量足够多的时候,你还可以对敌人实行一次暗夜袭击,护符能量将会随着时间自动恢复。\n\n这个护符是证明给强者之人用的,冰雪魔女已经输的心服口服,现在她将此护身符给予给你。
|
||||||
items.artifacts.wraithamulet.ac_ghost=遁入虚无
|
items.artifacts.wraithamulet.ac_ghost=遁入虚无
|
||||||
|
@ -84,6 +95,8 @@ items.quest.skeletongold.wow=染血金币发出诡异的光芒,你感到下层
|
||||||
|
|
||||||
items.weapon.melee.endingblade.name=终焉
|
items.weapon.melee.endingblade.name=终焉
|
||||||
items.weapon.melee.endingblade.desc=不知道从哪来的一个拆开的场记板,貌似沾染了焰之诅咒,有着强大的侵蚀能力。\n\n这个武器在攻击敌人的时候有概率造成_即死_效果,在汲取一定魔力后会产生新的能力。
|
items.weapon.melee.endingblade.desc=不知道从哪来的一个拆开的场记板,貌似沾染了焰之诅咒,有着强大的侵蚀能力。\n\n这个武器在攻击敌人的时候有概率造成_即死_效果,在汲取一定魔力后会产生新的能力。
|
||||||
|
items.weapon.melee.endingblade.cursed=当你装备上这个武器后,一股无形的力量将你束缚住……
|
||||||
|
items.weapon.melee.endingblade.donot_eqip=终焉的诅咒已经浸染你的身体,你无力脱下它。
|
||||||
|
|
||||||
#MLPDSTOREYBOOKS
|
#MLPDSTOREYBOOKS
|
||||||
|
|
||||||
|
@ -1245,6 +1258,8 @@ items.scrolls.scrollofremovecurse.inv_title=选择一件要净化的物品
|
||||||
items.scrolls.scrollofremovecurse.cleansed=你的道具闪耀着净化的光芒,一股恶毒的能量从中消散。
|
items.scrolls.scrollofremovecurse.cleansed=你的道具闪耀着净化的光芒,一股恶毒的能量从中消散。
|
||||||
items.scrolls.scrollofremovecurse.not_cleansed=你的道具闪耀着净化的光芒,不过什么也没发生。
|
items.scrolls.scrollofremovecurse.not_cleansed=你的道具闪耀着净化的光芒,不过什么也没发生。
|
||||||
items.scrolls.scrollofremovecurse.desc=卷轴上的咒语能够瞬间清除指定的一件武器、护甲、法杖、戒指或神器上的诅咒。
|
items.scrolls.scrollofremovecurse.desc=卷轴上的咒语能够瞬间清除指定的一件武器、护甲、法杖、戒指或神器上的诅咒。
|
||||||
|
items.scrolls.scrollofremovecurse.=卷轴上的咒语能够瞬间清除指定的一件武器、护甲、法杖、戒指或神器上的诅咒。
|
||||||
|
items.scrolls.scrollofremovecurse.strmagic=你的终焉散发出血红的光束,你的净化卷轴灰飞烟灭了……
|
||||||
|
|
||||||
items.scrolls.scrollofteleportation.name=传送卷轴
|
items.scrolls.scrollofteleportation.name=传送卷轴
|
||||||
items.scrolls.scrollofteleportation.tele=眨眼之间你就被传送到本层的另外一个位置。
|
items.scrolls.scrollofteleportation.tele=眨眼之间你就被传送到本层的另外一个位置。
|
||||||
|
@ -1970,6 +1985,7 @@ items.weapon.weapon.identify=你对手中的武器已经足够熟悉并将其完
|
||||||
items.weapon.weapon.too_heavy=因为你的力量不足,该武器会降低你的攻速和精准,并让你无法偷袭。
|
items.weapon.weapon.too_heavy=因为你的力量不足,该武器会降低你的攻速和精准,并让你无法偷袭。
|
||||||
items.weapon.weapon.excess_str=你的额外力量让你在使用这件武器时最多能够造成_%d点额外伤害_。
|
items.weapon.weapon.excess_str=你的额外力量让你在使用这件武器时最多能够造成_%d点额外伤害_。
|
||||||
items.weapon.weapon.incompatible=不同属性的魔法相冲突,消除了武器上的附魔!
|
items.weapon.weapon.incompatible=不同属性的魔法相冲突,消除了武器上的附魔!
|
||||||
|
items.weapon.weapon.nxt_cursed=净化的光芒闪过,但终焉上面的诅咒仍然没有被解除……
|
||||||
items.weapon.weapon.cursed_worn=由于这件武器被诅咒,你无法将其放下。
|
items.weapon.weapon.cursed_worn=由于这件武器被诅咒,你无法将其放下。
|
||||||
items.weapon.weapon.cursed=你能感觉到这件武器里潜伏着一股充满恶意的魔力。
|
items.weapon.weapon.cursed=你能感觉到这件武器里潜伏着一股充满恶意的魔力。
|
||||||
items.weapon.weapon.not_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";
|
public static final String KEEPERKING = "sprites/npc/ShopKing.png";
|
||||||
|
|
||||||
//BOSS
|
//BOSS
|
||||||
|
public static final String DIED = "sprites/items/died.png";
|
||||||
|
|
||||||
public static final String CRID = "sprites/boss/ColdGuard.png";
|
public static final String CRID = "sprites/boss/ColdGuard.png";
|
||||||
|
|
||||||
public static final String FRAS = "sprites/boss/FireMagicGirl.png";
|
public static final String FRAS = "sprites/boss/FireMagicGirl.png";
|
||||||
public static final String NECROREDEX = "sprites/boss/rednecromancer_ex.png";
|
public static final String NECROREDEX = "sprites/boss/rednecromancer_ex.png";
|
||||||
public static final String SLIMEPRINCESS = "sprites/boss/SlimePrincess.png";
|
public static final String SLIMEPRINCESS = "sprites/boss/SlimePrincess.png";
|
||||||
|
|
|
@ -71,13 +71,13 @@ public class Challenges {
|
||||||
"sbsg",
|
"sbsg",
|
||||||
"exsg",
|
"exsg",
|
||||||
"stronger_bosses",
|
"stronger_bosses",
|
||||||
"light&black",
|
//"light&black",
|
||||||
"pro",
|
"pro",
|
||||||
};
|
};
|
||||||
|
|
||||||
public static final int[] MASKS = {
|
public static final int[] MASKS = {
|
||||||
NO_FOOD, NO_ARMOR, NO_HEALING, NO_HERBALISM, SWARM_INTELLIGENCE, DARKNESS, NO_SCROLLS
|
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;
|
public String name;
|
||||||
|
|
||||||
|
|
|
@ -387,7 +387,7 @@ public class Dungeon {
|
||||||
if (Dungeon.isChallenged(RLPT)) {
|
if (Dungeon.isChallenged(RLPT)) {
|
||||||
switch (depth) {
|
switch (depth) {
|
||||||
case 0:
|
case 0:
|
||||||
level = new ShopBossLevel();
|
level = new ZeroLevel();
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
case 2:
|
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.HerbBag;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.bags.KingBag;
|
import com.shatteredpixel.shatteredpixeldungeon.items.bags.KingBag;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.bags.VelvetPouch;
|
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.BrokenBooks;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.DeepBloodBooks;
|
import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.DeepBloodBooks;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.GrassKingBooks;
|
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.lightblack.OilPotion;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.AlchemicalCatalyst;
|
import com.shatteredpixel.shatteredpixeldungeon.items.potions.AlchemicalCatalyst;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfExperience;
|
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.PotionOfHealing;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfInvisibility;
|
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfInvisibility;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLightningShiledX;
|
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.ScrollOfLullaby;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMapping;
|
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMapping;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRage;
|
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.ScrollOfTerror;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTransmutation;
|
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTransmutation;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade;
|
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade;
|
||||||
|
@ -177,9 +178,10 @@ public enum HeroClass {
|
||||||
if (Dungeon.isChallenged(Challenges.PRO)){
|
if (Dungeon.isChallenged(Challenges.PRO)){
|
||||||
new FrozenCarpaccio().quantity(11).identify().collect();
|
new FrozenCarpaccio().quantity(11).identify().collect();
|
||||||
new FireFishSword().quantity(1).identify().collect();
|
new FireFishSword().quantity(1).identify().collect();
|
||||||
|
new LaserPython().quantity(100).identify().collect();
|
||||||
new PotionOfInvisibility().quantity(45).identify().collect();
|
new PotionOfInvisibility().quantity(45).identify().collect();
|
||||||
new PotionOfPurity().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 AlchemicalCatalyst().quantity(45).identify().collect();
|
||||||
new EtherealChains().quantity(1).identify().collect();
|
new EtherealChains().quantity(1).identify().collect();
|
||||||
new ScrollOfIdentify().quantity(45).identify().collect();
|
new ScrollOfIdentify().quantity(45).identify().collect();
|
||||||
|
@ -238,7 +240,7 @@ public enum HeroClass {
|
||||||
new FireFishSword().quantity(1).identify().collect();
|
new FireFishSword().quantity(1).identify().collect();
|
||||||
new EndingBlade().quantity(1).identify().collect();
|
new EndingBlade().quantity(1).identify().collect();
|
||||||
new PotionOfDragonKingBreath().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 WandOfBlueFuck().quantity(1).identify().collect();
|
||||||
new ScrollOfFlameCursed().quantity(10).identify().collect();
|
new ScrollOfFlameCursed().quantity(10).identify().collect();
|
||||||
new PotionOfLightningShiled().quantity(42).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.Assets;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.Badges;
|
import com.shatteredpixel.shatteredpixeldungeon.Badges;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Amok;
|
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.LockedFloor;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ShopLimitLock;
|
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.BlackHost;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ColdGurad;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ColdGurad;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.DM100;
|
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.Mob;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Monk;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Monk;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.SRPDICLRPRO;
|
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.MagicMissile;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
|
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
|
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.ElmoParticle;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.EnergyParticle;
|
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.EnergyParticle;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.PurpleParticle;
|
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.ui.BossHealthBar;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||||
import com.watabou.noosa.Camera;
|
import com.watabou.noosa.Camera;
|
||||||
|
import com.watabou.noosa.Game;
|
||||||
import com.watabou.noosa.audio.Music;
|
import com.watabou.noosa.audio.Music;
|
||||||
import com.watabou.noosa.audio.Sample;
|
import com.watabou.noosa.audio.Sample;
|
||||||
import com.watabou.noosa.particles.Emitter;
|
import com.watabou.noosa.particles.Emitter;
|
||||||
|
@ -217,6 +222,12 @@ public class FireMagicDied extends Mob implements Callback {
|
||||||
private int beamCD = 23;
|
private int beamCD = 23;
|
||||||
private float summonCooldown = 0;
|
private float summonCooldown = 0;
|
||||||
private float abilityCooldown = 6;
|
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 MIN_COOLDOWN = 7;
|
||||||
private static final int MAX_COOLDOWN = 11;
|
private static final int MAX_COOLDOWN = 11;
|
||||||
private int summonsMade = 0;
|
private int summonsMade = 0;
|
||||||
|
@ -345,7 +356,22 @@ public class FireMagicDied extends Mob implements Callback {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean act() {
|
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)){
|
if (summonCooldown <= 0 && summonSubject(3)){
|
||||||
summonsMade++;
|
summonsMade++;
|
||||||
|
@ -411,9 +437,9 @@ public class FireMagicDied extends Mob implements Callback {
|
||||||
abilityCooldown--;
|
abilityCooldown--;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (phase == 2){
|
} else if (phase == 3){
|
||||||
if (summonSubject(2)) summonsMade++;
|
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();
|
actPhaseTwoSummon();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -437,40 +463,39 @@ public class FireMagicDied extends Mob implements Callback {
|
||||||
return super.act();
|
return super.act();
|
||||||
}
|
}
|
||||||
private static final String PHASE = "phase";
|
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 static final String SUMMONS_MADE = "summons_made";
|
||||||
private int wave=0;
|
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
|
@Override
|
||||||
public void storeInBundle(Bundle bundle) {
|
public void storeInBundle(Bundle bundle) {
|
||||||
super.storeInBundle(bundle);
|
super.storeInBundle(bundle);
|
||||||
bundle.put( PHASE, phase );
|
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);
|
|
||||||
|
|
||||||
//if check is for pre-0.9.3 saves
|
bundle.put(ABILITY_CD, abilityCooldown);
|
||||||
healInc = bundle.getInt(HEALINC);
|
bundle.put(SUMMON_CD, summonCooldown);
|
||||||
bundle.put( PUMPEDUP , pumpedUp );
|
|
||||||
bundle.put( HEALINC, healInc );
|
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
|
@Override
|
||||||
public void restoreFromBundle(Bundle bundle) {
|
public void restoreFromBundle(Bundle bundle) {
|
||||||
super.restoreFromBundle(bundle);
|
super.restoreFromBundle(bundle);
|
||||||
phase = bundle.getInt( PHASE );
|
phase = bundle.getInt(PHASE);
|
||||||
summonsMade = bundle.getInt( SUMMONS_MADE );
|
if (phase != 0) BossHealthBar.assignBoss(this);
|
||||||
summonCooldown = bundle.getFloat( SUMMON_CD );
|
|
||||||
abilityCooldown = bundle.getFloat( ABILITY_CD );
|
abilityCooldown = bundle.getFloat(ABILITY_CD);
|
||||||
lastAbility = bundle.getInt( LAST_ABILITY );
|
summonCooldown = bundle.getFloat(SUMMON_CD);
|
||||||
wave = bundle.getInt("wavePhase2");
|
|
||||||
|
for (int i : bundle.getIntArray(TARGETED_CELLS)){
|
||||||
|
targetedCells.add(i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -677,6 +702,7 @@ public class FireMagicDied extends Mob implements Callback {
|
||||||
}
|
}
|
||||||
//properties.add(Property.IMMOVABLE);
|
//properties.add(Property.IMMOVABLE);
|
||||||
ScrollOfTeleportation.appear(this, ShopBossLevel.throneling);
|
ScrollOfTeleportation.appear(this, ShopBossLevel.throneling);
|
||||||
|
doYogLasers();
|
||||||
sprite.centerEmitter().start( Speck.factory( Speck.SCREAM ), 0.4f, 2 );
|
sprite.centerEmitter().start( Speck.factory( Speck.SCREAM ), 0.4f, 2 );
|
||||||
Sample.INSTANCE.play( Assets.Sounds.CHALLENGE );
|
Sample.INSTANCE.play( Assets.Sounds.CHALLENGE );
|
||||||
phase = 2;
|
phase = 2;
|
||||||
|
@ -715,7 +741,8 @@ public class FireMagicDied extends Mob implements Callback {
|
||||||
beamCD = 40 + 8 - (phase == 10 ? 38 : 0);
|
beamCD = 40 + 8 - (phase == 10 ? 38 : 0);
|
||||||
sprite.showStatus(0xff0000, Messages.get(this, "dead"));
|
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") );
|
yell( Messages.get(this, "losing") );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -766,6 +793,7 @@ public class FireMagicDied extends Mob implements Callback {
|
||||||
public void notice() {
|
public void notice() {
|
||||||
super.notice();
|
super.notice();
|
||||||
BossHealthBar.assignBoss(this);
|
BossHealthBar.assignBoss(this);
|
||||||
|
ShatteredPixelDungeon.seamlessResetScene();
|
||||||
Music.INSTANCE.play(Assets.BGM_FRBOSS, true);
|
Music.INSTANCE.play(Assets.BGM_FRBOSS, true);
|
||||||
yell( Messages.get(this, "notice") );
|
yell( Messages.get(this, "notice") );
|
||||||
//summon();
|
//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
|
@Override
|
||||||
public void move(int step) {
|
public void move(int step) {
|
||||||
|
|
||||||
|
@ -1237,11 +1331,11 @@ public class FireMagicDied extends Mob implements Callback {
|
||||||
public void detach() {
|
public void detach() {
|
||||||
super.detach();
|
super.detach();
|
||||||
for (Mob m : Dungeon.level.mobs.toArray(new Mob[0])){
|
for (Mob m : Dungeon.level.mobs.toArray(new Mob[0])){
|
||||||
if (m instanceof FireMagicDied ){
|
if (m instanceof FireMagicDied ){
|
||||||
m.damage(10, this);
|
m.damage(10, this);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ public class NullDied extends NTNPC {
|
||||||
public void flee() {
|
public void flee() {
|
||||||
destroy();
|
destroy();
|
||||||
Dungeon.level.seal();
|
Dungeon.level.seal();
|
||||||
GameScene.flash(0x8000FFFF);
|
GameScene.flash(0x80FF0000);
|
||||||
sprite.killAndErase();
|
sprite.killAndErase();
|
||||||
CellEmitter.get( pos ).burst(SnowParticle.FACTORY, 6 );
|
CellEmitter.get( pos ).burst(SnowParticle.FACTORY, 6 );
|
||||||
CellEmitter.get( pos ).burst(EnergyParticle.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.Assets;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
|
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.EnergyParticle;
|
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.EnergyParticle;
|
||||||
|
|
|
@ -146,7 +146,7 @@ public class CloakOfShadows extends Artifact {
|
||||||
BloodBat bat = new BloodBat();
|
BloodBat bat = new BloodBat();
|
||||||
bat.pos = respawnPoints.get(Random.index( respawnPoints ));
|
bat.pos = respawnPoints.get(Random.index( respawnPoints ));
|
||||||
bat.HP = bat.HT = 18 + BloodBat.level * 2;
|
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;
|
bat.state = bat.WANDERING;
|
||||||
GameScene.add(bat);
|
GameScene.add(bat);
|
||||||
bat.sprite.emitter().burst(Speck.factory(Speck.STAR), 10);
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -61,7 +61,7 @@ import java.util.HashMap;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
|
||||||
public class Bomb extends Item {
|
public class Bomb extends Item {
|
||||||
|
|
||||||
{
|
{
|
||||||
image = ItemSpriteSheet.BOMB;
|
image = ItemSpriteSheet.BOMB;
|
||||||
|
|
||||||
|
@ -74,7 +74,7 @@ public class Bomb extends Item {
|
||||||
public Fuse fuse;
|
public Fuse fuse;
|
||||||
|
|
||||||
//FIXME using a static variable for this is kinda gross, should be a better way
|
//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";
|
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;
|
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.buffs.Degrade;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
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.armor.Armor;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
|
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
|
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.messages.Messages;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||||
|
@ -49,7 +51,7 @@ public class ScrollOfRemoveCurse extends InventoryScroll {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean uncursable( Item item ){
|
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;
|
return true;
|
||||||
} if ((item instanceof EquipableItem || item instanceof Wand) && ((!item.isIdentified() && !item.cursedKnown) || item.cursed)){
|
} if ((item instanceof EquipableItem || item instanceof Wand) && ((!item.isIdentified() && !item.cursedKnown) || item.cursed)){
|
||||||
return true;
|
return true;
|
||||||
|
@ -64,7 +66,12 @@ public class ScrollOfRemoveCurse extends InventoryScroll {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onItemSelected(Item item) {
|
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 );
|
boolean procced = uncurse( curUser, item );
|
||||||
|
|
||||||
|
@ -75,6 +82,8 @@ public class ScrollOfRemoveCurse extends InventoryScroll {
|
||||||
|
|
||||||
if (procced) {
|
if (procced) {
|
||||||
GLog.p( Messages.get(this, "cleansed") );
|
GLog.p( Messages.get(this, "cleansed") );
|
||||||
|
} else if(item instanceof EndingBlade) {
|
||||||
|
GLog.n(Messages.get(ScrollOfRemoveCurse.class, "strmagic"));
|
||||||
} else {
|
} else {
|
||||||
GLog.i( Messages.get(this, "not_cleansed") );
|
GLog.i( Messages.get(this, "not_cleansed") );
|
||||||
}
|
}
|
||||||
|
@ -86,9 +95,13 @@ public class ScrollOfRemoveCurse extends InventoryScroll {
|
||||||
for (Item item : items) {
|
for (Item item : items) {
|
||||||
if (item != null) {
|
if (item != null) {
|
||||||
item.cursedKnown = true;
|
item.cursedKnown = true;
|
||||||
if (item.cursed) {
|
if (item instanceof EndingBlade) {
|
||||||
procced = true;
|
item.cursed = true;
|
||||||
item.cursed = false;
|
} else {
|
||||||
|
if (item.cursed) {
|
||||||
|
procced = true;
|
||||||
|
item.cursed = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (item instanceof Weapon){
|
if (item instanceof Weapon){
|
||||||
|
@ -109,7 +122,7 @@ public class ScrollOfRemoveCurse extends InventoryScroll {
|
||||||
((Wand) item).updateLevel();
|
((Wand) item).updateLevel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (procced && hero != null) {
|
if (procced && hero != null) {
|
||||||
hero.sprite.emitter().start( ShadowParticle.UP, 0.05f, 10 );
|
hero.sprite.emitter().start( ShadowParticle.UP, 0.05f, 10 );
|
||||||
hero.updateHT( false ); //for ring of might
|
hero.updateHT( false ); //for ring of might
|
||||||
|
|
|
@ -1,54 +1,185 @@
|
||||||
package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee;
|
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.Char;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
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.Weapon;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Grim;
|
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
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;
|
image = ItemSpriteSheet.ENDDIED;
|
||||||
tier = 4;
|
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
|
@Override
|
||||||
public int STRReq(int C) {
|
public int STRReq(int C) {
|
||||||
return 25;
|
return 15+level;
|
||||||
}//力量需求
|
}
|
||||||
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
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
|
@Override
|
||||||
public String statsInfo(){
|
public boolean isUpgradable() {
|
||||||
return Messages.get(EndingBlade.class,"stats_desc");
|
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.actors.buffs.RandomBuff;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Unstable;
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Unstable;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
|
||||||
import com.watabou.utils.Bundle;
|
import com.watabou.utils.Bundle;
|
||||||
|
|
||||||
public class LockSword extends MeleeWeapon {
|
public class LockSword extends MeleeWeapon {
|
||||||
|
@ -34,7 +33,7 @@ public class LockSword extends MeleeWeapon {
|
||||||
|
|
||||||
public int image() {
|
public int image() {
|
||||||
if (this.level() == 3 && Dungeon.hero.buff(RandomBuff.class) != null){
|
if (this.level() == 3 && Dungeon.hero.buff(RandomBuff.class) != null){
|
||||||
GLog.n("谢谢你为我升级……");
|
//GLog.n("谢谢你为我升级……");
|
||||||
for (Buff buff : hero.buffs()) {
|
for (Buff buff : hero.buffs()) {
|
||||||
if (buff instanceof RandomBuff) {
|
if (buff instanceof RandomBuff) {
|
||||||
buff.detach();
|
buff.detach();
|
||||||
|
|
|
@ -8,6 +8,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
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.Mob;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.CrystalDiedTower;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.CrystalDiedTower;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.FireMagicDied;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.FireMagicDied;
|
||||||
|
@ -273,11 +274,19 @@ public class ShopBossLevel extends Level {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String tilesTex() {
|
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() {
|
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.Bleeding;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple;
|
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.hero.Hero;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
|
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.effects.Speck;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass;
|
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.spells.FeatherFall;
|
import com.shatteredpixel.shatteredpixeldungeon.items.spells.FeatherFall;
|
||||||
|
@ -70,6 +72,16 @@ public class Chasm implements Hero.Doom {
|
||||||
if (index == 0) {
|
if (index == 0) {
|
||||||
if (Dungeon.hero.pos == heroPos) {
|
if (Dungeon.hero.pos == heroPos) {
|
||||||
jumpConfirmed = true;
|
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();
|
hero.resume();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -182,7 +182,7 @@ public class InterlevelScene extends PixelScene {
|
||||||
fadeTime += 0.9f; //adds 1 second total
|
fadeTime += 0.9f; //adds 1 second total
|
||||||
//speed up transition when debugging
|
//speed up transition when debugging
|
||||||
} else if (DeviceCompat.isDebug()){
|
} else if (DeviceCompat.isDebug()){
|
||||||
fadeTime = 0.9f;
|
fadeTime = 0.1f;
|
||||||
}
|
}
|
||||||
|
|
||||||
SkinnedBlock bg = new SkinnedBlock(Camera.main.width, Camera.main.height, loadingAsset ){
|
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_ROSE1 = ARTIFACTS+20;
|
||||||
public static final int ARTIFACT_ROSE2 = ARTIFACTS+21;
|
public static final int ARTIFACT_ROSE2 = ARTIFACTS+21;
|
||||||
public static final int ARTIFACT_ROSE3 = ARTIFACTS+22;
|
public static final int ARTIFACT_ROSE3 = ARTIFACTS+22;
|
||||||
|
public static final int Gold_Iron = ARTIFACTS+23;
|
||||||
static{
|
static{
|
||||||
assignItemRect(ARTIFACT_CLOAK, 9, 15);
|
assignItemRect(ARTIFACT_CLOAK, 9, 15);
|
||||||
assignItemRect(ARTIFACT_ARMBAND, 16, 13);
|
assignItemRect(ARTIFACT_ARMBAND, 16, 13);
|
||||||
|
@ -457,6 +458,7 @@ public class ItemSpriteSheet {
|
||||||
assignItemRect(ARTIFACT_ROSE1, 14, 14);
|
assignItemRect(ARTIFACT_ROSE1, 14, 14);
|
||||||
assignItemRect(ARTIFACT_ROSE2, 14, 14);
|
assignItemRect(ARTIFACT_ROSE2, 14, 14);
|
||||||
assignItemRect(ARTIFACT_ROSE3, 14, 14);
|
assignItemRect(ARTIFACT_ROSE3, 14, 14);
|
||||||
|
assignItemRect(Gold_Iron, 16, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
//16 free slots
|
//16 free slots
|
||||||
|
@ -768,6 +770,7 @@ public class ItemSpriteSheet {
|
||||||
public static final int NOKING= MAINBOOKINDEX+7;
|
public static final int NOKING= MAINBOOKINDEX+7;
|
||||||
public static final int FIRELIYD= MAINBOOKINDEX+8;
|
public static final int FIRELIYD= MAINBOOKINDEX+8;
|
||||||
public static final int FBK= MAINBOOKINDEX+9;
|
public static final int FBK= MAINBOOKINDEX+9;
|
||||||
|
public static final int LASERPYTHON= MAINBOOKINDEX+10;
|
||||||
|
|
||||||
private static final int MAINPALYBOOKS = xy(1, 40);
|
private static final int MAINPALYBOOKS = xy(1, 40);
|
||||||
public static final int MONEYBOOKS= MAINPALYBOOKS+1;
|
public static final int MONEYBOOKS= MAINPALYBOOKS+1;
|
||||||
|
|
|
@ -129,7 +129,7 @@ public class RenderedTextBlock extends Component {
|
||||||
Θ = 蓝色
|
Θ = 蓝色
|
||||||
Ξ = 粉色
|
Ξ = 粉色
|
||||||
Π = 紫色
|
Π = 紫色
|
||||||
Σ = 黑色
|
✦ = 黑色
|
||||||
_ = 青色 */
|
_ = 青色 */
|
||||||
|
|
||||||
if (str.equals("_") && highlightingEnabled){
|
if (str.equals("_") && highlightingEnabled){
|
||||||
|
|
|
@ -267,6 +267,9 @@ public class StatusPane extends Component {
|
||||||
|
|
||||||
//buffs.setPos( x + 31, y );
|
//buffs.setPos( x + 31, y );
|
||||||
|
|
||||||
|
//下半段
|
||||||
|
puresoul.visible = false;
|
||||||
|
|
||||||
busy.x = x + bg.width + 1;
|
busy.x = x + bg.width + 1;
|
||||||
busy.y = y + bg.height - 9;
|
busy.y = y + bg.height - 9;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user