Merge pull request #35 from LingASDJ/Dev

Dev Update
This commit is contained in:
JDSA Ling 2023-09-24 12:44:44 +08:00 committed by GitHub
commit 518e8dbdca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
127 changed files with 4606 additions and 1215 deletions

View File

@ -3,7 +3,10 @@ apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.crashlytics' apply plugin: 'com.google.firebase.crashlytics'
android { android {
compileSdkVersion appAndroidCompileSDK compileSdkVersion 30
buildToolsVersion "30.0.2"
// compileSdkVersion appAndroidCompileSDK
compileOptions.sourceCompatibility = compileOptions.targetCompatibility = appJavaCompatibility compileOptions.sourceCompatibility = compileOptions.targetCompatibility = appJavaCompatibility
sourceSets.main.assets.srcDirs = [new File(project(':core').projectDir, "/src/main/assets")] sourceSets.main.assets.srcDirs = [new File(project(':core').projectDir, "/src/main/assets")]
@ -81,8 +84,6 @@ dependencies {
implementation project(path: ':services:news:shatteredNews') implementation project(path: ':services:news:shatteredNews')
// implementation project(path: ':services:analytics:analyticsFirebase')
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a"

View File

@ -47,6 +47,7 @@
</activity> </activity>
<activity <activity
android:label="${appName}" android:label="${appName}"
android:exported="true"
android:name=".AndroidGame" android:name=".AndroidGame"
android:screenOrientation="nosensor" android:screenOrientation="nosensor"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize"> android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize">

View File

@ -33,7 +33,6 @@ import com.badlogic.gdx.backends.android.AndroidApplication;
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
import com.badlogic.gdx.backends.android.AndroidAudio; import com.badlogic.gdx.backends.android.AndroidAudio;
import com.badlogic.gdx.backends.android.AsynchronousAndroidAudio; import com.badlogic.gdx.backends.android.AsynchronousAndroidAudio;
import com.google.firebase.analytics.FirebaseAnalytics;
import com.shatteredpixel.shatteredpixeldungeon.SPDSettings; import com.shatteredpixel.shatteredpixeldungeon.SPDSettings;
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
import com.shatteredpixel.shatteredpixeldungeon.services.news.GameNesImpl; import com.shatteredpixel.shatteredpixeldungeon.services.news.GameNesImpl;
@ -48,8 +47,6 @@ public class AndroidGame extends AndroidApplication {
public static AndroidApplication instance; public static AndroidApplication instance;
public FirebaseAnalytics mFirebaseAnalytics;
private static AndroidPlatformSupport support; private static AndroidPlatformSupport support;
@Override @Override

View File

@ -198,7 +198,8 @@ public class AndroidPlatformSupport extends PlatformSupport {
} else if (Gdx.files.absolute("/system/fonts/DroidSans.ttf").exists()){ } else if (Gdx.files.absolute("/system/fonts/DroidSans.ttf").exists()){
basicFontGenerator = new FreeTypeFontGenerator(Gdx.files.absolute("/system/fonts/DroidSans.ttf")); basicFontGenerator = new FreeTypeFontGenerator(Gdx.files.absolute("/system/fonts/DroidSans.ttf"));
} }
if (!systemfont) {
if (basicFontGenerator == null) { if (basicFontGenerator == null) {
basicFontGenerator = fallbackFontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/pixel_font.ttf")); basicFontGenerator = fallbackFontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/pixel_font.ttf"));
} }
@ -206,7 +207,7 @@ public class AndroidPlatformSupport extends PlatformSupport {
fallbackFontGenerator = basicFontGenerator; fallbackFontGenerator = basicFontGenerator;
basicFontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/pixel_font.ttf")); basicFontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/pixel_font.ttf"));
} }
}
//android 7.0+. all asian fonts are nicely contained in one spot //android 7.0+. all asian fonts are nicely contained in one spot
if (Gdx.files.absolute("/system/fonts/NotoSansCJK-Regular.ttc").exists()) { if (Gdx.files.absolute("/system/fonts/NotoSansCJK-Regular.ttc").exists()) {
@ -216,9 +217,6 @@ public class AndroidPlatformSupport extends PlatformSupport {
case JAPANESE: case JAPANESE:
typeFace = 0; typeFace = 0;
break; break;
// case KOREAN:
// typeFace = 1;
// break;
case HARDCHINESE: case HARDCHINESE:
case CHINESE: case CHINESE:
default: default:
@ -284,6 +282,18 @@ public class AndroidPlatformSupport extends PlatformSupport {
break; break;
} }
KRFontGenerator = SCFontGenerator = TCFontGenerator = JPFontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/fusion_pixel.ttf")); KRFontGenerator = SCFontGenerator = TCFontGenerator = JPFontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/fusion_pixel.ttf"));
} else {
switch (SPDSettings.language()) {
case CHINESE:
fallbackFontGenerator = SCFontGenerator;
break;
case HARDCHINESE:
fallbackFontGenerator = TCFontGenerator;
break;
case JAPANESE:
fallbackFontGenerator = JPFontGenerator;
break;
}
} }
if (basicFontGenerator != null) fonts.put(basicFontGenerator, new HashMap<>()); if (basicFontGenerator != null) fonts.put(basicFontGenerator, new HashMap<>());

View File

