Update Beta21-p1

This commit is contained in:
LingASDJ 2022-09-18 19:57:41 +08:00
parent 41dacc5d3d
commit 32f380c522
30 changed files with 1138 additions and 86 deletions

View File

@ -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

View File

@ -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,吾乃浊焰的化身,你必将受到正义的审判……

View File

@ -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=这件武器没有被诅咒。

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

View File

@ -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";

View File

@ -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;

View File

@ -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:

View File

@ -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);
}
}

View File

@ -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();

View File

@ -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;
}
}

View File

@ -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) {

View File

@ -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 );

View File

@ -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;

View File

@ -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);

View File

@ -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;
}
}
}

View File

@ -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";

View File

@ -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);
}
}

View File

@ -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

View File

@ -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,11 +95,15 @@ 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 instanceof EndingBlade) {
item.cursed = true;
} else {
if (item.cursed) { if (item.cursed) {
procced = true; procced = true;
item.cursed = false; item.cursed = false;
} }
} }
}
if (item instanceof Weapon){ if (item instanceof Weapon){
Weapon w = (Weapon) item; Weapon w = (Weapon) item;
if (w.hasCurseEnchant()){ if (w.hasCurseEnchant()){

View File

@ -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;
}
} }

View File

@ -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();

View File

@ -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,12 +274,20 @@ public class ShopBossLevel extends Level {
} }
public String tilesTex() { public String tilesTex() {
if (Dungeon.hero.buff(LockedFloor.class)!=null) {
return Assets.Environment.TILES_DIED;
} else {
return Assets.Environment.TILES_COLD; return Assets.Environment.TILES_COLD;
} }
}
public String waterTex() { public String waterTex() {
if (Dungeon.hero.buff(LockedFloor.class)!=null) {
return Assets.Environment.WATER_HALLS;
} else {
return Assets.Environment.WATER_COLD; return Assets.Environment.WATER_COLD;
} }
}
} }

View File

@ -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();
} }
} }

View File

@ -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 ){

View File

@ -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);
}
}

View File

@ -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;

View File

@ -129,7 +129,7 @@ public class RenderedTextBlock extends Component {
Θ = 蓝色 Θ = 蓝色
Ξ = 粉色 Ξ = 粉色
Π = 紫色 Π = 紫色
Σ = 黑色 = 黑色
_ = 青色 */ _ = 青色 */
if (str.equals("_") && highlightingEnabled){ if (str.equals("_") && highlightingEnabled){

View File

@ -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 {