Update Beta21.p2

There is still much to be done.
This commit is contained in:
LingASDJ 2022-10-06 00:23:23 +08:00
parent 8529cb823b
commit 0185668fcb
54 changed files with 1402 additions and 383 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@ -6,6 +6,27 @@ text.herostat.item_wnd_cursed = 诅咒的
text.herostat.item_basic = 常规:
text.herostat.item_enter = 查看物品生成
actors.buffs.puresoul.lanter=光芒前路
actors.buffs.puresoul.desc_intro_lanter=你的信心就犹如你的灯火一样,光芒且明亮。\n\n当前灯火值%s点\n\n
actors.buffs.puresoul.desc=灯火前行,光芒前路。没有什么东西可以影响到你。
### Magic Say debuffs
actors.buffs.magicgirldebuff.magicgirlsaynostr.name=魔女的低语-无力
actors.buffs.magicgirldebuff.magicgirlsaynostr.desc=无力将会吞噬你自己,而幕后黑手仍然在背后暗暗发笑。\n\n本大层力量将会-3点下一大层恢复。
actors.buffs.magicgirldebuff.magicgirlsaycursed.name=魔女的低语-束缚
actors.buffs.magicgirldebuff.magicgirlsaycursed.desc=束缚只是我的一个考验,而失去信心的你。想必比我这个考验更可怕吧。\n\n本大层装备会被诅咒下一大层失效
actors.buffs.magicgirldebuff.magicgirlsaykill.name=魔女的低语-审判
actors.buffs.magicgirldebuff.magicgirlsaykill.desc=灯火摇摆不定,朦胧中你似乎看见了一个魔女向你挥起了剑。(一切是你们咎由自取)\n\n本大层怪物近战伤害提升10%
actors.buffs.magicgirldebuff.magicgirlsayslowy.name=魔女的低语-迟钝
actors.buffs.magicgirldebuff.magicgirlsayslowy.desc=缓慢的走向死亡吧……\n\n本大层英雄移动1回合相当于3回合
actors.buffs.magicgirldebuff.magicgirlsaysoftdied.name=魔女的低语-软弱
actors.buffs.magicgirldebuff.magicgirlsaysoftdied.desc=软弱不是你的缺点,恐惧才是!\n\n本大层所有被护甲减免过的物理伤害增加5%
###MLPD
actors.mobs.bosses.crossdiedtower.dead=控制目标已丢失,已自动摧毁……
actors.mobs.bosses.crossdiedtower.name=激光十字晶柱
@ -27,7 +48,8 @@ actors.mobs.bosses.firemagicdied.defeated=%s,你确实是被她选中的人,现
actors.mobs.bosses.firemagicdied.life=命运轮回!
actors.mobs.bosses.firemagicdied.dead=死驱影熵!
actors.mobs.bosses.firemagicdied.losing=……
actors.mobs.bosses.firemagicdied.enraged=现在,你的试炼才刚刚开始!
actors.mobs.bosses.firemagicdied.enraged=很好,我也要拿出我的全部实力了!
actors.mobs.bosses.firemagicdied.xslx=水晶的力量已经被完全激活,摧毁水晶!!!
actors.mobs.bosses.firemagicdied.rankings_desc=在莲娜的试炼中不幸消逝……
actors.mobs.bosses.firemagicdied$yogscanhalf.name=???
actors.mobs.bosses.firemagicdied$yogscanhalf.rankings_desc=在莲娜的试炼中不幸消逝……
@ -38,6 +60,7 @@ actors.mobs.bosses.firemagicdied.teleport_1=归于虚无……
actors.mobs.bosses.firemagicdied.teleport_2=……最终肃清
actors.mobs.bosses.firemagicdied.lifelink_1=生命链接
actors.mobs.bosses.firemagicdied.lifelink_2=生命之歌
actors.mobs.bosses.firemagicdied.dixsdf=很好,你已经通过我的考验了!
items.quest.backgokey.name=回溯之书
items.quest.backgokey.desc=当你做好准备后,便要与雪凛峡谷告别了……
@ -94,9 +117,12 @@ actors.buffs.watersoulx.desc=水灵的祝福已经在你身上,现在你可以
actors.mobs.lb.blacksoul.name=暗影
actors.mobs.lb.blacksoul.desc=由于重生十字架的缘故,因此你再次重生了。但你先前的东西都被自己的暗影亡魂夺走了,杀死它,夺回自己的一切!
actors.mobs.bosses.crystaldiedtower.name=神秘结晶
actors.mobs.bosses.crystaldiedtower.name=神秘结晶-未激活
actors.mobs.bosses.crystaldiedtower.desc=来自于雪凛峡谷商人总部的神秘结晶……,据说激活后十分危险!
actors.mobs.bosses.crystallingtower.name=元素结晶-已激活
actors.mobs.bosses.crystallingtower.desc=神秘的元素结晶已经被魔女完全激活,正是它让魔女所向披靡!摧毁它!
text.herostat.hunger = 饥饿
text.herostat.skill = 命中/闪避
@ -782,7 +808,7 @@ actors.buffs.championenemy$blessed.desc=天佑精英拥有 200% 额外精准与
actors.buffs.championenemy$growing.name=成长精英
actors.buffs.championenemy$growing.desc=成长精英拥有会稳步增长的额外精准、躲避、近战伤害与伤害减免。\n\n当前精准、躲避、近战伤害加成%1$d%%\n当前伤害减免%2$d%%
actors.buffs.championenemy$halo.name=鬼磷精英
actors.buffs.championenemy$halo.desc=鬼磷精英造成 65% 额外近战伤害,会使用更强大的磷火点燃攻击目标,免疫火焰,免疫磷火,且会在死亡时引燃周遭
actors.buffs.championenemy$halo.desc=鬼磷精英造成 15% 额外近战伤害,会使用更强大的磷火点燃攻击目标,免疫火焰,免疫磷火。
actors.buffs.charm.name=魅惑
actors.buffs.charm.heromsg=你被魅惑了!
@ -987,7 +1013,7 @@ actors.buffs.stamina.desc=你感受到了体内无尽的精力,让你可以以
actors.buffs.vulnerable.name=易伤
actors.buffs.vulnerable.heromsg=你感到外界的伤害愈加疼痛!
actors.buffs.vulnerable.desc=易伤魔法会使得目标受到所有被护甲减免过的物理伤害增加33%%。\n\n易伤的剩余时长%s回合。
actors.buffs.vulnerable.desc=易伤魔法会使得目标受到所有被护甲减免过的物理伤害增加33%。\n\n易伤的剩余时长%s回合。
actors.buffs.terror.name=恐惧
actors.buffs.terror.desc=恐惧是使敌人陷入不可控制的恐慌的操纵性魔法。 \n\n恐惧中的角色会远离自己的敌人试图和敌人隔开尽可能多的门或墙。然而疼痛的冲击则会减少恐惧的持续时间。\n\n剩余的恐惧效果持续时长%s

View File