@ -18,14 +18,14 @@ allprojects {
appName = 'Magic Ling Pixel Dungeon' appName = 'Magic Ling Pixel Dungeon'
appPackageName = 'com.ansdomagiclingpixeldungeon.ling' appPackageName = 'com.ansdomagiclingpixeldungeon.ling'
appVersionCode =903000 appVersionCode =907500
appVersionName = '0.6.4.0-Beta9' appVersionName = '0.6.5.0-Alpha4'
appJavaCompatibility = JavaVersion.VERSION_11 appJavaCompatibility = JavaVersion.VERSION_11
appAndroidCompileSDK = 30 appAndroidCompileSDK = 33
appAndroidMinSDK = 19 appAndroidMinSDK = 19
appAndroidTargetSDK = 30 appAndroidTargetSDK = 33
gdxControllersVersion = '2.2.1' gdxControllersVersion = '2.2.1'

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 B

After

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 428 B

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@ -1,5 +1,11 @@
#####MLPD-P3文本 #####MLPD-P3文本
actors.mobs.spical.gnollhero.name=豺狼部族长老
actors.mobs.spical.gnollhero.desc=与其他豺狼不同的是,它清楚最大的威胁不是冒险者。同时,它会使用古老的占卜魔法狩猎预知告知玩家即将要狩猎的稀有生物在何处。\n\n但它们并不是完全帮助冒险者如果冒险者有出格的举动部族长老会让冒险者知道”叛徒“的下场……
actors.mobs.spical.gnollhero.chat_1=哦,看看这是谁,这不是为了寻找水晶之心的冒险者吗?
actors.mobs.spical.gnollhero.chat_2=你和祂正式签下了狩猎契约?好吧,这个荒无人烟的地方确实有很多需要狩猎的生物。
actors.mobs.spical.gnollhero.chat_3=集中精神,寻找交错的房间,你需要的猎物就在那里……
actors.mobs.bosses.sakafishboss.name=萨卡班甲鱼 actors.mobs.bosses.sakafishboss.name=萨卡班甲鱼
actors.mobs.bosses.sakafishboss.desc=曾经远古时代的海洋王者,因为不可避免的末日来临时,潜入了地底的阴暗水潭进入了沉睡。想着有朝一日回到大海,然而地牢的魔力和陆上的变化,它再也不可能回到那片理想的海洋。 actors.mobs.bosses.sakafishboss.desc=曾经远古时代的海洋王者,因为不可避免的末日来临时,潜入了地底的阴暗水潭进入了沉睡。想着有朝一日回到大海,然而地牢的魔力和陆上的变化,它再也不可能回到那片理想的海洋。
actors.mobs.bosses.sakafishboss.notice=sakasaka……saka腻……系……甚磨 actors.mobs.bosses.sakafishboss.notice=sakasaka……saka腻……系……甚磨
@ -363,6 +369,8 @@ custom.testmode.mobplacer.elite_name12=危险体
custom.testmode.mobplacer.elite_name13=烟雾体 custom.testmode.mobplacer.elite_name13=烟雾体
custom.testmode.mobplacer.elite_name14=酸液体 custom.testmode.mobplacer.elite_name14=酸液体
custom.testmode.mobplacer.elite_name15=[友好[
actors.mobs.bloodbat$bloodbatrecharge.name=血影充能 actors.mobs.bloodbat$bloodbatrecharge.name=血影充能
actors.mobs.bloodbat$bloodbatrecharge.desc=小血影正在充能,等待下一次和主人并肩作战的时候!\n\n剩余充能时长:%s回合. actors.mobs.bloodbat$bloodbatrecharge.desc=小血影正在充能,等待下一次和主人并肩作战的时候!\n\n剩余充能时长:%s回合.
@ -829,7 +837,11 @@ actors.mobs.slime_sz.name=史莱姆-圣紫守护者
actors.mobs.slime_sz.desc=史莱姆七大守护者中的_圣紫使者_\n它发出的攻击有几率让入侵者受到_迟缓效果_ actors.mobs.slime_sz.desc=史莱姆七大守护者中的_圣紫使者_\n它发出的攻击有几率让入侵者受到_迟缓效果_
actors.mobs.slimeking.name=史莱姆王子 actors.mobs.slimeking.name=史莱姆王子
actors.mobs.slimeking.desc=史莱姆王子,圣境密林的守护者,没有人能从它这里活着走过去。你或许在质疑为什么圣境密林层会有它的存在,实际上,这也是史莱姆一族需要解决的问题。 actors.mobs.slimeking.desc=史莱姆王子,史莱姆族群的代理人,没有人能从它这里活着走过去。你或许在质疑为什么会有它的存在,实际上,这也是史莱姆一族需要解决的问题。[设计原型:泰拉瑞亚]
actors.mobs.spical.slimekingmob.name=史莱姆王子
actors.mobs.spical.slimekingmob.desc=史莱姆王子,史莱姆族群的代理人,没有人能从它这里活着走过去。你或许在质疑为什么会有它的存在,实际上,这也是史莱姆一族需要解决的问题。[设计原型:泰拉瑞亚]
actors.mobs.slimeking.notice=你清楚你在与谁抗衡吗? actors.mobs.slimeking.notice=你清楚你在与谁抗衡吗?
actors.mobs.slimeking.defeated=不……这不可能…… actors.mobs.slimeking.defeated=不……这不可能……
actors.mobs.slimeking.arise=无礼!朕为了一切什么都能付出 actors.mobs.slimeking.arise=无礼!朕为了一切什么都能付出
@ -912,10 +924,10 @@ actors.mobs.rgoo100.enraged=激怒
actors.mobs.rgoo100.gluuurp=咕——————! actors.mobs.rgoo100.gluuurp=咕——————!
actors.mobs.rgoo100.rankings_desc=被小粘咕消化 actors.mobs.rgoo100.rankings_desc=被小粘咕消化
actors.mobs.xtg100.name=小天狗-100实验体-狂暴 actors.mobs.xtg100.name=Tengu-100
actors.mobs.xtg100.desc=和大天狗长得差不多的幻影,但血量只有大天狗的四分之一。你已经彻底激怒他们,他们仍然能使用喷火器,但弹药不是无限的。\n\当前弹药总共还有_%s发_. actors.mobs.xtg100.desc=和大天狗长得差不多的幻影,但血量只有大天狗的四分之一。你已经彻底激怒他们,他们仍然能使用喷火器,但弹药不是无限的。\n\当前弹药总共还有_%s发_.
actors.mobs.xtg200.name=小天狗-100实验体 actors.mobs.xtg200.name=Tengu-100
actors.mobs.xtg200.desc=和大天狗长得差不多的幻影,但血量只有大天狗的四分之一。 actors.mobs.xtg200.desc=和大天狗长得差不多的幻影,但血量只有大天狗的四分之一。
actors.mobs.sb.name=矮人国亡 actors.mobs.sb.name=矮人国亡
@ -1126,7 +1138,7 @@ actors.buffs.earthimbue.name=大地之力
actors.buffs.earthimbue.desc=你被灌注了大地的力量!\n\n直到该效果结束前你所有的物理攻击都会使敌人被缠绕在原地无法动弹一段时间。\n\n大地之力还能持续%s回合。 actors.buffs.earthimbue.desc=你被灌注了大地的力量!\n\n直到该效果结束前你所有的物理攻击都会使敌人被缠绕在原地无法动弹一段时间。\n\n大地之力还能持续%s回合。
actors.buffs.enhancedrings.name=戒指强化 actors.buffs.enhancedrings.name=戒指强化
actors.buffs.enhancedrings.desc=盗贼在使用神器时会强化装备中的戒指,在%d回合内使其获得+1升级。 actors.buffs.enhancedrings.desc=极影铃虹在使用神器时会强化装备中的戒指,在%d回合内使其获得+1升级。
actors.buffs.fireimbue.name=火焰之力 actors.buffs.fireimbue.name=火焰之力
actors.buffs.fireimbue.desc=你被灌注了火焰的力量!\n\n所有物理攻击都有机会使敌人燃烧。与此同时你对火焰完全免疫。\n\n剩余火焰之力效果时长%s回合 actors.buffs.fireimbue.desc=你被灌注了火焰的力量!\n\n所有物理攻击都有机会使敌人燃烧。与此同时你对火焰完全免疫。\n\n剩余火焰之力效果时长%s回合
@ -1438,13 +1450,13 @@ actors.hero.heroclass.warrior_desc_loadout=蕾零安洁初始携带一把_破损
actors.hero.heroclass.warrior_desc_misc=蕾零安洁每次食用食物时都能恢复少量生命值。\n\n蕾零安洁开局鉴定的物品有\n- 鉴定卷轴\n- 治疗药水\n- 盛怒卷轴\n\n蕾零安洁初始携带一个不会被消耗的_唤魔晶柱_ actors.hero.heroclass.warrior_desc_misc=蕾零安洁每次食用食物时都能恢复少量生命值。\n\n蕾零安洁开局鉴定的物品有\n- 鉴定卷轴\n- 治疗药水\n- 盛怒卷轴\n\n蕾零安洁初始携带一个不会被消耗的_唤魔晶柱_
actors.hero.heroclass.warrior_desc_subclasses=在击杀第二个Boss后可以选择一种专精。蕾零安洁可以在两种专精中二选一 actors.hero.heroclass.warrior_desc_subclasses=在击杀第二个Boss后可以选择一种专精。蕾零安洁可以在两种专精中二选一
actors.hero.heroclass.warrior_story=蕾蕶安洁--战术策略\n\n她出生于霜落帝国,这里常年都是寒风刺骨的状态。蕾蕶安洁是毕业于战术高等学府的优秀学员。她不主张使用魔法,而是在于攻防兼备。她的家族世世代代都以战术策略为主,她的家族是霜落帝国中为数不多的仍然未使用魔法或者特殊能力的家族。\n如今由于地表三巨头的诱人悬赏加上她自己也有来地牢的一些调查她就此来到了这里。 actors.hero.heroclass.warrior_story=蕾蕶安洁--战术策略\n\n她出生于常年都是寒风刺骨的霜落帝国。蕾蕶安洁是毕业于战术高等学府的优秀学员。她不主张使用魔法,而是倾向于使用精明的战术策略去击败敌人。她的家族世世代代都是以战术策略闻名于世,她的家族是霜落帝国中为数不多的不使用魔法或者特殊能力却仍在帝国中占有一席之地的家族。如今在地表三巨头巨额悬赏的诱惑下,原本就想要来到地牢调查的她来到了这里。
actors.hero.heroclass.huntress_story=颐莲梅錵--精灵血裔\n\n颐莲梅錵诞生于绿林圣境这里是精灵的聚集地。她的母亲是这里的最高管理者,然而,她向往外面的世界,不希望自己就一直在母亲的保护和圣境的结界中过完一生。为此,她私自开启了结界,这带来了一场重大的变故。最后还是她母亲发现异常后重新修补了结界,但她本人从此在圣境中消失了。最高管理者其实什么都知道,为此也没有派人寻找她....\n\n多年后她为了提升自己的力量前往了这里。地牢深处的宝物是她此行的目的而她不知道的是她已是最后一位精灵血裔... actors.hero.heroclass.huntress_story=颐莲梅錵--精灵血裔\n\n颐莲梅錵诞生于绿林圣境那里是精灵的聚集地,而她的母亲是那里的最高管理者。然而,向往着外面的世界,不希望自己就一直在母亲的保护和圣境的结界中过完一生的她,私自开启了结界。这带来了一场可怕的灾难。最后她母亲虽然重新修补了结界,但颐莲梅錵本人却从此在圣境中消失了。最高管理者其实什么都知道,但是却没有派人寻找她……\n\n多年后她为了提升自己的力量来到了这里寻找地牢深处的宝物。而她不知道的是她已是最后一位精灵血裔……
actors.hero.heroclass.rogue_story=极影铃虹--迷离少女\n\n极影铃虹出生于深渊魔都拥有皇家血脉的人。然而,她在每次外出的时候,都会看见底层的人们深受生活的折磨,并且遭到贵族的歧视。这些现象都给纯洁无知的她带来了很多影响,自那以后,皇室中总有一个黑影盗窃东西,都是由于这个黑影每次盗窃的都是食物方面。为此皇室高层是搁置不管此事。皇室高层在外巡游的时候,听到底层的人们谈论有一个蒙着面纱的女性将食物送给他们。皇室高层自然联想到了那个黑影......\n但是并没有人知道是她。而她听说地牢最深处的东西可以实现愿望便说服自己的父亲来到了这里父亲在她的斗篷中植入了一颗暗黑的种子,必要时刻,它会保护她前行。 actors.hero.heroclass.rogue_story=极影铃虹--迷离少女\n\n极影铃虹出生于深渊魔都皇室,拥有纯正的皇家血脉。然而,她在每次外出的时候,都会看见底层的人们深受生活的折磨,以及贵族对他们深入骨髓的歧视。这些现象都给她纯洁的思想带来了巨大的冲击。自那以后,皇室中总有一个盗窃东西的黑影,并且这个黑影每次盗窃的都是食物,而皇室也一直没有成功抓住这个黑影。皇室高层在外巡游的时候,听到底层的人们谈论有一个蒙着面纱的女性将食物送给他们。皇室高层自然联想到了那个黑影……但是,并没有人知道是她。而她在听说地牢最深处的东西可以实现愿望之后,便说服自己的父亲来到了这里。父亲在她的斗篷中植入了一颗暗黑的种子,必要时刻,它会保护她前行。
actors.hero.heroclass.mage_story=茉莉伊洛--渊初少女\n\n茉莉伊洛的出生地并不是这片国土而是天边的神秘之境。那里魔力满溢,每个人都是这里的顶尖魔法师。她因为一些变故,离开了自己的家乡,来到了地表三巨头管辖的区域,并且在法师学府毕业。懂得强大的冰与火的魔力,能在战斗中随机应变。但由于她并不属于这里,这里的魔力束缚了她,为此她的真正力量从未显现。她为了调查有关于水晶之心的谜团,便前往来到这地牢的面前.... actors.hero.heroclass.mage_story=茉莉伊洛--渊初少女\n\n茉莉伊洛的出生地并不是这片国土而是在遥远天边的神秘之境。那里魔力满溢,每个人都可以成为顶尖魔法师。而她因为一些变故,不得不离开自己的家乡,来到了地表三巨头管辖的区域。法师学府的多年深造使得她懂得强大的冰与火的魔力,能在战斗中随机应变。但由于她并不属于这里,这里的魔力在排斥她,所以她的真正力量从未显现。她为了调查有关于水晶之心的谜团,只好以孱弱的姿态来到这地牢的面前……
actors.hero.heroclass.mage=茉莉伊洛 actors.hero.heroclass.mage=茉莉伊洛
actors.hero.heroclass.mage_unlock=茉莉伊洛精通各类法杖并在开局时持有一根_独特的魔杖_。\n\n_在一局游戏中使用两张升级卷轴_以解锁茉莉伊洛。 actors.hero.heroclass.mage_unlock=茉莉伊洛精通各类法杖并在开局时持有一根_独特的魔杖_。\n\n_在一局游戏中使用两张升级卷轴_以解锁茉莉伊洛。
@ -1916,8 +1928,8 @@ actors.mobs.brute$bruterage.desc=这个豺狼暴徒的死亡已经不可避免
actors.mobs.causticslime.name=蚀化史莱姆 actors.mobs.causticslime.name=蚀化史莱姆
actors.mobs.causticslime.desc=这个史莱姆似乎已经被下方渗透的黑暗能量完全侵蚀了。它已经失去了体表原有的绿色光泽,并且在不断滴落腐蚀污泥。 actors.mobs.causticslime.desc=这个史莱姆似乎已经被下方渗透的黑暗能量完全侵蚀了。它已经失去了体表原有的绿色光泽,并且在不断滴落腐蚀污泥。
actors.mobs.crab.name=下水道螃蟹 actors.mobs.crab.name=密林螃蟹
actors.mobs.crab.desc=这些巨型的螃蟹位居下水道食物链的顶端。它们行动极其迅速且其厚重的甲壳能承受沉重的打击。 actors.mobs.crab.desc=这些巨型的螃蟹位居密林食物链的顶端。它们行动极其迅速且其厚重的甲壳能承受沉重的打击。
actors.mobs.crystalmimic.name=水晶宝箱怪 actors.mobs.crystalmimic.name=水晶宝箱怪
actors.mobs.crystalmimic.ate=水晶宝箱怪吃掉了你的%s actors.mobs.crystalmimic.ate=水晶宝箱怪吃掉了你的%s
@ -1997,7 +2009,7 @@ actors.mobs.ghoul.name=矮人尸群
actors.mobs.ghoul.desc=在矮人王国逐渐衰亡,现在的矮人国王掌握了绝对的权力时,一些较为弱小的或是反抗国王的矮人受到了不公的待遇。然而随着矮人国王逐渐精通黑暗魔法,这些矮人逐渐屈从于其意志,并最终沦为了其大军中的一枚棋子。\n\n矮人尸群中的个体本身没有强大的战斗力但它们总是结伴作战试图利用数量优势击败强大的对手。_一名矮人尸群成员被击倒时如果周围仍有其他同类它将会在几回合后重生_。 actors.mobs.ghoul.desc=在矮人王国逐渐衰亡,现在的矮人国王掌握了绝对的权力时,一些较为弱小的或是反抗国王的矮人受到了不公的待遇。然而随着矮人国王逐渐精通黑暗魔法,这些矮人逐渐屈从于其意志,并最终沦为了其大军中的一枚棋子。\n\n矮人尸群中的个体本身没有强大的战斗力但它们总是结伴作战试图利用数量优势击败强大的对手。_一名矮人尸群成员被击倒时如果周围仍有其他同类它将会在几回合后重生_。
actors.mobs.gnoll.name=豺狼巡查 actors.mobs.gnoll.name=豺狼巡查
actors.mobs.gnoll.desc=豺狼是鬣狗状的类人生物。它们在下水道和地牢里游荡,不时向上行动试图向地表发起进攻。豺狼巡查是它们种群里最普通的一员,它们既没有豺狼暴徒强壮,也赶不上萨满聪明。 actors.mobs.gnoll.desc=豺狼是鬣狗状的类人生物。它们在密林和地牢里游荡,不时向上行动试图向地表发起进攻。豺狼巡查是它们种群里最普通的一员,它们既没有豺狼暴徒强壮,也赶不上萨满聪明。
actors.mobs.gnolltrickster.name=豺狼诡术师 actors.mobs.gnolltrickster.name=豺狼诡术师
actors.mobs.gnolltrickster.desc=即使以豺狼人的标准来看,这个生物也非常的诡异。它佝偻着腰,鬼鬼祟祟地行进着,大嘴咧开,露出邪恶的笑容,肩上挂着的挎包鼓得同摇篮一般。它的瞳孔中混杂着恐惧与兴奋。\n\n它的挎包里有一大批粗制滥造的飞镖它们似乎包含着各种有害物质。 actors.mobs.gnolltrickster.desc=即使以豺狼人的标准来看,这个生物也非常的诡异。它佝偻着腰,鬼鬼祟祟地行进着,大嘴咧开,露出邪恶的笑容,肩上挂着的挎包鼓得同摇篮一般。它的瞳孔中混杂着恐惧与兴奋。\n\n它的挎包里有一大批粗制滥造的飞镖它们似乎包含着各种有害物质。
@ -2017,12 +2029,16 @@ actors.mobs.goo.pumpup=粘咕正在不断地抽动!
actors.mobs.goo.enraged=激怒 actors.mobs.goo.enraged=激怒
actors.mobs.goo.gluuurp=咕——————! actors.mobs.goo.gluuurp=咕——————!
actors.mobs.goo.rankings_desc=被粘咕消化 actors.mobs.goo.rankings_desc=被粘咕消化
actors.mobs.goo.desc=我们对粘咕所知甚少。它甚至很有可能不是一个生物,而是下水道表面聚集的邪恶物质得到基本智能而产生的实体。不管怎样,很明显是黑暗魔法造就了这个生物。\n\n其凝胶性质让它吸收了很多黑暗能量你光是靠近就感受到了一股寒意。如果粘咕使用这种能量对你进行攻击那你肯定支撑不了多久。 actors.mobs.goo.desc=我们对粘咕所知甚少。它甚至很有可能不是一个生物,而是密林表面聚集的邪恶物质得到基本智能而产生的实体。不管怎样,很明显是黑暗魔法造就了这个生物。\n\n其凝胶性质让它吸收了很多黑暗能量你光是靠近就感受到了一股寒意。如果粘咕使用这种能量对你进行攻击那你肯定支撑不了多久。
actors.mobs.spical.goomob.name=粘咕
actors.mobs.spical.goomob.desc=我们对粘咕所知甚少。它甚至很有可能不是一个生物,而是密林表面聚集的邪恶物质得到基本智能而产生的实体。不管怎样,很明显是黑暗魔法造就了这个生物。\n\n其凝胶性质让它吸收了很多黑暗能量你光是靠近就感受到了一股寒意。如果粘咕使用这种能量对你进行攻击那你肯定支撑不了多久。
actors.mobs.greatcrab.name=巨大螃蟹 actors.mobs.greatcrab.name=巨大螃蟹
actors.mobs.greatcrab.noticed=巨型螃蟹用它硕大的钳子格挡了这次攻击。 actors.mobs.greatcrab.noticed=巨型螃蟹用它硕大的钳子格挡了这次攻击。
actors.mobs.greatcrab.def_verb=格挡 actors.mobs.greatcrab.def_verb=格挡
actors.mobs.greatcrab.desc=这只螃蟹的块头相当大,甚至超过了其他的下水道螃蟹。它的蓝色甲壳上布满了裂纹和藤壶,足以证明其经历的无数岁月。它爬行缓慢,那只巨大的钳子让它难以保持平衡。\n\n尽管这螃蟹只剩下一边的钳子但钳子的个头完全弥补了这点不足。螃蟹只要发现危险就会把爪子举在身前利用坚不可摧的甲壳进行防御。不过螃蟹无法格挡未察觉的攻击也无法同时格挡多个敌人的进攻。 actors.mobs.greatcrab.desc=这只螃蟹的块头相当大,甚至超过了其他的密林螃蟹。它的蓝色甲壳上布满了裂纹和藤壶,足以证明其经历的无数岁月。它爬行缓慢,那只巨大的钳子让它难以保持平衡。\n\n尽管这螃蟹只剩下一边的钳子但钳子的个头完全弥补了这点不足。螃蟹只要发现危险就会把爪子举在身前利用坚不可摧的甲壳进行防御。不过螃蟹无法格挡未察觉的攻击也无法同时格挡多个敌人的进攻。
actors.mobs.guard.name=监狱守卫 actors.mobs.guard.name=监狱守卫
actors.mobs.guard.scorpion=给我过来! actors.mobs.guard.scorpion=给我过来!
@ -2071,7 +2087,7 @@ actors.mobs.pylon.desc_inactive=这是一座用于分配区域内机械用电的
actors.mobs.pylon.desc_active=这是一座用于分配区域内机械用电的能量塔。此刻能量塔电能涌动定是它正在为DM-300充能\n\n这时的能量塔可被摧毁却会顺时针向四周释放电弧。厚重的金属结构为其提供了强劲的防御。 actors.mobs.pylon.desc_active=这是一座用于分配区域内机械用电的能量塔。此刻能量塔电能涌动定是它正在为DM-300充能\n\n这时的能量塔可被摧毁却会顺时针向四周释放电弧。厚重的金属结构为其提供了强劲的防御。
actors.mobs.rat.name=啮齿小鼠 actors.mobs.rat.name=啮齿小鼠
actors.mobs.rat.desc=虽说啮齿小鼠们具有攻击性,可它们依旧是下水道居民里的弱者。它们的啮咬非常烦人,但只有数量巨大时才会有生命威胁。 actors.mobs.rat.desc=虽说啮齿小鼠们具有攻击性,可它们依旧是密林居民里的弱者。它们的啮咬非常烦人,但只有数量巨大时才会有生命威胁。
actors.mobs.ripperdemon.name=恶魔撕裂者 actors.mobs.ripperdemon.name=恶魔撕裂者
actors.mobs.ripperdemon.leap=恶魔撕裂者正准备扑杀! actors.mobs.ripperdemon.leap=恶魔撕裂者正准备扑杀!
@ -2107,9 +2123,9 @@ actors.mobs.skeleton.desc=骷髅是从那些悲惨的冒险者及地牢原住民
actors.mobs.slime.name=史莱姆 actors.mobs.slime.name=史莱姆
actors.mobs.slime.def_verb=格挡 actors.mobs.slime.def_verb=格挡
actors.mobs.slime.desc=史莱姆是一种具有胶质外形与液态内核的奇特魔法生物。城市的下水道为它们提供了充分的水源和富足的养分。\n\n史莱姆的外层胶膜具有极强的弹性这使得任何单次攻击都难以对它们造成超过_6点的伤害_。 actors.mobs.slime.desc=史莱姆是一种具有胶质外形与液态内核的奇特魔法生物。城市的密林为它们提供了充分的水源和富足的养分。\n\n史莱姆的外层胶膜具有极强的弹性这使得任何单次攻击都难以对它们造成超过_6点的伤害_。
actors.mobs.snake.name=下水道巨蛇 actors.mobs.snake.name=密林巨蛇
actors.mobs.snake.hint=试试点击检查按钮再选择蛇,以了解如何击败它们。 actors.mobs.snake.hint=试试点击检查按钮再选择蛇,以了解如何击败它们。
actors.mobs.snake.desc=这些体型庞大的蛇能通过快速滑行以闪避普通的攻击,让它们难以命中。不过伏击与魔法攻击会使它们措手不及。\n\n在这条蛇的视野外攻击它时可以触发伏击。当这条蛇在追击你时可以尝试躲入一扇门后再_在蛇进门的瞬间发动攻击_。 actors.mobs.snake.desc=这些体型庞大的蛇能通过快速滑行以闪避普通的攻击,让它们难以命中。不过伏击与魔法攻击会使它们措手不及。\n\n在这条蛇的视野外攻击它时可以触发伏击。当这条蛇在追击你时可以尝试躲入一扇门后再_在蛇进门的瞬间发动攻击_。
@ -2124,7 +2140,7 @@ actors.mobs.statue.def_verb=格挡
actors.mobs.statue.desc=你可能认为这只是地牢里的又一具雕像摆设,但它发出红光的眼睛出卖了自己。 \n\n尽管雕像本身是用石头做的但它手上握着的_%s_看起来像是真的。 actors.mobs.statue.desc=你可能认为这只是地牢里的又一具雕像摆设,但它发出红光的眼睛出卖了自己。 \n\n尽管雕像本身是用石头做的但它手上握着的_%s_看起来像是真的。
actors.mobs.succubus.name=魅魔 actors.mobs.succubus.name=魅魔
actors.mobs.succubus.desc=魅魔是一种善于操纵敌人的精神的变形恶魔。这一只化为了哥特风的苍白人形,或许是为了吸引矮人噬魂女皇\n\n在攻击时魅魔能够暂时魅惑目标使其无法直接攻击魅魔本身。魅魔在攻击被魅惑的目标时能吸取其生命精华。 actors.mobs.succubus.desc=魅魔是一种善于操纵敌人的精神的变形恶魔。这一只化为了哥特风的苍白人形,或许是为了吸引矮人术士\n\n在攻击时魅魔能够暂时魅惑目标使其无法直接攻击魅魔本身。魅魔在攻击被魅惑的目标时能吸取其生命精华。
actors.mobs.swarm.name=蝇群 actors.mobs.swarm.name=蝇群
actors.mobs.swarm.desc=致命的飞蝇群愤怒地发出嗡嗡声。每次非魔法攻击都会把它分割成两群更小但同样危险的飞蝇群。 actors.mobs.swarm.desc=致命的飞蝇群愤怒地发出嗡嗡声。每次非魔法攻击都会把它分割成两群更小但同样危险的飞蝇群。

View File

@ -969,7 +969,7 @@ actors.mobs.ghoul.name=dwarven ghoul
actors.mobs.ghoul.desc=As dwarven society slowly began to collapse, and the current king of the dwarves seized absolute power, those who were weak or who resisted him were not treated well. As the king grew more adept at wielding dark magic, he bent these dwarves to his will, and now they make up the footsoldiers of his army.\n\nGhouls are not especially strong on their own, but always travel in groups and are much harder to kill in large numbers. _When a ghoul is defeated, it will rise again after a few turns as long as another ghoul is nearby._ actors.mobs.ghoul.desc=As dwarven society slowly began to collapse, and the current king of the dwarves seized absolute power, those who were weak or who resisted him were not treated well. As the king grew more adept at wielding dark magic, he bent these dwarves to his will, and now they make up the footsoldiers of his army.\n\nGhouls are not especially strong on their own, but always travel in groups and are much harder to kill in large numbers. _When a ghoul is defeated, it will rise again after a few turns as long as another ghoul is nearby._
actors.mobs.gnoll.name=ノールの斥候 actors.mobs.gnoll.name=ノールの斥候
actors.mobs.gnoll.desc=ノールはハイエナのような人型生物だ。彼らは下水道やダンジョンに生息し、時々地表を襲うために危険を犯す。ノールの斥候は悪漢ほど強くなく、巫師よりも賢くないが、部隊の大多数を占めている。 actors.mobs.gnoll.desc=ノールはハイエナのような人型生物だ。彼らは密林やダンジョンに生息し、時々地表を襲うために危険を犯す。ノールの斥候は悪漢ほど強くなく、巫師よりも賢くないが、部隊の大多数を占めている。
actors.mobs.gnolltrickster.name=ノールの奇術師 actors.mobs.gnolltrickster.name=ノールの奇術師
actors.mobs.gnolltrickster.desc=ノールの標準と比べても、とても奇妙な見た目をしている。背は曲がっており、邪悪な笑みを浮かべながら、肩にかかっている鞄を揺らしている。恐れと興奮が入り混じった目を見開いている。\n\n鞄には雑に作られた投矢の膨大なコレクションで埋め尽くされており、先端には様々な有害物質が塗られているように見える。 actors.mobs.gnolltrickster.desc=ノールの標準と比べても、とても奇妙な見た目をしている。背は曲がっており、邪悪な笑みを浮かべながら、肩にかかっている鞄を揺らしている。恐れと興奮が入り混じった目を見開いている。\n\n鞄には雑に作られた投矢の膨大なコレクションで埋め尽くされており、先端には様々な有害物質が塗られているように見える。

View File

@ -1,4 +1,18 @@
####MLPD-P3文本 ####MLPD-P3文本
### 传奇武器
items.weapon.melee.legend.legendweapon.typical_stats_desc=这是一件_%1$s阶_传奇武器这件传奇武器的技能通常造成为%2$s\n这个技能通常可以造成_%3$s~%4$s点伤害_。
items.weapon.melee.legend.legendweapon.stats_desc=这是一件_%1$s阶_传奇武器这件传奇武器的技能为%2$s\n这个技能当前可以造成_%3$s~%4$s点伤害_。
items.weapon.melee.legend.diedcrossbow.name=重型弩炮
items.weapon.melee.legend.diedcrossbow.desc=这是一件非常精密复杂的装置,能将数个飞镖一样的小型箭矢以极高的速度射出。这把重型弩炮十分的沉重,如果使用者的力量不足可能会因为装置失灵波及到自己。其本身也相当致命,在肉搏战中可以起到很好的作用。
items.weapon.melee.legend.diedcrossbow.king_desc=_战术扇形爆炸弩炮_\n\n充能完毕时可以发射爆炸弩炮。发射后需要重新装填通过升级可以减少装填的时间。\n\n在发射的尽头或遭遇敌对目标时立刻产生_4x4_的爆炸并造成范围伤害。每次爆炸完毕后弩炮需要_重新装填_。弩炮伤害会根据自身等级成长。
items.weapon.melee.legend.diedcrossbow.ac_king=战术扇形爆炸弩炮
items.weapon.melee.legend.diedcrossbow.no_cooldown=弩炮装置正在重新装填,请稍后……
items.weapon.melee.legend.diedcrossbow.no_equip=必须装备重型弩炮才能使用它。
items.weapon.melee.legend.diedcrossbow.ondeath=你被爆炸弩炮炸的渣的不剩了……
items.weapon.melee.sdbsword.name=钻石大剑 items.weapon.melee.sdbsword.name=钻石大剑
items.weapon.melee.sdbsword.desc=钻石制成的奇特大剑,现在它已经给予了足够多的能量,它回到了巅峰时刻\n剑身残留着钻石宝箱王的魔力因此对其他魔力有着莫名的亲和性。相比于其他武器这把武器会随着等级的提升增加更多伤害。\n这把武器攻击速度极慢,但精准极高。\n该武器已经重回巅峰可以发射剑气。(该武器尚未完成,切勿使用) items.weapon.melee.sdbsword.desc=钻石制成的奇特大剑,现在它已经给予了足够多的能量,它回到了巅峰时刻\n剑身残留着钻石宝箱王的魔力因此对其他魔力有着莫名的亲和性。相比于其他武器这把武器会随着等级的提升增加更多伤害。\n这把武器攻击速度极慢,但精准极高。\n该武器已经重回巅峰可以发射剑气。(该武器尚未完成,切勿使用)
@ -320,7 +334,7 @@ items.books.playbookslist.deyizibooks.name=《我们是柏林联合》
items.books.playbookslist.deyizibooks.desc=在山的那边,海的那边,有一座小球场。\n球场里有一群纯粹到不敢相信的踢球的人他们就是柏林联合即使我们刚刚进去甲级联赛但是我们有一往无前的气势。\n旅行者愿柏林联合的钢铁意志保佑你。 items.books.playbookslist.deyizibooks.desc=在山的那边,海的那边,有一座小球场。\n球场里有一群纯粹到不敢相信的踢球的人他们就是柏林联合即使我们刚刚进去甲级联赛但是我们有一往无前的气势。\n旅行者愿柏林联合的钢铁意志保佑你。
items.books.playbookslist.deyizibooks.author=--作者:_Pedro_ items.books.playbookslist.deyizibooks.author=--作者:_Pedro_
items.mainbooks.mustread=书本的厚重感让你不敢轻易翻开,但若是不翻开,你将无法获得它的力量。 items.mainbooks.desc=书本的厚重感让你不敢轻易翻开,但若是不翻开,你将无法获得它的力量。
items.mainbooks.readed=你已经阅读过这本书了。所以你不再需要再看这本书的内容了。 items.mainbooks.readed=你已经阅读过这本书了。所以你不再需要再看这本书的内容了。
items.mainbooks.no=就当你准备阅读的时候,一道力量让你无法翻阅书籍,看来有人希望你将书籍带出地牢,而不是阅读完它们。 items.mainbooks.no=就当你准备阅读的时候,一道力量让你无法翻阅书籍,看来有人希望你将书籍带出地牢,而不是阅读完它们。
@ -365,7 +379,7 @@ items.quest.goldbao.desc=由钻石宝箱王守护的东西,据说是商人的
items.quest.red.name=死灵精华十字架 items.quest.red.name=死灵精华十字架
items.quest.red.desc=死灵领主的好东西,如果交给想要的人必然会有好运。 items.quest.red.desc=死灵领主的好东西,如果交给想要的人必然会有好运。
items.weapon.melee.skyshield.name=筝盾 items.weapon.melee.skyshield.name=
items.weapon.melee.skyshield.typical_stats_desc=这件武器通常能格挡0~%d点伤害。通过升级可以使格挡量增长。 items.weapon.melee.skyshield.typical_stats_desc=这件武器通常能格挡0~%d点伤害。通过升级可以使格挡量增长。
items.weapon.melee.skyshield.stats_desc=这件武器能格挡0~%d点伤害。通过升级可以使格挡量增长。 items.weapon.melee.skyshield.stats_desc=这件武器能格挡0~%d点伤害。通过升级可以使格挡量增长。
items.weapon.melee.skyshield.desc=这是"霜落帝国"的产物,由"霜落女帝"亲自监督研发。 items.weapon.melee.skyshield.desc=这是"霜落帝国"的产物,由"霜落女帝"亲自监督研发。
@ -538,7 +552,7 @@ items.armor.armor.inscribed=上面镌刻着_%s_。
items.armor.armor.cursed_worn=这套护甲被诅咒了,你无法卸下它。 items.armor.armor.cursed_worn=这套护甲被诅咒了,你无法卸下它。
items.armor.armor.cursed=你能感觉到这套护甲里潜伏着一股充满恶意的魔力。 items.armor.armor.cursed=你能感觉到这套护甲里潜伏着一股充满恶意的魔力。
items.armor.armor.not_cursed=这件护甲没有被诅咒。 items.armor.armor.not_cursed=这件护甲没有被诅咒。
items.armor.armor.seal_attached=战士的破损纹章被贴附于这件护甲上,它正为战士提供_%d点护盾_。 items.armor.armor.seal_attached=蕾零安洁的破损纹章被贴附于这件护甲上,它正为蕾零安洁提供_%d点护盾_。
items.armor.armor$glyph.glyph=刻印 items.armor.armor$glyph.glyph=刻印
items.armor.armor$glyph.killed=%s害死了你… items.armor.armor$glyph.killed=%s害死了你…
@ -553,13 +567,13 @@ items.armor.clotharmor.desc=这件轻便的护甲能提供最基本的防御。
items.armor.huntressarmor.name=英雄披风 items.armor.huntressarmor.name=英雄披风
items.armor.huntressarmor.no_enemies=视野中未发现敌人。 items.armor.huntressarmor.no_enemies=视野中未发现敌人。
items.armor.huntressarmor.desc=披着这件朴实无华的披风,女猎手能够使出一个华丽的招式。 items.armor.huntressarmor.desc=披着这件朴实无华的披风,颐莲梅錵能够使出一个华丽的招式。
items.armor.leatherarmor.name=皮甲 items.armor.leatherarmor.name=皮甲
items.armor.leatherarmor.desc=用鞣制的兽皮制成的护甲。没有布甲轻,但提供更好的防御。 items.armor.leatherarmor.desc=用鞣制的兽皮制成的护甲。没有布甲轻,但提供更好的防御。
items.armor.magearmor.name=英雄法袍 items.armor.magearmor.name=英雄法袍
items.armor.magearmor.desc=穿着这件华贵的法袍时,法师可以释放一项特殊的技能。 items.armor.magearmor.desc=穿着这件华贵的法袍时,茉莉伊洛可以释放一项特殊的技能。
items.armor.mailarmor.name=链甲 items.armor.mailarmor.name=链甲
items.armor.mailarmor.desc=由金属链环环相扣制成的一套结实又不失灵活的护甲。 items.armor.mailarmor.desc=由金属链环环相扣制成的一套结实又不失灵活的护甲。
@ -571,13 +585,13 @@ items.armor.lamellararmor.name=札甲
items.armor.lamellararmor.desc=用许多长方形甲片排起而成的盔甲,为能承受它重量的冒险者提供最强的防御。 items.armor.lamellararmor.desc=用许多长方形甲片排起而成的盔甲,为能承受它重量的冒险者提供最强的防御。
items.armor.roguearmor.name=英雄风衣 items.armor.roguearmor.name=英雄风衣
items.armor.roguearmor.desc=裹着这身与黑暗融为一体的风衣,盗贼能够施展独特的身法。 items.armor.roguearmor.desc=裹着这身与黑暗融为一体的风衣,极影铃虹能够施展独特的身法。
items.armor.scalearmor.name=鳞甲 items.armor.scalearmor.name=鳞甲
items.armor.scalearmor.desc=在厚实的皮背心中缝入金属鳞片,形成了灵活而高防御的护甲。 items.armor.scalearmor.desc=在厚实的皮背心中缝入金属鳞片,形成了灵活而高防御的护甲。
items.armor.warriorarmor.name=英雄铠甲 items.armor.warriorarmor.name=英雄铠甲
items.armor.warriorarmor.desc=这套铠甲看起来很有份量,但战士能借助它施展一项绝技。 items.armor.warriorarmor.desc=这套铠甲看起来很有份量,但蕾零安洁能借助它施展一项绝技。
### custom armor ### custom armor
@ -640,7 +654,7 @@ items.artifacts.cloakofshadows.ac_stealth=潜行
items.artifacts.cloakofshadows.cooldown=你的斗篷还需要%d回合来重新激活。 items.artifacts.cloakofshadows.cooldown=你的斗篷还需要%d回合来重新激活。
items.artifacts.cloakofshadows.cursed=你不能使用受诅咒的斗篷 items.artifacts.cloakofshadows.cursed=你不能使用受诅咒的斗篷
items.artifacts.cloakofshadows.no_charge=你的斗篷充能不足无法使用。 items.artifacts.cloakofshadows.no_charge=你的斗篷充能不足无法使用。
items.artifacts.cloakofshadows.desc=这是盗贼多年前从皇家军械库窃取的一件无价的魔法斗篷。穿上时,能够使你在短时间内完全隐身。\n\n被使用得越频繁斗篷就会变得越强使盗贼更频繁地隐身,持续时间也更长。 items.artifacts.cloakofshadows.desc=这是极影铃虹多年前从皇家军械库窃取的一件无价的魔法斗篷。穿上时,能够使你在短时间内完全隐身。\n\n被使用得越频繁斗篷就会变得越强使极影铃虹更频繁地隐身,持续时间也更长。
items.artifacts.cloakofshadows$cloakstealth.no_charge=你的斗篷耗尽了能量。 items.artifacts.cloakofshadows$cloakstealth.no_charge=你的斗篷耗尽了能量。
items.artifacts.cloakofshadows$cloakstealth.levelup=你的斗篷变得更强大了! items.artifacts.cloakofshadows$cloakstealth.levelup=你的斗篷变得更强大了!
items.artifacts.cloakofshadows$cloakstealth.name=斗篷之下 items.artifacts.cloakofshadows$cloakstealth.name=斗篷之下
@ -684,11 +698,11 @@ items.artifacts.driedrose$ghosthero.def_verb=躲避
items.artifacts.driedrose$ghosthero.hello=再次向你问好,%s。 items.artifacts.driedrose$ghosthero.hello=再次向你问好,%s。
items.artifacts.driedrose$ghosthero.introduce=我的灵魂与这朵玫瑰相连,它对我非常珍贵,是我在地面上相别的爱人送给我的礼物。\n\n我无法回去见他了但感谢你给我再一次完成旅程的机会。当我准备好后我会回应你的呼唤与你并肩作战。\n\n只要你拿着玫瑰我就可以听到你的声音你可以在远处指引我前进。\n\n希望你能在我倒下的地方继续走下去…… items.artifacts.driedrose$ghosthero.introduce=我的灵魂与这朵玫瑰相连,它对我非常珍贵,是我在地面上相别的爱人送给我的礼物。\n\n我无法回去见他了但感谢你给我再一次完成旅程的机会。当我准备好后我会回应你的呼唤与你并肩作战。\n\n只要你拿着玫瑰我就可以听到你的声音你可以在远处指引我前进。\n\n希望你能在我倒下的地方继续走下去……
items.artifacts.driedrose$ghosthero.dialogue_sewers_1=下水道以前是安全的,人们甚至会住进来过冬。 items.artifacts.driedrose$ghosthero.dialogue_sewers_1=密林以前是安全的,人们甚至会住进来过冬。
items.artifacts.driedrose$ghosthero.dialogue_sewers_2=不知道这里的守卫怎么了,他们放弃守护这片地方了吗? items.artifacts.driedrose$ghosthero.dialogue_sewers_2=不知道这里的守卫怎么了,他们放弃守护这片地方了吗?
items.artifacts.driedrose$ghosthero.dialogue_sewers_3=我在地牢外还有家人,希望他们一切安好。 items.artifacts.driedrose$ghosthero.dialogue_sewers_3=我在地牢外还有家人,希望他们一切安好。
items.artifacts.driedrose$ghosthero.dialogue_sewers_4=守卫没能解决这些怪物,但也许我们能。 items.artifacts.driedrose$ghosthero.dialogue_sewers_4=守卫没能解决这些怪物,但也许我们能。
items.artifacts.driedrose$ghosthero.dialogue_sewers_5=下水道都这么危险,不知道更深处会有些什么…… items.artifacts.driedrose$ghosthero.dialogue_sewers_5=密林都这么危险,不知道更深处会有些什么……
items.artifacts.driedrose$ghosthero.dialogue_sewers_6=这些老鼠和螃蟹是怎么长这么大的? items.artifacts.driedrose$ghosthero.dialogue_sewers_6=这些老鼠和螃蟹是怎么长这么大的?
items.artifacts.driedrose$ghosthero.dialogue_prison_1=我听过不少关于这里的传闻,没有一个是好消息。 items.artifacts.driedrose$ghosthero.dialogue_prison_1=我听过不少关于这里的传闻,没有一个是好消息。
items.artifacts.driedrose$ghosthero.dialogue_prison_2=虽说这里是座监狱,但怎么看都更像个地牢。 items.artifacts.driedrose$ghosthero.dialogue_prison_2=虽说这里是座监狱,但怎么看都更像个地牢。
@ -699,7 +713,7 @@ items.artifacts.driedrose$ghosthero.dialogue_prison_6=这些人其实没必要
items.artifacts.driedrose$ghosthero.dialogue_caves_1=看起来这里已经很久未被人类和矮人们踏足了。 items.artifacts.driedrose$ghosthero.dialogue_caves_1=看起来这里已经很久未被人类和矮人们踏足了。
items.artifacts.driedrose$ghosthero.dialogue_caves_2=究竟是什么原因让矮人放弃这一整座黄金矿脉的? items.artifacts.driedrose$ghosthero.dialogue_caves_2=究竟是什么原因让矮人放弃这一整座黄金矿脉的?
items.artifacts.driedrose$ghosthero.dialogue_caves_3=这里的黄金在地表上没什么用,真是太可惜了。 items.artifacts.driedrose$ghosthero.dialogue_caves_3=这里的黄金在地表上没什么用,真是太可惜了。
items.artifacts.driedrose$ghosthero.dialogue_caves_4=就像下水道里的一样,这些生物也都被扭曲了。 items.artifacts.driedrose$ghosthero.dialogue_caves_4=就像密林里的一样,这些生物也都被扭曲了。
items.artifacts.driedrose$ghosthero.dialogue_caves_5=这里连蝙蝠都这么狂暴嗜血。 items.artifacts.driedrose$ghosthero.dialogue_caves_5=这里连蝙蝠都这么狂暴嗜血。
items.artifacts.driedrose$ghosthero.dialogue_caves_6=没有看到任何采矿设备,它们都被矮人回收了吗? items.artifacts.driedrose$ghosthero.dialogue_caves_6=没有看到任何采矿设备,它们都被矮人回收了吗?
items.artifacts.driedrose$ghosthero.dialogue_city_1=矮人一族勤奋,稳重且守信,但他们既贪婪又容易记仇。 items.artifacts.driedrose$ghosthero.dialogue_city_1=矮人一族勤奋,稳重且守信,但他们既贪婪又容易记仇。
@ -997,7 +1011,7 @@ items.bombs.woollybomb.desc=这枚改造过的炸弹在爆炸后会召出一群
###food ###food
items.food.berry.name=地牢浆果 items.food.berry.name=地牢浆果
items.food.berry.eat_msg=酸甜可口,真棒! items.food.berry.eat_msg=酸甜可口,真棒!
items.food.berry.desc=这些小浆果是女猎手在地牢的植被里找到的,它可以被快速食用以获得少量饱腹感,还可能有实用的种子包含其中! items.food.berry.desc=这些小浆果是颐莲梅錵在地牢的植被里找到的,它可以被快速食用以获得少量饱腹感,还可能有实用的种子包含其中!
items.food.blandfruit.name=无味果 items.food.blandfruit.name=无味果
items.food.blandfruit.cooked=煮熟的无味果 items.food.blandfruit.cooked=煮熟的无味果
@ -1806,7 +1820,7 @@ items.wands.wandofmagicmissile.staff_name=魔弹之杖
items.wands.wandofmagicmissile.desc=这根十分普通的法杖能发射由纯魔法能量构成的飞弹。尽管法杖本身没有什么花哨的特效,它有更多的充能数,而且在被升级后能暂时强化其他法杖。 items.wands.wandofmagicmissile.desc=这根十分普通的法杖能发射由纯魔法能量构成的飞弹。尽管法杖本身没有什么花哨的特效,它有更多的充能数,而且在被升级后能暂时强化其他法杖。
items.wands.wandofmagicmissile.stats_desc=从法杖中发出的魔法飞弹会对单个目标造成_%1$d~%2$d点伤害_如果被升级则会暂时强化其他法杖。 items.wands.wandofmagicmissile.stats_desc=从法杖中发出的魔法飞弹会对单个目标造成_%1$d~%2$d点伤害_如果被升级则会暂时强化其他法杖。
items.wands.wandofmagicmissile.bmage_desc=当_战斗法师_以魔弹之杖近战攻击目标时所有的法杖与魔杖都会恢复一定的充能。 items.wands.wandofmagicmissile.bmage_desc=当_战斗法师_以魔弹之杖近战攻击目标时所有的法杖与魔杖都会恢复一定的充能。
items.wands.wandofmagicmissile.eleblast_desc=魔弹之杖的元素风暴造成50%伤害,并使法师获得15回合的充能效果。 items.wands.wandofmagicmissile.eleblast_desc=魔弹之杖的元素风暴造成50%伤害,并使战斗法师获得15回合的充能效果。
items.wands.wandofmagicmissile$magiccharge.name=魔力强化 items.wands.wandofmagicmissile$magiccharge.name=魔力强化
items.wands.wandofmagicmissile$magiccharge.desc=你的魔弹法杖向其他法杖回馈了一股能量,提升着下一次施法的有效等级。\n\n其他法杖被强化至+ %d\n\n剩余的魔力强化时长%s 回合 items.wands.wandofmagicmissile$magiccharge.desc=你的魔弹法杖向其他法杖回馈了一股能量,提升着下一次施法的有效等级。\n\n其他法杖被强化至+ %d\n\n剩余的魔力强化时长%s 回合
@ -2025,7 +2039,7 @@ items.weapon.melee.magesstaff.imbue_lost=魔杖之前吸收的魔力都会消散
items.weapon.melee.magesstaff.imbue_talent=最近用于灌注的法杖有_ %1$d%% _的概率回收为0级法杖。\n你还能回收_ %2$d _根法杖。\n如果没能成功回收为法杖你则会得到一个奥术聚酯取而代之。 items.weapon.melee.magesstaff.imbue_talent=最近用于灌注的法杖有_ %1$d%% _的概率回收为0级法杖。\n你还能回收_ %2$d _根法杖。\n如果没能成功回收为法杖你则会得到一个奥术聚酯取而代之。
items.weapon.melee.magesstaff.yes=是的,我确定 items.weapon.melee.magesstaff.yes=是的,我确定
items.weapon.melee.magesstaff.no=不,我改主意了 items.weapon.melee.magesstaff.no=不,我改主意了
items.weapon.melee.magesstaff.desc=这支老魔杖是件独一无二的魔法武器,由法师亲自雕琢而成,能注入其它法杖的魔力以获取新的力量。 items.weapon.melee.magesstaff.desc=这支老魔杖是件独一无二的魔法武器,由茉莉伊洛亲自雕琢而成,能注入其它法杖的魔力以获取新的力量。
items.weapon.melee.magesstaff.no_wand=这支法杖并没有任何魔力, 它必须先被_注入进另一支法杖的魔力_才能用于施放法术。 items.weapon.melee.magesstaff.no_wand=这支法杖并没有任何魔力, 它必须先被_注入进另一支法杖的魔力_才能用于施放法术。
items.weapon.melee.magesstaff.has_wand=魔杖目前被灌注了_%s_的力量。 items.weapon.melee.magesstaff.has_wand=魔杖目前被灌注了_%s_的力量。
items.weapon.melee.magesstaff.cursed_wand=这根魔杖受到了诅咒,导致它的魔法混乱而随机。 items.weapon.melee.magesstaff.cursed_wand=这根魔杖受到了诅咒,导致它的魔法混乱而随机。
@ -2241,7 +2255,7 @@ items.brokenseal.prompt=选择一件护甲。
items.brokenseal.unknown_armor=你需要先鉴定那件护甲。 items.brokenseal.unknown_armor=你需要先鉴定那件护甲。
items.brokenseal.degraded_armor=这件护甲的状况实在太糟糕了。 items.brokenseal.degraded_armor=这件护甲的状况实在太糟糕了。
items.brokenseal.affix=你将纹章佩挂在了护甲上! items.brokenseal.affix=你将纹章佩挂在了护甲上!
items.brokenseal.desc=一枚蜡制纹章,被贴在护甲上作为勇气的象征。纹章上的印记已被岁月磨损殆尽,还从中裂成两瓣。\n\n这是一件来自家乡的纪念物在纹章的支持下战士会变得不屈不挠。佩戴纹章时战士能缓慢获得基于护甲品质的额外生命护盾。\n\n纹章可以被_贴附在护甲上_并能在护甲间转移。它能够携带一次升级。 items.brokenseal.desc=一枚蜡制纹章,被贴在护甲上作为勇气的象征。纹章上的印记已被岁月磨损殆尽,还从中裂成两瓣。\n\n这是一件来自家乡的纪念物在纹章的支持下蕾零安洁会变得不屈不挠。佩戴纹章时蕾零安洁能缓慢获得基于护甲品质的额外生命护盾。\n\n纹章可以被_贴附在护甲上_并能在护甲间转移。它能够携带一次升级。
items.brokenseal.choose_title=选择一个刻印 items.brokenseal.choose_title=选择一个刻印
items.brokenseal.choose_desc=这件护甲与破损纹章都携带着一个刻印。请选择一个想保留的刻印。\n\n注意如果选择保留护甲的刻印纹章将无法转移此刻印。 items.brokenseal.choose_desc=这件护甲与破损纹章都携带着一个刻印。请选择一个想保留的刻印。\n\n注意如果选择保留护甲的刻印纹章将无法转移此刻印。

View File

@ -155,12 +155,11 @@ badges$badge.games_played_1.desc=进行 10 场游戏,你已经知悉了地牢
badges$badge.games_played_2.title=进阶调查者 badges$badge.games_played_2.title=进阶调查者
badges$badge.games_played_2.desc=进行 50 场游戏,你已经熟悉了地牢的潜规则。 badges$badge.games_played_2.desc=进行 50 场游戏,你已经熟悉了地牢的潜规则。
badges$badge.games_played_3.title=资深调查家 badges$badge.games_played_3.title=资深调查家
badges$badge.games_played_3.desc=进行 250 场游戏,你的威望已经在地牢中传颂。 badges$badge.games_played_3.desc=进行 75 场游戏,你的威望已经在地牢中传颂。
badges$badge.games_played_4.title=大师调查员 badges$badge.games_played_4.title=大师调查员
badges$badge.games_played_4.desc=进行 100 场游戏,你的名声已经传到地表三巨头的耳里。小心夜路遇到他们哦。 badges$badge.games_played_4.desc=进行 100 场游戏,你的名声已经传到地表三巨头的耳里。小心夜路遇到他们哦。
badges$badge.godd_make.title=暗室逢灯
badges$badge.godd_make.desc=累计完成老杖匠的全部委托任务,现在,是他回报恩人的时候了。\n\n_奖励0层随机戒指(四大基座上)_
badges$badge.clear_water.title=净化大师 badges$badge.clear_water.title=净化大师
badges$badge.clear_water.desc=完成挑战:污泥浊水 badges$badge.clear_water.desc=完成挑战:污泥浊水
@ -189,33 +188,27 @@ badges$badge.champion_2x.desc=开启3项以上挑战通关,在地牢的轮回中
badges$badge.champion_3x.title=不屈斗士 badges$badge.champion_3x.title=不屈斗士
badges$badge.champion_3x.desc=开启6项以上挑战通关,在地牢的重重考验下你活了下来,你的惊人测试成绩已经为世人歌颂。 badges$badge.champion_3x.desc=开启6项以上挑战通关,在地牢的重重考验下你活了下来,你的惊人测试成绩已经为世人歌颂。
badges$badge.champion_4x.title=超凡脱俗 badges$badge.champion_4x.title=乘风破浪
badges$badge.champion_4x.desc=开启8项以上挑战通关无论结局怎样你的尝试已经让衪们知晓你的能力。或许在未来你会直面衪们。 badges$badge.champion_4x.desc=开启8项以上挑战通关无论结局怎样你的尝试已经让衪们知晓你的能力。或许在未来你会直面衪们。
badges$badge.champion_5x.title=登神之路 badges$badge.champion_5x.title=披荆斩棘
badges$badge.champion_5x.desc=开启10项以上挑战通关你的信念与威望已经人人知晓你已经引起世界各个势力的注意。今后你将踏上新的征程。 badges$badge.champion_5x.desc=开启10项以上挑战通关你的信念与威望已经人人知晓你已经引起世界各个势力的注意。今后你将踏上新的征程。
badges$badge.kill_slmking.title=粘体终结者 badges$badge.kill_slmking.title=粘体终结者
badges$badge.kill_slmking.desc=击杀栖息在水晶异变的史莱姆王子 badges$badge.kill_slmking.desc=击杀栖息在水晶异变的史莱姆王子
badges$badge.big_x.title=突变风波
badges$badge.big_x.desc=基因突变开启通关!你见证了地牢的突变体,同时也看见了玩火必自焚的道理……\n\n_奖励0层随机护甲(四大基座上)_
badges$badge.exsg.title=大症若愚
badges$badge.exsg.desc=药水癔症只是一个假象,你仍然坚持过来了!\n\n_奖励720初始金币_
badges$badge.kill_dm720.title=兵不厌“炸” badges$badge.kill_dm720.title=兵不厌“炸”
badges$badge.kill_dm720.desc=击杀冰雪矿洞中的DM-720和它的驾驶员。\n\n_奖励0层额外2阶武器(四大基座上,与冰雪魔女不叠加)_ badges$badge.kill_dm720.desc=击杀冰雪矿洞中的DM-720和它的驾驶员。\n\n_奖励0层额外2阶武器(四大基座上,与冰雪魔女不叠加)_
badges$badge.death_from_glyph.title=慢性死亡 badges$badge.death_from_glyph.title=慢性死亡
badges$badge.death_from_glyph.desc=死于延缓伤害。 badges$badge.death_from_glyph.desc=死于延缓伤害。
badges$badge.unlock_mage.title=解锁法师 badges$badge.unlock_mage.title=解锁茉莉伊洛
badges$badge.unlock_mage.desc=使用一个升级卷轴以解锁法师 badges$badge.unlock_mage.desc=使用一个升级卷轴以解锁茉莉伊洛
badges$badge.unlock_rogue.title=解锁盗贼 badges$badge.unlock_rogue.title=解锁极影铃虹
badges$badge.unlock_rogue.desc=在一场游戏中进行十次伏击以解锁盗贼 badges$badge.unlock_rogue.desc=在一场游戏中进行十次伏击以解锁极影铃虹
badges$badge.unlock_huntress.title=解锁女猎手 badges$badge.unlock_huntress.title=解锁颐莲梅錵
badges$badge.unlock_huntress.desc=在一场游戏中使用投掷武器命中十次敌人以解锁女猎手 badges$badge.unlock_huntress.desc=在一场游戏中使用投掷武器命中十次敌人以解锁颐莲梅錵
badges$badge.kill_sm.title=拟态对决 badges$badge.kill_sm.title=拟态对决
badges$badge.kill_sm.desc=接受拟态王的战书并击败它获得它的认可。这是一场公平的对决! badges$badge.kill_sm.desc=接受拟态王的战书并击败它获得它的认可。这是一场公平的对决!
@ -229,24 +222,9 @@ badges$badge.storm.desc=在拿到了水晶之心离开地牢后,天突然黑
badges$badge.kill_mg.title=冰雪挽歌 badges$badge.kill_mg.title=冰雪挽歌
badges$badge.kill_mg.desc=请尝试重创冰雪之地的她,让她能够清醒过来\n\n_奖励0层额外2阶武器(四大基座上,与DM720不叠加)_ badges$badge.kill_mg.desc=请尝试重创冰雪之地的她,让她能够清醒过来\n\n_奖励0层额外2阶武器(四大基座上,与DM720不叠加)_
badges$badge.firegirl.title=圣火赞歌
badges$badge.firegirl.desc=重创雪凛峡谷的圣火魔女,让她接纳你。
badges$badge.drawf_head.title=“旧时代”的终结
badges$badge.drawf_head.desc=击败矮人将军,让他从诅咒中解脱。
badges$badge.brcler.title=起始归一
badges$badge.brcler.desc=尽管死灵法师创造了这个恐怖的机器但你已经粉碎了DM-ZERO的阴谋现在是时候回归正常生活了。\n[击败最终兵器-DM-ZERO未实装]
badges$badge.take_item.title=宝藏探索者
badges$badge.take_item.desc=获得宝藏迷宫的三个隐藏宝藏,切记,对决不是拟态王的本意。
badges$badge.kill_apple.title=毒果铲除计划 badges$badge.kill_apple.title=毒果铲除计划
badges$badge.kill_apple.desc=击杀盘踞在森林底部的幕后“主谋"。 badges$badge.kill_apple.desc=击杀盘踞在森林底部的幕后“主谋"。
badges$badge.spicealboss.title=弱肉强食
badges$badge.spicealboss.desc=累计击败全部特殊BOSS你的威望已经让每个首领对你望而生畏和敬佩不已。
badges$badge.nyz_shop.title=奈亚大亨 badges$badge.nyz_shop.title=奈亚大亨
badges$badge.nyz_shop.desc=购买终端的物品让奈亚子自愿入驻0层\n\n_奖励0层奈亚子常驻320初始金币5次奈亚子终端商店购买权限_ badges$badge.nyz_shop.desc=购买终端的物品让奈亚子自愿入驻0层\n\n_奖励0层奈亚子常驻320初始金币5次奈亚子终端商店购买权限_
@ -269,22 +247,53 @@ badges$badge.read_book_one.title=薅书人
badges$badge.read_book_one.desc=一局累计阅读一本书籍。 badges$badge.read_book_one.desc=一局累计阅读一本书籍。
badges$badge.read_book_two.title=图书管理员 badges$badge.read_book_two.title=图书管理员
badges$badge.read_book_two.desc=一局累计阅读三本不同的书籍。 badges$badge.read_book_two.desc=一局累计阅读三本书籍。
badges$badge.read_book_three.title=藏书狂热者 badges$badge.read_book_three.title=藏书狂热者
badges$badge.read_book_three.desc=一局累计阅读五本不同的书籍。 badges$badge.read_book_three.desc=一局累计阅读五本书籍。
badges$badge.read_book_four.title=书籍博学家 badges$badge.read_book_four.title=书籍博学家
badges$badge.read_book_four.desc=一局累计阅读七本不同的书籍。 badges$badge.read_book_four.desc=一局累计阅读七本书籍。
badges$badge.saka_died.title=远古生物档案调查员 badges$badge.bombbow_died.title=碎片飞溅
badges$badge.saka_died.desc=击败栖息在阴暗水潭的神秘古生物 badges$badge.bombbow_died.desc=你的遗体碎片四溅,下次记得别对着自己开炮……
badges$badge.reset_day.title=重见天日?
badges$badge.reset_day.desc=携带神秘生物的遗物离开地牢,完成它未尽的心愿。
###隐藏
paswordbadges$badge.spicealboss.title=弱肉强食
paswordbadges$badge.spicealboss.desc=累计击败全部特殊BOSS你的威望已经让每个首领对你望而生畏和敬佩不已。
paswordbadges$badge.firegirl.title=圣火赞歌
paswordbadges$badge.firegirl.desc=重创雪凛峡谷的圣火魔女,让她接纳你。
paswordbadges$badge.drawf_head.title=“旧时代”的终结
paswordbadges$badge.drawf_head.desc=击败矮人将军,让他从诅咒中解脱。
paswordbadges$badge.brcler.title=起始归一
paswordbadges$badge.brcler.desc=尽管死灵法师创造了这个恐怖的机器但你已经粉碎了DM-ZERO的阴谋现在是时候回归正常生活了。\n[击败最终兵器-DM-ZERO未实装]
paswordbadges$badge.saka_died.title=远古生物档案调查员
paswordbadges$badge.saka_died.desc=击败栖息在阴暗水潭的神秘古生物
paswordbadges$badge.reset_day.title=重见天日?
paswordbadges$badge.reset_day.desc=携带神秘生物的遗物离开地牢,完成它未尽的心愿。
paswordbadges$badge.take_item.title=宝藏探索者
paswordbadges$badge.take_item.desc=获得宝藏迷宫的三个隐藏宝藏,切记,对决不是拟态王的本意。
paswordbadges$badge.allcsx.title=履险蹈危
paswordbadges$badge.allcsx.desc=开启13项以上挑战通关看来你已准备好踏上新的征途……
paswordbadges$badge.big_x.title=突变风波
paswordbadges$badge.big_x.desc=基因突变开启通关!你见证了地牢的突变体,同时也看见了玩火必自焚的道理……\n\n_奖励0层随机护甲(四大基座上)_
paswordbadges$badge.exsg.title=大症若愚
paswordbadges$badge.exsg.desc=药水癔症只是一个假象,你仍然坚持过来了!\n\n_奖励720初始金币_
paswordbadges$badge.godd_make.title=暗室逢灯
paswordbadges$badge.godd_make.desc=累计完成老杖匠的全部委托任务,现在,是他回报恩人的时候了。\n\n_奖励0层随机戒指(四大基座上)_
challenges.no_food=缩餐节食 challenges.no_food=缩餐节食
@ -308,14 +317,13 @@ challenges.aquaphobia_desc=地牢的水也被污染了\n\n圣境层到矮人
challenges.champion_enemies=精英战场 challenges.champion_enemies=精英战场
challenges.champion_enemies_desc=会升级的不止你一个!\n\n・普通敌人刷出时有 1/8 \ challenges.champion_enemies_desc=会升级的不止你一个!\n\n・普通敌人刷出时有 1/8 \
的机率拥有特殊的精英属性。\n・精英敌人刷出时会立即醒来。\n・精英敌人免疫腐化效果。\n\n精英敌人有九种\n_烈焰橙色_ 近战伤害 \ 的机率拥有特殊的精英属性。\n・精英敌人刷出时会立即醒来。\n・精英敌人免疫腐化效果。\n\n精英敌人有8种\n_烈焰橙色_ 近战伤害 \
+25% 且带有点燃效果,免疫火焰,死亡时引燃周围。\n_索敌紫色_ 近战伤害 +25%,近战范围 +4。\n_敌法绿色_ 受到伤害 -25%,拥有魔法免疫。\n_巨型蓝色_ 受到伤害 -75%,近战范围 +1无法进入门与过道。\n_祝福黄色_ 精准与躲避 +200%。\n_成长红色_ 精准、躲避、攻击伤害与有效生命值 +20%。每过 3 回合会再增长 1%。\n_鬼磷天蓝色_ 近战伤害 +15% 且带有磷火效果,免疫火焰与磷火。\n_苦痛暗紫色_受到的伤害延缓释放近战伤害+45%\n_炼狱深红色_造成 45% 额外近战伤害拥有30%的伤害减免。攻击有概率召唤1个火焰怨灵进行攻击。 +25% 且带有点燃效果,免疫火焰,死亡时引燃周围。\n_索敌紫色_ 近战伤害 +25%,近战范围 +4。\n_敌法绿色_ 受到伤害 -25%,拥有魔法免疫。\n_巨型蓝色_ 受到伤害 -75%,近战范围 +1无法进入门与过道。\n_祝福黄色_ 精准与躲避 +200%。\n_成长红色_ 精准、躲避、攻击伤害与有效生命值 +20%。每过 3 回合会再增长 1%。\n_鬼磷天蓝色_ 近战伤害 +15% 且带有磷火效果,免疫火焰与磷火。\n_苦痛暗紫色_受到的伤害延缓释放近战伤害+45%
challenges.stronger_bosses=梦魇领袖-测试版 challenges.stronger_bosses=梦魇领袖-测试版
challenges.stronger_bosses_desc=这项挑战让挑战 Boss 变得更有挑战性了!\n\n_克里弗斯之果_\n_-_ 第二阶段:触手和本体可以远程攻击,并造成更加大的威胁\n_-_ 触手和本体在战斗过程中拥有额外护盾加成。\n_天狗_生命 +25%\n_-_ 第一阶段:陷阱更加致命\n_-_ 第二阶段:技能频率更高\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_desc=这项挑战让挑战 Boss 变得更有挑战性了!\n\n_克里弗斯之果_\n_-_ 第二阶段:触手和本体可以远程攻击,并造成更加大的威胁\n_-_ 触手和本体在战斗过程中拥有额外护盾加成。\n_天狗_生命 +25%\n_-_ 第一阶段:陷阱更加致命\n_-_ 第二阶段:技能频率更高\n_DM-300_生命 +60%\n_-_ 能量塔更坚固。\n_-_ 技能频率更高,威力也更强大\n_-_ 超载时移动速度更高\n_-_ 击败时必掉落荆棘斗篷\n_矮人国王:_生命 +50%\n_-_ 整场战斗内召唤的随从都更强大\n_-_ 第一阶段:技能与召唤频率都更高\n_-_ 第二阶段:每轮额外召唤两个随从\n_-_ 第三阶段:生命值 +100%,召唤频率更高\n_Yog-Dzewa:_\n_-_ 同时召唤两个古神之拳!\n_-_ 激光攻击伤害 +60%\n_-_ 召唤更强大的随从
actors.char.aquaphobia=你受到了来自水的伤害! actors.char.aquaphobia=你受到了来自水的伤害!
challenges.pro=}开发者模式} challenges.pro=}开发者模式}
challenges.pro_desc=供测试和开发使用\n开局_几乎是全物品_同时你将无法通关也无法记录在排行榜上面 challenges.pro_desc=供测试和开发使用\n1.可以随意上下楼\n2.可以电子斗蛐蛐\n3.还有更多,欢迎探索\n\n(注意:开发者模式不计入徽章数,也不计入挑战徽章奖励
challenges.traditional = 现实之声-T1挑战 challenges.traditional = 现实之声-T1挑战
challenges.hard = 梦境之声-T2挑战 challenges.hard = 梦境之声-T2挑战
challenges.warning = 寻觅之声-T3挑战 challenges.warning = 寻觅之声-T3挑战
@ -325,10 +333,10 @@ challenges.rlpt = ]支离破碎]
challenges.rlpt_desc=地下涌动的神秘力量正在渐渐腐蚀这里,这里不过是而言是另一场噩梦。\n\n从第六层开始怪物必定有几个不是本大层的怪物但不会超过两级。一般来说在监狱遇到矮人层的怪物几率很小。通常遇到矿洞层的怪物。 challenges.rlpt_desc=地下涌动的神秘力量正在渐渐腐蚀这里,这里不过是而言是另一场噩梦。\n\n从第六层开始怪物必定有几个不是本大层的怪物但不会超过两级。一般来说在监狱遇到矮人层的怪物几率很小。通常遇到矿洞层的怪物。
challenges.sbsg = ]基因突变] challenges.sbsg = ]基因突变]
challenges.sbsg_desc=地牢中的神秘魔力让一些生物发生了重大的变化\n-所有生物都会因为突变激素变得各不相同,给探索地牢的脚步带来更大的困难。\n-敌人有6种突变类型,且Roll出权重一致\n\n突变失败体:近战伤害减少35%,移速提高到1.3。\n\n突变爆炸体:移速减少50%,攻击力降低30%,但死亡时拥有爆炸伤害。\n\n突变完全体:移速和攻击力各提高25%,且拥有30%伤害减免。\n\n突变危险体:攻击力提升20%,攻击有10%概率造成流血。死亡时有5%概率立刻向本层发出警报。\n\n突变烟雾体:攻击力减少10%,攻击范围+2攻击敌人10%概率造成眩晕……\n\n突变酸液体:敌人获得额外远程技能,攻击范围+6造成自身可造成的伤害20%的额外法术伤害并有概率随机产生一种有害烟雾(酸雾,毒雾,眩雾)\n\n_特别说明如果开启精英强敌词条会和精英词条共存,届时你将遭遇更大的挑战_ challenges.sbsg_desc=地牢中的神秘魔力让一些生物发生了重大的变化\n-所有生物都会因为突变激素变得各不相同,给探索地牢的脚步带来更大的困难。\n-敌人有6种突变类型,且除爆炸体和酸液体概率为5%后,其余Roll出权重一致\n\n突变失败体:近战伤害减少35%,移速提高到1.3。\n\n突变爆炸体:移速减少50%,攻击力降低30%,但死亡时拥有爆炸伤害。\n\n突变完全体:移速和攻击力各提高25%,且拥有30%伤害减免。\n\n突变危险体:攻击力提升20%,攻击有10%概率造成流血。死亡时有5%概率立刻向本层发出警报。\n\n突变烟雾体:攻击力减少10%,攻击范围+2攻击敌人10%概率造成眩晕……\n\n突变酸液体:敌人获得额外远程技能,攻击范围+6造成自身可造成的伤害20%的额外法术伤害并有概率随机产生一种有害烟雾(酸雾,毒雾,眩雾)\n\n_特别说明如果开启精英强敌词条会和精英词条可能共存于一个怪物,届时你将遭遇更大的挑战_
challenges.exsg = ]药水癔症] challenges.exsg = ]药水癔症]
challenges.exsg_desc=药水癔症详细规则:\n力量药水--60%概率力量-1\n灵视药剂--60%概率喝后失明5回合\n隐形药剂--60%概率喝后立刻怒吼\n极速药剂--60%概率喝后立刻残废8回合\n==========================\n小型口粮-吃后立刻获得极速4回合\n冷冻生肉片-吃后获得奥术护盾\n全肉大饼-吃后立刻获得8回合极速,且有大概率+1力量(_随着力量的追加获得力量的概率会渐渐变低_)\n\n高级药水_(合剂/魔药)_不受影响\n不知道何种原因大部分正面药水你都感觉有毒\n你的臆想会导致药水有毒,但食物却会很有用!而且地牢里面还会追加自动售货机,会售卖一些更加高级的东西。 challenges.exsg_desc=药水癔症详细规则:\n力量药水--60%概率力量-1且冰冻10回合\n灵视药剂--60%概率喝后失明5回合\n隐形药剂--60%概率喝后立刻怒吼\n极速药剂--60%概率喝后立刻残废8回合\n==========================\n小型口粮-吃后立刻获得极速4回合\n冷冻生肉片-吃后获得奥术护盾\n全肉大饼-吃后立刻获得8回合极速,且有大概率+1力量(_随着力量的追加获得力量的概率会渐渐变低_)\n\n高级药水_(合剂/魔药)_不受影响\n不知道何种原因大部分正面药水你都感觉有毒\n你的臆想会导致药水有毒,但食物却会很有用!而且地牢里面还会追加自动售货机,会售卖一些更加高级的东西。
challenges.icedied = 雪虐风饕(未完成) challenges.icedied = 雪虐风饕(未完成)
challenges.icedied_desc=很显然,地牢的雪越下越大了,在这严寒里面,生存的法则将进一步让我们活得更久。\n篝火房间一旦被激活不再无限变成40回合的寒冷抑制商人会贩卖更多特殊物品。 challenges.icedied_desc=很显然,地牢的雪越下越大了,在这严寒里面,生存的法则将进一步让我们活得更久。\n篝火房间一旦被激活不再无限变成40回合的寒冷抑制商人会贩卖更多特殊物品。

