Update Beta-P3-PreTest1
This commit is contained in:
parent
e57e8e8cf0
commit
0c99e4a292
|
@ -5,8 +5,8 @@ buildscript {
|
|||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:7.0.4'
|
||||
classpath 'com.google.gms:google-services:4.3.13'
|
||||
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.1'
|
||||
classpath 'com.google.gms:google-services:4.3.15'
|
||||
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2'
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -17,7 +17,7 @@ allprojects {
|
|||
appPackageName = 'com.ansdomagiclingpixeldungeon.ling'
|
||||
|
||||
appVersionCode =700925
|
||||
appVersionName = '0.6.0.0-Beta21-p2.940-INDEV'
|
||||
appVersionName = '0.6.0.0-Beta21-p3-PreTest1'
|
||||
|
||||
appJavaCompatibility = JavaVersion.VERSION_1_8
|
||||
|
||||
|
|
BIN
core/src/main/assets/ADE.png
Normal file
BIN
core/src/main/assets/ADE.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 484 B |
|
@ -1,3 +1,20 @@
|
|||
#####MLPD-P3文本
|
||||
actors.mobs.bosses.crivusfruits.name=克里弗斯之果
|
||||
actors.mobs.bosses.crivusfruits.desc=这颗鲜红的果实将周围一切生物都化作自身的养分。身旁的触手会将不慎走进的小动物们绞杀,腐化成缠绕在四周的瘴气。但当它们感受到你手上拿着的提灯时,却表现出畏惧火焰的样子。\n\n极少有冒险者能对这株植物作出描述,在得到的只言片语中,你唯一能确定的就是“它是森林至暗的中心”。
|
||||
|
||||
actors.mobs.bosses.crivusfruits.notice=(触手正在不断蠕动,试图靠近你)
|
||||
actors.mobs.bosses.crivusfruits.anargy=(触手的蠕动变为猛烈抽搐,拍打中释放出更多有毒气体)
|
||||
actors.mobs.bosses.crivusfruits.died!!!=(所有藤蔓都停止了抽动,果实的颜色似乎更加鲜红了)
|
||||
actors.mobs.bosses.crivusfruits.!!!=克里弗斯之果正在汲取魔力释放范围更大的红色毒雾!
|
||||
actors.mobs.bosses.crivusfruits.dead=养分……汲取……失败……,果实破裂声中貌似夹杂着一丝悲鸣。
|
||||
|
||||
actors.mobs.bosses.crivusfruits$diedblobs.desc=一团红色的毒雾从克里弗斯之果周围散发而出,你的潜意识告诉你这种东西会对你造成极大的伤害。
|
||||
actors.mobs.bosses.crivusfruits$diedblobs.csed=果实爆开后迸射出一些气味清新的红色气体,用来做空气清新剂似乎挺不错的。
|
||||
|
||||
actors.mobs.bosses.crivusfruitslasher.name=魔化藤
|
||||
actors.mobs.bosses.crivusfruitslasher.desc=藤蔓没有智慧,它们的存在价值就是保护果实。不论是不小心靠近果实的“小动物”,还是企图清理枯藤更进一步的冒险者,都被这些藤蔓绞死成孕育果实的肥料了。
|
||||
|
||||
|
||||
###SPD1.3
|
||||
text.herostat.item_wnd_depth = 层数:
|
||||
text.herostat.item_wnd_mimic = 宝箱怪:
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
####MLPD-P3文本
|
||||
items.weapon.melee.lifetreesword.name=“倒悬的生命树”
|
||||
items.weapon.melee.lifetreesword.desc=克里弗斯之果破碎时,四周的藤蔓缠结在暴露出的种子上,形成剑的形状。剑身触碰到生物时会汲取他们的生命力提供给种子,期待着它再一结出猩红的果实。\n\n特别说明:克里弗斯之果Boss专武,每击杀_100只怪物_掉落一颗克里弗斯幼果。
|
||||
|
||||
|
||||
###MLPD
|
||||
items.lightblack.oilpotion.name= 油瓶
|
||||
items.lightblack.oilpotion.desc=里面蕴含了提灯需要的物质,在提灯熄灭前,它总能重新装填并让提灯重新发光。
|
||||
|
@ -568,9 +573,12 @@ items.artifacts.driedrose$ghosthero.dialogue_halls_4=这里的怪物太诡异了
|
|||
items.artifacts.driedrose$ghosthero.dialogue_halls_5=感觉到了吗?好像有什么东西在盯着我们。
|
||||
items.artifacts.driedrose$ghosthero.dialogue_halls_6=还好有火把,这里太暗了!
|
||||
|
||||
items.artifacts.driedrose$ghosthero.seen_goo_1=当心粘咕!
|
||||
items.artifacts.driedrose$ghosthero.seen_goo_2=有太多朋友死在这个家伙手上了,此仇必报!
|
||||
items.artifacts.driedrose$ghosthero.seen_goo_3=不能让这个魔障活着离开!
|
||||
//克里弗斯之果
|
||||
items.artifacts.driedrose$ghosthero.seen_crivuefruit_1=看来它就是森林过于茂盛的罪魁祸首……
|
||||
items.artifacts.driedrose$ghosthero.seen_crivuefruit_2=我们必须让这个魔物死去。
|
||||
items.artifacts.driedrose$ghosthero.seen_crivuefruit_3=你动不动就吃苹果的日子结束了!克里弗斯之果!
|
||||
|
||||
|
||||
items.artifacts.driedrose$ghosthero.seen_tengu_1=唯一剩下的囚犯是个危险的暗杀者。真应景……
|
||||
items.artifacts.driedrose$ghosthero.seen_tengu_2=我们被他困住了!
|
||||
items.artifacts.driedrose$ghosthero.seen_tengu_3=有关那个面具的鬼故事我听过不少……
|
||||
|
|
Binary file not shown.
BIN
core/src/main/assets/sprites/boss/DimandKing.png
Normal file
BIN
core/src/main/assets/sprites/boss/DimandKing.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.9 KiB |
BIN
core/src/main/assets/sprites/boss/FruitsCrivus.png
Normal file
BIN
core/src/main/assets/sprites/boss/FruitsCrivus.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.2 KiB |
Binary file not shown.
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 71 KiB |
|
@ -287,11 +287,16 @@ public class Assets {
|
|||
public static final String KEEPERKINGBOT = "sprites/npc/autoshop.png";
|
||||
|
||||
//BOSS
|
||||
|
||||
public static final String DIMK = "sprites/boss/DimandKing.png";
|
||||
|
||||
public static final String DIED = "sprites/items/died.png";
|
||||
|
||||
public static final String CRID = "sprites/boss/ColdGuard.png";
|
||||
|
||||
public static final String FRAS = "sprites/boss/FireMagicGirl.png";
|
||||
|
||||
public static final String CFAS = "sprites/boss/FruitsCrivus.png";
|
||||
public static final String NECROREDEX = "sprites/boss/rednecromancer_ex.png";
|
||||
public static final String SLIMEPRINCESS = "sprites/boss/SlimePrincess.png";
|
||||
public static final String ICEALICE = "sprites/boss/IceFireCrstal.png";
|
||||
|
|
|
@ -56,6 +56,7 @@ import com.shatteredpixel.shatteredpixeldungeon.journal.Notes;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.levels.CavesLevel;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.CityLevel;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.DeadEndLevel;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.ForestBossLevel;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.HallsLevel;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.LastLevel;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
|
@ -65,8 +66,6 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.NewCityBossLevel;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.levels.NewHallsBossLevel;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.PrisonBossLevel;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.PrisonLevel;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.SLMKingLevel;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.SewerBossLevel;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.SewerLevel;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.ShopBossLevel;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.ZeroLevel;
|
||||
|
@ -390,8 +389,7 @@ public class Dungeon {
|
|||
level = new SewerLevel();
|
||||
break;
|
||||
case 5:
|
||||
if((Statistics.boss_enhance & 0x1) != 0) level = new SLMKingLevel();
|
||||
else level = new SewerBossLevel();
|
||||
level = new ForestBossLevel();
|
||||
break;
|
||||
case 6:
|
||||
case 7:
|
||||
|
|
|
@ -36,6 +36,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.StormCloud;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Web;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Tengu;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.CrivusFruits;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.MagicalFireRoom;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
|
||||
|
@ -80,7 +81,7 @@ public class BlobImmunity extends FlavourBuff {
|
|||
immunities.add( StormCloud.class );
|
||||
immunities.add( ToxicGas.class );
|
||||
immunities.add( Web.class );
|
||||
|
||||
immunities.add( CrivusFruits.DiedBlobs.class );
|
||||
immunities.add(Tengu.FireAbility.FireBlob.class);
|
||||
}
|
||||
|
||||
|
|
|
@ -111,14 +111,13 @@ import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfMagicMissile;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfRegrowth;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfScale;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.SpiritBow;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.BlackDog;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Dagger;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.EndingBlade;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.FireFishSword;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Gauntlet;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Gloves;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.GreenSword;
|
||||
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.SkyShield;
|
||||
|
@ -215,7 +214,8 @@ public enum HeroClass {
|
|||
new MasterThievesArmband().quantity(1).identify().collect();
|
||||
new Dart().quantity(1).identify().collect();
|
||||
|
||||
new GreenSword().quantity(1).identify().collect();
|
||||
new LifeTreeSword().quantity(1).identify().collect();
|
||||
|
||||
new SkyShield().quantity(1).identify().collect();
|
||||
new SandalsOfNature().quantity(1).identify().collect();
|
||||
new GoldBAo().quantity(9999).identify().collect();
|
||||
|
@ -224,7 +224,6 @@ public enum HeroClass {
|
|||
new PotionOfLightningShiledX().quantity(1).identify().collect();
|
||||
new LevelTeleporter().quantity(1).identify().collect();
|
||||
new MobPlacer().quantity(1).identify().collect();
|
||||
new BlackDog().quantity(1).identify().collect();
|
||||
new RedBloodMoon().quantity(1).identify().collect();
|
||||
new KingBag().quantity(1).identify().collect();
|
||||
new PotionOfLiquidFlameX().quantity(100).identify().collect();
|
||||
|
|
|
@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
|
|||
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.RLPT;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.DimandKing;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
@ -48,7 +49,7 @@ public class Bestiary {
|
|||
return new ArrayList<>(Arrays.asList(
|
||||
Rat.class, Rat.class,
|
||||
Rat.class, OGPDZSLS.class, Snake.class,
|
||||
Snake.class,Snake.class,Snake.class));
|
||||
Snake.class,Snake.class,Snake.class, DimandKing.class));
|
||||
case 2:
|
||||
return new ArrayList<>(Arrays.asList(Rat.class,
|
||||
Rat.class, Rat.class, Gnoll.class, Gnoll.class,
|
||||
|
|
|
@ -0,0 +1,225 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses;
|
||||
|
||||
import static com.shatteredpixel.shatteredpixeldungeon.levels.ForestBossLevel.ForestBossLasherTWOPos;
|
||||
|
||||
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.blobs.Blob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Amok;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Dread;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Sleep;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.BlobEmitter;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.keys.CrystalKey;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.keys.IronKey;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.CrivusFruitsSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.Bundle;
|
||||
|
||||
//克里弗斯之果 本体
|
||||
public class CrivusFruits extends Mob {
|
||||
|
||||
//基本属性
|
||||
{
|
||||
spriteClass = CrivusFruitsSprite.class;
|
||||
|
||||
HP = HT = 120;
|
||||
defenseSkill = 4;
|
||||
|
||||
EXP = 20;
|
||||
|
||||
state = PASSIVE;
|
||||
|
||||
properties.add(Property.IMMOVABLE);
|
||||
properties.add(Property.MINIBOSS);
|
||||
}
|
||||
|
||||
//无敌也要扣减!
|
||||
public static class DiedDamager extends Buff {
|
||||
public int icon() {
|
||||
return BuffIndicator.COMBO;
|
||||
}
|
||||
@Override
|
||||
public boolean act() {
|
||||
if (target.alignment != Alignment.ENEMY){
|
||||
detach();
|
||||
}
|
||||
spend( TICK );
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void detach() {
|
||||
super.detach();
|
||||
for (Mob m : Dungeon.level.mobs){
|
||||
if (m instanceof CrivusFruits){
|
||||
m.damage((int)7.5, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInvulnerable(Class effect) {
|
||||
return this.HP > 36 && effect != DiedDamager.class;
|
||||
}
|
||||
|
||||
//对话框架
|
||||
@Override
|
||||
public void notice() {
|
||||
super.notice();
|
||||
if (!BossHealthBar.isAssigned()) {
|
||||
BossHealthBar.assignBoss(this);
|
||||
GLog.n(Messages.get(this, "notice"));
|
||||
this.sprite.showStatus(CharSprite.NEGATIVE, "!!!");
|
||||
for (Char ch : Actor.chars()){
|
||||
if (ch instanceof DriedRose.GhostHero){
|
||||
((DriedRose.GhostHero) ch).sayBoss();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static boolean GoTwoBoss = false;
|
||||
public static final String gotwoboss = "gotwoboss";
|
||||
|
||||
@Override
|
||||
public void storeInBundle(Bundle bundle) {
|
||||
super.storeInBundle(bundle);
|
||||
bundle.put(gotwoboss, GoTwoBoss);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void restoreFromBundle(Bundle bundle) {
|
||||
super.restoreFromBundle(bundle);
|
||||
GoTwoBoss = bundle.getBoolean(gotwoboss);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected boolean act() {
|
||||
GameScene.add(Blob.seed(pos, HP<36 ? 120 : 50, DiedBlobs.class));
|
||||
|
||||
//判定是否第一次加进入游戏
|
||||
if( Dungeon.hero.buff(LockedFloor.class) != null){
|
||||
notice();
|
||||
}
|
||||
state = PASSIVE;
|
||||
|
||||
//二阶段
|
||||
if( HP<65 && !GoTwoBoss){
|
||||
HP=HT=64;
|
||||
GLog.n(Messages.get(this,"anargy"));
|
||||
GoTwoBoss = true;
|
||||
GameScene.flash(0x808c8c8c);
|
||||
for (int i : ForestBossLasherTWOPos) {
|
||||
CrivusFruitsLasher csp = new CrivusFruitsLasher();
|
||||
csp.pos = i;
|
||||
GameScene.add(csp);
|
||||
}
|
||||
Sample.INSTANCE.play( Assets.Sounds.CHALLENGE );
|
||||
this.sprite.showStatus(CharSprite.NEGATIVE, "!!!");
|
||||
}
|
||||
|
||||
//三阶段
|
||||
if(HP==36){
|
||||
GameScene.flash(0x80009c9c);
|
||||
HP=HT=35;
|
||||
GLog.n(Messages.get(this,"died!!!"));
|
||||
GLog.w(Messages.get(this,"!!!"));
|
||||
Sample.INSTANCE.play( Assets.Sounds.CHALLENGE );
|
||||
this.sprite.showStatus(CharSprite.NEGATIVE, "!!!");
|
||||
}
|
||||
|
||||
return super.act();
|
||||
}
|
||||
|
||||
//红雾弥漫
|
||||
public static class DiedBlobs extends Blob implements Hero.Doom {
|
||||
@Override
|
||||
public String tileDesc() {
|
||||
return Messages.get(this, Dungeon.hero.buff(LockedFloor.class) != null? "desc" : "csed" );
|
||||
}
|
||||
@Override
|
||||
protected void evolve() {
|
||||
super.evolve();
|
||||
|
||||
int damage = 4;
|
||||
|
||||
Char ch;
|
||||
int cell;
|
||||
|
||||
for (int i = area.left; i < area.right; i++){
|
||||
for (int j = area.top; j < area.bottom; j++){
|
||||
cell = i + j*Dungeon.level.width();
|
||||
if (cur[cell] > 0 && (ch = Actor.findChar( cell )) != null) {
|
||||
if (!ch.isImmune(this.getClass())) {
|
||||
if( Dungeon.hero.buff(LockedFloor.class) != null) {
|
||||
//不为空为4 否则就是0
|
||||
ch.damage(Dungeon.hero.buff(LockedFloor.class) != null ? damage : 0, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void use( BlobEmitter emitter ) {
|
||||
super.use( emitter );
|
||||
|
||||
emitter.pour( Speck.factory( Speck.DIED ), 0.4f );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDeath() {
|
||||
//
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beckon(int cell) {
|
||||
//do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void die(Object cause) {
|
||||
super.die(cause);
|
||||
Dungeon.level.unseal();
|
||||
GameScene.bossSlain();
|
||||
GLog.n(Messages.get(this,"dead"));
|
||||
Dungeon.level.drop( new CrystalKey( Dungeon.depth ), pos ).sprite.drop();
|
||||
Dungeon.level.drop( new IronKey( Dungeon.depth ), pos-1 ).sprite.drop();
|
||||
Dungeon.level.drop( new IronKey( Dungeon.depth ), pos+1 ).sprite.drop();
|
||||
}
|
||||
|
||||
{
|
||||
immunities.add( Paralysis.class );
|
||||
immunities.add( Amok.class );
|
||||
immunities.add( Sleep.class );
|
||||
immunities.add( ToxicGas.class );
|
||||
immunities.add( DiedBlobs.class );
|
||||
immunities.add( Terror.class );
|
||||
immunities.add( Dread.class );
|
||||
immunities.add( Vertigo.class );
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,204 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses;
|
||||
|
||||
import static com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.CrivusFruits.GoTwoBoss;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.HalomethaneBurning;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.ForestBossLevel;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.RotLasherSprite;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
public class CrivusFruitsLasher extends Mob {
|
||||
|
||||
{
|
||||
spriteClass = RotLasherSprite.class;
|
||||
|
||||
HP = HT = GoTwoBoss ? 40 : 20;
|
||||
defenseSkill = 0;
|
||||
|
||||
EXP = 1;
|
||||
|
||||
loot = Generator.Category.SEED;
|
||||
lootChance = 0.35f;
|
||||
|
||||
state = WANDERING = new Waiting();
|
||||
|
||||
properties.add(Property.IMMOVABLE);
|
||||
properties.add(Property.MINIBOSS);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean act() {
|
||||
GameScene.add(Blob.seed(pos, GoTwoBoss ? 60 : 35, ToxicGas.class));
|
||||
|
||||
if(Dungeon.hero.buff(CrivusFruits.DiedDamager.class) == null){
|
||||
Buff.affect(this,CrivusFruits.DiedDamager.class);
|
||||
}
|
||||
|
||||
//二阶段开始瞬移,地狱绘图
|
||||
if(GoTwoBoss){
|
||||
if(Random.Float() < 0.4f && (enemy == null || !Dungeon.level.adjacent(pos, enemy.pos))){
|
||||
switch (Random.Int(14)){
|
||||
case 0: default:
|
||||
if(Dungeon.level.avoid[pos] || !Dungeon.level.passable[pos]
|
||||
|| Actor.findChar(pos) != null){
|
||||
ScrollOfTeleportation.appear(this, ForestBossLevel.WIDTH * 17 + 11);
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if(Dungeon.level.avoid[pos] || !Dungeon.level.passable[pos]
|
||||
|| Actor.findChar(pos) != null) {
|
||||
ScrollOfTeleportation.appear(this, ForestBossLevel.WIDTH * 15 + 13);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if(Dungeon.level.avoid[pos] || !Dungeon.level.passable[pos]
|
||||
|| Actor.findChar(pos) != null) {
|
||||
ScrollOfTeleportation.appear(this, ForestBossLevel.WIDTH * 23 + 13);
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if(Dungeon.level.avoid[pos] || !Dungeon.level.passable[pos]
|
||||
|| Actor.findChar(pos) != null) {
|
||||
ScrollOfTeleportation.appear(this, ForestBossLevel.WIDTH * 21 + 11);
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if(Dungeon.level.avoid[pos] || !Dungeon.level.passable[pos]
|
||||
|| Actor.findChar(pos) != null) {
|
||||
ScrollOfTeleportation.appear(this, ForestBossLevel.WIDTH * 15 + 19);
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
if(Dungeon.level.avoid[pos] || !Dungeon.level.passable[pos]
|
||||
|| Actor.findChar(pos) != null) {
|
||||
ScrollOfTeleportation.appear(this, ForestBossLevel.WIDTH * 17 + 21);
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
if(Dungeon.level.avoid[pos] || !Dungeon.level.passable[pos]
|
||||
|| Actor.findChar(pos) != null) {
|
||||
ScrollOfTeleportation.appear(this, ForestBossLevel.WIDTH * 21 + 21);
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
if(Dungeon.level.avoid[pos] || !Dungeon.level.passable[pos]
|
||||
|| Actor.findChar(pos) != null) {
|
||||
ScrollOfTeleportation.appear(this, ForestBossLevel.WIDTH * 23 + 19);
|
||||
}
|
||||
break;
|
||||
case 8:
|
||||
if(Dungeon.level.avoid[pos] || !Dungeon.level.passable[pos]
|
||||
|| Actor.findChar(pos) != null) {
|
||||
ScrollOfTeleportation.appear(this, ForestBossLevel.WIDTH * 24 + 7);
|
||||
}
|
||||
break;
|
||||
case 9:
|
||||
if(Dungeon.level.avoid[pos] || !Dungeon.level.passable[pos]
|
||||
|| Actor.findChar(pos) != null) {
|
||||
ScrollOfTeleportation.appear(this, ForestBossLevel.WIDTH * 23 + 3);
|
||||
}
|
||||
break;
|
||||
case 10:
|
||||
if(Dungeon.level.avoid[pos] || !Dungeon.level.passable[pos]
|
||||
|| Actor.findChar(pos) != null) {
|
||||
ScrollOfTeleportation.appear(this, ForestBossLevel.WIDTH * 27 + 4);
|
||||
}
|
||||
break;
|
||||
case 11:
|
||||
if(Dungeon.level.avoid[pos] || !Dungeon.level.passable[pos]
|
||||
|| Actor.findChar(pos) != null) {
|
||||
ScrollOfTeleportation.appear(this, ForestBossLevel.WIDTH * 24 + 27);
|
||||
}
|
||||
break;
|
||||
case 12:
|
||||
if(Dungeon.level.avoid[pos] || !Dungeon.level.passable[pos]
|
||||
|| Actor.findChar(pos) != null) {
|
||||
ScrollOfTeleportation.appear(this, ForestBossLevel.WIDTH * 29 + 27);
|
||||
}
|
||||
break;
|
||||
case 13: case 14:
|
||||
if(Dungeon.level.avoid[pos] || !Dungeon.level.passable[pos]
|
||||
|| Actor.findChar(pos) != null) {
|
||||
ScrollOfTeleportation.appear(this, ForestBossLevel.WIDTH * 25 + 23);
|
||||
}
|
||||
break;
|
||||
}
|
||||
spend( TICK*6 );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(this.HT!=HP) {
|
||||
HP = Math.min(HT, HP + 1);
|
||||
this.sprite.showStatus(CharSprite.POSITIVE, "+2");
|
||||
}
|
||||
|
||||
return super.act();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void damage(int dmg, Object src) {
|
||||
if (src instanceof Burning && !GoTwoBoss) {
|
||||
Buff.affect( this, HalomethaneBurning.class ).reignite( this, 100f );
|
||||
} else {
|
||||
super.damage(dmg, src);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int attackProc(Char enemy, int damage) {
|
||||
damage = super.attackProc( enemy, damage );
|
||||
Buff.affect( enemy, Cripple.class, 2f );
|
||||
return super.attackProc(enemy, damage);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean reset() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean getCloser(int target) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean getFurther(int target) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int damageRoll() {
|
||||
return Random.NormalIntRange(8, 15);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int attackSkill( Char target ) {
|
||||
return 15;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int drRoll() {
|
||||
return Random.NormalIntRange(0, 8);
|
||||
}
|
||||
|
||||
{
|
||||
immunities.add( ToxicGas.class );
|
||||
}
|
||||
|
||||
private class Waiting extends Mob.Wandering{}
|
||||
}
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
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;
|
||||
}
|
||||
}
|
|
@ -114,7 +114,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfTransfusion;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfWarding;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.AssassinsBlade;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.BattleAxe;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.BlackDog;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Crossbow;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Dagger;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Dairikyan;
|
||||
|
@ -350,10 +349,9 @@ public class Generator {
|
|||
WornShortsword.class,
|
||||
Gloves.class,
|
||||
Dagger.class,
|
||||
MagesStaff.class,
|
||||
BlackDog.class,
|
||||
MagesStaff.class
|
||||
};
|
||||
WEP_T1.probs = new float[]{ 1, 1, 1, 0, 0 };
|
||||
WEP_T1.probs = new float[]{ 1, 1, 1, 0, };
|
||||
|
||||
WEP_T2.classes = new Class<?>[]{
|
||||
Shortsword.class,
|
||||
|
|
|
@ -778,7 +778,7 @@ public class DriedRose extends Artifact {
|
|||
|
||||
switch(depth){
|
||||
case 0:
|
||||
yell( Messages.get( this, "seen_goo_" + Random.IntRange(1, 3) ));
|
||||
yell( Messages.get( this, "seen_crivuefruit_" + Random.IntRange(1, 3) ));
|
||||
break;
|
||||
case 1:
|
||||
yell( Messages.get( this, "seen_tengu_" + Random.IntRange(1, 3) ));
|
||||
|
|
|
@ -30,6 +30,8 @@ public class IceFishSword extends Weapon {
|
|||
tier = 6;
|
||||
ACC = 2.90f; //20% boost to accuracy
|
||||
DLY = 1.5f; //2x speed
|
||||
cursed = true;
|
||||
enchant(Enchantment.randomCurse());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -154,6 +156,11 @@ public class IceFishSword extends Weapon {
|
|||
|
||||
@Override
|
||||
public int STRReq(int lvl) {
|
||||
return Dungeon.depth/10+20;
|
||||
return Dungeon.depth/10+16;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int value() {
|
||||
return quantity * 500;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,21 +23,23 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee;
|
|||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
|
||||
public class BlackDog extends MeleeWeapon {
|
||||
public class LifeTreeSword extends MeleeWeapon {
|
||||
|
||||
{
|
||||
image = ItemSpriteSheet.BlackDog;
|
||||
image = ItemSpriteSheet.LifeTreeSword;
|
||||
|
||||
tier = 1;
|
||||
DLY = 0.6f; //2x speed
|
||||
tier = 3;
|
||||
|
||||
bones = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int max(int lvl) {
|
||||
return (int)(0.1f*(tier+1)) + //6 base, down from 10
|
||||
lvl*tier; //+1 per level, down from +2
|
||||
return 12+lvl;
|
||||
}
|
||||
|
||||
public int min(int lvl) {
|
||||
return 9+lvl*2;
|
||||
}
|
||||
|
||||
}
|
|
@ -108,7 +108,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfTransfusion;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfWarding;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.AssassinsBlade;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.BattleAxe;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.BlackDog;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Crossbow;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Dagger;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Dairikyan;
|
||||
|
@ -206,7 +205,7 @@ public enum Catalog {
|
|||
WEAPONS.seen.put( LockSword.class, false);
|
||||
WEAPONS.seen.put( SkyShield.class, false);
|
||||
WEAPONS.seen.put( Dairikyan.class, false);
|
||||
WEAPONS.seen.put( BlackDog.class, false);
|
||||
//WEAPONS.seen.put( BlackDog.class, false);
|
||||
WEAPONS.seen.put( IceFishSword.class, false);
|
||||
WEAPONS.seen.put( FireFishSword.class, false);
|
||||
|
||||
|
|
|
@ -0,0 +1,267 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.levels;
|
||||
|
||||
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.level;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.CrivusFruits;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.CrivusFruitsLasher;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Ripple;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfPurity;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
|
||||
import com.watabou.noosa.Game;
|
||||
import com.watabou.noosa.Group;
|
||||
import com.watabou.noosa.particles.Emitter;
|
||||
import com.watabou.noosa.particles.PixelParticle;
|
||||
import com.watabou.utils.ColorMath;
|
||||
import com.watabou.utils.PointF;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
//克里弗斯之果 5层
|
||||
public class ForestBossLevel extends Level {
|
||||
|
||||
@Override
|
||||
protected void createMobs() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void createItems() {
|
||||
drop( new PotionOfPurity(), WIDTH*15+19 );
|
||||
drop( new PotionOfPurity(), WIDTH*23+19 );
|
||||
drop( new PotionOfPurity(), WIDTH*15+13 );
|
||||
}
|
||||
|
||||
public static final int WIDTH = 32;
|
||||
private static final int HEIGHT = 32;
|
||||
|
||||
private static final short W = Terrain.WALL;
|
||||
private static final short L = Terrain.CHASM;
|
||||
private static final short M = Terrain.EMPTY;
|
||||
private static final short H = Terrain.EMPTY_SP;
|
||||
private static final short T = Terrain.STATUE;
|
||||
private static final short X = Terrain.DOOR;
|
||||
private static final short D = Terrain.PEDESTAL;
|
||||
|
||||
private static final short B = Terrain.WALL_DECO;
|
||||
private static final short C = Terrain.WATER;
|
||||
private static final short S = Terrain.LOCKED_DOOR;
|
||||
private static final short Q = Terrain.EXIT;
|
||||
private static final short A = Terrain.CRYSTAL_DOOR;
|
||||
private static final short I = Terrain.ENTRANCE;
|
||||
|
||||
|
||||
private static final int getBossDoor = WIDTH*9+16;
|
||||
private static final int LDBossDoor = WIDTH*10+16;
|
||||
|
||||
private static final int HOME = WIDTH + 16;
|
||||
|
||||
//首先诞生的8个触手 一阶段
|
||||
public static int[] ForestBossLasherPos = new int[]{
|
||||
WIDTH*17+11,
|
||||
WIDTH*15+13,
|
||||
WIDTH*23+13,
|
||||
WIDTH*21+11,
|
||||
|
||||
WIDTH*15+19,
|
||||
WIDTH*17+21,
|
||||
WIDTH*21+21,
|
||||
WIDTH*23+19,
|
||||
};
|
||||
|
||||
//2阶段4个主触手
|
||||
public static int[] ForestBossLasherTWOPos = new int[]{
|
||||
WIDTH*15+13,
|
||||
WIDTH*15+19,
|
||||
WIDTH*23+13,
|
||||
WIDTH*23+19,
|
||||
};
|
||||
|
||||
@Override
|
||||
public void occupyCell( Char ch ) {
|
||||
|
||||
super.occupyCell( ch );
|
||||
|
||||
//如果有生物来到BossDoor的下一个坐标,且生物是玩家,那么触发seal().
|
||||
if (map[getBossDoor] == Terrain.DOOR && ch.pos == LDBossDoor && ch == Dungeon.hero) {
|
||||
seal();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void seal() {
|
||||
super.seal();
|
||||
|
||||
for (int i : ForestBossLasherPos) {
|
||||
CrivusFruitsLasher csp = new CrivusFruitsLasher();
|
||||
csp.pos = i;
|
||||
GameScene.add(csp);
|
||||
}
|
||||
|
||||
CrivusFruits boss = new CrivusFruits();
|
||||
boss.state = boss.WANDERING;
|
||||
boss.pos = WIDTH*19+16;
|
||||
GameScene.add( boss );
|
||||
set( getBossDoor, Terrain.WALL );
|
||||
GameScene.updateMap( getBossDoor );
|
||||
set( HOME, Terrain.EMPTY );
|
||||
GameScene.updateMap( HOME );
|
||||
Dungeon.observe();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unseal() {
|
||||
super.unseal();
|
||||
|
||||
set( getBossDoor, Terrain.EMPTY );
|
||||
GameScene.updateMap( getBossDoor );
|
||||
|
||||
set( HOME, Terrain.ENTRANCE );
|
||||
GameScene.updateMap( HOME );
|
||||
|
||||
Dungeon.observe();
|
||||
}
|
||||
|
||||
//地图结构
|
||||
private static final int[] WorldRoomShort = {
|
||||
W,W,W,W,W,W,W,B,B,B,B,W,W,W,W,W,W,W,W,W,W,W,B,B,B,B,W,W,W,W,W,W,
|
||||
W,M,M,M,M,M,M,C,C,C,C,L,L,W,T,M,I,M,T,W,L,L,C,C,C,C,M,M,M,M,M,W,
|
||||
W,M,M,M,M,M,M,C,C,C,L,L,L,W,T,M,M,M,T,W,L,L,L,C,C,C,M,M,M,M,M,W,
|
||||
W,M,M,M,M,M,M,C,C,L,L,L,L,W,T,M,H,M,T,W,L,L,L,L,C,C,M,M,M,M,M,W,
|
||||
W,M,M,M,M,M,M,C,C,L,L,L,L,W,T,M,M,M,T,W,L,L,L,L,C,C,M,M,M,M,M,W,
|
||||
W,M,M,M,M,M,M,C,C,L,L,L,L,W,T,M,H,M,T,W,L,L,L,L,C,C,M,M,M,M,M,W,
|
||||
W,M,M,M,M,M,M,C,C,L,L,L,L,W,T,M,M,M,T,W,L,L,L,L,C,C,M,M,M,M,M,W,
|
||||
W,M,M,M,M,M,M,C,C,L,L,L,L,W,T,M,H,M,T,W,L,L,L,L,C,C,M,M,M,M,M,W,
|
||||
W,M,M,M,M,M,M,C,C,L,L,L,L,W,T,M,M,M,T,W,L,L,L,L,C,C,M,M,M,M,M,W,
|
||||
W,M,M,M,M,M,M,C,C,L,L,L,L,W,W,W,X,W,W,W,L,L,L,L,C,C,M,M,M,M,M,W,
|
||||
W,M,M,M,M,M,M,C,C,L,L,L,L,W,M,B,H,B,M,W,L,L,L,L,C,C,M,M,M,M,M,W,
|
||||
W,M,M,M,M,M,M,C,C,C,L,L,L,A,M,C,H,C,M,A,L,L,L,C,C,C,M,M,M,M,M,W,
|
||||
W,M,M,M,M,M,M,C,C,C,C,L,L,W,M,C,H,C,M,W,L,L,C,C,C,C,M,M,M,M,M,W,
|
||||
W,B,B,B,B,B,B,W,W,W,W,B,W,B,M,C,H,C,M,B,W,B,W,W,W,B,B,B,B,B,B,W,
|
||||
W,C,C,C,C,C,C,W,W,W,M,C,M,C,M,C,H,C,M,C,M,C,W,W,W,C,C,C,C,C,C,W,
|
||||
W,L,L,L,W,W,W,B,M,M,M,C,M,H,M,C,H,C,M,H,M,C,M,M,B,W,W,L,L,L,L,W,
|
||||
W,L,L,W,W,M,M,C,M,M,M,C,C,C,C,C,H,C,C,C,M,C,M,M,C,M,W,W,L,L,L,W,
|
||||
W,W,W,W,B,M,M,C,M,M,M,H,C,C,H,H,H,H,H,C,M,H,M,M,C,M,M,B,W,W,W,W,
|
||||
W,W,C,C,C,C,C,C,C,C,C,C,C,C,H,C,C,C,H,C,C,C,C,C,C,C,C,C,C,C,W,W,
|
||||
W,H,H,H,H,H,H,H,H,H,H,H,H,H,H,C,D,C,H,H,H,H,H,H,H,H,H,H,H,H,H,W,
|
||||
W,C,C,C,C,C,C,C,C,C,C,C,C,C,H,C,C,C,H,C,C,C,C,C,C,C,C,C,C,C,M,W,
|
||||
W,M,M,M,M,M,M,M,M,M,M,H,M,C,H,H,H,H,H,C,M,H,M,M,M,M,M,M,M,M,M,W,
|
||||
W,M,M,M,M,M,M,M,M,M,M,M,M,C,C,C,H,C,C,C,M,M,M,M,M,M,M,M,M,M,M,W,
|
||||
W,M,M,H,M,M,M,M,M,M,M,M,M,H,M,C,H,C,M,H,M,M,M,M,M,M,M,M,M,M,M,W,
|
||||
W,M,M,M,M,M,M,H,M,M,M,M,M,M,M,C,H,C,M,M,M,M,M,M,M,M,M,H,M,M,M,W,
|
||||
W,M,M,M,M,M,M,M,M,M,M,W,W,W,W,W,S,W,W,W,W,W,M,H,M,M,M,M,M,M,M,W,
|
||||
W,M,M,M,M,M,M,M,M,M,W,W,M,M,W,L,M,L,W,M,M,W,W,M,M,M,M,M,M,M,M,W,
|
||||
W,M,M,M,H,M,M,M,W,W,W,M,M,M,W,L,M,L,W,M,M,M,W,W,M,M,M,M,M,M,M,W,
|
||||
W,M,M,M,M,M,M,M,W,M,M,M,M,M,S,M,M,M,S,M,M,M,M,W,W,M,M,M,M,M,M,W,
|
||||
W,M,M,M,M,M,M,M,W,M,M,M,M,M,W,L,M,L,W,M,M,M,M,M,W,M,M,H,M,M,M,W,
|
||||
W,W,M,M,M,M,M,M,W,M,M,M,M,M,W,L,Q,L,W,M,M,M,M,M,W,M,M,M,M,M,W,W,
|
||||
W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,
|
||||
|
||||
};
|
||||
|
||||
private static class Sink extends Emitter {
|
||||
|
||||
private int pos;
|
||||
private float rippleDelay = 0;
|
||||
|
||||
private static final Emitter.Factory factory = new Factory() {
|
||||
|
||||
@Override
|
||||
public void emit( Emitter emitter, int index, float x, float y ) {
|
||||
WaterParticle p = (WaterParticle)emitter.recycle( WaterParticle.class );
|
||||
p.reset( x, y );
|
||||
}
|
||||
};
|
||||
|
||||
public Sink( int pos ) {
|
||||
super();
|
||||
|
||||
this.pos = pos;
|
||||
|
||||
PointF p = DungeonTilemap.tileCenterToWorld( pos );
|
||||
pos( p.x - 2, p.y + 3, 4, 0 );
|
||||
|
||||
pour( factory, 0.1f );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update() {
|
||||
if (visible == (pos < level.heroFOV.length && level.heroFOV[pos])) {
|
||||
|
||||
super.update();
|
||||
|
||||
if (!isFrozen() && (rippleDelay -= Game.elapsed) <= 0) {
|
||||
Ripple ripple = GameScene.ripple( pos + level.width() );
|
||||
if (ripple != null) {
|
||||
ripple.y -= DungeonTilemap.SIZE / 2f;
|
||||
rippleDelay = Random.Float(0.1f, 0.9f);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static final class WaterParticle extends PixelParticle {
|
||||
|
||||
public WaterParticle() {
|
||||
super();
|
||||
|
||||
acc.y = 50;
|
||||
am = 0.5f;
|
||||
|
||||
color( ColorMath.random( 0xb6ccc2, 0x3b6653 ) );
|
||||
size( 2 );
|
||||
}
|
||||
|
||||
public void reset( float x, float y ) {
|
||||
revive();
|
||||
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
|
||||
speed.set( Random.Float( -1, +1 ), 0 );
|
||||
|
||||
left = lifespan = 0.5f;
|
||||
}
|
||||
}
|
||||
|
||||
public static void addSewerVisuals( Level level, Group group ) {
|
||||
for (int i=0; i < level.length(); i++) {
|
||||
if (level.map[i] == Terrain.WALL_DECO) {
|
||||
group.add( new ForestBossLevel.Sink( i ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//构建地图
|
||||
protected boolean build() {
|
||||
setSize(WIDTH, HEIGHT);
|
||||
map = WorldRoomShort.clone();
|
||||
|
||||
this.entrance = WIDTH + 16 ;
|
||||
this.exit = WIDTH*30 + 16;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//加入粒子效果
|
||||
@Override
|
||||
public Group addVisuals() {
|
||||
super.addVisuals();
|
||||
addSewerVisuals(this, visuals);
|
||||
return visuals;
|
||||
}
|
||||
|
||||
public String tilesTex() {
|
||||
return Assets.Environment.TILES_SEWERS;
|
||||
}
|
||||
|
||||
public String waterTex() {
|
||||
return Assets.Environment.WATER_SEWERS;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -182,7 +182,7 @@ public class InterlevelScene extends PixelScene {
|
|||
fadeTime += 0.9f; //adds 1 second total
|
||||
//speed up transition when debugging
|
||||
} else if (DeviceCompat.isDebug()){
|
||||
fadeTime = 0.7f;
|
||||
fadeTime = 0.1f;
|
||||
}
|
||||
|
||||
SkinnedBlock bg = new SkinnedBlock(Camera.main.width, Camera.main.height, loadingAsset ){
|
||||
|
|
|
@ -0,0 +1,78 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.sprites;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
|
||||
import com.watabou.noosa.MovieClip;
|
||||
import com.watabou.noosa.TextureFilm;
|
||||
import com.watabou.noosa.particles.Emitter;
|
||||
|
||||
public class CrivusFruitsSprite extends MobSprite {
|
||||
|
||||
private Emitter cloud;
|
||||
|
||||
public CrivusFruitsSprite(){
|
||||
super();
|
||||
|
||||
perspectiveRaise = 0.2f;
|
||||
|
||||
texture( Assets.Sprites.CFAS );
|
||||
|
||||
TextureFilm frames = new TextureFilm( texture, 16, 16 );
|
||||
|
||||
idle = new MovieClip.Animation( 1, true );
|
||||
idle.frames( frames, 0);
|
||||
|
||||
run = new MovieClip.Animation( 1, true );
|
||||
run.frames( frames, 0 );
|
||||
|
||||
attack = new MovieClip.Animation( 1, false );
|
||||
attack.frames( frames, 0 );
|
||||
|
||||
die = new MovieClip.Animation( 8, false );
|
||||
die.frames( frames, 1, 2, 3, 4, 5, 6,6,6 );
|
||||
|
||||
play( idle );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link( Char ch ) {
|
||||
super.link( ch );
|
||||
|
||||
renderShadow = false;
|
||||
|
||||
if (cloud == null) {
|
||||
cloud = emitter();
|
||||
cloud.pour( Speck.factory(Speck.DIED), 0.7f );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void turnTo(int from, int to) {
|
||||
//do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update() {
|
||||
|
||||
super.update();
|
||||
|
||||
if (cloud != null) {
|
||||
cloud.visible = visible;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void die() {
|
||||
super.die();
|
||||
|
||||
if (cloud != null) {
|
||||
cloud.on = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int blood() {
|
||||
return 0xFF88CC44;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
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 {
|
||||
|
||||
public DimandKingSprite() {
|
||||
super();
|
||||
|
||||
texture(Assets.Sprites.DIMK);
|
||||
|
||||
TextureFilm frames = new TextureFilm( texture, 24, 24 );
|
||||
|
||||
idle = new Animation( 2, true );
|
||||
idle.frames( frames, 0, 0, 0, 1 );
|
||||
|
||||
run = new Animation( 10, true );
|
||||
run.frames( frames, 2, 3, 4);
|
||||
|
||||
attack = new Animation( 15, false );
|
||||
attack.frames( frames, 5,6,7,8);
|
||||
|
||||
die = new Animation( 3, false );
|
||||
die.frames( frames, 9,10,11 );
|
||||
|
||||
play( idle );
|
||||
}
|
||||
|
||||
}
|
|
@ -685,7 +685,7 @@ public class ItemSpriteSheet {
|
|||
public static final int BANDOLIER = BAGS+3;
|
||||
public static final int HOLSTER = BAGS+4;
|
||||
public static final int MagicBlueSword = BAGS+5;
|
||||
public static final int BlackDog = BAGS+6;
|
||||
public static final int LifeTreeSword = BAGS+6;
|
||||
public static final int RedBloodMoon = BAGS+7;
|
||||
public static final int DG1 = BAGS+8;
|
||||
public static final int DG2 = BAGS+9;
|
||||
|
|
|
@ -39,6 +39,7 @@ import java.util.ArrayList;
|
|||
public class vM0_6_7_X_Changes {
|
||||
|
||||
public static void addAllChanges(ArrayList<ChangeInfo> changeInfos) {
|
||||
add_v0_6_21_Changes(changeInfos);
|
||||
add_v0_6_20_Changes(changeInfos);
|
||||
add_v0_6_19_Changes(changeInfos);
|
||||
add_v0_6_18_Changes(changeInfos);
|
||||
|
@ -61,9 +62,37 @@ public class vM0_6_7_X_Changes {
|
|||
add_v0_6_1_Changes(changeInfos);
|
||||
add_v0_6_0_Changes(changeInfos);
|
||||
}
|
||||
|
||||
public static void add_v0_6_20_Changes( ArrayList<ChangeInfo> changeInfos ) {
|
||||
|
||||
public static void add_v0_6_20_Changes(ArrayList<ChangeInfo> changeInfos) {
|
||||
ChangeInfo changes = new ChangeInfo("v0.6.0.0-Beta21-p2.940", true, "");
|
||||
changes.hardlight(65535);
|
||||
changeInfos.add(changes);
|
||||
ChangeInfo changes2 = new ChangeInfo("新内容", false, (String) null);
|
||||
changes2.hardlight(65280);
|
||||
changeInfos.add(changes2);
|
||||
changes2.addButton(new ChangeButton(Icons.get(Icons.CHALLENGE_ON), "污泥浊水", "1.矮人层饮用漂浮药剂或者水灵药剂都会获得极速Buff,且每大层会额外产生食人鱼房间。\n-2.修复漂浮效果存在时还能获得Debuff的问题"));
|
||||
changes2.addButton(new ChangeButton(Icons.get(Icons.INFO), "圣诞与常规两个主界面Logo", "现在圣诞和常规有两个主界面logo,未来还会有更多。"));
|
||||
ChangeInfo changes3 = new ChangeInfo("修复", false, (String) null);
|
||||
changes3.hardlight(16776960);
|
||||
changeInfos.add(changes3);
|
||||
changes3.addButton(new ChangeButton(new Image("sprites/spinner.png", 144, 0, 16, 16), Messages.get(ChangesScene.class, "bugfixes", new Object[0]), Messages.get(vM0_6_7_X_Changes.class, "bug_06X40", new Object[0])));
|
||||
ChangeInfo changes4 = new ChangeInfo("重制", false, (String) null);
|
||||
changes4.hardlight(16711680);
|
||||
changeInfos.add(changes4);
|
||||
changes4.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.SKELETONGOLD), "Boss重制计划", "冰雪魔女,钻石宝箱王,矮人大师,Yog-Zot,史莱姆王将在完全重制后重新加入,并且可能会改名。且弃用注解版的Boss。并且现在Boss终端暂时暂停使用。"));
|
||||
changes4.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG20), "教程重制计划", "教程文档正在返修,敬请期待"));
|
||||
ChangeInfo changes5 = new ChangeInfo("调整", false, (String) null);
|
||||
changes5.hardlight(8421504);
|
||||
changeInfos.add(changes5);
|
||||
changes5.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.REDDRAGON), "核子可乐", "核子可乐现在不能在红龙之王处被获得,但会在未来的娱乐模式中加入。"));
|
||||
changes5.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG26), "玫瑰秘卷", "玫瑰秘卷无敌时间从35回合改为5回合,且不能在此期间使用吸血圣杯。制造配方能量消耗从20改为14"));
|
||||
changes5.addButton(new ChangeButton(Icons.get(Icons.CHALLENGE_OFF), "挑战重制计划", "药水癔症,基因突变,暴力Boss将会在未来重新加入,现在暂时禁用!"));
|
||||
changes5.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG24), "极度秘卷", "暂时移除,将在未来加入。"));
|
||||
changes5.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.ICEFISHSWORD), "尚方宝剑", "初始力量变为20,每10大层进行+1力量,成长面板调整,攻击特效从100%改为20%有几率触发。"));
|
||||
}
|
||||
|
||||
public static void add_v0_6_21_Changes( ArrayList<ChangeInfo> changeInfos ) {
|
||||
ChangeInfo changes = new ChangeInfo("v0.6.0.0-Beta21-p2.950", true, "");
|
||||
changes.hardlight(Window.TITLE_COLOR);
|
||||
changeInfos.add(changes);
|
||||
|
||||
|
@ -71,50 +100,18 @@ public class vM0_6_7_X_Changes {
|
|||
changes.hardlight(Window.GREEN_COLOR);
|
||||
changeInfos.add(changes);
|
||||
|
||||
changes.addButton(new ChangeButton(Icons.get(Icons.CHALLENGE_ON), ("污泥浊水"),
|
||||
("1.矮人层饮用漂浮药剂或者水灵药剂都会获得极速Buff,且每大层会额外产生食人鱼房间。" +
|
||||
"\n-2.修复漂浮效果存在时还能获得Debuff的问题" )));
|
||||
|
||||
changes.addButton(new ChangeButton(Icons.get(Icons.INFO), ("圣诞与常规两个主界面Logo"),
|
||||
("现在圣诞和常规有两个主界面logo,未来还会有更多。" )));
|
||||
|
||||
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_06X40")));
|
||||
|
||||
changes = new ChangeInfo("重制", false, null);
|
||||
changes.hardlight(Window.ANSDO_COLOR);
|
||||
changeInfos.add(changes);
|
||||
|
||||
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.SKELETONGOLD), ("Boss重制计划"),
|
||||
("冰雪魔女,钻石宝箱王,矮人大师,Yog-Zot,史莱姆王将在完全重制后重新加入,并且可能会改名。且弃用注解版的Boss。并且现在Boss终端暂时暂停使用。" )));
|
||||
|
||||
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG20), ("教程重制计划"),
|
||||
("教程文档正在返修,敬请期待" )));
|
||||
changes.addButton(new ChangeButton(new Image("ADE.png", 0, 0, 32, 32),
|
||||
("ADE环境部署成功"),
|
||||
("AndroidIDE+AIDE综合部署,现在作者可以手机/电脑协同开发,也可以避免部分时候遇到一些重大bug没有代码而难以处理的问题")));
|
||||
|
||||
changes = new ChangeInfo("调整", false, null);
|
||||
changes.hardlight(Window.CBLACK);
|
||||
changeInfos.add(changes);
|
||||
|
||||
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.REDDRAGON), ("核子可乐"),
|
||||
("核子可乐现在不能在红龙之王处被获得,但会在未来的娱乐模式中加入。" )));
|
||||
|
||||
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG26), ("玫瑰秘卷"),
|
||||
("玫瑰秘卷无敌时间从35回合改为5回合,且不能在此期间使用吸血圣杯。制造配方能量消耗从20改为14" )));
|
||||
|
||||
changes.addButton(new ChangeButton(Icons.get(Icons.CHALLENGE_OFF), ("挑战重制计划"),
|
||||
("药水癔症,基因突变,暴力Boss将会在未来重新加入,现在暂时禁用!" )));
|
||||
|
||||
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG24), ("极度秘卷"),
|
||||
("暂时移除,将在未来加入。" )));
|
||||
|
||||
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.ICEFISHSWORD), ("尚方宝剑"),
|
||||
("初始力量变为20,每10大层进行+1力量,成长面板调整,攻击特效从100%改为20%有几率触发。" )));
|
||||
("尚方宝剑现在力量初始为16,但是必定获得一个随机诅咒,商人对它的价值提升" )));
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static void add_v0_6_19_Changes( ArrayList<ChangeInfo> changeInfos ) {
|
||||
|
@ -872,8 +869,5 @@ public class vM0_6_7_X_Changes {
|
|||
changes.addButton(new ChangeButton(new FlameBoiSprite(), ("火焰机器人"),
|
||||
("移除火焰机器人在常规局的出现,仅出现在支离破碎的精英怪概率里面")));
|
||||
|
||||
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.BlackDog), ("黑狗爪"),
|
||||
("移除黑狗爪,它已不再有当年的威风")));
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user