update p2.910

This commit is contained in:
LingASDJ 2022-12-26 20:41:18 +08:00
parent 73a4a79910
commit fdd01311f1
33 changed files with 528 additions and 195 deletions

View File

@ -16,8 +16,8 @@ allprojects {
appName = 'Magic Ling Pixel Dungeon'
appPackageName = 'com.ansdomagiclingpixeldungeon.ling'
appVersionCode =700726
appVersionName = '0.6.0.0-Beta21-p2.900'
appVersionCode =700800
appVersionName = '0.6.0.0-Beta21-p2.910-INDEV'
appJavaCompatibility = JavaVersion.VERSION_1_8

View File

@ -6,6 +6,8 @@ text.herostat.item_wnd_cursed = 诅咒的
text.herostat.item_basic = 常规:
text.herostat.item_enter = 查看物品生成
actors.buffs.autorandombuff.name=?
actors.buffs.autorandombuff.desc=还有:%s回合。
@ -13,7 +15,6 @@ actors.mobs.npcs.autoshoprebot.desc=一款可以售卖食物的自动售货机
actors.mobs.npcs.autoshoprebot.greetings=自动食物售货机:侦测到附近有生命气息,系统开始初始化……
actors.mobs.npcs.autoshoprebot.name=自动食物售货机
actors.buffs.invisibilityring.name=
actors.buffs.invisibilityring.desc=你和周围的地形完全融为一体使你不可能被看到。同时你将每10回合回复1滴血 \n\n当你在虚隐时敌人无法追踪或攻击你。大部分物理攻击和魔法(比如卷轴和法杖)会立即解除虚隐效果。 \n\n剩余的虚隐效果时长%s回合
@ -99,7 +100,7 @@ actors.mobs.bosses.firemagicdied.life=命运轮回!
actors.mobs.bosses.firemagicdied.dead=死驱影熵!
actors.mobs.bosses.firemagicdied.losing=……
actors.mobs.bosses.firemagicdied.enraged=很好,我也要拿出我的全部实力了!
actors.mobs.bosses.firemagicdied.xslx=水晶的力量已经被完全激活,摧毁水晶!!!
actors.mobs.bosses.firemagicdied.xslx=水晶的力量已经被完全激活,摧毁最中间的水晶!!!
actors.mobs.bosses.firemagicdied.rankings_desc=在莲娜的试炼中不幸消逝……
actors.mobs.bosses.firemagicdied$yogscanhalf.name=???
actors.mobs.bosses.firemagicdied$yogscanhalf.rankings_desc=在莲娜的试炼中不幸消逝……
@ -155,6 +156,7 @@ actors.mobs.coldgurad.def_verb=魔盾
actors.mobs.coldgurad.desc=雪凛峡谷的守卫,保卫着雪凛峡谷的平衡!
actors.mobs.coldgurad.colddown=守卫技能冷却时间:
actors.mobs.coldgurad.cost=外来的访问者,我在尽头等着你!
actors.mobs.coldgurad.bolt_kill=……
actors.mobs.npcs.shopking.name=???
actors.mobs.npcs.shopking.desc=一位穿着神秘的人正在尽头等着你的到来……
@ -640,14 +642,14 @@ actors.mobs.slime_sz.name=史莱姆-圣紫守护者
actors.mobs.slime_sz.desc=史莱姆七大守护者中的_圣紫使者_\n它发出的攻击有几率让入侵者受到_迟缓效果_
actors.mobs.slimeking.name=史莱姆王子
actors.mobs.slimeking.desc=史莱姆王子,圣境密林的守护者,没有人能从它这里活着走过去。\n\n-机制说明:移动极其缓慢但有无限使用的锁链。血量低于一半后立刻呼唤_当前楼层至多3个怪物_前来支援(只可触发一次),并且移速恢复正常但_锁链功能失效_且_自身防御降为0_以及近战有概率造成_双倍伤害_。血量低于60后受到敌人的近战攻击将有45%的概率分裂成蚀化史莱姆,但分裂的血量/4
actors.mobs.slimeking.notice=将会死在圣境密林!
actors.mobs.slimeking.desc=史莱姆王子,圣境密林的守护者,没有人能从它这里活着走过去。你或许在质疑为什么圣境密林层会有它的存在,实际上,这也是史莱姆一族需要解决的问题
actors.mobs.slimeking.notice=清楚你在与谁抗衡吗?
actors.mobs.slimeking.defeated=不……这不可能……
actors.mobs.slimeking.arise=我的史莱姆守卫们,快点出来支援本王!
actors.mobs.slimeking.arise=无礼!朕为了一切什么都能付出
actors.mobs.slimeking.rankings_desc=在史莱姆王子面前屈服
actors.mobs.slimeking.scorpion=朕叫你走了吗?
actors.mobs.slimeking$hunting.cus=不自量力的小鬼,让你见识下绝对审判!
actors.mobs.slimeking.fuck=你算什么东西?!
actors.mobs.slimeking.fuck=很好,我可能无法阻止你,但你接下来会遇到更恐怖的东西。
actors.mobs.xykl.name =红魔守卫
actors.mobs.xykl.desc =这些若隐若现的傀儡是曾经的水晶之城的守卫,因为你的执着,他们现在与你并肩作战。\n现在你是他们的新主人他们将誓死守卫你到消亡
@ -657,7 +659,7 @@ actors.mobs.shieldhuntsman.desc = 曾经去过_水晶之城_的他们现在
actors.mobs.murderer.name=邪魔小偷
actors.mobs.murderer.desc=穿着橘色的盗贼礼服的危险怪物,他们已经丧失了偷东西的本领,他们的黑魔法会让每一个冒险者有去无回。
actors.mobs.murderer.bolt_kill=暗影能量使你的生命衰竭了……
actors.mobs.murderer.bolt_kill=暗影能量使你的生命衰竭了……
actors.blobs.halomethanefire.desc=一团磷火正在这里肆虐。
actors.blobs.superfire.desc=一团磷火正在这里肆虐。
@ -1217,7 +1219,7 @@ actors.hero.hero.search=搜索
actors.hero.hero.search_distracted=你没办法集中精力,探索周边异常费力。
actors.hero.hero.pain_resist=疼痛使你得以抵抗睡意。
actors.hero.hero.revive=重生十字章迸裂出苏生的能量!
actors.hero.hero.died=这里的魔法力量抑制了十字架的祝福,你彻底死亡了……
actors.hero.hero.died=你的十字架毫无用处……,你彻底死在了雪凛峡谷……
##classes
actors.hero.heroclass.warrior=蕾零安洁

View File

@ -46,6 +46,7 @@ items.food.lightfood.desc=闪电饭团是冻肉和闪电种子加上口粮的综
items.food.cake.name=草莓奶油蛋糕
items.food.cake.eat_good=这个食物的能量激发了你的潜能,你的力量+1!
items.food.cake.eat_good2=这个食物的能量已经激发了你足够多的潜能,不过你仍可运用这股力量,你将它转换为了奥术护盾。
items.food.cake.desc=蛋糕是地牢中最稀有的食物,吃掉它可以立刻清除所有负面效果,并且会让你充满活力,蛋糕还能有极小的概率激发你的潜能……
items.food.switch.name=魔法三明治

View File

@ -113,7 +113,7 @@ challenges.no_scrolls_desc=其中一种卷轴符文会变得更稀有。只不
rankings$record.something=在黑暗中被击杀
challenges.aquaphobia=_污泥浊水_
challenges.aquaphobia_desc=你已经尝试了被水神祝福后的逍遥自在。\n\n而接下来当水神被亵渎后诅咒也随之即将到来。\n\n圣境层到矮人层踩水将会获得DeBuff,玩家在开局获得4瓶水灵药水饮用可获得50回合的踩水不获得Debuff时间并获得祝福。同时,炼金新增水灵药水配方
challenges.aquaphobia_desc=你已经尝试了被水神祝福后的逍遥自在。\n\n而接下来当水神被亵渎后诅咒也随之即将到来。\n\n圣境层到矮人层踩水将会获得DeBuff,玩家在开局获得4瓶水灵药水饮用可获得100回合的踩水不获得Debuff时间并获得祝福。
challenges.champion_enemies=_精英战场_
challenges.champion_enemies_desc=会升级的不止你一个!\n\n・普通敌人刷出时有 1/8 \
的机率拥有特殊的精英属性。\n・精英敌人刷出时会立即醒来。\n・精英敌人免疫腐化效果。\n\n精英敌人有七种\n_烈焰橙色_ 近战伤害 \

View File

@ -481,4 +481,6 @@ ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x35=-P2.875\n1.修复了回溯之书
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x36=-P2.9\n1.修复史莱姆王可能崩溃游戏的问题\n2.修复一些其他的弱性错误
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x37=-P2.910\n1.修复基因突变的怪物双倍攻速问题\n2.修复自动售货机被腐化的问题\n3.修复房间生成错误的问题\n4.部分文案描述错误修复
//ui.changelist.mlpd.vm0_5_x_changes.xxx//

View File

@ -5,7 +5,8 @@ windows.textchallenges.delete_seed_input = 清除
windows.wndsettings$extendtab.fpsdisplay=显示帧率
windows.wndautoshop.welcome=自动食品售货机
windows.wndautoshop.xwelcome=欢迎……客人……,请……自行……挑选购买……,全场_200_金币。
windows.wndautoshop.xwelcome=欢迎……客人……,请……自行……挑选购买……,全场
windows.wndautoshop.gold=金币
windows.wndautoshop.buy=购买物品
windows.wndautoshop.cancel=取消购买
windows.wndautoshop.nomoney=金钱……不足,购买……失败……

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 77 KiB

View File

@ -561,6 +561,11 @@ public abstract class Char extends Actor {
if ( buff( Haste.class ) != null) speed *= 3f;
if ( buff( HasteLing.class ) != null) speed *= 3f;
if ( buff( Dread.class ) != null) speed *= 2f;
for (ChampionEnemy buff : buffs(ChampionEnemy.class)){
speed *= buff.speedFactor();
}
return speed;
}

View File

@ -68,7 +68,7 @@ public class BeamTowerAdbility extends Buff {
} else if (stateLoop == 4) {
stateLoop++;
FloatingText.show(p.x, p.y, "x", 0xFF8055);
} else if (stateLoop == 5) {
} else if (stateLoop == 8) {
int w = Dungeon.level.width();
int[] tile = {w + 1, w - 1, -w + 1, -w - 1};
for (int i = 0; i < 4; ++i) {
@ -77,10 +77,10 @@ public class BeamTowerAdbility extends Buff {
beamProc(b);
}
stateLoop++;
} else if (stateLoop == 6) {
} else if (stateLoop == 9) {
stateLoop++;
FloatingText.show(p.x, p.y, "S", 0x00ffff);
} else if (stateLoop == 7) {
} else if (stateLoop == 13) {
int w = Dungeon.level.width();
int[] tile = {w, w - 5, -w + 5, -w};
for (int i = 0; i < 4; ++i) {
@ -90,10 +90,10 @@ public class BeamTowerAdbility extends Buff {
beamProc(b);
}
stateLoop++;
} else if (stateLoop == 10) {
} else if (stateLoop == 16) {
stateLoop++;
FloatingText.show(p.x, p.y, "", 0x00ffff);
} else if (stateLoop == 11) {
} else if (stateLoop == 18) {
int w = Dungeon.level.width();
int[] tile = {w + 1, w - 1, -w + 1, -w - 1};
for (int i = 0; i < 4; ++i) {
@ -101,7 +101,7 @@ public class BeamTowerAdbility extends Buff {
target.sprite.parent.add(new Beam.DeathRay(DungeonTilemap.raisedTileCenterToWorld(b.sourcePos), DungeonTilemap.raisedTileCenterToWorld(b.collisionPos)));
beamProc(b);
}
if (stateLoop == 11) {
if (stateLoop == 18) {
int wx = Dungeon.level.width();
int[] tilex = {w, -wx, 1, -1};
for (int i = 0; i < 4; ++i) {
@ -112,7 +112,7 @@ public class BeamTowerAdbility extends Buff {
}
}
stateLoop = 0;
} else if (stateLoop == 0 || stateLoop == 3|| stateLoop == 8|| stateLoop == 9) {
} else if (stateLoop == 0 || stateLoop >= 3 && stateLoop <= 17) {
stateLoop++;
} else {
stateLoop = 0;

View File

@ -53,7 +53,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionHero;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Chill;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff.BlessGoRead;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff.BlessGoodSTR;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff.BlessImmune;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff.BlessMixShiled;
@ -255,6 +254,9 @@ public class Hero extends Char {
//TODO 灯火前行
public int lanterfire;
//蛋糕
public int CakeUsed;
public int HTBoost = 0;
@ -330,6 +332,8 @@ public class Hero extends Char {
private static final String LANTERFTR = "lanterfire";
private static final String CAKEUSED = "cakeused";
@Override
public void storeInBundle( Bundle bundle ) {
@ -350,7 +354,7 @@ public class Hero extends Char {
bundle.put( EXPERIENCE, exp );
bundle.put( HTBOOST, HTBoost );
bundle.put( CAKEUSED, CakeUsed );
if (!this.name.equals("")) {
bundle.put("name", this.name);
@ -381,6 +385,8 @@ public class Hero extends Char {
STR = bundle.getInt( STRENGTH );
CakeUsed = bundle.getInt( CAKEUSED);
String name;
if (bundle.contains("name")) {
name = bundle.getString("name");
@ -948,14 +954,12 @@ public class Hero extends Char {
switch (Random.Int(3)){
case 0: default:
Buff.affect(hero, BlessGoRead.class).set( (100), 1 );
case 1:
Buff.affect(hero, BlessMobDied.class).set( (100), 1 );
break;
case 2:
case 1:
Buff.affect(hero, BlessMixShiled.class).set( (100), 1 );
break;
case 3:
case 2:
Buff.affect(hero, BlessImmune.class).set( (100), 1 );
break;
}

View File

@ -68,6 +68,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.IceCityBoo
import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.MagicGirlBooks;
import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.NoKingMobBooks;
import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.YellowSunBooks;
import com.shatteredpixel.shatteredpixeldungeon.items.food.Cake;
import com.shatteredpixel.shatteredpixeldungeon.items.food.Food;
import com.shatteredpixel.shatteredpixeldungeon.items.food.FrozenCarpaccio;
import com.shatteredpixel.shatteredpixeldungeon.items.food.MeatPie;
@ -180,6 +181,7 @@ public enum HeroClass {
// Buff.affect(hero, ChampionHero.Giant.class, ChampionHero.DURATION);
// Buff.affect(hero, ChampionHero.Growing.class, ChampionHero.DURATION);
new Gauntlet().quantity(1).identify().collect();
new Cake().quantity(100).identify().collect();
new TengusMask().quantity(1).identify().collect();
new KingsCrown().quantity(1).identify().collect();
new ScrollOfIdentify().quantity(45).identify().collect();

View File

@ -41,7 +41,7 @@ import com.watabou.utils.Random;
public class ColdMagicRat extends Mob implements Callback {
private static final float TIME_TO_ZAP = 1f;
private static final float TIME_TO_ZAP = 3f;
{
spriteClass = ColdRatSprite.class;
@ -65,7 +65,7 @@ public class ColdMagicRat extends Mob implements Callback {
@Override
public int attackSkill( Char target ) {
return 1;
return 8;
}
@Override
@ -109,7 +109,7 @@ public class ColdMagicRat extends Mob implements Callback {
Sample.INSTANCE.play( Assets.Sounds.DEBUFF );
}
int dmg = Random.NormalIntRange( 2, 4 );
int dmg = Random.NormalIntRange( 10, 12 );
enemy.damage( dmg, new DarkBolt() );
if (enemy == Dungeon.hero && !enemy.isAlive()) {

View File

@ -43,7 +43,7 @@ import com.watabou.utils.Random;
public class IceGolem extends Mob implements Callback {
private static final float TIME_TO_ZAP = 1f;
private static final float TIME_TO_ZAP = 5f;
{
spriteClass = IceGolemSprite.class;

View File

@ -10,10 +10,8 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Boss;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Freezing;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Adrenaline;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ArcaneArmor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barrier;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Charm;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Chill;
@ -36,14 +34,13 @@ import com.shatteredpixel.shatteredpixeldungeon.custom.utils.GME;
import com.shatteredpixel.shatteredpixeldungeon.effects.BeamCustom;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Effects;
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.effects.TargetedCell;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.MissileSpriteCustom;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.SnowParticle;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.SparkParticle;
import com.shatteredpixel.shatteredpixeldungeon.items.Gold;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose;
import com.shatteredpixel.shatteredpixeldungeon.items.bombs.Bomb;
import com.shatteredpixel.shatteredpixeldungeon.items.keys.SkeletonKey;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMapping;
@ -68,6 +65,7 @@ import com.watabou.utils.PathFinder;
import com.watabou.utils.Random;
import java.util.ArrayList;
import java.util.HashSet;
public class MagicGirlDead extends Boss {
{
@ -80,7 +78,11 @@ public class MagicGirlDead extends Boss {
HT=400;
viewDistance = 18;
}
//the actual affected cells
private HashSet<Integer> affectedCells;
//the cells to trace fire shots to, for visual effects.
private HashSet<Integer> visualCells;
private int direction = 0;
{
immunities.add(Sleep.class);
@ -146,6 +148,108 @@ public class MagicGirlDead extends Boss {
yell(Messages.get(this, "damaged"));
}
protected void onZap( Ballistica bolt ) {
for( int cell : affectedCells){
//ignore caster cell
if (cell == bolt.sourcePos){
continue;
}
//only ignite cells directly near caster if they are flammable
if (!Dungeon.level.adjacent(bolt.sourcePos, cell)
|| Dungeon.level.flamable[cell]){
GameScene.add( Blob.seed( cell, 1+2, Freezing.class ) );
}
}
}
public void shoot(Char ch, int pos){
final Ballistica shot = new Ballistica( ch.pos, pos, Ballistica.MAGIC_BOLT);
fx(shot, new Callback() {
@Override
public void call() {
onZap(shot);
}
}, ch);
}
protected void fx(Ballistica bolt, Callback callback, Char ch ) {
//need to perform flame spread logic here so we can determine what cells to put flames in.
affectedCells = new HashSet<>();
visualCells = new HashSet<>();
int maxDist = 4 + 4*4;
int dist = Math.min(bolt.dist, maxDist);
for (int i = 0; i < PathFinder.CIRCLE8.length; i++){
if (bolt.sourcePos+PathFinder.CIRCLE8[i] == bolt.path.get(1)){
direction = i;
break;
}
}
float strength = maxDist;
for (int c : bolt.subPath(1, dist)) {
strength--; //as we start at dist 1, not 0.
affectedCells.add(c);
if (strength > 1) {
spreadFlames(c + PathFinder.CIRCLE8[left(direction)], strength - 1);
spreadFlames(c + PathFinder.CIRCLE8[direction], strength - 1);
spreadFlames(c + PathFinder.CIRCLE8[right(direction)], strength - 1);
} else {
visualCells.add(c);
}
}
//going to call this one manually
visualCells.remove(bolt.path.get(dist));
for (int cell : visualCells){
//this way we only get the cells at the tip, much better performance.
((MagicMissile)ch.sprite.parent.recycle( MagicMissile.class )).reset(
MagicMissile.FROST,
ch.sprite,
cell,
null
);
}
MagicMissile.boltFromChar( ch.sprite.parent,
MagicMissile.FROST,
ch.sprite,
bolt.path.get(dist/2),
callback );
if(Dungeon.level.heroFOV[bolt.sourcePos] || Dungeon.level.heroFOV[bolt.collisionPos]){
Sample.INSTANCE.play( Assets.Sounds.ZAP );
}
}
//burn... BURNNNNN!.....
private void spreadFlames(int cell, float strength){
if (strength >= 0 && (Dungeon.level.passable[cell] || Dungeon.level.flamable[cell])){
affectedCells.add(cell);
if (strength >= 1.5f) {
visualCells.remove(cell);
spreadFlames(cell + PathFinder.CIRCLE8[left(direction)], strength - 1.5f);
spreadFlames(cell + PathFinder.NEIGHBOURS9[direction], strength - 1.5f);
spreadFlames(cell + PathFinder.CIRCLE8[right(direction)], strength - 1.5f);
} else {
visualCells.add(cell);
}
} else if (!Dungeon.level.passable[cell])
visualCells.add(cell);
}
private int left(int direction){
return direction == 0 ? 3 : direction-1;
}
private int right(int direction){
return direction == 7 ? 0 : direction+1;
}
private static final float TIME_TO_BURN = 6f;
@Override
public boolean act(){
if(paralysed>0){
@ -163,11 +267,15 @@ public class MagicGirlDead extends Boss {
GLog.b("……你妄图使用这种方法来逃脱吗?");
}
}
if(buff(RageAndFire.class)!=null){
//if target is locked, fire, target = -1
if(lastTargeting != -1){
//no spend, execute next act
fireProc(lastTargeting);
sprite.attack( enemy.pos );
spend( attackDelay()*5f );
shoot(this, enemy.pos);
return true;
//else try to lock target
}else if(findTargetLocation()) {
@ -193,27 +301,14 @@ public class MagicGirlDead extends Boss {
if (Dungeon.level.map[step] == Terrain.WATER && state == HUNTING) {
if (Dungeon.level.heroFOV[step] && HP < 200) {
if (buff(Haste.class) == null) {
Buff.affect(this, Barrier.class).setShield( 20);
Buff.affect(this, Haste.class, 5f);
Buff.affect(this, ArcaneArmor.class).set(Dungeon.hero.lvl + 10, 10);
Buff.affect(this, Healing.class).setHeal(10, 0f, 6);
new SRPDICLRPRO().spawnAround(pos);
Buff.affect(this, Adrenaline.class, 20f);
yell( Messages.get(this, "arise2") );
GLog.b(Messages.get(this, "shield2"));
enemy.sprite.showStatus(0x00ffff, ("游戏开始!!!"));
}
sprite.emitter().start(SparkParticle.STATIC, 0.05f, 20);
} else if (Dungeon.level.heroFOV[step]) {
if (Dungeon.level.heroFOV[step]) {
if (buff(Haste.class) == null) {
Buff.affect(this, Haste.class, 10f);
Buff.affect(this, Healing.class).setHeal(42, 0f, 6);
new SRPDICLRPRO().spawnAround(pos);
yell( Messages.get(this, "arise") );
GLog.b(Messages.get(this, "shield"));
enemy.sprite.showStatus(0x00ffff, ("不自量力"));
enemy.sprite.showStatus(0x00ffff, (""));
}
sprite.emitter().start(SparkParticle.STATIC, 0.05f, 20);
}
@ -572,36 +667,6 @@ public class MagicGirlDead extends Boss {
}
}
protected void fireProc(int targetCell){
Ballistica ballistica = new Ballistica(pos, targetCell, Ballistica.PROJECTILE);
((MissileSpriteCustom)sprite.parent.recycle(MissileSpriteCustom.class)).reset(
sprite, ballistica.collisionPos, new Bomb(), 10f, 2.0f,
new Callback() {
@Override
public void call() {
int[] cells = GME.NEIGHBOURS5();
for(int i: cells){
int c = i+ballistica.collisionPos;
Char ch = findChar(c);
if(ch!=null){
if(ch.alignment != Alignment.ENEMY){
int damage = Random.Int(14, 24);
damage -= ch.drRoll();
ch.damage(damage, this);
if(ch == hero && !ch.isAlive()){
Dungeon.fail(this.getClass());
}
}
}
CellEmitter.center(c).burst(SnowParticle.FACTORY, 15);
}
}
}
);
lastTargeting = -1;
}
protected boolean findTargetLocation(){
if(enemy!=null && enemySeen){
lastTargeting = enemy.pos;

View File

@ -549,13 +549,13 @@ public abstract class Mob extends Char {
public float attackDelay() {
float delay = 1f;
if ( buff(Adrenaline.class) != null) delay /= 1.5f;
return super.attackDelay()*(Dungeon.isChallenged(Challenges.SBSG) ? (0.5f * scaleFactor) : delay);
return super.attackDelay()*(delay);
}
@Override
public int attackProc(Char enemy, int damage) {
return super.attackProc(enemy,
(int) (damage*(Dungeon.isChallenged(Challenges.SBSG) ? (0.6f * scaleFactor) : 1)));
(int) (damage*(Dungeon.isChallenged(SBSG) ? (0.6f * scaleFactor) : 1)));
}
protected boolean doAttack( Char enemy ) {
@ -583,24 +583,11 @@ public abstract class Mob extends Char {
if ( !surprisedBy(enemy)
&& paralysed == 0
&& !(alignment == Alignment.ALLY && enemy == hero)) {
return (int) (this.defenseSkill/(Dungeon.isChallenged(Challenges.SBSG) ? (0.4f * scaleFactor) : 1));
return (int) (this.defenseSkill/(Dungeon.isChallenged(SBSG) ? (0.4f * scaleFactor) : 1));
} else {
return 0;
}
}
@Override
public float speed() {
if(Dungeon.isChallenged(SBSG)) {
//移速控制
for (ChampionEnemy buff : buffs(ChampionEnemy.class)) {
baseSpeed = buff.speedFactor();
}
}
return super.speed() * (1);
}
protected boolean hitWithRanged = false;

View File

@ -25,8 +25,7 @@ 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.Degrade;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Frost;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing;
@ -41,7 +40,7 @@ import com.watabou.utils.Random;
public class RedSwarm extends Mob implements Callback {
private static final float TIME_TO_ZAP = 1f;
private static final float TIME_TO_ZAP = 3f;
{
spriteClass = RedSwarmSprite.class;
@ -65,12 +64,12 @@ public class RedSwarm extends Mob implements Callback {
@Override
public int attackSkill( Char target ) {
return 1;
return 6;
}
@Override
public int drRoll() {
return Random.NormalIntRange(0, 1);
return Random.NormalIntRange(0, 5);
}
@Override
@ -105,7 +104,7 @@ public class RedSwarm extends Mob implements Callback {
if (hit( this, enemy, true )) {
//TODO would be nice for this to work on ghost/statues too
if (enemy == Dungeon.hero && Random.Int( 2 ) == 0) {
Buff.prolong( enemy, Frost.class, Degrade.DURATION );
Buff.affect(enemy, Burning.class).reignite(enemy);
Sample.INSTANCE.play( Assets.Sounds.DEBUFF );
}

View File

@ -148,7 +148,7 @@ public class CrystalLingTower extends Mob {
for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])) {
if (mob instanceof FireMagicDied) {
Viscosity.DeferedDamage deferred = Buff.affect( mob, Viscosity.DeferedDamage.class );
deferred.prolong( 10000 );
deferred.prolong( 1124 );
GLog.n( Messages.get(FireMagicDied.class, "dixsdf" ));
}
}

View File

@ -82,9 +82,9 @@ public class FireMagicDied extends Mob implements Callback {
private static final float TIME_TO_ZAP = 6f;
{
HP = HT = 500;
HP = HT = 400;
EXP = 80;
defenseSkill = 10;
defenseSkill = 1;
spriteClass = FireMagicGirlSprite.class;
flying = true;
properties.add(Property.BOSS);
@ -127,35 +127,6 @@ public class FireMagicDied extends Mob implements Callback {
return (int)(super.defenseSkill(enemy) * ((HP*2 <= HT)? 1.5 : 1));
}
private float[] skillBalance = new float[]{100f, 100f, 100f};
private void actScanning(){
if(phase>0) {
--beamCD;
if (beamCD <= 0) {
Buff.detach(this, FireMagicDied.YogScanHalf.class);
int skill = Random.chances(skillBalance);
if (skill == 0) {
Char enemy = (this.enemy == null ? Dungeon.hero : this.enemy);
int w = Dungeon.level.width();
int dx = enemy.pos % w - pos % w;
int dy = enemy.pos / w - pos / w;
int direction = 2 * (Math.abs(dx) > Math.abs(dy) ? 0 : 1);
direction += (direction > 0 ? (dy > 0 ? 1 : 0) : (dx > 0 ? 1 : 0));
Buff.affect(this, FireMagicDied.YogScanHalf.class).setPos(pos, direction);
skillBalance[skill] /= 1.75f;
beamCD = 20 + 8 - (phase == 5 ? 19 : 0);
Buff.affect(this, Healing.class).setHeal(5, 0f, 6);
sprite.showStatus(0xff0000, Messages.get(this, "dead"));
} else {
Buff.affect(this, YogReal.YogScanRound.class).setPos(pos);
skillBalance[skill] /= 2f;
Buff.affect(this, Healing.class).setHeal(5, 0f, 6);
beamCD = 20 + 10 - (phase == 5?19:0);
sprite.showStatus(0x00ff00, Messages.get(this, "life"));
}
}
}
}
@Override
public int drRoll() {
@ -354,7 +325,7 @@ public class FireMagicDied extends Mob implements Callback {
@Override
public boolean act() {
if (phase == 1 && HP <= 350) {
actScanning();
//actScanning();
if (Dungeon.level.water[pos] && HP < HT) {
HP += healInc;
@ -502,10 +473,12 @@ public class FireMagicDied extends Mob implements Callback {
return Dungeon.level.distance(enemy.pos, pos) <= 2
&& new Ballistica( pos, enemy.pos, Ballistica.PROJECTILE).collisionPos == enemy.pos
&& new Ballistica( enemy.pos, pos, Ballistica.PROJECTILE).collisionPos == pos;
} else if(HP > 400) {
return super.canAttack(enemy);
} else if(HP < 200) {
return Dungeon.level.distance(enemy.pos, pos) <= 3
&& new Ballistica( pos, enemy.pos, Ballistica.PROJECTILE).collisionPos == enemy.pos
&& new Ballistica( enemy.pos, pos, Ballistica.PROJECTILE).collisionPos == pos;
} else {
return new Ballistica(pos, enemy.pos, Ballistica.MAGIC_BOLT).collisionPos == enemy.pos;
return super.canAttack(enemy);
}
}
@ -578,18 +551,17 @@ public class FireMagicDied extends Mob implements Callback {
@Override
public int attackProc( Char enemy, int damage ) {
damage = super.attackProc( enemy, damage );
if(HP > 450){
if(HP > 300){
if (Random.Int( 3 ) == 0) {
Buff.affect( hero, HalomethaneBurning.class ).reignite( hero, 7f );
enemy.sprite.burst( 0x000000, 5 );
}
} else if (HP > 400) {
} else if (HP < 200) {
if (Random.NormalFloat( 2, 9 ) == 4) {
GLog.n( Messages.get(FireMagicDied.class, "died_kill",Dungeon.hero.name()) );
}
zap();
} else {
zap();
//doYogLasers();
if (Random.Int( 3 ) == 0) {
Buff.affect( hero, HalomethaneBurning.class ).reignite( hero, 24f );
@ -661,17 +633,17 @@ public class FireMagicDied extends Mob implements Callback {
return result;
}
@Override
protected boolean getCloser(int target) {
this.pumpedUp = 0;
if (this.state != this.HUNTING) {
return FireMagicDied.super.getCloser(target);
}
if (!this.enemySeen || !getFurther(target)) {
return false;
}
return true;
}
// @Override
// protected boolean getCloser(int target) {
// this.pumpedUp = 0;
// if (this.state != this.HUNTING) {
// return FireMagicDied.super.getCloser(target);
// }
// if (!this.enemySeen || !getFurther(target)) {
// return false;
// }
// return true;
// }
@Override
public void damage(int dmg, Object src) {
@ -718,7 +690,7 @@ public class FireMagicDied extends Mob implements Callback {
} else if (phase == 2 && shielding() == 0 && HP <= 200) {
actPhaseTwoSummon();
yell( Messages.get(this, "enraged" ));
GLog.n( Messages.get(this, "xslx") );
GLog.pink( Messages.get(this, "xslx") );
//T3 阶段
CrystalLingTower abc = new CrystalLingTower();
@ -736,7 +708,7 @@ public class FireMagicDied extends Mob implements Callback {
buff.detach();
}
}
actScanning();
//actScanning();
phase = 3;
summonsMade = 0;
sprite.idle();

View File

@ -39,6 +39,20 @@ public class AutoShopReBot extends NPC {
bundle.put(FIRST, first);
}
@Override
public void damage( int dmg, Object src ) {
}
@Override
public int defenseSkill( Char enemy ) {
return INFINITE_EVASION;
}
@Override
public boolean reset() {
return true;
}
@Override
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);

View File

@ -22,6 +22,7 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
import com.watabou.utils.PathFinder;
@ -49,4 +50,9 @@ public abstract class NPC extends Mob {
public void beckon( int cell ) {
}
@Override
public void add( Buff buff ) {
//lee();
}
}

View File

@ -1,6 +1,7 @@
package com.shatteredpixel.shatteredpixeldungeon.items.food;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barrier;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bleeding;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
@ -43,13 +44,19 @@ public class Cake extends Food {
@Override
protected void satisfy(Hero hero) {
Buff.prolong( hero, Haste.class, 10f);
if(Random.Float()<0.45f) {
if(Random.Float()<0.09f && hero.CakeUsed<2) {
hero.STR++;
hero.CakeUsed++;
hero.sprite.showStatus(CharSprite.POSITIVE, "+1");
GLog.p(Messages.get(this, "eat_good"));
} else if (hero.CakeUsed==2 && Random.Float()<0.09f) {
Buff.affect(hero, Barrier.class).setShield(((hero.HT/4)));
GLog.p(Messages.get(this, "eat_good2"));
} else {
Buff.affect(hero, Healing.class).setHeal((int) (0.4f * hero.HT/5 ), 0.25f, 0);
cure( hero );
}
Buff.affect(hero, Healing.class).setHeal((int) (0.4f * hero.HT/5), 0.25f, 0);
cure( hero );
super.satisfy( hero );
}

View File

@ -16,7 +16,7 @@ public class Switch extends Food {
@Override
protected void satisfy(Hero hero) {
Buff.affect(hero, Barrier.class).setShield(((20 * Dungeon.depth/5)));
Buff.affect(hero, Barrier.class).setShield(((20 + 20 * Dungeon.depth/5)));
super.satisfy( hero );
}

View File

@ -29,10 +29,6 @@ public class CrystalKey extends Key {
image = ItemSpriteSheet.CRYSTAL_KEY;
}
public CrystalKey() {
this( 0 );
}
public CrystalKey( int depth ) {
super();
this.depth = depth;

View File

@ -91,16 +91,19 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTerror;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTransmutation;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfBlastWave;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfBlueFuck;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfCorrosion;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfCorruption;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfDisintegration;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFireblast;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFrost;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfGodIce;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfLightning;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfLivingEarth;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfMagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfPrismaticLight;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfRegrowth;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfScale;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfTransfusion;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfWarding;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.AssassinsBlade;
@ -229,6 +232,9 @@ public enum Catalog {
WANDS.seen.put( WandOfTransfusion.class, false);
WANDS.seen.put( WandOfCorruption.class, false);
WANDS.seen.put( WandOfRegrowth.class, false);
WANDS.seen.put( WandOfGodIce.class, false);
WANDS.seen.put( WandOfScale.class, false);
WANDS.seen.put( WandOfBlueFuck.class, false);
RINGS.seen.put( RingOfAccuracy.class, false);
RINGS.seen.put( RingOfEnergy.class, false);

View File

@ -1,14 +1,27 @@
package com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.EXSG;
import static com.shatteredpixel.shatteredpixeldungeon.levels.RegularLevel.Holiday.HWEEN;
import static com.shatteredpixel.shatteredpixeldungeon.levels.RegularLevel.Holiday.XMAS;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.AutoShopReBot;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.Gold;
import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.keys.GoldenKey;
import com.shatteredpixel.shatteredpixeldungeon.items.keys.IronKey;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.features.Maze;
import com.shatteredpixel.shatteredpixeldungeon.levels.RegularLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room;
import com.watabou.utils.PathFinder;
import com.watabou.utils.Point;
import com.watabou.utils.Random;
import java.util.Calendar;
public class AutoShopRoom extends SpecialRoom {
@ -16,34 +29,87 @@ public class AutoShopRoom extends SpecialRoom {
}
public int minWidth() {
return Math.max(8, (int) ( 3.0d));
return 9;
}
public int minHeight() {
return Math.max(8, (int) (3.0d));
return 9;
}
private static RegularLevel.Holiday holiday;
public enum Holiday{
NONE,
ZQJ, //TBD
HWEEN,//2nd week of october though first day of november
XMAS //3rd week of december through first week of january
}
static{
holiday = RegularLevel.Holiday.NONE;
final Calendar calendar = Calendar.getInstance();
switch(calendar.get(Calendar.MONTH)){
case Calendar.JANUARY:
if (calendar.get(Calendar.WEEK_OF_MONTH) == 1)
holiday = XMAS;
break;
//2022 9.10-10.1
case Calendar.SEPTEMBER:
if (calendar.get(Calendar.DAY_OF_MONTH) >= 10 ){
holiday = RegularLevel.Holiday.ZQJ;
} else {
holiday = RegularLevel.Holiday.NONE;
}
break;
case Calendar.OCTOBER:
if (calendar.get(Calendar.DAY_OF_MONTH) == 1 ){
holiday = RegularLevel.Holiday.ZQJ;
} else {
holiday = RegularLevel.Holiday.NONE;
}
break;
case Calendar.DECEMBER:
if (calendar.get(Calendar.WEEK_OF_MONTH) >= 3)
holiday = XMAS;
break;
}
}
public void paint(Level level) {
Painter.fill(level, this, 4);
Painter.fill(level, this, 1, 14);
placeShopkeeper(level);
boolean[] passable = new boolean[width()*height()];
boolean[][] maze = Maze.generate(this);
for (int x = 0; x < maze.length; x++) {
for (int y = 0; y < maze[0].length; y++) {
if (maze[x][y] == Maze.FILLED) {
Painter.fill(level, x + left, y + top, 1, 1, Terrain.CHASM);
}
passable[x + width()*y] = maze[x][y] == Maze.EMPTY;
if(holiday == HWEEN || holiday == XMAS|| Dungeon.isChallenged(EXSG)) {
placeShopkeeper(level);
}
for (Room.Door door : this.connected.values()) {
door.set(Door.Type.LOCKED);
}
Door entrance = entrance();
entrance.set( Door.Type.LOCKED );
level.addItemToSpawn( new IronKey( Dungeon.depth ) );
int door = entrance.x + entrance.y * level.width();
//布局 x2 箱子
addChest( level, (top + 2) * level.width() + right-2, door );
addChestB( level, (bottom - 2) * level.width() + right-2, door );
//布局 x2 箱子
addChestC( level, (top + 2) * level.width() + right-6, door );
addChestD( level, (bottom - 2) * level.width() + right-6, door );
//7,17层---20%概率出金箱子 20% probability of gold chest
if(Dungeon.depth == 7||Dungeon.depth == 17) {
if (Random.Float() < 0.2f) {
addChestE(level, (top + 5) * level.width() + right - 2, door);
addChestF(level, (top + 5) * level.width() + right - 6, door);
level.addItemToSpawn(new GoldenKey(Dungeon.depth));
}
}
PathFinder.setMapSize(width(), height());
Point entrance = entrance();
int entrancePos = (entrance.x - left) + width()*(entrance.y - top);
PathFinder.buildDistanceMap( entrancePos, passable );
for (Room.Door door : this.connected.values()) {
door.set(Room.Door.Type.REGULAR);
}
}
protected void placeShopkeeper(Level level) {
@ -54,5 +120,95 @@ public class AutoShopRoom extends SpecialRoom {
}
private static void addChest( Level level, int pos, int door ) {
if (pos == door - 1 ||
pos == door + 1 ||
pos == door - level.width() ||
pos == door + level.width()) {
return;
}
Item prize = new Gold( Random.IntRange( 10, 25 ) );
level.drop( prize, pos ).type = Heap.Type.CHEST;
}
private static void addChestB( Level level, int pos, int door ) {
if (pos == door - 1 ||
pos == door + 1 ||
pos == door - level.width() ||
pos == door + level.width()) {
return;
}
Item prize = Generator.randomUsingDefaults( Generator.Category.STONE );
level.drop( prize, pos ).type = Heap.Type.CHEST;
}
private static void addChestC( Level level, int pos, int door ) {
if (pos == door - 1 ||
pos == door + 1 ||
pos == door - level.width() ||
pos == door + level.width()) {
return;
}
Item prize = Generator.randomUsingDefaults( Generator.Category.MISSILE );
level.drop( prize, pos ).type = Heap.Type.CHEST;
}
private static void addChestD( Level level, int pos, int door ) {
if (pos == door - 1 ||
pos == door + 1 ||
pos == door - level.width() ||
pos == door + level.width()) {
return;
}
Item prize = Generator.randomUsingDefaults( Generator.Category.SEED );
level.drop( prize, pos ).type = Heap.Type.CHEST;
}
private static void addChestE( Level level, int pos, int door ) {
if (pos == door - 1 ||
pos == door + 1 ||
pos == door - level.width() ||
pos == door + level.width()) {
return;
}
Wand mw = (Wand) Generator.randomUsingDefaults( Generator.Category.WAND );
mw.level(Random.Int(0,3));
mw.cursed = false;
mw.identify();
level.drop(mw, pos ).type = Heap.Type.LOCKED_CHEST;
}
private static void addChestF( Level level, int pos, int door ) {
if (pos == door - 1 ||
pos == door + 1 ||
pos == door - level.width() ||
pos == door + level.width()) {
return;
}
Weapon mw = Generator.randomWeapon(11);
mw.level(Random.Int(0,3));
mw.cursed = false;
mw.identify();
level.drop(mw, pos ).type = Heap.Type.LOCKED_CHEST;
}
}

View File

@ -46,6 +46,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff.BlessMixShiled;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff.BlessMobDied;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff.BlessNoMoney;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff.MagicGirlSayCursed;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff.MagicGirlSayKill;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff.MagicGirlSayMoneyMore;
@ -1374,6 +1375,10 @@ public class GameScene extends PixelScene {
cure( Dungeon.hero );
}
if (Dungeon.hero.buff(LockedFloor.class) == null) {
BGMPlayer.playBGMWithDepth();
}
Sample.INSTANCE.play( Assets.Sounds.BOSS );
}
}

View File

@ -435,6 +435,9 @@ public class InterlevelScene extends PixelScene {
private void returnPO() throws IOException {
Mob.holdAllies( Dungeon.level );
hero.STR = 10;
hero.CakeUsed = 0;
hero.lvl = 1;
InterlevelScene.returnDepth = Math.max(1, (Dungeon.depth - 1 - (Dungeon.depth-2)%5));
InterlevelScene.returnPos = -1;

View File

@ -17,7 +17,6 @@ public class ColdRatSprite extends MobSprite {
super();
texture( Assets.Sprites.COLDRAT );
TextureFilm frames = new TextureFilm( texture, 16, 15 );
idle = new Animation( 2, true );
@ -32,6 +31,8 @@ public class ColdRatSprite extends MobSprite {
die = new Animation( 10, false );
die.frames( frames, 11, 12, 13, 14 );
zap = attack.clone();
play( idle );
}
public void zap( int cell ) {

View File

@ -3,13 +3,16 @@ package com.shatteredpixel.shatteredpixeldungeon.sprites;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.FireMagicDied;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.watabou.noosa.TextureFilm;
import com.watabou.noosa.audio.Sample;
import com.watabou.noosa.particles.Emitter;
import com.watabou.utils.Callback;
import java.util.ArrayList;
@ -45,7 +48,7 @@ public class FireMagicGirlSprite extends MobSprite {
die = new Animation( 10, false );
die.frames( frames,2,3,4,5 );
zap = attack.clone();
play(idle);
spray = centerEmitter();
@ -121,6 +124,30 @@ public class FireMagicGirlSprite extends MobSprite {
spray.visible = visible;
}
@Override
public void attack( int cell ) {
if (!Dungeon.level.adjacent(cell, ch.pos)) {
play( zap );
MagicMissile.boltFromChar( parent,
MagicMissile.FIRE,
this,
cell,
new Callback() {
@Override
public void call() {
((FireMagicDied)ch).onZapComplete();
}
} );
Sample.INSTANCE.play( Assets.Sounds.ZAP );
turnTo( ch.pos , cell );
} else {
super.attack( cell );
}
}
@Override
public void onComplete( Animation anim ) {
super.onComplete(anim);

View File

@ -49,6 +49,8 @@ public class RedSwarmSprite extends MobSprite {
die = new Animation( 15, false );
die.frames( frames, 10, 11, 12, 13, 14 );
zap = attack.clone();
play( idle );
}

View File

@ -270,7 +270,7 @@ public class StatusPane extends Component {
heroInfoOnBar.setRect(heroInfo.right(), y + 19, 130, 20);
if(SPDSettings.FPSLimit()) {
fpsText.scale.set(PixelScene.align(0.9f));
fpsText.scale.set(PixelScene.align(0.8f));
fpsText.x = MenuPane.version.x - 15;
fpsText.y = MenuPane.version.y - 10;
PixelScene.align(fpsText);
@ -323,7 +323,7 @@ public class StatusPane extends Component {
buffs.setPos( x + 31, y + 12 );
if(SPDSettings.FPSLimit()) {
fpsText.scale.set(PixelScene.align(0.9f));
fpsText.scale.set(PixelScene.align(0.8f));
fpsText.x = MenuPane.version.x - 15;
fpsText.y = MenuPane.version.y - 10;
PixelScene.align(fpsText);

View File

@ -8,6 +8,7 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.AutoShopRoBotSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.BlueBatSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ColdGuardSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ColdRatSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.DM300Sprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.DiedMonkLoaderSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.FlameBoiSprite;
@ -20,6 +21,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.MagicGirlSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.MimicSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.MolotovHuntsmanSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.MurdererSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.RedSwarmSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.SRPDHBLRTT;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ShopkKingSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.SlimeKingSprite;
@ -37,6 +39,8 @@ import java.util.ArrayList;
public class vM0_6_7_X_Changes {
public static void addAllChanges(ArrayList<ChangeInfo> changeInfos) {
add_v0_6_20_Changes(changeInfos);
add_v0_6_19_Changes(changeInfos);
add_v0_6_18_Changes(changeInfos);
add_v0_6_17_Changes(changeInfos);
add_v0_6_16_Changes(changeInfos);
@ -58,6 +62,71 @@ public class vM0_6_7_X_Changes {
add_v0_6_0_Changes(changeInfos);
}
public static void add_v0_6_20_Changes( ArrayList<ChangeInfo> changeInfos ) {
ChangeInfo changes = new ChangeInfo("Coming Soon-Beta21--P3", true, "");
changes.hardlight(Window.TITLE_COLOR);
changeInfos.add(changes);
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.AMULET), ("MLPD上半段-试炼与水晶之心"),
("我们成功的拿到了水晶之心然而我们在最终调查中得知YOG不是真正的罪魁祸首……" )));
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG20), ("BossRush"),
("常规的开局你可能已经有所厌倦,地牢中的首领也是如此。这一次,不为成败,只为实力而战" )));
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.ICEBOOK), ("新年活动"),
("新年的钟声即将敲响,你接到了一份神秘的邀请……")));
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.FIREDVS), ("重构世界观"),
("魔绫的像素地牢已经陪你走过一个春秋了,然而,魔绫的剧情,你是否清楚呢?")));
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.SKELETONGOLD), ("部分Boss重做"),
("为了让魔绫和底层破碎更能区分部分boss会进行改进或者重做。敬请期待")));
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.ICEDVS), ("不止于此"),
("P3的更新远远不止这些而且这次我们会将一些想法和建议交给玩家让我们一起制作P3吧完善上半段旅程吧。")));
}
public static void add_v0_6_19_Changes( ArrayList<ChangeInfo> changeInfos ) {
ChangeInfo changes = new ChangeInfo("v0.6.0.0-Beta21-p2.910", true, "");
changes.hardlight(Window.TITLE_COLOR);
changeInfos.add(changes);
changes = new ChangeInfo("新内容", false, null);
changes.hardlight(Window.GREEN_COLOR);
changeInfos.add(changes);
changes.addButton(new ChangeButton(new AutoShopRoBotSprite(), ("自动食品售货机新房间"),
("房间会在游戏中生成里面有固定四个普通补给宝箱且有5%的概率出现两个金宝箱(二选一)。\n\n但售货机只会在节日期间" +
"(万圣,圣诞,中秋,国庆)或开启药水癔症挑战后出现。且售货机随着地牢深度的增加,商品购买的金币会有所追加。" )));
changes = new ChangeInfo("修复", false, null);
changes.hardlight(Window.CYELLOW);
changeInfos.add(changes);
changes.addButton(new ChangeButton(new Image("sprites/spinner.png", 144, 0, 16, 16), (Messages.get(ChangesScene.class, "bugfixes")),
Messages.get(vM0_6_7_X_Changes.class, "bug_06X37")));
changes = new ChangeInfo("调整", false, null);
changes.hardlight(Window.SKYBULE_COLOR);
changeInfos.add(changes);
changes.addButton(new ChangeButton(new RedSwarmSprite(), ("血红苍蝇"),
("数值调整攻击动画加入远程魔法攻击3回合一次并且有概率造成目标燃烧。" )));
changes.addButton(new ChangeButton(new ColdRatSprite(), ("寒冰魔鼠"),
("数值调整,攻击动画加入,远程魔法攻击3回合一次" )));
changes.addButton(new ChangeButton(new MagicGirlSprite(), ("寒冰魔女调整"),
("攻击AI调整攻击动画加入加入新的攻击策略自身低血量时踩水不再狂暴" )));
changes.addButton(new ChangeButton(new IceStalSprites(), ("浊焰魔女调整"),
("激光攻击延长攻击AI调整攻击动画加入。" )));
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.CAKE), ("草莓奶油芝士蛋糕"),
("获得力量概率为9%且每局游戏最多获得两次力量。之后触发将会转换为英雄血量25%的奥术护盾。" )));
}
public static void add_v0_6_18_Changes( ArrayList<ChangeInfo> changeInfos ) {
ChangeInfo changes = new ChangeInfo("v0.6.0.0-Beta21-p2.9(圣诞)", true, "");
changes.hardlight(Window.TITLE_COLOR);
@ -345,10 +414,10 @@ public class vM0_6_7_X_Changes {
changes.addButton( new ChangeButton(new BuffIcon(BuffIndicator.GOBUFF_UPRD, true), "灯火专有-Gobuff",
"追加了6种增益Buff\n\n" +
"纯洁的赞歌:\n" +
"前路 本大层内,饥饿高于90%的情况下,获得每回合+2的血量。\n" +
"前路 本大层内,饥饿高于50%的情况下,获得每回合+2的血量。\n" +
"富饶 本大层内商店打3折!\n" +
"守护 本大层内,满血可额外获得一些护盾值 冷却300回合\n" +
"安息 本大层内,玩家伤害x2倍\n" +
"安息 本大层内,玩家物理伤害x2倍\n" +
"隐没 本大层内玩家免疫魔法效果和减免20%伤害\n" +
"坚毅 本大层内,玩家力量+8"));

View File

@ -40,9 +40,10 @@ public class WndAutoShop extends Window {
IconTitle titlebar = new IconTitle();
titlebar.setRect(0, 0, WIDTH, 0);
titlebar.icon(new AutoShopRoBotSprite());
titlebar.label(Messages.get(WndAutoShop.class,"welcome"));
titlebar.label(Messages.get(WndAutoShop.class,"welcome") );
add( titlebar );
RenderedTextBlock message = PixelScene.renderTextBlock( (Messages.get(WndAutoShop.class,"xwelcome")), 6 );
RenderedTextBlock message =
PixelScene.renderTextBlock( (Messages.get(WndAutoShop.class,"xwelcome"))+ 200 * (Dungeon.depth / 5) +(Messages.get(WndAutoShop.class,"gold")), 6 );
message.maxWidth(WIDTH);
message.setPos(0, titlebar.bottom() + GAP);
add( message );
@ -143,8 +144,8 @@ public class WndAutoShop extends Window {
buff.detach();
}
}
} else if(Dungeon.gold > 200) {
Dungeon.gold-=200* Random.Int(2)+hero.lvl/5+10;
} else if(Dungeon.gold > 200 * (Dungeon.depth/5)) {
Dungeon.gold-=200 * (Dungeon.depth/5);
WndAutoShop.this.selectReward( item );
if(Dungeon.hero.buff(AutoRandomBuff.class) != null) {
AutoRandomBuff.level -= Random.Int(4);