View File

@ -12,6 +12,8 @@ scenes.gamescene.examine=调查这里
scenes.gamescene.interact=与之对话 scenes.gamescene.interact=与之对话
scenes.gamescene.pick_up=拾取此物 scenes.gamescene.pick_up=拾取此物
#挑战模式 #挑战模式
scenes.heroselectscene$4$1.title0=挑战模式 scenes.heroselectscene$4$1.title0=挑战模式
windows.wndchallenges.title0=挑战-Page1 windows.wndchallenges.title0=挑战-Page1
@ -126,7 +128,8 @@ scenes.amuletscene.exit=回到主城,未完待续
scenes.amuletscene.stay=留在这里,稍后离开 scenes.amuletscene.stay=留在这里,稍后离开
scenes.amuletscene.text=当你打败了古神了之后,这个发着微弱的光芒的水晶之心就是你最后的东西。\n\n前面已经没有了道路留给你的只有无尽深渊。\n\n耳旁却似乎仍然有人在窃窃私语。\n\n无论如何尘埃落定你确实已经探索完了地牢。但确实是无功而返\n\n不水晶之心证明你曾经来过而且这个肯定能让他们眼前一亮。 scenes.amuletscene.text=当你打败了古神了之后,这个发着微弱的光芒的水晶之心就是你最后的东西。\n\n前面已经没有了道路留给你的只有无尽深渊。\n\n耳旁却似乎仍然有人在窃窃私语。\n\n无论如何尘埃落定你确实已经探索完了地牢。但确实是无功而返\n\n不水晶之心证明你曾经来过而且这个肯定能让他们眼前一亮。
scenes.badgesscene.title=你的徽章 scenes.badgesscene.title=你的常规徽章
scenes.passwordbadgesscene.title=你的加密徽章
scenes.changesscene.title=近期更新变动 scenes.changesscene.title=近期更新变动
scenes.changesscene.new=新内容 scenes.changesscene.new=新内容

View File

@ -93,7 +93,7 @@ ui.changelist.mlpd.vm0_5_x_changes.kage1=影子盗贼
ui.changelist.mlpd.vm0_5_x_changes.kagelogs=如果在$施法失败$时有可能释放€爆炎诅咒€。 ui.changelist.mlpd.vm0_5_x_changes.kagelogs=如果在$施法失败$时有可能释放€爆炎诅咒€。
ui.changelist.mlpd.vm0_5_x_changes.cold=冰雪极地层 ui.changelist.mlpd.vm0_5_x_changes.cold=冰雪极地层
ui.changelist.mlpd.vm0_5_x_changes.coldlogs=下水道层现在改成冰雪层未来将会加入更多_地形怪物_\n冰雪层_特殊房间_和_普通房间_会生成更多。 ui.changelist.mlpd.vm0_5_x_changes.coldlogs=密林层现在改成冰雪层未来将会加入更多_地形怪物_\n冰雪层_特殊房间_和_普通房间_会生成更多。
ui.changelist.mlpd.vm0_5_x_changes.bug_0507=1.修复了矿洞层巨魔二次生成问题\n2.修复地牢_生成混乱_问题\n3.彻底移除_快捷攻击栏_ ui.changelist.mlpd.vm0_5_x_changes.bug_0507=1.修复了矿洞层巨魔二次生成问题\n2.修复地牢_生成混乱_问题\n3.彻底移除_快捷攻击栏_
@ -348,7 +348,7 @@ ui.changelist.mlpd.vm0_5_x_changes.mohblr=血月火把猎人改动
ui.changelist.mlpd.vm0_5_x_changes.mohblrlogs=血量降低 ui.changelist.mlpd.vm0_5_x_changes.mohblrlogs=血量降低
ui.changelist.mlpd.vm0_5_x_changes.sjd=圣境密林 ui.changelist.mlpd.vm0_5_x_changes.sjd=圣境密林
ui.changelist.mlpd.vm0_5_x_changes.sjdlogs=下水道层正式改为圣境密林感谢_Daniel_Clan_的原创素材。 ui.changelist.mlpd.vm0_5_x_changes.sjdlogs=密林层正式改为圣境密林感谢_Daniel_Clan_的原创素材。
ui.changelist.mlpd.vm0_5_x_changes.musipa=原创音乐圣境层实装&&借用音乐说明 ui.changelist.mlpd.vm0_5_x_changes.musipa=原创音乐圣境层实装&&借用音乐说明
ui.changelist.mlpd.vm0_5_x_changes.musipalogs=作者_Prohonor_原创发力\n\n借用泰拉瑞亚双子魔眼BGM,光之女皇BGM\n\n借用橙光战斗BGM第二组\n\n本游戏完全用爱发电不用于任何商业用途 ui.changelist.mlpd.vm0_5_x_changes.musipalogs=作者_Prohonor_原创发力\n\n借用泰拉瑞亚双子魔眼BGM,光之女皇BGM\n\n借用橙光战斗BGM第二组\n\n本游戏完全用爱发电不用于任何商业用途
@ -550,6 +550,12 @@ ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x80=1.修复灯火值不扣减的错
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x81=1.优化灯火体验\n其他错误修复。 ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x81=1.优化灯火体验\n其他错误修复。
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x82=1.修复商店抢劫的一些错误\n2.修复部分崩溃错误\n3.修复Beta2古神无限循环的错误\n4.修复黄金时代的一些错误\n5.修复部分徽章获取错误问题\n6.修复部分成就无法获得的问题\n7.改善部分房间不会在1层生成为隐藏层\n7.修复商人的一些错误\n8.修复部分怪物掉落问题\n8.修复部分错误 ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x82=1.修复商店抢劫的一些错误\n2.修复部分崩溃错误\n3.修复Beta2古神无限循环的错误\n4.修复黄金时代的一些错误\n5.修复部分徽章获取错误问题\n6.修复部分成就无法获得的问题\n7.改善部分房间不会在1层生成为隐藏层\n7.修复商人的一些错误\n8.修复部分怪物掉落问题\n9.修复部分错误\n10.修复系统字体导致游戏的闪退的重大错误\n11.PC布局优化,整体UI优化
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x83=1.修复上个版本的FireBase崩溃记录的问题\nK2.修复部分珍宝加成异常的问题\nS2.修复拟态王宝物重复获取的问题\n3.修复幽妹还能获得+5的问题\n4.部分房间优化,少量数据平衡\n5.改进游戏内部分文案
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x84=1.修复酸液体和爆炸体权重错误的问题\n2.成功的移除了炼狱精英
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x85=1.修复酸液体和爆炸体权重错误的问题\n2.修复一些少量错误
//ui.changelist.mlpd.vm0_5_x_changes.xxx// //ui.changelist.mlpd.vm0_5_x_changes.xxx//

View File