@ -87,6 +87,7 @@ badges$badge.champion_5x=救世之主\n\n_开启10项以上挑战通关\n\n[不
badges$badge.unlock_mage=解锁法师
badges$badge.unlock_rogue=解锁盗贼
badges$badge.unlock_huntress=解锁女猎手
badges$badge.kill_dm=取得钻石宝箱王的宝藏
badges$badge.rlpt=_支离破碎征服者_\n\n开启挑战并击败古神\n\n_奖励0层随机神器(四大基座上)_
badges$badge.sbdjs=风暴袭来,未完待续\n\n你通过它成功离开却不知外面风暴袭来\n\n水晶之心仍然在你手中闪闪发光,或许,这事还没完!
badges$badge.kill_mg=击败冰雪魔女-冬铃\n\n冰雪之地的女王\n\n_奖励0层额外十字架(四大基座上,与DM720不叠加)_
@ -116,7 +117,7 @@ challenges.aquaphobia_desc=你已经尝试了被水神祝福后的逍遥自在
challenges.champion_enemies=_精英战场_
challenges.champion_enemies_desc=会升级的不止你一个!\n\n・普通敌人刷出时有 1/8 \
的机率拥有特殊的精英属性。\n・精英敌人刷出时会立即醒来。\n・精英敌人免疫腐化效果。\n\n精英敌人有七种\n_烈焰橙色_ 近战伤害 \
+25% 且带有点燃效果,免疫火焰,死亡时引燃周围。\n_索敌紫色_ 近战伤害 +25%,近战范围 +8。\n_敌法绿色_ 受到伤害 -25%,拥有魔法免疫。\n_巨型蓝色_ 受到伤害 -75%,近战范围 +1无法进入门与过道。\n_祝福黄色_ 精准与躲避 +200%。\n_成长红色_ 精准、躲避、攻击伤害与有效生命值 +20%。每过 3 回合会再增长 1%。\n_鬼磷天蓝色_ 近战伤害 +65% 且带有磷火效果,免疫火焰与磷火,死亡时引燃周围
+25% 且带有点燃效果,免疫火焰,死亡时引燃周围。\n_索敌紫色_ 近战伤害 +25%,近战范围 +8。\n_敌法绿色_ 受到伤害 -25%,拥有魔法免疫。\n_巨型蓝色_ 受到伤害 -75%,近战范围 +1无法进入门与过道。\n_祝福黄色_ 精准与躲避 +200%。\n_成长红色_ 精准、躲避、攻击伤害与有效生命值 +20%。每过 3 回合会再增长 1%。\n_鬼磷天蓝色_ 近战伤害 +15% 且带有磷火效果,免疫火焰与磷火
challenges.stronger_bosses=Π梦魇Boss
challenges.stronger_bosses_desc=这项挑战让挑战 Boss 变得更有挑战性了!\n\n_粘咕_生命值 +20%\n_-_ 水中恢复量增长,每回合恢复 3 点生命\n_-_ 爆发攻击蓄力时间由 2 回合缩短至 1 回合\n_天狗_生命 +25%\n_-_ 第一阶段:陷阱更加致命\n_-_ 第二阶段:技能频率更高\n_钻石宝箱王_: 生命+20% \n_-_ 整场战斗出现额外技能\n_DM-300_生命 +60%\n_-_ 能量塔更坚固。\n_-_ 技能频率更高,威力也更强大\n_-_ 超载时移动速度更高\n_-_ 击败时必掉落荆棘斗篷\n_矮人国王:_生命 +50%\n_-_ 整场战斗内召唤的随从都更强大\n_-_ 第一阶段:技能与召唤频率都更高\n_-_ 第二阶段:每轮额外召唤两个随从\n_-_ 第三阶段:生命值 +100%,召唤频率更高\n_Yog-Dzewa:_\n_-_ 同时召唤两个古神之拳!\n_-_ 激光攻击伤害 +60%\n_-_ 召唤更强大的随从
actors.char.aquaphobia=你受到了来自水的伤害!

View File

@ -467,4 +467,6 @@ ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x28=-1.修复了矮人大师的问题
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x29=-1.修复了不抢劫回归地牢也能获得东西的问题\n-2.修复了从雪凛峡谷回来后复活失效的问题
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x30=-1.修复了浊焰魔女的错误崩溃\n-2.修复了终焉的错误生成\n-3.红龙之王机制改变,老存档已无法加载,请重新开启新档
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x31=-P1.5\n1.修复了终焉的掉率问题\n2.修复其他崩溃\n3.修复了钥匙剑的面板问题\n\nP1.4\n1.修复了徽章崩溃的问题\n-2.修复了浊焰魔女崩溃的问题\n-3.修复了终焉无法正常使用的问题
//ui.changelist.mlpd.vm0_5_x_changes.xxx//

View File

@ -2,8 +2,12 @@ windows.textchallenges.seed_custom_title = 种子
windows.textchallenges.hint = 不输入即为随机种子
windows.textchallenges.delete_seed_input = 清除
windows.wndsettings$datatab.firebase=FireBase数据提交
windows.wndsettings$displaytab.firebase_active=FireBase数据提交
windows.wndsettings$displaytab.firebase_desc=FireBase是一款由_Google_推出的一种开发者服务。Ling在魔绫这边添加了_FireBase崩溃日志收集报告_。\n当你尚未开启此功能时你的_所有崩溃报告都会保存在本地Data数据区域(使用Root才能访问)_\n\n当你开启本功能后你在魔绫游玩的所有崩溃报告将会在下次启动魔绫一并提交到程序后台以便JDSALing我维护。\n-开启此功能代表你同意提交你的崩溃数据和Δ手机的基本公开信息Δ_(手机型号,ROOT权限检测,安卓版本,运存检测,屏幕方向,手机内存)_,同时非常感谢你开启此功能以供Ling后续维护魔绫。\nΔ感谢你的支持与理解同时感谢你的游玩Δ\n\nΞ开启此功能后重启游戏后本地崩溃数据将自动提交到魔绫控制终端Ξ
windows.wndtextinput.enter_key=输入你的QQ号
windows.wndgame.dialog_user=为了更好的在后续崩溃维护检查遇到一些问题请在这里Ξ输入你的QQ号Ξ如果开发者遇到问题将可能通过你的ID联系你询问详细崩溃情况。
windows.wndgame.dialog_user=为了更好的在后续崩溃维护检查遇到一些问题请在这里Ξ输入你的QQ号Ξ如果开发者遇到问题将可能通过你的ID联系你询问详细崩溃情况。\n\n输入后将跳转到主界面然后请尽情游玩:)
windows.wndtextinput.yes=确认
windows.wndtextinput.no=稍后
@ -28,7 +32,7 @@ windows.wndshopking.notbad=当你准备好后,我会带你前往雪凛峡谷
windows.wndsettings$extendtab.quickslots=快捷栏设置
windows.wndsettings$extendtab.wxts=温馨提示:进入游戏后才能调整快捷栏\n\n这是因为技术问题但是这里已经提醒你了。\n\n当你进入游戏后,这里就会变成快捷栏设置区!
windows.wnddlc.mode=额外玩法请最多只选择一个\n若多选造成存档问题,概不负责
windows.wnddlc.mode=额外玩法请最多只选择一个
windows.wndstartgame.bossrushdonot=地牢的魔力现在过于紊乱,你现在无法使用染血金币控制终端。
@ -47,11 +51,6 @@ windows.wndgame.dialog_title=好的装备名字能让你在游戏中更有亲切
windows.wndgame.dialog_rename=重命名
windows.wndgame.dialog_revert=恢复默认
windows.wndsettings$datatab.firebase=FireBase数据提交
windows.wndsettings$displaytab.firebase_active=FireBase数据提交
windows.wndsettings$displaytab.firebase_desc=FireBase是一款由_Google_推出的一种开发者服务。Ling在魔绫这边添加了_FireBase崩溃日志收集报告_。\n当你尚未开启此功能时你的_所有崩溃报告都会保存在本地Data数据区域(使用Root才能访问)_\n\n当你开启本功能后你在魔绫游玩的所有崩溃报告将会在下次启动魔绫一并提交到程序后台以便JDSALing我维护。\n-开启此功能代表你同意提交你的崩溃数据和Δ手机的基本公开信息Δ_(手机型号,ROOT权限检测,安卓版本,运存检测,屏幕方向,手机内存)_,同时非常感谢你开启此功能以供Ling后续维护魔绫。\nΔ感谢你的支持与理解同时感谢你的游玩Δ\n\nΞ开启此功能后重启游戏后本地崩溃数据将自动提交到魔绫控制终端Ξ
windows.wndinfomob.dsinfo = 闪避概率:
windows.wndinfomob.maxinfo = 掉落限制LV:
windows.wndinfomob.getexp = 上次伤害:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 71 KiB

View File

