Update Lantern Fire V2.5 Preview

This commit is contained in:
LingASDJ 2023-03-15 17:30:00 +08:00
parent 18d24f86ca
commit 0f7ccfa862
34 changed files with 737 additions and 663 deletions

View File

@ -6,6 +6,7 @@ buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:7.0.4'
classpath 'com.google.gms:google-services:4.3.15'
//noinspection GradleDependency
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2'
}
}
@ -16,8 +17,8 @@ allprojects {
appName = 'Magic Ling Pixel Dungeon'
appPackageName = 'com.ansdomagiclingpixeldungeon.ling'
appVersionCode =800000
appVersionName = '0.6.1.0-Beta3(P4)'
appVersionCode =800009
appVersionName = '0.6.1.0-Beta3(P4.1)'
appJavaCompatibility = JavaVersion.VERSION_1_8

View File

@ -1,4 +1,9 @@
#####MLPD-P3文本
actors.mobs.bosses.diamondknight.name=宝箱之王
actors.mobs.bosses.diamondknight.desc=拟态的最终结果就是无限接近人类。\n原本作用拟形的钻石宝箱外壳化作盔甲包裹住如王般的内在。\n衪是所有拟形怪的王——至少衪是这么认为的。\n王会战斗到最后一刻直到粉身碎骨。
actors.mobs.bosses.crivusfruits.name=克里弗斯之果
actors.mobs.bosses.crivusfruits.desc=这颗鲜红的果实将周围一切生物都化作自身的养分。身旁的触手会将不慎走进的小动物们绞杀,腐化成缠绕在四周的瘴气。但当它们感受到你手上拿着的提灯时,却表现出畏惧火焰的样子。\n\n极少有冒险者能对这株植物作出描述在得到的只言片语中你唯一能确定的就是“它是森林至暗的中心”。

View File

@ -1,9 +1,7 @@
####MLPD-P3文本
items.quest.starwar.name=StarWAR
items.quest.starwar.desc=描述……
items.quest.starwar.ac_ac_rainbowegg=彩蛋
items.weapon.melee.sdbsword.name=钻石大剑
items.weapon.melee.sdbsword.desc=钻石制成的奇特大剑,现在它已经给予了足够多的能量,它回到了巅峰时刻\n剑身残留着钻石宝箱王的魔力因此对其他魔力有着莫名的亲和性。相比于其他武器这把武器会随着等级的提升增加更多伤害。\n这把武器攻击速度极慢,但精准极高。\n该武器已经重回巅峰可以发射剑气。
items.weapon.melee.lifetreesword.name=“倒悬的生命树”
items.weapon.melee.lifetreesword.desc=克里弗斯之果破碎时,四周的藤蔓缠结在暴露出的种子上,形成剑的形状。剑身触碰到生物时会汲取他们的生命力提供给种子,期待着它再一结出猩红的果实。\n\n这是一个比较精准的武器。\n\n特别说明克里弗斯之果Boss专武每击杀_75只怪物_可以使用特殊武器技能,并重置杀敌计数。\n\n杀敌点数:
@ -54,6 +52,7 @@ items.lightblack.oillantern.lanteron=你点亮了提灯。
items.lightblack.oillantern.lanterreload=你把提灯的灯油再次加满了。
items.lightblack.oillantern.lanterneed=你没多的油瓶给提灯加油了。
items.lightblack.oillantern.lanterneeds=你需要一个备用的油瓶给提灯加油。
items.lightblack.oillantern.black=你的提灯已经完全熄灭,必须需要新的火种才能重新点燃……
items.artifacts.goldiron.name=镀金铁锤
items.artifacts.goldiron.desc=这曾是巨魔铁匠的锤子,其中蕴含了神奇的力量。\n\n因为你一不小心把巨魔镐子给搞丢了,巨魔委托你去杀死他的阴暗面。\n\n如今你已完成巨魔的委托这镀金铁锤便是巨魔给予你的礼物……

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 76 KiB

View File

@ -59,6 +59,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.CaveTwoBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.CavesGirlDeadLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.CavesLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.CityLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.ColdChestBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.DeadEndLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.DimandKingLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.DwarfMasterBossLevel;
@ -407,7 +408,7 @@ public class Dungeon {
case 10:
if((Statistics.boss_enhance & 0x2) != 0) level = new DimandKingLevel();
else
level = new PrisonBossLevel();
level = new ColdChestBossLevel();
break;
case 11:
case 12:

View File

@ -22,7 +22,6 @@
package com.shatteredpixel.shatteredpixeldungeon;
import com.watabou.utils.Bundle;
import com.watabou.utils.SparseArray;
public class Statistics {
public static int realdeepestFloor;
@ -64,7 +63,6 @@ public class Statistics {
//克里弗斯之果
public static boolean crivusfruitslevel2 = false;
//修复同步
public static boolean bugsyncfixed = false;
@ -83,8 +81,6 @@ public class Statistics {
public static float second_elapsed = 0;
public static float turnsPassed = 0f;
public static SparseArray<Boolean> floorsExplored = new SparseArray<>();
public static void reset() {
goldCollected = 0;
@ -123,9 +119,6 @@ public class Statistics {
second_elapsed = 0f;
real_seconds = 0;
turnsPassed = 0f;
}
private static final String GOLD = "score";

View File

@ -1281,7 +1281,7 @@ public class Hero extends Char {
//there can be multiple entrance tiles, so descend on any of them
//TODO this is slightly brittle, it assumes there are no disjointed sets of entrance tiles
} else if (Dungeon.level.map[pos] == Terrain.ENTRANCE) {
if (Dungeon.depth == 0) {
if (belongings.getItem(Amulet.class) == null) {
@ -1300,11 +1300,11 @@ public class Hero extends Char {
}
} else if (Dungeon.depth == 1) {
if (belongings.getItem( Amulet.class ) == null) {
if (belongings.getItem(Amulet.class) == null) {
Game.runOnRenderThread(new Callback() {
@Override
public void call() {
GameScene.show( new WndMessage( Messages.get(Hero.this, "leave2") ) );
GameScene.show(new WndMessage(Messages.get(Hero.this, "leave2")));
}
});
ready();
@ -1317,19 +1317,8 @@ public class Hero extends Char {
if (timeBubble != null) timeBubble.disarmPressedTraps();
InterlevelScene.mode = InterlevelScene.Mode.ASCEND;
Game.switchScene( InterlevelScene.class );
Game.switchScene(InterlevelScene.class);
}
} else {
curAction = null;
TimekeepersHourglass.timeFreeze timeFreeze = buff(TimekeepersHourglass.timeFreeze.class);
if (timeFreeze != null) timeFreeze.disarmPressedTraps();
Swiftthistle.TimeBubble timeBubble = buff(Swiftthistle.TimeBubble.class);
if (timeBubble != null) timeBubble.disarmPressedTraps();
InterlevelScene.mode = InterlevelScene.Mode.ASCEND;
Game.switchScene( InterlevelScene.class );
}
return false;
@ -2701,10 +2690,12 @@ public class Hero extends Char {
//TODO 灯火前行逻辑
public void damageLantern(int value){
lanterfire -= value;
hero.sprite.showStatus(0x808080, String.valueOf(value));
}
public void healLantern(int value){
lanterfire = Math.min(lanterfire+value,100);
hero.sprite.showStatus(0x00ff00, String.valueOf(value));
}
}

View File

@ -26,7 +26,6 @@ import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.QuickSlot;
import com.shatteredpixel.shatteredpixeldungeon.SPDSettings;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionHero;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.RandomBuff;
@ -120,6 +119,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.IceFishSword;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.LifeTreeSword;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.RedBloodMoon;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.SDBSword;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.SkyShield;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WarHammer;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WornShortsword;
@ -172,14 +172,9 @@ public enum HeroClass {
new FireFishSword().quantity(1).identify().collect();
new PotionOfInvisibility().quantity(45).identify().collect();
new PotionOfLevitation().quantity(100).identify().collect();
new SDBSword().quantity(1).identify().collect();
Buff.affect(hero, ChampionHero.AntiMagic.class, 50000f);
// Buff.affect(hero, ChampionHero.Blazing.class, ChampionHero.DURATION);
// Buff.affect(hero, ChampionHero.Halo.class, ChampionHero.DURATION);
// Buff.affect(hero, ChampionHero.Light.class, ChampionHero.DURATION);
// Buff.affect(hero, ChampionHero.Blessed.class, ChampionHero.DURATION);
// Buff.affect(hero, ChampionHero.Projecting.class, ChampionHero.DURATION);
// 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();
@ -257,6 +252,7 @@ public enum HeroClass {
}
hero.heroClass = this;
Talent.initClassTalents(hero);
Item i = new ClothArmor().identify();
@ -418,26 +414,6 @@ public enum HeroClass {
}
}
public String spritesheet2() {
if (SPDSettings.ClassSkin()) {
return Assets.Sprites.COMINGSOON;
}
switch (this) {
case WARRIOR: default:
return Assets.Sprites.WARRIOR;
case MAGE:
return Assets.Sprites.MAGE;
case ROGUE:
return Assets.Sprites.ROGUE;
case HUNTRESS:
return Assets.Sprites.HUNTRESS;
// case COMINGSOON:
// return Assets.Sprites.COMINGSOON;
}
}
public String spritesheet() {
switch (this) {
@ -453,19 +429,6 @@ public enum HeroClass {
// return Assets.Sprites.COMINGSOON;
}
}
public String splashArt(){
switch (this) {
case WARRIOR: default:
return Assets.Splashes.WARRIOR;
case MAGE:
return Assets.Splashes.MAGE;
case ROGUE:
return Assets.Splashes.ROGUE;
case HUNTRESS:
return Assets.Splashes.HUNTRESS;
}
}
public String[] perks() {
switch (this) {

View File

@ -5,14 +5,10 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import static com.shatteredpixel.shatteredpixeldungeon.Statistics.lanterfireactive;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bleeding;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.sprites.PoltergeistSprite;
import com.watabou.utils.Random;
@ -30,18 +26,8 @@ public class BlackHost extends Mob {
public int attackProc(Char var1, int var2) {
var2 = super.attackProc(var1, var2 / 2);
if (Random.Int(2) == 0) {
if(lanterfireactive) {
if (Random.Float() <= 0.04f && enemy instanceof Hero && hero.lanterfire < 55) {
((Hero) enemy).damageLantern(2);
hero.sprite.showStatus(0x808080, "2");
Buff.affect(var1, Bleeding.class).set((float)(var2));
Buff.affect(var1, Poison.class).set((float)(var2));
die(true);
}
}else{
Buff.affect(var1, Bleeding.class).set((float)(var2));
Buff.affect(var1, Poison.class).set((float)(var2));
}
}
return var2;

View File

@ -21,9 +21,7 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.level;
import static com.shatteredpixel.shatteredpixeldungeon.Statistics.lanterfireactive;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
@ -34,7 +32,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Freezing;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.effects.Lightning;
import com.shatteredpixel.shatteredpixeldungeon.effects.Splash;
import com.shatteredpixel.shatteredpixeldungeon.items.Gold;
@ -272,12 +269,6 @@ public abstract class Elemental extends Mob {
if (Random.Int( 2 ) == 0 && !level.water[enemy.pos]) {
Buff.affect( enemy, Burning.class ).reignite( enemy );
if (enemy.sprite.visible) Splash.at( enemy.sprite.center(), sprite.blood(), 5);
if(lanterfireactive) {
if (Random.Float() <= 0.06f && enemy instanceof Hero && hero.lanterfire < 80) {
((Hero) enemy).damageLantern(2);
hero.sprite.showStatus(0x808080, "2");
}
}
}
}

View File

@ -21,15 +21,11 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import static com.shatteredpixel.shatteredpixeldungeon.Statistics.lanterfireactive;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.StenchGas;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Ooze;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Ghost;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.FetidRatSprite;
@ -66,16 +62,7 @@ public class FetidRat extends Rat {
public int attackProc( Char enemy, int damage ) {
damage = super.attackProc( enemy, damage );
if (Random.Int(3) == 0) {
if(lanterfireactive) {
if (Random.Float() <= 0.2f && enemy instanceof Hero && hero.lanterfire < 100) {
((Hero) enemy).damageLantern(7);
hero.sprite.showStatus(0x808080, "7");
Buff.affect(enemy, Ooze.class).set( Ooze.DURATION );
die(true);
}
} else {
Buff.affect(enemy, Ooze.class).set( Ooze.DURATION );
}
}
return damage;

View File

@ -21,9 +21,6 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import static com.shatteredpixel.shatteredpixeldungeon.Statistics.lanterfireactive;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
@ -31,7 +28,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Fire;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Ghost;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
@ -92,14 +88,6 @@ public class GnollTrickster extends Gnoll {
} else
Buff.affect( enemy, Poison.class).set((effect-2) );
if(lanterfireactive) {
if (Random.Float() <= 0.2f && enemy instanceof Hero && hero.lanterfire < 100) {
((Hero) enemy).damageLantern(7);
hero.sprite.showStatus(0x808080, "7");
die(true);
}
}
}
return damage;
}

View File

@ -88,7 +88,6 @@ public class GreatCrab extends Crab {
if(lanterfireactive) {
if (Random.Float() <= 0.06f && enemy instanceof Hero && hero.lanterfire < 90) {
((Hero) enemy).damageLantern(1);
hero.sprite.showStatus(0x808080, "1");
}
}
} else {

View File

@ -21,15 +21,11 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import static com.shatteredpixel.shatteredpixeldungeon.Statistics.lanterfireactive;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.effects.Chains;
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
@ -65,20 +61,6 @@ public class Guard extends Mob {
HUNTING = new Hunting();
}
@Override
public int attackProc( Char enemy, int damage ) {
damage = super.attackProc( enemy, damage );
if(lanterfireactive){
if (Random.Float()<=0.1f && enemy instanceof Hero && hero.lanterfire < 85) {
((Hero) enemy).damageLantern(1);
hero.sprite.showStatus( 0x808080, "1");
}
} else {
super.attackProc( enemy, damage );
}
return damage;
}
@Override
public int damageRoll() {
return Random.NormalIntRange(4, 12);

View File

@ -21,6 +21,7 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.DHXD;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.SBSG;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
@ -554,10 +555,49 @@ public abstract class Mob extends Char {
@Override
public int attackProc(Char enemy, int damage) {
if(Dungeon.isChallenged(DHXD)){
damageAttackProcLanterMob();
}
return super.attackProc(enemy,
(int) (damage*(Dungeon.isChallenged(SBSG) ? (0.6f * scaleFactor) : 1)));
}
//写在Mob主类从而方便后续维护
private void damageAttackProcLanterMob() {
//近战判定
boolean isHero = enemy instanceof Hero;
//15%
boolean one = Random.Float() <= 0.15f;
//25%
boolean two = Random.Float() <= 0.25f;
//75%
boolean three = Random.Float() <= 0.75f;
//50%
boolean four = Random.Float() <= 0.50f;
//85%
boolean five = Random.Float() <= 0.85f;
//
boolean GhostQuestMob = this instanceof GreatCrab ||this instanceof GnollTrickster || this instanceof FetidRat;
//15%的老鼠 (-1) <85
if (isHero && this instanceof Rat && one && hero.lanterfire < 85) ((Hero) enemy).damageLantern(1);
//25%的监狱守卫 (-1) <85
if (isHero && this instanceof Guard && two && hero.lanterfire < 85) ((Hero) enemy).damageLantern(1);
//15%的豺狼萨满 (-2) <70
if (isHero && this instanceof Shaman && one && hero.lanterfire < 70) ((Hero) enemy).damageLantern(2);
//50%的幽灵任务怪 (-5) <95 NZND
if (isHero && GhostQuestMob && four && hero.lanterfire < 95) ((Hero) enemy).damageLantern(5);
//怨灵 75%的概率-6灯火 FINAL
if (isHero && this instanceof Wraith && three ) ((Hero) enemy).damageLantern(6); die(true);
//新生火元素 25%的概率-6灯火 <80
if (isHero && this instanceof Elemental.NewbornFireElemental && two && hero.lanterfire < 80 ) ((Hero) enemy).damageLantern(2);
//矿洞蜘蛛 15%的概率-3灯火 <70
if (isHero && this instanceof Wraith && one && hero.lanterfire < 70 ) ((Hero) enemy).damageLantern(3);
//矮人术士 85%的概率-5灯火 <70
if (isHero && this instanceof Warlock && five && hero.lanterfire < 50 ) ((Hero) enemy).damageLantern(5);
}
protected boolean doAttack( Char enemy ) {
if (sprite != null && (sprite.visible || enemy.sprite.visible)) {

View File

@ -5,14 +5,10 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import static com.shatteredpixel.shatteredpixeldungeon.Statistics.lanterfireactive;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Fire;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.BlastParticle;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.RedBloodMoon;
@ -63,14 +59,6 @@ public class MolotovHuntsman extends Mob {
int var8 = var7[var2];
if (!Dungeon.level.solid[var4 + var8]) {
GameScene.add(Blob.seed(var4 + var8, 2, Fire.class));
//TODO 血月矿洞炸弹猎人 低于75灯火 35%概率扣减1灯火
if(lanterfireactive) {
if (Random.Float() <= 0.35f && enemy instanceof Hero && hero.lanterfire < 75) {
((Hero) enemy).damageLantern(1);
hero.sprite.showStatus(0x808080, "1");
}
}
}
}

View File

@ -22,11 +22,9 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import static com.shatteredpixel.shatteredpixeldungeon.Statistics.lanterfireactive;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.Ratmogrify;
import com.shatteredpixel.shatteredpixeldungeon.sprites.RatSprite;
import com.watabou.utils.Bundle;
@ -43,21 +41,6 @@ public class Rat extends Mob {
maxLvl = 5;
}
@Override
public int attackProc( Char enemy, int damage ) {
damage = super.attackProc( enemy, damage );
if(lanterfireactive){
if (Random.Float()<=0.05f && enemy instanceof Hero && hero.lanterfire < 85) {
((Hero) enemy).damageLantern(1);
hero.sprite.showStatus( 0x808080, "1");
}
} else {
super.attackProc( enemy, damage );
}
return damage;
}
@Override
protected boolean act() {
if (Dungeon.level.heroFOV[pos] && hero.armorAbility instanceof Ratmogrify){

View File

@ -54,21 +54,6 @@ public abstract class Shaman extends Mob {
loot = Generator.Category.WAND;
lootChance = 0.03f; //initially, see lootChance()
}
//TODO 豺狼萨满近战攻击低于70灯火扣减1灯火
@Override
public int attackProc( Char enemy, int damage ) {
damage = super.attackProc( enemy, damage );
if(lanterfireactive){
if (Random.Float()<=0.1f && enemy instanceof Hero && hero.lanterfire < 70) {
((Hero) enemy).damageLantern(2);
hero.sprite.showStatus( 0x808080, "2");
}
} else {
super.attackProc( enemy, damage );
}
return damage;
}
@Override
public int damageRoll() {
@ -131,11 +116,10 @@ public abstract class Shaman extends Mob {
if (Random.Int( 2 ) == 0) {
if (enemy == Dungeon.hero) Sample.INSTANCE.play( Assets.Sounds.DEBUFF );
//TODO 低于70灯火 7%概率扣减1灯火(远程攻击)
//TODO 低于70灯火 15%概率扣减1灯火(远程攻击)
if(lanterfireactive){
if (Random.Float()<=0.07f && enemy instanceof Hero && hero.lanterfire < 70) {
if (Random.Float()<=0.15f && enemy instanceof Hero && hero.lanterfire < 70) {
((Hero) enemy).damageLantern(1);
hero.sprite.showStatus( 0x808080, "1");
}
} else {
debuff( enemy );

View File

@ -21,9 +21,6 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import static com.shatteredpixel.shatteredpixeldungeon.Statistics.lanterfireactive;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
@ -32,7 +29,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Dread;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.items.food.MysteryMeat;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
@ -125,14 +121,6 @@ public class Spinner extends Mob {
if (Random.Int(2) == 0) {
Buff.affect(enemy, Poison.class).set(Random.Int(7, 9) );
//TODO 矿洞蜘蛛 低于70灯火 15%概率扣减1灯火
if(lanterfireactive) {
if (Random.Float() <= 0.15f && enemy instanceof Hero && hero.lanterfire < 70) {
((Hero) enemy).damageLantern(1);
hero.sprite.showStatus(0x808080, "1");
}
}
webCoolDown = 0;
state = FLEEING;
}

View File

@ -136,7 +136,7 @@ public class Warlock extends Mob implements Callback {
zap();
next();
}
@Override
public void call() {
next();

View File

@ -21,13 +21,9 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import static com.shatteredpixel.shatteredpixeldungeon.Statistics.lanterfireactive;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.WraithSprite;
@ -56,23 +52,6 @@ public class Wraith extends Mob {
properties.add(Property.UNDEAD);
}
@Override
public int attackProc( Char enemy, int damage ) {
damage = super.attackProc( enemy, damage );
//TODO 40%概率扣减8灯火但扣减完成后立刻死亡
if(lanterfireactive){
if (Random.Float()<=0.4f && enemy instanceof Hero) {
((Hero) enemy).damageLantern(8);
hero.sprite.showStatus( 0x808080, "8");
die(true);
}
} else {
super.attackProc( enemy, damage );
}
return damage;
}
private static final String LEVEL = "level";
@Override

View File

@ -0,0 +1,268 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Boss;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.levels.ColdChestBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.DimandKingSprite;
import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Bundle;
import com.watabou.utils.Callback;
import com.watabou.utils.PathFinder;
import com.watabou.utils.Random;
import java.util.HashSet;
public class DiamondKnight extends Boss {
private int ventCooldown = 0;
private int phase = 1;
private final int OneHP = 179;
private final int TwoHP = 99;
private final int ThreeHP = 49;
private static final float TIME_TO_ZAP = 5f;
{
spriteClass = DimandKingSprite.class;
HP = HT = 240;
defenseSkill = 12;
initProperty();
initBaseStatus(14, 23, 33, 22, 200, 5, 12);
initStatus(50);
maxLvl = 30;
properties.add(Property.IMMOVABLE);
properties.add(Property.BOSS);
}
private static final String PHASE = "phase";
@Override
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
bundle.put(PHASE, phase);
bundle.put(VENT_COOLDOWN, ventCooldown);
}
@Override
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
phase = bundle.getInt(PHASE);
ventCooldown = bundle.getInt( VENT_COOLDOWN );
}
private static final float ATTACSWORD_DELAY = 5f;
private static final String VENT_COOLDOWN = "vent_cooldown";
@Override
protected boolean act() {
switch (phase){
case 1:
if(Random.Float()>0.64f){
} else {
super.act();
}
break;
case 2:
break;
case 3:
break;
case 4:
break;
}
return super.act();
}
public static class DarkBolt{}
//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;
private int left(int direction){
return direction == 0 ? 2 : direction-1;
}
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[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.FIRE,
ch.sprite,
cell,
null
);
}
MagicMissile.boltFromChar( ch.sprite.parent,
MagicMissile.FIRE,
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 );
}
}
private int right(int direction){
return direction == 2 ? 0 : direction+1;
}
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[direction], strength - 1.5f);
} else {
visualCells.add(cell);
}
} else if (!Dungeon.level.passable[cell])
visualCells.add(cell);
}
@Override
public int damageRoll() {
return Random.NormalIntRange( 10,20 );
}
@Override
protected boolean canAttack( Char enemy ) {
return new Ballistica( pos, enemy.pos, Ballistica.MAGIC_BOLT).collisionPos == enemy.pos;
}
protected boolean doAttack( Char enemy ) {
if (Dungeon.level.distance(pos, enemy.pos) <= 1) {
return super.doAttack(enemy);
} else {
boolean visible = fieldOfView[pos] || fieldOfView[enemy.pos];
if (visible) {
sprite.attack(enemy.pos);
spend(TIME_TO_ZAP);
shoot(this, enemy.pos);
}
return !visible;
}
}
public void damage(int dmg, Object src) {
if (!Dungeon.level.mobs.contains(this)){
return;
}
ColdChestBossLevel.State state = ((ColdChestBossLevel)Dungeon.level).pro();
int hpBracket = HT / 8;
int beforeHitHP = HP;
super.damage(dmg, src);
dmg = beforeHitHP - HP;
if ((beforeHitHP/hpBracket - HP/hpBracket) >= 2){
HP = hpBracket * ((beforeHitHP/hpBracket)-1) + 1;
}
LockedFloor lock = Dungeon.hero.buff(LockedFloor.class);
if (lock != null) {
int multiple = state == ColdChestBossLevel.State.MAZE_START ? 1 : 4;
lock.addTime(dmg*multiple);
}
if (HP == 0 && state == ColdChestBossLevel.State.VSBOSS_START) {
Actor.add(new Actor() {
{
actPriority = VFX_PRIO;
}
@Override
protected boolean act() {
Actor.remove(this);
((ColdChestBossLevel)Dungeon.level).progress();
return true;
}
});
return;
}
if (state == ColdChestBossLevel.State.MAZE_START && HP <= OneHP) {
HP = OneHP;
yell(Messages.get(this, "interesting"));
((ColdChestBossLevel) Dungeon.level).progress();
BossHealthBar.bleed(true);
}
}
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, Fire.class ) );
}
}
}
public void shoot(Char ch, int pos){
final Ballistica shot = new Ballistica( ch.pos, pos, Ballistica.PROJECTILE);
fx(shot, new Callback() {
@Override
public void call() {
onZap(shot);
}
}, ch);
}
}

View File

@ -1,77 +0,0 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import static com.shatteredpixel.shatteredpixeldungeon.Statistics.lanterfireactive;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.Ratmogrify;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.sprites.RatSprite;
import com.watabou.utils.Bundle;
import com.watabou.utils.Random;
import com.shatteredpixel.shatteredpixeldungeon.sprites.DimandKingSprite;
public class DimandKing extends Mob {
{
spriteClass = DimandKingSprite.class;
HP = HT = 8;
defenseSkill = 2;
maxLvl = 5;
}
@Override
public int attackProc( Char enemy, int damage ) {
damage = super.attackProc( enemy, damage );
if (lanterfireactive) {
if (Random.Float()<=0.05f && enemy instanceof Hero && hero.lanterfire < 85) {
((Hero) enemy).damageLantern(1);
hero.sprite.showStatus( 0x808080, "1");
}
} else {
super.attackProc( enemy, damage );
}
return damage;
}
@Override
protected boolean act() {
if (Dungeon.level.heroFOV[pos] && hero.armorAbility instanceof Ratmogrify){
alignment = Alignment.ALLY;
if (state == SLEEPING) state = WANDERING;
}
return super.act();
}
@Override
public int damageRoll() {
return Random.NormalIntRange( 1, 4 );
}
@Override
public int attackSkill( Char target ) {
return 8;
}
@Override
public int drRoll() {
return Random.NormalIntRange(0, 1);
}
private static final String RAT_ALLY = "rat_ally";
@Override
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
if (alignment == Alignment.ALLY) bundle.put(RAT_ALLY, true);
}
@Override
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
if (bundle.contains(RAT_ALLY)) alignment = Alignment.ALLY;
}
}

View File

@ -413,7 +413,7 @@ public class RedDragon extends NPC {
itemLevel = 3;
}
weapon.upgrade(itemLevel);
armor.upgrade(itemLevel);
//armor.upgrade(itemLevel);
RingT.upgrade(itemLevel);
//10% to be enchanted. We store it separately so enchant status isn't revealed early

View File

@ -12,6 +12,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LighS;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.audio.Sample;
@ -124,19 +125,24 @@ public class OilLantern extends Item {
}
public void activate(Hero hero, boolean voluntary) {
this.active = true;
updateSprite();
Buff.affect(hero, LighS.class);
hero.search(false);
if (voluntary) {
if (voluntary && hero.lanterfire >0) {
hero.spend(TIME_TO_USE);
hero.busy();
GLog.i(Messages.get(OilLantern.class,"lanteron"));
hero.sprite.operate(hero.pos);
this.active = true;
updateSprite();
Buff.affect(hero, LighS.class);
hero.search(false);
Sample.INSTANCE.play("sounds/snd_click.mp3");
updateQuickslot();
Dungeon.observe();
} else {
GameScene.flash(0x880000);
GLog.n(Messages.get(OilLantern.class,"black"));
}
Sample.INSTANCE.play("sounds/snd_click.mp3");
updateQuickslot();
Dungeon.observe();
}
public void deactivate(Hero hero, boolean voluntary) {

View File

@ -1,63 +0,0 @@
.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

@ -0,0 +1,47 @@
package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
/*
* 钻石制成的奇特大剑但因为剧烈碰撞而破碎了
* 剑身残留着钻石宝箱王的魔力因此对其他魔力有着莫名的亲和性
* 相比于其他武器这把武器会随着等级的提升增加更多伤害
* 这把武器攻击速度极慢
*/
public class SDBSword extends MeleeWeapon {
{
tier = 4;
DLY = 1.2f;
if (this.level() >= 6) {
image = ItemSpriteSheet.HHBlade;
} else {
image = ItemSpriteSheet.SDBlade;
}
ACC = 3f; //20% boost to accuracy
DLY = 2f; //3x speed
}
public int image() {
if (this.level() >= 6) {
image = ItemSpriteSheet.HHBlade;
} else {
image = ItemSpriteSheet.SDBlade;
}
return image;
}
public int min() {
return 6 + level();
}
public int max() {
return 20 + level() * 9;
}
}

View File

@ -2,13 +2,18 @@ package com.shatteredpixel.shatteredpixeldungeon.levels;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.DimandKing;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.DiamondKnight;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
//宝藏迷宫 10层
public class ColdChestBossLevel extends Level {
private State state;
private State pro;
public State pro(){
return pro;
}
//地图状态
public enum State {
@ -19,13 +24,16 @@ public class ColdChestBossLevel extends Level {
WIN
}
private static final int WIDTH = 35;
private final int HEIGHT = 35;
@Override
protected boolean build() {
setSize(35,35);
setSize(WIDTH,HEIGHT);
this.entrance = 0;
this.exit = 0;
//首次构建地图
state = State.START;
pro = State.START;
setMapStart();
return true;
@ -81,26 +89,14 @@ public class ColdChestBossLevel extends Level {
};
private void setMapStart() {
entrance = 35*2+17;
//exit = 0;
entrance = HOME;
map = WorldRoomShort.clone();
}
private void setMazeStart(Level level) {
}
public void progress(){
switch (state) {
case START:
for (Mob mob : (Iterable<Mob>) Dungeon.level.mobs.clone()) {
if (mob instanceof DimandKing) {
if(mob.HP <= 180){
state = State.MAZE_START;
}
}
}
switch (pro) {
}
}
@ -109,6 +105,36 @@ public class ColdChestBossLevel extends Level {
}
private static final int getBossDoor = WIDTH*11+17;
private static final int LDBossDoor = WIDTH*12+17;
private static final int HOME = WIDTH*2+17;
@Override
public void seal() {
super.seal();
DiamondKnight boss = new DiamondKnight();
boss.state = boss.WANDERING;
boss.pos = WIDTH*19+17;
GameScene.add( boss );
set( getBossDoor, Terrain.LOCKED_DOOR );
GameScene.updateMap( getBossDoor );
set( HOME, Terrain.EMPTY );
GameScene.updateMap( HOME );
Dungeon.observe();
}
@Override
public void occupyCell( Char ch ) {
super.occupyCell( ch );
//如果有生物来到BossDoor的下一个坐标且生物是玩家那么触发seal().
if (map[getBossDoor] == Terrain.DOOR && ch.pos == LDBossDoor && ch == Dungeon.hero) {
seal();
}
}
@Override
protected void createItems() {

View File

@ -472,7 +472,7 @@ public class GameScene extends PixelScene {
WndStory.showChapter( WndStory.ID_CHAPTONEEND );
break;
}
if (Dungeon.hero.isAlive()) {
if (Dungeon.hero.isAlive() && Dungeon.depth > 0 ) {
Badges.validateNoKilling();
}
break;

View File

@ -1,8 +1,6 @@
package com.shatteredpixel.shatteredpixeldungeon.sprites;
import com.badlogic.gdx.graphics.Texture;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.sprites.MobSprite;
import com.watabou.noosa.TextureFilm;
public class DimandKingSprite extends MobSprite {

View File

@ -752,6 +752,9 @@ public class ItemSpriteSheet {
public static final int WATERSOUL = BAGS+59;
public static final int WRALIPS = BAGS+60;
public static final int SDBlade = BAGS+74;
public static final int HHBlade = BAGS+75;
static{
assignItemRect(VIAL, 16, 16);
assignItemRect(POUCH, 14, 15);
@ -766,6 +769,7 @@ public class ItemSpriteSheet {
assignItemRect(SKNANO, 15, 14);
assignItemRect(WATERSOUL, 14, 14);
assignItemRect(WRALIPS, 16, 16);
assignItemRect(SDBlade, 15, 15);
}
private static final int MAINBOOKINDEX = xy(1, 37); //16 slots

View File

@ -21,6 +21,7 @@
package com.shatteredpixel.shatteredpixeldungeon.windows;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import static com.shatteredpixel.shatteredpixeldungeon.SPDSettings.HelpSettings;
import static com.shatteredpixel.shatteredpixeldungeon.Statistics.lanterfireactive;
@ -197,7 +198,7 @@ public class WndHero extends WndTabbed {
statSlot( Messages.get(HeroStat.class, "seed_dungeon"), DungeonSeed.convertToCode(Dungeon.seed) );
if(lanterfireactive){
statSlot( Messages.get(this, "lanterfire"), (hero.lanterfire) + "/" + 100 );
RestatSlot( Messages.get(this, "lanterfire"), (hero.lanterfire) + "/" + 100 );
}
pos += GAP;
@ -243,6 +244,23 @@ public class WndHero extends WndTabbed {
pos += GAP + txt.height();
}
private void RestatSlot( String label, String value ) {
RenderedTextBlock txt = PixelScene.renderTextBlock( label, 7 );
txt.setPos(0, pos);
add( txt );
txt = PixelScene.renderTextBlock( value, 7 );
txt.setPos(WIDTH * 0.5f, pos);
PixelScene.align(txt);
txt.hardlight(hero.lanterfire<=0 ? 0x808080 : Window.WHITE );
add( txt );
pos += GAP + txt.height();
}
private void statSlot( String label, int value ) {
statSlot( label, Integer.toString( value ) );
}
@ -263,7 +281,7 @@ public class WndHero extends WndTabbed {
this.add(pane);
pane.setRect(0,0,WIDTH, HEIGHT);
GameTracker gmt = Dungeon.hero.buff(GameTracker.class);
GameTracker gmt = hero.buff(GameTracker.class);
if(gmt != null){
String allInfo = gmt.itemInfo();
String[] result = allInfo.split("\n");
@ -367,7 +385,7 @@ public class WndHero extends WndTabbed {
private void setupList() {
Component content = buffList.content();
for (Buff buff : Dungeon.hero.buffs()) {
for (Buff buff : hero.buffs()) {
if (buff.icon() != BuffIndicator.NONE) {
BuffSlot slot = new BuffSlot(buff);
slot.setRect(0, pos, WIDTH, slot.icon.height());

View File

@ -58,10 +58,6 @@ public class WndStory extends Window {
private static final int WIDTH_L = 160;
private static final int MARGIN = 2;
private static final float bgR = 0.77f;
private static final float bgG = 0.73f;
private static final float bgB = 0.62f;
public static final int ID_FOREST = -1;
public static final int ID_SEWERS = 0;
public static final int ID_PRISON = 1;
@ -166,11 +162,39 @@ public class WndStory extends Window {
}
Game.scene().add( wnd );
lanterfireRoll();
Dungeon.chapters.add( id );
if(lanterfireactive) {
if (Dungeon.depth == 6){
//TODO 首次到达6层 给予1个增益Buff
}
}
public static void lanterfireRoll(){
if(lanterfireactive) {
if (Dungeon.depth == 6){
//TODO 首次到达6层 给予1个增益Buff
switch (Random.Int(4)){
case 0: default:
Buff.affect(hero, BlessNoMoney.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, BlessGoodSTR.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, BlessMobDied.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, BlessMixShiled.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, BlessImmune.class).set( (100), 1 );
break;
}
GLog.b(Messages.get(WndStory.class,"start"));
}
if (RollLevel()) {
//TODO 常规刷新
if (hero.lanterfire == 100){
switch (Random.Int(4)){
case 0: default:
Buff.affect(hero, BlessNoMoney.class).set( (100), 1 );
@ -188,269 +212,244 @@ public class WndStory extends Window {
Buff.affect(hero, BlessImmune.class).set( (100), 1 );
break;
}
GLog.b(Messages.get(WndStory.class,"start"));
}
if (RollLevel()) {
//TODO 常规刷新
if (hero.lanterfire == 100){
switch (Random.Int(4)){
case 0: default:
Buff.affect(hero, BlessNoMoney.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, BlessGoodSTR.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, BlessMobDied.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, BlessMixShiled.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, BlessImmune.class).set( (100), 1 );
break;
}
GLog.p(Messages.get(WndStory.class,"good"));
} else if (hero.lanterfire <= 99 && hero.lanterfire >= 90) {
switch (Random.Int(4)){
case 0: default:
Buff.affect(hero, BlessNoMoney.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, BlessGoodSTR.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, BlessMobDied.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, BlessMixShiled.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, BlessImmune.class).set( (100), 1 );
break;
}
GLog.p(Messages.get(WndStory.class,"good"));
} else if (hero.lanterfire <= 89 && hero.lanterfire >= 80 && Random.Float() <= 0.05f ) {
switch (Random.Int(5)){
case 0: default:
Buff.affect(hero, MagicGirlSayMoneyMore.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, MagicGirlSaySoftDied.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, MagicGirlSayCursed.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, MagicGirlSaySlowy.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, MagicGirlSayKill.class).set( (100), 1 );
break;
case 5:
Buff.affect(hero, MagicGirlSayNoSTR.class).set( (100), 1 );
break;
}
GLog.n(Messages.get(WndStory.class,"bad"));
} else if (hero.lanterfire <= 89 && hero.lanterfire >= 80 && Random.Float() <= 0.85f ) {
switch (Random.Int(4)){
case 0: default:
Buff.affect(hero, BlessNoMoney.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, BlessGoodSTR.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, BlessMobDied.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, BlessMixShiled.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, BlessImmune.class).set( (100), 1 );
break;
}
GLog.p(Messages.get(WndStory.class,"good"));
} else if (hero.lanterfire <= 89 && hero.lanterfire >= 80) {
GLog.b(Messages.get(WndStory.class,"normoal"));
} else if (hero.lanterfire <= 79 && hero.lanterfire >= 60 && Random.Float() <= 0.25f ) {
switch (Random.Int(5)){
case 0: default:
Buff.affect(hero, MagicGirlSayMoneyMore.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, MagicGirlSaySoftDied.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, MagicGirlSayCursed.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, MagicGirlSaySlowy.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, MagicGirlSayKill.class).set( (100), 1 );
break;
case 5:
Buff.affect(hero, MagicGirlSayNoSTR.class).set( (100), 1 );
break;
}
GLog.n(Messages.get(WndStory.class,"bad"));
} else if (hero.lanterfire <= 79 && hero.lanterfire >= 60 && Random.Float() <= 0.70f ) {
switch (Random.Int(4)){
case 0: default:
Buff.affect(hero, BlessNoMoney.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, BlessGoodSTR.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, BlessMobDied.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, BlessMixShiled.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, BlessImmune.class).set( (100), 1 );
break;
}
GLog.p(Messages.get(WndStory.class,"good"));
} else if (hero.lanterfire <= 79 && hero.lanterfire >= 60) {
GLog.b(Messages.get(WndStory.class,"normoal"));
} else if (hero.lanterfire <= 59 && hero.lanterfire >= 35 && Random.Float() <= 0.40f ) {
switch (Random.Int(5)){
case 0: default:
Buff.affect(hero, MagicGirlSayMoneyMore.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, MagicGirlSaySoftDied.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, MagicGirlSayCursed.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, MagicGirlSaySlowy.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, MagicGirlSayKill.class).set( (100), 1 );
break;
case 5:
Buff.affect(hero, MagicGirlSayNoSTR.class).set( (100), 1 );
break;
}
GLog.n(Messages.get(WndStory.class,"bad"));
} else if (hero.lanterfire <= 59 && hero.lanterfire >= 35 && Random.Float() <= 0.20f ) {
switch (Random.Int(4)){
case 0: default:
Buff.affect(hero, BlessNoMoney.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, BlessGoodSTR.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, BlessMobDied.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, BlessMixShiled.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, BlessImmune.class).set( (100), 1 );
break;
}
GLog.p(Messages.get(WndStory.class,"good"));
} else if (hero.lanterfire <= 59 && hero.lanterfire >= 35) {
GLog.b(Messages.get(WndStory.class,"normoal"));
} else if (hero.lanterfire <= 34 && hero.lanterfire >= 1 && Random.Float() <= 0.40f ) {
switch (Random.Int(5)){
case 0: default:
Buff.affect(hero, MagicGirlSayMoneyMore.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, MagicGirlSaySoftDied.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, MagicGirlSayCursed.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, MagicGirlSaySlowy.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, MagicGirlSayKill.class).set( (100), 1 );
break;
case 5:
Buff.affect(hero, MagicGirlSayNoSTR.class).set( (100), 1 );
break;
}
GLog.n(Messages.get(WndStory.class,"bad"));
} else if (hero.lanterfire <= 34 && hero.lanterfire >= 1 && Random.Float() <= 0.35f ) {
switch (Random.Int(4)){
case 0: default:
Buff.affect(hero, BlessNoMoney.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, BlessGoodSTR.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, BlessMobDied.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, BlessMixShiled.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, BlessImmune.class).set( (100), 1 );
break;
}
GLog.p(Messages.get(WndStory.class,"good"));
} else if (hero.lanterfire <= 34 && hero.lanterfire >= 1) {
GLog.b(Messages.get(WndStory.class,"normoal"));
} else if (hero.lanterfire <= 0 && Random.Float() <= 0.48f ) {
switch (Random.Int(5)){
case 0: default:
Buff.affect(hero, MagicGirlSayMoneyMore.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, MagicGirlSaySoftDied.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, MagicGirlSayCursed.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, MagicGirlSaySlowy.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, MagicGirlSayKill.class).set( (100), 1 );
break;
case 5:
Buff.affect(hero, MagicGirlSayNoSTR.class).set( (100), 1 );
break;
}
GLog.n(Messages.get(WndStory.class,"bad"));
} else if (hero.lanterfire <= 0 && Random.Float() <= 0.10f ) {
switch (Random.Int(4)){
case 0: default:
Buff.affect(hero, BlessNoMoney.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, BlessGoodSTR.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, BlessMobDied.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, BlessMixShiled.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, BlessImmune.class).set( (100), 1 );
break;
}
GLog.p(Messages.get(WndStory.class,"good"));
} else if (hero.lanterfire <= 0 ) {
GLog.b(Messages.get(WndStory.class,"normoal"));
}
GLog.p(Messages.get(WndStory.class,"good"));
} else if (hero.lanterfire <= 99 && hero.lanterfire >= 90) {
switch (Random.Int(4)){
case 0: default:
Buff.affect(hero, BlessNoMoney.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, BlessGoodSTR.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, BlessMobDied.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, BlessMixShiled.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, BlessImmune.class).set( (100), 1 );
break;
}
GLog.p(Messages.get(WndStory.class,"good"));
} else if (hero.lanterfire <= 89 && hero.lanterfire >= 80 && Random.Float() <= 0.05f ) {
switch (Random.Int(5)){
case 0: default:
Buff.affect(hero, MagicGirlSayMoneyMore.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, MagicGirlSaySoftDied.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, MagicGirlSayCursed.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, MagicGirlSaySlowy.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, MagicGirlSayKill.class).set( (100), 1 );
break;
case 5:
Buff.affect(hero, MagicGirlSayNoSTR.class).set( (100), 1 );
break;
}
GLog.n(Messages.get(WndStory.class,"bad"));
} else if (hero.lanterfire <= 89 && hero.lanterfire >= 80 && Random.Float() <= 0.85f ) {
switch (Random.Int(4)){
case 0: default:
Buff.affect(hero, BlessNoMoney.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, BlessGoodSTR.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, BlessMobDied.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, BlessMixShiled.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, BlessImmune.class).set( (100), 1 );
break;
}
GLog.p(Messages.get(WndStory.class,"good"));
} else if (hero.lanterfire <= 89 && hero.lanterfire >= 80) {
GLog.b(Messages.get(WndStory.class,"normoal"));
} else if (hero.lanterfire <= 79 && hero.lanterfire >= 60 && Random.Float() <= 0.25f ) {
switch (Random.Int(5)){
case 0: default:
Buff.affect(hero, MagicGirlSayMoneyMore.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, MagicGirlSaySoftDied.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, MagicGirlSayCursed.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, MagicGirlSaySlowy.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, MagicGirlSayKill.class).set( (100), 1 );
break;
case 5:
Buff.affect(hero, MagicGirlSayNoSTR.class).set( (100), 1 );
break;
}
GLog.n(Messages.get(WndStory.class,"bad"));
} else if (hero.lanterfire <= 79 && hero.lanterfire >= 60 && Random.Float() <= 0.70f ) {
switch (Random.Int(4)){
case 0: default:
Buff.affect(hero, BlessNoMoney.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, BlessGoodSTR.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, BlessMobDied.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, BlessMixShiled.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, BlessImmune.class).set( (100), 1 );
break;
}
GLog.p(Messages.get(WndStory.class,"good"));
} else if (hero.lanterfire <= 79 && hero.lanterfire >= 60) {
GLog.b(Messages.get(WndStory.class,"normoal"));
} else if (hero.lanterfire <= 59 && hero.lanterfire >= 35 && Random.Float() <= 0.40f ) {
switch (Random.Int(5)){
case 0: default:
Buff.affect(hero, MagicGirlSayMoneyMore.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, MagicGirlSaySoftDied.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, MagicGirlSayCursed.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, MagicGirlSaySlowy.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, MagicGirlSayKill.class).set( (100), 1 );
break;
case 5:
Buff.affect(hero, MagicGirlSayNoSTR.class).set( (100), 1 );
break;
}
GLog.n(Messages.get(WndStory.class,"bad"));
} else if (hero.lanterfire <= 59 && hero.lanterfire >= 35 && Random.Float() <= 0.20f ) {
switch (Random.Int(4)){
case 0: default:
Buff.affect(hero, BlessNoMoney.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, BlessGoodSTR.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, BlessMobDied.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, BlessMixShiled.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, BlessImmune.class).set( (100), 1 );
break;
}
GLog.p(Messages.get(WndStory.class,"good"));
} else if (hero.lanterfire <= 59 && hero.lanterfire >= 35) {
GLog.b(Messages.get(WndStory.class,"normoal"));
} else if (hero.lanterfire <= 34 && hero.lanterfire >= 1 && Random.Float() <= 0.40f ) {
switch (Random.Int(5)){
case 0: default:
Buff.affect(hero, MagicGirlSayMoneyMore.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, MagicGirlSaySoftDied.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, MagicGirlSayCursed.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, MagicGirlSaySlowy.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, MagicGirlSayKill.class).set( (100), 1 );
break;
case 5:
Buff.affect(hero, MagicGirlSayNoSTR.class).set( (100), 1 );
break;
}
GLog.n(Messages.get(WndStory.class,"bad"));
} else if (hero.lanterfire <= 34 && hero.lanterfire >= 1 && Random.Float() <= 0.35f ) {
switch (Random.Int(4)){
case 0: default:
Buff.affect(hero, BlessNoMoney.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, BlessGoodSTR.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, BlessMobDied.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, BlessMixShiled.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, BlessImmune.class).set( (100), 1 );
break;
}
GLog.p(Messages.get(WndStory.class,"good"));
} else if (hero.lanterfire <= 34 && hero.lanterfire >= 1) {
GLog.b(Messages.get(WndStory.class,"normoal"));
} else if (hero.lanterfire <= 0 && Random.Float() <= 0.48f ) {
switch (Random.Int(5)){
case 0: default:
Buff.affect(hero, MagicGirlSayMoneyMore.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, MagicGirlSaySoftDied.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, MagicGirlSayCursed.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, MagicGirlSaySlowy.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, MagicGirlSayKill.class).set( (100), 1 );
break;
case 5:
Buff.affect(hero, MagicGirlSayNoSTR.class).set( (100), 1 );
break;
}
GLog.n(Messages.get(WndStory.class,"bad"));
} else if (hero.lanterfire <= 0 && Random.Float() <= 0.10f ) {
switch (Random.Int(4)){
case 0: default:
Buff.affect(hero, BlessNoMoney.class).set( (100), 1 );
break;
case 1:
Buff.affect(hero, BlessGoodSTR.class).set( (100), 1 );
break;
case 2:
Buff.affect(hero, BlessMobDied.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, BlessMixShiled.class).set( (100), 1 );
break;
case 4:
Buff.affect(hero, BlessImmune.class).set( (100), 1 );
break;
}
GLog.p(Messages.get(WndStory.class,"good"));
} else if (hero.lanterfire <= 0 ) {
GLog.b(Messages.get(WndStory.class,"normoal"));
}
}
}
}
}