update 0.6.1-Beta1 Code

This commit is contained in:
LingASDJ 2023-03-04 22:37:08 +08:00
parent 355b5330fa
commit ebfce4f6b3
65 changed files with 1409 additions and 588 deletions

View File

@ -76,7 +76,7 @@ public class RenderedText extends Image {
private synchronized void measure(){
if (Thread.currentThread().getName().equals("CAPD Actor Thread")){
if (Thread.currentThread().getName().equals("SHPD Actor Thread")){
throw new RuntimeException("Text measured from the actor thread!");
}

View File

@ -73,7 +73,7 @@ public class TextInput extends Component {
skin = new Skin(FileUtils.getFileHandle(Files.FileType.Internal, "gdx/textfield.json"));
TextField.TextFieldStyle style = skin.get(TextField.TextFieldStyle.class);
style.font = Game.platform.getFont(size, "", false, false,false);
style.font = Game.platform.getFont(size, "", false, false,true);
style.background = null;
textField = multiline ? new TextArea("", style) : new TextField("", style);
textField.setProgrammaticChangeEvents(true);
@ -83,7 +83,7 @@ public class TextInput extends Component {
textField.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
BitmapFont f = Game.platform.getFont(size, textField.getText(), false, false,false);
BitmapFont f = Game.platform.getFont(size, textField.getText(), false, false,true);
TextField.TextFieldStyle style = textField.getStyle();
if (f != style.font){
style.font = f;

View File

@ -23,7 +23,6 @@ package com.watabou.utils;
import com.badlogic.gdx.Application;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.PixmapPacker;
@ -179,66 +178,16 @@ public abstract class PlatformSupport {
//does nothing by default
}
public boolean supportsFullScreen(){
switch (Gdx.app.getType()){
case Android:
//Android 4.4+ supports hiding UI via immersive mode
return Gdx.app.getVersion() >= 19;
case iOS:
//iOS supports hiding UI via drawing into the gesture safe area
return Gdx.graphics.getSafeInsetBottom() != 0;
default:
//TODO implement functionality for other platforms here
return true;
}
}
public boolean isAndroid() {
return Gdx.app.getType() == Application.ApplicationType.Android;
}
public boolean isiOS() {
return Gdx.app.getType() == Application.ApplicationType.iOS;
}
public boolean isDesktop() {
return Gdx.app.getType() == Application.ApplicationType.Desktop;
}
public boolean hasHardKeyboard() {
return Gdx.input.isPeripheralAvailable(Input.Peripheral.HardwareKeyboard);
}
public boolean isDebug() {
return Game.version.contains("INDEV");
}
public boolean isSnapshot() {
return Game.version.contains("SNAPSHOT");
}
public boolean openURI( String URI ) {
return Gdx.net.openURI(URI);
}
public void log( String tag, String message ){
Gdx.app.log( tag, message );
}
public void debug( String message ) {
if (isDebug()) Gdx.app.log("DEBUG", message);
}
public void setClipboardContents( String str ) {
Gdx.app.getClipboard().setContents( str );
}
public String getClipboardContents() {
return Gdx.app.getClipboard().getContents();
}
public boolean isClipboardEmpty() {
return !Gdx.app.getClipboard().hasContents();
}
}

View File

@ -340,12 +340,6 @@ public class AndroidPlatformSupport extends PlatformSupport {
public boolean isAndroid() {
return true;
}
@Override
public boolean isiOS() {
return false;
}
@Override
public boolean isDesktop() {
return false;

View File

@ -16,8 +16,8 @@ allprojects {
appName = 'Magic Ling Pixel Dungeon'
appPackageName = 'com.ansdomagiclingpixeldungeon.ling'
appVersionCode =700925
appVersionName = '0.6.0.0-Beta21-p3-PreTest4.3'
appVersionCode =800000
appVersionName = '0.6.1.0-Beta1(P3)'
appJavaCompatibility = JavaVersion.VERSION_1_8

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -70,7 +70,7 @@ 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.magicgirlsayslowy.desc=缓慢的走向死亡吧……\n\n本大层英雄每移动10回合获得3回合残废。
actors.buffs.magicgirldebuff.magicgirlsaysoftdied.name=魔女的低语-软弱
actors.buffs.magicgirldebuff.magicgirlsaysoftdied.desc=软弱不是你的缺点,恐惧才是!\n\n本大层所有被护甲减免过的物理伤害增加5%
@ -80,7 +80,7 @@ actors.buffs.magicgirldebuff.magicgirlsaymoneymore.desc=贪婪的欲望是人类
### Good Blees Buffs
actors.buffs.clearbleesdgoodbuff.blessgoodstr.name=纯洁的祝福-坚毅
actors.buffs.clearbleesdgoodbuff.blessgoodstr.desc=坚毅是我们不屈的斗志!\n\n本大层玩家额外追加8点力量
actors.buffs.clearbleesdgoodbuff.blessgoodstr.desc=坚毅是我们不屈的斗志!\n\n本大层玩家额外追加3点力量
actors.buffs.clearbleesdgoodbuff.blessnomoney.name=纯洁的祝福-富饶
actors.buffs.clearbleesdgoodbuff.blessnomoney.desc=魔女的气息在我们身旁徘徊,商人们一定会对你毕恭毕敬。\n\n本大层商店全场打3折
@ -89,13 +89,13 @@ actors.buffs.clearbleesdgoodbuff.blessmobdied.name=纯洁的祝福-安息
actors.buffs.clearbleesdgoodbuff.blessmobdied.desc=安息吧!怪物们!!!\n\n本大层英雄物理伤害x2!
actors.buffs.clearbleesdgoodbuff.blessmixshiled.name=纯洁的祝福-守护
actors.buffs.clearbleesdgoodbuff.blessmixshiled.desc=守护我们最后的种子!\n\n本大层英雄在血满的情况下每300回合获得一些护盾。
actors.buffs.clearbleesdgoodbuff.blessmixshiled.desc=守护我们最后的种子!\n\n本大层英雄在血满的情况下每100回合获得一些护盾。
actors.buffs.clearbleesdgoodbuff.blessimmune.name=纯洁的祝福-隐没
actors.buffs.clearbleesdgoodbuff.blessimmune.desc=隐没在这人群之中,我们便是超凡脱俗的个体\n\n本大层英雄免疫魔法效果和减少20%的伤害。
actors.buffs.clearbleesdgoodbuff.blessimmune.desc=隐没在这人群之中,我们便是超凡脱俗的个体\n\n本大层英雄免疫诅咒效果和减少40%的物理伤害。
actors.buffs.clearbleesdgoodbuff.blessgoread.name=纯洁的祝福-前路
actors.buffs.clearbleesdgoodbuff.blessgoread.desc=行走在这令人惧怕的地牢中,灯火是前路的指引\n\n本大层英雄饥饿值高于90%的情况下,获得每两回合+2的血量
actors.buffs.clearbleesdgoodbuff.blessgoread.desc=行走在这令人惧怕的地牢中,灯火是前路的指引\n\n本大层英雄灯火值高于60%的情况下,获得每回合进行血量回复
###MLPD
actors.mobs.bosses.crossdiedtower.dead=控制目标已丢失,已自动摧毁……
@ -203,7 +203,7 @@ text.herostat.real_time = 总时间
text.herostat.seed_dungeon = 种子序列号
text.herostat.seed_custom_no =
text.textchallenges.seed_custom_title = 种子
text.textchallenges.hint = 不输入即为随机种子
text.textchallenges.hint =
text.textchallenges.delete_seed_input = 清除
actors.mobs.bloodbat$bloodbatrecharge.name=血影充能
@ -282,7 +282,7 @@ actors.buffs.reloadshop.name=购买成功!
actors.buffs.reloadshoptwo.heromsg=
actors.buffs.reloadshoptwo.name=刷新成功
actors.mobs.bosses.dwarfmaster.name=矮人大师领主
actors.mobs.bosses.dwarfmaster.name=矮人将军
actors.mobs.bosses.dwarfmaster.desc=前矮人王国正规军首领,如今已经被邪恶魔法腐蚀同化。\n\n他仍然记得矮人王国曾经的辉煌也记得矮人王国最后的灭亡。你的到来他明显认为是入侵者小心行事他作为前矮人王国的正规军首领作风往往比现阶段的矮人国王更加残暴。\n\n失败不代表一切死亡不代表结束。
actors.mobs.bosses.dwarfmaster.death_rattle=矮人王国……最终还是失败了吗……
actors.mobs.bosses.dwarfmaster.notice=你 是 谁 ?! 为 什 么 踏 入 了 这 里 ?
@ -308,9 +308,9 @@ actors.mobs.bosses.dwarfmaster$dkghoul.rankings_desc=被大师说服加入了矮
actors.mobs.bosses.dwarfmaster$dkmonk.rankings_desc=被大师说服加入了矮人亡灵军队
actors.mobs.bosses.dwarfmaster$dkwarlock.rankings_desc=被大师说服加入了矮人亡灵军队
actors.mobs.bosses.dwarfmaster.rankings_desc=被大师说服加入了矮人亡灵军队
actors.mobs.bosses.dwarfmaster.no_rose=矮人大师领主:她的力量不能在这里帮助你!
actors.mobs.bosses.dwarfmaster.no_fire=矮人大师领主:免疫火焰?这里不允许你这样!
actors.mobs.bosses.dwarfmaster.no_inst=矮人大师领主:直面我,不要躲在暗处!
actors.mobs.bosses.dwarfmaster.no_rose=矮人将军:她的力量不能在这里帮助你!
actors.mobs.bosses.dwarfmaster.no_fire=矮人将军:免疫火焰?这里不允许你这样!
actors.mobs.bosses.dwarfmaster.no_inst=矮人将军:直面我,不要躲在暗处!
actors.mobs.dimandmimic.name=钻石宝箱怪
actors.mobs.dimandmimic.desc=长得几乎和钻石宝箱王一模一样,但是远比宝箱王弱的多!
@ -600,7 +600,7 @@ actors.mobs.npcs.slyl.readbooks=温馨提示:教程书籍正在翻修,敬请
actors.mobs.npcs.slyl.def_verb=风暴将临
actors.mobs.npcs.slyl.desc=_冷群_是一位掌握冰系力量的魔女是300年前_寒冰圣都_的管理者。\n由于地下异常的不断出现她来到这里调查异常的原因。\n看起来她似乎正在摸鱼。
actors.mobs.npcs.slyl.howuse=你好,我是冷群。\n\n欢迎使用我们_寒冰圣都_的可以扰乱_魔力流_的_魔法金币_,通过它我们可以看见_特定的首领_。\n\n其中_抛动一次_会出现_天痕粘咕(5层),天狗(10层)DM300(15层),矮人国王(20层),Yog(25层)_\nΠ抛动两次Π是_史莱姆王(5层),钻石宝箱王(10层)DM720(15层),矮人大师领主(20层),Yog-Zot(25层)_\nΞ抛动三次Ξ是_(15层 寒冰魔女)_(抛动三次次仅在_特定楼层显示_)\n\n同时仅在Boss前一楼层显示每一次的最后的一次抛动将会决定下一层Boss的生成。\n\n好的以上就是_使用方法和介绍了_祝你_地牢冒险愉快_。
actors.mobs.npcs.slyl.howuse=你好,我是冷群。\n\n欢迎使用我们_寒冰圣都_的可以扰乱_魔力流_的_魔法金币_,通过它我们可以看见_特定的首领_。\n\n其中_抛动一次_会出现_天痕粘咕(5层),天狗(10层)DM300(15层),矮人国王(20层),Yog(25层)_\nΠ抛动两次Π是_史莱姆王(5层),钻石宝箱王(10层)DM720(15层),矮人将军(20层),Yog-Zot(25层)_\nΞ抛动三次Ξ是_(15层 寒冰魔女)_(抛动三次次仅在_特定楼层显示_)\n\n同时仅在Boss前一楼层显示每一次的最后的一次抛动将会决定下一层Boss的生成。\n\n好的以上就是_使用方法和介绍了_祝你_地牢冒险愉快_。
actors.mobs.npcs.nxhy.guards=看来你需要更加艰难的试炼了。
actors.mobs.npcs.nxhy.thief=看来你需要更加艰难的试炼了。

View File

@ -20,6 +20,13 @@ items.food.crivusfruitsfood.eat_msg2=你感觉味道十分不错,香甜可口
items.quest.crivusfruitsflake.name=赤果碎片
items.quest.crivusfruitsflake.desc=克里弗斯之果破碎时,炸的四分五裂,但看起来大概无法食用。\n\n物品自身并没有什么实际用途但长期的魔力汲取让它拥有一股神秘的力量或许它能商人眼前一亮。它本身还可以用作炼金制作一些不错的东西。再不济它也能提供相当的炼金能量。
items.wands.wandofhighthunderstorm.name=风暴雷霆法杖
items.wands.wandofhighthunderstorm.staff_name=雷暴之杖
items.wands.wandofhighthunderstorm.ondeath=你用风暴雷霆法杖杀死了自己…
items.wands.wandofhighthunderstorm.desc=这根法杖由神秘的水晶和雷霆法杖和一些炼金反应原料综合制成,顶部镶嵌有紫色的宝石,电弧正在顶端两个内弯的叉齿间跳跃。
items.wands.wandofhighthunderstorm.stats_desc=这支法杖能向任何瞄准的地方射出一道极其强大的电弧并在附近生成水雾造成_%1$d~%2$d点伤害_。这道闪电能在附近多个目标间跳跃在水里会更强力。要是太接近同样可能电到你自己却不会波及到你的同伴。
items.wands.wandofhighthunderstorm.bmage_desc=当_战斗法师_以雷暴之杖近战攻击目标时能像拥有电击附魔一样有概率释放电弧攻击附近的目标同时获得额外的奥术护盾。
items.wands.wandofhighthunderstorm.eleblast_desc=雷暴之杖的元素风暴造成15%伤害击晕目标8回合并使水体带电。
###MLPD
items.lightblack.oilpotion.name= 油瓶

View File

@ -40,7 +40,7 @@ journal.document.alchemy_guide.exotic_scrolls.body=将一张卷轴与一些炼
journal.document.alchemy_guide.bombs.title=改造炸弹
journal.document.alchemy_guide.bombs.body=一个标准的黑火药炸弹可以与一个特定的物品共炼来制作一个强化炸弹。
journal.document.alchemy_guide.weapons.title=强化武器
journal.document.alchemy_guide.weapons.body=投掷武器与法杖也可参与到炼金反应当中!\n\n每个投掷物可以融化为一定量的液金足以完全修复阶级与等级一样的单件投掷物。\n\n法杖可以裂解为一定量的奥术聚酯足以升级两把同等级的法杖。不可通过此方法将法杖升级至+3以上。
journal.document.alchemy_guide.weapons.body=投掷武器与法杖也可参与到炼金反应当中!\n\n每个投掷物可以融化为一定量的液金足以完全修复阶级与等级一样的单件投掷物。\n\n法杖可以裂解为一定量的奥术聚酯足以升级两把同等级的法杖。不可通过此方法将法杖升级至+3以上。\n\n通过注入击败Boss的战利品可以获得更加高阶的法杖并且每个高阶法杖都有至少+2的保底最高+4,优先使用0级法杖如果已经有等级请手动放入炼金釜中。
journal.document.alchemy_guide.catalysts.title=炼制催化剂
journal.document.alchemy_guide.catalysts.body=催化剂可以用一张卷轴或一瓶药水与一个种子或一个符石制得。如果原料较为匹配,将不会消耗炼金能量。\n\n催化剂的主要用处是在接下来两页的配方中充当炼金原料不过也可以直接使用以获取一种随机效果。
journal.document.alchemy_guide.brews_elixirs.title=炼制魔药与秘药

View File

@ -87,19 +87,22 @@ 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.kill_dm=击败拟态之王\n\n一场”公平"的讨伐
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不叠加)_
badges$badge.firegirl=击败圣火魔女-莲娜\n\n雪凛峡谷的守护者
badges$badge.slimepr=击败史莱姆公主\n\n妥协的结果
badges$badge.drawf_head=击败矮人大师领主\n\n矮人王国的正规军残党
badges$badge.drawf_head=击败矮人将军\n\n矮人王国的正规军残党
badges$badge.kill_apple=击败克里弗斯之果\n\n盘踞在森林底部的幕后“主谋"
badges$badge.spicealboss=累计击败全部特殊BOSS\n\n风暴正在降临
badges$badge.nyz_shop=奈亚大亨\n\n让奈亚子自愿入驻0层\n\n_奖励0层奈亚子常驻1200初始金币5次奈亚子终端商店购买权限_
challenges.no_food=缩餐节食
challenges.no_food_desc=食物本就稀缺,但你还需要注意节食!\n\n・使用各类食物与丰饶之角的饱腹效果为原本的三分之一。\n・其他恢复饥饿的机制不受影响。
challenges.no_armor=信念护体
challenges.no_armor_desc=要相信自己,因为不能相信护甲了!\n\n・布甲之外所有护甲的基本防御力降低。\n・所有护甲被升级时增长的防御力大幅降低。\n・灵壤守护者的防御力大幅降低。
challenges.no_armor_desc=要相信自己,因为不能相信护甲了!\n\n・布甲之外所有护甲被禁止生成。\n・所有护甲被升级时增长的防御力大幅降低。\n・灵壤守护者的防御力大幅降低。
challenges.no_healing=恐药异症
challenges.no_healing_desc=治疗药水真是种好东西,可惜你对它过敏!\n\n・治疗药水以及使用治疗药水炼制的道具将无法治愈英雄反而会使英雄中毒。\n・炼金催化剂不会随机到治愈英雄或使英雄中毒的效果。\n・这些道具对其他角色依然发挥正常效果。
challenges.no_herbalism=荒芜之地
@ -112,14 +115,14 @@ challenges.no_scrolls=禁忌咒文
challenges.no_scrolls_desc=其中一种卷轴符文会变得更稀有。只不过,每次都是最有用的那种。\n\n- 移除地牢中半数的升级卷轴
rankings$record.something=在黑暗中被击杀
challenges.aquaphobia=_污泥浊水_
challenges.aquaphobia=污泥浊水
challenges.aquaphobia_desc=地牢的水也被污染了\n\n圣境层到矮人层踩水将会获得DeBuff,玩家在开局获得4瓶水灵药水饮用可获得100回合的踩水不获得Debuff时间并获得祝福。\n注意矮人层饮用漂浮药剂或者水灵药剂都会获得极速Buff且每大层会额外产生食人鱼房间。
challenges.champion_enemies=_精英战场_
challenges.champion_enemies=精英战场
challenges.champion_enemies_desc=会升级的不止你一个!\n\n・普通敌人刷出时有 1/8 \
的机率拥有特殊的精英属性。\n・精英敌人刷出时会立即醒来。\n・精英敌人免疫腐化效果。\n\n精英敌人有七种\n_烈焰橙色_ 近战伤害 \
+25% 且带有点燃效果,免疫火焰,死亡时引燃周围。\n_索敌紫色_ 近战伤害 +25%,近战范围 +4。\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_DM-300_生命 +60%\n_-_ 能量塔更坚固。\n_-_ 技能频率更高,威力也更强大\n_-_ 超载时移动速度更高\n_-_ 击败时必掉落荆棘斗篷\n_矮人国王:_生命 +50%\n_-_ 整场战斗内召唤的随从都更强大\n_-_ 第一阶段:技能与召唤频率都更高\n_-_ 第二阶段:每轮额外召唤两个随从\n_-_ 第三阶段:生命值 +100%,召唤频率更高\n_Yog-Dzewa:_\n_-_ 同时召唤两个古神之拳!\n_-_ 激光攻击伤害 +60%\n_-_ 召唤更强大的随从
challenges.stronger_bosses=梦魇Boss[尚未完成]
challenges.stronger_bosses_desc=这项挑战让挑战 Boss 变得更有挑战性了!\n\n_天狗_生命 +25%\n_-_ 第一阶段:陷阱更加致命\n_-_ 第二阶段:技能频率更高\n_钻石宝箱王_: 生命+20%\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=你受到了来自水的伤害!
challenges.pro=Δ开发者模式Δ
challenges.pro_desc=供测试和开发使用\n开局_几乎是全物品_同时你将无法通关也无法记录在排行榜上面。
@ -128,16 +131,14 @@ challenges.hard = 梦境之声-T2挑战
challenges.warning = 寻觅之声-T3挑战
challenges.test = 测试时间-DEBUG
challenges.rlpt = Π支离破碎Π
challenges.rlpt_desc=地下涌动的神秘力量正在渐渐腐蚀这里,这里不过是而言是另一场噩梦。\n\n从第六层开始怪物必定有几个不是本大层的怪物但不会超过两级。一般来说在监狱遇到矮人层的怪物几率很小。通常遇到矿洞层的怪物。
challenges.rlpt_desc=地下涌动的神秘力量正在渐渐腐蚀这里,这里不过是而言是另一场噩梦。\n\n从第六层开始怪物必定有几个不是本大层的怪物但不会超过两级。一般来说在监狱遇到矮人层的怪物几率很小。通常遇到矿洞层的怪物。\n\n_地牢环境已发生改变请小心应对。(种子可能会有生成变动)_
challenges.sbsg = Π基因突变Π
challenges.sbsg_desc=地牢中的神秘魔力让一些生物发生了重大的变化\n-所有生物都会因为突变激素变得各不相同,给探索地牢的脚步带来更大的困难。\n-敌人有5种突变类型\n突变失败体_(30%概率)_:近战伤害减少35%,移速提高到1.3。\n突变爆炸体_(25%概率)_:移速减少50%,攻击力降低30%,但死亡时拥有爆炸伤害。\n突变完全体_(20%概率)_:移速和攻击力各提高25%,且拥有30%伤害减免。\n突变危险体_(15%概率)_:攻击力提升20%,攻击有10%概率造成流血。死亡时有5%概率立刻向本层发出警报。\n突变烟雾体_(10%概率)_:攻击力减少10%,攻击范围+2攻击敌人10%概率造成眩晕……\n\n_特别说明如果开启精英强敌则属于EX模式,词条会和精英词条共存_
challenges.exsg = Π药水癔症Π
challenges.exsg_desc=药水癔症详细规则:\n力量药水 力量-1\n灵视药剂 喝后失明5回合\n隐形药剂 喝后立刻怒吼\n经验药剂 喝后立刻流血6回合\n极速药剂 喝后立刻残废8回合\n==========================\n小型口粮 吃后立刻获得极速8回合\n炖肉 吃后立刻升级\n冷冻生肉片 吃后获得奥术护盾\n全肉大饼 吃后立刻获得8回合极速 且+1力量\n不知道何种原因大部分正面药水你都感觉有毒\n部分药水完全处于DeBuff,但食物却会很有用!而且地牢里面还会追加自动售货机,会售卖一些更加高级的东西。
challenges.light&black = Π空洞旅程Π
challenges.light&black_desc=\n_一次次的踏入地牢只会使自己更加的被恶毒的魔法侵蚀。_这一次你已不知道是何时再来到这个地牢但邪恶的诡异气氛扑面而来。一个神秘人给了你一个提灯。你却不知道何时会被这里的魔法吞噬。\n\n开启本挑战将会获得在开局获得特殊理智Buff并且追加一个新道具_提灯_提灯的精神力量需要玩家击败敌人获得。\n\n_只有光芒中你才能活下去。否则你会被黑暗蚕食一点点的丧失理智成为怪物。_\n\n详情请看更新记录
challenges.sbsg_desc=地牢中的神秘魔力让一些生物发生了重大的变化\n-所有生物都会因为突变激素变得各不相同,给探索地牢的脚步带来更大的困难。\n-敌人有5种突变类型\n突变失败体_(30%概率)_:近战伤害减少35%,移速提高到1.3。\n突变爆炸体_(25%概率)_:移速减少50%,攻击力降低30%,但死亡时拥有爆炸伤害。\n突变完全体_(20%概率)_:移速和攻击力各提高25%,且拥有30%伤害减免。\n突变危险体_(15%概率)_:攻击力提升20%,攻击有10%概率造成流血。死亡时有5%概率立刻向本层发出警报。\n突变烟雾体_(10%概率)_:攻击力减少10%,攻击范围+2攻击敌人10%概率造成眩晕……\n\n_特别说明如果开启精英强敌词条会和精英词条共存_
challenges.custom = 自定义功能
challenges.dhxd =_灯火前路_
challenges.exsg = Π药水癔症Π
challenges.exsg_desc=药水癔症详细规则:\n力量药水--20%概率力量-1\n灵视药剂--50%概率喝后失明5回合\n隐形药剂--30%概率喝后立刻怒吼\n经验药剂--40%概率喝后立刻流血6回合\n极速药剂--50%概率喝后立刻残废8回合\n==========================\n小型口粮 吃后立刻获得极速8回合\n炖肉 吃后立刻升级\n冷冻生肉片 吃后获得奥术护盾\n全肉大饼 吃后立刻获得8回合极速 且+1力量\n不知道何种原因大部分正面药水你都感觉有毒\n部分药水完全处于DeBuff,但食物却会很有用!而且地牢里面还会追加自动售货机,会售卖一些更加高级的东西。\n\n_地牢环境已发生改变请小心应对。(种子可能会有生成变动)_
challenges.dhxd =灯火前路
challenges.dhxd_desc= 灯火指引着前进的道路,提灯引路,灯火前行![此为三挑以上的特殊机制,但你也可以直接开启它!]
dlc.bossrush=首领对决

View File

@ -8,6 +8,11 @@ scenes.gamescene.examine=调查这里
scenes.gamescene.interact=与之对话
scenes.gamescene.pick_up=拾取此物
#挑战模式
scenes.heroselectscene$4$1.title0=挑战模式
windows.wndchallenges.title0=挑战-Page1
windows.wndchallenges.title9=挑战-Page2
scenes.gamescene.snowcynon=你现在的当前位置:雪凛峡谷
scenes.gamescene.descend=你降入了地牢的第%d层。
@ -107,7 +112,7 @@ scenes.changesscene.who=MLPD详细日志摘要
scenes.aboutselectscene.title=关于游戏
scenes.alchemyscene.title=炼金
scenes.alchemyscene.text=放入材料以制作新的道具!
scenes.alchemyscene.select=选择一件物品z
scenes.alchemyscene.select=选择一件物品
scenes.alchemyscene.cost=能量消耗:%d
scenes.alchemyscene.energy=能量:

View File

@ -489,5 +489,7 @@ ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x39=-P2.925\n1.修复红龙之王的
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x40=-P2.940\n1.修复史莱姆王的崩溃\n2.修复污泥浊水的漂浮仍然可以吃到Debuff的问题\n3.修复寒冰魔女的Bug\n4.重写部分代码,并加以优化\n5.提灯功能部分小改进和Bug修复\n6.修复楼层的越界问题\n7.修复极度恐慌卷轴可以秒杀Boss的问题\n8.PC端现在是共存包了不会出现存档冲突的情况
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x50=-V0.6.1--P3\n1.修复红龙之王的崩溃\n2.修复雪凛峡谷可能无法出去的问题,如果魔法书失效了,也可以直接与商人领主对话进行离开
//ui.changelist.mlpd.vm0_5_x_changes.xxx//

View File

@ -1,8 +1,11 @@
windows.textchallenges.seed_custom_title = 种子
windows.textchallenges.hint = 不输入即为随机种子
windows.textchallenges.hint =
windows.textchallenges.delete_seed_input = 清除
windows.wndsettings$extendtab.fpsdisplay=显示帧率
windows.newwndchallenges$1$1.title=挑战模式-Page1
windows.newwndchallenges$2$1.title=挑战模式-Page2
windows.wndsettings$extendtab.fpsdisplay=显示日期与时间
windows.wndautoshop.welcome=自动食品售货机
windows.wndautoshop.xwelcome=欢迎……客人……,请……自行……挑选购买……,全场
@ -40,6 +43,8 @@ windows.wndkingshop.king=商人领主
windows.wndkingshop.select=干得漂亮你已经让莲娜对你刮目相看。作为报答_全场500金币售价_!(如果没有物品请点击刷新或随处走走)
windows.wndkingshop.sellmod=出售
windows.wndkingshop.reloadshop=刷新
windows.wndkingshop.goback=回家
windows.wndkingshop.back=一路顺风,伙计!
windows.wndshopking.szo=商人领主
windows.wndshopking.ary=你已经准备好直面我们的守护神了吗?
@ -107,12 +112,12 @@ windows.wndsettings$extendtab.pc_ui=实验功能应用PC端界面)
windows.pagewindows$pagewindowstab.title=左侧快捷栏设置
windows.pagewindows$pagewindowstab.page_ui=显示快捷栏
windows.bosssettingwindows.title = 染血金币控制终端
windows.bosssettingwindows.boss_1 = 直面史莱姆王
windows.bosssettingwindows.boss_2 = 直面钻石宝箱王
windows.bosssettingwindows.boss_3 = 直面冰雪魔女
windows.bosssettingwindows.boss_4 = 直面矮人大师
windows.bosssettingwindows.boss_5 = 直面Yog-Zot
windows.bosssettingwindows.title = 染血金币控制终端
windows.bosssettingwindows.boss_1 = 深入丛林调查
windows.bosssettingwindows.boss_2 = 探寻宝藏迷宫
windows.bosssettingwindows.boss_3 = 追查矿洞主谋
windows.bosssettingwindows.boss_4 = 对峙矮人将军
windows.bosssettingwindows.boss_5 = 直面邪魂魔心
windows.bosssettingwindows.dm300=DM-300
windows.bosssettingwindows.ice=冰雪魔女
@ -353,7 +358,7 @@ windows.wndsettings$langstab.credits=制作名单
windows.wndsettings$langstab.reviewers=审核员
windows.wndsettings$langstab.translators=翻译员
windows.wndstory.sewers=繁茂的林木构筑成了地牢的表层部分。尽管还没进入地牢,地底深处的黑暗能量却是已经渗透到地表了。\n这里的树木相较于其他地方更为浓密即使是在白天也很难见到阳光。\n不过黑暗能量对这儿的影响似乎仅限于此——如果你不在乎那些莫名其妙出现的小生物那这儿也和其他树茂密的森林没什么两样。
windows.wndstory.sewers=繁茂的林木构筑成了地牢的表层部分。尽管还没进入地牢,地底深处的黑暗能量却是已经渗透到地表了。\n这里的树木相较于其他地方更为浓密即使是在白天也很难见到阳光。\n不过黑暗能量对这儿的影响似乎仅限于此——如果你不在乎那些莫名其妙出现的小生物那这儿也和其他树茂密的森林没什么两样。
windows.wndstory.sewersboss=森林的底部并不像往常那样只有树根,而是遍布着翠绿的藤蔓。\n它们编织成一张大网将所有不慎跌落谷底的生命体供给给中间那粒鲜红的果实。\n这里是森林一切生命力的源泉这里是森林之肺。

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 75 KiB

View File

@ -284,6 +284,8 @@ public class Assets {
public static final String HUNTRESS = "splashes/huntress.jpg";
public static final String GDX = "splashes/gdx.png";
public static final String ANSDOSHIP = "splashes/ansdoship.png";
public static final String MLPD2Y = "splashes/mlpd2y.png";
}
public static class Sprites {

View File

@ -154,7 +154,7 @@ public class Badges {
VICTORY_ALL_CLASSES ( 98, true ),
GAMES_PLAYED_3 ( 99, true ),
CHAMPION_1X ( 100 ),
KILL_SLMKING (101),
KILL_APPLE(101),
KILL_DM720 (102),
RLPT (103),
@ -574,11 +574,11 @@ public class Badges {
}
public static void ENDDIED() {
Badge badge = Badge.ENDIED;
local.add( badge );
displayBadge( badge );
validateYASD();
// Badge badge = Badge.ENDIED;
// local.add( badge );
// displayBadge( badge );
//
// validateYASD();
}
public static void DeathRedNercols() {
@ -670,9 +670,8 @@ 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_DM) ) {
if (global.contains( Badge.KILL_APPLE ) &&global.contains( Badge.KILL_DM720 ) &&
global.contains( Badge.KILL_MG) && global.contains( Badge.FIREGIRL) && global.contains( Badge.DRAWF_HEAD)) {
Badge badge = Badge.SPICEALBOSS;
displayBadge( badge );
@ -932,8 +931,8 @@ public class Badges {
displayBadge( Badge.HAPPY_END );
}
public static void KILLSLIMKING() {
displayBadge( Badge.KILL_SLMKING );
public static void KILLSAPPLE() {
displayBadge( Badge.KILL_APPLE);
validateAMZ();
}

View File

@ -27,10 +27,12 @@ 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.Awareness;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Light;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicalSight;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MindVision;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.RevealedArea;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.TestDwarfMasterLock;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.huntress.SpiritHawk;
@ -53,10 +55,13 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfRegrowth;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfWarding;
import com.shatteredpixel.shatteredpixeldungeon.journal.Notes;
import com.shatteredpixel.shatteredpixeldungeon.levels.CaveTwoBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.CavesGirlDeadLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.CavesLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.CityLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.ColdChestBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.DeadEndLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.DimandKingLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.DwarfMasterBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.ForestBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.HallsLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.LastLevel;
@ -65,9 +70,11 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.LinkLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.NewCavesBossLevel;
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.SewerLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.ShopBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.YogGodHardBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.ZeroLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret.SecretRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.SpecialRoom;
@ -398,10 +405,9 @@ public class Dungeon {
level = new PrisonLevel();
break;
case 10:
// if((Statistics.boss_enhance & 0x2) != 0) level = new DimandKingLevel();
// else
level = new ColdChestBossLevel();
if((Statistics.boss_enhance & 0x2) != 0) level = new DimandKingLevel();
else
level = new PrisonBossLevel();
break;
case 11:
case 12:
@ -410,13 +416,13 @@ public class Dungeon {
level = new CavesLevel();
break;
case 15:
// if (SPDSettings.level3boss()==3){
// level = new CavesGirlDeadLevel();
// } else if (SPDSettings.level3boss()==2){
// level = new CaveTwoBossLevel();
// } else {
if (SPDSettings.level3boss()==3){
level = new CavesGirlDeadLevel();
} else if (SPDSettings.level3boss()==2){
level = new CaveTwoBossLevel();
} else {
level = new NewCavesBossLevel();
// }
}
break;
case 16:
case 17:
@ -425,12 +431,12 @@ public class Dungeon {
level = new CityLevel();
break;
case 20:
// if((Statistics.boss_enhance & 0x8) != 0) {
// Buff.affect(hero, TestDwarfMasterLock.class).set((1), 1);
// level = new DwarfMasterBossLevel();
// break;
// }
// else
if((Statistics.boss_enhance & 0x8) != 0) {
Buff.affect(hero, TestDwarfMasterLock.class).set((1), 1);
level = new DwarfMasterBossLevel();
break;
}
else
level = new NewCityBossLevel();
break;
case 21:
@ -440,9 +446,8 @@ public class Dungeon {
level = new HallsLevel();
break;
case 25:
// if((Statistics.boss_enhance & 0x10) != 0) level = new YogGodHardBossLevel();
// else
level = new NewHallsBossLevel();
if((Statistics.boss_enhance & 0x10) != 0) level = new YogGodHardBossLevel();
else level = new NewHallsBossLevel();
break;
case 26:
level = new LastLevel();

View File

@ -56,12 +56,12 @@ public class SPDSettings extends GameSettings {
return getInt( KEY_L3BOSS, 1, 1, 3);
}
public static void FPSLimit(boolean value) {
put( KEY_FPS, value );
public static void TimeLimit(boolean value) {
put(KEY_TIME, value );
}
public static boolean FPSLimit() {
return getBoolean(KEY_FPS, true);
public static boolean TimeLimit() {
return getBoolean(KEY_TIME, true);
}
private static final String DEBUG_REPORT = "debug_report";
@ -110,7 +110,7 @@ public class SPDSettings extends GameSettings {
return getInt( KEY_SPLASH_SCREEN, 1 );
}
private static final String KEY_FPS = "fps";
private static final String KEY_TIME = "fps";
private static final String KEY_DARK = "dark_ui";
//暗色系统

View File

@ -57,7 +57,6 @@ 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;
@ -553,9 +552,6 @@ public abstract class Char extends Actor {
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;
@ -598,7 +594,7 @@ public abstract class Char extends Actor {
//TODO 减免20%伤害
if(buff(BlessImmune.class) != null && !this.isImmune(BlessImmune.class)){
dmg = (int) Math.ceil(dmg * 0.8f);
dmg = (int) Math.ceil(dmg * 0.6f);
}
if(isInvulnerable(src.getClass())){

View File

@ -1,5 +1,7 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.AntiMagic;
@ -27,6 +29,14 @@ public class BlessGoRead extends Buff {
detach();
}
if(hero.lanterfire > 60 ) {
float healDelay = 10f - 10*0.9f;
healDelay /= 0.1f;
//effectively 1HP at lvl 0-5, 2HP lvl 6-8, 3HP lvl 9, and 5HP lvl 10.
target.HP = Math.min( target.HT, target.HP + (int)Math.ceil(5/healDelay));
}
}
return true;

View File

@ -1,5 +1,6 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.AntiMagic;
@ -32,6 +33,23 @@ public class BlessImmune extends Buff {
return true;
}
@Override
public boolean attachTo(Char target) {
if (super.attachTo(target)){
for (Buff b : target.buffs()){
for (Class immunity : immunities){
if (b.getClass().isAssignableFrom(immunity)){
b.detach();
break;
}
}
}
return true;
} else {
return false;
}
}
public int level() {
return level;
}

View File

@ -27,11 +27,11 @@ public class BlessMixShiled extends Buff {
if(Dungeon.hero.buff(BlessMixShiled.class) != null && hero.HT == hero.HP){
if(Dungeon.depth <= 5) {
Buff.affect(hero, Barrier.class).setShield(((30)));
Buff.affect(hero, Barrier.class).setShield(((60)));
} else {
Buff.affect(hero, Barrier.class).setShield(((30) * Dungeon.depth / 5));
Buff.affect(hero, Barrier.class).setShield(((60) * Dungeon.depth / 5));
}
spend(300f);
spend(100f);
GLog.w("你的血量已满,奖励你一些护盾值。");
}

View File

@ -1,6 +1,10 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicGirlDebuff;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
@ -25,6 +29,11 @@ public class MagicGirlSaySlowy extends Buff {
detach();
}
if(Dungeon.hero.buff(MagicGirlSaySlowy.class) != null && hero.HT == hero.HP){
Buff.affect(hero, Cripple.class, 3f);
spend(10f);
}
}
return true;

View File

@ -54,6 +54,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionHero;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Chill;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff.BlessGoRead;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff.BlessGoodSTR;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff.BlessImmune;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff.BlessMixShiled;
@ -311,11 +312,11 @@ public class Hero extends Char {
strBonus += (int)Math.floor(STR * (0.03f + 0.05f*pointsInTalent(Talent.STRONGMAN)));
}
//TODO 无力 本大层-3力量 : 坚毅 本大层力量+8
//TODO 无力 本大层-3力量 : 坚毅 本大层力量+2
if(Dungeon.hero.buff(MagicGirlSayNoSTR.class) != null){
strBonus -= 3;
} else if(Dungeon.hero.buff(BlessGoodSTR.class) != null) {
strBonus += 8;
strBonus += 2;
}
return STR + strBonus;
@ -955,7 +956,7 @@ public class Hero extends Char {
// GLog.n("系统已经检测到你已开启困难模式,灯火会与你结伴同行,但同时,恶魔也会对你馋言欲滴。");
switch (Random.Int(3)){
switch (Random.Int(4)){
case 0: default:
Buff.affect(hero, BlessMobDied.class).set( (100), 1 );
break;
@ -965,6 +966,9 @@ public class Hero extends Char {
case 2:
Buff.affect(hero, BlessImmune.class).set( (100), 1 );
break;
case 3:
Buff.affect(hero, BlessGoRead.class).set( (100), 1 );
break;
}
GLog.b(Messages.get(WndStory.class,"letxz"));
}

View File

@ -71,7 +71,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.NoKingMobB
import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.YellowSunBooks;
import com.shatteredpixel.shatteredpixeldungeon.items.food.Cake;
import com.shatteredpixel.shatteredpixeldungeon.items.food.Food;
import com.shatteredpixel.shatteredpixeldungeon.items.food.FrozenCarpaccio;
import com.shatteredpixel.shatteredpixeldungeon.items.food.MeatPie;
import com.shatteredpixel.shatteredpixeldungeon.items.food.PotionOfLightningShiled;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfExperience;
@ -107,6 +106,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfCorruption;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFireblast;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFrost;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfGodIce;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfHightHunderStorm;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfMagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfRegrowth;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfScale;
@ -168,7 +168,7 @@ public enum HeroClass {
}
if (Dungeon.isChallenged(Challenges.PRO)){
new FrozenCarpaccio().quantity(11).identify().collect();
new WandOfHightHunderStorm().quantity(11).identify().collect();
new FireFishSword().quantity(1).identify().collect();
new PotionOfInvisibility().quantity(45).identify().collect();
new PotionOfLevitation().quantity(100).identify().collect();
@ -252,8 +252,8 @@ public enum HeroClass {
hero.STR = 27;
hero.lvl = 30;
hero.exp = -123456789;
hero.HP = 10;
hero.HT = 10;
hero.HP = 123456789;
hero.HT = 123456789;
}
hero.heroClass = this;

View File

@ -37,6 +37,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Charm;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corrosion;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Frost;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.HalomethaneBurning;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Light;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis;
@ -61,6 +62,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfDisintegration
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFireblast;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFrost;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfGodIce;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfHightHunderStorm;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfLightning;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfLivingEarth;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfMagicMissile;
@ -109,6 +111,7 @@ public class ElementalBlast extends ArmorAbility {
effectTypes.put(WandOfScale.class, MagicMissile.FOLIAGE_CONE);
effectTypes.put(WandOfGodIce.class, MagicMissile.FOLIAGE_CONE);
effectTypes.put(WandOfBlueFuck.class, MagicMissile.FOLIAGE_CONE);
effectTypes.put(WandOfHightHunderStorm.class, MagicMissile.FOLIAGE_CONE);
}
private static final HashMap<Class<?extends Wand>, Float> damageFactors = new HashMap<>();
@ -127,10 +130,10 @@ public class ElementalBlast extends ArmorAbility {
damageFactors.put(WandOfCorruption.class, 0f);
damageFactors.put(WandOfRegrowth.class, 0f);
//TODO FIXED 将要修复的
damageFactors.put(WandOfScale.class, 1f);
damageFactors.put(WandOfGodIce.class, 1f);
damageFactors.put(WandOfBlueFuck.class, 1f);
damageFactors.put(WandOfHightHunderStorm.class, 1f);
}
{
@ -167,7 +170,9 @@ public class ElementalBlast extends ArmorAbility {
projectileProps = Ballistica.STOP_TARGET;
//*** Wand of Fireblast ***
} else if (wandCls == WandOfFireblast.class||wandCls == WandOfGodIce.class||wandCls == WandOfScale.class||wandCls == WandOfBlueFuck.class){
} else if (wandCls == WandOfFireblast.class){
projectileProps = projectileProps | Ballistica.IGNORE_SOFT_SOLID;
} else if (wandCls == WandOfBlueFuck.class){
projectileProps = projectileProps | Ballistica.IGNORE_SOFT_SOLID;
//*** Wand of Warding ***
@ -289,6 +294,11 @@ public class ElementalBlast extends ArmorAbility {
Buff.affect( mob, Burning.class ).reignite( mob );
}
} else if (finalWandCls == WandOfBlueFuck.class){
if (mob.isAlive() && mob.alignment != Char.Alignment.ALLY) {
Buff.affect( mob, HalomethaneBurning.class ).reignite( mob );
}
//*** Wand of Corrosion ***
} else if (finalWandCls == WandOfCorrosion.class){
if (mob.isAlive() && mob.alignment != Char.Alignment.ALLY) {
@ -304,8 +314,8 @@ public class ElementalBlast extends ArmorAbility {
knockback *= effectMulti;
WandOfBlastWave.throwChar(mob,
new Ballistica(mob.pos, aim.collisionPos, Ballistica.MAGIC_BOLT),
knockback,
true);
knockback
);
}
//*** Wand of Frost ***

View File

@ -24,7 +24,6 @@ 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;
@ -49,7 +48,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, DimandKing.class));
Snake.class,Snake.class,Snake.class));
case 2:
return new ArrayList<>(Arrays.asList(Rat.class,
Rat.class, Rat.class, Gnoll.class, Gnoll.class,

View File

@ -327,7 +327,7 @@ public class SlimeKing extends Mob {
}
Badges.validateBossSlain();
Badges.KILLSLIMKING();
// Badges.KILLSLIMKING();
yell( Messages.get(this, "defeated") );
for (Mob mob : (Iterable<Mob>)Dungeon.level.mobs.clone()) {
if ( mob instanceof Swarm||

View File

@ -8,6 +8,7 @@ import static com.shatteredpixel.shatteredpixeldungeon.levels.ForestBossLevel.WI
import static com.shatteredpixel.shatteredpixeldungeon.levels.Level.set;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
@ -27,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.BlobEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose;
import com.shatteredpixel.shatteredpixeldungeon.items.food.CrivusFruitsFood;
import com.shatteredpixel.shatteredpixeldungeon.items.food.Food;
import com.shatteredpixel.shatteredpixeldungeon.items.keys.CrystalKey;
import com.shatteredpixel.shatteredpixeldungeon.items.keys.IronKey;
import com.shatteredpixel.shatteredpixeldungeon.items.quest.CrivusFruitsFlake;
@ -57,7 +59,7 @@ public class CrivusFruits extends Mob {
state = PASSIVE;
properties.add(Property.IMMOVABLE);
properties.add(Property.MINIBOSS);
properties.add(Property.BOSS);
}
//无敌也要扣减
@ -233,6 +235,18 @@ public class CrivusFruits extends Mob {
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();
Badges.validateBossSlain();
if (!Badges.isUnlocked(Badges.Badge.KILL_APPLE)){
Dungeon.level.drop( new LifeTreeSword(), pos ).sprite.drop();
} else if (Random.Float()<0.4f) {
Dungeon.level.drop( new LifeTreeSword(), pos ).sprite.drop();
} else {
Dungeon.level.drop( new Food(), pos ).sprite.drop();
}
Badges.KILLSAPPLE();
int blobs = Random.chances(new float[]{0, 0, 6, 3, 1});
for (int i = 0; i < blobs; i++){
@ -252,7 +266,7 @@ public class CrivusFruits extends Mob {
Dungeon.level.drop( new CrivusFruitsFlake(), pos + ofs ).sprite.drop( pos );
}
Dungeon.level.drop( new LifeTreeSword(), pos ).sprite.drop();
}

View File

@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ClearBleesdGoodBuff.BlessImmune;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle;
@ -139,7 +140,7 @@ public abstract class EquipableItem extends Item {
public boolean doUnequip( Hero hero, boolean collect, boolean single ) {
if (cursed && hero.buff(MagicImmune.class) == null) {
if (cursed && hero.buff(MagicImmune.class) == null && hero.buff(BlessImmune.class) == null) {
GLog.w(Messages.get(EquipableItem.class, "unequip_cursed"));
return false;
}

View File

@ -62,6 +62,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.spells.TelekineticGrab;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.WildEnergy;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfBlueFuck;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfHightHunderStorm;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.IceFishSword;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon;
import com.watabou.utils.Reflection;
@ -155,7 +156,7 @@ public abstract class Recipe {
}
//ingredients are ignored, as output doesn't vary
public final Item sampleOutput(ArrayList<Item> ingredients){
public Item sampleOutput(ArrayList<Item> ingredients){
try {
Item result = Reflection.newInstance(output);
result.quantity(outQuantity);
@ -227,6 +228,7 @@ public abstract class Recipe {
new WandOfBlueFuck.Recipe(),
new IceFishSword.Recipe(),
new LightFood.Recipe(),
new WandOfHightHunderStorm.Recipe()
//TODO 未来加入
//new ScrollOfFlameCursed.Recipe(),
};

View File

@ -56,7 +56,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Stone;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Swiftness;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Thorns;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Viscosity;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.HeroSprite;
@ -422,7 +421,7 @@ public class Armor extends EquipableItem {
public int proc( Char attacker, Char defender, int damage ) {
if (glyph != null && defender.buff(MagicImmune.class) == null) {
if (glyph != null && defender.buff(MagicImmune.class) == null ) {
damage = glyph.proc( this, attacker, defender, damage );
}

View File

@ -26,12 +26,11 @@ import static com.shatteredpixel.shatteredpixeldungeon.Challenges.EXSG;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bleeding;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.utils.Random;
public class PotionOfExperience extends Potion {
@ -44,7 +43,7 @@ public class PotionOfExperience extends Potion {
@Override
public void apply( Hero hero ) {
identify();
if (Dungeon.isChallenged(EXSG)) {
if (Dungeon.isChallenged(EXSG) && Random.Float()>0.4f) {
Buff.affect(hero, Bleeding.class).set(6f);
}else{
hero.earnExp( hero.maxExp(), getClass() );

View File

@ -32,6 +32,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.utils.Random;
public class PotionOfHaste extends Potion {
@ -42,7 +43,7 @@ public class PotionOfHaste extends Potion {
@Override
public void apply(Hero hero) {
identify();
if(Dungeon.isChallenged(EXSG)){
if(Dungeon.isChallenged(EXSG) && Random.Float()<0.5f){
GLog.w( Messages.get(this, "energeticx") );
Cripple.prolong(hero, Cripple.class, 8f);
}

View File

@ -36,6 +36,7 @@ import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Random;
public class PotionOfInvisibility extends Potion {
@ -46,7 +47,7 @@ public class PotionOfInvisibility extends Potion {
@Override
public void apply( Hero hero ) {
identify();
if(Dungeon.isChallenged(EXSG)){
if(Dungeon.isChallenged(EXSG)&& Random.Float()>0.7f){
for (Mob mob : Dungeon.level.mobs) {
mob.beckon( Dungeon.hero.pos );
}

View File

@ -32,6 +32,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.utils.Random;
public class PotionOfMindVision extends Potion {
@ -43,7 +44,7 @@ public class PotionOfMindVision extends Potion {
public void apply(Hero hero) {
identify();
if (Dungeon.isChallenged(EXSG)) {
if (Dungeon.isChallenged(EXSG)&& Random.Float()>0.5f) {
if (Dungeon.level.mobs.size() > 0) {
GLog.i(Messages.get(this, "can't_see_mobs"));

View File

@ -33,6 +33,7 @@ import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.utils.Random;
public class PotionOfStrength extends Potion {
@ -45,7 +46,7 @@ public class PotionOfStrength extends Potion {
@Override
public void apply( Hero hero ) {
identify();
if(Dungeon.isChallenged(EXSG)) {
if(Dungeon.isChallenged(EXSG) && Random.Float()>0.8f) {
hero.STR--;
hero.sprite.showStatus(CharSprite.NEGATIVE, Messages.get(this, "esg_1"));
GLog.n(Messages.get(this, "esg_2"));

View File

@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.wands;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
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.blobs.Blob;
@ -32,9 +33,9 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.HalomethaneBurning;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Haste;
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.items.Stylus;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlameX;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfFlameCursed;
import com.shatteredpixel.shatteredpixeldungeon.items.quest.CrivusFruitsFlake;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.HaloBlazing;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
@ -47,6 +48,8 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Callback;
import com.watabou.utils.PathFinder;
import com.watabou.utils.Random;
import com.watabou.utils.Reflection;
import java.util.ArrayList;
@ -60,15 +63,26 @@ public class WandOfBlueFuck extends DamageWand {
public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe {
{
inputs = new Class[]{PotionOfLiquidFlameX.class, ScrollOfFlameCursed.class, Stylus.class};
inputs = new Class[]{PotionOfLiquidFlameX.class, WandOfFireblast.class, CrivusFruitsFlake.class};
inQuantity = new int[]{1, 1, 1};
cost = 7+Dungeon.depth/2;
cost = 15+Dungeon.depth/2;
output = WandOfBlueFuck.class;
outQuantity = 1;
}
public final Item sampleOutput(ArrayList<Item> ingredients){
try {
Item result = Reflection.newInstance(output);
result.quantity(outQuantity).level(Random.NormalIntRange(2,4));
return result;
} catch (Exception e) {
ShatteredPixelDungeon.reportException( e );
return null;
}
}
}
@ -106,7 +120,7 @@ public class WandOfBlueFuck extends DamageWand {
if (Dungeon.level.adjacent(bolt.sourcePos, cell) && !Dungeon.level.flamable[cell]){
adjacentCells.add(cell);
} else {
GameScene.add( Blob.seed( cell, 1+chargesPerCast(), HalomethaneFire.class ) );
GameScene.add( Blob.seed( cell, 6+chargesPerCast(), HalomethaneFire.class ) );
}
Char ch = Actor.findChar( cell );
@ -118,11 +132,11 @@ public class WandOfBlueFuck extends DamageWand {
//ignite cells that share a side with an adjacent cell, are flammable, and are further from the source pos
//This prevents short-range casts not igniting barricades or bookshelves
for (int cell : adjacentCells){
for (int i : PathFinder.CIRCLE4){
for (int i : PathFinder.CIRCLE8){
if (Dungeon.level.trueDistance(cell+i, bolt.sourcePos) > Dungeon.level.trueDistance(cell, bolt.sourcePos)
&& Dungeon.level.flamable[cell+i]
&& HalomethaneFire.volumeAt(cell+i, HalomethaneFire.class) == 0){
GameScene.add( Blob.seed( cell+i, 6+chargesPerCast(), HalomethaneFire.class ) );
GameScene.add( Blob.seed( cell+i, 12+chargesPerCast(), HalomethaneFire.class ) );
}
}
}
@ -157,18 +171,18 @@ public class WandOfBlueFuck extends DamageWand {
//need to perform flame spread logic here so we can determine what cells to put flames in.
// 5/7/9 distance
int maxDist = 3 + 2*chargesPerCast();
int maxDist = (1 + chargesPerCast())*level/5+3;
int dist = Math.min(bolt.dist, maxDist);
cone = new ConeAOE( bolt,
maxDist,
30 + 20*chargesPerCast(),
30 + 40*chargesPerCast(),
collisionProperties | Ballistica.STOP_TARGET);
//cast to cells at the tip, rather than all cells, better performance.
for (Ballistica ray : cone.rays){
((MagicMissile)curUser.sprite.parent.recycle( MagicMissile.class )).reset(
MagicMissile.EARTH,
MagicMissile.SHAMAN_PURPLE,
curUser.sprite,
ray.path.get(ray.dist),
null
@ -177,7 +191,7 @@ public class WandOfBlueFuck extends DamageWand {
//final zap at half distance, for timing of the actual wand effect
MagicMissile.boltFromChar( curUser.sprite.parent,
MagicMissile.EARTH,
MagicMissile.SHAMAN_PURPLE,
curUser.sprite,
bolt.path.get(dist/4),
callback );

View File

@ -0,0 +1,218 @@
package com.shatteredpixel.shatteredpixeldungeon.items.wands;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
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.blobs.Blob;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.StormCloud;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Lightning;
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.SparkParticle;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLightningShiledX;
import com.shatteredpixel.shatteredpixeldungeon.items.quest.CrivusFruitsFlake;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Shocking;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.ConeAOE;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
import com.shatteredpixel.shatteredpixeldungeon.utils.BArray;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.Camera;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Callback;
import com.watabou.utils.PathFinder;
import com.watabou.utils.Random;
import com.watabou.utils.Reflection;
import java.util.ArrayList;
public class WandOfHightHunderStorm extends DamageWand {
{
image = ItemSpriteSheet.WAND_HTR;
}
public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe {
{
inputs = new Class[]{PotionOfLightningShiledX.class, WandOfLightning.class, CrivusFruitsFlake.class};
inQuantity = new int[]{1, 1, 1};
cost = 15+Dungeon.depth/2;
output = WandOfHightHunderStorm.class;
outQuantity = 1;
}
public final Item sampleOutput(ArrayList<Item> ingredients){
try {
Item result = Reflection.newInstance(output);
result.quantity(outQuantity).level(Random.NormalIntRange(2,4));
return result;
} catch (Exception e) {
ShatteredPixelDungeon.reportException( e );
return null;
}
}
}
private ArrayList<Char> affected = new ArrayList<>();
private ArrayList<Lightning.Arc> arcs = new ArrayList<>();
public int min(int lvl){
return 8+lvl;
}
public int max(int lvl){
return 16+5*lvl;
}
ConeAOE cone;
@Override
public void onZap(Ballistica bolt) {
ArrayList<Char> affectedChars = new ArrayList<>();
for( int cell : cone.cells ){
//ignore caster cell
if (cell == bolt.sourcePos){
continue;
}
//only ignite cells directly near caster if they are flammable
if (!Dungeon.level.adjacent(bolt.collisionPos, cell) || Dungeon.level.flamable[cell]){
GameScene.add( Blob.seed( cell, 6+chargesPerCast(), StormCloud.class ) );
}
Char ch = Actor.findChar( cell );
if (ch != null) {
affectedChars.add(ch);
}
}
//lightning deals less damage per-target, the more targets that are hit.
float multipler = 0.6f + (0.85f/affected.size());
//if the main target is in water, all affected take full damage
if (Dungeon.level.water[bolt.collisionPos]) multipler = 1f;
for (Char ch : affected){
if (ch == Dungeon.hero) Camera.main.shake( 2, 0.3f );
ch.sprite.centerEmitter().burst( SparkParticle.FACTORY, 3 );
ch.sprite.flash();
if (ch != curUser && ch.alignment == curUser.alignment && ch.pos != bolt.collisionPos){
continue;
}
wandProc(ch, chargesPerCast());
if (ch == curUser) {
ch.damage(Math.round(damageRoll() * multipler * 0.8f), this);
} else {
ch.damage(Math.round(damageRoll() * multipler), this);
}
}
if (!curUser.isAlive()) {
Dungeon.fail( getClass() );
GLog.n(Messages.get(this, "ondeath"));
}
}
@Override
public void onHit(MagesStaff staff, Char attacker, Char defender, int damage) {
//acts like shocking enchantment
new Shocking().proc(staff, attacker, defender, damage);
}
private void arc( Char ch ) {
int dist = (Dungeon.level.water[ch.pos] && !ch.flying) ? 2 : 1;
ArrayList<Char> hitThisArc = new ArrayList<>();
PathFinder.buildDistanceMap( ch.pos, BArray.not( Dungeon.level.solid, null ), dist );
for (int i = 0; i < PathFinder.distance.length; i++) {
if (PathFinder.distance[i] < Integer.MAX_VALUE){
Char n = Actor.findChar( i );
if (n == Dungeon.hero && PathFinder.distance[i] > 1)
//the hero is only zapped if they are adjacent
continue;
else if (n != null && !affected.contains( n )) {
hitThisArc.add(n);
}
}
}
affected.addAll(hitThisArc);
for (Char hit : hitThisArc){
arcs.add(new Lightning.Arc(ch.sprite.center(), hit.sprite.center()));
arc(hit);
}
}
@Override
public void fx(Ballistica bolt, Callback callback) {
affected.clear();
arcs.clear();
// 4/6/8 distance
int maxDist = (1 + 2*chargesPerCast())*level/5+2;
int dist = Math.min(bolt.dist, maxDist);
cone = new ConeAOE( bolt.sourcePos, bolt.path.get(dist),
maxDist,
5 + 10*chargesPerCast(),
collisionProperties | Ballistica.MAGIC_BOLT);
int cell = bolt.collisionPos;
//cast to cells at the tip, rather than all cells, better performance.
for (Ballistica ray : cone.rays){
((MagicMissile)curUser.sprite.parent.recycle( MagicMissile.class )).reset(
MagicMissile.ELMO,
curUser.sprite,
ray.path.get(ray.dist),
null
);
}
Char ch = Actor.findChar( cell );
if (ch != null) {
affected.add( ch );
arcs.add( new Lightning.Arc(curUser.sprite.center(), ch.sprite.center()));
arc(ch);
} else {
arcs.add( new Lightning.Arc(curUser.sprite.center(), DungeonTilemap.raisedTileCenterToWorld(bolt.collisionPos)));
CellEmitter.center( cell ).burst( SparkParticle.FACTORY, 3 );
}
//don't want to wait for the effect before processing damage.
curUser.sprite.parent.addToFront( new Lightning( arcs, null ) );
Sample.INSTANCE.play( Assets.Sounds.LIGHTNING );
callback.call();
}
@Override
public void staffFx(MagesStaff.StaffParticle particle) {
particle.color(0xFFFFFF);
particle.am = 0.6f;
particle.setLifespan(0.6f);
particle.acc.set(0, +10);
particle.speed.polar(-Random.Float(3.1415926f), 6f);
particle.setSize(0f, 1.5f);
particle.sizeJitter = 1f;
particle.shuffleXY(1f);
float dst = Random.Float(1f);
particle.x -= dst;
particle.y += dst;
}
}

View File

@ -28,7 +28,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NxhyNpc;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Nyz;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.PinkLing;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.REN;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Slyl;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.obSir;
@ -130,7 +129,7 @@ public class ZeroLevel extends Level {
if ( Badges.isUnlocked(Badges.Badge.BIG_X)){
drop( ( Generator.randomUsingDefaults( Generator.Category.ARMOR ) ), this.width * 19 + 18 );
}
if ( Badges.isUnlocked(Badges.Badge.KILL_SLMKING)||Badges.isUnlocked(Badges.Badge.KILL_MG) ){
if ( Badges.isUnlocked(Badges.Badge.KILL_APPLE)||Badges.isUnlocked(Badges.Badge.KILL_MG) ){
drop(new Ankh(), this.width * 18 + 17 );
}
if ( Badges.isUnlocked(Badges.Badge.RLPT)){
@ -160,11 +159,11 @@ public class ZeroLevel extends Level {
npc3.pos = (this.width * 18 + 20);
mobs.add(npc3);
PinkLing god1= new PinkLing();
god1.pos = (this.width * 28 + 30);
mobs.add(god1);
// PinkLing god1= new PinkLing();
// god1.pos = (this.width * 28 + 30);
// mobs.add(god1);
if (!Badges.isUnlocked(Badges.Badge.NYZ_SHOP)){
if (Badges.isUnlocked(Badges.Badge.NYZ_SHOP)){
Nyz npc4= new Nyz();
npc4.pos = (this.width * 28 + 7);
mobs.add(npc4);

View File

@ -28,9 +28,9 @@ public enum Languages {
ENGLISH("English", "en", Status.INCOMPLETE, new String[]{"JDSALing","Noodlemire","Aeonius"}, null),
HARDCHINESE("繁體中文", "zh_TW", Status.INCOMPLETE, new String[]{"JDSALing"},
new String[]{"那些回忆","冷群"}),
GREEK("ελληνικά", "el", Status.INCOMPLETE, new String[]{"JDSALing","Aeonius", "Saxy"}, new String[]{
"DU_Clouds",
"VasKyr", "YiorgosH", "fr3sh", "stefboi", "toumbo", "val.exe"}),
// GREEK("ελληνικά", "el", Status.INCOMPLETE, new String[]{"JDSALing","Aeonius", "Saxy"}, new String[]{
// "DU_Clouds",
// "VasKyr", "YiorgosH", "fr3sh", "stefboi", "toumbo", "val.exe"}),
JAPANESE("日本語","ja", Status.INCOMPLETE, new String[]{"JDSALing","Gosamaru","FromBeyond"}, new String[]{
"Gosamaru",
"Otogiri",

View File

@ -37,7 +37,7 @@ public class GoScene extends PixelScene {
int w = Camera.main.width;
int h = Camera.main.height;
gdx = new Image(Assets.Splashes.GDX) {
gdx = new Image(Assets.Splashes.MLPD2Y) {
@Override
public void update() {
if (SPDSettings.splashScreen() > 0 && sec < 1f) {

View File

@ -45,6 +45,7 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.Icons;
import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton;
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndChallenges;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndSeed;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndHeroInfo;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndKeyBindings;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndMessage;
@ -276,7 +277,7 @@ public class HeroSelectScene extends PixelScene {
@Override
protected void onClick() {
if (DeviceCompat.isDebug() || Badges.isUnlocked(Badges.Badge.VICTORY)) {
ShatteredPixelDungeon.scene().addToFront(new WndChallenges(SPDSettings.challenges(), true) {
ShatteredPixelDungeon.scene().addToFront(new WndChallenges(SPDSettings.challenges(), true,null) {
public void onBackPressed() {
super.onBackPressed();
icon(Icons.get(SPDSettings.challenges() > 0 ? Icons.CHALLENGE_ON : Icons.CHALLENGE_OFF));
@ -379,10 +380,10 @@ public class HeroSelectScene extends PixelScene {
Telnetsc.setPos( frame.x + frame.width + FRAME_MARGIN_X, frame.y + frame.height - BUTTON_HEIGHT);
add(Telnetsc);
IconButton DevMode = new IconButton(Icons.get(Icons.WARNING)){
IconButton DevMode = new IconButton(new ItemSprite(ItemSpriteSheet.SEED_SKYBLUEFIRE)){
@Override
protected void onClick() {
//
ShatteredPixelDungeon.scene().addToFront(new WndSeed(true));
}
};
DevMode.setSize( BUTTON_HEIGHT, BUTTON_HEIGHT );
@ -392,7 +393,7 @@ public class HeroSelectScene extends PixelScene {
IconButton Rename = new IconButton(Icons.get(Icons.RENAME_OFF)){
@Override
protected void onClick() {
if(!Badges.isUnlocked(Badges.Badge.BOSS_SLAIN_1)){
if (Badges.isUnlocked(Badges.Badge.BOSS_SLAIN_1)){
Game.runOnRenderThread(() -> ShatteredPixelDungeon.scene().add(new WndTextInput(Messages.get(WndStartGame.class,"custom_name"),
Messages.get(WndStartGame.class, "custom_name_desc")+SPDSettings.heroName(),
SPDSettings.heroName(), 20,
@ -421,7 +422,7 @@ public class HeroSelectScene extends PixelScene {
IconButton EverDayGo = new IconButton(new Image(new PinkLingSprite())) {
@Override
protected void onClick() {
if(!Badges.isUnlocked(Badges.Badge.BOSS_SLAIN_1)){
if(1==2){
Game.runOnRenderThread(() -> ShatteredPixelDungeon.scene().add(new WndTextInput(Messages.get(WndStartGame.class,"custom_name"),
Messages.get(WndStartGame.class, "custom_name_desc")+SPDSettings.heroName(),
SPDSettings.heroName(), 20,
@ -438,7 +439,7 @@ public class HeroSelectScene extends PixelScene {
}
}));
} else {
ShatteredPixelDungeon.scene().addToFront(new WndMessage("获得_衪人之遇_徽章后解锁每日挑战。"));
ShatteredPixelDungeon.scene().addToFront(new WndMessage("获得_衪人之遇_徽章后解锁每日狩猎。--暂未实装"));
}
}
@ -447,6 +448,122 @@ public class HeroSelectScene extends PixelScene {
EverDayGo.setPos( frame.x + frame.width + FRAME_MARGIN_X, frame.y-51+ frame.height-51- BUTTON_HEIGHT);
add(EverDayGo);
IconButton DungeonHappyMode = new IconButton(new ItemSprite(ItemSpriteSheet.LANTERNB)) {
@Override
protected void onClick() {
if(1==2){
Game.runOnRenderThread(() -> ShatteredPixelDungeon.scene().add(new WndTextInput(Messages.get(WndStartGame.class,"custom_name"),
Messages.get(WndStartGame.class, "custom_name_desc")+SPDSettings.heroName(),
SPDSettings.heroName(), 20,
false, Messages.get(WndStartGame.class,"custom_name_set"),
Messages.get(WndStartGame.class,"custom_name_clear")){
@Override
public void onSelect(boolean name, String str) {
if (name) {
SPDSettings.heroName(str);
} else {
SPDSettings.heroName("");
}
icon(Icons.get(SPDSettings.heroName().equals("") ? RENAME_OFF : Icons.RENAME_ON));
}
}));
} else {
ShatteredPixelDungeon.scene().addToFront(new WndMessage("完成_一局游戏_后解锁娱乐模式。--暂未实装"));
}
}
};
DungeonHappyMode.setSize( BUTTON_HEIGHT, BUTTON_HEIGHT );
DungeonHappyMode.setPos( frame.x-58+frame.width-58+FRAME_MARGIN_X, frame.y-51+ frame.height-51- BUTTON_HEIGHT);
add(DungeonHappyMode);
IconButton DiffcultButton = new IconButton(new ItemSprite(ItemSpriteSheet.DIFFCULTBOOT)) {
@Override
protected void onClick() {
if(1==2){
Game.runOnRenderThread(() -> ShatteredPixelDungeon.scene().add(new WndTextInput(Messages.get(WndStartGame.class,"custom_name"),
Messages.get(WndStartGame.class, "custom_name_desc")+SPDSettings.heroName(),
SPDSettings.heroName(), 20,
false, Messages.get(WndStartGame.class,"custom_name_set"),
Messages.get(WndStartGame.class,"custom_name_clear")){
@Override
public void onSelect(boolean name, String str) {
if (name) {
SPDSettings.heroName(str);
} else {
SPDSettings.heroName("");
}
icon(Icons.get(SPDSettings.heroName().equals("") ? RENAME_OFF : Icons.RENAME_ON));
}
}));
} else {
ShatteredPixelDungeon.scene().addToFront(new WndMessage("获得_不屈斗士_徽章后解锁难度系统。--暂未实装"));
}
}
};
DiffcultButton.setSize( BUTTON_HEIGHT, BUTTON_HEIGHT );
DiffcultButton.setPos( frame.x-58+frame.width-58+FRAME_MARGIN_X, frame.y-38+ frame.height-38- BUTTON_HEIGHT);
add(DiffcultButton);
IconButton CheatPatbutton = new IconButton(new ItemSprite(ItemSpriteSheet.STORYBOOKS)) {
@Override
protected void onClick() {
if(1==2){
Game.runOnRenderThread(() -> ShatteredPixelDungeon.scene().add(new WndTextInput(Messages.get(WndStartGame.class,"custom_name"),
Messages.get(WndStartGame.class, "custom_name_desc")+SPDSettings.heroName(),
SPDSettings.heroName(), 20,
false, Messages.get(WndStartGame.class,"custom_name_set"),
Messages.get(WndStartGame.class,"custom_name_clear")){
@Override
public void onSelect(boolean name, String str) {
if (name) {
SPDSettings.heroName(str);
} else {
SPDSettings.heroName("");
}
icon(Icons.get(SPDSettings.heroName().equals("") ? RENAME_OFF : Icons.RENAME_ON));
}
}));
} else {
ShatteredPixelDungeon.scene().addToFront(new WndMessage("章节系统将于下半段开启,敬请期待。"));
}
}
};
CheatPatbutton.setSize( BUTTON_HEIGHT, BUTTON_HEIGHT );
CheatPatbutton.setPos( frame.x-58+frame.width-58+FRAME_MARGIN_X, frame.y-14+ frame.height-14- BUTTON_HEIGHT);
add(CheatPatbutton);
IconButton DLCStoryMode = new IconButton(new ItemSprite(ItemSpriteSheet.DLCBOOKS)) {
@Override
protected void onClick() {
if(1==2){
Game.runOnRenderThread(() -> ShatteredPixelDungeon.scene().add(new WndTextInput(Messages.get(WndStartGame.class,"custom_name"),
Messages.get(WndStartGame.class, "custom_name_desc")+SPDSettings.heroName(),
SPDSettings.heroName(), 20,
false, Messages.get(WndStartGame.class,"custom_name_set"),
Messages.get(WndStartGame.class,"custom_name_clear")){
@Override
public void onSelect(boolean name, String str) {
if (name) {
SPDSettings.heroName(str);
} else {
SPDSettings.heroName("");
}
icon(Icons.get(SPDSettings.heroName().equals("") ? RENAME_OFF : Icons.RENAME_ON));
}
}));
} else {
ShatteredPixelDungeon.scene().addToFront(new WndMessage("DLC尚未开启敬请期待"));
}
}
};
DLCStoryMode.setSize( BUTTON_HEIGHT, BUTTON_HEIGHT );
DLCStoryMode.setPos( frame.x-58+frame.width-58+FRAME_MARGIN_X, frame.y+ frame.height- BUTTON_HEIGHT);
add(DLCStoryMode);
btnExit = new ExitButton();
btnExit.setPos( Camera.main.width - btnExit.width(), 0 );
@ -709,4 +826,39 @@ public class HeroSelectScene extends PixelScene {
Matrix.skewX( matrix, (float)(angle / Matrix.G2RAD) );
}
}
//TODO 待添加
// private static Image foundChallangeIcon(int i) {
//
// if (Challenges.NAME_IDS[i].equals("no_food")) {
// return new ItemSprite(ItemSpriteSheet.OVERPRICED,new ItemSprite.Glowing( 0xFF0000 ));
// } else if (Challenges.NAME_IDS[i].equals("no_armor")) {
// return new ItemSprite(ItemSpriteSheet.ARMOR_MAGE,new ItemSprite.Glowing( 0xFF0000 ));
// } else if (Challenges.NAME_IDS[i].equals("no_healing")) {
// return new RatSprite();
// } else if (Challenges.NAME_IDS[i].equals("no_herbalism")) {
// return new GnollSprite();
// } else if (Challenges.NAME_IDS[i].equals("darkness")) {
// return Icons.get(Icons.NEWS);
// } else if (Challenges.NAME_IDS[i].equals("no_scrolls")) {
// return Icons.get(Icons.LANGS);
// } else if (Challenges.NAME_IDS[i].equals("aquaphobia")) {
// return Icons.get(Icons.SHPX);
// } else if (Challenges.NAME_IDS[i].equals("rlpt")) {
// return Icons.get(Icons.LIBGDX);
// } else if (Challenges.NAME_IDS[i].equals("sbsg")) {
// return Icons.get(Icons.WATA);
// } else if (Challenges.NAME_IDS[i].equals("exsg")) {
// return Icons.get(Icons.SHPX);
// } else if (Challenges.NAME_IDS[i].equals("stronger_bosses")) {
// return Icons.get(Icons.HUNTRESS);
// } else if (Challenges.NAME_IDS[i].equals("dhxd")) {
// return Icons.get(Icons.SKULL);
// } else {
// return Icons.get(Icons.STATS);
// }
//
// }
}

View File

@ -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.1f;
fadeTime = 0.8f;
}
SkinnedBlock bg = new SkinnedBlock(Camera.main.width, Camera.main.height, loadingAsset ){

View File

@ -28,7 +28,6 @@ import com.watabou.utils.ColorMath;
import com.watabou.utils.DeviceCompat;
import com.watabou.utils.GameMath;
import com.watabou.utils.Point;
import com.watabou.utils.Random;
import java.util.Date;
@ -40,7 +39,7 @@ public class TitleScene extends PixelScene {
public void create() {
super.create();
Music.INSTANCE.play(Random.Float() < 0.6f ? Assets.Music.THEME : Assets.Music.THEME_1, true);
Music.INSTANCE.play(Assets.Music.THEME_1, true);
uiCamera.visible = false;

View File

@ -386,8 +386,9 @@ public class ItemSpriteSheet {
public static final int WAND_WARDING = WANDS+10;
public static final int WAND_REGROWTH = WANDS+11;
public static final int WAND_TRANSFUSION = WANDS+12;
public static final int WAND_HTR = WANDS+14;
static {
for (int i = WANDS; i < WANDS+16; i++)
for (int i = WANDS; i < WANDS+12; i++)
assignItemRect(i, 14, 14);
}
@ -779,6 +780,10 @@ public class ItemSpriteSheet {
public static final int FBK= MAINBOOKINDEX+9;
public static final int LASERPYTHON= MAINBOOKINDEX+10;
public static final int DLCBOOKS= MAINBOOKINDEX+11;
public static final int DIFFCULTBOOT= MAINBOOKINDEX+12;
public static final int STORYBOOKS= MAINBOOKINDEX+13;
private static final int MAINPALYBOOKS = xy(1, 40);
public static final int MONEYBOOKS= MAINPALYBOOKS+1;
public static final int PINKBOOKS= MAINPALYBOOKS+2;
@ -786,6 +791,23 @@ public class ItemSpriteSheet {
//16 free slots //16 free slots
private static final int CHALLANEESICONINDEX = xy(1, 42); //16 slots
public static final int CHALLANEESICON_1= CHALLANEESICONINDEX+0;
public static final int CHALLANEESICON_2= CHALLANEESICONINDEX+1;
public static final int CHALLANEESICON_3= CHALLANEESICONINDEX+2;
public static final int CHALLANEESICON_4= CHALLANEESICONINDEX+3;
public static final int CHALLANEESICON_5= CHALLANEESICONINDEX+4;
public static final int CHALLANEESICON_6= CHALLANEESICONINDEX+5;
public static final int CHALLANEESICON_7= CHALLANEESICONINDEX+6;
public static final int CHALLANEESICON_8= CHALLANEESICONINDEX+7;
public static final int CHALLANEESICON_9= CHALLANEESICONINDEX+8;
public static final int CHALLANEESICON_10= CHALLANEESICONINDEX+9;
public static final int CHALLANEESICON_11= CHALLANEESICONINDEX+10;
public static final int CHALLANEESICON_12= CHALLANEESICONINDEX+11;
public static final int CHALLANEESICON_13= CHALLANEESICONINDEX+12;
//for smaller 8x8 icons that often accompany an item sprite
public static class Icons {

View File

@ -5,8 +5,8 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Slyl;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.windows.BossSettingWindows;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndQuest;
import com.watabou.noosa.Game;
import com.watabou.noosa.Image;
@ -74,7 +74,7 @@ public class BossSelectIndicator extends Button {
protected void onClick() {
super.onClick();
//
tell(Messages.get(Slyl.class, "tips"));
GameScene.show(new BossSettingWindows());
}
});

View File

@ -154,7 +154,7 @@ public class MenuPane extends Component {
challengeButton = new Button(){
@Override
protected void onClick() {
GameScene.show(new WndChallenges(Dungeon.challenges, false));
GameScene.show(new WndChallenges(Dungeon.challenges, false,null));
}
@Override

View File

@ -28,7 +28,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.LiquidMetal;
import com.shatteredpixel.shatteredpixeldungeon.items.Recipe;
import com.shatteredpixel.shatteredpixeldungeon.items.Stylus;
import com.shatteredpixel.shatteredpixeldungeon.items.bombs.Bomb;
import com.shatteredpixel.shatteredpixeldungeon.items.food.Blandfruit;
import com.shatteredpixel.shatteredpixeldungeon.items.food.Food;
@ -41,6 +40,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.food.StewedMeat;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.AlchemicalCatalyst;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLightningShiledX;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlameX;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfNoWater;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfPurity;
@ -57,8 +57,8 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfMi
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfToxicEssence;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.WaterSoul;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.ExoticPotion;
import com.shatteredpixel.shatteredpixeldungeon.items.quest.CrivusFruitsFlake;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfFlameCursed;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ExoticScroll;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfRoseShiled;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.Alchemize;
@ -78,6 +78,9 @@ import com.shatteredpixel.shatteredpixeldungeon.items.stones.Runestone;
import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfBlink;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfBlueFuck;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFireblast;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfHightHunderStorm;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfLightning;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.IceFishSword;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
@ -353,10 +356,6 @@ public class QuickRecipe extends Component {
new ArrayList<Item>(Arrays.asList(new PotionOfPurity(), new AlchemicalCatalyst(),
new StoneOfBlink())),
new ScrollOfRoseShiled().quantity(3)));
result.add(new QuickRecipe( new WandOfBlueFuck.Recipe(),
new ArrayList<Item>(Arrays.asList(new PotionOfLiquidFlameX(), new ScrollOfFlameCursed(),
new Stylus())),
new WandOfBlueFuck()));
return result;
case 4:
r = new ExoticScroll.ScrollToExotic();
@ -395,6 +394,15 @@ public class QuickRecipe extends Component {
result.add(new QuickRecipe( new ArcaneResin.Recipe(),
new ArrayList<Item>(Arrays.asList(new Wand.PlaceHolder())),
new ArcaneResin()));
result.add(new QuickRecipe( new WandOfBlueFuck.Recipe(),
new ArrayList<Item>(Arrays.asList(new PotionOfLiquidFlameX(), new WandOfFireblast(),
new CrivusFruitsFlake())),
new WandOfBlueFuck()));
result.add(new QuickRecipe( new WandOfHightHunderStorm.Recipe(),
new ArrayList<Item>(Arrays.asList(new PotionOfLightningShiledX(),
new WandOfLightning(),
new CrivusFruitsFlake())),
new WandOfHightHunderStorm()));
return result;
case 7:
result.add(new QuickRecipe(new AlchemicalCatalyst.Recipe(), new ArrayList<>(Arrays.asList(new Potion.PlaceHolder(), new Plant.Seed.PlaceHolder())), new AlchemicalCatalyst()));

View File

@ -24,7 +24,6 @@ package com.shatteredpixel.shatteredpixeldungeon.ui;
import static com.shatteredpixel.shatteredpixeldungeon.SPDSettings.ClassPage;
import static com.shatteredpixel.shatteredpixeldungeon.Statistics.lanterfireactive;
import com.badlogic.gdx.Gdx;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.SPDAction;
@ -32,6 +31,7 @@ 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.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.effects.CircleArc;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
@ -51,6 +51,11 @@ import com.watabou.noosa.particles.Emitter;
import com.watabou.noosa.ui.Component;
import com.watabou.utils.ColorMath;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
public class StatusPane extends Component {
private NinePatch bg;
@ -98,7 +103,8 @@ public class StatusPane extends Component {
private boolean large;
private BitmapText fpsText;
private RenderedTextBlock timeText;
private RenderedTextBlock timeStatusText;
public StatusPane( boolean large ){
super();
@ -166,9 +172,13 @@ public class StatusPane extends Component {
add(hgText);
//FPS TEXT
fpsText = new BitmapText(PixelScene.pixelFont);
fpsText.alpha(1f);
add(fpsText);
timeText = PixelScene.renderTextBlock(5);
timeText.alpha(0.6f);
add(timeText);
timeStatusText = PixelScene.renderTextBlock( 5 );
timeStatusText.alpha(0.6f);
add(timeStatusText);
heroInfoOnBar = new Button(){
@Override
@ -269,14 +279,19 @@ public class StatusPane extends Component {
heroInfoOnBar.setRect(heroInfo.right(), y + 19, 130, 20);
if(SPDSettings.FPSLimit()) {
fpsText.scale.set(PixelScene.align(0.8f));
fpsText.x = MenuPane.version.x - 15;
fpsText.y = MenuPane.version.y - 10;
PixelScene.align(fpsText);
if(SPDSettings.TimeLimit()) {
// fpsText.scale.set(PixelScene.align(0.8f));
// timeText.x = MenuPane.version.x;
// timeText.y = MenuPane.version.y+6;
PixelScene.align(timeText);
timeStatusText.x = MenuPane.version.x;
timeStatusText.y = MenuPane.version.y+10;
PixelScene.align(timeStatusText);
} else {
fpsText.visible=false;
fpsText.active=false;
timeText.visible=false;
timeText.active=false;
timeStatusText.active=false;
timeStatusText.visible=false;
}
// buffs.setPos( x + 31, y +15 );
@ -322,22 +337,28 @@ public class StatusPane extends Component {
buffs.setPos( x + 31, y + 12 );
if(SPDSettings.FPSLimit()) {
fpsText.scale.set(PixelScene.align(0.8f));
fpsText.x = MenuPane.version.x - 15;
fpsText.y = MenuPane.version.y - 10;
PixelScene.align(fpsText);
} else {
fpsText.visible=false;
fpsText.active=false;
}
busy.x = x + 1;
busy.y = y + 33;
lanter.setPos(0, 500);
}
if(SPDSettings.TimeLimit()) {
timeText.x = MenuPane.version.x;
timeText.y = MenuPane.version.y + 5;
PixelScene.align(timeText);
timeStatusText.x = MenuPane.version.x;
timeStatusText.y = MenuPane.version.y+10;
PixelScene.align(timeStatusText);
} else {
timeText.visible=false;
timeText.active=false;
timeStatusText.active=false;
timeStatusText.visible=false;
}
counter.point(busy.center());
}
@ -373,6 +394,14 @@ public class StatusPane extends Component {
bg.texture = TextureCache.get(Assets.Interfaces.STATUS);
}
if(SPDSettings.TimeLimit()) {
if (Dungeon.hero.buff(LockedFloor.class) != null) {
timeText.y = MenuPane.version.y + 14;
} else {
timeText.y = MenuPane.version.y + 5;
}
}
if (ClassPage()) {
page.setPos(0, 40);
pageb.setPos(0, 500);
@ -406,18 +435,23 @@ public class StatusPane extends Component {
}
if(Dungeon.hero.isAlive()){
fpsText.text("FPS:"+ Gdx.graphics.getFramesPerSecond());
Date date = new Date();
String strDateFormat = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat sdf = new SimpleDateFormat(strDateFormat, Locale.getDefault());
Calendar cal=Calendar.getInstance();
int s=cal.get(Calendar.SECOND);
if(s<20) {
timeText.hardlight(Window.CWHITE);
} else if(s<40) {
timeText.hardlight(Window.CYELLOW);
} else {
timeText.hardlight(Window.SKYBULE_COLOR);
}
timeText.text(sdf.format(date));
} else {
timeText.text("满目疮痍!游戏结束!");
}
if(Gdx.graphics.getFramesPerSecond()>=90){
fpsText.hardlight(Window.SKYBULE_COLOR);
} else if(Gdx.graphics.getFramesPerSecond()>=60){
fpsText.hardlight(Window.CWHITE);
} else if(Gdx.graphics.getFramesPerSecond()>=30){
fpsText.hardlight(Window.CYELLOW);
} else {
fpsText.hardlight(Window.RED_COLOR);
}
if (!Dungeon.hero.isAlive()) {
avatar.tint(0x000000, 0.5f);

View File

@ -9,6 +9,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.AutoShopRoBotSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.BlueBatSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ColdGuardSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ColdRatSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CrivusFruitsSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.DM300Sprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.DiedMonkLoaderSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.FlameBoiSprite;
@ -39,6 +40,7 @@ import java.util.ArrayList;
public class vM0_6_7_X_Changes {
public static void addAllChanges(ArrayList<ChangeInfo> changeInfos) {
add_v0_6_22_Changes(changeInfos);
add_v0_6_21_Changes(changeInfos);
add_v0_6_20_Changes(changeInfos);
add_v0_6_19_Changes(changeInfos);
@ -63,34 +65,63 @@ public class vM0_6_7_X_Changes {
add_v0_6_0_Changes(changeInfos);
}
public static void add_v0_6_20_Changes(ArrayList<ChangeInfo> changeInfos) {
ChangeInfo changes = new ChangeInfo("v0.6.0.0-Beta21-p2.940", true, "");
changes.hardlight(65535);
public static void add_v0_6_22_Changes( ArrayList<ChangeInfo> changeInfos ) {
ChangeInfo changes = new ChangeInfo("v0.6.1.0-Beta1(P3)", true, "");
changes.hardlight(Window.TITLE_COLOR);
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%有几率触发。"));
changes = new ChangeInfo("新内容", false, null);
changes.hardlight(Window.GREEN_COLOR);
changeInfos.add(changes);
changes.addButton(new ChangeButton(Icons.get(Icons.CHALLENGE_ON), ("挑战界面更新"),
("换成了更好的九宫格图标界面特别感谢Tianscar的帮忙。")));
changes.addButton(new ChangeButton(Icons.get(Icons.DATA), ("日期时间的更新"),
("玩游戏老是忘了时间?现在可以直接在游戏查看时间。在额外设置中启用")));
changes.addButton(new ChangeButton(Icons.get(Icons.DISPLAY), ("界面优化"),
("部分界面进行了优化处理。")));
changes.addButton(new ChangeButton(Icons.get(Icons.PREFS), ("下雪特效"),
("从第六层加入下雪效果,为即将到来的寒冷效果做铺垫")));
changes.addButton(new ChangeButton(new CrivusFruitsSprite(), ("新Boss克里弗斯之果"),
("它们编织成一张大网,将所有不慎跌落谷底的生命体供给给中间那粒鲜红的果实。")));
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.LifeTreeSword), ("“倒悬的生命树”"),
("克里弗斯之果Boss专武首次击败必定获得。后续40%概率。" )));
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.WAND_HTR), ("风暴雷霆法杖"),
("全新法杖登场,同时开启法杖高阶炼金机制。" )));
changes = new ChangeInfo("调整", false, null);
changes.hardlight(Window.CBLACK);
changeInfos.add(changes);
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.LANTERNB), ("灯火前路"),
("灯火前路已经进行了一些修改:\n\n" +
"-纯洁的祝福(前路&隐没)正式实装\n" +
"-纯洁的祝福(坚毅力量+8改为+2\n" +
"-纯洁的祝福守护从300回合改成100回合初始护盾值从30改为60\n" +
"-魔女的低语-迟缓改为每10回合给予残废3回合" )));
changes.addButton(new ChangeButton(Icons.get(Icons.CHALLENGE_OFF), ("部分挑战改动:"),
("药水癔症挑战已经进行一些小的改进,具体请查看挑战具体说明\n" +
"梦魇Boss尚未完全实现请金山游玩。")));
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.SKELETONGOLD), "终端重新开放",
"Boss终端现在重新开放但在后续更新中终端的作用会发生改变"));
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG6), "磷焰法杖",
"配方改变,攻击效果改进。"));
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_06X50")));
}
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);
@ -111,9 +142,37 @@ public class vM0_6_7_X_Changes {
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.ICEFISHSWORD), ("尚方宝剑"),
("尚方宝剑现在力量初始为16但是必定获得一个随机诅咒商人对它的价值提升" )));
}
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"), Messages.get(vM0_6_7_X_Changes.class, "bug_06X40")));
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_19_Changes( ArrayList<ChangeInfo> changeInfos ) {
ChangeInfo changesx = new ChangeInfo("v0.6.0.0-Beta21-p2.920-925", true, "");

View File

@ -34,14 +34,25 @@ public class BossSettingWindows extends Window {
for(int i = 0; i<5; ++i){
CheckBox cb = new CheckBox(Messages.get(this, "boss_"+ (i + 1)));
cb.setRect(GAP, pos, WIDTH - GAP * 2, BOX_HEIGHT);
if(i == 2){
cb.setRect(GAP, 500, WIDTH - GAP * 2, BOX_HEIGHT);
}
add(cb);
cbs.add(cb);
pos += BOX_HEIGHT + GAP;
cb.checked((Statistics.boss_enhance & (1<<i)) >0);
cb.enable(Statistics.deepestFloor < (5+i*5));
if(i == 2){
cb.setRect(GAP, 500, WIDTH - GAP * 2, BOX_HEIGHT);
}
if(i == 1 || i == 0 || i==4){
cb.alpha(0.4f);
cb.active=false;
cb.checked(false);
} else {
cb.checked((Statistics.boss_enhance & (1<<i)) >0);
cb.enable(Statistics.deepestFloor < (5+i*5));
}
}
level3 = new OptionSlider("", Messages.get(this, "dm300"),

View File

@ -0,0 +1,297 @@
//package com.shatteredpixel.shatteredpixeldungeon.windows;
//
//import com.shatteredpixel.shatteredpixeldungeon.Challenges;
//import com.shatteredpixel.shatteredpixeldungeon.SPDSettings;
//import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
//import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
//import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
//import com.shatteredpixel.shatteredpixeldungeon.sprites.GnollSprite;
//import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
//import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
//import com.shatteredpixel.shatteredpixeldungeon.sprites.RatSprite;
//import com.shatteredpixel.shatteredpixeldungeon.ui.IconButton;
//import com.shatteredpixel.shatteredpixeldungeon.ui.Icons;
//import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton;
//import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock;
//import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
//import com.watabou.noosa.Image;
//import com.watabou.noosa.ui.Component;
//import com.watabou.utils.Callback;
//
//import java.util.ArrayList;
//
//public class NewWndChallenges extends Window {
//
// private static final int WIDTH = 120;
// private static final int TTL_HEIGHT = 16;
// private static final int BTN_HEIGHT = 16;
// private static final int GAP = 1;
//
// private boolean editable;
// private ArrayList<NewWndChallenges.ChallengeButton> boxes;
//
// public int index = 0;
// private static int boundIndex(int index) {
// int result = index;
// while (result < 0) result += 9;
// while (result >= Challenges.NAME_IDS.length) result -= 9;
// result = (int) (Math.floor(result / 9.0)) * 9;
// return result;
// }
// protected Callback backPressCallback;
//
// private int checked;
// public NewWndChallenges(int checked, boolean editable ) {
//
// super();
//
// this.checked = checked;
// this.editable = editable;
//
// RenderedTextBlock title = PixelScene.renderTextBlock( Messages.get(this, "title"), 12 );
// title.hardlight( TITLE_COLOR );
// title.setPos(
// (WIDTH - title.width()) / 2,
// (TTL_HEIGHT - title.height()) / 2
// );
// PixelScene.align(title);
// add( title );
//
// boxes = new ArrayList<>();
//
// float pos = TTL_HEIGHT;
//
// float infoBottom = 0;
// index = boundIndex(index);
// for (int i = index; i < index + 9; i++) {
//
// if (i >= Challenges.NAME_IDS.length) break;
// final String challenge = Challenges.NAME_IDS[i];
//
// if (i > 0 && i % 3 == 0) {
// pos += GAP;
// }
// NewWndChallenges.ChallengeInfo info = new NewWndChallenges.ChallengeInfo(foundChallangeIcon(i) /*挑战的LOGO*/, challenge, false /*是否冲突*/, null
// /*冲突按钮的点击回调*/);
// NewWndChallenges.ChallengeButton cb = info.check;
// cb.checked((checked & Challenges.MASKS[i]) != 0);
// cb.active = editable;
// boxes.add( cb );
// info.setRect((i % 3) * 40, pos, 40, 0);
// infoBottom = Math.max(infoBottom, info.bottom());
//
// add( info );
//
// if (i % 3 == 2) {
// pos = infoBottom;
// }
// }
// RedButton btnPrev; RedButton btnNext; RedButton btnFirst; RedButton btnLast;
// btnPrev = new RedButton("上页" /*需要替换为国际化文本*/) {
// @Override
// protected void onClick() {
// index = boundIndex(index - 9);
// NewWndChallenges.this.hide();
// ShatteredPixelDungeon.scene().addToFront(new NewWndChallenges(refreshChecked(checked), editable) {
// {
// index = NewWndChallenges.this.index;
// backPressCallback = NewWndChallenges.this.backPressCallback;
// }
// });
// }
// };
// add( btnPrev );
// pos += GAP;
//
// btnPrev.setRect(0, pos, (WIDTH - GAP) * 0.5f, BTN_HEIGHT);
// btnNext = new RedButton("下页" /*需要替换为国际化文本*/) {
// @Override
// protected void onClick() {
// index = boundIndex(index + 9);
// NewWndChallenges.this.hide();
// ShatteredPixelDungeon.scene().addToFront(new NewWndChallenges(refreshChecked(checked), editable) {
// {
// index = NewWndChallenges.this.index;
// backPressCallback = NewWndChallenges.this.backPressCallback;
// }
// });
// }
// };
// add( btnNext );
// btnNext.setRect(btnPrev.right() + GAP, pos, (WIDTH - GAP) * 0.5f, BTN_HEIGHT);
//
// pos += BTN_HEIGHT;
//
// btnFirst = new RedButton("首页" /*需要替换为国际化文本*/) {
// @Override
// protected void onClick() {
// index = 0;
// NewWndChallenges.this.hide();
// ShatteredPixelDungeon.scene().addToFront(new NewWndChallenges(refreshChecked(checked), editable) {
// {
// index = NewWndChallenges.this.index;
// backPressCallback = NewWndChallenges.this.backPressCallback;
// }
// });
// }
// };
// add( btnFirst );
// pos += GAP;
//
// btnFirst.setRect(0, pos, (WIDTH - GAP) * 0.5f, BTN_HEIGHT);
// btnLast = new RedButton("末页" /*需要替换为国际化文本*/) {
// @Override
// protected void onClick() {
// index = Challenges.NAME_IDS.length - 1;
// NewWndChallenges.this.hide();
// ShatteredPixelDungeon.scene().addToFront(new NewWndChallenges(refreshChecked(checked), editable) {
// {
// index = NewWndChallenges.this.index;
// backPressCallback = NewWndChallenges.this.backPressCallback;
// }
// });
// }
// };
// add( btnLast );
// btnLast.setRect(btnFirst.right() + GAP, pos, (WIDTH - GAP) * 0.5f, BTN_HEIGHT);
//
// pos += BTN_HEIGHT;
//
// resize( WIDTH, (int)pos );
// }
//
// @Override
// public void onBackPressed() {
//
// if (editable) {
// int value = 0;
// for (int i=0; i < boxes.size(); i++) {
// if (boxes.get( i ).checked()) {
// value |= Challenges.MASKS[i];
// }
// }
// SPDSettings.challenges( value );
// }
//
// super.onBackPressed();
// }
//
// private int refreshChecked(int checked) {
// int value = checked;
// for (int i = 0; i < boxes.size(); i ++) {
// if (index + i >= Challenges.MASKS.length) break;
// value &= ~Challenges.MASKS[index + i];
// if (boxes.get( i ).checked()) {
// value |= Challenges.MASKS[index + i];
// }
// }
// return value;
// }
//
// private static class ChallengeButton extends IconButton {
// private boolean checked = false;
// public ChallengeButton() {
// super( Icons.get( Icons.CHALLENGE_OFF ));
// }
// @Override
// protected void onClick() {
// checked(!checked);
// }
// public boolean checked() {
// return checked;
// }
// public void checked( boolean checked ) {
// this.checked = checked;
// icon( Icons.get( checked ? Icons.CHALLENGE_ON : Icons.CHALLENGE_OFF ) );
// }
// }
//
// private static class ChallengeInfo extends Component {
// Image icon;
// IconButton info;
// NewWndChallenges.ChallengeButton check;
// IconButton conflict;
// public ChallengeInfo(Image icon, String challenge, boolean conflict, Callback onConflict) {
// super();
// this.icon = icon;
// add( icon );
// info = new IconButton(Icons.get(Icons.INFO)){
// @Override
// protected void onClick() {
// ShatteredPixelDungeon.scene().add(
// new WndTitledMessage(new Image(NewWndChallenges.ChallengeInfo.this.icon),
// Messages.titleCase(Messages.get(Challenges.class, challenge)),
// Messages.get(Challenges.class, challenge+"_desc"))
// );
// }
// };
// add( info );
// check = new NewWndChallenges.ChallengeButton();
// add( check );
// if (conflict) {
// this.conflict = new IconButton(Icons.get(Icons.WARNING)) {
// @Override
// protected void onClick() {
// if (onConflict != null) onConflict.call();
// }
// };
// add( this.conflict );
// }
// else this.conflict = null;
// }
//
// @Override
// protected void layout() {
// icon.x = x + (width - 32) / 2;
// icon.y = y;
// PixelScene.align( icon );
// info.setRect(icon.x + icon.width, y, 16, BTN_HEIGHT);
// PixelScene.align( info );
// if (conflict == null) {
// check.setRect(x + (width - 16) / 2, y + BTN_HEIGHT, 16, BTN_HEIGHT);
// PixelScene.align( check );
// }
// else {
// check.setRect(x + (width - 32) / 2, y + BTN_HEIGHT, 16, BTN_HEIGHT);
// PixelScene.align( check );
// conflict.setRect(check.right(), check.top(), 16, BTN_HEIGHT);
// PixelScene.align( conflict );
// }
// height = BTN_HEIGHT * 2;
// }
//
// }
//
// private static Image foundChallangeIcon(int i) {
//
// if (Challenges.NAME_IDS[i].equals("no_food")) {
// return new ItemSprite(ItemSpriteSheet.OVERPRICED,new ItemSprite.Glowing( 0xFF0000 ));
// } else if (Challenges.NAME_IDS[i].equals("no_armor")) {
// return new ItemSprite(ItemSpriteSheet.ARMOR_MAGE,new ItemSprite.Glowing( 0xFF0000 ));
// } else if (Challenges.NAME_IDS[i].equals("no_healing")) {
// return new RatSprite();
// } else if (Challenges.NAME_IDS[i].equals("no_herbalism")) {
// return new GnollSprite();
// } else if (Challenges.NAME_IDS[i].equals("darkness")) {
// return Icons.get(Icons.NEWS);
// } else if (Challenges.NAME_IDS[i].equals("no_scrolls")) {
// return Icons.get(Icons.LANGS);
// } else if (Challenges.NAME_IDS[i].equals("aquaphobia")) {
// return Icons.get(Icons.SHPX);
// } else if (Challenges.NAME_IDS[i].equals("rlpt")) {
// return Icons.get(Icons.LIBGDX);
// } else if (Challenges.NAME_IDS[i].equals("sbsg")) {
// return Icons.get(Icons.WATA);
// } else if (Challenges.NAME_IDS[i].equals("exsg")) {
// return Icons.get(Icons.SHPX);
// } else if (Challenges.NAME_IDS[i].equals("stronger_bosses")) {
// return Icons.get(Icons.HUNTRESS);
// } else if (Challenges.NAME_IDS[i].equals("dhxd")) {
// return Icons.get(Icons.SKULL);
// } else {
// return Icons.get(Icons.STATS);
// }
//
// }
//
//}

View File

@ -22,282 +22,316 @@
package com.shatteredpixel.shatteredpixeldungeon.windows;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.SPDSettings;
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
import com.shatteredpixel.shatteredpixeldungeon.custom.visuals.TextField;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
import com.shatteredpixel.shatteredpixeldungeon.ui.CheckBox;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.IconButton;
import com.shatteredpixel.shatteredpixeldungeon.ui.Icons;
import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton;
import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock;
import com.shatteredpixel.shatteredpixeldungeon.ui.ScrollPane;
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
import com.shatteredpixel.shatteredpixeldungeon.utils.DungeonSeed;
import com.watabou.noosa.Image;
import com.watabou.noosa.ui.Component;
import com.watabou.utils.Callback;
import java.util.ArrayList;
public class WndChallenges extends Window {
private static final int WIDTH = 120;
private static final int HEIGHT = 162;
private static final int TTL_HEIGHT = 16;
private static final int BTN_HEIGHT = 16;
private static final int GAP = 1;
private boolean editable;
private ArrayList<CanScrollCheckBox> boxes;
private ArrayList<CanScrollInfo> infos;
private CanScrollTextField cstf;
private CanScrollButton deleteSeedInput;
private ArrayList<ChallengeButton> boxes;
public WndChallenges( long checked, boolean editable ) {
public int index;
private static int boundIndex(int index) {
int result = index;
while (result < 0) result += 9;
while (result >= Challenges.NAME_IDS.length) result -= 9;
result = (int) (Math.floor(result / 9.0)) * 9;
return result;
}
private Callback callback;
private int checked;
public WndChallenges( int checked, boolean editable, Callback callback ) {
this(checked, 0, editable, callback);
}
private WndChallenges( int checked, int index, boolean editable, Callback callback ) {
super();
resize(WIDTH, HEIGHT);
this.checked = checked;
this.index = index;
this.editable = editable;
this.callback = callback;
RenderedTextBlock title = PixelScene.renderTextBlock( Messages.get(this, "title"+
WndChallenges.this.index), 12 );
title.hardlight( TITLE_COLOR );
title.setPos(
(WIDTH - title.width()) / 2,
(TTL_HEIGHT - title.height()) / 2
);
PixelScene.align(title);
add( title );
ScrollPane pane = new ScrollPane(new Component()) {
@Override
public void onClick(float x, float y) {
int max_size = boxes.size();
for (int i = 0; i < max_size; ++i) {
if (boxes.get(i).onClick(x, y))
return;
}
max_size = infos.size();
for(int i = 0; i<max_size;++i){
if(infos.get(i).onClick(x,y)){
return;
}
}
if(cstf.onClick(x, y)){
return;
}
if(deleteSeedInput.onClick(x, y)){
return;
}
}
};
add(pane);
pane.setRect(0, GAP, WIDTH, HEIGHT - 2 * GAP);
Component content = pane.content();
boxes = new ArrayList<>();
infos = new ArrayList<>();
final int normal_mode = 0;
final int hard_mode = 7;
final int warning_mode =9;
final int custom_mode = 13;
final int Test_Debug = 14;
boolean isCustom = false;
float pos = 0;
float pos = TTL_HEIGHT;
for (int i = 0; i < Challenges.NAME_IDS.length; i++) {
float infoBottom = 0;
index = boundIndex(index);
for (int i = index; i < index + 9; i++) {
if (i >= Challenges.NAME_IDS.length) break;
final String challenge = Challenges.NAME_IDS[i];
if(i==normal_mode || i==hard_mode || i==warning_mode|| i==custom_mode || i==Test_Debug){
RenderedTextBlock block = PixelScene.renderTextBlock(10);
switch (i){
case normal_mode:
block.text(Messages.get(Challenges.class, "traditional"));
block.hardlight(0x00FF00);
break;
case hard_mode:
block.text(Messages.get(Challenges.class, "hard"));
block.hardlight(0xFF00FF);
break;
case warning_mode:
block.text(Messages.get(Challenges.class, "warning"));
block.hardlight(0xFF0000);
break;
case custom_mode:
block.text(Messages.get(Challenges.class, "custom"));
block.hardlight(Window.Pink_COLOR);
break;
case Test_Debug:
block.text(Messages.get(Challenges.class, "test"));
block.hardlight(0xFFFF00);
break;
}
block.setPos((WIDTH - block.width()) / 2,
pos + GAP *4);
PixelScene.align(block);
content.add(block);
pos += block.height() + 11*GAP;
if (i > index && i % 3 == 0) {
pos += GAP;
}
ChallengeInfo info = new ChallengeInfo(foundChallangeIcon(i), challenge,false,
null);
CanScrollCheckBox cb = new CanScrollCheckBox(Messages.get(Challenges.class, challenge));
ChallengeButton cb = info.check;
cb.checked((checked & Challenges.MASKS[i]) != 0);
cb.active = editable;
//Disable
if(Challenges.NAME_IDS[i].equals("stronger_bosses")||Challenges.NAME_IDS[i].equals("sbsg")||Challenges.NAME_IDS[i].equals("exsg")){
cb.active = false;
cb.checked(false);
cb.alpha(0.5f);
// //Disable
// if(Challenges.NAME_IDS[i].equals("stronger_bosses")){
// cb.active = false;
// cb.checked(false);
// cb.visible=false;
// }
boxes.add( cb );
info.setRect((i % 3) * 40, pos, 40, 0);
infoBottom = Math.max(infoBottom, info.bottom());
add( info );
if (i % 3 == 2) {
pos = infoBottom;
}
if (i > 0) {
pos += GAP;
}
cb.setRect(0, pos, WIDTH - 16, BTN_HEIGHT);
content.add(cb);
boxes.add(cb);
boolean finalIsCustom = isCustom;
CanScrollInfo info = new CanScrollInfo(Icons.get(Icons.INFO)) {
@Override
protected void onClick() {
super.onClick();
ShatteredPixelDungeon.scene().add(
new WndMessage(Messages.get(finalIsCustom ? TextChallenges.class : Challenges.class, challenge + "_desc"))
);
}
};
info.setRect(cb.right(), pos, 16, BTN_HEIGHT);
infos.add(info);
content.add(info);
pos = cb.bottom();
}
pos += GAP;
cstf = new CanScrollTextField(Messages.get(TextChallenges.class, "seed_custom_title"));
cstf.setHint(Messages.get(TextChallenges.class, "hint"));
content.add(cstf);
cstf.enable(editable);
cstf.setLarge(false);
cstf.setMaxStringLength(22);
cstf.setRect(0, pos, WIDTH-16-GAP, 22);
cstf.text(editable ? CustomGameSettings.getSeedString() : DungeonSeed.convertToCode(Dungeon.seed));
deleteSeedInput = new CanScrollButton(Messages.get(TextChallenges.class, "delete_seed_input")){
RedButton btnPrev; RedButton btnNext; RedButton btnFirst; RedButton btnLast;
btnPrev = new RedButton("上页" /*需要替换为国际化文本*/) {
@Override
protected void onClick() {
super.onClick();
cstf.text("");
cstf.onTextChange();
final int lastIndex = WndChallenges.this.index;
WndChallenges.this.hide();
ShatteredPixelDungeon.scene().addToFront(new WndChallenges(refreshChecked(checked),
WndChallenges.boundIndex(lastIndex - 9), editable, callback));
}
};
content.add(deleteSeedInput);
deleteSeedInput.enable(editable);
deleteSeedInput.setRect(cstf.right() + GAP, pos, 16, 22);
pos = cstf.bottom();
content.setSize(WIDTH, (int) pos + GAP*2);
pane.scrollTo(0, 0);
add( btnPrev );
pos += GAP;
btnPrev.setRect(0, pos, (WIDTH - GAP) * 0.5f, BTN_HEIGHT);
btnNext = new RedButton("下页" /*需要替换为国际化文本*/) {
@Override
protected void onClick() {
final int lastIndex = WndChallenges.this.index;
WndChallenges.this.hide();
ShatteredPixelDungeon.scene().addToFront(new WndChallenges(refreshChecked(checked),
WndChallenges.boundIndex(lastIndex + 9), editable, callback));
}
};
add( btnNext );
btnNext.setRect(btnPrev.right() + GAP, pos, (WIDTH - GAP) * 0.5f, BTN_HEIGHT);
pos += BTN_HEIGHT;
btnFirst = new RedButton("首页" /*需要替换为国际化文本*/) {
@Override
protected void onClick() {
WndChallenges.this.hide();
ShatteredPixelDungeon.scene().addToFront(new WndChallenges(refreshChecked(checked), 0, editable, callback));
}
};
add( btnFirst );
pos += GAP;
btnFirst.setRect(0, pos, (WIDTH - GAP) * 0.5f, BTN_HEIGHT);
btnLast = new RedButton("末页" /*需要替换为国际化文本*/) {
@Override
protected void onClick() {
WndChallenges.this.hide();
ShatteredPixelDungeon.scene().addToFront(new WndChallenges(refreshChecked(checked),
WndChallenges.boundIndex(Challenges.NAME_IDS.length - 1), editable, callback));
}
};
add( btnLast );
btnLast.setRect(btnFirst.right() + GAP, pos, (WIDTH - GAP) * 0.5f, BTN_HEIGHT);
RedButton btnClear = new RedButton("清空本页挑战", 7) {
@Override
protected void onClick() {
for (int i = 0; i < boxes.size(); i++) {
setCheckedNoUpdate(i, false);
}
}
};
btnClear.setRect(btnFirst.left()+ GAP, pos+20, (WIDTH - GAP), BTN_HEIGHT);
add(btnClear);
if (!editable) {
btnClear.enable(false);
}
pos += BTN_HEIGHT+20;
resize( WIDTH, (int)pos );
}
private void setCheckedNoUpdate(int id, boolean checked) {
boxes.get(id).checked(checked);
}
@Override
public void onBackPressed() {
if (editable) {
int value = 0;
for (int i=0; i < boxes.size(); i++) {
if (boxes.get( i ).checked()) {
value |= Challenges.MASKS[i];
}
}
SPDSettings.challenges( value );
SPDSettings.challenges( refreshChecked(checked) );
}
super.onBackPressed();
if (callback != null) callback.call();
}
public static class CanScrollCheckBox extends CheckBox{
public CanScrollCheckBox(String label) {
super(label);
private int refreshChecked(int checked) {
int value = checked;
for (int i = 0; i < boxes.size(); i ++) {
if (index + i >= Challenges.MASKS.length) break;
value &= ~Challenges.MASKS[index + i];
if (boxes.get( i ).checked()) {
value |= Challenges.MASKS[index + i];
}
}
return value;
}
protected boolean onClick(float x, float y){
if(!inside(x,y)) return false;
if(active)
onClick();
return true;
private static class ChallengeButton extends IconButton {
private boolean checked = false;
public ChallengeButton() {
super( Icons.get( Icons.CHALLENGE_OFF ));
}
@Override
protected void layout(){
super.layout();
hotArea.width = hotArea.height = 0;
protected void onClick() {
checked(!checked);
}
public boolean checked() {
return checked;
}
public void checked( boolean checked ) {
this.checked = checked;
icon( Icons.get( checked ? Icons.CHALLENGE_ON : Icons.CHALLENGE_OFF ) );
}
}
public static class CanScrollInfo extends IconButton{
public CanScrollInfo(Image Icon){super(Icon);}
protected boolean onClick(float x, float y){
if(!inside(x,y)) return false;
if(active) onClick();
return true;
}
@Override
protected void layout(){
super.layout();
hotArea.width = hotArea.height = 0;
}
}
public static class CanScrollTextField extends TextField {
public CanScrollTextField(String label) {
super(label);
}
@Override
public void onTextChange() {
CustomGameSettings.putSeedString(text());
}
@Override
public void onTextCancel() {
private class ChallengeInfo extends Component {
Image icon;
IconButton info;
ChallengeButton check;
IconButton conflict;
public ChallengeInfo(Image icon, String challenge, boolean conflict, Callback onConflict) {
super();
this.icon = icon;
add( icon );
info = new IconButton(Icons.get(Icons.INFO)){
@Override
protected void onClick() {
ShatteredPixelDungeon.scene().add(
new WndTitledMessage(new Image(ChallengeInfo.this.icon),
Messages.titleCase(Messages.get(Challenges.class, challenge)),
Messages.get(Challenges.class, challenge+"_desc"))
);
}
};
add( info );
check = new ChallengeButton();
add( check );
if (conflict) {
this.conflict = new IconButton(Icons.get(Icons.HUNTRESS)) {
@Override
protected void onClick() {
if (onConflict != null)
onConflict.call();
}
};
add( this.conflict );
}
else this.conflict = null;
}
@Override
protected void layout() {
super.layout();
hotArea.height = hotArea.width = 0;
icon.x = x + (width - 32) / 2;
icon.y = y;
PixelScene.align( icon );
info.setRect(icon.x + icon.width, y, 16, BTN_HEIGHT);
PixelScene.align( info );
if (conflict == null) {
check.setRect(x + (width - 16) / 2, y + BTN_HEIGHT, 16, BTN_HEIGHT);
PixelScene.align( check );
}
else {
check.setRect(x + (width - 32) / 2, y + BTN_HEIGHT, 16, BTN_HEIGHT);
PixelScene.align( check );
conflict.setRect(check.right(), check.top(), 16, BTN_HEIGHT);
PixelScene.align( conflict );
}
height = BTN_HEIGHT * 2;
}
protected boolean onClick(float x, float y){
if(!inside(x,y)) return false;
if(active) onClick();
return true;
}
}
public static class CanScrollButton extends RedButton{
public CanScrollButton(String label) {
super(label, 7);
private Image foundChallangeIcon(int i) {
if (Challenges.NAME_IDS[i].equals("no_food")) {
return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_1,new ItemSprite.Glowing( 0xFF0000 ));
} else if (Challenges.NAME_IDS[i].equals("no_armor")) {
return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_2,new ItemSprite.Glowing( 0x8f8f8f ));
} else if (Challenges.NAME_IDS[i].equals("no_healing")) {
return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_3,new ItemSprite.Glowing( 0xff0000 ));
} else if (Challenges.NAME_IDS[i].equals("no_herbalism")) {
return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_4);
} else if (Challenges.NAME_IDS[i].equals("swarm_intelligence")) {
return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_5,new ItemSprite.Glowing( 0xffff00 ));
} else if (Challenges.NAME_IDS[i].equals("darkness")) {
return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_6,new ItemSprite.Glowing( 0x8f8f8f ));
} else if (Challenges.NAME_IDS[i].equals("no_scrolls")) {
return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_7,new ItemSprite.Glowing( 0x00dd00 ));
} else if (Challenges.NAME_IDS[i].equals("aquaphobia")) {
return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_8,new ItemSprite.Glowing( 0xac89cc ));
} else if (Challenges.NAME_IDS[i].equals("champion_enemies")) {
return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_9,new ItemSprite.Glowing( 0x333333 ));
} else if (Challenges.NAME_IDS[i].equals("rlpt")) {
return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_10,new ItemSprite.Glowing( 0xc6cc6c ));
} else if (Challenges.NAME_IDS[i].equals("sbsg")) {
return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_11,new ItemSprite.Glowing( 0x3b1051 ));
} else if (Challenges.NAME_IDS[i].equals("exsg")) {
return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_12,new ItemSprite.Glowing( 0xd1ce9f ));
} else if (Challenges.NAME_IDS[i].equals("stronger_bosses")) {
return new ItemSprite(ItemSpriteSheet.CHALLANEESICON_13,new ItemSprite.Glowing( 0xff0000 ));
} else if (Challenges.NAME_IDS[i].equals("dhxd")) {
return new ItemSprite(ItemSpriteSheet.LANTERNB,new ItemSprite.Glowing( 0x384976 ));
} else {
return Icons.get(Icons.PREFS);
}
@Override
protected void layout() {
super.layout();
hotArea.height = hotArea.width = 0;
}
protected boolean onClick(float x, float y){
if(!inside(x,y)) return false;
if(active) onClick();
return true;
}
}
}

View File

@ -78,7 +78,7 @@ public class WndGame extends Window {
@Override
protected void onClick() {
hide();
GameScene.show( new WndChallenges( Dungeon.challenges, false ) );
GameScene.show( new WndChallenges( Dungeon.challenges, false,null ) );
}
} );
curBtn.icon(Icons.get(Icons.CHALLENGE_ON));

View File

@ -106,7 +106,7 @@ public class WndGameInProgress extends Window {
RedButton btnChallenges = new RedButton( Messages.get(this, "challenges") ) {
@Override
protected void onClick() {
Game.scene().add( new WndChallenges( info.challenges, false ) );
Game.scene().add( new WndChallenges( info.challenges, false,null ) );
}
};
btnChallenges.icon(Icons.get(Icons.CHALLENGE_ON));

View File

@ -14,6 +14,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NullDiedTO;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Shopkeeper;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor;
import com.shatteredpixel.shatteredpixeldungeon.items.quest.BackGoKey;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
@ -178,7 +179,26 @@ public class WndKingShop extends Window {
btnReload.setRect(80,-2, 40, 20 );
add(btnReload);
resize(WIDTH, (int) s6.bottom());
StyledButton btnGoBack = new StyledButton(Chrome.Type.RED_BUTTON, Messages.get(this,"goback"),6){
@Override
protected void onClick() {
super.onClick();
Game.runOnRenderThread(new Callback() {
@Override
public void call() {
hide();
GameScene.show(new BackGoKey.WndSelectLevel());
GLog.w(Messages.get(WndKingShop.class,"back"));
}
});
}
};
btnGoBack.textColor(Window.CYELLOW);
btnGoBack.icon(Icons.get(Icons.DEPTH));
btnGoBack.setRect(s1.left(), s6.bottom()+5,111,BTN_SIZE );
add(btnGoBack);
resize(WIDTH, (int) btnGoBack.bottom());
}
public static WndBag sell() {

View File

@ -218,7 +218,7 @@ public class WndRanking extends WndTabbed {
RedButton btnChallenges = new RedButton( Messages.get(this, "challenges") ) {
@Override
protected void onClick() {
Game.scene().add( new WndChallenges( Dungeon.challenges, false ) );
Game.scene().add( new WndChallenges( Dungeon.challenges, false,null ) );
}
};

View File

@ -24,16 +24,12 @@ package com.shatteredpixel.shatteredpixeldungeon.windows;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.SPDSettings;
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
import com.shatteredpixel.shatteredpixeldungeon.custom.messages.M;
import com.shatteredpixel.shatteredpixeldungeon.custom.utils.CustomGameSettings;
import com.shatteredpixel.shatteredpixeldungeon.custom.visuals.TextField;
import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
import com.shatteredpixel.shatteredpixeldungeon.ui.CheckBox;
import com.shatteredpixel.shatteredpixeldungeon.ui.IconButton;
import com.shatteredpixel.shatteredpixeldungeon.ui.Icons;
import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton;
import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock;
import com.shatteredpixel.shatteredpixeldungeon.ui.ScrollPane;
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
import com.shatteredpixel.shatteredpixeldungeon.utils.DungeonSeed;
@ -42,11 +38,10 @@ import com.watabou.noosa.ui.Component;
import java.util.ArrayList;
public class WndHard extends Window {
public class WndSeed extends Window {
private static final int WIDTH = 120;
private static final int HEIGHT = 162;
private static final int BTN_HEIGHT = 16;
private static final int HEIGHT = 26;
private static final int GAP = 1;
private boolean editable;
@ -55,7 +50,7 @@ public class WndHard extends Window {
private CanScrollTextField cstf;
private CanScrollButton deleteSeedInput;
public WndHard ( long checked, boolean editable ) {
public WndSeed(boolean editable ) {
super();
@ -66,17 +61,6 @@ public class WndHard extends Window {
ScrollPane pane = new ScrollPane(new Component()) {
@Override
public void onClick(float x, float y) {
int max_size = boxes.size();
for (int i = 0; i < max_size; ++i) {
if (boxes.get(i).onClick(x, y))
return;
}
max_size = infos.size();
for(int i = 0; i<max_size;++i){
if(infos.get(i).onClick(x,y)){
return;
}
}
if(cstf.onClick(x, y)){
return;
}
@ -91,78 +75,11 @@ public class WndHard extends Window {
boxes = new ArrayList<>();
infos = new ArrayList<>();
final int normal_mode = 0;
final int hard_mode = 7;
final int warning_mode =9;
final int Test_Debug = 12;
boolean isCustom = false;
//boolean isCustom = false;
float pos = 0;
for (int i = 0; i < Challenges.NAME_IDS.length; i++) {
final String challenge = Challenges.NAME_IDS[i];
if(i==normal_mode || i==hard_mode || i==warning_mode || i==Test_Debug){
RenderedTextBlock block = PixelScene.renderTextBlock(10);
switch (i){
case normal_mode:
block.text(M.L(Challenges.class, "traditional"));
block.hardlight(0x00FF00);
break;
case hard_mode:
block.text(M.L(Challenges.class, "hard"));
block.hardlight(0xFF00FF);
break;
case warning_mode:
block.text(M.L(Challenges.class, "warning"));
block.hardlight(0xFF0000);
break;
case Test_Debug:
block.text(M.L(Challenges.class, "test"));
block.hardlight(0xFFFF00);
break;
}
block.setPos((WIDTH - block.width()) / 2,
pos + GAP *4);
PixelScene.align(block);
content.add(block);
pos += block.height() + 11*GAP;
}
CanScrollCheckBox cb = new CanScrollCheckBox(M.TL(Challenges.class, challenge));
cb.checked((checked & Challenges.MASKS[i]) != 0);
cb.active = editable;
if (i > 0) {
pos += GAP;
}
cb.setRect(0, pos, WIDTH - 16, BTN_HEIGHT);
content.add(cb);
boxes.add(cb);
boolean finalIsCustom = isCustom;
CanScrollInfo info = new CanScrollInfo(Icons.get(Icons.INFO)) {
@Override
protected void onClick() {
super.onClick();
ShatteredPixelDungeon.scene().add(
new WndMessage(M.L(finalIsCustom ? TextChallenges.class : Challenges.class, challenge + "_desc"))
);
}
};
info.setRect(cb.right(), pos, 16, BTN_HEIGHT);
infos.add(info);
content.add(info);
pos = cb.bottom();
}
pos += GAP;
cstf = new CanScrollTextField(M.L(TextChallenges.class, "seed_custom_title"));
cstf.setHint(M.L(TextChallenges.class, "hint"));
content.add(cstf);

View File

@ -632,10 +632,10 @@ public class WndSettings extends WndTabbed {
@Override
protected void onClick() {
super.onClick();
SPDSettings.FPSLimit(checked());
SPDSettings.TimeLimit(checked());
}
};
optFPSLimit.checked(SPDSettings.FPSLimit());
optFPSLimit.checked(SPDSettings.TimeLimit());
add(optFPSLimit);
quickslots = new OptionSlider(Messages.get(this, "quickslots"), "" + Constants.MIN_QUICKSLOTS,

View File

@ -102,7 +102,7 @@ public class WndStartGame extends Window {
"hard"), 5){
@Override
protected void onClick() {
ShatteredPixelDungeon.scene().addToFront(new WndChallenges(SPDSettings.challenges(), true) {
ShatteredPixelDungeon.scene().addToFront(new WndChallenges(SPDSettings.challenges(), false, null) {
public void onBackPressed() {
super.onBackPressed();
icon(Icons.get(SPDSettings.challenges() > 0 ? Icons.CHALLENGE_ON : Icons.CHALLENGE_OFF));
@ -158,7 +158,7 @@ public class WndStartGame extends Window {
"news"), 5){
@Override
protected void onClick() {
ShatteredPixelDungeon.scene().addToFront(new WndChallenges(SPDSettings.challenges(), true) {
ShatteredPixelDungeon.scene().addToFront(new WndChallenges(SPDSettings.challenges(), false, null) {
public void onBackPressed() {
super.onBackPressed();
icon(Icons.get(SPDSettings.challenges() > 0 ? Icons.CHALLENGE_ON : Icons.CHALLENGE_OFF));
@ -283,7 +283,7 @@ public class WndStartGame extends Window {
Icons.get( SPDSettings.challenges() > 0 ? Icons.CHALLENGE_ON :Icons.CHALLENGE_OFF)){
@Override
protected void onClick() {
ShatteredPixelDungeon.scene().addToFront(new WndChallenges(SPDSettings.challenges(), true) {
ShatteredPixelDungeon.scene().addToFront(new WndChallenges(SPDSettings.challenges(), false, null) {
public void onBackPressed() {
super.onBackPressed();
if (parent != null) {

View File

@ -21,6 +21,8 @@
package com.shatteredpixel.shatteredpixeldungeon.windows;
import static com.shatteredpixel.shatteredpixeldungeon.ui.Icons.RENAME_OFF;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.items.EquipableItem;
@ -75,18 +77,17 @@ public class WndUseItem extends WndInfoItem {
btn.textColor( TITLE_COLOR );
}
if (Badges.isUnlocked(Badges.Badge.BOSS_SLAIN_1)) {
label43: {
boolean var9 = item instanceof EquipableItem;
if (!var9) {
ling: {
boolean itemname = item instanceof EquipableItem;
if (!itemname) {
if (!(item instanceof Wand)) {
break label43;
break ling;
}
}
Image var12 = Icons.get(Icons.RENAME_OFF);
Image var11 = var12;
if (var9) {
Image renamebutton = Icons.get(Icons.RENAME_OFF);
if (itemname) {
if (!((EquipableItem)item).customName.equals("")) {
var11 = Icons.get(Icons.RENAME_ON);
renamebutton = Icons.get(Icons.RENAME_ON);
}
}
@ -96,7 +97,7 @@ public class WndUseItem extends WndInfoItem {
}
}
IconButton Rename = new IconButton(var11) {
IconButton Rename = new IconButton(renamebutton) {
public String hoverText() {
return Messages.titleCase(Messages.get(WndGame.class, "rename"));
}
@ -122,6 +123,7 @@ public class WndUseItem extends WndInfoItem {
GameScene.show(new WndUseItem(owner, item));
}
});
icon(Icons.get(!item.name().equals("") ? RENAME_OFF : Icons.RENAME_ON));
}
};
Rename.setRect((float)(super.width - 16), 0.0F, 16.0F, 16.0F);

View File

@ -127,6 +127,7 @@ public class DesktopPlatformSupport extends PlatformSupport {
basicFontGenerator = asianFontGenerator = fallbackFontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/droid_sans.ttf"));
} else {
basicFontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/pixel_font.ttf"));
//TODO 改成你自己的字库文件名放到fonts文件夹里面
asianFontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/fusion_pixel.ttf"));
fallbackFontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/droid_sans.ttf"));
}