@ -94,6 +94,8 @@ public class Assets {
public static final String ARCS_BG = "interfaces/arcs1.png";
public static final String ARCS_FG = "interfaces/arcs2.png";
public static final String LANTERLING = "interfaces/LanterLing.png";
public static final String BANNERS = "interfaces/banners.png";
public static final String BADGES = "interfaces/badges.png";
public static final String LOCKED = "interfaces/locked_badge.png";

View File

@ -167,6 +167,7 @@ public class Badges {
CHAMPION_5X ( 116 ),
NYZ_SHOP ( 117 ),
DAGETO ( 118 ),
KILL_DM ( 119 ),
//rudy
FIREGIRL ( 128 ),
@ -277,7 +278,7 @@ public class Badges {
addReplacedBadges(badges);
int count = 0;
String names[] = new String[badges.size()];
String[] names = new String[badges.size()];
for (Badge badge:badges) {
names[count++] = badge.toString();
@ -385,15 +386,15 @@ public class Badges {
public static void GhostDageCollected() {
Badge badge = null;
if (!local.contains( Badge.GHOSTDAGE ) && Statistics.naiyaziCollected == 1) {
if (!local.contains( Badge.GHOSTDAGE ) && Statistics.dageCollected == 1) {
badge = Badge.GHOSTDAGE;
local.add( badge );
}
if (!local.contains( Badge.DAGETO ) && Statistics.naiyaziCollected >= 2) {
addGlobal(badge);
if (!local.contains( Badge.DAGETO ) && Statistics.dageCollected >= 2) {
badge = Badge.DAGETO;
local.add( badge );
}
local.add(badge);
displayBadge( badge );
}
@ -671,9 +672,9 @@ public class Badges {
private static void validateAMZ() {
if (global.contains( Badge.KILL_SLMKING ) &&
global.contains( Badge.KILL_DM720 ) &&
global.contains( Badge.KILL_MG) && global.contains( Badge.FIREGIRL) && global.contains( Badge.DRAWF_HEAD)) {
global.contains( Badge.KILL_MG) && global.contains( Badge.FIREGIRL) && global.contains( Badge.DRAWF_HEAD)&& global.contains( Badge.KILL_DM) ) {
Badge badge = Badge.GODD_MAKE;
Badge badge = Badge.SPICEALBOSS;
displayBadge( badge );
}
}
@ -960,6 +961,12 @@ public class Badges {
validateAMZ();
}
public static void KILL_DMK() {
displayBadge( Badge.KILL_DM );
validateAMZ();
}
public static void BIGX() {
displayBadge( Badge.BIG_X );
}

View File

@ -52,10 +52,9 @@ public class Challenges {
public static final int SBSG = 1024;
public static final int EXSG = 2048;
public static final int STRONGER_BOSSES = 4096;
public static final int LIGHTBLACK = 8192;
public static final int PRO = 16384;
public static final int PRO = 8192;
public static final int MAX_VALUE = 32768;
public static final int MAX_VALUE = 16384;
public static final String[] NAME_IDS = {
"no_food",

View File

@ -59,6 +59,9 @@ public class Statistics {
public static boolean endingbald = false;
//TODO 灯火前行
public static boolean lanterfireactive = false;
public static int dageCollected;
//Directly add float time will cause accuracy lose and stop timing if time is long enough
@ -79,7 +82,7 @@ public class Statistics {
itemsCrafted = 0;
piranhasKilled = 0;
ankhsUsed = 0;
//boss_enhance = 0;
upgradesUsed = 0;
sneakAttacks = 0;
thrownAssists = 0;
@ -98,10 +101,14 @@ public class Statistics {
wangzheguilai = false;
endingbald = false;
lanterfireactive = false;
second_elapsed = 0f;
real_seconds = 0;
turnsPassed = 0f;
}
private static final String GOLD = "score";
@ -135,7 +142,12 @@ public class Statistics {
private static final String EXLEVEL = "Exlevel";
//TODO 灯火前行
private static final String LANTERACTIVE = "lanterfireactive";
public static void storeInBundle( Bundle bundle ) {
bundle.put( LANTERACTIVE, lanterfireactive );
bundle.put( GOLD, goldCollected );
bundle.put( DEEPEST, deepestFloor );
bundle.put( SLAIN, enemiesSlain );
@ -198,6 +210,8 @@ public class Statistics {
endingbald = bundle.getBoolean( ENBR );
lanterfireactive = bundle.getBoolean( LANTERACTIVE );
//SPD
second_elapsed = bundle.getFloat("real_time_passed");
real_seconds = bundle.getLong("real_seconds_passed");

View File

@ -54,6 +54,9 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hex;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LifeLink;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LostInventory;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff.MagicGirlSayKill;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff.MagicGirlSaySlowy;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff.MagicGirlSaySoftDied;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicalSleep;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Momentum;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Ooze;
@ -378,6 +381,11 @@ public abstract class Char extends Actor {
effectiveDamage *= 1.33f;
}
//魔女的低语-软弱
if ( enemy.buff( MagicGirlSaySoftDied.class ) != null){
effectiveDamage *= 1.05f;
}
effectiveDamage = attackProc( enemy, effectiveDamage );
if (visibleFight) {
@ -514,10 +522,17 @@ public abstract class Char extends Actor {
if ( buff(Weakness.class) != null ){
damage *= 0.67f;
}
//削弱10%伤害
if ( buff(MagicGirlSayKill.class) != null ){
damage *= 0.90f;
}
for (ChampionEnemy buff : buffs(ChampionEnemy.class)){
damage *= buff.meleeDamageFactor();
buff.onAttackProc( enemy );
}
for (ChampionHero buff : buffs(ChampionHero.class)){
damage *= buff.meleeDamageFactor();
buff.onAttackProc( enemy );
@ -532,6 +547,10 @@ public abstract class Char extends Actor {
public float speed() {
float speed = baseSpeed;
if ( buff( Cripple.class ) != null ) speed /= 2f;
//Todo 迟钝 3回合
if ( buff( MagicGirlSaySlowy.class ) != null ) speed /= 3f;
if ( buff( Stamina.class ) != null) speed *= 1.5f;
if ( buff( Adrenaline.class ) != null) speed *= 2f;
if ( buff( Haste.class ) != null) speed *= 3f;

View File

@ -21,11 +21,11 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.buffs;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
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.blobs.HalomethaneFire;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
@ -98,16 +98,21 @@ public abstract class ChampionEnemy extends Buff {
Dungeon.mobsToChampion--;
if (Dungeon.mobsToChampion <= 0){
switch (Random.Int(7)){
case 0: default: Buff.affect(m, Blazing.class); break;
case 1: Buff.affect(m, Projecting.class); break;
case 2: Buff.affect(m, AntiMagic.class); break;
case 3: Buff.affect(m, Giant.class); break;
case 4: Buff.affect(m, Blessed.class); break;
case 5: Buff.affect(m, Growing.class); break;
case 6: Buff.affect(m, Halo.class); break;
}
//we roll for a champion enemy even if we aren't spawning one to ensure that
//mobsToChampion does not affect levelgen RNG (number of calls to Random.Int() is constant)
Class<?extends ChampionEnemy> buffCls;
switch (Random.Int(7)){
case 0: default: buffCls = Blazing.class; break;
case 1: buffCls = Projecting.class; break;
case 2: buffCls = AntiMagic.class; break;
case 3: buffCls = Giant.class; break;
case 4: buffCls = Blessed.class; break;
case 5: buffCls = Growing.class; break;
case 6: buffCls = Halo.class; break;
}
if (Dungeon.mobsToChampion <= 0 && Dungeon.isChallenged(Challenges.CHAMPION_ENEMIES)) {
Buff.affect(m, buffCls);
m.state = m.WANDERING;
}
}
@ -154,19 +159,19 @@ public abstract class ChampionEnemy extends Buff {
Buff.affect(enemy, HalomethaneBurning.class).reignite(enemy);
}
@Override
public void detach() {
for (int i : PathFinder.NEIGHBOURS9){
if (!Dungeon.level.solid[target.pos+i]){
GameScene.add(Blob.seed(target.pos+i, 4, HalomethaneFire.class));
}
}
super.detach();
}
// @Override
// public void detach() {
// for (int i : PathFinder.NEIGHBOURS9){
// if (!Dungeon.level.solid[target.pos+i]){
// GameScene.add(Blob.seed(target.pos+i, 4, HalomethaneFire.class));
// }
// }
// super.detach();
// }
@Override
public float meleeDamageFactor() {
return 1.65f;
return 1.15f;
}
{

View File

@ -0,0 +1,95 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.watabou.noosa.Image;
import com.watabou.utils.Bundle;
public class MagicGirlSayCursed extends Buff {
{
type = buffType.POSITIVE;
}
public static int level = 0;
private int interval = 1;
@Override
public boolean act() {
if (target.isAlive()) {
spend(interval);
if (level <= 0) {
detach();
}
}
return true;
}
public int level() {
return level;
}
public void set( int value, int time ) {
//decide whether to override, preferring high value + low interval
if (Math.sqrt(interval)*level <= Math.sqrt(time)*value) {
level = value;
interval = time;
spend(time - cooldown() - 1);
}
}
@Override
public float iconFadePercent() {
if (target instanceof Hero){
float max = ((Hero) target).lvl;
return Math.max(0, (max-level)/max);
}
return 0;
}
@Override
public String toString() {
return Messages.get(this, "name");
}
@Override
public String desc() {
return Messages.get(this, "desc", level, dispTurns(visualcooldown()));
}
private static final String LEVEL = "level";
private static final String INTERVAL = "interval";
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
bundle.put( INTERVAL, interval );
bundle.put( LEVEL, level );
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
interval = bundle.getInt( INTERVAL );
level = bundle.getInt( LEVEL );
}
@Override
public void tintIcon(Image icon) {
icon.hardlight(0x808080);
}
@Override
public int icon() {
return BuffIndicator.TERROR;
}
}

View File

@ -0,0 +1,94 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.watabou.utils.Bundle;
public class MagicGirlSayKill extends Buff {
{
type = buffType.POSITIVE;
}
public static int level = 0;
private int interval = 1;
@Override
public boolean act() {
if (target.isAlive()) {
spend(interval);
if (level <= 0) {
detach();
}
}
return true;
}
public int level() {
return level;
}
public void set( int value, int time ) {
//decide whether to override, preferring high value + low interval
if (Math.sqrt(interval)*level <= Math.sqrt(time)*value) {
level = value;
interval = time;
spend(time - cooldown() - 1);
}
}
@Override
public float iconFadePercent() {
if (target instanceof Hero){
float max = ((Hero) target).lvl;
return Math.max(0, (max-level)/max);
}
return 0;
}
@Override
public String toString() {
return Messages.get(this, "name");
}
@Override
public String desc() {
return Messages.get(this, "desc", level, dispTurns(visualcooldown()));
}
private static final String LEVEL = "level";
private static final String INTERVAL = "interval";
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
bundle.put( INTERVAL, interval );
bundle.put( LEVEL, level );
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
interval = bundle.getInt( INTERVAL );
level = bundle.getInt( LEVEL );
}
// @Override
// public void tintIcon(Image icon) {
// icon.hardlight(0x990000);
// }
@Override
public int icon() {
return BuffIndicator.FIREDIED;
}
}

View File

@ -0,0 +1,94 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.watabou.noosa.Image;
import com.watabou.utils.Bundle;
public class MagicGirlSayNoSTR extends Buff {
{
type = buffType.POSITIVE;
}
public static int level = 0;
private int interval = 1;
@Override
public boolean act() {
if (target.isAlive()) {
spend(interval);
if (level <= 0) {
detach();
}
}
return true;
}
public int level() {
return level;
}
public void set( int value, int time ) {
//decide whether to override, preferring high value + low interval
if (Math.sqrt(interval)*level <= Math.sqrt(time)*value) {
level = value;
interval = time;
spend(time - cooldown() - 1);
}
}
@Override
public float iconFadePercent() {
if (target instanceof Hero){
float max = ((Hero) target).lvl;
return Math.max(0, (max-level)/max);
}
return 0;
}
@Override
public String toString() {
return Messages.get(this, "name");
}
@Override
public String desc() {
return Messages.get(this, "desc", level, dispTurns(visualcooldown()));
}
private static final String LEVEL = "level";
private static final String INTERVAL = "interval";
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
bundle.put( INTERVAL, interval );
bundle.put( LEVEL, level );
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
interval = bundle.getInt( INTERVAL );
level = bundle.getInt( LEVEL );
}
@Override
public void tintIcon(Image icon) {
icon.hardlight(0xFF0000);
}
@Override
public int icon() {
return BuffIndicator.POISON;
}
}

View File

@ -0,0 +1,95 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.watabou.noosa.Image;
import com.watabou.utils.Bundle;
public class MagicGirlSaySlowy extends Buff {
{
type = buffType.POSITIVE;
}
public static int level = 0;
private int interval = 1;
@Override
public boolean act() {
if (target.isAlive()) {
spend(interval);
if (level <= 0) {
detach();
}
}
return true;
}
public int level() {
return level;
}
public void set( int value, int time ) {
//decide whether to override, preferring high value + low interval
if (Math.sqrt(interval)*level <= Math.sqrt(time)*value) {
level = value;
interval = time;
spend(time - cooldown() - 1);
}
}
@Override
public float iconFadePercent() {
if (target instanceof Hero){
float max = ((Hero) target).lvl;
return Math.max(0, (max-level)/max);
}
return 0;
}
@Override
public String toString() {
return Messages.get(this, "name");
}
@Override
public String desc() {
return Messages.get(this, "desc", level, dispTurns(visualcooldown()));
}
private static final String LEVEL = "level";
private static final String INTERVAL = "interval";
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
bundle.put( INTERVAL, interval );
bundle.put( LEVEL, level );
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
interval = bundle.getInt( INTERVAL );
level = bundle.getInt( LEVEL );
}
@Override
public void tintIcon(Image icon) {
icon.hardlight(0x7a7a7a);
}
@Override
public int icon() {
return BuffIndicator.HEX;
}
}

View File

@ -0,0 +1,95 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.watabou.noosa.Image;
import com.watabou.utils.Bundle;
public class MagicGirlSaySoftDied extends Buff {
{
type = buffType.POSITIVE;
}
public static int level = 0;
private int interval = 1;
@Override
public boolean act() {
if (target.isAlive()) {
spend(interval);
if (level <= 0) {
detach();
}
}
return true;
}
public int level() {
return level;
}
public void set( int value, int time ) {
//decide whether to override, preferring high value + low interval
if (Math.sqrt(interval)*level <= Math.sqrt(time)*value) {
level = value;
interval = time;
spend(time - cooldown() - 1);
}
}
@Override
public float iconFadePercent() {
if (target instanceof Hero){
float max = ((Hero) target).lvl;
return Math.max(0, (max-level)/max);
}
return 0;
}
@Override
public String toString() {
return Messages.get(this, "name");
}
@Override
public String desc() {
return Messages.get(this, "desc", level, dispTurns(visualcooldown()));
}
private static final String LEVEL = "level";
private static final String INTERVAL = "interval";
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
bundle.put( INTERVAL, interval );
bundle.put( LEVEL, level );
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
interval = bundle.getInt( INTERVAL );
level = bundle.getInt( LEVEL );
}
@Override
public void tintIcon(Image icon) {
icon.hardlight(0x6a0a6a);
}
@Override
public int icon() {
return BuffIndicator.MAGIC_SLEEP;
}
}

View File

@ -1,101 +1,204 @@
/*
* Pixel Dungeon
* Copyright (C) 2012-2015 Oleg Dolya
*
* Shattered Pixel Dungeon
* Copyright (C) 2014-2022 Evan Debenham
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package com.shatteredpixel.shatteredpixeldungeon.actors.buffs;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.Artifact;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.HornOfPlenty;
import com.shatteredpixel.shatteredpixeldungeon.items.journal.Guidebook;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfChallenge;
import com.shatteredpixel.shatteredpixeldungeon.journal.Document;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.watabou.noosa.Image;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.utils.Bundle;
public class PureSoul extends Buff {
public int soul() {
return (int)Math.ceil(soul);
}
//TODO static方法会导致存档相互影响此Buff已经废弃但留在这里作为教训!
public class PureSoul extends Buff implements Hero.Doom {
public static final float PURESOULBASE = 20f;
{
type = buffType.POSITIVE;
}
public int pos;
public static int soul = 0;
private final float STEP = 10000f;
private int interval = 1;
@Override
public boolean act() {
if (target.isAlive()) {
spend(interval);
if (--soul <= 0) {
detach();
}
}
return true;
}
public void set( int value, int time ) {
if (Math.sqrt(interval)*soul <= Math.sqrt(time)*value) {
soul = value;
//decide whether to override, preferring high value + low interval
if (Math.sqrt(interval)*level <= Math.sqrt(time)*value) {
level = value;
interval = time;
spend(time - cooldown() - 1);
}
}
public static final float STARVING = 240f;
@Override
public float iconFadePercent() {
return Math.max(0, (Sanity.STARVING - soul) / Sanity.STARVING);
}
public final float HUNGRY = 300f;
public final float STARVING = 450f;
public static final float LANTERHERO = 100f;
private float level;
public float partialDamage;
@Override
public String toString() {
return Messages.get(this, "name");
//if (soul >= 180) {
//
//} else if (sanity >= 120) {
// return Messages.get(this, "name2");
//} else {
// return Messages.get(this, "name3");
//}
}
@Override
public String desc() {
return Messages.get(this, "normal_desc", soul, dispTurns(visualcooldown()));
//if (sanity >= 180) {
// return Messages.get(this, "normal_desc", sanity, dispTurns(visualcooldown()));
//} else if (sanity >= 120) {
// return Messages.get(this, "crazy_desc", sanity, dispTurns(visualcooldown()));
//} else {
// return Messages.get(this, "died_desc", sanity, dispTurns(visualcooldown()));
//}
}
private static final String LEVEL = "level";
private static final String INTERVAL = "interval";
private static final String LEVEL = "level";
private static final String PARTIALDAMAGE = "partialDamage";
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle(bundle);
bundle.put( LEVEL, soul );
bundle.put( LEVEL, level );
bundle.put( PARTIALDAMAGE, partialDamage );
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle(bundle);
soul = bundle.getInt(LEVEL);
super.restoreFromBundle( bundle );
level = bundle.getFloat( LEVEL );
partialDamage = bundle.getFloat(PARTIALDAMAGE);
}
@Override
public boolean act() {
if (Dungeon.level.locked
|| target.buff(WellFed.class) != null
|| target.buff(ScrollOfChallenge.ChallengeArena.class) != null|| Dungeon.depth == 0){
spend(STEP);
return true;
}
if (target.isAlive() && target instanceof Hero) {
Hero hero = (Hero)target;
if (isStarving()) {
partialDamage += STEP * target.HT/1000f;
if (partialDamage > 1){
target.damage( (int)partialDamage, this);
partialDamage -= (int)partialDamage;
}
} else {
float newLevel = level + LANTERHERO;
if (newLevel >= STARVING) {
GLog.n( Messages.get(this, "onstarving") );
hero.resting = false;
hero.damage( 1, this );
hero.interrupt();
} else if (newLevel >= HUNGRY && level < HUNGRY) {
GLog.w( Messages.get(this, "onhungry") );
if (!Document.ADVENTURERS_GUIDE.isPageRead(Document.GUIDE_FOOD)){
GLog.p(Messages.get(Guidebook.class, "hint"));
GameScene.flashForDocument(Document.GUIDE_FOOD);
}
}
level = newLevel;
}
spend( target.buff( Shadows.class ) == null ? STEP : STEP * 1.5f );
} else {
diactivate();
}
return true;
}
public void satisfy( float energy ) {
Artifact.ArtifactBuff buff = target.buff( HornOfPlenty.hornRecharge.class );
if (buff != null && buff.isCursed()){
energy *= 0.67f;
GLog.n( Messages.get(this, "cursedhorn") );
}
affectHunger( energy, false );
}
public void affectHunger(float energy, boolean overrideLimits ) {
if (energy < 0 && target.buff(WellFed.class) != null){
target.buff(WellFed.class).left += energy;
BuffIndicator.refreshHero();
return;
}
level += 0;
if (level < 0 && !overrideLimits) {
level = 0;
} else if (level > STARVING) {
float excess = level - STARVING;
level = STARVING;
partialDamage += excess * (target.HT/1000f);
}
BuffIndicator.refreshHero();
}
public boolean isStarving() {
return level >= STARVING;
}
public int hunger() {
return (int)Math.ceil(level);
}
@Override
public void tintIcon(Image icon) {
public int icon() {
if (level <= 10f) {
return BuffIndicator.LIGHT;
} else if (level < STARVING) {
return BuffIndicator.HUNGER;
} else {
return BuffIndicator.STARVATION;
}
}
//if (soul >= 180) {
// icon.hardlight(0x00ff00);
//} else if (soul >= 120) {
// icon.hardlight(0xffff00);
//} else {
// icon.hardlight(0xff0000);
//}
}//
@Override
public String toString() {
return Messages.get(this, "lantern");
}
@Override
public String desc() {
String result;
result = Messages.get(this, "desc_intro_lanter", Math.abs(level-LANTERHERO), dispTurns(visualcooldown()));
result += Messages.get(this, "desc");
return result;
}
@Override
public void onDeath() {
Dungeon.fail( getClass() );
GLog.n( Messages.get(this, "ondeath") );
}
}

View File

@ -32,8 +32,6 @@ import com.watabou.utils.Bundle;
public class Sanity extends Buff {
@Override
public int icon() {
if(sanity >= 180) {

View File

@ -22,14 +22,16 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.hero;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.AQUAPHOBIA;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.LIGHTBLACK;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.PRO;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import static com.shatteredpixel.shatteredpixeldungeon.SPDSettings.HelpSettings;
import static com.shatteredpixel.shatteredpixeldungeon.Statistics.lanterfireactive;
import static com.shatteredpixel.shatteredpixeldungeon.levels.Level.set;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Bones;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.GamesInProgress;
import com.shatteredpixel.shatteredpixeldungeon.SPDSettings;
@ -47,12 +49,10 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bless;
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.buffs.ChampionEnemy;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionHero;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Chill;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Combo;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.DeadSoul;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Drowsy;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Foresight;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FrostImbueEX;
@ -64,6 +64,11 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.HoldFast;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LostInventory;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff.MagicGirlSayCursed;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff.MagicGirlSayKill;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff.MagicGirlSayNoSTR;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff.MagicGirlSaySlowy;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff.MagicGirlSaySoftDied;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MindVision;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Momentum;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis;
@ -79,7 +84,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.BloodBat;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Monk;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Snake;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.lb.BlackSoul;
import com.shatteredpixel.shatteredpixeldungeon.custom.ch.GameTracker;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.CheckedCell;
@ -115,6 +119,8 @@ import com.shatteredpixel.shatteredpixeldungeon.items.keys.GoldenKey;
import com.shatteredpixel.shatteredpixeldungeon.items.keys.IronKey;
import com.shatteredpixel.shatteredpixeldungeon.items.keys.Key;
import com.shatteredpixel.shatteredpixeldungeon.items.keys.SkeletonKey;
import com.shatteredpixel.shatteredpixeldungeon.items.lightblack.OilLantern;
import com.shatteredpixel.shatteredpixeldungeon.items.lightblack.OilPotion;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfExperience;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing;
@ -285,7 +291,13 @@ public class Hero extends Char {
strBonus += (int)Math.floor(STR * (0.03f + 0.05f*pointsInTalent(Talent.STRONGMAN)));
}
//TODO 无力 本大层-3力量
if(Dungeon.hero.buff(MagicGirlSayNoSTR.class) != null){
strBonus -= 3;
}
return STR + strBonus;
}
private static final String CLASS = "class";
@ -299,11 +311,15 @@ public class Hero extends Char {
private static final String EXPERIENCE = "exp";
private static final String HTBOOST = "htboost";
private static final String LANTERFTR = "lanterfire";
public int lanterfire;
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
bundle.put( LANTERFTR, lanterfire );
bundle.put( CLASS, heroClass );
bundle.put( SUBCLASS, subClass );
bundle.put( ABILITY, armorAbility );
@ -317,6 +333,8 @@ public class Hero extends Char {
bundle.put( EXPERIENCE, exp );
bundle.put( HTBOOST, HTBoost );
if (!this.name.equals("")) {
bundle.put("name", this.name);
}
@ -330,6 +348,8 @@ public class Hero extends Char {
lvl = bundle.getInt( LEVEL );
exp = bundle.getInt( EXPERIENCE );
lanterfire = bundle.getInt(LANTERFTR);
HTBoost = bundle.getInt(HTBOOST);
super.restoreFromBundle( bundle );
@ -497,6 +517,15 @@ public class Hero extends Char {
Buff.affect( this, Regeneration.class );
Buff.affect( this, Hunger.class );
// if(lanterfireactive){
// Buff.affect( this, PureSoul.class );
// }
Buff.affect(hero, MagicGirlSayNoSTR.class).set( (3), 1 );
Buff.affect(hero, MagicGirlSayCursed.class).set( (3), 1 );
Buff.affect(hero, MagicGirlSaySlowy.class).set( (3), 1 );
Buff.affect(hero, MagicGirlSayKill.class).set( (3), 1 );
Buff.affect(hero, MagicGirlSaySoftDied.class).set( (3), 1 );
if(HelpSettings()) {
Buff.affect(this, GameTracker.class);
@ -864,6 +893,23 @@ public class Hero extends Char {
}
private boolean actMove( HeroAction.Move action ) {
MagicGirlSayNoSTR.level -= 1;
//检查
int chCount = 0;
for (int ch : Challenges.MASKS){
if ((Dungeon.challenges & ch) != 0) chCount++;
}
if(chCount >= 3 && !Dungeon.isChallenged(PRO) && !lanterfireactive){
//TODO 灯火前行
lanterfire = 100;
new OilLantern().quantity(1).identify().collect();
new OilPotion().quantity(100).identify().collect();
new Ankh().quantity(1).identify().collect();
Dungeon.gold+=10000;
lanterfireactive = true;
GLog.n("系统已经检测到你已开启困难模式,灯火会与你结伴同行,但同时,恶魔也会对你馋言欲滴。");
}
if (getCloser( action.dst )) {
return true;
@ -872,6 +918,8 @@ public class Hero extends Char {
ready();
return false;
}
}
private boolean actInteract( HeroAction.Interact action ) {
@ -1758,17 +1806,17 @@ public class Hero extends Char {
}
}
if(Dungeon.isChallenged(LIGHTBLACK)) {
BlackSoul s = new BlackSoul();
s.pos = Dungeon.hero.pos;
s.gold = Dungeon.gold;
Dungeon.gold = 0;
s.state = s.SLEEPING;
GameScene.add(s);
Buff.affect(s, ChampionEnemy.DeadSoulSX.class);
Buff.affect(s, DeadSoul.class);
GameScene.flash(0x80FF0000);
}
// if(Dungeon.isChallenged(LIGHTBLACK)) {
// BlackSoul s = new BlackSoul();
// s.pos = Dungeon.hero.pos;
// s.gold = Dungeon.gold;
// Dungeon.gold = 0;
// s.state = s.SLEEPING;
// GameScene.add(s);
// Buff.affect(s, ChampionEnemy.DeadSoulSX.class);
// Buff.affect(s, DeadSoul.class);
// GameScene.flash(0x80FF0000);
// }
if(Statistics.fireGirlnoshopping && Dungeon.depth < 0){
reallyDie( cause );
GLog.n(Messages.get(this,"died"));
@ -2258,4 +2306,17 @@ public class Hero extends Char {
public static interface Doom {
public void onDeath();
}
//TODO 灯火前行逻辑
public void damageLantern(int value){
lanterfire -= value;
if(lanterfire <= 0){
damage(HT,this);
}
}
public void healLantern(int value){
lanterfire = Math.min(lanterfire+value,100);
}
}

View File

@ -21,8 +21,6 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.hero;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.LIGHTBLACK;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
@ -31,9 +29,7 @@ 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.PureSoul;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.RandomBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Sanity;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.ArmorAbility;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.huntress.NaturesPower;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.huntress.SpectralBlades;
@ -75,8 +71,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.food.Food;
import com.shatteredpixel.shatteredpixeldungeon.items.food.FrozenCarpaccio;
import com.shatteredpixel.shatteredpixeldungeon.items.food.MeatPie;
import com.shatteredpixel.shatteredpixeldungeon.items.food.PotionOfLightningShiled;
import com.shatteredpixel.shatteredpixeldungeon.items.lightblack.OilLantern;
import com.shatteredpixel.shatteredpixeldungeon.items.lightblack.OilPotion;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfExperience;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfInvisibility;
@ -277,15 +271,6 @@ public enum HeroClass {
Waterskin waterskin = new Waterskin();
waterskin.collect();
if(Dungeon.isChallenged(LIGHTBLACK)){
Buff.affect(hero, Sanity.class).set( (240), 1 );
Buff.affect(hero, PureSoul.class).set( 20, 20 );
new OilLantern().quantity(1).identify().collect();
new OilPotion().quantity(100).identify().collect();
new Ankh().quantity(1).identify().collect();
Dungeon.gold+=10000;
}
new ScrollOfIdentify().identify();
switch (this) {

View File

@ -72,7 +72,7 @@ public class BloodBat extends Mob implements Callback {
Sample.INSTANCE.play( Assets.Sounds.DEBUFF );
}
int dmg = Random.NormalIntRange( (4+level)*Dungeon.depth/5, (5+level)*Dungeon.depth/5 );
int dmg = Random.NormalIntRange( (2+level)*Dungeon.depth/5, (2+level)*Dungeon.depth/5 );
enemy.damage( dmg, new BloodBat.DarkBolt() );
if (enemy == Dungeon.hero && !enemy.isAlive()) {

View File

@ -552,7 +552,7 @@ public class DimandKing extends Boss {
Dungeon.level.drop(new Ankh(), dropPos).sprite.drop(pos);
Dungeon.level.drop(new Gold().quantity(Random.Int(2200, 5500)), pos).sprite.drop();
Badges.validateBossSlain();
Badges.KILL_DMK();
Dungeon.level.unseal();
for (Mob m : getSubjects()){

View File

@ -219,17 +219,22 @@ public abstract class Elemental extends Mob {
if (enemy.sprite.visible) Splash.at( enemy.sprite.center(), sprite.blood(), 5);
}
}
private float resurrectChance = 0.01f;
@Override
public void die(Object cause) {
super.die(cause);
if(!Statistics.endingbald) {
//TODO 1%
if(!Statistics.endingbald && Random.Float() <= resurrectChance) {
Dungeon.level.drop(new EndingBlade(), pos).sprite.drop();
Badges.ENDDIED();
Statistics.endingbald = true;
Badges.ENDDIED();
Statistics.endingbald = true;
//TODO 1%
super.die(cause);
} else if(Statistics.endingbald && Random.Float() <= resurrectChance) {
Dungeon.level.drop(new Gold().quantity(Random.Int(12, 24)), pos).sprite.drop();
super.die(cause);
} else {
Dungeon.level.drop(new Gold().quantity(Random.Int(90, 120)), pos).sprite.drop();
super.die(cause);
}
}

View File

@ -21,9 +21,7 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.LIGHTBLACK;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import static com.shatteredpixel.shatteredpixeldungeon.actors.buffs.PureSoul.soul;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.BGMPlayer;
@ -742,10 +740,6 @@ public abstract class Mob extends Char {
GLog.i( Messages.get(this, "died") );
}
if(Dungeon.isChallenged(LIGHTBLACK)){
soul +=1;
}
boolean soulMarked = buff(SoulMark.class) != null;
super.die( cause );

View File

@ -21,12 +21,12 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.LIGHTBLACK;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import static com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Sanity.sanity;
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;
@ -46,11 +46,11 @@ public class Rat extends Mob {
@Override
public int attackProc( Char enemy, int damage ) {
damage = super.attackProc( enemy, damage );
if(Dungeon.isChallenged(LIGHTBLACK)) {
if (Random.Int(5) == 1) {
sanity -= 1;
//扣除理智-1
hero.sprite.showStatus( 0x808080, "1");
if(lanterfireactive){
if (Random.Int(5) == 1 && enemy instanceof Hero) {
((Hero) enemy).damageLantern(10);
hero.sprite.showStatus( 0x808080, "10");
}
} else {
super.attackProc( enemy, damage );

View File

@ -0,0 +1,157 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.SpellCaster;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Chill;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.BeamCustom;
import com.shatteredpixel.shatteredpixeldungeon.effects.Effects;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Viscosity;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.IceStalSprites;
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.utils.Bundle;
import com.watabou.utils.Random;
public class CrystalLingTower extends Mob {
{
spriteClass = IceStalSprites.class;
HP = HT = 400;
properties.add(Property.MINIBOSS);
state = HUNTING;
}
protected enum State{
PREPARING, AIMING, SHOOTING
}
@Override
public void damage(int dmg, Object src) {
if (dmg >= 15){
dmg = 15 + (int)(Math.sqrt(8*(dmg - 4) + 1) - 1)/2;
}
super.damage(dmg, src);
}
protected int count=0;
protected CrystalDiedTower.State countDown(){
if(maxCount() - count > 0 && maxCount() - count < 3);
if(count >= maxCount()){
count = Random.Int(0, 3) - 3; return CrystalDiedTower.State.SHOOTING;
}else if(count == maxCount() - 1){
count ++;
sprite.showStatus( CharSprite.NEGATIVE, "!!!" );
return CrystalDiedTower.State.AIMING;
}else{
count ++;
return CrystalDiedTower.State.PREPARING;
}
}
protected int maxCount(){
return 6;
}
protected boolean findTarget(){
if(enemy != null){
//record last pos of enemy. Not update if out of FOV.
if(enemySeen){
lastTargeting = enemy.pos;
return true;
}else{
lastTargeting = Dungeon.hero.pos;
}
}else{
lastTargeting = Dungeon.hero.pos;
}
return false;
}
protected void zapProc() {
Ballistica ba = new Ballistica(pos, lastTargeting, Ballistica.PROJECTILE);
sprite.parent.add(new BeamCustom(
sprite.center(),
DungeonTilemap.tileCenterToWorld(ba.collisionPos),
Effects.Type.BLUE_RAY));
if(ba.collisionPos != lastTargeting) {
findTarget();
Buff.affect(this, SpellCaster.HaloFireCaster.BouncePostShoot.class).setTrace(ba.collisionPos, lastTargeting);
}
hitProc(ba);
}
public static void zapDamage(Char ch, int min, int max, float modifier, Object src){
int damage = Random.IntRange(min, max);
if(ch.buff(SpellCaster.Marked.class)!=null){
damage = Math.round(damage*(2f+modifier*1.15f));
}
ch.damage(damage, src);
if(ch == Dungeon.hero && !ch.isAlive()){
Dungeon.fail(src.getClass());
}
}
protected void hitProc(Ballistica ba){
Char ch = findChar(ba.collisionPos);
if(ch != null){
ch.sprite.burst( 0xFF99CCFF, 5 );
if(ch.alignment != Alignment.ENEMY){
Buff.affect(ch, Chill.class, 5f);
zapDamage(ch, 8, 12, 0.45f, this);
}
}
}
@Override
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
bundle.put("ALIGNMENT", alignment);
bundle.put("lastPos", lastTargeting);
bundle.put("countDown", count);
}
@Override
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
alignment = bundle.getEnum("ALIGNMENT", Char.Alignment.class);
lastTargeting = bundle.getInt("lastPos");
count = bundle.getInt("countDown");
}
protected int lastTargeting=-1;
@Override
protected boolean act(){
if(alignment == Alignment.NEUTRAL) return true;
CrystalDiedTower.State s = countDown();
if(s == CrystalDiedTower.State.SHOOTING) {
zapProc();
}else{
spend(TICK);
}
return true;
}
@Override
public void die( Object cause ) {
super.die(cause);
for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])) {
if (mob instanceof FireMagicDied) {
Viscosity.DeferedDamage deferred = Buff.affect( mob, Viscosity.DeferedDamage.class );
deferred.prolong( 10000 );
GLog.n( Messages.get(FireMagicDied.class, "dixsdf" ));
}
}
}
}

View File

@ -2,16 +2,17 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import static com.shatteredpixel.shatteredpixeldungeon.levels.ShopBossLevel.CryStalPosition;
import static com.shatteredpixel.shatteredpixeldungeon.levels.ShopBossLevel.TRUEPosition;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Amok;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.BeamTowerAdbility;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Degrade;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff;
@ -107,10 +108,10 @@ public class FireMagicDied extends Mob implements Callback {
}
}
@Override
public boolean isInvulnerable(Class effect) {
return phase == 3 && effect != FireMagicDied.KingDamager.class;
}
// @Override
// public boolean isInvulnerable(Class effect) {
// return phase == 3 && effect != FireMagicDied.KingDamager.class;
// }
@Override
public int attackSkill( Char target ) {
@ -437,7 +438,7 @@ public class FireMagicDied extends Mob implements Callback {
actPhaseTwoSummon();
return true;
}
actScanning();
//actScanning();
if (Dungeon.level.water[pos] && HP < HT) {
HP += healInc;
@ -660,12 +661,15 @@ public class FireMagicDied extends Mob implements Callback {
}
@Override
protected boolean getCloser( int target ) {
if (pumpedUp != 0) {
pumpedUp = 0;
sprite.idle();
protected boolean getCloser(int target) {
this.pumpedUp = 0;
if (this.state != this.HUNTING) {
return FireMagicDied.super.getCloser(target);
}
return super.getCloser( target );
if (!this.enemySeen || !getFurther(target)) {
return false;
}
return true;
}
@Override
@ -710,10 +714,20 @@ public class FireMagicDied extends Mob implements Callback {
sprite.showStatus(CharSprite.POSITIVE, Messages.get(this, "invulnerable"));
Buff.affect(this, DwarfMaster.DKBarrior.class).setShield(12*25);
}
} else if (phase == 2 && shielding() == 0 && HP <= 100) {
} else if (phase == 2 && shielding() == 0 && HP <= 200) {
actPhaseTwoSummon();
yell( Messages.get(this, "enraged", Dungeon.hero.name()) );
//Buff.detach(this, FireMagicDied.SacrificeSubjectListener.class);
yell( Messages.get(this, "enraged" ));
GLog.n( Messages.get(this, "xslx") );
//T3 阶段
CrystalLingTower abc = new CrystalLingTower();
abc.pos = TRUEPosition;
GameScene.add(abc);
Buff.affect(this, DwarfMaster.DKBarrior.class).setShield(1000);
Buff.append(hero, BeamTowerAdbility.class).towerPos = TRUEPosition;
for (Buff buff : hero.buffs()) {
if (buff instanceof FireMagicDied.KingDamager) {
buff.detach();
@ -732,7 +746,22 @@ public class FireMagicDied extends Mob implements Callback {
Buff.affect(this, FireMagicDied.YogScanHalf.class).setPos(pos, direction);
beamCD = 40 + 8 - (phase == 10 ? 38 : 0);
sprite.showStatus(0xff0000, Messages.get(this, "dead"));
switch (Random.Int(7)){
case 0: default: Buff.affect(this, ChampionEnemy.Blazing.class);
break;
case 1: Buff.affect(this, ChampionEnemy.Projecting.class);
break;
case 2: Buff.affect(this, ChampionEnemy.AntiMagic.class);
break;
case 3: Buff.affect(this, ChampionEnemy.Giant.class);
break;
case 4: Buff.affect(this, ChampionEnemy.Blessed.class);
break;
case 5: Buff.affect(this, ChampionEnemy.Growing.class);
break;
case 6: Buff.affect(this, ChampionEnemy.Halo.class);
break;
}
} else if (phase == 3 && preHP > 80 && HP <= 80){
yell( Messages.get(this, "losing") );
}
@ -750,7 +779,6 @@ public class FireMagicDied extends Mob implements Callback {
public void die( Object cause ) {
super.die( cause );
ShatteredPixelDungeon.seamlessResetScene();
Dungeon.level.drop(new BackGoKey().quantity(1).identify(), pos).sprite.drop();
Dungeon.level.drop(new ScrollOfMagicMapping().quantity(1).identify(), pos).sprite.drop();
@ -763,9 +791,11 @@ public class FireMagicDied extends Mob implements Callback {
woc.identify();
Dungeon.level.unseal();
Buff.affect(hero, ShopLimitLock.class).set((1), 1);
for (Mob mob : (Iterable<Mob>)Dungeon.level.mobs.clone()) {
if (mob instanceof FireMagicDied.ColdGuradA || mob instanceof SRPDICLRPRO ||mob instanceof Skeleton||mob instanceof CrystalDiedTower||mob instanceof DM100|| mob instanceof BlackHost|| mob instanceof Warlock|| mob instanceof Monk) {
for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])) {
if (mob instanceof FireMagicDied.ColdGuradA || mob instanceof SRPDICLRPRO ||mob instanceof Skeleton||mob instanceof DM100|| mob instanceof BlackHost|| mob instanceof Warlock|| mob instanceof Monk|| mob instanceof CrystalDiedTower) {
mob.die( cause );
}
}
@ -787,7 +817,7 @@ public class FireMagicDied extends Mob implements Callback {
public void notice() {
super.notice();
BossHealthBar.assignBoss(this);
ShatteredPixelDungeon.seamlessResetScene();
Music.INSTANCE.play(Assets.BGM_FRBOSS, true);
yell( Messages.get(this, "notice") );
//summon();

View File

@ -2,7 +2,6 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.EnergyParticle;

View File

@ -21,6 +21,7 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.PRO;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
@ -164,7 +165,12 @@ public class Shopkeeper extends NPC {
//shopkeepers are greedy!
public static int sellPrice(Item item){
return item.value() * 5 * (Dungeon.depth / 5 + 1);
int price = item.value() * 5 * (Dungeon.depth / 5 + 1);
if (Dungeon.isChallenged(PRO)) {
price *= 0.25;
}
return price;
}
public static WndBag sell() {

View File

@ -22,6 +22,7 @@
package com.shatteredpixel.shatteredpixeldungeon.effects;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.watabou.gltextures.SmartTexture;
import com.watabou.gltextures.TextureCache;
import com.watabou.noosa.Game;
@ -31,6 +32,7 @@ import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Point;
import com.watabou.utils.PointF;
import java.util.ArrayList;
import java.util.HashMap;
public class BadgeBanner extends Image {
@ -40,7 +42,8 @@ public class BadgeBanner extends Image {
}
private State state;
private static final float DEFAULT_SCALE = 3;
public static final float DEFAULT_SCALE = 3;
public static final int SIZE = 16;
private static final float FADE_IN_TIME = 0.25f;
private static final float STATIC_TIME = 1f;
@ -51,14 +54,14 @@ public class BadgeBanner extends Image {
private static TextureFilm atlas;
private static BadgeBanner current;
public static ArrayList<BadgeBanner> showing = new ArrayList<>();
private BadgeBanner( int index ) {
super( Assets.Interfaces.BADGES );
if (atlas == null) {
atlas = new TextureFilm( texture, 16, 16 );
atlas = new TextureFilm( texture, SIZE, SIZE );
}
setup(index);
@ -87,35 +90,35 @@ public class BadgeBanner extends Image {
if (time >= 0) {
switch (state) {
case FADE_IN:
float p = time / FADE_IN_TIME;
scale.set( (1 + p) * DEFAULT_SCALE );
alpha( 1 - p );
break;
case STATIC:
break;
case FADE_OUT:
alpha( time / FADE_OUT_TIME );
break;
case FADE_IN:
float p = time / FADE_IN_TIME;
scale.set( (1 + p) * DEFAULT_SCALE );
alpha( 1 - p );
break;
case STATIC:
break;
case FADE_OUT:
alpha( time / FADE_OUT_TIME );
break;
}
} else {
switch (state) {
case FADE_IN:
time = STATIC_TIME;
state = State.STATIC;
scale.set( DEFAULT_SCALE );
alpha( 1 );
highlight( this, index );
break;
case STATIC:
time = FADE_OUT_TIME;
state = State.FADE_OUT;
break;
case FADE_OUT:
killAndErase();
break;
case FADE_IN:
time = STATIC_TIME;
state = State.STATIC;
scale.set( DEFAULT_SCALE );
alpha( 1 );
highlight( this, index );
break;
case STATIC:
time = FADE_OUT_TIME;
state = State.FADE_OUT;
break;
case FADE_OUT:
killAndErase();
break;
}
}
@ -123,19 +126,22 @@ public class BadgeBanner extends Image {
@Override
public void kill() {
if (current == this) {
current = null;
}
showing.remove(this);
super.kill();
}
@Override
public void destroy() {
showing.remove(this);
super.destroy();
}
//map to cache highlight positions so we don't have to keep looking at texture pixels
private static HashMap<Integer, Point> highlightPositions = new HashMap<>();
//we also hardcode any special cases
static {
//combo master
highlightPositions.put(66, new Point(3, 7));
highlightPositions.put(Badges.Badge.MASTERY_COMBO.image, new Point(3, 7));
}
//adds a shine to an appropriate pixel on a badge
@ -181,8 +187,8 @@ public class BadgeBanner extends Image {
}
p.offset(
-image.origin.x * (image.scale.x - 1),
-image.origin.y * (image.scale.y - 1) );
-image.origin.x * (image.scale.x - 1),
-image.origin.y * (image.scale.y - 1) );
p.offset( image.point() );
Speck star = new Speck();
@ -192,12 +198,13 @@ public class BadgeBanner extends Image {
}
public static BadgeBanner show( int image ) {
if (current != null) {
current.setup(image);
} else {
current = new BadgeBanner(image);
}
return current;
BadgeBanner banner = new BadgeBanner(image);
showing.add(banner);
return banner;
}
public static boolean isShowingBadges(){
return !showing.isEmpty();
}
public static Image image( int index ) {

View File

@ -21,13 +21,8 @@
package com.shatteredpixel.shatteredpixeldungeon.items;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.LIGHTBLACK;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LostInventory;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Sanity;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.CloakOfShadows;
@ -74,10 +69,6 @@ public class LostBackpack extends Item {
}
}
if(Dungeon.isChallenged(LIGHTBLACK)) {
Buff.affect(hero, Sanity.class).set((150), 1);
}
hero.updateHT(false);
Item.updateQuickslot();

View File

@ -124,7 +124,7 @@ public class EndingBlade extends Weapon {
switch (action) {
case AC_LASERCRYSTAL:
if(level >= 3 && firstx){
if(fireenergy >= 300 && firstx){
firstx = false;
new LaserPython().quantity(1).identify().collect();
GLog.n("你突然感觉你的背包鼓鼓的……");
@ -135,7 +135,7 @@ public class EndingBlade extends Weapon {
}
break;
case AC_DIEDGHOST:
if(level >= 5 && TIME_TO_DIED == 0) {
if(fireenergy >= 500 && TIME_TO_DIED == 0) {
curUser = hero;
curItem = this;
GameScene.selectCell(zapper);
@ -146,7 +146,7 @@ public class EndingBlade extends Weapon {
}
break;
case AC_HEALRESET:
if(level >= 7 && 0.30f >= (float)(hero.HP/hero.HT) && !Statistics.wangzheguilai) {
if(fireenergy >= 700 && 0.30f >= (float)(hero.HP/hero.HT) && !Statistics.wangzheguilai) {
//0.30f >= (float)(hero.HP/hero.HT)
PotionOfHealing.cure( hero );
hero.belongings.uncurseEquipped();
@ -390,7 +390,11 @@ public class EndingBlade extends Weapon {
public int proc(Char attacker, Char defender, int damage ) {
//常规加+1浊焰能量
++fireenergy;
if(level >= 10) {
fireenergy = 1000;
} else {
++fireenergy;
}
int dmg;
tier+= fireenergy/100;
@ -404,13 +408,13 @@ public class EndingBlade extends Weapon {
//武器最高级
} else if(defender.properties().contains(Char.Property.BOSS) && defender.HP <= damage){
//目标Boss血量小于实际伤害判定为死亡,+20浊焰能量
fireenergy+=20;
fireenergy+=40;
} else if(defender.properties().contains(Char.Property.MINIBOSS) && defender.HP <= damage){
//目标迷你Boss血量小于实际伤害判定为死亡,+10浊焰能量
fireenergy+=10;
fireenergy+=20;
} else if (defender.HP <= damage){
//目标血量小于实际伤害判定为死亡,+5浊焰能量
fireenergy+=5;
fireenergy+=10;
}
/*

View File

@ -25,15 +25,15 @@ public class LockSword extends MeleeWeapon {
@Override
public int min(int lvl) {
return Math.round(1.0f*(tier+1)) + //15 base, down from 30
lvl*Math.round(0.5f*(tier+1)); //+3 per level, down from +6
return Math.round(1.0f*(tier+1)) +
lvl*Math.round(1.5f*(tier+1));
}
@Override
public int max(int lvl) {
return Math.round(1.5f*(tier+1)) + //15 base, down from 30
lvl*Math.round(0.5f*(tier+1)); //+3 per level, down from +6
return Math.round(2.5f*(tier+1)) +
lvl*Math.round(0.5f*(tier+1));
}
public String desc() {
@ -41,16 +41,21 @@ public class LockSword extends MeleeWeapon {
}
public int image() {
if (lvl == 150) {
super.image = ItemSpriteSheet.DG4;
} else if (lvl >= 350) {
if (lvl >= 750) {
super.image = ItemSpriteSheet.DG5;
} else if (lvl >= 550) {
super.image = ItemSpriteSheet.DG4;
}
return image;
}
public int proc(Char attacker, Char defender, int damage ) {
++lvl;
if(level >= 10) {
lvl = 1000;
} else {
++lvl;
}
int dmg;
if(level >= 10){
@ -85,29 +90,29 @@ public class LockSword extends MeleeWeapon {
}
public void restoreFromBundle(Bundle var1) {
super.restoreFromBundle(var1);
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
super.image = ItemSpriteSheet.DG3;
if (lvl == 150) {
super.image = ItemSpriteSheet.DG4;
} else if (lvl >= 350) {
if (lvl >= 750) {
super.image = ItemSpriteSheet.DG5;
} else if (lvl >= 550) {
super.image = ItemSpriteSheet.DG4;
}
this.lvl = var1.getInt("lvl");
this.lvl = bundle.getInt("lvl");
}
public void storeInBundle(Bundle var1) {
super.storeInBundle(var1);
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
super.image = ItemSpriteSheet.DG3;
if (lvl == 150) {
super.image = ItemSpriteSheet.DG4;
} else if (lvl >= 350) {
if (lvl >= 750) {
super.image = ItemSpriteSheet.DG5;
} else if (lvl >= 550) {
super.image = ItemSpriteSheet.DG4;
}
var1.put("lvl", this.lvl);
bundle.put("lvl", this.lvl);
}
}

View File

@ -485,9 +485,7 @@ public abstract class Level implements Bundlable {
}
Mob m = Reflection.newInstance(mobsToSpawn.remove(0));
if (Dungeon.isChallenged(Challenges.CHAMPION_ENEMIES)){
ChampionEnemy.rollForChampion(m);
}
ChampionEnemy.rollForChampion(m);
return m;
}

View File

@ -8,7 +8,6 @@ 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.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.CrystalDiedTower;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.FireMagicDied;
@ -20,11 +19,11 @@ import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Random;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Objects;
public class ShopBossLevel extends Level {
@ -80,6 +79,8 @@ public class ShopBossLevel extends Level {
WIDTH*17 + 22,
};
public static int TRUEPosition = WIDTH * 17 + 17;
@Override
public void unseal() {
super.unseal();
@ -123,7 +124,8 @@ public class ShopBossLevel extends Level {
private static final int[] pedestals = new int[4];
public int getSummoningPos(){
Mob king = getKing();
HashSet<FireMagicDied.Summoning> summons = king.buffs(FireMagicDied.Summoning.class);
//fixed
HashSet<FireMagicDied.Summoning> summons = Objects.requireNonNull(king).buffs(FireMagicDied.Summoning.class);
ArrayList<Integer> positions = new ArrayList<>();
for (int pedestal : pedestals) {
boolean clear = true;
@ -137,11 +139,12 @@ public class ShopBossLevel extends Level {
positions.add(pedestal);
}
}
if (positions.isEmpty()){
return -1;
} else {
return Random.element(positions);
}
//if (positions.isEmpty()){
// return -1;
//} else {
// return Random.element(positions);
//}
return -1;
}
public static final int thronex;
@ -274,19 +277,11 @@ public class ShopBossLevel extends Level {
}
public String tilesTex() {
if (Dungeon.hero.buff(LockedFloor.class)!=null) {
return Assets.Environment.TILES_DIED;
} else {
return Assets.Environment.TILES_COLD;
}
}
public String waterTex() {
if (Dungeon.hero.buff(LockedFloor.class)!=null) {
return Assets.Environment.WATER_HALLS;
} else {
return Assets.Environment.WATER_COLD;
}
}
}

View File

@ -36,6 +36,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff.MagicGirlSayCursed;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.DemonSpawner;
@ -63,6 +64,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.RegularLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret.SecretRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.CursingTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.plants.Plant;
@ -529,6 +531,17 @@ public class GameScene extends PixelScene {
} else {
GLog.h(Messages.get(this, "descend"), Dungeon.depth);
}
/*
TODO 检查是否存在诅咒buff然后在下楼的时候背刺英雄一下
TODO 魔女的低语束缚 本大层每下一层穿戴的装备必定被诅咒
*/
if(Dungeon.hero.buff(MagicGirlSayCursed.class) != null){
CursingTrap cursed = new CursingTrap();
cursed.pos = Dungeon.hero.pos;
cursed.activate();
}
Sample.INSTANCE.play(Assets.Sounds.DESCEND);
if(Dungeon.sbbossLevel()){
tell(Messages.get(Slyl.class, "tips"));

View File

@ -21,7 +21,6 @@
package com.shatteredpixel.shatteredpixeldungeon.scenes;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.LIGHTBLACK;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
@ -33,7 +32,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.LostBackpack;
import com.shatteredpixel.shatteredpixeldungeon.items.food.Food;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.features.Chasm;
@ -182,7 +180,7 @@ public class InterlevelScene extends PixelScene {
fadeTime += 0.9f; //adds 1 second total
//speed up transition when debugging
} else if (DeviceCompat.isDebug()){
fadeTime = 0.8f;
fadeTime = 0.1f;
}
SkinnedBlock bg = new SkinnedBlock(Camera.main.width, Camera.main.height, loadingAsset ){
@ -506,11 +504,8 @@ public class InterlevelScene extends PixelScene {
level.map[Dungeon.hero.pos] = Terrain.GRASS;
}
Dungeon.hero.resurrect();
if(Dungeon.isChallenged(LIGHTBLACK)) {
level.drop(new Food(), invPos);
} else {
level.drop(new LostBackpack(), invPos);
}
}
Dungeon.switchLevel( level, Dungeon.hero.pos );

View File

@ -293,13 +293,23 @@ public class PixelScene extends Scene {
Game.runOnRenderThread(new Callback() {
@Override
public void call() {
BadgeBanner banner = BadgeBanner.show( badge.image );
banner.camera = uiCamera;
float offset = Camera.main.centerOffset.y;
banner.x = align( banner.camera, (banner.camera.width - banner.width) / 2 );
banner.y = align( uiCamera, (uiCamera.height - banner.height) / 2 - banner.height/2 - 16 - offset );
Scene s = Game.scene();
if (s != null) s.add( banner );
if (s != null) {
BadgeBanner banner = BadgeBanner.show(badge.image);
s.add(banner);
float offset = Camera.main.centerOffset.y;
int left = uiCamera.width/2 - BadgeBanner.SIZE/2;
left -= (BadgeBanner.SIZE * BadgeBanner.DEFAULT_SCALE * (BadgeBanner.showing.size()-1))/2;
for (int i = 0; i < BadgeBanner.showing.size(); i++){
banner = BadgeBanner.showing.get(i);
banner.camera = uiCamera;
banner.x = align(banner.camera, left);
banner.y = align(uiCamera, (uiCamera.height - banner.height) / 2 - banner.height / 2 - 16 - offset);
left += BadgeBanner.SIZE * BadgeBanner.DEFAULT_SCALE;
}
}
}
});
}

View File

@ -103,7 +103,7 @@ public class BuffIndicator extends Component {
public static final int NOINV = 53;
public static final int RANDOM = 54;
public static final int FIREDIED = 54;
public static final int FIREDIED = 55;
public static final int ROSEBARRIER= 56;
public static final int HALOMETHANEBURNING = 57;

View File

@ -0,0 +1,70 @@
package com.shatteredpixel.shatteredpixeldungeon.ui;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.windows.PageWindows;
public class LanterFireCator extends Button {
protected float lightness = 0;
public void flash() {
lightness = 1f;
}
private static boolean targeting = false;
private Toolbar.Tool slot;
private static Item item = null;
public LanterFireCator() {
int color=0x7C8072;
setSize( 21, 12 );
visible=false;
}
@Override
protected void createChildren() {
super.createChildren();
add(slot = new Toolbar.Tool(0, 64, 24, 70) {
@Override
protected void onClick() {
super.onClick();
GameScene.show(new PageWindows());
}
});
}
@Override
protected void layout() {
super.layout();
slot.setRect( x, y, width, height);
}
@Override
public void update() {
super.update();
slot.enable(Dungeon.hero.isAlive() && Dungeon.hero.ready);
if (item == null) {
visible = true;
}
else visible=true;
}
public static boolean targeting()
{
return targeting;
}
}

View File

@ -21,7 +21,8 @@
package com.shatteredpixel.shatteredpixeldungeon.ui;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.LIGHTBLACK;
import static com.shatteredpixel.shatteredpixeldungeon.SPDSettings.ClassPage;
import static com.shatteredpixel.shatteredpixeldungeon.Statistics.lanterfireactive;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
@ -30,7 +31,6 @@ import com.shatteredpixel.shatteredpixeldungeon.SPDSettings;
import com.shatteredpixel.shatteredpixeldungeon.Statistics;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.PureSoul;
import com.shatteredpixel.shatteredpixeldungeon.effects.CircleArc;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
@ -72,8 +72,6 @@ public class StatusPane extends Component {
private Image puresoul;
private BitmapText hgText;
private BitmapText puresoulText;
private Image exp;
private BitmapText expText;
@ -93,6 +91,7 @@ public class StatusPane extends Component {
public MainHandIndicator mainhand;
public BossSelectIndicator bossselect;
public JoinIndicator joinxxx;
public LanterFireCator lanter;
private static String asset = Assets.Interfaces.STATUS;
@ -151,8 +150,7 @@ public class StatusPane extends Component {
else hg = new Image(asset, 0, 45, 49, 4);
add( hg );
if (large) puresoul = new Image(asset, 0, 128, 128, 7);
else puresoul = new Image(asset, 0, 49, 52, 4);
puresoul = new Image(Assets.Interfaces.LANTERLING);
add( puresoul );
hpText = new BitmapText(PixelScene.pixelFont);
@ -164,11 +162,6 @@ public class StatusPane extends Component {
hgText.alpha(0.6f);
add(hgText);
puresoulText = new BitmapText(PixelScene.pixelFont);
puresoulText.alpha(0.6f);
add(puresoulText);
heroInfoOnBar = new Button(){
@Override
protected void onClick () {
@ -217,6 +210,9 @@ public class StatusPane extends Component {
joinxxx=new JoinIndicator();
add(joinxxx);
lanter=new LanterFireCator();
add(lanter);
}
@ -265,10 +261,11 @@ public class StatusPane extends Component {
heroInfoOnBar.setRect(heroInfo.right(), y + 19, 130, 20);
//buffs.setPos( x + 31, y );
//下半段
puresoul.visible = false;
// buffs.setPos( x + 31, y +15 );
// //下半段
// puresoul.visible = true;
busy.x = x + bg.width + 1;
busy.y = y + bg.height - 9;
@ -295,28 +292,24 @@ public class StatusPane extends Component {
hgText.y -= 0.001f; //prefer to be slightly higher
PixelScene.align(hgText);
puresoulText.scale.set(PixelScene.align(0.5f));
puresoulText.x = 31f;
puresoulText.y = 13f + (hg.height - (puresoulText.baseLine()+puresoulText.scale.y))/2f;
puresoulText.y -= 0.001f; //prefer to be slightly higher
PixelScene.align(puresoulText);
// puresoulText.scale.set(PixelScene.align(0.5f));
// puresoulText.x = 31f;
// puresoulText.y = 13f + (hg.height - (puresoulText.baseLine()+puresoulText.scale.y))/2f;
// puresoulText.y -= 0.001f; //prefer to be slightly higher
// PixelScene.align(puresoulText);
heroInfoOnBar.setRect(heroInfo.right(), y, 50, 9);
if(Dungeon.isChallenged(LIGHTBLACK)){
puresoul.x= 30.0f;
puresoul.y= 13.0f;
buffs.setPos( x + 36, y + 20 );
} else {
puresoul.x= 500f;
puresoul.y= 500f;
buffs.setPos( x + 31, y + 12 );
}
puresoul.x= 1.0f;
puresoul.y= 142.0f;
puresoul.visible = false; //
buffs.setPos( x + 31, y + 12 );
busy.x = x + 1;
busy.y = y + 33;
lanter.setPos(0, 500);
}
counter.point(busy.center());
@ -329,38 +322,65 @@ public class StatusPane extends Component {
super.update();
int maxHunger = (int) Hunger.STARVING;
int maxPureSole = Dungeon.hero.lanterfire;
int health = Dungeon.hero.HP;
int shield = Dungeon.hero.shielding();
int max = Dungeon.hero.HT;
int maxSoul = (int) PureSoul.PURESOULBASE;
int mtPureSole = 100;
//检查为光与影使用黑色模块
if(Dungeon.isChallenged(LIGHTBLACK)){
if (SPDSettings.ClassUI()) {
bg.texture = TextureCache.get(Assets.Interfaces.STATUSSOUL_DARK);
} else {
bg.texture = TextureCache.get(Assets.Interfaces.STATUSSOUL);
}
} else if (SPDSettings.ClassUI()) {
// int chCount = 0;
// for (int ch : Challenges.MASKS){
// if ((Dungeon.challenges & ch) != 0) chCount++;
// }
//
// if(chCount >= 3 && !Dungeon.isChallenged(PRO) && lanterfireactive){
// if (SPDSettings.ClassUI()) {
// bg.texture = TextureCache.get(Assets.Interfaces.STATUSSOUL_DARK);
// } else {
// bg.texture = TextureCache.get(Assets.Interfaces.STATUSSOUL);
// }
// } else
if (SPDSettings.ClassUI()) {
bg.texture = TextureCache.get(Assets.Interfaces.STATUS_DARK);
} else {
bg.texture = TextureCache.get(Assets.Interfaces.STATUS);
}
if (SPDSettings.ClassPage()) {
if (ClassPage()) {
page.setPos(0, 40);
pageb.setPos(0, 500);
mainhand.setPos(0, 51);
joinxxx.setPos(0, 78);
bossselect.setPos(0, 104);
if(lanterfireactive){
lanter.setPos(0, 500);
puresoul.visible = false;
}
} else {
page.setPos(0, 500);
pageb.setPos(0, 40);
mainhand.setPos(0, 500);
joinxxx.setPos(0, 500);
bossselect.setPos(0, 500);
//TODO 灯火前行
if(lanterfireactive){
lanter.setPos(0, 75);
lanter.visible = true;
lanter.active = true;
puresoul.visible =true;
puresoul.x= 1.0f;
puresoul.y= 142.0f;
}
}
if (!Dungeon.hero.isAlive()) {
avatar.tint(0x000000, 0.5f);
} else if ((health/(float)max) < 0.3f) {
@ -377,6 +397,12 @@ public class StatusPane extends Component {
hp.scale.x = Math.max( 0, (health-shield)/(float)max);
shieldedHP.scale.x = health/(float)max;
if(lanterfireactive) {
puresoul.scale.y = -Math.max( 0, (maxPureSole)/(float)mtPureSole);
} else {
puresoul.scale.y = -1.0f;
}
if (shield > health) {
rawShielding.scale.x = shield / (float) max;
} else {
@ -399,17 +425,6 @@ public class StatusPane extends Component {
hg.scale.x = 1.0f;
}
PureSoul PureSoulBuff = Dungeon.hero.buff(PureSoul.class);
if (PureSoulBuff != null) {
int sanity = Math.max(0, maxSoul - PureSoulBuff.soul());
puresoul.scale.x = (float) sanity / (float) maxSoul;
//puresoul.scale.x = 1.0f;
puresoulText.text(sanity + "/" + maxSoul);
}
else if (Dungeon.hero.isAlive()) {
puresoul.scale.x = 1.0f;
}
if (large) {
exp.scale.x = (128 / exp.width) * Dungeon.hero.exp / Dungeon.hero.maxExp();

View File

@ -8,6 +8,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.ColdGuardSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.DiedMonkLoaderSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.FlameBoiSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.GhostSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.IceCryStalSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.sprites.KagenoNusujinSprite;
@ -26,6 +27,7 @@ import java.util.ArrayList;
public class vM0_6_7_X_Changes {
public static void addAllChanges(ArrayList<ChangeInfo> changeInfos) {
add_v0_6_11_Changes(changeInfos);
add_v0_6_10_Changes(changeInfos);
add_v0_6_9_Changes(changeInfos);
add_v0_6_8_Changes(changeInfos);
@ -39,6 +41,30 @@ public class vM0_6_7_X_Changes {
add_v0_6_0_Changes(changeInfos);
}
public static void add_v0_6_11_Changes( ArrayList<ChangeInfo> changeInfos ) {
ChangeInfo changes = new ChangeInfo("v0.6.0.0-Beta21-p1.4-5", true, "");
changes.hardlight(Window.TITLE_COLOR);
changeInfos.add(changes);
changes = new ChangeInfo("新内容", false, null);
changes.hardlight(Window.TITLE_COLOR);
changeInfos.add(changes);
changes.addButton(new ChangeButton(new IceCryStalSprite(), ("浊焰魔女AI调整"),
("重新调整了浊焰魔女的AI属性")));
changes.addButton(new ChangeButton(new BlueBatSprite(), ("血影蝙蝠调整"),
("英雄15级后法术伤害面板调整")));
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_06X31")));
}
public static void add_v0_6_10_Changes( ArrayList<ChangeInfo> changeInfos ) {
ChangeInfo changes = new ChangeInfo("v0.6.0.0-Beta21-p1.2", true, "");
changes.hardlight(Window.TITLE_COLOR);

View File

@ -216,7 +216,8 @@ public class WndChallenges extends Window {
protected boolean onClick(float x, float y){
if(!inside(x,y)) return false;
if(active) onClick();
if(active)
onClick();
return true;
}

View File

@ -38,6 +38,8 @@ public class WndInfoMob extends WndTitledMessage {
}
private static class MobTitle extends Component {
private static final int GAP = 2;

View File

@ -40,6 +40,7 @@ import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.InterlevelScene;
import com.shatteredpixel.shatteredpixeldungeon.scenes.IntroScene;
import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
import com.shatteredpixel.shatteredpixeldungeon.scenes.TitleScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.ActionIndicator;
@ -50,7 +51,6 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock;
import com.shatteredpixel.shatteredpixeldungeon.ui.StyledButton;
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
import com.shatteredpixel.shatteredpixeldungeon.utils.DungeonSeed;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.ColorBlock;
import com.watabou.noosa.Game;
import com.watabou.noosa.Image;
@ -71,8 +71,7 @@ public class WndStartGame extends Window {
text = DungeonSeed.formatText(text);
if(positive) {
SPDSettings.customSeed(text);
//抛出一个问题保证初始化成功
throw new RuntimeException("成功,信息已录入");
ShatteredPixelDungeon.switchScene(TitleScene.class);
}
}
}));
@ -282,7 +281,6 @@ public class WndStartGame extends Window {
Game.switchScene( IntroScene.class );
} else {
Game.switchScene( InterlevelScene.class );
GLog.n(SPDSettings.customSeed());
}
}

View File

@ -151,11 +151,15 @@ public class WndTradeItem extends WndInfoItem {
btnStole.setRect( 0, pos + GAP, width, BTN_HEIGHT );
btnStole.icon(Statistics.fireGirlnoshopping && !Statistics.deadshoppingdied ? new FireMagicGirlSprite() :
new ShopGuardDead.ShopGuardianRedSprite());
add( btnStole );
if(shopOnLevel()){
pos = btnStole.bottom();
btnStole.visible=true;
} else {
pos = btnBuy.bottom()-4;
pos = btnBuy.bottom()-2;
btnStole.visible=false;
}