@ -11,7 +11,7 @@ scenes.gamenewsscene.title=正在检查更新
scenes.gamenewsscene.update=请稍后,我们正在向服务器请求你的版本数据。若长时间未检查到版本,你可在倒计时结束后通过下方按钮继续游玩该版本 scenes.gamenewsscene.update=请稍后,我们正在向服务器请求你的版本数据。若长时间未检查到版本,你可在倒计时结束后通过下方按钮继续游玩该版本
scenes.gamenewsscene.continue=继续游玩 scenes.gamenewsscene.continue=继续游玩
windows.wndsettings$datatab.autoupdate=关闭更新界面
windows.newwndchallenges$1$1.title=挑战模式-Page1 windows.newwndchallenges$1$1.title=挑战模式-Page1
windows.newwndchallenges$2$1.title=挑战模式-Page2 windows.newwndchallenges$2$1.title=挑战模式-Page2
@ -83,7 +83,7 @@ windows.wndshopking.yes=是的
windows.wndshopking.no=还没有 windows.wndshopking.no=还没有
windows.wndshopking.notbad=当你准备好后,我会带你前往雪凛峡谷的最深的区域…… windows.wndshopking.notbad=当你准备好后,我会带你前往雪凛峡谷的最深的区域……
windows.wndsettings$extendtab.quickslots=快捷栏设置 windows.wndsettings$extendtab.quickslots=快捷栏设置(V1)
windows.wndsettings$extendtab.wxts=温馨提示:进入游戏后才能调整快捷栏\n\n这是因为技术问题但是这里已经提醒你了。\n\n当你进入游戏后,这里就会变成快捷栏设置区! windows.wndsettings$extendtab.wxts=温馨提示:进入游戏后才能调整快捷栏\n\n这是因为技术问题但是这里已经提醒你了。\n\n当你进入游戏后,这里就会变成快捷栏设置区!
windows.wnddlc.mode=娱乐模式 windows.wnddlc.mode=娱乐模式
@ -374,16 +374,20 @@ windows.wndsettings$displaytab.visual_grid=可视网格
windows.wndsettings$displaytab.off=关闭 windows.wndsettings$displaytab.off=关闭
windows.wndsettings$displaytab.high=高亮 windows.wndsettings$displaytab.high=高亮
windows.wndsettings$uitab.title=界面设置 windows.wndsettings$uitab.title=界面设置
windows.wndsettings$uitab.size=界面尺寸 windows.wndsettings$uitab.ui_mode=界面模式
windows.wndsettings$uitab.scale=界面尺寸
windows.wndsettings$uitab.mobile=移动端风格 windows.wndsettings$uitab.mobile=移动端风格
windows.wndkeybindings.quickslot_switch=切换
windows.wndsettings$uitab.full=PC端风格 windows.wndsettings$uitab.full=PC端风格
windows.wndsettings$uitab.toolbar_settings=工具栏设置
windows.wndsettings$uitab.mode=工具栏模式: windows.wndsettings$uitab.mode=工具栏模式:
windows.wndsettings$uitab.split=分散 windows.wndsettings$uitab.split=分散
windows.wndsettings$uitab.group=组合 windows.wndsettings$uitab.group=组合
windows.wndsettings$uitab.center=居中 windows.wndsettings$uitab.center=居中
windows.wndsettings$uitab.flip_toolbar=翻转工具栏 windows.wndsettings$uitab.flip_toolbar=翻转工具栏
windows.wndsettings$uitab.flip_indicators=翻转指示器 windows.wndsettings$uitab.flip_indicators=翻转指示器
windows.wndsettings$uitab.quickslots=快捷栏 windows.wndsettings$uitab.quickslot_swapper=使用V1快捷栏
windows.wndsettings$uitab.swapper_desc=仅手机端布局可在V1,V2快捷栏进行切换\n而PC端布局只能使用V2快捷栏。{\n_注意仅V2快捷栏支持三类布局,使用V1会无效。_
windows.wndsettings$uitab.system_font=系统字体 windows.wndsettings$uitab.system_font=系统字体
windows.wndsettings$uitab.key_bindings=键位设置 windows.wndsettings$uitab.key_bindings=键位设置
windows.wndsettings$datatab.title=网络相关设置 windows.wndsettings$datatab.title=网络相关设置
@ -502,6 +506,9 @@ conducts.bossrush_desc=被你击败过多次的首领们熟识了英雄的技能
conducts.moneyletgo=黄金时代 conducts.moneyletgo=黄金时代
conducts.moneyletgo_desc=地牢终于赶上了淘金热的时代在这个金钱的时代地牢中几乎所有东西都被明码标价。商人们因此赚的盆满钵满所以他们打算商店打5折。\n然而金钱的背后是利益的驱使她已知晓地牢的现状现在怪物都会可能额外掉落金币随着地牢的深入该项能力越来越弱。\n\n-_深度调查模式仅可选择一种模式游玩。且无法计入多挑徽章中。_ conducts.moneyletgo_desc=地牢终于赶上了淘金热的时代在这个金钱的时代地牢中几乎所有东西都被明码标价。商人们因此赚的盆满钵满所以他们打算商店打5折。\n然而金钱的背后是利益的驱使她已知晓地牢的现状现在怪物都会可能额外掉落金币随着地牢的深入该项能力越来越弱。\n\n-_深度调查模式仅可选择一种模式游玩。且无法计入多挑徽章中。_
conducts.seadlc=沧溟与湛蓝遗迹(DLC)
conducts.seadlc_desc= 自冒险家们调查地牢以来,我们经历了诸多事件。\n但世界之广袤地牢只是其中一个很小的区域。除开地牢自身的重重谜团世界上仍然有很多未解之事等待我们去揭晓。我们接到了来自霜落帝国的委托我们将前往远处的大海深处调查有关于湛蓝遗迹的事情。\n相传这里是某位魔女的沉睡之地。废弃的遗址已没入深海原有的活物已被深海居民吞噬殆尽。这里暗涛汹涌危机四伏。
windows.wnddlcx.title=难度选择-Beta windows.wnddlcx.title=难度选择-Beta
difficulty.null=默认难度(一般) difficulty.null=默认难度(一般)
difficulty.easy=简单 difficulty.easy=简单

View File

@ -226,7 +226,7 @@ windows.wndsettings$langstab.credits=クレジット
windows.wndsettings$langstab.reviewers=レビュワー windows.wndsettings$langstab.reviewers=レビュワー
windows.wndsettings$langstab.translators=翻訳者 windows.wndsettings$langstab.translators=翻訳者
windows.wndstory.sewers=ダンジョンの上階は、意外なことに市の下水道を構成している。\n\n暗黒のエネルギーが地底から忍び寄ってくるにつれ、無害だった下水の生物はどんどん危険になってゆく。都市は警備員を地下に送り込んで安全を維持しようとしたが、彼らは段々といなくなっていった。\n\nこの地域は危険だが、少なくともここに作用している邪悪な魔法は弱まっている。 windows.wndstory.sewers=ダンジョンの上階は、意外なことに市の密林を構成している。\n\n暗黒のエネルギーが地底から忍び寄ってくるにつれ、無害だった下水の生物はどんどん危険になってゆく。都市は警備員を地下に送り込んで安全を維持しようとしたが、彼らは段々といなくなっていった。\n\nこの地域は危険だが、少なくともここに作用している邪悪な魔法は弱まっている。
windows.wndstory.prison=何年も前に、危険な犯罪者を閉じ込めるために牢獄がここに建設された。厳重に管理され安全と言われており、有罪判決を受けた者たちがここに収容されて長い時間を過ごしていた。\n\nしかし、暗黒の瘴気が深部から忍び寄るにつれ、看守と囚人の心を捻じ曲げていった。\n\n混乱に乗じ、都市は全ての牢獄を封印した。壁の中に居るはずの、死人や放置された人の現在を知る者は存在しない… windows.wndstory.prison=何年も前に、危険な犯罪者を閉じ込めるために牢獄がここに建設された。厳重に管理され安全と言われており、有罪判決を受けた者たちがここに収容されて長い時間を過ごしていた。\n\nしかし、暗黒の瘴気が深部から忍び寄るにつれ、看守と囚人の心を捻じ曲げていった。\n\n混乱に乗じ、都市は全ての牢獄を封印した。壁の中に居るはずの、死人や放置された人の現在を知る者は存在しない…
windows.wndstory.caves=廃墟となった牢獄の地下に広がる人口の少ない洞窟だ。鉱物が豊富で、かつては地下のドワーフ社会の賑やかな貿易と産業の中心地だったが、ドワーフが黒魔術に夢中になったために放棄された。\n\n現在、洞窟内には地下の野生動物やール、放棄された機械などが生息しており、上の地域に影響を与えたのと同じ力に堕落されているようだ。 windows.wndstory.caves=廃墟となった牢獄の地下に広がる人口の少ない洞窟だ。鉱物が豊富で、かつては地下のドワーフ社会の賑やかな貿易と産業の中心地だったが、ドワーフが黒魔術に夢中になったために放棄された。\n\n現在、洞窟内には地下の野生動物やール、放棄された機械などが生息しており、上の地域に影響を与えたのと同じ力に堕落されているようだ。
windows.wndstory.city=ドワーフの都は、かつてドワーフの中でも最も偉大な都市国家だった。最盛期には、ドワーフは金属と魔法の不思議な機械を作り、それによって都市は急速に発展しました。\n\nしかし、ある日突然、城門が封鎖され、ドワーフの消息は途絶えてしまった。閉鎖された都市から逃げ出した少数の人々は、王位を奪った狂気の黒魔術師と、彼が学んだ恐ろしい魔法の話をした。 windows.wndstory.city=ドワーフの都は、かつてドワーフの中でも最も偉大な都市国家だった。最盛期には、ドワーフは金属と魔法の不思議な機械を作り、それによって都市は急速に発展しました。\n\nしかし、ある日突然、城門が封鎖され、ドワーフの消息は途絶えてしまった。閉鎖された都市から逃げ出した少数の人々は、王位を奪った狂気の黒魔術師と、彼が学んだ恐ろしい魔法の話をした。

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -55,12 +55,17 @@ public class Assets {
public static class Environment { public static class Environment {
public static final String TERRAIN_FEATURES = "environment/terrain_features.png"; public static final String TERRAIN_FEATURES = "environment/terrain_features.png";
public static final String LAVACAVE_OP = "environment/custom_tiles/lavecave_behind.png";
public static final String LAVACAVE_PO = "environment/custom_tiles/lavecave_above.png";
public static final String VISUAL_GRID = "environment/visual_grid.png"; public static final String VISUAL_GRID = "environment/visual_grid.png";
public static final String WALL_BLOCKING= "environment/wall_blocking.png"; public static final String WALL_BLOCKING= "environment/wall_blocking.png";
public static final String TILES_SEWERS = "environment/tiles_sewers.png"; public static final String TILES_SEWERS = "environment/tiles_sewers.png";
public static final String TILES_PRISON = "environment/tiles_prison.png"; public static final String TILES_PRISON = "environment/tiles_prison.png";
public static final String TILES_COLDCHEST = "environment/tiles_coldchest.png"; public static final String TILES_COLDCHEST = "environment/tiles_coldchest.png";
public static final String TILES_FIRE = "environment/tiles_fire.png";
public static final String TILES_CAVES = "environment/tiles_caves.png"; public static final String TILES_CAVES = "environment/tiles_caves.png";
public static final String TILES_CITY = "environment/tiles_city.png"; public static final String TILES_CITY = "environment/tiles_city.png";
public static final String TILES_ANCIENT = "environment/tiles_ancient.png"; public static final String TILES_ANCIENT = "environment/tiles_ancient.png";
@ -123,6 +128,7 @@ public class Assets {
public static final String BANNERSSD = "interfaces/banners_sd.png"; public static final String BANNERSSD = "interfaces/banners_sd.png";
public static final String BADGES = "interfaces/badges.png"; public static final String BADGES = "interfaces/badges.png";
public static final String PROBADGES = "interfaces/passwordbadges.png";
public static final String LOCKED = "interfaces/locked_badge.png"; public static final String LOCKED = "interfaces/locked_badge.png";
public static final String CHROME = "interfaces/chrome.png"; public static final String CHROME = "interfaces/chrome.png";
@ -131,8 +137,6 @@ public class Assets {
public static final String STATUS = "interfaces/status_pane.png"; public static final String STATUS = "interfaces/status_pane.png";
public static final String TOOLBARDRAK = "interfaces/toolbar_normal.png"; public static final String TOOLBARDRAK = "interfaces/toolbar_normal.png";
public static final String STATUS_DARK = "interfaces/status_pane_normal.png"; public static final String STATUS_DARK = "interfaces/status_pane_normal.png";
public static final String STATUSSOUL = "interfaces/status_pane-puresoul.png";
public static final String STATUSSOUL_DARK = "interfaces/status_pane-puresoul_dark.png";
public static final String MENU = "interfaces/menu_pane.png"; public static final String MENU = "interfaces/menu_pane.png";
public static final String MENU_BTN = "interfaces/menu_button.png"; public static final String MENU_BTN = "interfaces/menu_button.png";
public static final String TOOLBAR = "interfaces/toolbar.png"; public static final String TOOLBAR = "interfaces/toolbar.png";
@ -317,8 +321,11 @@ public class Assets {
public static final String DICT = "sprites/boss/DictFish.png"; public static final String DICT = "sprites/boss/DictFish.png";
public static final String ROOMSTONE = "sprites/boss/RoomStone.png"; public static final String ROOMSTONE = "sprites/boss/RoomStone.png";
public static final String VSGR = "sprites/boss/SeaVastGirl.png"; public static final String VSGR = "sprites/boss/SeaVastGirl.png";
public static final String FSGR = "sprites/boss/FireWitch.png";
public static final String SXGR = "sprites/boss/IceSlowGirl.png"; public static final String SXGR = "sprites/boss/IceSlowGirl.png";
public static final String SKFS = "sprites/boss/SakaFishBoss.png"; public static final String SKFS = "sprites/boss/SakaFishBoss.png";
@ -420,6 +427,9 @@ public class Assets {
public static final String ROT_LASH = "sprites/rot_lasher.png"; public static final String ROT_LASH = "sprites/rot_lasher.png";
public static final String ROT_HEART= "sprites/rot_heart.png"; public static final String ROT_HEART= "sprites/rot_heart.png";
public static final String GUARD = "sprites/guard.png"; public static final String GUARD = "sprites/guard.png";
public static final String HEROGNOLL = "sprites/tribesman.png";
public static final String WARDS = "sprites/wards.png"; public static final String WARDS = "sprites/wards.png";
public static final String GUARDIAN = "sprites/guardian.png"; public static final String GUARDIAN = "sprites/guardian.png";
public static final String SLIME = "sprites/slime.png"; public static final String SLIME = "sprites/slime.png";

View File

@ -88,6 +88,8 @@ public class Badges {
BRUTE_BOT_DIED ( 25 ), BRUTE_BOT_DIED ( 25 ),
BOMBBOW_DIED ( 26 ),
//silver //silver
NO_MONSTERS_SLAIN ( 32 ), NO_MONSTERS_SLAIN ( 32 ),
GRIM_WEAPON ( 33 ), GRIM_WEAPON ( 33 ),
@ -144,7 +146,7 @@ public class Badges {
VICTORY ( 78 ), VICTORY ( 78 ),
YASD ( 79, true ), YASD ( 79, true ),
GODD_MAKE ( 82 ),
CLEAR_WATER ( 83 ), CLEAR_WATER ( 83 ),
GHOSTDAGE ( 84 ), GHOSTDAGE ( 84 ),
// ENDIED ( 85 ), // ENDIED ( 85 ),
@ -190,27 +192,15 @@ public class Badges {
NYZ_SHOP ( 117 ), NYZ_SHOP ( 117 ),
DAGETO ( 118 ), DAGETO ( 118 ),
KILL_SM ( 119 ), KILL_SM ( 119 ),
TAKE_ITEM ( 120 ),
//rudy //rudy
FIREGIRL ( 128 ),
//SLIMEPR ( 129 ),
DRAWF_HEAD ( 130 ),
SPICEALBOSS ( 131),
STORM ( 132), STORM ( 132),
KILL_MG (133), KILL_MG (133),
BIG_X (134),
EXSG (135),
BRCLER (136),
HIGH_SCORE_5 ( 137 ), HIGH_SCORE_5 ( 137 );
SAKA_DIED ( 138 ),
RESET_DAY ( 139 );
public boolean meta; public boolean meta;
@ -265,7 +255,7 @@ public class Badges {
displayBadge( badge ); displayBadge( badge );
} }
private static HashSet<Badge> global; public static HashSet<Badge> global;
private static HashSet<Badge> local = new HashSet<>(); private static HashSet<Badge> local = new HashSet<>();
private static boolean saveNeeded = false; private static boolean saveNeeded = false;
@ -750,24 +740,23 @@ public class Badges {
displayBadge( badge ); displayBadge( badge );
} }
public static void BOMB() {
Badge badge = Badge.BOMBBOW_DIED;
local.add( badge );
displayBadge( badge );
}
private static void validateGOODMAKE() { private static void validateGOODMAKE() {
if (global.contains( Badge.KILL_ROTHEART ) && if (global.contains( Badge.KILL_ROTHEART ) &&
global.contains( Badge.GET_SC ) && global.contains( Badge.GET_SC ) &&
global.contains( Badge.KILL_COLDELE)) { global.contains( Badge.KILL_COLDELE)) {
Badge badge = Badge.GODD_MAKE; PaswordBadges.Badge badge = PaswordBadges.Badge.GODD_MAKE;
displayBadge( badge ); PaswordBadges.displayBadge( badge );
} }
} }
private static void validateAMZ() {
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) && global.contains( Badge.SAKA_DIED)) {
Badge badge = Badge.SPICEALBOSS;
displayBadge( badge );
}
}
private static void validateYASD() { private static void validateYASD() {
if (global.contains( Badge.DEATH_FROM_FIRE ) && if (global.contains( Badge.DEATH_FROM_FIRE ) &&
@ -775,7 +764,7 @@ public class Badges {
global.contains( Badge.DEATH_FROM_GAS ) && global.contains( Badge.DEATH_FROM_GAS ) &&
global.contains( Badge.DEATH_FROM_HUNGER) && global.contains( Badge.DEATH_FROM_HUNGER) &&
global.contains( Badge.DEATH_FROM_GLYPH) && global.contains( Badge.DEATH_FROM_GLYPH) &&
global.contains( Badge.DEATH_FROM_FALLING) && global.contains( Badge.HALOFIRE_DIED) && global.contains( Badge.BRUTE_BOT_DIED)) { global.contains( Badge.DEATH_FROM_FALLING) && global.contains( Badge.HALOFIRE_DIED) && global.contains( Badge.BRUTE_BOT_DIED) && global.contains( Badge.BOMBBOW_DIED)) {
Badge badge = Badge.YASD; Badge badge = Badge.YASD;
displayBadge( badge ); displayBadge( badge );
@ -1009,10 +998,10 @@ public class Badges {
if (Rankings.INSTANCE.totalNumber >= 50) { if (Rankings.INSTANCE.totalNumber >= 50) {
badge = Badge.GAMES_PLAYED_2; badge = Badge.GAMES_PLAYED_2;
} }
if (Rankings.INSTANCE.totalNumber >= 250) { if (Rankings.INSTANCE.totalNumber >= 75) {
badge = Badge.GAMES_PLAYED_3; badge = Badge.GAMES_PLAYED_3;
} }
if (Rankings.INSTANCE.totalNumber >= 1000) { if (Rankings.INSTANCE.totalNumber >= 100) {
badge = Badge.GAMES_PLAYED_4; badge = Badge.GAMES_PLAYED_4;
} }
@ -1032,17 +1021,11 @@ public class Badges {
public static void KILLSAPPLE() { public static void KILLSAPPLE() {
displayBadge( Badge.KILL_APPLE); displayBadge( Badge.KILL_APPLE);
validateAMZ();
} }
public static void KILLSAKA() {
displayBadge( Badge.SAKA_DIED);
validateAMZ();
}
public static void REHOMESKY() {
displayBadge( Badge.RESET_DAY );
}
public static void STORM() { public static void STORM() {
displayBadge( Badge.STORM); displayBadge( Badge.STORM);
@ -1050,7 +1033,6 @@ public class Badges {
public static void KILLSDM720() { public static void KILLSDM720() {
displayBadge( Badge.KILL_DM720 ); displayBadge( Badge.KILL_DM720 );
validateAMZ();
} }
public static void BOSSTHREE() { public static void BOSSTHREE() {
@ -1061,40 +1043,13 @@ public class Badges {
displayBadge( Badge.CLEAR_WATER ); displayBadge( Badge.CLEAR_WATER );
} }
public static void KILLDWARF() {
displayBadge( Badge.DRAWF_HEAD );
validateAMZ();
}
public static void KILLFIREGIRL() {
displayBadge( Badge.FIREGIRL );
validateAMZ();
}
public static void KILLMG() { public static void KILLMG() {
displayBadge( Badge.KILL_MG ); displayBadge( Badge.KILL_MG );
validateAMZ();
} }
public static void KILL_SMK() { public static void KILL_SMK() {
displayBadge( Badge.KILL_SM ); displayBadge( Badge.KILL_SM );
validateAMZ();
}
public static void KILL_OMP() {
displayBadge( Badge.TAKE_ITEM );
}
public static void BIGX() {
displayBadge( Badge.BIG_X );
}
public static void EXSG() {
displayBadge( Badge.EXSG );
}
public static void BOSSRUSH() {
displayBadge( Badge.BRCLER );
} }
public static void GOODRLPT() { public static void GOODRLPT() {

View File

@ -28,7 +28,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClassArmor; import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClassArmor;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClothArmor; import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClothArmor;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.custom.CustomArmor; import com.shatteredpixel.shatteredpixeldungeon.items.armor.custom.CustomArmor;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.HornOfPlenty;
import com.shatteredpixel.shatteredpixeldungeon.items.food.SmallRation; import com.shatteredpixel.shatteredpixeldungeon.items.food.SmallRation;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.InterlevelScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.InterlevelScene;
@ -86,8 +85,6 @@ public class Challenges {
if (Dungeon.isChallenged(NO_FOOD)) { if (Dungeon.isChallenged(NO_FOOD)) {
if (item instanceof SmallRation) { if (item instanceof SmallRation) {
return true; return true;
} else if (item instanceof HornOfPlenty) {
return true;
} }
} }

View File

@ -10,18 +10,10 @@ import java.util.Arrays;
public class Conducts { public class Conducts {
public enum Conduct { public enum Conduct {
NULL, NULL,
BOSSRUSH(1.2f), BOSSRUSH,
MONEYLETGO(1.5f); MONEYLETGO;
/**深海副本*/
public float scoreMod; //SEADLC
Conduct(){
scoreMod = 1f;
}
Conduct(float scoreMod){
this.scoreMod = scoreMod;
}
@Override @Override
public String toString() { public String toString() {

View File

@ -660,6 +660,7 @@ public class Dungeon {
private static final String CHAPTERS = "chapters"; private static final String CHAPTERS = "chapters";
private static final String QUESTS = "quests"; private static final String QUESTS = "quests";
private static final String BADGES = "badges"; private static final String BADGES = "badges";
private static final String ZBADGES = "z-badges";
private static final String BRANCH = "branch"; private static final String BRANCH = "branch";
private static final String MOBS_TO_STATELING = "mobs_to_stateling"; private static final String MOBS_TO_STATELING = "mobs_to_stateling";
private static final String INIT_VER = "init_ver"; private static final String INIT_VER = "init_ver";
@ -735,6 +736,11 @@ public class Dungeon {
Bundle badges = new Bundle(); Bundle badges = new Bundle();
Badges.saveLocal( badges ); Badges.saveLocal( badges );
bundle.put( BADGES, badges ); bundle.put( BADGES, badges );
Bundle z_badges = new Bundle();
PaswordBadges.saveLocal( z_badges );
bundle.put( ZBADGES, z_badges );
BloodBat.saveLevel(bundle); BloodBat.saveLevel(bundle);
FileUtils.bundleToFile( GamesInProgress.gameFile(save), bundle); FileUtils.bundleToFile( GamesInProgress.gameFile(save), bundle);
@ -836,8 +842,10 @@ public class Dungeon {
Bundle badges = bundle.getBundle(BADGES); Bundle badges = bundle.getBundle(BADGES);
if (!badges.isNull()) { if (!badges.isNull()) {
Badges.loadLocal( badges ); Badges.loadLocal( badges );
PaswordBadges.loadLocal( badges );
} else { } else {
Badges.reset(); Badges.reset();
PaswordBadges.reset();
} }
Notes.restoreFromBundle( bundle ); Notes.restoreFromBundle( bundle );

View File

@ -0,0 +1,276 @@
package com.shatteredpixel.shatteredpixeldungeon;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.PRO;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.utils.Bundle;
import com.watabou.utils.FileUtils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
public class PaswordBadges {
public static void KILLDWARF() {
displayBadge( PaswordBadges.Badge.DRAWF_HEAD );
}
public static void KILLFIREGIRL() {
displayBadge( PaswordBadges.Badge.FIREGIRL );
}
public static void KILLSAKA() {
displayBadge( PaswordBadges.Badge.SAKA_DIED);
}
public static void REHOMESKY() {
displayBadge( PaswordBadges.Badge.RESET_DAY );
}
public static void BOSSRUSH() {
displayBadge( PaswordBadges.Badge.BRCLER );
}
public static void ALLCS(int challenges){
if (challenges == 0) return;
if (challenges >= 13 && !(Dungeon.isChallenged(PRO))||!Statistics.happyMode && challenges >= 13){
displayBadge(PaswordBadges.Badge.ALLCHSX );
}
}
public static void BIGX() {
displayBadge( PaswordBadges.Badge.BIG_X );
}
public static void EXSG() {
displayBadge( PaswordBadges.Badge.EXSG );
}
public enum Badge {
TAKE_ITEM( 0 ),
FIREGIRL(1),
SLIMEPRS(2),
DRAWF_HEAD(3),
SPICEALBOSS (4),
SAKA_DIED(5),
RESET_DAY(6),
BRCLER(7),
ALLCHSX(8),
GODD_MAKE(12),
BIG_X(13),
EXSG(14);
public boolean meta;
public int image;
Badge( int image ) {
this( image, false );
}
Badge( int image, boolean meta ) {
this.image = image;
this.meta = meta;
}
public String title(){
return Messages.get(this, name()+".title");
}
public String desc(){
return Messages.get(this, name()+".desc");
}
Badge() {
this( -1 );
}
}
public static HashSet<Badge> global;
private static HashSet<Badge> local = new HashSet<>();
private static boolean saveNeeded = false;
public static void reset() {
local.clear();
loadGlobal();
}
public static final String ZBADGES_FILE = "z-badges.dat";
private static final String BADGES = "badges";
private static final HashSet<String> removedBadges = new HashSet<>();
static{
//removed in 0.6.5
removedBadges.addAll(Arrays.asList("RARE_ALBINO", "RARE_BANDIT", "RARE_SHIELDED",
"RARE_SENIOR", "RARE_ACIDIC", "RARE", "TUTORIAL_WARRIOR", "TUTORIAL_MAGE"));
}
private static final HashMap<String, String> renamedBadges = new HashMap<>();
static{
//0.6.5
renamedBadges.put("CHAMPION", "CHAMPION_1");
}
public static HashSet<Badge> restore( Bundle bundle ) {
HashSet<Badge> badges = new HashSet<>();
if (bundle == null) return badges;
String[] names = bundle.getStringArray( BADGES );
for (int i=0; i < names.length; i++) {
try {
if (renamedBadges.containsKey(names[i])){
names[i] = renamedBadges.get(names[i]);
}
if (!removedBadges.contains(names[i])){
badges.add( Badge.valueOf( names[i] ) );
}
} catch (Exception e) {
ShatteredPixelDungeon.reportException(e);
}
}
return badges;
}
public static void store( Bundle bundle, HashSet<Badge> badges ) {
int count = 0;
String names[] = new String[badges.size()];
for (Badge badge:badges) {
names[count++] = badge.toString();
}
bundle.put( BADGES, names );
}
public static void loadLocal( Bundle bundle ) {
local = restore( bundle );
}
public static void saveLocal( Bundle bundle ) {
store( bundle, local );
}
public static void loadGlobal() {
if (global == null) {
try {
Bundle bundle = FileUtils.bundleFromFile( ZBADGES_FILE );
global = restore( bundle );
} catch (IOException e) {
global = new HashSet<>();
}
}
}
public static void saveGlobal() {
if (saveNeeded) {
Bundle bundle = new Bundle();
store( bundle, global );
try {
FileUtils.bundleToFile(ZBADGES_FILE, bundle);
saveNeeded = false;
} catch (IOException e) {
ShatteredPixelDungeon.reportException(e);
}
}
}
public static void validateOMP() {
displayBadge( Badge.TAKE_ITEM );
}
public static void displayBadge( Badge badge ) {
if (badge == null) {
return;
}
if (global.contains( badge )) {
if (!badge.meta) {
GLog.h( Messages.get(Badges.class, "endorsed", badge.title()) );
}
} else {
global.add( badge );
saveNeeded = true;
if (badge.meta) {
GLog.h( Messages.get(Badges.class, "new_super", badge.title()) );
} else {
GLog.h( Messages.get(Badges.class, "new", badge.title()) );
}
PixelScene.showProBadge( badge );
}
}
public static boolean isUnlocked( Badge badge ) {
return global.contains( badge );
}
public static HashSet<Badge> allUnlocked(){
loadGlobal();
return new HashSet<>(global);
}
public static void disown( Badge badge ) {
loadGlobal();
global.remove( badge );
saveNeeded = true;
}
public static void addGlobal( Badge badge ){
if (!global.contains(badge)){
global.add( badge );
saveNeeded = true;
}
}
public static List<Badge> filtered( boolean global ) {
HashSet<Badge> filtered = new HashSet<>(global ? PaswordBadges.global : PaswordBadges.local);
Iterator<Badge> iterator = filtered.iterator();
while (iterator.hasNext()) {
Badge badge = iterator.next();
if ((!global && badge.meta) || badge.image == -1) {
iterator.remove();
}
}
ArrayList<Badge> list = new ArrayList<>(filtered);
Collections.sort( list );
return list;
}
private static void leaveBest( HashSet<Badge> list, Badge...badges ) {
for (int i=badges.length-1; i > 0; i--) {
if (list.contains( badges[i])) {
for (int j=0; j < i; j++) {
list.remove( badges[j] );
}
break;
}
}
}
}

View File

@ -21,7 +21,6 @@
package com.shatteredpixel.shatteredpixeldungeon; package com.shatteredpixel.shatteredpixeldungeon;
import com.shatteredpixel.shatteredpixeldungeon.custom.utils.Constants;
import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.watabou.utils.Bundlable; import com.watabou.utils.Bundlable;
import com.watabou.utils.Bundle; import com.watabou.utils.Bundle;
@ -38,8 +37,12 @@ public class QuickSlot {
*/ */
//note that the current max size is coded at 4, due to UI constraints, but it could be much much bigger with no issue. //note that the current max size is coded at 4, due to UI constraints, but it could be much much bigger with no issue.
public static int SIZE = Constants.MAX_QUICKSLOTS; public static int SIZE = 12;
private Item[] slots = new Item[SIZE];
public static int VSIZE = 9;
public int quickslots;
private Item[] slots = new Item[SIZE];
//direct array interaction methods, everything should build from these methods. //direct array interaction methods, everything should build from these methods.

View File

@ -55,6 +55,8 @@ public class SPDAction extends GameAction {
public static final GameAction SE = new SPDAction("se"); public static final GameAction SE = new SPDAction("se");
public static final GameAction WAIT = new SPDAction("wait"); public static final GameAction WAIT = new SPDAction("wait");
public static final GameAction SLPD = new SPDAction("slpd");
public static final GameAction INVENTORY = new SPDAction("inventory"); public static final GameAction INVENTORY = new SPDAction("inventory");
public static final GameAction QUICKSLOT_1 = new SPDAction("quickslot_1"); public static final GameAction QUICKSLOT_1 = new SPDAction("quickslot_1");
public static final GameAction QUICKSLOT_2 = new SPDAction("quickslot_2"); public static final GameAction QUICKSLOT_2 = new SPDAction("quickslot_2");
@ -101,6 +103,8 @@ public class SPDAction extends GameAction {
defaultBindings.put( Input.Keys.D, SPDAction.E ); defaultBindings.put( Input.Keys.D, SPDAction.E );
defaultBindings.put( Input.Keys.SPACE, SPDAction.WAIT ); defaultBindings.put( Input.Keys.SPACE, SPDAction.WAIT );
defaultBindings.put( Input.Keys.K, SPDAction.SLPD );
defaultBindings.put( Input.Keys.UP, SPDAction.N ); defaultBindings.put( Input.Keys.UP, SPDAction.N );
defaultBindings.put( Input.Keys.LEFT, SPDAction.W ); defaultBindings.put( Input.Keys.LEFT, SPDAction.W );
defaultBindings.put( Input.Keys.DOWN, SPDAction.S ); defaultBindings.put( Input.Keys.DOWN, SPDAction.S );

View File

@ -137,6 +137,8 @@ public class SPDSettings extends GameSettings {
private static final String ATBSettings = "ATBsettings"; private static final String ATBSettings = "ATBsettings";
private static final String V1TOOL = "v1tool";
public static void fullscreen( boolean value ) { public static void fullscreen( boolean value ) {
put( KEY_FULLSCREEN, value ); put( KEY_FULLSCREEN, value );
@ -231,7 +233,7 @@ public class SPDSettings extends GameSettings {
} }
public static int interfaceSize(){ public static int interfaceSize(){
int size = getInt( KEY_UI_SIZE, DeviceCompat.isDesktop() ? 2 : 0 ); int size = getInt( KEY_UI_SIZE, DeviceCompat.isDesktop() ? 1 : 0 );
if (size > 0){ if (size > 0){
//force mobile UI if there is not enough space for full UI //force mobile UI if there is not enough space for full UI
float wMin = Game.width / PixelScene.MIN_WIDTH_FULL; float wMin = Game.width / PixelScene.MIN_WIDTH_FULL;
@ -240,6 +242,10 @@ public class SPDSettings extends GameSettings {
size = 0; size = 0;
} }
} }
if(size == 2){
size = 1;
}
return size; return size;
} }
@ -429,6 +435,10 @@ public class SPDSettings extends GameSettings {
} }
} }
public static void systemFont(boolean value){
put(KEY_SYSTEMFONT, value);
}
public static boolean systemFont(){ public static boolean systemFont(){
return getBoolean(KEY_SYSTEMFONT, return getBoolean(KEY_SYSTEMFONT,
(language() == Languages.CHINESE || language() == Languages.JAPANESE)); (language() == Languages.CHINESE || language() == Languages.JAPANESE));
@ -544,4 +554,10 @@ public class SPDSettings extends GameSettings {
public static void ClassPage(boolean value) { public static void ClassPage(boolean value) {
put( KEY_PAGE, value ); put( KEY_PAGE, value );
} }
public static boolean quickSwapper() {
return getBoolean(V1TOOL, false);
}
public static void quickSwapper(boolean value ){ put( V1TOOL, value ); }
} }

View File

@ -114,26 +114,27 @@ public abstract class ChampionEnemy extends Buff {
Class<?extends ChampionEnemy> buffCls; Class<?extends ChampionEnemy> buffCls;
int randomNumber = Random.Int(100);
switch (Random.NormalIntRange(0,6)){ if (randomNumber < 5) {
case 0: default: buffCls = ChampionEnemy.LongSider.class;
buffCls = ChampionEnemy.Small.class; } else if (randomNumber < 10) {
break; buffCls = ChampionEnemy.Bomber.class;
case 1: } else {
buffCls = ChampionEnemy.Bomber.class; switch (randomNumber % 5) {
break; case 0: default:
case 2: buffCls = ChampionEnemy.Small.class;
buffCls = ChampionEnemy.Middle.class; break;
break; case 1:
case 3: buffCls = ChampionEnemy.Middle.class;
buffCls = ChampionEnemy.Big.class; break;
break; case 2:
case 4: buffCls = ChampionEnemy.Big.class;
buffCls = ChampionEnemy.Sider.class; break;
break; case 3:
case 5: buffCls = ChampionEnemy.Sider.class;
buffCls = ChampionEnemy.LongSider.class; break;
break; }
} }
if (Dungeon.mobsToStateLing <= 0 && Dungeon.isChallenged(Challenges.SBSG)) { if (Dungeon.mobsToStateLing <= 0 && Dungeon.isChallenged(Challenges.SBSG)) {
@ -320,14 +321,14 @@ public abstract class ChampionEnemy extends Buff {
} }
public static void rollForChampion(Mob m){ public static void rollForChampion(Mob m){
if (Dungeon.mobsToChampion <= 0) Dungeon.mobsToChampion = 8; if (Dungeon.mobsToChampion <= 0) Dungeon.mobsToChampion = 7;
Dungeon.mobsToChampion--; Dungeon.mobsToChampion--;
//we roll for a champion enemy even if we aren't spawning one to ensure that //we roll for a champion enemy even if we aren't spawning one to ensure that
//mobsToChampion does not affect levelgen RNG (number of calls to Random.Int() is constant) //mobsToChampion does not affect levelgen RNG (number of calls to Random.Int() is constant)
Class<?extends ChampionEnemy> buffCls; Class<?extends ChampionEnemy> buffCls;
switch (Random.Int(9)){ switch (Random.Int(8)){
case 0: default: buffCls = Blazing.class; break; case 0: default: buffCls = Blazing.class; break;
case 1: buffCls = Projecting.class; break; case 1: buffCls = Projecting.class; break;
case 2: buffCls = AntiMagic.class; break; case 2: buffCls = AntiMagic.class; break;
@ -336,7 +337,7 @@ public abstract class ChampionEnemy extends Buff {
case 5: buffCls = Growing.class; break; case 5: buffCls = Growing.class; break;
case 6: buffCls = Halo.class; break; case 6: buffCls = Halo.class; break;
case 7: buffCls = DelayMob.class; break; case 7: buffCls = DelayMob.class; break;
case 8: buffCls = King.class; break; //case 8: buffCls = King.class; break;
} }
if (Dungeon.mobsToChampion <= 0 && Dungeon.isChallenged(Challenges.CHAMPION_ENEMIES)) { if (Dungeon.mobsToChampion <= 0 && Dungeon.isChallenged(Challenges.CHAMPION_ENEMIES)) {

View File

@ -27,7 +27,7 @@ public class BlessMixShiled extends Buff {
if(Dungeon.hero.buff(BlessMixShiled.class) != null && hero.HT == hero.HP){ if(Dungeon.hero.buff(BlessMixShiled.class) != null && hero.HT == hero.HP){
if(Dungeon.depth <= 5) { if(Dungeon.depth <= 5) {
Buff.affect(hero, Barrier.class).setShield(((30))); Buff.affect(hero, Barrier.class).setShield(((20)));
} else { } else {
Buff.affect(hero, Barrier.class).setShield(((20) * Dungeon.depth / 5)); Buff.affect(hero, Barrier.class).setShield(((20) * Dungeon.depth / 5));
} }

View File

@ -39,6 +39,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Conducts; import com.shatteredpixel.shatteredpixeldungeon.Conducts;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.GamesInProgress; import com.shatteredpixel.shatteredpixeldungeon.GamesInProgress;
import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges;
import com.shatteredpixel.shatteredpixeldungeon.SPDSettings; import com.shatteredpixel.shatteredpixeldungeon.SPDSettings;
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.Statistics;
@ -1323,7 +1324,7 @@ public class Hero extends Char {
if (Dungeon.depth == 0) { if (Dungeon.depth == 0) {
if (belongings.getItem(SakaFishSketon.class) != null) { if (belongings.getItem(SakaFishSketon.class) != null) {
Badges.REHOMESKY(); PaswordBadges.REHOMESKY();
} }
if (belongings.getItem(Amulet.class) == null) { if (belongings.getItem(Amulet.class) == null) {

View File

@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Challenges; import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Conducts; import com.shatteredpixel.shatteredpixeldungeon.Conducts;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges;
import com.shatteredpixel.shatteredpixeldungeon.QuickSlot; import com.shatteredpixel.shatteredpixeldungeon.QuickSlot;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionHero; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionHero;
@ -53,25 +54,16 @@ import com.shatteredpixel.shatteredpixeldungeon.items.TengusMask;
import com.shatteredpixel.shatteredpixeldungeon.items.Waterskin; import com.shatteredpixel.shatteredpixeldungeon.items.Waterskin;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClothArmor; import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClothArmor;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.LamellarArmor; import com.shatteredpixel.shatteredpixeldungeon.items.armor.LamellarArmor;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.LeatherArmor;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.MailArmor;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.PlateArmor;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.ScaleArmor;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.custom.AncityArmor; import com.shatteredpixel.shatteredpixeldungeon.items.armor.custom.AncityArmor;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.ChaliceOfBlood;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.CloakOfShadows; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.CloakOfShadows;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TalismanOfForesight; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TalismanOfForesight;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.WraithAmulet; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.WraithAmulet;
import com.shatteredpixel.shatteredpixeldungeon.items.bags.BookBag; import com.shatteredpixel.shatteredpixeldungeon.items.bags.BookBag;
import com.shatteredpixel.shatteredpixeldungeon.items.bags.HerbBag; import com.shatteredpixel.shatteredpixeldungeon.items.bags.HerbBag;
import com.shatteredpixel.shatteredpixeldungeon.items.bags.KingBag; import com.shatteredpixel.shatteredpixeldungeon.items.bags.KingBag;
import com.shatteredpixel.shatteredpixeldungeon.items.bags.VelvetPouch; import com.shatteredpixel.shatteredpixeldungeon.items.bags.VelvetPouch;
import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.BrokenBooks;
import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.DimandBook; import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.DimandBook;
import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.IceCityBooks;
import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.TestBooks; import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.TestBooks;
import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.YellowSunBooks;
import com.shatteredpixel.shatteredpixeldungeon.items.food.Food; import com.shatteredpixel.shatteredpixeldungeon.items.food.Food;
import com.shatteredpixel.shatteredpixeldungeon.items.food.MeatPie; import com.shatteredpixel.shatteredpixeldungeon.items.food.MeatPie;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfExperience; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfExperience;
@ -79,7 +71,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfInvisibility; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfInvisibility;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLightningShiledX; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLightningShiledX;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlame; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlame;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlameX;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfMindVision; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfMindVision;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.WaterSoul; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.WaterSoul;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfLightStromCloud; import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfLightStromCloud;
@ -94,33 +85,32 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfMysticalEnergy; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfMysticalEnergy;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.AquaBlast; import com.shatteredpixel.shatteredpixeldungeon.items.spells.AquaBlast;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.MagicalInfusion; import com.shatteredpixel.shatteredpixeldungeon.items.spells.MagicalInfusion;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfCorruption;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFrost; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFrost;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfLightning; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfLightning;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfMagicMissile; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfMagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfRegrowth; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfRegrowth;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfScale;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.SpiritBow; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.SpiritBow;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.BloodthirstyThorn; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.BloodthirstyThorn;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Dagger; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Dagger;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Gloves; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Gloves;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.IceFishSword; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.IceFishSword;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.LifeTreeSword;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.LockSword; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.LockSword;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagicTorch; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagicTorch;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.RedBloodMoon; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.RedBloodMoon;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Sai;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.SkyShield;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WashCrime; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WashCrime;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WornShortsword; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WornShortsword;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.legend.DiedCrossBow;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ThrowingKnife; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ThrowingKnife;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ThrowingStone; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ThrowingStone;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.HaloDart;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.plants.AikeLaier; import com.shatteredpixel.shatteredpixeldungeon.plants.AikeLaier;
import com.shatteredpixel.shatteredpixeldungeon.plants.Firebloom; import com.shatteredpixel.shatteredpixeldungeon.plants.Firebloom;
import com.shatteredpixel.shatteredpixeldungeon.plants.SkyBlueFireBloom; import com.shatteredpixel.shatteredpixeldungeon.plants.SkyBlueFireBloom;
import java.util.List;
public enum HeroClass { public enum HeroClass {
WARRIOR( HeroSubClass.BERSERKER, HeroSubClass.GLADIATOR ), WARRIOR( HeroSubClass.BERSERKER, HeroSubClass.GLADIATOR ),
@ -151,7 +141,9 @@ public enum HeroClass {
Dungeon.gold += 320; Dungeon.gold += 320;
} }
if ( Badges.isUnlocked(Badges.Badge.EXSG)){ PaswordBadges.loadGlobal();
List<PaswordBadges.Badge> passwordbadges = PaswordBadges.filtered( true );
if(passwordbadges.contains(PaswordBadges.Badge.EXSG)){
Dungeon.gold += 720; Dungeon.gold += 720;
} }
@ -162,15 +154,14 @@ public enum HeroClass {
if (Dungeon.isChallenged(Challenges.PRO)){ if (Dungeon.isChallenged(Challenges.PRO)){
new LevelTeleporter().quantity(1).identify().collect();
new LockSword().quantity(1).identify().collect(); new LockSword().quantity(1).identify().collect();
new IceFishSword().quantity(1).identify().collect(); new IceFishSword().quantity(1).identify().collect();
new PotionOfInvisibility().quantity(45).identify().collect(); new PotionOfInvisibility().quantity(45).identify().collect();
//new CommRelay().quantity(1).identify().collect();
new AncityArmor().quantity(1).identify().collect(); new AncityArmor().quantity(1).identify().collect();
new TengusMask().quantity(1).identify().collect(); new TengusMask().quantity(1).identify().collect();
new RingOfWealth().quantity(1).identify().collect(); new RingOfWealth().quantity(1).identify().collect();
new TimekeepersHourglass().quantity(1).identify().collect(); new DiedCrossBow().quantity(1).identify().collect();
//new WandOfAnmy().quantity(1).identify().collect();
Buff.affect(hero, ChampionHero.AntiMagic.class, 50000f); Buff.affect(hero, ChampionHero.AntiMagic.class, 50000f);
new WraithAmulet().quantity(1).identify().collect(); new WraithAmulet().quantity(1).identify().collect();
new BloodthirstyThorn().quantity(1).identify().collect(); new BloodthirstyThorn().quantity(1).identify().collect();
@ -197,37 +188,20 @@ public enum HeroClass {
new SkyBlueFireBloom.Seed().quantity(51).identify().collect(); new SkyBlueFireBloom.Seed().quantity(51).identify().collect();
new AikeLaier.Seed().quantity(51).identify().collect(); new AikeLaier.Seed().quantity(51).identify().collect();
new Firebloom.Seed().quantity(15).identify().collect(); new Firebloom.Seed().quantity(15).identify().collect();
new WandOfRegrowth().quantity(1).identify().collect(); new WandOfRegrowth().quantity(1).identify().collect();
new WandOfFrost().quantity(1).identify().collect(); new WandOfFrost().quantity(1).identify().collect();
new MagicalInfusion().quantity(1).identify().collect(); new MagicalInfusion().quantity(1).identify().collect();
new ScrollOfMysticalEnergy().quantity(1).identify().collect(); new ScrollOfMysticalEnergy().quantity(1).identify().collect();
new AquaBlast().quantity(1).identify().collect(); new AquaBlast().quantity(1).identify().collect();
new TestBooks().quantity(1).identify().collect(); new TestBooks().quantity(1).identify().collect();
new WandOfCorruption().quantity(1).identify().collect();
new ChaliceOfBlood().quantity(1).identify().collect();
new LifeTreeSword().quantity(1).identify().collect();
new Sai().quantity(1).identify().collect();
new MagicTorch().quantity(1).identify().collect();
new SkyShield().quantity(1).identify().collect();
new WandOfScale().quantity(1).identify().collect();
new KingsCrown().quantity(1).identify().collect(); new KingsCrown().quantity(1).identify().collect();
new PotionOfLightningShiledX().quantity(1).identify().collect(); new PotionOfLightningShiledX().quantity(1).identify().collect();
new LevelTeleporter().quantity(1).identify().collect();
new MobPlacer().quantity(1).identify().collect();
new RedBloodMoon().quantity(1).identify().collect(); new RedBloodMoon().quantity(1).identify().collect();
new KingBag().quantity(1).identify().collect(); new KingBag().quantity(1).identify().collect();
new PotionOfLiquidFlameX().quantity(100).identify().collect(); new HaloDart().quantity(100).identify().collect();
new YellowSunBooks().quantity(1).identify().collect();
new BrokenBooks().quantity(12).identify().collect();
new IceCityBooks().quantity(12).identify().collect();
new ScrollOfFlameCursed().quantity(44).identify().collect(); new ScrollOfFlameCursed().quantity(44).identify().collect();
new MailArmor().quantity(1).identify().collect();
new LeatherArmor().quantity(1).identify().collect();
new ScaleArmor().quantity(1).identify().collect();
new PlateArmor().quantity(1).identify().collect();
Dungeon.gold = 600000000; Dungeon.gold = 600000000;
hero.STR = 27; hero.STR = 27;
hero.lvl = 30; hero.lvl = 30;

View File

@ -21,6 +21,7 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.Badges.global;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.DHXD; import static com.shatteredpixel.shatteredpixeldungeon.Challenges.DHXD;
import static com.shatteredpixel.shatteredpixeldungeon.Difficulty.DifficultyConduct.EASY; import static com.shatteredpixel.shatteredpixeldungeon.Difficulty.DifficultyConduct.EASY;
import static com.shatteredpixel.shatteredpixeldungeon.Difficulty.DifficultyConduct.HARD; import static com.shatteredpixel.shatteredpixeldungeon.Difficulty.DifficultyConduct.HARD;
@ -34,6 +35,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Conducts; import com.shatteredpixel.shatteredpixeldungeon.Conducts;
import com.shatteredpixel.shatteredpixeldungeon.Difficulty; import com.shatteredpixel.shatteredpixeldungeon.Difficulty;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges;
import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.Statistics;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
@ -89,6 +91,7 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
public abstract class Mob extends Char { public abstract class Mob extends Char {
@ -864,6 +867,15 @@ public abstract class Mob extends Char {
// Analytics.trackBossBeaten(this); // Analytics.trackBossBeaten(this);
// } // }
PaswordBadges.loadGlobal();
List<PaswordBadges.Badge> passwordbadges = PaswordBadges.filtered( true );
if (global.contains( Badges.Badge.KILL_APPLE ) && global.contains( Badges.Badge.KILL_DM720 ) &&
global.contains( Badges.Badge.KILL_MG) && passwordbadges.contains(PaswordBadges.Badge.FIREGIRL) && passwordbadges.contains(PaswordBadges.Badge.DRAWF_HEAD) && passwordbadges.contains(PaswordBadges.Badge.SAKA_DIED)) {
PaswordBadges.Badge badge = PaswordBadges.Badge.SPICEALBOSS;
PaswordBadges.displayBadge( badge );
}
if (cause == Chasm.class){ if (cause == Chasm.class){
//50% chance to round up, 50% to round down //50% chance to round up, 50% to round down
if (EXP % 2 == 1) EXP += Random.Int(2); if (EXP % 2 == 1) EXP += Random.Int(2);

View File

@ -37,7 +37,7 @@ public class Rat extends Mob {
HP = HT = 8; HP = HT = 8;
defenseSkill = 2; defenseSkill = 2;
maxLvl = 30; maxLvl = 5;
} }
@Override @Override

View File

@ -9,9 +9,11 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.SalamanderSprites; import com.shatteredpixel.shatteredpixeldungeon.sprites.SalamanderSprites;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.utils.Bundle; import com.watabou.utils.Bundle;
import com.watabou.utils.Random; import com.watabou.utils.Random;
@ -40,6 +42,11 @@ public class Salamander extends Mob {
} else { } else {
enemy.sprite.showStatus( CharSprite.NEUTRAL, enemy.defenseVerb() ); enemy.sprite.showStatus( CharSprite.NEUTRAL, enemy.defenseVerb() );
} }
if (enemy == Dungeon.hero && !enemy.isAlive()) {
Dungeon.fail( getClass() );
GLog.n( Messages.capitalize(Messages.get(Char.class, "kill", name())) );
}
} }
public void onZapComplete() { public void onZapComplete() {

View File

@ -9,6 +9,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Challenges; import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges;
import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.Statistics;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
@ -493,11 +494,11 @@ public class YogDzewa extends Mob {
} }
if(Dungeon.isChallenged(SBSG)){ if(Dungeon.isChallenged(SBSG)){
Badges.BIGX(); PaswordBadges.BIGX();
} }
if(Dungeon.isChallenged(EXSG)){ if(Dungeon.isChallenged(EXSG)){
Badges.EXSG(); PaswordBadges.EXSG();
} }
updateVisibility(Dungeon.level); updateVisibility(Dungeon.level);

View File

@ -30,6 +30,11 @@ public class CrystalDiedTower extends Mob {
state = HUNTING; state = HUNTING;
} }
@Override
public boolean interact(Char c) {
return true;
}
@Override @Override
public void damage( int dmg, Object src ) { public void damage( int dmg, Object src ) {
} }

View File

@ -3,8 +3,8 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges;
import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.Statistics;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
@ -382,7 +382,7 @@ public class DMZERO extends Mob
GameScene.add(((Mob) (obj))); GameScene.add(((Mob) (obj)));
Actor.addDelayed(new Pushing(((Char) (obj)), pos, ((NullDiedTO) (obj)).pos), -1F); Actor.addDelayed(new Pushing(((Char) (obj)), pos, ((NullDiedTO) (obj)).pos), -1F);
Statistics.bossScores[4] += 3000; Statistics.bossScores[4] += 3000;
Badges.BOSSRUSH(); PaswordBadges.BOSSRUSH();
yell( Messages.get(this, "defeated") ); yell( Messages.get(this, "defeated") );
} }

View File

@ -27,6 +27,7 @@ import static com.shatteredpixel.shatteredpixeldungeon.levels.Level.set;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges;
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.Statistics;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
@ -277,8 +278,10 @@ public class DiamondKnight extends Boss {
Badges.KILL_SMK(); Badges.KILL_SMK();
if(Statistics.dimandchestmazeCollected>=3){ if(Statistics.dimandchestmazeCollected>=3){
Badges.KILL_OMP(); PaswordBadges.validateOMP();
Statistics.bossScores[1] += 1000; Statistics.bossScores[1] += 1000;
} }

View File

@ -6,6 +6,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Conducts; import com.shatteredpixel.shatteredpixeldungeon.Conducts;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges;
import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.Statistics;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Boss; import com.shatteredpixel.shatteredpixeldungeon.actors.Boss;
@ -1642,7 +1643,7 @@ public class DwarfMaster extends Boss {
Dungeon.level.drop(new KingsCrown(), pos).sprite.drop(); Dungeon.level.drop(new KingsCrown(), pos).sprite.drop();
Dungeon.level.drop(new PotionOfHealing().quantity(Random.NormalIntRange(2,4)), pos).sprite.drop(); Dungeon.level.drop(new PotionOfHealing().quantity(Random.NormalIntRange(2,4)), pos).sprite.drop();
Dungeon.level.drop(new MeatPie().quantity(Random.NormalIntRange(1,2)), pos).sprite.drop(); Dungeon.level.drop(new MeatPie().quantity(Random.NormalIntRange(1,2)), pos).sprite.drop();
Badges.KILLDWARF(); PaswordBadges.KILLDWARF();
Badges.validateBossSlain(); Badges.validateBossSlain();
yell( Messages.get(this, "defeated") ); yell( Messages.get(this, "defeated") );

View File

@ -0,0 +1,13 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses;
import com.shatteredpixel.shatteredpixeldungeon.actors.Boss;
import com.shatteredpixel.shatteredpixeldungeon.sprites.FireDragonSprite;
public class FireDragon extends Boss {
{
initProperty();
initBaseStatus(10, 20, 15, 15, 300, 8, 12);
initStatus(60);
spriteClass = FireDragonSprite.class;
}
}

View File

@ -7,9 +7,9 @@ import static com.shatteredpixel.shatteredpixeldungeon.levels.ShopBossLevel.FALS
import static com.shatteredpixel.shatteredpixeldungeon.levels.ShopBossLevel.TRUEPosition; import static com.shatteredpixel.shatteredpixeldungeon.levels.ShopBossLevel.TRUEPosition;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Conducts; import com.shatteredpixel.shatteredpixeldungeon.Conducts;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges;
import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.Statistics;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
@ -763,7 +763,7 @@ public class FireMagicDied extends Mob implements Callback {
GameScene.bossSlain(); GameScene.bossSlain();
Badges.KILLFIREGIRL(); PaswordBadges.KILLFIREGIRL();
yell( Messages.get(this, "defeated",Dungeon.hero.name()) ); yell( Messages.get(this, "defeated",Dungeon.hero.name()) );
} }

View File

@ -3,8 +3,8 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Boss; import com.shatteredpixel.shatteredpixeldungeon.actors.Boss;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
@ -148,9 +148,9 @@ public class SakaFishBoss extends Boss {
public int damageRoll() { public int damageRoll() {
AncientMysteryCityBossLevel.State level = ((AncientMysteryCityBossLevel)Dungeon.level).pro(); AncientMysteryCityBossLevel.State level = ((AncientMysteryCityBossLevel)Dungeon.level).pro();
if(level==AncientMysteryCityBossLevel.State.FALL_BOSS) if(level==AncientMysteryCityBossLevel.State.FALL_BOSS)
return Random.NormalIntRange(40, 75); return Random.NormalIntRange(30, 55);
else else
return Random.NormalIntRange(30, 40); return Random.NormalIntRange(20, 30);
} }
@Override @Override
@ -169,7 +169,7 @@ public class SakaFishBoss extends Boss {
@Override @Override
public int drRoll() { public int drRoll() {
AncientMysteryCityBossLevel.State level = ((AncientMysteryCityBossLevel)Dungeon.level).pro(); AncientMysteryCityBossLevel.State level = ((AncientMysteryCityBossLevel)Dungeon.level).pro();
return level == AncientMysteryCityBossLevel.State.FALL_BOSS ? 10 : 45; return level == AncientMysteryCityBossLevel.State.FALL_BOSS ? 10 : 35;
} }
@ -279,7 +279,7 @@ public class SakaFishBoss extends Boss {
Dungeon.level.drop( new SakaFishSketon(), pos ).sprite.drop(); Dungeon.level.drop( new SakaFishSketon(), pos ).sprite.drop();
Dungeon.level.drop( new WaterSoul(), pos ).sprite.drop(); Dungeon.level.drop( new WaterSoul(), pos ).sprite.drop();
Badges.KILLSAKA(); PaswordBadges.KILLSAKA();
yell( Messages.get(this, "defeated") ); yell( Messages.get(this, "defeated") );
@ -445,6 +445,7 @@ public class SakaFishBoss extends Boss {
} else { } else {
endPos = leapPos; endPos = leapPos;
} }
//do leap //do leap
sprite.visible = Dungeon.level.heroFOV[pos] || Dungeon.level.heroFOV[leapPos] || Dungeon.level.heroFOV[endPos]; sprite.visible = Dungeon.level.heroFOV[pos] || Dungeon.level.heroFOV[leapPos] || Dungeon.level.heroFOV[endPos];
sprite.dirtcar(pos, leapPos, new Callback() { sprite.dirtcar(pos, leapPos, new Callback() {
@ -462,9 +463,12 @@ public class SakaFishBoss extends Boss {
Sample.INSTANCE.play(Assets.Sounds.HIT); Sample.INSTANCE.play(Assets.Sounds.HIT);
} }
if (!enemy.isAlive() && enemy == hero) { Char ch = hero;
Dungeon.fail( getClass() ); if(hero != null){
GLog.n( Messages.get(SakaFishBoss.class, "dictcar_kill"),Dungeon.hero.name() ); if (!ch.isAlive()) {
Dungeon.fail( getClass() );
GLog.n( Messages.get(SakaFishBoss.class, "dictcar_kill"),Dungeon.hero.name() );
}
} }
if (endPos != leapPos){ if (endPos != leapPos){

View File

@ -50,7 +50,6 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.ItemLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.SewerLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.SewerLevel;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.GhostSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.GhostSprite;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndQuest; import com.shatteredpixel.shatteredpixeldungeon.windows.WndQuest;
@ -291,6 +290,35 @@ public class Ghost extends NPC {
reset(); reset();
} }
} }
private static void ghostQuest(){
float itemLevelRoll = Random.Float();
int itemLevel;
if (itemLevelRoll < 0.74f){
itemLevel = 0;
} else if (itemLevelRoll < 0.75f){
itemLevel = 1;
} else if (itemLevelRoll < 0.85f){
itemLevel = 2;
} else if (itemLevelRoll < 0.90f) {
itemLevel = 3;
if ((!Badges.isUnlocked(Badges.Badge.GHOSTDAGE))) {
Statistics.dageCollected = 1;
}
} else if (itemLevelRoll < 0.95f && Badges.isUnlocked(Badges.Badge.GHOSTDAGE)) {
if ((!Badges.isUnlocked(Badges.Badge.DAGETO))) {
Statistics.dageCollected = 2;
}
itemLevel = 4;
} else {
if ((!Badges.isUnlocked(Badges.Badge.GHOSTDAGE))) {
Statistics.dageCollected = 1;
}
itemLevel = 3;
}
weapon.upgrade(itemLevel);
armor.upgrade(itemLevel);
}
public static void spawn( SewerLevel level ) { public static void spawn( SewerLevel level ) {
if (!spawned && Dungeon.depth > 1 && Random.Int( 5 - Dungeon.depth ) == 0) { if (!spawned && Dungeon.depth > 1 && Random.Int( 5 - Dungeon.depth ) == 0) {
@ -325,35 +353,7 @@ public class Ghost extends NPC {
weapon = (MeleeWeapon) Reflection.newInstance(c.classes[Random.chances(c.probs)]); weapon = (MeleeWeapon) Reflection.newInstance(c.classes[Random.chances(c.probs)]);
//26%:+0, 25%:+1, 15%:+2, 10%:+3, 5%:+4 //26%:+0, 25%:+1, 15%:+2, 10%:+3, 5%:+4
float itemLevelRoll = Random.Float(); ghostQuest();
int itemLevel;
if (itemLevelRoll < 0.74f){
itemLevel = 0;
} else if (itemLevelRoll < 0.75f){
itemLevel = 1;
} else if (itemLevelRoll < 0.85f){
itemLevel = 2;
} else if (itemLevelRoll < 0.90f) {
itemLevel = 3;
if ((!Badges.isUnlocked(Badges.Badge.GHOSTDAGE))) {
Statistics.dageCollected = 1;
Badges.GhostDageCollected();
}
} else if (itemLevelRoll < 0.95f && Badges.isUnlocked(Badges.Badge.GHOSTDAGE)) {
if ((!Badges.isUnlocked(Badges.Badge.DAGETO))) {
Statistics.dageCollected = 2;
Badges.GhostDageCollected();
}
itemLevel = 4;
} else {
if ((!Badges.isUnlocked(Badges.Badge.GHOSTDAGE))) {
Statistics.dageCollected = 1;
Badges.GhostDageCollected();
}
itemLevel = 3;
}
weapon.upgrade(itemLevel);
armor.upgrade(itemLevel);
//10% to be enchanted. We store it separately so enchant status isn't revealed early //10% to be enchanted. We store it separately so enchant status isn't revealed early
if (Random.Int(10) == 0){ if (Random.Int(10) == 0){
@ -396,35 +396,7 @@ public class Ghost extends NPC {
Generator.Category c = Generator.wepTiers[wepTier - 1]; Generator.Category c = Generator.wepTiers[wepTier - 1];
weapon = (MeleeWeapon) Reflection.newInstance(c.classes[Random.chances(c.probs)]); weapon = (MeleeWeapon) Reflection.newInstance(c.classes[Random.chances(c.probs)]);
//26%:+0, 25%:+1, 15%:+2, 10%:+3, 5%:+4, 5%+5 ghostQuest();
float itemLevelRoll = Random.Float();
int itemLevel;
if (itemLevelRoll < 0.74f){
itemLevel = 0;
} else if (itemLevelRoll < 0.75f){
itemLevel = 1;
} else if (itemLevelRoll < 0.85f){
itemLevel = 2;
} else if (itemLevelRoll < 0.90f) {
itemLevel = 3;
hero.sprite.showStatus( CharSprite.NEGATIVE, "+3!!!" );
} else if (itemLevelRoll < 0.95f && Badges.isUnlocked(Badges.Badge.GHOSTDAGE)){
hero.sprite.showStatus( CharSprite.POSITIVE, "+5!!!" );
if(( !Badges.isUnlocked(Badges.Badge.DAGETO))) {
Statistics.dageCollected = 2;
Badges.GhostDageCollected();
}
itemLevel = 5;
} else {
itemLevel = 4;
hero.sprite.showStatus( CharSprite.WARNING, "+4!!!" );
if(( !Badges.isUnlocked(Badges.Badge.GHOSTDAGE))) {
Statistics.dageCollected = 1;
Badges.GhostDageCollected();
}
}
weapon.upgrade(itemLevel);
armor.upgrade(itemLevel);
//10% to be enchanted. We store it separately so enchant status isn't revealed early //10% to be enchanted. We store it separately so enchant status isn't revealed early
if (Random.Int(10) == 0){ if (Random.Int(10) == 0){

View File

@ -0,0 +1,49 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.spical;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NTNPC;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.TribesmanSprite;
import com.watabou.utils.Random;
import java.util.ArrayList;
public class GnollHero extends NTNPC {
{
spriteClass = TribesmanSprite.class;
HP = HT = 120;
properties.add(Property.NPC);
baseSpeed = 2f;
chat = new ArrayList<String>() {
{
add(Messages.get(GnollHero.class, "chat_1"));
add(Messages.get(GnollHero.class, "chat_2"));
add(Messages.get(GnollHero.class, "chat_3"));
}
};
}
@Override
public float attackDelay() {
return 0.5f;
}
@Override
public int damageRoll() {
return Random.NormalIntRange( 20, 40 );
}
@Override
public int attackSkill( Char target ) {
return 30;
}
@Override
public int drRoll() {
return Random.NormalIntRange(10, 16);
}
}

View File

@ -0,0 +1,247 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.spical;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Conducts;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Ooze;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Goo;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.GooSprite;
import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.Camera;
import com.watabou.utils.Bundle;
import com.watabou.utils.Random;
public class GooMob extends Mob {
{
if (Dungeon.isDLC(Conducts.Conduct.BOSSRUSH)) {
HP = HT = 180;
} else {
HP = HT = Dungeon.isChallenged(Challenges.STRONGER_BOSSES) ? 120 : 100;
}
EXP = 10;
defenseSkill = 8;
spriteClass = GooSprite.class;
properties.add(Property.BOSS);
properties.add(Property.DEMONIC);
properties.add(Property.ACIDIC);
}
private int pumpedUp = 0;
private int healInc = 1;
@Override
public int damageRoll() {
int min = 1;
int max = (HP*2 <= HT) ? 12 : 8;
if (pumpedUp > 0) {
pumpedUp = 0;
return Random.NormalIntRange( min*3, max*3 );
} else {
return Random.NormalIntRange( min, max );
}
}
@Override
public int attackSkill( Char target ) {
int attack = 10;
if (HP*2 <= HT) attack = 15;
if (pumpedUp > 0) attack *= 2;
return attack;
}
@Override
public int defenseSkill(Char enemy) {
return (int)(super.defenseSkill(enemy) * ((HP*2 <= HT)? 1.5 : 1));
}
@Override
public int drRoll() {
return Random.NormalIntRange(0, 2);
}
@Override
public boolean act() {
if (Dungeon.level.water[pos] && HP < HT) {
HP += healInc;
LockedFloor lock = Dungeon.hero.buff(LockedFloor.class);
if (lock != null) lock.removeTime(healInc*2);
if (Dungeon.level.heroFOV[pos] ){
sprite.emitter().burst( Speck.factory( Speck.HEALING ), healInc );
}
if (Dungeon.isChallenged(Challenges.STRONGER_BOSSES) && healInc < 3) {
healInc++;
}
if (HP*2 > HT) {
BossHealthBar.bleed(false);
((GooSprite)sprite).spray(false);
HP = Math.min(HP, HT);
}
} else {
healInc = 1;
}
return super.act();
}
@Override
protected boolean canAttack( Char enemy ) {
if (pumpedUp > 0){
//we check both from and to in this case as projectile logic isn't always symmetrical.
//this helps trim out BS edge-cases
return Dungeon.level.distance(enemy.pos, pos) <= 2
&& new Ballistica( pos, enemy.pos, Ballistica.PROJECTILE).collisionPos == enemy.pos
&& new Ballistica( enemy.pos, pos, Ballistica.PROJECTILE).collisionPos == pos;
} else {
return super.canAttack(enemy);
}
}
@Override
public int attackProc( Char enemy, int damage ) {
damage = super.attackProc( enemy, damage );
if (Random.Int( 3 ) == 0) {
Buff.affect( enemy, Ooze.class ).set( Ooze.DURATION );
enemy.sprite.burst( 0x000000, 5 );
}
if (pumpedUp > 0) {
Camera.main.shake( 3, 0.2f );
}
return damage;
}
@Override
public void updateSpriteState() {
super.updateSpriteState();
if (pumpedUp > 0){
((GooSprite)sprite).pumpUp( pumpedUp );
}
}
@Override
protected boolean doAttack( Char enemy ) {
if (pumpedUp == 1) {
pumpedUp++;
((GooSprite)sprite).pumpUp( pumpedUp );
spend( attackDelay() );
return true;
} else if (pumpedUp >= 2 || Random.Int( (HP*2 <= HT) ? 2 : 5 ) > 0) {
boolean visible = Dungeon.level.heroFOV[pos];
if (visible) {
if (pumpedUp >= 2) {
((GooSprite) sprite).pumpAttack();
} else {
sprite.attack(enemy.pos);
}
} else {
if (pumpedUp >= 2){
((GooSprite)sprite).triggerEmitters();
}
attack( enemy );
spend( attackDelay() );
}
return !visible;
} else {
pumpedUp++;
if (Dungeon.isChallenged(Challenges.STRONGER_BOSSES)){
pumpedUp++;
}
((GooSprite)sprite).pumpUp( pumpedUp );
if (Dungeon.level.heroFOV[pos]) {
sprite.showStatus( CharSprite.NEGATIVE, Messages.get(Goo.class, "!!!") );
GLog.n( Messages.get(Goo.class, "pumpup") );
}
spend( attackDelay() );
return true;
}
}
@Override
public boolean attack( Char enemy, float dmgMulti, float dmgBonus, float accMulti ) {
boolean result = super.attack( enemy, dmgMulti, dmgBonus, accMulti );
pumpedUp = 0;
return result;
}
@Override
protected boolean getCloser( int target ) {
if (pumpedUp != 0) {
pumpedUp = 0;
sprite.idle();
}
return super.getCloser( target );
}
@Override
public void damage(int dmg, Object src) {
boolean bleeding = (HP*2 <= HT);
super.damage(dmg, src);
if ((HP*2 <= HT) && !bleeding){
sprite.showStatus(CharSprite.NEGATIVE, Messages.get(Goo.class, "enraged"));
((GooSprite)sprite).spray(true);
yell(Messages.get(Goo.class, "gluuurp"));
}
LockedFloor lock = Dungeon.hero.buff(LockedFloor.class);
if (lock != null) lock.addTime(dmg*2);
}
@Override
public void die( Object cause ) {
super.die( cause );
}
private final String PUMPEDUP = "pumpedup";
private final String HEALINC = "healinc";
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
bundle.put( PUMPEDUP , pumpedUp );
bundle.put( HEALINC, healInc );
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
pumpedUp = bundle.getInt( PUMPEDUP );
if (state != SLEEPING) BossHealthBar.assignBoss(this);
if ((HP*2 <= HT)) BossHealthBar.bleed(true);
//if check is for pre-0.9.3 saves
healInc = bundle.getInt(HEALINC);
}
}

View File

@ -0,0 +1,319 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.spical;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Conducts;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Degrade;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.CausticSlime;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ColdMagicRat;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Crab;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Rat;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Slime;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.SlimeKing;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Swarm;
import com.shatteredpixel.shatteredpixeldungeon.effects.Chains;
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.SummoningTrap;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.SlimeKingSprite;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Bundle;
import com.watabou.utils.Callback;
import com.watabou.utils.Random;
import java.util.ArrayList;
public class SlimeKingMob extends Mob {
private final String[] attackCurse = {"雕虫小技", "班门弄斧",
"GAMEOVER"};
private int combo = 0;
private static final float TIME_TO_ZAP = 0.5f;
private boolean PartCold = false;
@Override
public int defenseProc(Char enemy, int damage ) {
if (HP >= damage + 2) {
ArrayList<Integer> candidates = new ArrayList<>();
int[] neighbours = {pos + 1, pos - 1, pos + Dungeon.level.width(), pos - Dungeon.level.width()};
for (int n : neighbours) {
if (!Dungeon.level.solid[n] && Actor.findChar( n ) == null
&& (!properties().contains(Property.LARGE) || Dungeon.level.openSpace[n])) {
candidates.add( n );
}
}
if (candidates.size() > 0 && HP < 60 && Random.Float() < 0.45f) {
CausticSlime mini = new CausticSlime();
mini.pos = this.pos;
mini.state = mini.HUNTING;
mini.HP /= 4;
mini.maxLvl = -5;
Dungeon.level.occupyCell(mini);
GameScene.add( mini , 0f );
Actor.addDelayed( new Pushing( mini, pos, mini.pos ), -1 );
}
}
return super.defenseProc(enemy, damage);
}
private static final String partcold = "partcold";
private static final String chainsused = "chainsused";
@Override
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
bundle.put(partcold, PartCold);
bundle.put(chainsused, chainsUsed);
}
@Override
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
PartCold = bundle.getBoolean(partcold);
chainsUsed = bundle.getBoolean(chainsused);
}
{
if (Dungeon.isDLC(Conducts.Conduct.BOSSRUSH)) {
HP =190;
HT= 190;
} else {
HP =140;
HT= 140;
}
EXP = 20;
defenseSkill = 12;
spriteClass = SlimeKingSprite.class;
lootChance = 1;
HUNTING = new Hunting();
properties.add(Property.BOSS);
baseSpeed = 0.4f;
}
@Override
public boolean act() {
if(HP < 70 && !PartCold){
baseSpeed = 1f;
SummoningTrap var4 = new SummoningTrap();
var4.pos = super.pos;
var4.activate();
PartCold = true;
chainsUsed = true;
GLog.n(Messages.get(SlimeKing.class,"fuck"));
} else if (HP < 70) {
baseSpeed = 1f;
}
return super.act();
}
private void zap() {
spend( TIME_TO_ZAP );
if (hit( this, enemy, true )) {
//TODO would be nice for this to work on ghost/statues too
if (Random.Int( 2 ) == 0) {
Buff.prolong( enemy, Blindness.class, Degrade.DURATION );
Sample.INSTANCE.play( Assets.Sounds.DEBUFF );
}
int dmg = Random.NormalIntRange( 2, 4 );
enemy.damage( dmg, new ColdMagicRat.DarkBolt() );
if (enemy == Dungeon.hero && !enemy.isAlive()) {
Dungeon.fail( getClass() );
GLog.n( Messages.get(SlimeKing.class, "frost_kill") );
}
} else {
enemy.sprite.showStatus( CharSprite.NEUTRAL, enemy.defenseVerb() );
}
}
protected boolean doAttack( Char enemy ) {
if (Dungeon.level.adjacent( pos, enemy.pos )) {
return super.doAttack( enemy );
} else {
if (sprite != null && (sprite.visible || enemy.sprite.visible)) {
sprite.zap( enemy.pos );
return false;
} else {
zap();
return true;
}
}
}
public void onZapComplete() {
zap();
next();
}
@Override
public int damageRoll() {
if(HP < 70 && Random.Float() > 0.10f) {
return Random.NormalIntRange(8, 12);
} else {
return Random.NormalIntRange(4, 6);
}
}
@Override
public int attackSkill( Char target ) {
return 12;
}
@Override
public int attackProc(Char enemy, int damage) {
if (Random.Int(0, 10) > 7) {
this.sprite.showStatus(0x009999, this.attackCurse[Random.Int(this.attackCurse.length)]);
}
int damage2 = super.attackProc(enemy, this.combo + damage);
this.combo++;
// int effect = Random.Int(3);
//// if (enemy.buff(Poison.class) == null && Random.Float() <= 0.25f) {
//// Buff.affect( enemy, Poison.class).set((effect-2) );
//// }
if (this.combo > 3) {
this.combo = 1;
}
return damage2;
}
@Override
public int drRoll() {
if(HP < 70 && !PartCold) {
return 0;
} else {
return 5;
}
}
private boolean chainsUsed = false;
private boolean chain(int target){
if (chainsUsed || enemy.properties().contains(Property.IMMOVABLE))
return false;
Ballistica chain = new Ballistica(pos, target, Ballistica.PROJECTILE);
if (chain.collisionPos != enemy.pos
|| chain.path.size() < 2
|| Dungeon.level.pit[chain.path.get(1)])
return false;
else {
int newPos;
newPos = -1;
for (int i : chain.subPath(1, chain.dist)){
if (!Dungeon.level.solid[i] && Actor.findChar(i) == null){
newPos = i;
break;
}
}
if (newPos == 0){
return false;
} else {
final int newPosFinal = newPos;
this.target = newPos;
if (sprite.visible) {
yell(Messages.get(SlimeKing.class, "scorpion"));
new Item().throwSound();
Sample.INSTANCE.play(Assets.Sounds.CHAINS);
sprite.parent.add(new Chains(sprite.center(), enemy.sprite.destinationCenter(), new Callback() {
public void call() {
Actor.addDelayed(new Pushing(enemy, enemy.pos, newPosFinal, new Callback() {
public void call() {
pullEnemy(enemy, newPosFinal);
}
}), -1);
next();
}
}));
} else {
pullEnemy(enemy, newPos);
}
}
}
chainsUsed = true;
return true;
}
private void pullEnemy( Char enemy, int pullPos ){
enemy.pos = pullPos;
enemy.sprite.place(pullPos);
Dungeon.level.occupyCell(enemy);
Cripple.prolong(enemy, Cripple.class, 4f);
if (enemy == Dungeon.hero) {
Dungeon.hero.interrupt();
Dungeon.observe();
GameScene.updateFog();
}
}
public void move( int step ) {
super.move( step );
}
@Override
public void die( Object cause ) {
super.die( cause );
for (Mob mob : Dungeon.level.mobs.toArray(new Mob[0])){
if ( mob instanceof Swarm ||
mob instanceof Crab ||
mob instanceof Rat ||
mob instanceof Slime) {
mob.die( cause );
}
}
}
private class Hunting extends Mob.Hunting{
@Override
public boolean act( boolean enemyInFOV, boolean justAlerted ) {
enemySeen = enemyInFOV;
if (!chainsUsed
&& enemyInFOV
&& !isCharmedBy( enemy )
&& !canAttack( enemy )
&& Dungeon.level.distance( pos, enemy.pos ) < 5
&& chain(enemy.pos)){
return !(sprite.visible || enemy.sprite.visible);
} else {
return super.act( enemyInFOV, justAlerted );
}
}
}
}

View File

@ -1,10 +1,14 @@
package com.shatteredpixel.shatteredpixeldungeon.custom.dict; package com.shatteredpixel.shatteredpixeldungeon.custom.dict;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.sprites.BombGnollTricksterSprites;
import com.shatteredpixel.shatteredpixeldungeon.sprites.BruteBotSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.BruteBotSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ClearElementalSprites;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ColdGuardSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ColdRatSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ColdRatSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.FireAcidicSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.FireAcidicSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.FlameBoiSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.FlameC01Sprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.GooSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.IceFireScorpioSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.IceFireScorpioSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.IceGolemSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.IceGolemSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
@ -16,13 +20,15 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.OGPDLLSTT;
import com.shatteredpixel.shatteredpixeldungeon.sprites.OGPDNQHZTT; import com.shatteredpixel.shatteredpixeldungeon.sprites.OGPDNQHZTT;
import com.shatteredpixel.shatteredpixeldungeon.sprites.OGPDZSLSTT; import com.shatteredpixel.shatteredpixeldungeon.sprites.OGPDZSLSTT;
import com.shatteredpixel.shatteredpixeldungeon.sprites.PoltergeistSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.PoltergeistSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.RedNecromancerSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.RedSwarmSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.RedSwarmSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.SRPDHBLRTT; import com.shatteredpixel.shatteredpixeldungeon.sprites.SRPDHBLRTT;
import com.shatteredpixel.shatteredpixeldungeon.sprites.SRPDICLRTT; import com.shatteredpixel.shatteredpixeldungeon.sprites.SRPDICLRTT;
import com.shatteredpixel.shatteredpixeldungeon.sprites.STenguSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.SalamanderSprites;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ShieldHuntsmanSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ShieldHuntsmanSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.SkullShamanSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.SlimeKingSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.SpectralNecromancerSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.SpectralNecromancerSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.TenguSprite;
import com.watabou.noosa.Image; import com.watabou.noosa.Image;
public class DictSpriteSheet { public class DictSpriteSheet {
@ -78,11 +84,19 @@ public class DictSpriteSheet {
case MOLO: case MOLO:
return new MolotovHuntsmanSprite(); return new MolotovHuntsmanSprite();
case FLAME: case FLAME:
return new FlameBoiSprite(); return new SlimeKingSprite();
case FLAMEC01:
return new FlameC01Sprite();
case GnollK:
return new BombGnollTricksterSprites();
case GnollF:
return new SkullShamanSprite();
case Goo:
return new GooSprite();
case GNOLL: case GNOLL:
return new Image(Assets.Sprites.GNOLL, 0, 0, 12, 15); return new Image(Assets.Sprites.GNOLL, 0, 0, 12, 15);
case XTG: case STX:
return new TenguSprite(); return new SalamanderSprites();
case XHDD: case XHDD:
return new MurdererSprite.RedMuderer(); return new MurdererSprite.RedMuderer();
case IAX: case IAX:
@ -91,10 +105,16 @@ public class DictSpriteSheet {
return new FireAcidicSprite(); return new FireAcidicSprite();
case IAS: case IAS:
return new IceGolemSprite(); return new IceGolemSprite();
case BRTX:
return new BruteBotSprite();
case GOO:
return new STenguSprite();
case GKS:
return new ColdGuardSprite();
case CAX: case CAX:
return new SRPDICLRTT(); return new SRPDICLRTT();
case REDBS: case CLEARS:
return new RedNecromancerSprite(); return new ClearElementalSprites();
case SLXJ: case SLXJ:
return new SpectralNecromancerSprite(); return new SpectralNecromancerSprite();
case BMHR: case BMHR:
@ -286,8 +306,8 @@ public class DictSpriteSheet {
public static final int BLACK = 218 + 10000; public static final int BLACK = 218 + 10000;
public static final int MOLO = 219 + 10000; public static final int MOLO = 219 + 10000;
public static final int FLAME = 220 + 10000; public static final int FLAME = 220 + 10000;
public static final int XTG = 221 + 10000; public static final int STX = 221 + 10000;
public static final int REDBS = 222 + 10000; public static final int CLEARS = 222 + 10000;
public static final int SLXJ = 223 + 10000; public static final int SLXJ = 223 + 10000;
public static final int BMHR = 224 + 10000; public static final int BMHR = 224 + 10000;
public static final int XHDD = 225 + 10000; public static final int XHDD = 225 + 10000;
@ -296,6 +316,17 @@ public class DictSpriteSheet {
public static final int CAX = 228 + 10000; public static final int CAX = 228 + 10000;
public static final int IAS = 229 + 10000; public static final int IAS = 229 + 10000;
public static final int FLAMEC01 = 330 + 10000;
public static final int GnollK = 331 + 10000;
public static final int GnollF = 332 + 10000;
public static final int Goo = 333 + 10000;
public static final int BRTX = 230 + 10000;
public static final int GOO = 231 + 10000;
public static final int GKS = 232 + 10000;
public static final int THIEF = 300 + 10000; public static final int THIEF = 300 + 10000;
public static final int BANDIT = 301 + 10000; public static final int BANDIT = 301 + 10000;
public static final int SKELETON = 302 + 10000; public static final int SKELETON = 302 + 10000;

View File

@ -6,6 +6,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.Statistics;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Awareness;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MindVision; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MindVision;
@ -94,6 +95,7 @@ public class LevelTeleporter extends TestItem {
InterlevelScene.mode = InterlevelScene.Mode.ASCEND; InterlevelScene.mode = InterlevelScene.Mode.ASCEND;
Game.switchScene( InterlevelScene.class ); Game.switchScene( InterlevelScene.class );
} else if(action.equals(AC_VIEW)){ } else if(action.equals(AC_VIEW)){
Buff.affect( hero, Awareness.class, Awareness.DURATION );
Buff.affect( hero, MindVision.class, MindVision.DURATION ); Buff.affect( hero, MindVision.class, MindVision.DURATION );
Dungeon.observe(); Dungeon.observe();
ScrollOfMagicMapping som = new ScrollOfMagicMapping(); ScrollOfMagicMapping som = new ScrollOfMagicMapping();

View File

@ -16,6 +16,8 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.BlackHost;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Brute; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Brute;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.BruteBot; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.BruteBot;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.CausticSlime; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.CausticSlime;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ClearElemental;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ColdGurad;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ColdMagicRat; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ColdMagicRat;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Crab; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Crab;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.DM100; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.DM100;
@ -26,9 +28,10 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Elemental;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Eye; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Eye;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.FetidRat; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.FetidRat;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Fire_Scorpio; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Fire_Scorpio;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.FlameB01; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.FlameC01;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Ghoul; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Ghoul;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Gnoll; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Gnoll;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.GnollShiled;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.GnollTrickster; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.GnollTrickster;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Golem; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Golem;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.GreatCrab; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.GreatCrab;
@ -52,11 +55,13 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.RotHeart;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.RotLasher; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.RotLasher;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.SRPDHBLR; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.SRPDHBLR;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.SRPDICLR; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.SRPDICLR;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Salamander;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Scorpio; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Scorpio;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Senior; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Senior;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Shaman; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Shaman;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ShieldHuntsman; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ShieldHuntsman;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Skeleton; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Skeleton;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.SkullShaman;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Slime; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Slime;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Snake; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Snake;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.SpectralNecromancer; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.SpectralNecromancer;
@ -67,10 +72,13 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Swarm;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Thief; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Thief;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Warlock; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Warlock;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Wraith; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Wraith;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.XTG100; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.XTG200;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.spical.GooMob;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.spical.SlimeKingMob;
import com.shatteredpixel.shatteredpixeldungeon.custom.dict.DictSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.custom.dict.DictSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.custom.messages.M; import com.shatteredpixel.shatteredpixeldungeon.custom.messages.M;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfAnmy;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector; import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
@ -78,6 +86,7 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.CheckBox; import com.shatteredpixel.shatteredpixeldungeon.ui.CheckBox;
import com.shatteredpixel.shatteredpixeldungeon.ui.IconButton; import com.shatteredpixel.shatteredpixeldungeon.ui.IconButton;
import com.shatteredpixel.shatteredpixeldungeon.ui.OptionSlider;
import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton; import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton;
import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock;
import com.shatteredpixel.shatteredpixeldungeon.ui.Window; import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
@ -101,6 +110,9 @@ public class MobPlacer extends TestItem{
private int mobTier = 1; private int mobTier = 1;
private int mobIndex = 0; private int mobIndex = 0;
private int elite = 0; private int elite = 0;
private int HT = 1;
private int ST = 1;
private int elite_op = 0; private int elite_op = 0;
private final ArrayList<Class<? extends ChampionEnemy>> eliteBuffs = new ArrayList<>(); private final ArrayList<Class<? extends ChampionEnemy>> eliteBuffs = new ArrayList<>();
@ -112,8 +124,8 @@ public class MobPlacer extends TestItem{
eliteBuffs.add(ChampionEnemy.Growing.class); eliteBuffs.add(ChampionEnemy.Growing.class);
eliteBuffs.add(ChampionEnemy.Projecting.class); eliteBuffs.add(ChampionEnemy.Projecting.class);
eliteBuffs.add(ChampionEnemy.Halo.class); eliteBuffs.add(ChampionEnemy.Halo.class);
eliteBuffs.add(ChampionEnemy.King.class);
eliteBuffs.add(ChampionEnemy.DelayMob.class); eliteBuffs.add(ChampionEnemy.DelayMob.class);
eliteBuffs.add(ChampionEnemy.King.class);
eliteBuffs.add(ChampionEnemy.Small.class); eliteBuffs.add(ChampionEnemy.Small.class);
eliteBuffs.add(ChampionEnemy.Bomber.class); eliteBuffs.add(ChampionEnemy.Bomber.class);
@ -121,6 +133,8 @@ public class MobPlacer extends TestItem{
eliteBuffs.add(ChampionEnemy.Big.class); eliteBuffs.add(ChampionEnemy.Big.class);
eliteBuffs.add(ChampionEnemy.Sider.class); eliteBuffs.add(ChampionEnemy.Sider.class);
eliteBuffs.add(ChampionEnemy.LongSider.class); eliteBuffs.add(ChampionEnemy.LongSider.class);
eliteBuffs.add(WandOfAnmy.AllyToRestartOK.class);
} }
@Override @Override
@ -143,9 +157,15 @@ public class MobPlacer extends TestItem{
try { try {
Mob m = Reflection.newInstance(allData.get(dataThreshold(mobTier) + mobIndex).mobClass); Mob m = Reflection.newInstance(allData.get(dataThreshold(mobTier) + mobIndex).mobClass);
m.pos = cell; m.pos = cell;
m.state = m.HUNTING;
GameScene.add(m); GameScene.add(m);
if(HT>1){
m.HT = m.HP = (m.HT*HT);
}
if(elite_op>0){ if(elite_op>0){
for(int i=0;i<15;++i){ for(int i=0;i<16;++i){
if((elite_op & (1<<i))>0){ if((elite_op & (1<<i))>0){
Buff.affect(m, eliteBuffs.get(i)); Buff.affect(m, eliteBuffs.get(i));
} }
@ -186,8 +206,8 @@ public class MobPlacer extends TestItem{
case 4: return DataPack.ELE_CHAOS.ordinal() - DataPack.DM201.ordinal() - 1; case 4: return DataPack.ELE_CHAOS.ordinal() - DataPack.DM201.ordinal() - 1;
case 5: return DataPack.ACIDIC.ordinal() - DataPack.ELE_CHAOS.ordinal() - 1; case 5: return DataPack.ACIDIC.ordinal() - DataPack.ELE_CHAOS.ordinal() - 1;
case 6: return DataPack.PIRANHA.ordinal() - DataPack.ACIDIC.ordinal() - 1; case 6: return DataPack.PIRANHA.ordinal() - DataPack.ACIDIC.ordinal() - 1;
case 7: return DataPack.ZSLS.ordinal() - DataPack.NQHZ.ordinal() - 1; case 7: return DataPack.NQHZ.ordinal() - DataPack.PIRANHA.ordinal() - 1;
case 8: default: return DataPack.SLXJ.ordinal() - DataPack.IAS.ordinal() - 1; case 8: default: return DataPack.IAS.ordinal() - DataPack.NQHZ.ordinal() - 1;
} }
} }
private int dataThreshold(int tier){ private int dataThreshold(int tier){
@ -205,9 +225,9 @@ public class MobPlacer extends TestItem{
case 6: case 6:
return DataPack.ACIDIC.ordinal()+1; return DataPack.ACIDIC.ordinal()+1;
case 7: case 7:
return DataPack.ZSLS.ordinal()+1; return DataPack.PIRANHA.ordinal()+1;
case 8: case 8:
return DataPack.SLXJ.ordinal()+1; return DataPack.NQHZ.ordinal()+1;
} }
} }
@ -217,6 +237,8 @@ public class MobPlacer extends TestItem{
b.put("mobTier", mobTier); b.put("mobTier", mobTier);
b.put("mobIndex", mobIndex); b.put("mobIndex", mobIndex);
b.put("eliteTags", elite); b.put("eliteTags", elite);
b.put("htTags", HT);
b.put("stTags", ST);
b.put("elite_ops", elite_op); b.put("elite_ops", elite_op);
} }
@ -226,6 +248,8 @@ public class MobPlacer extends TestItem{
mobTier = b.getInt("mobTier"); mobTier = b.getInt("mobTier");
mobIndex = b.getInt("mobIndex"); mobIndex = b.getInt("mobIndex");
elite = b.getInt("eliteTags"); elite = b.getInt("eliteTags");
HT = b.getInt("htTags");
ST = b.getInt("stTags");
elite_op = b.getInt("elite_ops"); elite_op = b.getInt("elite_ops");
} }
@ -233,26 +257,26 @@ public class MobPlacer extends TestItem{
private class WndSetMob extends Window{ private class WndSetMob extends Window{
private static final int WIDTH = 150; private static final int WIDTH = 150;
private static final int HEIGHT = 150; private static final int HEIGHT = 180;
private static final int BTN_SIZE = 18; private static final int BTN_SIZE = 18;
private static final int GAP = 2; private static final int GAP = 2;
private RenderedTextBlock selectedPage; private RenderedTextBlock selectedPage;
private ArrayList<IconButton> mobButtons = new ArrayList<>(); private ArrayList<IconButton> mobButtons = new ArrayList<>();
private RenderedTextBlock selectedMob; private RenderedTextBlock selectedMob;
private ArrayList<CheckBox> eliteOptions = new ArrayList<>(15); private ArrayList<CheckBox> eliteOptions = new ArrayList<>(16);
public WndSetMob(){ public WndSetMob(){
super(); super();
resize(WIDTH, HEIGHT); resize(WIDTH, HEIGHT);
RedButton lhs = new RedButton("<<<", 8){ RedButton lhs = new RedButton("上一页", 6){
@Override @Override
public void onClick(){ public void onClick(){
mobTier--; mobTier--;
if(mobTier < 1 || mobTier>6){ if(mobTier < 1 || mobTier>8){
mobTier = 6; mobTier = 8;
} }
mobIndex = Math.min(mobIndex, maxMobIndex(mobTier)); mobIndex = Math.min(mobIndex, maxMobIndex(mobTier));
refreshImage(); refreshImage();
@ -262,11 +286,11 @@ public class MobPlacer extends TestItem{
lhs.setRect(GAP, GAP, 24, 18); lhs.setRect(GAP, GAP, 24, 18);
add(lhs); add(lhs);
RedButton rhs = new RedButton(">>>", 8){ RedButton rhs = new RedButton("下一页", 6){
@Override @Override
public void onClick(){ public void onClick(){
mobTier++; mobTier++;
if(mobTier < 1 || mobTier > 6){ if(mobTier < 1 || mobTier > 8){
mobTier = 1; mobTier = 1;
} }
mobIndex = Math.min(mobIndex, maxMobIndex(mobTier)); mobIndex = Math.min(mobIndex, maxMobIndex(mobTier));
@ -285,40 +309,51 @@ public class MobPlacer extends TestItem{
selectedMob.hardlight(0xFFFF44); selectedMob.hardlight(0xFFFF44);
PixelScene.align(selectedMob); PixelScene.align(selectedMob);
add(selectedMob); add(selectedMob);
/*
OptionSlider op = new OptionSlider
(M.L(MobPlacer.class, "elite"), "0", String.valueOf(MAX_ELITE), 0, MAX_ELITE) {
@Override
protected void onChange() {
elite = getSelectedValue();
}
};
op.setRect(GAP, 92, WIDTH - 2*GAP, 24);
op.setSelectedValue(elite);
add(op);
*/ float pos = 96;
float pos = 92; int column = 0;
for (int i = 0; i < 15; ++i) { for (int i = 0; i < 16 && column < 3; ++i) {
CheckBox cb = new CheckBox(M.L(MobPlacer.class, "elite_name" + Integer.toString(i))); CheckBox cb = new CheckBox(M.L(MobPlacer.class, "elite_name" + i));
cb.active = true; cb.active = true;
cb.checked((elite & (1 << i)) > 0); cb.checked((elite_op & (1<<i))>0);
add(cb); add(cb);
eliteOptions.add(cb); eliteOptions.add(cb);
int row = i / 3; // 计算当前复选框所在的行数 if (column == 0) {
int column = i % 3; // 计算当前复选框所在的列数 cb.setRect((WIDTH/3f - GAP)/3f * column, pos, (WIDTH/3f - GAP), 16);
} else if (column == 1) {
cb.setRect((WIDTH/3f - GAP)/3f * column+35, pos, (WIDTH/3f - GAP), 16);
} else {
cb.setRect((WIDTH/3f - GAP)/3f * column+70, pos, (WIDTH/3f - GAP), 16);
column = -1; // 重置column的值使其在下一次循环时为0即第一列
pos += 16 + GAP; // 换行
}
float columnWidth = WIDTH / 3f - GAP * 4f / 3f; if(i==15){
float rowHeight = 16 + GAP; cb.setRect(WIDTH/2f+GAP, 78, (WIDTH/2f - GAP), 16);
}
float columnOffset = (WIDTH - columnWidth * 3f - GAP * 2f) / 2f; OptionSlider op = new OptionSlider
float rowOffset = pos + row * rowHeight; // 根据行数计算当前行的垂直偏移量 ("_修改血量_","1x","6x",1,6) {
@Override
public int getTitleTextSize(){
return 6;
}
@Override
protected void onChange() {
HT = getSelectedValue();
}
};
op.setRect((WIDTH/3f)/6f-8, 78, (WIDTH/2f - GAP), 16);
op.setSelectedValue(HT);
add(op);
cb.setRect(columnOffset + column * (columnWidth + GAP), rowOffset, columnWidth, 16); column++;
} }
createMobImage(); createMobImage();
updateSelectedMob(); updateSelectedMob();
@ -327,7 +362,7 @@ public class MobPlacer extends TestItem{
private void updateEliteSettings(){ private void updateEliteSettings(){
int el = 0; int el = 0;
for(int i=0;i<15;++i){ for(int i=0;i<16;++i){
el += eliteOptions.get(i).checked() ? (1<<i) : 0; el += eliteOptions.get(i).checked() ? (1<<i) : 0;
} }
elite_op = el; elite_op = el;
@ -353,7 +388,7 @@ public class MobPlacer extends TestItem{
selectedPage.maxWidth(WIDTH / 2); selectedPage.maxWidth(WIDTH / 2);
selectedPage.setPos((WIDTH - selectedPage.width())/2, 5); selectedPage.setPos((WIDTH - selectedPage.width())/2, 5);
selectedMob.maxWidth(WIDTH); selectedMob.maxWidth(WIDTH);
selectedMob.setPos((WIDTH - selectedMob.width())/2, 80); selectedMob.setPos((WIDTH - selectedMob.width())/2, 16);
resize(WIDTH, (int)eliteOptions.get(14).bottom() + 1); resize(WIDTH, (int)eliteOptions.get(14).bottom() + 1);
} }
@ -477,18 +512,26 @@ public class MobPlacer extends TestItem{
BLACK(BlackHost.class, DictSpriteSheet.BLACK), BLACK(BlackHost.class, DictSpriteSheet.BLACK),
HBLR(SRPDHBLR.class, DictSpriteSheet.HBLR), HBLR(SRPDHBLR.class, DictSpriteSheet.HBLR),
MOlO(MolotovHuntsman.class, DictSpriteSheet.MOLO), MOlO(MolotovHuntsman.class, DictSpriteSheet.MOLO),
Flame(FlameB01.class, DictSpriteSheet.FLAME),
GnollK(GnollShiled.class, DictSpriteSheet.GnollK),
GnollF(SkullShaman.class, DictSpriteSheet.GnollF),
FlameC(FlameC01.class, DictSpriteSheet.FLAMEC01),
Good_VI50(GooMob.class, DictSpriteSheet.Goo),
Flame(SlimeKingMob.class, DictSpriteSheet.FLAME),
NQHZ(OGPDNQHZ.class, DictSpriteSheet.OGPDNQHZ), NQHZ(OGPDNQHZ.class, DictSpriteSheet.OGPDNQHZ),
//REDBS(RedNecromancer.class, DictSpriteSheet.REDBS), CLEARS(ClearElemental.class, DictSpriteSheet.CLEARS),
SLXJ(SpectralNecromancer.class, DictSpriteSheet.SLXJ), SLXJ(SpectralNecromancer.class, DictSpriteSheet.SLXJ),
BMHR(ShieldHuntsman.class, DictSpriteSheet.BMHR), BMHR(ShieldHuntsman.class, DictSpriteSheet.BMHR),
XTG(XTG100.class, DictSpriteSheet.XTG), STX(Salamander.class, DictSpriteSheet.STX),
XHDD(RedMurderer.class, DictSpriteSheet.XHDD), XHDD(RedMurderer.class, DictSpriteSheet.XHDD),
IAX(Ice_Scorpio.class, DictSpriteSheet.IAX), IAX(Ice_Scorpio.class, DictSpriteSheet.IAX),
FAX(Fire_Scorpio.class, DictSpriteSheet.FAX), FAX(Fire_Scorpio.class, DictSpriteSheet.FAX),
CAX(SRPDICLR.class, DictSpriteSheet.CAX), CAX(SRPDICLR.class, DictSpriteSheet.CAX),
BRT(BruteBot.class, DictSpriteSheet.BRT), GOO(XTG200.class,DictSpriteSheet.GOO),
IKS(ColdGurad.class,DictSpriteSheet.GKS),
BRTX(BruteBot.class, DictSpriteSheet.BRTX),
IAS(IceGolem.class, DictSpriteSheet.IAS); IAS(IceGolem.class, DictSpriteSheet.IAS);

View File

@ -1,15 +1,9 @@
package com.shatteredpixel.shatteredpixeldungeon.custom.utils; package com.shatteredpixel.shatteredpixeldungeon.custom.utils;
import com.watabou.noosa.Game;
public class Constants { public class Constants {
public static final int MAX_DEPTH = 26; public static final int MAX_DEPTH = 26;
public static final int MAX_QUICKSLOTS = 12; public static final int MAX_QUICKSLOTS = 12;
public static final int MOX_QUICKSLOTS = 8; public static final int MOX_QUICKSLOTS = 4;
public static final int MIN_QUICKSLOTS = 3; public static final int MIN_QUICKSLOTS = 3;
public static boolean gameIsAndroid(){
return Game.platform.getClass().getSimpleName().contains("Android");
}
} }

View File

@ -0,0 +1,198 @@
package com.shatteredpixel.shatteredpixeldungeon.effects;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.watabou.gltextures.SmartTexture;
import com.watabou.gltextures.TextureCache;
import com.watabou.noosa.Game;
import com.watabou.noosa.Image;
import com.watabou.noosa.TextureFilm;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Point;
import com.watabou.utils.PointF;
import java.util.ArrayList;
import java.util.HashMap;
public class PasswordBadgeBanner extends Image {
private enum State {
FADE_IN, STATIC, FADE_OUT
}
private PasswordBadgeBanner.State state;
public static final float DEFAULT_SCALE = 3;
public static final int SIZE = 16;
private static final float FADE_IN_TIME = 0.25f;
private static final float STATIC_TIME = 1f;
private static final float FADE_OUT_TIME = 1.75f;
private int index;
private float time;
private static TextureFilm atlas;
public static ArrayList<PasswordBadgeBanner> showing = new ArrayList<>();
private PasswordBadgeBanner( int index ) {
super( Assets.Interfaces.PROBADGES );
if (atlas == null) {
atlas = new TextureFilm( texture, SIZE, SIZE );
}
setup(index);
}
public void setup( int index ){
this.index = index;
frame( atlas.get( index ) );
origin.set( width / 2, height / 2 );
alpha( 0 );
scale.set( 2 * DEFAULT_SCALE );
state = PasswordBadgeBanner.State.FADE_IN;
time = FADE_IN_TIME;
Sample.INSTANCE.play( Assets.Sounds.BADGE );
}
@Override
public void update() {
super.update();
time -= Game.elapsed;
if (time >= 0) {
switch (state) {
case FADE_IN:
float p = time / FADE_IN_TIME;
scale.set( (1 + p) * DEFAULT_SCALE );
alpha( 1 - p );
break;
case STATIC:
break;
case FADE_OUT:
alpha( time / FADE_OUT_TIME );
break;
}
} else {
switch (state) {
case FADE_IN:
time = STATIC_TIME;
state = PasswordBadgeBanner.State.STATIC;
scale.set( DEFAULT_SCALE );
alpha( 1 );
highlight( this, index );
break;
case STATIC:
time = FADE_OUT_TIME;
state = PasswordBadgeBanner.State.FADE_OUT;
break;
case FADE_OUT:
killAndErase();
break;
}
}
}
@Override
public void kill() {
showing.remove(this);
super.kill();
}
@Override
public void destroy() {
showing.remove(this);
super.destroy();
}
//map to cache highlight positions so we don't have to keep looking at texture pixels
private static HashMap<Integer, Point> highlightPositions = new HashMap<>();
//we also hardcode any special cases
static {
highlightPositions.put(Badges.Badge.MASTERY_COMBO.image, new Point(3, 7));
}
//adds a shine to an appropriate pixel on a badge
public static void highlight(Image image, int index ) {
PointF p = new PointF();
if (highlightPositions.containsKey(index)){
p.x = highlightPositions.get(index).x * image.scale.x;
p.y = highlightPositions.get(index).y * image.scale.y;
} else {
SmartTexture tx = TextureCache.get(Assets.Interfaces.PROBADGES);
int size = 16;
int cols = tx.width / size;
int row = index / cols;
int col = index % cols;
int x = 3;
int y = 4;
int bgColor = tx.getPixel(col * size + x, row * size + y);
int curColor = 0;
for (x = 3; x <= 12; x++) {
curColor = tx.getPixel(col * size + x, row * size + y);
if (curColor != bgColor) break;
}
if (curColor == bgColor) {
y++;
for (x = 3; x <= 12; x++) {
curColor = tx.getPixel(col * size + x, row * size + y);
if (curColor != bgColor) break;
}
}
p.x = x * image.scale.x;
p.y = y * image.scale.y;
highlightPositions.put(index, new Point(x, y));
}
p.offset(
-image.origin.x * (image.scale.x - 1),
-image.origin.y * (image.scale.y - 1) );
p.offset( image.point() );
Speck star = new Speck();
star.reset( 0, p.x, p.y, Speck.DISCOVER );
star.camera = image.camera();
image.parent.add( star );
}
public static PasswordBadgeBanner show( int image ) {
PasswordBadgeBanner banner = new PasswordBadgeBanner(image);
showing.add(banner);
return banner;
}
public static boolean isShowingBadges(){
return !showing.isEmpty();
}
public static Image image( int index ) {
Image image = new Image( Assets.Interfaces.PROBADGES );
if (atlas == null) {
atlas = new TextureFilm( image.texture, 16, 16 );
}
image.frame( atlas.get( index ) );
return image;
}
}

View File

@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Challenges; import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Conducts; import com.shatteredpixel.shatteredpixeldungeon.Conducts;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges;
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.Statistics;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
@ -111,6 +112,7 @@ public class Amulet extends Item {
public void afterCreate() { public void afterCreate() {
Badges.validateVictory(); Badges.validateVictory();
Badges.validateChampion(Challenges.activeChallenges()); Badges.validateChampion(Challenges.activeChallenges());
PaswordBadges.ALLCS(Challenges.activeChallenges());
Badges.saveGlobal(); Badges.saveGlobal();
} }
}); });

View File

@ -154,6 +154,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WarHammer;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WashCrime; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WashCrime;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Whip; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Whip;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WornShortsword; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WornShortsword;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.legend.DiedCrossBow;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Bolas; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Bolas;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.FishingSpear; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.FishingSpear;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ForceCube; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ForceCube;
@ -211,7 +212,7 @@ public class Generator {
return randomWeapon(Dungeon.depth / 5, useDefaults); return randomWeapon(Dungeon.depth / 5, useDefaults);
} }
public enum Category { public enum Category {
WEAPON ( 2, 2, MeleeWeapon.class), WEAPON ( 2, 2, MeleeWeapon.class),
WEP_T1 ( 0, 0, MeleeWeapon.class), WEP_T1 ( 0, 0, MeleeWeapon.class),
WEP_T2 ( 0, 0, MeleeWeapon.class), WEP_T2 ( 0, 0, MeleeWeapon.class),
@ -219,30 +220,30 @@ public class Generator {
WEP_T4 ( 0, 0, MeleeWeapon.class), WEP_T4 ( 0, 0, MeleeWeapon.class),
WEP_T5 ( 0, 0, MeleeWeapon.class), WEP_T5 ( 0, 0, MeleeWeapon.class),
WEP_T6 ( 0, 0, MeleeWeapon.class), WEP_T6 ( 0, 0, MeleeWeapon.class),
ARMOR ( 2, 1, Armor.class ), ARMOR ( 2, 1, Armor.class ),
MISSILE ( 1, 2, MissileWeapon.class ), MISSILE ( 1, 2, MissileWeapon.class ),
MIS_T1 ( 0, 0, MissileWeapon.class ), MIS_T1 ( 0, 0, MissileWeapon.class ),
MIS_T2 ( 0, 0, MissileWeapon.class ), MIS_T2 ( 0, 0, MissileWeapon.class ),
MIS_T3 ( 0, 0, MissileWeapon.class ), MIS_T3 ( 0, 0, MissileWeapon.class ),
MIS_T4 ( 0, 0, MissileWeapon.class ), MIS_T4 ( 0, 0, MissileWeapon.class ),
MIS_T5 ( 0, 0, MissileWeapon.class ), MIS_T5 ( 0, 0, MissileWeapon.class ),
WAND ( 1, 1, Wand.class ), WAND ( 1, 1, Wand.class ),
RING ( 1, 0, Ring.class ), RING ( 1, 0, Ring.class ),
ARTIFACT( 0, 1, Artifact.class), ARTIFACT( 0, 1, Artifact.class),
FOOD ( 0, 0, Food.class ), FOOD ( 0, 0, Food.class ),
POTION ( 8, 8, Potion.class ), POTION ( 8, 8, Potion.class ),
SEED ( 1, 1, Plant.Seed.class ), SEED ( 1, 1, Plant.Seed.class ),
SCROLL ( 8, 8, Scroll.class ), SCROLL ( 8, 8, Scroll.class ),
STONE ( 1, 1, Runestone.class), STONE ( 1, 1, Runestone.class),
GOLD ( 10, 10, Gold.class ); GOLD ( 10, 10, Gold.class );
public Class<?>[] classes; public Class<?>[] classes;
//some item types use a deck-based system, where the probs decrement as items are picked //some item types use a deck-based system, where the probs decrement as items are picked
@ -257,13 +258,13 @@ public class Generator {
public float firstProb; public float firstProb;
public float secondProb; public float secondProb;
public Class<? extends Item> superClass; public Class<? extends Item> superClass;
private Category( float firstProb, float secondProb, Class<? extends Item> superClass ) { private Category( float firstProb, float secondProb, Class<? extends Item> superClass ) {
this.firstProb = firstProb; this.firstProb = firstProb;
this.secondProb = secondProb; this.secondProb = secondProb;
this.superClass = superClass; this.superClass = superClass;
} }
public static int order( Item item ) { public static int order( Item item ) {
for (int i=0; i < values().length; i++) { for (int i=0; i < values().length; i++) {
if (values()[i].superClass.isInstance( item )) { if (values()[i].superClass.isInstance( item )) {
@ -421,17 +422,21 @@ public class Generator {
Glaive.class, Glaive.class,
Greataxe.class, Greataxe.class,
Greatshield.class, Greatshield.class,
WashCrime.class WashCrime.class,
//传奇武器
DiedCrossBow.class,
}; };
WEP_T5.probs = new float[]{ 3, 3, 3, 3, 3, 3,3}; WEP_T5.probs = new float[]{ 3, 3, 3, 3, 3, 3,3,1};
WEP_T6.classes = new Class<?>[]{ WEP_T6.classes = new Class<?>[]{
IceFishSword.class, IceFishSword.class,
IceDewVialSword.class IceDewVialSword.class
}; };
WEP_T6.probs = new float[]{ 1,0 }; WEP_T6.probs = new float[]{ 1,0 };
//see Generator.randomArmor //see Generator.randomArmor
ARMOR.classes = new Class<?>[]{ ARMOR.classes = new Class<?>[]{
ClothArmor.class, ClothArmor.class,
@ -441,38 +446,38 @@ public class Generator {
PlateArmor.class, PlateArmor.class,
LamellarArmor.class}; LamellarArmor.class};
ARMOR.probs = new float[]{ 0, 0, 0, 0, 0, 0 }; ARMOR.probs = new float[]{ 0, 0, 0, 0, 0, 0 };
//see Generator.randomMissile //see Generator.randomMissile
MISSILE.classes = new Class<?>[]{}; MISSILE.classes = new Class<?>[]{};
MISSILE.probs = new float[]{}; MISSILE.probs = new float[]{};
MIS_T1.classes = new Class<?>[]{ MIS_T1.classes = new Class<?>[]{
ThrowingStone.class, ThrowingStone.class,
ThrowingKnife.class ThrowingKnife.class
}; };
MIS_T1.probs = new float[]{ 6, 5 }; MIS_T1.probs = new float[]{ 6, 5 };
MIS_T2.classes = new Class<?>[]{ MIS_T2.classes = new Class<?>[]{
FishingSpear.class, FishingSpear.class,
ThrowingClub.class, ThrowingClub.class,
Shuriken.class Shuriken.class
}; };
MIS_T2.probs = new float[]{ 6, 5, 4 }; MIS_T2.probs = new float[]{ 6, 5, 4 };
MIS_T3.classes = new Class<?>[]{ MIS_T3.classes = new Class<?>[]{
ThrowingSpear.class, ThrowingSpear.class,
Kunai.class, Kunai.class,
Bolas.class Bolas.class
}; };
MIS_T3.probs = new float[]{ 6, 5, 4 }; MIS_T3.probs = new float[]{ 6, 5, 4 };
MIS_T4.classes = new Class<?>[]{ MIS_T4.classes = new Class<?>[]{
Javelin.class, Javelin.class,
Tomahawk.class, Tomahawk.class,
HeavyBoomerang.class HeavyBoomerang.class
}; };
MIS_T4.probs = new float[]{ 6, 5, 4 }; MIS_T4.probs = new float[]{ 6, 5, 4 };
MIS_T5.classes = new Class<?>[]{ MIS_T5.classes = new Class<?>[]{
Trident.class, Trident.class,
ThrowingHammer.class, ThrowingHammer.class,
@ -491,10 +496,10 @@ public class Generator {
RiceDumplings.RiceDumplingsBottle.class, RiceDumplings.RiceDumplingsBottle.class,
RiceDumplings.RiceDumplingsRed.class, RiceDumplings.RiceDumplingsRed.class,
RiceDumplings.RiceDumplingsOrange.class, RiceDumplings.RiceDumplingsOrange.class,
RiceDumplings.RiceDumplingsPink.class, RiceDumplings.RiceDumplingsPink.class,
}; };
FOOD.probs = new float[]{ 4, 1, 0, isDWJ,isDWJ,isDWJ,isDWJ,isDWJ }; FOOD.probs = new float[]{ 4, 1, 0, isDWJ,isDWJ,isDWJ,isDWJ,isDWJ };
RING.classes = new Class<?>[]{ RING.classes = new Class<?>[]{
RingOfAccuracy.class, RingOfAccuracy.class,
RingOfEvasion.class, RingOfEvasion.class,
@ -508,7 +513,7 @@ public class Generator {
RingOfTenacity.class, RingOfTenacity.class,
RingOfWealth.class}; RingOfWealth.class};
RING.probs = new float[]{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; RING.probs = new float[]{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
ARTIFACT.classes = new Class<?>[]{ ARTIFACT.classes = new Class<?>[]{
CapeOfThorns.class, CapeOfThorns.class,
ChaliceOfBlood.class, ChaliceOfBlood.class,
@ -558,7 +563,7 @@ public class Generator {
public static void reset(Category cat){ public static void reset(Category cat){
if (cat.defaultProbs != null) cat.probs = cat.defaultProbs.clone(); if (cat.defaultProbs != null) cat.probs = cat.defaultProbs.clone();
} }
public static Item random() { public static Item random() {
Category cat = Random.chances( categoryProbs ); Category cat = Random.chances( categoryProbs );
if (cat == null){ if (cat == null){
@ -569,7 +574,7 @@ public class Generator {
categoryProbs.put( cat, categoryProbs.get( cat ) - 1); categoryProbs.put( cat, categoryProbs.get( cat ) - 1);
return random( cat ); return random( cat );
} }
public static Item random( Category cat ) { public static Item random( Category cat ) {
switch (cat) { switch (cat) {
case ARMOR: case ARMOR:
@ -601,7 +606,7 @@ public class Generator {
return ((Item) Reflection.newInstance(cat.classes[Random.chances(cat.defaultProbs)])).random(); return ((Item) Reflection.newInstance(cat.classes[Random.chances(cat.defaultProbs)])).random();
} }
} }
public static Item random( Class<? extends Item> cl ) { public static Item random( Class<? extends Item> cl ) {
return Reflection.newInstance(cl).random(); return Reflection.newInstance(cl).random();
} }
@ -609,11 +614,11 @@ public class Generator {
public static Armor randomArmor(){ public static Armor randomArmor(){
return randomArmor((Dungeon.depth + 1) / 3); return randomArmor((Dungeon.depth + 1) / 3);
} }
public static Armor randomArmor(int floorSet) { public static Armor randomArmor(int floorSet) {
floorSet = (int)GameMath.gate(0, floorSet, floorSetTierProbs.length-1); floorSet = (int)GameMath.gate(0, floorSet, floorSetTierProbs.length-1);
Armor a = (Armor)Reflection.newInstance(Category.ARMOR.classes[Random.chances(floorSetTierProbs[floorSet])]); Armor a = (Armor)Reflection.newInstance(Category.ARMOR.classes[Random.chances(floorSetTierProbs[floorSet])]);
a.random(); a.random();
return a; return a;
@ -631,17 +636,17 @@ public class Generator {
public static MeleeWeapon randomWeapon(){ public static MeleeWeapon randomWeapon(){
return randomWeapon(Dungeon.depth / 5); return randomWeapon(Dungeon.depth / 5);
} }
public static MeleeWeapon randomWeapon(int floorSet) { public static MeleeWeapon randomWeapon(int floorSet) {
floorSet = (int)GameMath.gate(0, floorSet, floorSetTierProbs.length-1); floorSet = (int)GameMath.gate(0, floorSet, floorSetTierProbs.length-1);
Category c = wepTiers[Random.chances(floorSetTierProbs[floorSet])]; Category c = wepTiers[Random.chances(floorSetTierProbs[floorSet])];
MeleeWeapon w = (MeleeWeapon)Reflection.newInstance(c.classes[Random.chances(c.probs)]); MeleeWeapon w = (MeleeWeapon)Reflection.newInstance(c.classes[Random.chances(c.probs)]);
w.random(); w.random();
return w; return w;
} }
public static final Category[] misTiers = new Category[]{ public static final Category[] misTiers = new Category[]{
Category.MIS_T1, Category.MIS_T1,
Category.MIS_T2, Category.MIS_T2,
@ -649,15 +654,15 @@ public class Generator {
Category.MIS_T4, Category.MIS_T4,
Category.MIS_T5 Category.MIS_T5
}; };
public static MissileWeapon randomMissile(){ public static MissileWeapon randomMissile(){
return randomMissile(Dungeon.depth / 5); return randomMissile(Dungeon.depth / 5);
} }
public static MissileWeapon randomMissile(int floorSet) { public static MissileWeapon randomMissile(int floorSet) {
floorSet = (int)GameMath.gate(0, floorSet, floorSetTierProbs.length-1); floorSet = (int)GameMath.gate(0, floorSet, floorSetTierProbs.length-1);
Category c = misTiers[Random.chances(floorSetTierProbs[floorSet])]; Category c = misTiers[Random.chances(floorSetTierProbs[floorSet])];
MissileWeapon w = (MissileWeapon)Reflection.newInstance(c.classes[Random.chances(c.probs)]); MissileWeapon w = (MissileWeapon)Reflection.newInstance(c.classes[Random.chances(c.probs)]);
w.random(); w.random();
@ -694,7 +699,7 @@ public class Generator {
private static final String FIRST_DECK = "first_deck"; private static final String FIRST_DECK = "first_deck";
private static final String GENERAL_PROBS = "general_probs"; private static final String GENERAL_PROBS = "general_probs";
private static final String CATEGORY_PROBS = "_probs"; private static final String CATEGORY_PROBS = "_probs";
public static void storeInBundle(Bundle bundle) { public static void storeInBundle(Bundle bundle) {
bundle.put(FIRST_DECK, usingFirstDeck); bundle.put(FIRST_DECK, usingFirstDeck);
@ -741,6 +746,6 @@ public class Generator {
} }
} }
} }
} }
} }

View File

@ -76,7 +76,7 @@ public class Item implements Bundlable {
public int flasks; public int flasks;
protected int quantity = 1; public int quantity = 1;
public boolean dropsDownHeap = false; public boolean dropsDownHeap = false;
public int level = 0; public int level = 0;

View File

@ -4,7 +4,6 @@ import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
public class MainBooks extends Item { public class MainBooks extends Item {
//extends 相当于 copyfrom,但不同的是 它是一种继承自己 //extends 相当于 copyfrom,但不同的是 它是一种继承自己
@Override @Override
public String info() { public String info() {
return author; return author;
@ -13,7 +12,7 @@ public class MainBooks extends Item {
public int value() { public int value() {
return 20 * quantity; return 20 * quantity;
} }
public String author = Messages.get(MainBooks.class, "mustread"); public String author = Messages.get(MainBooks.class, "desc");
public String authorx = Messages.get(this, "author"); public String authorx = Messages.get(this, "author");
} }

View File

@ -154,7 +154,7 @@ public class Artifact extends KindofMisc {
//display the current cooldown //display the current cooldown
if (cooldown != 0) if (cooldown != 0)
return Messages.format( "%d", cooldown ); return Messages.format( "CD:%d", cooldown );
//display as percent //display as percent
if (chargeCap == 100) if (chargeCap == 100)

View File

@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.bags;
import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.bombs.Bomb; import com.shatteredpixel.shatteredpixeldungeon.items.bombs.Bomb;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfAnmy;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
@ -38,7 +39,7 @@ public class MagicalHolster extends Bag {
@Override @Override
public boolean canHold( Item item ) { public boolean canHold( Item item ) {
if (item instanceof Wand || item instanceof MissileWeapon || item instanceof Bomb){ if (item instanceof Wand && !(item instanceof WandOfAnmy) || item instanceof MissileWeapon || item instanceof Bomb ){
return super.canHold(item); return super.canHold(item);
} else { } else {
return false; return false;

View File

@ -5,20 +5,13 @@ import com.shatteredpixel.shatteredpixeldungeon.Statistics;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.items.MainBooks; import com.shatteredpixel.shatteredpixeldungeon.items.MainBooks;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndBook;
import com.watabou.noosa.particles.Emitter; import com.watabou.noosa.particles.Emitter;
import com.watabou.utils.Bundle;
import java.util.ArrayList; import java.util.ArrayList;
public class Books extends MainBooks { public class Books extends MainBooks {
//每本书的计数只能计算一次避免玩家重复阅读同一本书刷成就
public boolean readOnly = false;
{ {
defaultAction = Read; defaultAction = Read;
stackable = true; stackable = true;
@ -64,29 +57,10 @@ public class Books extends MainBooks {
@Override @Override
public void execute(final Hero hero, String action ) { public void execute(final Hero hero, String action ) {
super.execute(hero, action); super.execute(hero, action);
if (action.equals( Read ) && quantity>1) { if (action.equals( Read )) {
if(!readOnly){
Statistics.readBooks++; Statistics.readBooks++;
Badges.valiReadBooks(); Badges.valiReadBooks();
GameScene.show(new WndBook(this));
readOnly = true;
} else {
GLog.w(Messages.get(MainBooks.class, "readed"));
}
} else {
GLog.w( Messages.get(MainBooks.class, "no") );
} }
} }
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
this.readOnly = bundle.getBoolean("readOnly");
}
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
bundle.put("readOnly", this.readOnly);
}
} }

View File

@ -3,9 +3,12 @@ package com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AnkhInvulnerability; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AnkhInvulnerability;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.InvisibilityRing;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MindVision;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import java.util.ArrayList; import java.util.ArrayList;
@ -32,9 +35,15 @@ public class TestBooks extends Item {
super.execute(hero, action); super.execute(hero, action);
if (action.equals( Read )) { if (action.equals( Read )) {
if ( Dungeon.hero.buff(AnkhInvulnerability.class) == null ) { if ( Dungeon.hero.buff(AnkhInvulnerability.class) == null ) {
GLog.p("上帝模式已开启!");
Buff.prolong(hero, AnkhInvulnerability.class, AnkhInvulnerability.DURATION*1000000f); Buff.prolong(hero, AnkhInvulnerability.class, AnkhInvulnerability.DURATION*1000000f);
Buff.affect(hero, InvisibilityRing.class, InvisibilityRing.DURATION*1000000f);
Buff.affect( hero, MindVision.class, MindVision.DURATION*1000000f );
} else { } else {
GLog.n("上帝模式已关闭!");
Buff.detach( hero, AnkhInvulnerability.class ); Buff.detach( hero, AnkhInvulnerability.class );
Buff.detach( hero, InvisibilityRing.class );
Buff.detach( hero, MindVision.class );
} }
} }
} }

View File

@ -1,7 +1,4 @@
package com.shatteredpixel.shatteredpixeldungeon.items.lightblack; package com.shatteredpixel.shatteredpixeldungeon.items.lightblack;
//
// Decompiled by Jadx - 759ms
//
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
@ -71,14 +68,14 @@ public class OilLantern extends Item {
} }
public void storeInBundle(Bundle bundle) { public void storeInBundle(Bundle bundle) {
OilLantern.super.storeInBundle(bundle); super.storeInBundle(bundle);
bundle.put(ACTIVE, this.active); bundle.put(ACTIVE, this.active);
bundle.put(CHARGE, this.charge); bundle.put(CHARGE, this.charge);
bundle.put(FLASKS, this.flasks); bundle.put(FLASKS, this.flasks);
} }
public void restoreFromBundle(Bundle bundle) { public void restoreFromBundle(Bundle bundle) {
OilLantern.super.restoreFromBundle(bundle); super.restoreFromBundle(bundle);
this.active = bundle.getBoolean(ACTIVE); this.active = bundle.getBoolean(ACTIVE);
this.charge = bundle.getInt(CHARGE); this.charge = bundle.getInt(CHARGE);
this.flasks = bundle.getInt(FLASKS); this.flasks = bundle.getInt(FLASKS);
@ -146,7 +143,7 @@ public class OilLantern extends Item {
} }
public void refills(Hero hero) { public void refills(Hero hero) {
this.flasks--; this.plingks--;
this.charge += Math.min(MIX_CHARGE,100); this.charge += Math.min(MIX_CHARGE,100);
hero.spend(TIME_TO_USE); hero.spend(TIME_TO_USE);
hero.busy(); hero.busy();

View File

@ -7,6 +7,8 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Fire; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Fire;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.PinCushion;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
@ -49,6 +51,52 @@ public class WandOfAnmy extends DamageWand {
return 0; return 0;
} }
public static class AllyToRestartOK extends ChampionEnemy {
@Override
public boolean attachTo(Char target) {
if (super.attachTo(target)){
target.alignment = Char.Alignment.ALLY;
if (target.buff(PinCushion.class) != null){
target.buff(PinCushion.class).detach();
}
return true;
} else {
return false;
}
}
@Override
public String toString() {
return Messages.get(AllyToRestart.class, "name");
}
@Override
public String desc() {
return Messages.get(AllyToRestart.class, "desc");
}
@Override
public void fx(boolean on) {
if (on) {
target.sprite.add(CharSprite.State.HEARTS);
//Statistics.TryUsedAnmy = true;
}
else
target.sprite.remove(CharSprite.State.HEARTS);
}
@Override
public void tintIcon(Image icon) {
icon.hardlight(0x66bbcc);
}
public int icon() {
return BuffIndicator.HEX;
}
}
public static class AllyToRestart extends AllyBuff { public static class AllyToRestart extends AllyBuff {
@Override @Override
@ -64,11 +112,11 @@ public class WandOfAnmy extends DamageWand {
@Override @Override
public void fx(boolean on) { public void fx(boolean on) {
if (on) { if (on) {
target.sprite.add(CharSprite.State.SHIELDED); target.sprite.add(CharSprite.State.HEARTS);
//Statistics.TryUsedAnmy = true; //Statistics.TryUsedAnmy = true;
} }
else else
target.sprite.remove(CharSprite.State.SHIELDED); target.sprite.remove(CharSprite.State.HEARTS);
} }
@Override @Override

View File

@ -51,7 +51,7 @@ import com.watabou.utils.Random;
import java.util.ArrayList; import java.util.ArrayList;
public class LifeTreeSword extends MeleeWeapon { public class LifeTreeSword extends MeleeWeapon {
private int getFood;
{ {
image = ItemSpriteSheet.LifeTreeSword; image = ItemSpriteSheet.LifeTreeSword;
hitSoundPitch = 1f; hitSoundPitch = 1f;
@ -133,7 +133,7 @@ public class LifeTreeSword extends MeleeWeapon {
return super.proc(attacker, defender, damage); return super.proc(attacker, defender, damage);
} }
private int getFood;
public void restoreFromBundle(Bundle bundle) { public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle); super.restoreFromBundle(bundle);
@ -159,6 +159,9 @@ public class LifeTreeSword extends MeleeWeapon {
spriteClass = CrivusFruitsRedSprites.class; spriteClass = CrivusFruitsRedSprites.class;
alignment = Alignment.ALLY; alignment = Alignment.ALLY;
HT = HP = 10+level();
state = WANDERING = new Waiting(); state = WANDERING = new Waiting();
properties.add(Property.IMMOVABLE); properties.add(Property.IMMOVABLE);
@ -171,12 +174,12 @@ public class LifeTreeSword extends MeleeWeapon {
@Override @Override
public int damageRoll() { public int damageRoll() {
return Random.NormalIntRange( 5, 8 ); return Random.NormalIntRange( 5+level(), 8+level() );
} }
@Override @Override
public int attackSkill( Char target ) { public int attackSkill( Char target ) {
return 6; return 6+level();
} }
@Override @Override

View File

@ -61,7 +61,7 @@ public class Sai extends MeleeWeapon {
//50x0.1+7x0.5+1=10+3.5+1=15 //50x0.1+7x0.5+1=10+3.5+1=15
if(attacker.HP >= attacker.HT){ if(attacker.HP >= attacker.HT){
GLog.p("血量已满!无法回血"); GLog.p("血量已满!无法回血");
} else if (Random.Int(10)==2) { } else if (Random.Int(10)<=4) {
R = (int) (attacker.HT * 0.1 + (buffedLvl() * 0.5) + 1.5); R = (int) (attacker.HT * 0.1 + (buffedLvl() * 0.5) + 1.5);
attacker.HP +=attacker.HT * 0.1 + (buffedLvl()) + 1.5; attacker.HP +=attacker.HT * 0.1 + (buffedLvl()) + 1.5;
attacker.sprite.showStatus(CharSprite.POSITIVE, ("+" + R + "HP")); attacker.sprite.showStatus(CharSprite.POSITIVE, ("+" + R + "HP"));

View File

@ -0,0 +1,256 @@
package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.legend;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
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;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Splash;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.BlastParticle;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.SmokeParticle;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.SpiritBow;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.TippedDart;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton;
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.audio.Sample;
import com.watabou.noosa.particles.Emitter;
import com.watabou.utils.PathFinder;
import com.watabou.utils.Random;
import java.util.ArrayList;
public class DiedCrossBow extends LegendWeapon {
{
image = ItemSpriteSheet.DIEDCROSSBOW;
tier = 5;
legend = 3;
baseMin = 7;
baseMax = 20;
min = Lmin();
max = Lmax();
usesTargeting = cooldown == 0;
}
@Override
protected LegendWeapon.LegendWeaponBuff passiveBuff() {
return new DiedCrossBow.Recharge();
}
/**
*
*/
public class Recharge extends LegendWeapon.LegendWeaponBuff {
@Override
public boolean act() {
if (cooldown < 0 ) {
cooldown = 0;
}
if (cooldown > 0)
cooldown--;
updateQuickslot();
spend(TICK);
return true;
}
}
@Override
public String status() {
//display the current cooldown
if (cooldown != 0){
return Messages.format("CD:%d", cooldown);
} else {
return null;
}
}
@Override
public void execute(Hero hero, String action ) {
super.execute( hero, action );
if (action.equals( AC_KING )) {
if (!isEquipped(hero)){
GLog.i( Messages.get(this, "no_equip") );
} else if(cooldown == 0) {
GameScene.selectCell(bomb);
} else {
GLog.w(Messages.get(this, "no_cooldown"));
}
}
}
@Override
public int targetingPos(Hero user, int dst) {
return knockArrow().targetingPos(user, dst);
}
private CellSelector.Listener bomb = new CellSelector.Listener() {
@Override
public void onSelect( Integer target ) {
if (target != null) {
final Ballistica shot = new Ballistica( curUser.pos, target, target);
int cell = shot.collisionPos;
if (Actor.findChar(target) != null) {
QuickSlotButton.target(Actor.findChar(target));
} else {
QuickSlotButton.target(Actor.findChar(cell));
}
cooldown = 60-level()*2;
knockArrow().cast(curUser, target-2);
knockArrow().cast(curUser, target);
knockArrow().cast(curUser, target+2);
QuickSlotButton.target(Actor.findChar(target));
}
}
@Override
public String prompt() {
return Messages.get(SpiritBow.class, "prompt");
}
};
public DiedCrossBow.BombArrow knockArrow(){
return new BombArrow();
}
public static class BombArrow extends TippedDart {
@Override
public Emitter emitter() {
Emitter emitter = new Emitter();
emitter.pos(12.5f, 3.5f);
emitter.fillTarget = false;
emitter.pour(SmokeParticle.SPEW, 0.05f);
return emitter;
}
{
image = ItemSpriteSheet.DISPLACING_DART;
}
@Override
public int proc(Char attacker, Char defender, int damage) {
DiedCrossBow dartGun = hero.belongings.getItem(DiedCrossBow.class);
damage = Random.NormalIntRange(dartGun.Lmin(), dartGun.Lmax());
this.explodeBomb(defender.pos);
return super.proc(attacker, defender, damage);
}
@Override
public ItemSprite.Glowing glowing() {
return new ItemSprite.Glowing(0x880000, 6f);
}
@Override
protected void onThrow( int cell ) {
Char enemy = Actor.findChar( cell );
if (enemy == null || enemy == curUser) {
parent = null;
Splash.at( cell, Window.CBLACK, 12 );
this.explodeBomb(cell);
} else {
if (!curUser.shoot(enemy, this)) {
Splash.at(cell, Window.CBLACK, 12);
}
}
}
public void explodeBomb(int cell){
//We're blowing up, so no need for a fuse anymore.
Sample.INSTANCE.play( Assets.Sounds.BLAST );
ArrayList<Char> affected = new ArrayList<>();
if (Dungeon.level.heroFOV[cell]) {
CellEmitter.center(cell).burst(BlastParticle.FACTORY, 30);
}
boolean terrainAffected = false;
for (int n : PathFinder.NEIGHBOURS8) {
int c = cell + n;
if (c >= 0 && c < Dungeon.level.length()) {
if (Dungeon.level.heroFOV[c]) {
CellEmitter.get(c).burst(SmokeParticle.FACTORY, 4);
}
if (Dungeon.level.flamable[c]) {
Dungeon.level.destroy(c);
GameScene.updateMap(c);
terrainAffected = true;
}
Char ch = Actor.findChar(c);
if (ch != null) {
affected.add(ch);
}
}
for (Char ch : affected){
//if they have already been killed by another bomb
if(!ch.isAlive()){
continue;
}
DiedCrossBow diedCrossBow = hero.belongings.getItem(DiedCrossBow.class);
int dmg = Random.NormalIntRange(diedCrossBow.Lmin(),diedCrossBow.Lmin());
//those not at the center of the blast take less damage
if (ch.pos != cell){
dmg = Math.round(dmg*0.67f);
}
dmg -= ch.drRoll();
if (dmg > 0) {
ch.damage(dmg, this);
}
if (ch == hero && !ch.isAlive()) {
Badges.BOMB();
Dungeon.fail( getClass() );
GLog.n( Messages.get(DiedCrossBow.class, "ondeath") );
}
}
if (terrainAffected) {
Dungeon.observe();
}
}
}
}
@Override
public int min(int lvl) {
return 4 + lvl * (tier + 1); //scaling unchanged
}
@Override
public int max(int lvl) {
return 25 + lvl * (tier + 5); //scaling unchanged
}
}

View File

@ -0,0 +1,129 @@
package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.legend;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
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.weapon.melee.MeleeWeapon;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.watabou.utils.Bundle;
import java.util.ArrayList;
public abstract class LegendWeapon extends MeleeWeapon {
{
defaultAction = AC_KING;
}
protected Buff passiveBuff;
protected Buff activeBuff;
public void activate( Char ch ) {
passiveBuff = passiveBuff();
passiveBuff.attachTo(ch);
}
@Override
public boolean doUnequip( Hero hero, boolean collect, boolean single ) {
if (super.doUnequip( hero, collect, single )) {
if (passiveBuff != null) {
passiveBuff.detach();
passiveBuff = null;
}
return true;
} else {
return false;
}
}
protected static final String AC_KING = "KING";
protected int legend;
protected int min;
protected int max;
protected int baseMin;
protected int baseMax;
protected int cooldown = 0;
public class LegendWeaponBuff extends Buff {
public boolean isCursed() {
return cursed;
}
public void charge(Hero target, float amount){
this.charge(target, amount);
}
}
protected LegendWeapon.LegendWeaponBuff passiveBuff() {
return null;
}
protected LegendWeapon.LegendWeaponBuff activeBuff() {return null; }
public void charge(Hero target, float amount){
//do nothing by default;
}
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
cooldown = bundle.getInt("cooldown");
}
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
bundle.put("cooldown", cooldown);
}
@Override
public ArrayList<String> actions(Hero hero) {
ArrayList<String> actions = super.actions(hero);
actions.add(AC_KING);
return actions;
}
public int Lmin() {
if(level()==0) {
return baseMin;
} else {
return min * level();
}
}
public int Lmax() {
if(level()==0){
return baseMax;
} else {
return max*level(); //scaling unchanged
}
}
@Override
public String statsInfo() {
if (isEquipped(hero)) {
if (isIdentified()) {
return Messages.get(LegendWeapon.class, "stats_desc", legend, Messages.get(this, "king_desc"), Lmin(),
Lmax());
} else {
return Messages.get(LegendWeapon.class, "typical_stats_desc",legend, 9,Lmin(),
Lmax());
}
} else {
return "";
}
}
}

View File

@ -30,6 +30,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.bags.Bag; import com.shatteredpixel.shatteredpixeldungeon.items.bags.Bag;
import com.shatteredpixel.shatteredpixeldungeon.items.bags.VelvetPouch; import com.shatteredpixel.shatteredpixeldungeon.items.bags.VelvetPouch;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Crossbow; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Crossbow;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.legend.DiedCrossBow;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.plants.Plant; import com.shatteredpixel.shatteredpixeldungeon.plants.Plant;
@ -96,6 +97,8 @@ public class Dart extends MissileWeapon {
} }
private static Crossbow bow; private static Crossbow bow;
private static DiedCrossBow diedCrossBow;
private void updateCrossbow(){ private void updateCrossbow(){
if (Dungeon.hero.belongings.weapon() instanceof Crossbow){ if (Dungeon.hero.belongings.weapon() instanceof Crossbow){

View File

@ -147,6 +147,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WarHammer;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WashCrime; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WashCrime;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Whip; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Whip;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WornShortsword; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WornShortsword;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.legend.DiedCrossBow;
import com.watabou.utils.Bundle; import com.watabou.utils.Bundle;
import java.util.ArrayList; import java.util.ArrayList;
@ -210,6 +211,7 @@ public enum Catalog {
WEAPONS.seen.put( Greataxe.class, false); WEAPONS.seen.put( Greataxe.class, false);
WEAPONS.seen.put( Greatshield.class, false); WEAPONS.seen.put( Greatshield.class, false);
WEAPONS.seen.put( Gauntlet.class, false); WEAPONS.seen.put( Gauntlet.class, false);
WEAPONS.seen.put( DiedCrossBow.class, false);
WEAPONS.seen.put( LockSword.class, false); WEAPONS.seen.put( LockSword.class, false);
WEAPONS.seen.put( SkyShield.class, false); WEAPONS.seen.put( SkyShield.class, false);

View File

@ -0,0 +1,225 @@
package com.shatteredpixel.shatteredpixeldungeon.levels;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTilemap;
import com.watabou.noosa.Tilemap;
/***
* TODO LIST
* 熔岩地块-5层-EX子层-火龙巢穴
* 先决条件在新版本不击败任何纯晶元素在第五层解救纯晶意识集合体与之对话进入火龙的巢穴
*
* Boss档案
* 名称熔岩火龙 血量300 常规攻击9-14
* 防御力8 魔法防御0 移速正常 攻速正常
* 特性每次攻击最多造成15伤害至少需要20次攻击
* 性质飞行单位 异常抗性免疫腐化燃烧鬼磷霜火
*
* 区块描述
* 丛林曾经没有如此的死寂直到火龙的到来改变了这一切它污染了曾经的森林核心奥克拉赫之花
* 导致这里的守护者纯晶元素失去能量而森林核心也成为了现在的毒瘤如今我们受纯晶智能集合体的委托
* 前往森林最底部的熔岩地块寻找一切的罪魁祸首熔岩火龙
*
* Boss技能描述
* 普攻每3回合发射一次熔岩冲击波造成一次烈焰区域范围
*
* 定向进化-毒雾缠绕
* 若场上存在缠绕元素火龙可在后续定向进化获得免疫毒气的能力并且场上地图毒雾弥漫
*
* 定向进化-烈焰吐息
* 若场上存在纯晶元素火龙可在后续定向进化中获得烈焰强化冲击波强化普通攻击
* 定向进化-暗影行踪
* 若场上存在暗影元素火龙可在后续定向进化中获得暗影袭击
* 在攻击前发起警告并立刻隐身数回合隐身时玩家无法攻击火龙火龙对玩家的伤害减半
*
* 定向进化-集结号令
* 若场上存在赤红元素火龙可在后续定向进化中获得集结号令
* 此时火龙召唤两个分身并且移速提升分身仅获得本体的25%伤害
*
* 定向进化-狂野攻击
* 若场上存在紫晶元素火龙可在后续定向进化中获得狂野攻击此时火龙每隔10回合立刻尝试锁定玩家
* 该技能有30%失败一旦成功玩家会失去3回合并且受到普攻3次伤害+3级流血伤害
*
* 阶段说明
*
* 第一阶段300-200
* 火龙进行常规性攻击在此期间会每隔7回合随机召唤各种元素
* 元素没有任何攻击能力但会周期性攻击玩家赋予Debuff,
* 当场上高于4个元素时火龙会随机污染一个元素获得对应的定向进化
*
* 第二阶段<200-100
* 火龙立刻失去全部定向进化进入短暂无敌时间
* 火龙的攻击在无敌时间频率更加频繁且无敌时间结束后直接随机定向进化两个词条赋予玩家极度燃烧的Debuff,在燃烧阈值满后立刻造成25%的玩家最大血量伤害
*
* 第三阶段<100
* 火龙立刻获得1000护盾但失去攻击能力火龙试图逃离丛林利用纯晶集合体给的物品击中火龙四次火龙将被彻底击败并使用火龙之心净化丛林整场战斗结束
*
*
* 成就徽章
* 屠龙勇士击败丛林的真正罪魁祸首熔岩火龙
* 丛林英雄击败熔岩火龙并净化丛林
*
* 加密徽章
* 熔岩审判-在岩浆地块下给予火龙最后一击
*
* 后续剧情
* 1.纯晶元素将在后续丛林新档中变为中立不会主动攻击玩家
* 2.在下半段更新中会有额外剧情
* 3.在今后的旅程中
* 毒苹果将有概率变成奥克拉赫之花考验冒险者的意志
* */
public class LaveCavesBossLevel extends Level{
private static final short W = Terrain.WALL;
private static final short R = Terrain.WATER;
private static final short Y = Terrain.EMPTY;
private static final short V = Terrain.EMPTY_SP;
private static final short X = Terrain.ENTRANCE;
private static final short G = Terrain.HIGH_GRASS;
private static final short D = Terrain.SECRET_DOOR;
private static final short M = Terrain.WELL;
private static final short L= Terrain.PEDESTAL;
private static final int[] codedMap = {
W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,
W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,Y,W,W,W,W,W,W,W,
W,W,W,W,W,W,W,W,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,W,W,W,W,W,W,W,W,W,
W,W,W,W,W,W,R,R,R,R,R,R,R,R,R,R,R,R,R,R,Y,R,R,R,R,W,W,W,W,W,W,W,
W,W,W,W,R,R,R,R,R,R,R,R,R,R,Y,Y,R,R,Y,R,R,R,R,R,Y,W,W,W,W,W,W,W,
W,W,W,R,R,R,R,R,R,R,R,R,R,Y,G,Y,Y,Y,Y,R,R,R,R,Y,R,W,W,W,W,W,W,W,
W,W,W,R,R,R,R,R,R,R,R,R,Y,Y,Y,Y,Y,Y,Y,Y,R,R,R,R,R,W,W,W,W,W,W,W,
W,W,R,R,R,R,R,R,R,R,R,R,Y,Y,Y,Y,Y,R,R,Y,Y,R,R,R,Y,R,W,W,W,W,W,W,
W,W,R,R,R,R,R,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,R,R,R,Y,Y,Y,Y,Y,Y,R,R,W,W,W,W,
W,W,R,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,R,R,R,Y,Y,Y,Y,Y,R,R,R,W,W,W,W,
W,R,Y,Y,Y,Y,R,R,Y,Y,Y,Y,Y,Y,L,Y,Y,Y,R,R,Y,Y,Y,Y,Y,R,R,R,W,W,W,W,
W,R,Y,R,R,R,R,R,R,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,R,R,R,W,W,
W,Y,Y,R,R,R,R,R,R,R,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,R,R,Y,R,R,Y,Y,R,R,W,W,
W,Y,Y,R,R,R,R,R,R,R,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,R,R,R,R,R,R,Y,Y,R,R,W,W,
W,Y,R,R,R,R,Y,Y,R,R,R,R,Y,Y,Y,Y,Y,Y,Y,Y,R,R,R,R,R,R,R,Y,Y,R,W,W,
W,Y,R,R,R,R,R,Y,R,R,R,R,Y,Y,Y,Y,Y,Y,R,R,Y,Y,Y,R,R,R,R,Y,Y,R,W,W,
W,Y,R,R,R,R,R,Y,Y,R,R,R,Y,Y,Y,Y,Y,R,R,R,R,Y,R,R,R,R,R,Y,Y,R,W,W,
W,Y,R,R,R,R,R,R,Y,Y,R,R,Y,Y,Y,R,R,R,R,R,R,R,R,R,R,R,Y,Y,Y,R,W,W,
W,Y,Y,R,R,R,R,R,R,R,R,Y,Y,R,R,R,R,R,R,R,R,R,R,R,R,R,Y,Y,Y,Y,W,W,
W,R,Y,R,R,R,R,Y,R,R,R,R,R,R,R,R,R,R,Y,R,R,R,R,R,R,Y,Y,Y,R,W,W,W,
W,R,Y,Y,R,R,Y,Y,Y,R,R,R,R,R,R,Y,Y,Y,Y,R,R,R,R,R,Y,Y,Y,R,R,W,W,W,
W,R,R,Y,Y,Y,Y,Y,Y,R,R,Y,R,R,Y,R,R,R,R,Y,R,R,R,Y,Y,Y,R,R,R,W,W,W,
W,R,R,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,R,R,R,R,R,R,Y,Y,Y,R,R,R,W,W,W,W,W,
W,R,R,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,R,R,R,R,R,Y,Y,R,R,R,R,W,W,W,W,W,
W,W,R,R,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,R,R,R,R,Y,Y,Y,Y,Y,Y,W,W,W,W,W,
W,W,W,R,R,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,W,W,W,W,W,W,W,W,W,
W,W,W,R,R,R,Y,Y,R,R,Y,Y,Y,X,Y,Y,Y,Y,W,W,W,W,D,W,W,W,W,W,W,W,W,W,
W,W,W,W,R,R,Y,Y,R,R,R,R,Y,Y,Y,Y,Y,Y,W,W,W,W,Y,Y,G,G,Y,R,R,G,W,W,
W,W,W,W,W,R,R,Y,R,R,R,R,R,Y,Y,Y,Y,W,W,W,W,W,Y,G,Y,G,Y,Y,Y,Y,W,W,
W,W,W,W,W,W,R,R,Y,R,R,R,R,R,Y,Y,Y,W,W,W,W,W,Y,Y,R,R,R,Y,M,Y,W,W,
W,W,W,W,W,W,W,W,W,R,Y,R,R,R,Y,Y,Y,W,W,W,W,W,Y,Y,Y,Y,Y,Y,Y,Y,W,W,
W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,
};
/**
* @return
*/
@Override
protected boolean build() {
setSize(32, 32);
map = codedMap.clone();
CustomTilemap vis = new townBehind();
vis.pos(0, 0);
customTiles.add(vis);
//((GameScene) RPD.scene()).addCustomTile(vis);
CustomTilemap via = new townAbove();
via.pos(0, 0);
customTiles.add(via);
buildFlagMaps();
cleanWalls();
entrance = 32*15 + 23;
return true;
}
public static class townBehind extends CustomTilemap {
{
texture = Assets.Environment.LAVACAVE_OP;
tileW = 32;
tileH = 32;
}
final int TEX_WIDTH = 32*16;
@Override
public Tilemap create() {
Tilemap v = super.create();
int[] data = mapSimpleImage(0, 0, TEX_WIDTH);
v.map(data, tileW);
return v;
}
}
public static class townAbove extends CustomTilemap {
{
texture = Assets.Environment.LAVACAVE_PO;
tileW = 32;
tileH = 32;
}
final int TEX_WIDTH = 32*16;
@Override
public Tilemap create() {
Tilemap v = super.create();
int[] data = mapSimpleImage(0, 0, TEX_WIDTH);
v.map(data, tileW);
return v;
}
}
@Override
public String tilesTex() {
return Assets.Environment.TILES_FIRE;
}
@Override
public String waterTex() {
return Assets.Environment.WATER_HALLS;
}
/**
*
*/
@Override
protected void createMobs() {
}
/**
*
*/
@Override
protected void createItems() {
}
}

View File

@ -58,6 +58,8 @@ public class Terrain {
public static final int ALCHEMY = 28; public static final int ALCHEMY = 28;
public static final int WATER = 29; public static final int WATER = 29;
public static final int LAVA = 30;
public static final int PASSABLE = 0x01; public static final int PASSABLE = 0x01;
public static final int LOS_BLOCKING = 0x02; public static final int LOS_BLOCKING = 0x02;
@ -75,6 +77,7 @@ public class Terrain {
flags[GRASS] = PASSABLE | FLAMABLE; flags[GRASS] = PASSABLE | FLAMABLE;
flags[EMPTY_WELL] = PASSABLE; flags[EMPTY_WELL] = PASSABLE;
flags[WATER] = PASSABLE | LIQUID; flags[WATER] = PASSABLE | LIQUID;
flags[LAVA] = AVOID | PIT | LIQUID;
flags[WALL] = LOS_BLOCKING | SOLID; flags[WALL] = LOS_BLOCKING | SOLID;
flags[DOOR] = PASSABLE | LOS_BLOCKING | FLAMABLE | SOLID; flags[DOOR] = PASSABLE | LOS_BLOCKING | FLAMABLE | SOLID;
flags[OPEN_DOOR] = PASSABLE | FLAMABLE; flags[OPEN_DOOR] = PASSABLE | FLAMABLE;

View File

@ -25,6 +25,9 @@ import static com.shatteredpixel.shatteredpixeldungeon.items.Generator.randomArt
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NxhyNpc; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NxhyNpc;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Nyz; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Nyz;
@ -39,6 +42,8 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.Stylus; import com.shatteredpixel.shatteredpixeldungeon.items.Stylus;
import com.shatteredpixel.shatteredpixeldungeon.items.food.Pasty; import com.shatteredpixel.shatteredpixeldungeon.items.food.Pasty;
import java.util.List;
public class ZeroLevel extends Level { public class ZeroLevel extends Level {
private static final int[] pre_map = {190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 161, 4, 4, 4, 0, 0, 4, 0, 0, 0, 2, 0, 161, 190, 0, 0, 0, 0, 0, 0, 0, 190, 161, 0, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 161, 190, 190, 0, 4, 16, 4, 0, 0, 4, 0, 0, 0, 2, 0, 0, 190, 0, 0, 0, 0, 0, 0, 0, 190, 0, 2, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 0, 4, 0, 4, 0, 0, 4, 0, 2, 0, 2, 0, 2, 190, 0, 0, 4, 4, 0, 0, 0, 190, 2, 2, 2, 2, 2, 2, 2, 4, 0, 0, 0, 0, 0, 190, 190, 0, 4, 0, 4, 0, 0, 4, 0, 0, 2, 2, 2, 0, 190, 0, 4, 0, 1, 4, 0, 0, 190, 0, 2, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 0, 4, 0, 4, 0, 0, 4, 0, 0, 0, 2, 0, 0, 190, 0, 4, 2, 3, 4, 0, 0, 190, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 0, 4, 0, 4, 0, 0, 4, 4, 4, 4, 4, 4, 4, 80, 4, 4, 4, 4, 4, 4, 4, 80, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 190, 190, 0, 4, 0, 4, 0, 0, 4, 0, 1, 4, 0, 0, 0, 190, 0, 4, 0, 1, 4, 0, 0, 190, 0, 0, 0, 4, 0, 0, 0, 1, 4, 4, 4, 4, 4, 190, 190, 0, 4, 4, 4, 0, 0, 4, 2, 3, 4, 0, 0, 0, 190, 0, 4, 2, 3, 4, 0, 0, 190, 0, 0, 0, 4, 0, 1, 1, 1, 4, 0, 0, 0, 0, 190, 190, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 0, 0, 0, 190, 0, 0, 4, 4, 0, 0, 0, 190, 0, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 190, 190, 0, 0, 0, 0, 2, 0, 4, 0, 0, 0, 0, 0, 0, 190, 0, 0, 0, 4, 0, 0, 0, 190, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 2, 2, 2, 2, 2, 2, 4, 0, 0, 0, 0, 0, 0, 190, 0, 0, 4, 0, 4, 0, 0, 190, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 0, 0, 0, 0, 2, 0, 4, 0, 0, 0, 0, 0, 0, 190, 0, 4, 0, 4, 0, 4, 0, 190, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 161, 0, 0, 2, 0, 0, 4, 0, 0, 0, 0, 0, 161, 190, 4, 0, 0, 0, 0, 0, 4, 190, 161, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 161, 190, 190, 190, 190, 190, 190, 190, 190, 80, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 80, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 80, 190, 190, 190, 190, 190, 190, 190, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 4, 190, 123, 123, 123, 123, 123, 123, 123, 190, 4, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 0, 0, 4, 0, 1, 4, 4, 0, 0, 0, 0, 4, 0, 190, 123, 98, 4, 10, 4, 98, 123, 190, 0, 4, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 0, 0, 4, 2, 3, 4, 4, 0, 0, 0, 4, 0, 0, 190, 123, 4, 0, 85, 0, 4, 123, 190, 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 0, 80, 123, 10, 85, 17, 85, 10, 123, 80, 0, 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 190, 190, 0, 1, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 190, 123, 4, 0, 85, 0, 4, 123, 190, 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 2, 3, 4, 0, 0, 0, 4, 0, 0, 0, 0, 4, 0, 190, 123, 98, 4, 10, 4, 98, 123, 190, 0, 4, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 4, 4, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 4, 190, 123, 123, 123, 123, 123, 123, 123, 190, 4, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 190, 190, 190, 190, 190, 190, 80, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 80, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 80, 190, 190, 190, 190, 190, 190, 190, 124, 124, 124, 124, 124, 124, 4, 124, 124, 124, 124, 124, 124, 190, 4, 0, 0, 0, 0, 0, 4, 190, 161, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 161, 190, 190, 124, 124, 124, 124, 124, 124, 4, 124, 124, 124, 124, 124, 124, 190, 0, 4, 0, 4, 0, 4, 0, 190, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 124, 124, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 190, 0, 0, 4, 0, 4, 0, 0, 190, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 190, 190, 124, 124, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 190, 0, 0, 0, 4, 0, 0, 0, 190, 0, 0, 0, 0, 4, 0, 1, 4, 0, 1, 4, 0, 0, 190, 190, 124, 124, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 190, 0, 0, 0, 4, 0, 0, 0, 190, 0, 0, 0, 0, 4, 2, 3, 4, 2, 3, 4, 0, 0, 190, 190, 124, 124, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 80, 4, 4, 4, 4, 4, 4, 4, 80, 4, 4, 4, 4, 4, 4, 4, 19, 4, 4, 4, 4, 4, 190, 190, 124, 124, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 190, 0, 0, 0, 4, 0, 0, 0, 190, 0, 0, 2, 0, 4, 0, 1, 4, 0, 1, 4, 0, 0, 190, 190, 124, 124, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 190, 4, 4, 4, 4, 4, 4, 4, 190, 0, 0, 2, 0, 4, 2, 3, 4, 2, 3, 4, 0, 0, 190, 190, 124, 124, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 190, 4, 0, 1, 4, 0, 1, 4, 190, 0, 0, 2, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 190, 190, 124, 124, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 190, 4, 2, 3, 4, 2, 3, 4, 190, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 124, 124, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 190, 4, 4, 4, 4, 4, 4, 4, 190, 2, 0, 2, 0, 2, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 190, 0, 0, 0, 4, 0, 0, 0, 190, 0, 2, 2, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 190, 0, 0, 0, 4, 0, 0, 0, 190, 161, 0, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 161, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190}; private static final int[] pre_map = {190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 161, 4, 4, 4, 0, 0, 4, 0, 0, 0, 2, 0, 161, 190, 0, 0, 0, 0, 0, 0, 0, 190, 161, 0, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 161, 190, 190, 0, 4, 16, 4, 0, 0, 4, 0, 0, 0, 2, 0, 0, 190, 0, 0, 0, 0, 0, 0, 0, 190, 0, 2, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 0, 4, 0, 4, 0, 0, 4, 0, 2, 0, 2, 0, 2, 190, 0, 0, 4, 4, 0, 0, 0, 190, 2, 2, 2, 2, 2, 2, 2, 4, 0, 0, 0, 0, 0, 190, 190, 0, 4, 0, 4, 0, 0, 4, 0, 0, 2, 2, 2, 0, 190, 0, 4, 0, 1, 4, 0, 0, 190, 0, 2, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 0, 4, 0, 4, 0, 0, 4, 0, 0, 0, 2, 0, 0, 190, 0, 4, 2, 3, 4, 0, 0, 190, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 0, 4, 0, 4, 0, 0, 4, 4, 4, 4, 4, 4, 4, 80, 4, 4, 4, 4, 4, 4, 4, 80, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 190, 190, 0, 4, 0, 4, 0, 0, 4, 0, 1, 4, 0, 0, 0, 190, 0, 4, 0, 1, 4, 0, 0, 190, 0, 0, 0, 4, 0, 0, 0, 1, 4, 4, 4, 4, 4, 190, 190, 0, 4, 4, 4, 0, 0, 4, 2, 3, 4, 0, 0, 0, 190, 0, 4, 2, 3, 4, 0, 0, 190, 0, 0, 0, 4, 0, 1, 1, 1, 4, 0, 0, 0, 0, 190, 190, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 0, 0, 0, 190, 0, 0, 4, 4, 0, 0, 0, 190, 0, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 190, 190, 0, 0, 0, 0, 2, 0, 4, 0, 0, 0, 0, 0, 0, 190, 0, 0, 0, 4, 0, 0, 0, 190, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 2, 2, 2, 2, 2, 2, 4, 0, 0, 0, 0, 0, 0, 190, 0, 0, 4, 0, 4, 0, 0, 190, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 0, 0, 0, 0, 2, 0, 4, 0, 0, 0, 0, 0, 0, 190, 0, 4, 0, 4, 0, 4, 0, 190, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 161, 0, 0, 2, 0, 0, 4, 0, 0, 0, 0, 0, 161, 190, 4, 0, 0, 0, 0, 0, 4, 190, 161, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 161, 190, 190, 190, 190, 190, 190, 190, 190, 80, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 80, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 80, 190, 190, 190, 190, 190, 190, 190, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 4, 190, 123, 123, 123, 123, 123, 123, 123, 190, 4, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 0, 0, 4, 0, 1, 4, 4, 0, 0, 0, 0, 4, 0, 190, 123, 98, 4, 10, 4, 98, 123, 190, 0, 4, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 0, 0, 4, 2, 3, 4, 4, 0, 0, 0, 4, 0, 0, 190, 123, 4, 0, 85, 0, 4, 123, 190, 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 0, 80, 123, 10, 85, 17, 85, 10, 123, 80, 0, 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 190, 190, 0, 1, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 190, 123, 4, 0, 85, 0, 4, 123, 190, 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 2, 3, 4, 0, 0, 0, 4, 0, 0, 0, 0, 4, 0, 190, 123, 98, 4, 10, 4, 98, 123, 190, 0, 4, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 4, 4, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 4, 190, 123, 123, 123, 123, 123, 123, 123, 190, 4, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 190, 190, 190, 190, 190, 190, 80, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 80, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 80, 190, 190, 190, 190, 190, 190, 190, 124, 124, 124, 124, 124, 124, 4, 124, 124, 124, 124, 124, 124, 190, 4, 0, 0, 0, 0, 0, 4, 190, 161, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 161, 190, 190, 124, 124, 124, 124, 124, 124, 4, 124, 124, 124, 124, 124, 124, 190, 0, 4, 0, 4, 0, 4, 0, 190, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 124, 124, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 190, 0, 0, 4, 0, 4, 0, 0, 190, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 190, 190, 124, 124, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 190, 0, 0, 0, 4, 0, 0, 0, 190, 0, 0, 0, 0, 4, 0, 1, 4, 0, 1, 4, 0, 0, 190, 190, 124, 124, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 190, 0, 0, 0, 4, 0, 0, 0, 190, 0, 0, 0, 0, 4, 2, 3, 4, 2, 3, 4, 0, 0, 190, 190, 124, 124, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 80, 4, 4, 4, 4, 4, 4, 4, 80, 4, 4, 4, 4, 4, 4, 4, 19, 4, 4, 4, 4, 4, 190, 190, 124, 124, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 190, 0, 0, 0, 4, 0, 0, 0, 190, 0, 0, 2, 0, 4, 0, 1, 4, 0, 1, 4, 0, 0, 190, 190, 124, 124, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 190, 4, 4, 4, 4, 4, 4, 4, 190, 0, 0, 2, 0, 4, 2, 3, 4, 2, 3, 4, 0, 0, 190, 190, 124, 124, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 190, 4, 0, 1, 4, 0, 1, 4, 190, 0, 0, 2, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 190, 190, 124, 124, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 190, 4, 2, 3, 4, 2, 3, 4, 190, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 124, 124, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 190, 4, 4, 4, 4, 4, 4, 4, 190, 2, 0, 2, 0, 2, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 190, 0, 0, 0, 4, 0, 0, 0, 190, 0, 2, 2, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 190, 190, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 190, 0, 0, 0, 4, 0, 0, 0, 190, 161, 0, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 161, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190};
@ -121,11 +126,18 @@ public class ZeroLevel extends Level {
drop( new Pasty(), this.width * 20 + 19 ); drop( new Pasty(), this.width * 20 + 19 );
if ( Badges.isUnlocked(Badges.Badge.GODD_MAKE)){ PaswordBadges.loadGlobal();
List<PaswordBadges.Badge> passwordbadges = PaswordBadges.filtered( true );
if(passwordbadges.contains(PaswordBadges.Badge.GODD_MAKE)){
drop( ( Generator.randomUsingDefaults( Generator.Category.RING ) ), this.width * 17 + 18 ); drop( ( Generator.randomUsingDefaults( Generator.Category.RING ) ), this.width * 17 + 18 );
} }
if ( Badges.isUnlocked(Badges.Badge.BIG_X)){ if(passwordbadges.contains(PaswordBadges.Badge.BIG_X)){
drop( ( Generator.randomUsingDefaults( Generator.Category.ARMOR ) ), this.width * 19 + 18 ); if(Dungeon.isChallenged(Challenges.NO_ARMOR)){
drop( ( Generator.randomUsingDefaults( Generator.Category.WAND ) ), this.width * 19 + 18 );
} else {
drop( ( Generator.randomUsingDefaults( Generator.Category.ARMOR ) ), this.width * 19 + 18 );
}
} }
if ( Badges.isUnlocked(Badges.Badge.KILL_DM720)||Badges.isUnlocked(Badges.Badge.KILL_MG) ){ if ( Badges.isUnlocked(Badges.Badge.KILL_DM720)||Badges.isUnlocked(Badges.Badge.KILL_MG) ){
drop(( Generator.randomUsingDefaults( Generator.Category.WEP_T2 )), this.width * 18 + 17 ); drop(( Generator.randomUsingDefaults( Generator.Category.WEP_T2 )), this.width * 18 + 17 );

View File

@ -0,0 +1,156 @@
/*
* Pixel Dungeon
* Copyright (C) 2012-2015 Oleg Dolya
*
* Shattered Pixel Dungeon
* Copyright (C) 2014-2023 Evan Debenham
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package com.shatteredpixel.shatteredpixeldungeon.levels.features;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.watabou.utils.Bundlable;
import com.watabou.utils.Bundle;
import com.watabou.utils.Point;
import com.watabou.utils.Random;
import com.watabou.utils.Rect;
public class LevelTransition extends Rect implements Bundlable {
public enum Type {
SURFACE,
REGULAR_ENTRANCE,
REGULAR_EXIT,
BRANCH_ENTRANCE,
BRANCH_EXIT;
}
public Type type;
public int destDepth;
public int destBranch;
public Type destType;
public int centerCell;
//for bundling
public LevelTransition(){
super();
}
public LevelTransition(Level level, int cell, Type type, int destDepth, int destBranch, Type destType){
centerCell = cell;
Point p = level.cellToPoint(cell);
set(p.x, p.y, p.x, p.y);
this.type = type;
this.destDepth = destDepth;
this.destBranch = destBranch;
this.destType = destType;
}
//gives default values for common transition types
public LevelTransition(Level level, int cell, Type type){
centerCell = cell;
Point p = level.cellToPoint(cell);
set(p.x, p.y, p.x, p.y);
this.type = type;
switch (type){
case REGULAR_ENTRANCE: default:
destDepth = Dungeon.depth-1;
destBranch = Dungeon.branch;
destType = Type.REGULAR_EXIT;
break;
case REGULAR_EXIT:
destDepth = Dungeon.depth+1;
destBranch = Dungeon.branch;
destType = Type.REGULAR_ENTRANCE;
break;
case SURFACE:
destDepth = 0;
destBranch = 0;
destType = null;
break;
}
}
//note that the center cell isn't always the actual center.
// It is important when game logic needs to pick a specific cell for some action
// e.g. where to place the hero
public int cell(){
return centerCell;
}
//Transitions are inclusive to their right and bottom sides
@Override
public int width() {
return super.width()+1;
}
@Override
public int height() {
return super.height()+1;
}
@Override
public boolean inside(Point p) {
return p.x >= left && p.x <= right && p.y >= top && p.y <= bottom;
}
public boolean inside(int cell){
return inside(new Point(Dungeon.level.cellToPoint(cell)));
}
public Point center() {
return new Point(
(left + right) / 2 + (((right - left) % 2) == 1 ? Random.Int( 2 ) : 0),
(top + bottom) / 2 + (((bottom - top) % 2) == 1 ? Random.Int( 2 ) : 0) );
}
public static final String TYPE = "type";
public static final String DEST_DEPTH = "dest_depth";
public static final String DEST_BRANCH = "dest_branch";
public static final String DEST_TYPE = "dest_type";
@Override
public void storeInBundle(Bundle bundle) {
bundle.put( "left", left );
bundle.put( "top", top );
bundle.put( "right", right );
bundle.put( "bottom", bottom );
bundle.put( "center", centerCell );
bundle.put(TYPE, type);
bundle.put(DEST_DEPTH, destDepth);
bundle.put(DEST_BRANCH, destBranch);
bundle.put(DEST_TYPE, destType);
}
@Override
public void restoreFromBundle(Bundle bundle) {
left = bundle.getInt( "left" );
top = bundle.getInt( "top" );
right = bundle.getInt( "right" );
bottom = bundle.getInt( "bottom" );
centerCell = bundle.getInt( "center" );
type = bundle.getEnum(TYPE, Type.class);
destDepth = bundle.getInt(DEST_DEPTH);
destBranch = bundle.getInt(DEST_BRANCH);
if (bundle.contains(DEST_TYPE)) destType = bundle.getEnum(DEST_TYPE, Type.class);
}
}

View File

@ -21,6 +21,7 @@
package com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special; package com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.Gold; import com.shatteredpixel.shatteredpixeldungeon.items.Gold;
@ -150,7 +151,8 @@ public class CrystalPathRoom extends SpecialRoom {
item = new LamellarArmor(); item = new LamellarArmor();
} else { } else {
item = Generator.random(Random.oneOf( item = Generator.random(Random.oneOf(
Generator.Category.ARMOR, Dungeon.isChallenged(Challenges.NO_ARMOR) ? Generator.Category.WAND :
Generator.Category.ARMOR,
Generator.Category.STONE, Generator.Category.STONE,
Generator.Category.WAND, Generator.Category.WAND,
Generator.Category.ARTIFACT) Generator.Category.ARTIFACT)

View File

@ -12,7 +12,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mimic;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.SRPDHBLR; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.SRPDHBLR;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.Gold;
import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
@ -83,8 +82,7 @@ public class EyeRoom extends SpecialRoom {
int chestPos = (top + 6) * level.width() + left + 6; int chestPos = (top + 6) * level.width() + left + 6;
/** 套五个宝箱 */ /** 套4个宝箱 */
level.drop( new Gold(),chestPos).type = Heap.Type.TELECRYSTL;
level.mobs.add(Mimic.spawnAt(chestPos,( Generator.randomUsingDefaults( Generator.Category.POTION ) ), CrystalMimic.class)); level.mobs.add(Mimic.spawnAt(chestPos,( Generator.randomUsingDefaults( Generator.Category.POTION ) ), CrystalMimic.class));
level.mobs.add(Mimic.spawnAt(chestPos,( Generator.randomUsingDefaults( Generator.Category.SCROLL ) ), CrystalMimic.class)); level.mobs.add(Mimic.spawnAt(chestPos,( Generator.randomUsingDefaults( Generator.Category.SCROLL ) ), CrystalMimic.class));
level.mobs.add(Mimic.spawnAt(chestPos,( Generator.randomUsingDefaults( Generator.Category.WEAPON ) ), level.mobs.add(Mimic.spawnAt(chestPos,( Generator.randomUsingDefaults( Generator.Category.WEAPON ) ),

View File

@ -8,6 +8,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.keys.CrystalKey; import com.shatteredpixel.shatteredpixeldungeon.items.keys.CrystalKey;
import com.shatteredpixel.shatteredpixeldungeon.items.keys.IronKey;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLevitation; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLevitation;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
@ -120,7 +121,8 @@ public class YinYangRoom extends SpecialRoom {
if(Dungeon.depth == 1){ if(Dungeon.depth == 1){
door.set(Door.Type.REGULAR); door.set(Door.Type.REGULAR);
} else { } else {
door.set(Door.Type.HIDDEN); level.addItemToSpawn( new IronKey( Dungeon.depth ) );
door.set(Door.Type.LOCKED);
} }
} }

View File

@ -53,8 +53,6 @@ public class Messages {
return lang; return lang;
} }
/** /**
* Setup Methods * Setup Methods
*/ */

View File

@ -96,8 +96,8 @@ public class CellSelector extends ScrollArea {
} }
} }
//then mobs Mob[] mobs = Dungeon.level.mobs.toArray(new Mob[0]);
for (Char mob : Dungeon.level.mobs.toArray(new Mob[0])){ for (Char mob : mobs) {
if (mob.sprite != null && mob.sprite.overlapsPoint( p.x, p.y )){ if (mob.sprite != null && mob.sprite.overlapsPoint( p.x, p.y )){
PointF c = DungeonTilemap.tileCenterToWorld(mob.pos); PointF c = DungeonTilemap.tileCenterToWorld(mob.pos);
if (Math.abs(p.x - c.x) <= 12 && Math.abs(p.y - c.y) <= 12) { if (Math.abs(p.x - c.x) <= 12 && Math.abs(p.y - c.y) <= 12) {
@ -106,6 +106,16 @@ public class CellSelector extends ScrollArea {
} }
} }
} }
//then mobs
// for (Char mob : Dungeon.level.mobs.toArray(new Mob[0])){
// if (mob.sprite != null && mob.sprite.overlapsPoint( p.x, p.y )){
// PointF c = DungeonTilemap.tileCenterToWorld(mob.pos);
// if (Math.abs(p.x - c.x) <= 12 && Math.abs(p.y - c.y) <= 12) {
// select(mob.pos, event.button);
// return;
// }
// }
// }
//then heaps //then heaps
for (Heap heap : Dungeon.level.heaps.valueList()){ for (Heap heap : Dungeon.level.heaps.valueList()){

View File

@ -33,6 +33,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Chrome;
import com.shatteredpixel.shatteredpixeldungeon.Conducts; import com.shatteredpixel.shatteredpixeldungeon.Conducts;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.GamesInProgress; import com.shatteredpixel.shatteredpixeldungeon.GamesInProgress;
import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges;
import com.shatteredpixel.shatteredpixeldungeon.Rankings; import com.shatteredpixel.shatteredpixeldungeon.Rankings;
import com.shatteredpixel.shatteredpixeldungeon.SPDSettings; import com.shatteredpixel.shatteredpixeldungeon.SPDSettings;
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
@ -120,6 +121,7 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.StyledButton;
import com.shatteredpixel.shatteredpixeldungeon.ui.Tag; import com.shatteredpixel.shatteredpixeldungeon.ui.Tag;
import com.shatteredpixel.shatteredpixeldungeon.ui.TargetHealthIndicator; import com.shatteredpixel.shatteredpixeldungeon.ui.TargetHealthIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.Toast; import com.shatteredpixel.shatteredpixeldungeon.ui.Toast;
import com.shatteredpixel.shatteredpixeldungeon.ui.ToobarV;
import com.shatteredpixel.shatteredpixeldungeon.ui.Toolbar; import com.shatteredpixel.shatteredpixeldungeon.ui.Toolbar;
import com.shatteredpixel.shatteredpixeldungeon.ui.Window; import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
@ -217,7 +219,8 @@ public class GameScene extends PixelScene {
private InventoryPane inventory; private InventoryPane inventory;
private static boolean invVisible = true; private static boolean invVisible = true;
private Toolbar toolbar; private ToobarV toolbar;
private Toolbar toolbarv1;
private Toast prompt; private Toast prompt;
private AttackIndicator attack; private AttackIndicator attack;
@ -414,19 +417,35 @@ public class GameScene extends PixelScene {
bringToFront(status); bringToFront(status);
} }
toolbar = new Toolbar(); /**Toolbar V1+V2 */
toolbar.camera = uiCamera; if(SPDSettings.quickSwapper()) {
add( toolbar ); toolbarv1 = new Toolbar();
toolbarv1.camera = uiCamera;
add(toolbarv1);
} else {
toolbar = new ToobarV();
toolbar.camera = uiCamera;
add( toolbar );
}
if (uiSize == 2) { if (uiSize == 2) {
inventory = new InventoryPane(); inventory = new InventoryPane();
inventory.camera = uiCamera; inventory.camera = uiCamera;
inventory.setPos(uiCamera.width - inventory.width(), uiCamera.height - inventory.height()); inventory.setPos(uiCamera.width - inventory.width(), uiCamera.height - inventory.height());
add(inventory); add(inventory);
if(SPDSettings.quickSwapper()) {
toolbar.setRect( 0, uiCamera.height - toolbar.height() - inventory.height(), uiCamera.width, toolbar.height() ); toolbarv1.setRect(0, uiCamera.height - toolbarv1.height() - inventory.height(), uiCamera.width,
toolbarv1.height());
} else {
toolbar.setRect(0, uiCamera.height - toolbar.height() - inventory.height(), uiCamera.width, toolbar.height());
}
} else { } else {
toolbar.setRect( 0, uiCamera.height - toolbar.height(), uiCamera.width, toolbar.height() ); if(SPDSettings.quickSwapper()) {
toolbarv1.setRect(0, uiCamera.height - toolbarv1.height(), uiCamera.width, toolbarv1.height());
} else {
toolbar.setRect(0, uiCamera.height - toolbar.height(), uiCamera.width, toolbar.height());
}
} }
layoutTags(); layoutTags();
@ -748,7 +767,7 @@ public class GameScene extends PixelScene {
scene = null; scene = null;
Badges.saveGlobal(); Badges.saveGlobal();
Journal.saveGlobal(); Journal.saveGlobal();
PaswordBadges.saveGlobal();
super.destroy(); super.destroy();
} }
@ -779,6 +798,7 @@ public class GameScene extends PixelScene {
try { try {
Dungeon.saveAll(); Dungeon.saveAll();
Badges.saveGlobal(); Badges.saveGlobal();
PaswordBadges.saveGlobal();
Journal.saveGlobal(); Journal.saveGlobal();
} catch (IOException e) { } catch (IOException e) {
ShatteredPixelDungeon.reportException(e); ShatteredPixelDungeon.reportException(e);
@ -935,7 +955,9 @@ public class GameScene extends PixelScene {
float invWidth = (scene.inventory != null && scene.inventory.visible) ? scene.inventory.width() : 0; float invWidth = (scene.inventory != null && scene.inventory.visible) ? scene.inventory.width() : 0;
float y = SPDSettings.interfaceSize() == 0 ? scene.toolbar.top()-2 : scene.status.top()-2; float y = SPDSettings.interfaceSize() == 0 ? SPDSettings.quickSwapper()? scene.toolbarv1.top()-2:
scene.toolbar.top()-2 :
scene.status.top()-2;
if (tagsOnLeft) { if (tagsOnLeft) {
scene.log.setRect(tagWidth, y, uiCamera.width - tagWidth - insets.right - invWidth, 0); scene.log.setRect(tagWidth, y, uiCamera.width - tagWidth - insets.right - invWidth, 0);
} else if (invWidth > 0) { } else if (invWidth > 0) {
@ -944,7 +966,7 @@ public class GameScene extends PixelScene {
scene.log.setRect(insets.left, y, uiCamera.width - tagWidth - insets.left, 0); scene.log.setRect(insets.left, y, uiCamera.width - tagWidth - insets.left, 0);
} }
float pos = scene.toolbar.top(); float pos = SPDSettings.quickSwapper()?scene.toolbarv1.top():scene.toolbar.top();
if (tagsOnLeft && SPDSettings.interfaceSize() > 0){ if (tagsOnLeft && SPDSettings.interfaceSize() > 0){
pos = scene.status.top(); pos = scene.status.top();
} }
@ -1190,7 +1212,13 @@ public class GameScene extends PixelScene {
} }
public static void pickUp( Item item, int pos ) { public static void pickUp( Item item, int pos ) {
if (scene != null) scene.toolbar.pickup( item, pos ); if (scene != null){
if (SPDSettings.quickSwapper()) {
scene.toolbarv1.pickup(item, pos);
} else {
scene.toolbar.pickup(item, pos);
}
}
} }
public static void pickUpJournal( Item item, int pos ) { public static void pickUpJournal( Item item, int pos ) {
@ -1308,10 +1336,19 @@ public class GameScene extends PixelScene {
if (scene != null && scene.inventory != null){ if (scene != null && scene.inventory != null){
if (scene.inventory.visible){ if (scene.inventory.visible){
scene.inventory.visible = scene.inventory.active = invVisible = false; scene.inventory.visible = scene.inventory.active = invVisible = false;
scene.toolbar.setPos(scene.toolbar.left(), uiCamera.height-scene.toolbar.height()); if(SPDSettings.quickSwapper()){
scene.toolbarv1.setPos(scene.toolbarv1.left(), uiCamera.height-scene.toolbarv1.height());
} else {
scene.toolbar.setPos(scene.toolbar.left(), uiCamera.height-scene.toolbar.height());
}
} else { } else {
scene.inventory.visible = scene.inventory.active = invVisible = true; scene.inventory.visible = scene.inventory.active = invVisible = true;
scene.toolbar.setPos(scene.toolbar.left(), scene.inventory.top()-scene.toolbar.height()); if(SPDSettings.quickSwapper()) {
scene.toolbarv1.setPos(scene.toolbarv1.left(), scene.inventory.top() - scene.toolbarv1.height());
} else {
scene.toolbar.setPos(scene.toolbar.left(), scene.inventory.top() - scene.toolbar.height());
}
} }
layoutTags(); layoutTags();
} }
@ -1605,7 +1642,18 @@ public class GameScene extends PixelScene {
selectCell( defaultCellListener ); selectCell( defaultCellListener );
QuickSlotButton.cancel(); QuickSlotButton.cancel();
InventoryPane.cancelTargeting(); InventoryPane.cancelTargeting();
if (scene != null && scene.toolbar != null) scene.toolbar.examining = false;
if(SPDSettings.quickSwapper()){
if (scene != null && scene.toolbarv1 != null){
scene.toolbarv1.examining = false;
}
} else {
if (scene != null && scene.toolbar != null){
scene.toolbar.examining = false;
}
}
} }
public static void checkKeyHold(){ public static void checkKeyHold(){

View File

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

View File

@ -183,13 +183,13 @@ public class NewsScene extends PixelScene {
protected void createChildren() { protected void createChildren() {
bg = Chrome.get(Chrome.Type.GREY_BUTTON_TR); bg = Chrome.get(Chrome.Type.GREY_BUTTON_TR);
add(bg); add(bg);
String message = ""; String message = "";
if (Messages.lang() != Languages.CHINESE){ if (Messages.lang() != Languages.CHINESE){
message += Messages.get(this, "english_warn"); message += Messages.get(this, "english_warn");
} }
if (!News.articlesAvailable()){ if (!News.articlesAvailable()){
if (SPDSettings.news()) { if (SPDSettings.news()) {
if (SPDSettings.WiFi() && !Game.platform.connectedToUnmeteredNetwork()) { if (SPDSettings.WiFi() && !Game.platform.connectedToUnmeteredNetwork()) {
@ -225,7 +225,7 @@ public class NewsScene extends PixelScene {
} }
if (message.startsWith("\n\n")) message = message.replaceFirst("\n\n", ""); if (message.startsWith("\n\n")) message = message.replaceFirst("\n\n", "");
text = PixelScene.renderTextBlock(message, 6); text = PixelScene.renderTextBlock(message, 6);
text.hardlight(CharSprite.WARNING); text.hardlight(CharSprite.WARNING);
add(text); add(text);
@ -270,7 +270,7 @@ public class NewsScene extends PixelScene {
icon(News.parseArticleIcon(article)); icon(News.parseArticleIcon(article));
long lastRead = SPDSettings.newsLastRead(); long lastRead = SPDSettings.newsLastRead();
if (lastRead > 0 && article.date.getTime() > lastRead) { if (lastRead > 0 && article.date.getTime() > lastRead) {
textColor(Window.TITLE_COLOR); textColor(Window.SHPX_COLOR);
} }
Calendar cal = Calendar.getInstance(); Calendar cal = Calendar.getInstance();
@ -325,12 +325,11 @@ public class NewsScene extends PixelScene {
ShatteredPixelDungeon.platform.openURI(link); ShatteredPixelDungeon.platform.openURI(link);
} }
}; };
link.setRect(0, height + 2, width, BTN_HEIGHT); link.setHeight(BTN_HEIGHT);
add(link); addToBottom(link);
resize(width, (int) link.bottom());
} }
} }
} }

View File

@ -0,0 +1,147 @@
package com.shatteredpixel.shatteredpixeldungeon.scenes;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges;
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
import com.shatteredpixel.shatteredpixeldungeon.effects.BadgeBanner;
import com.shatteredpixel.shatteredpixeldungeon.effects.PasswordBadgeBanner;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.Archs;
import com.shatteredpixel.shatteredpixeldungeon.ui.Button;
import com.shatteredpixel.shatteredpixeldungeon.ui.ExitButton;
import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock;
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndProBadge;
import com.watabou.noosa.Camera;
import com.watabou.noosa.Game;
import com.watabou.noosa.Image;
import com.watabou.noosa.audio.Music;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Random;
import java.util.List;
public class PassWordBadgesScene extends PixelScene {
@Override
public void create() {
super.create();
Music.INSTANCE.play( Assets.Music.THEME, true );
uiCamera.visible = false;
int w = Camera.main.width;
int h = Camera.main.height;
Archs archs = new Archs();
archs.setSize( w, h );
add( archs );
float left = 5;
float top = 20;
RenderedTextBlock title = PixelScene.renderTextBlock( Messages.get(this, "title"), 9 );
title.hardlight(Window.TITLE_COLOR);
title.setPos(
(w - title.width()) / 2f,
(top - title.height()) / 2f
);
align(title);
add(title);
PaswordBadges.loadGlobal();
List<PaswordBadges.Badge> badges = PaswordBadges.filtered( true );
int blankBadges = 8;
blankBadges -= badges.size();
if (badges.contains(Badges.Badge.ALL_ITEMS_IDENTIFIED)) blankBadges -= 6;
if (badges.contains(Badges.Badge.YASD)) blankBadges -= 5;
blankBadges = Math.max(0, blankBadges);
//guarantees a max of 5 rows in landscape, and 8 in portrait, assuming a max of 40 buttons
int nCols = landscape() ? 7 : 4;
if (badges.size() + blankBadges > 32 && !landscape()) nCols++;
int nRows = 1 + (blankBadges + badges.size())/nCols;
float badgeWidth = (w - 2*left)/nCols;
float badgeHeight = (h - 2*top)/nRows;
for (int i = 0; i < badges.size() + blankBadges; i++){
int row = i / nCols;
int col = i % nCols;
PaswordBadges.Badge b = i < badges.size() ? badges.get( i ) : null;
BadgeButton button = new BadgeButton( b );
button.setPos(
left + col * badgeWidth + (badgeWidth - button.width()) / 2,
top + row * badgeHeight + (badgeHeight - button.height()) / 2);
align(button);
add( button );
}
ExitButton btnExit = new ExitButton();
btnExit.setPos( Camera.main.width - btnExit.width(), 0 );
add( btnExit );
fadeIn();
}
@Override
public void destroy() {
Badges.saveGlobal();
super.destroy();
}
@Override
protected void onBackPressed() {
ShatteredPixelDungeon.switchNoFade( TitleScene.class );
}
private static class BadgeButton extends Button {
private PaswordBadges.Badge badge;
private Image icon;
public BadgeButton( PaswordBadges.Badge badge ) {
super();
this.badge = badge;
active = (badge != null);
icon = active ? PasswordBadgeBanner.image(badge.image) : new Image( Assets.Interfaces.LOCKED );
add(icon);
setSize( icon.width(), icon.height() );
}
@Override
protected void layout() {
super.layout();
icon.x = x + (width - icon.width()) / 2;
icon.y = y + (height - icon.height()) / 2;
}
@Override
public void update() {
super.update();
if (Random.Float() < Game.elapsed * 0.1) {
BadgeBanner.highlight( icon, badge.image );
}
}
@Override
protected void onClick() {
Sample.INSTANCE.play( Assets.Sounds.CLICK, 0.7f, 0.7f, 1.2f );
Game.scene().add( new WndProBadge( badge ) );
}
}
}

View File

@ -23,8 +23,10 @@ package com.shatteredpixel.shatteredpixeldungeon.scenes;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges;
import com.shatteredpixel.shatteredpixeldungeon.SPDSettings; import com.shatteredpixel.shatteredpixeldungeon.SPDSettings;
import com.shatteredpixel.shatteredpixeldungeon.effects.BadgeBanner; import com.shatteredpixel.shatteredpixeldungeon.effects.BadgeBanner;
import com.shatteredpixel.shatteredpixeldungeon.effects.PasswordBadgeBanner;
import com.shatteredpixel.shatteredpixeldungeon.messages.Languages; import com.shatteredpixel.shatteredpixeldungeon.messages.Languages;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock;
@ -147,12 +149,12 @@ public class PixelScene extends Scene {
renderedTextPageSize = 1024; renderedTextPageSize = 1024;
} }
//asian languages have many more unique characters, so increase texture size to anticipate that //asian languages have many more unique characters, so increase texture size to anticipate that
if //asian languages have many more unique characters, so increase texture size to anticipate that
(Messages.lang() == Languages.CHINESE || if (Messages.lang() == Languages.CHINESE ||
Messages.lang() == Languages.JAPANESE){ Messages.lang() == Languages.JAPANESE){
renderedTextPageSize *= 2; renderedTextPageSize *= 2;
} }
Game.platform.setupFontGenerators(renderedTextPageSize, false); Game.platform.setupFontGenerators(renderedTextPageSize, SPDSettings.systemFont());
Tooltip.resetLastUsedTime(); Tooltip.resetLastUsedTime();
@ -289,6 +291,31 @@ public class PixelScene extends Scene {
add( new Fader( color, light ) ); add( new Fader( color, light ) );
} }
public static void showProBadge( PaswordBadges.Badge badge ) {
Game.runOnRenderThread(new Callback() {
@Override
public void call() {
Scene s = Game.scene();
if (s != null) {
PasswordBadgeBanner banner = PasswordBadgeBanner.show(badge.image);
s.add(banner);
float offset = Camera.main.centerOffset.y;
int left = uiCamera.width/2 - PasswordBadgeBanner.SIZE/2;
left -= (PasswordBadgeBanner.SIZE * PasswordBadgeBanner.DEFAULT_SCALE * (PasswordBadgeBanner.showing.size()-1))/2;
for (int i = 0; i < PasswordBadgeBanner.showing.size(); i++){
banner = PasswordBadgeBanner.showing.get(i);
banner.camera = uiCamera;
banner.x = align(banner.camera, left);
banner.y = align(uiCamera, (uiCamera.height - banner.height) / 2 - banner.height / 2 - 16 - offset);
left += PasswordBadgeBanner.SIZE * PasswordBadgeBanner.DEFAULT_SCALE;
}
}
}
});
}
public static void showBadge( Badges.Badge badge ) { public static void showBadge( Badges.Badge badge ) {
Game.runOnRenderThread(new Callback() { Game.runOnRenderThread(new Callback() {
@Override @Override

View File

@ -202,6 +202,11 @@ public class TitleScene extends PixelScene {
protected void onClick() { protected void onClick() {
ShatteredPixelDungeon.switchNoFade(BadgesScene.class); ShatteredPixelDungeon.switchNoFade(BadgesScene.class);
} }
@Override
protected boolean onLongClick() {
ShatteredPixelDungeon.switchNoFade(PassWordBadgesScene.class);
return super.onLongClick();
}
}; };
btnBadges.icon(new ItemSprite(ItemSpriteSheet.GREENBOOKS, null)); btnBadges.icon(new ItemSprite(ItemSpriteSheet.GREENBOOKS, null));
add(btnBadges); add(btnBadges);

View File

@ -70,8 +70,10 @@ public class WelcomeScene extends PixelScene {
return; return;
} }
if (ShatteredPixelDungeon.versionCode == previousVersion && !SPDSettings.intro()) { if (ShatteredPixelDungeon.versionCode == previousVersion && !SPDSettings.intro() && !SPDSettings.firebase()) {
ShatteredPixelDungeon.switchNoFade(GameNewsScene.class); ShatteredPixelDungeon.switchNoFade(GameNewsScene.class);
} else {
ShatteredPixelDungeon.switchNoFade(TitleScene.class);
return; return;
} }

Some files were not shown because too many files have changed in this diff Show More