update beta21-p1.2

This commit is contained in:
LingASDJ 2022-09-25 12:27:19 +08:00
parent 9654542d1f
commit 4efd6e1a94
36 changed files with 538 additions and 599 deletions

View File

@ -84,6 +84,7 @@ dependencies {
// https://firebase.google.com/docs/android/setup#available-libraries
//noinspection GradleDependency
implementation "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"

View File

@ -50,7 +50,7 @@ public class AndroidGame extends AndroidApplication {
public static AndroidApplication instance;
private FirebaseAnalytics mFirebaseAnalytics;
private static AndroidPlatformSupport support;
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -88,11 +88,11 @@ public class AndroidGame extends AndroidApplication {
//UCEHandler.Builder builder = new UCEHandler.Builder(this);
//builder.build();
mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
if (SPDSettings.firebase()){
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true);
}
FirebaseCrashlytics.getInstance().setUserId(SPDSettings.customSeed());
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true);
} else {
@ -101,20 +101,21 @@ public class AndroidGame extends AndroidApplication {
//set desired orientation (if it exists) before initializing the app.
if (SPDSettings.landscape() != null) {
instance.setRequestedOrientation( SPDSettings.landscape() ?
instance.setRequestedOrientation(Boolean.TRUE.equals(SPDSettings.landscape()) ?
ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE :
ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT );
}
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
config.depth = 0;
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
//use rgb565 on ICS devices for better performance
config.r = 5;
config.g = 6;
config.b = 5;
}
// if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
// //use rgb565 on ICS devices for better performance
// config.r = 5;
// config.g = 6;
// config.b = 5;
// }
config.useCompass = false;
config.useAccelerometer = false;

View File

@ -17,7 +17,7 @@ allprojects {
appPackageName = 'com.ansdomagiclingpixeldungeon.ling'
appVersionCode =700720
appVersionName = '0.6.0.0-Beta21-p1'
appVersionName = '0.6.0.0-Beta21-p2'
appJavaCompatibility = JavaVersion.VERSION_1_8

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -294,6 +294,8 @@ actors.mobs.dimandking$dkmonk.rankings_desc=被钻石宝箱王说教至死
actors.mobs.dimandking$dkwarlock.rankings_desc=被钻石宝箱王说教至死
actors.mobs.dimandking.str_empower=认真模式开启!
actors.mobs.dimandking.wrning=钻石宝箱王:正在蓄力死亡射线,标记了一处地点……
actors.mobs.redlunar.name=死灵大师
actors.mobs.redlunar.desc=那些回忆花重金雇的保镖,你看来已经引起了他的注意。
actors.mobs.redlunar.notice=0元购

View File

@ -1,6 +1,6 @@
###MLPD
items.artifacts.goldiron.name=镀金铁
items.artifacts.goldiron.desc=待补充
items.artifacts.goldiron.name=镀金铁
items.artifacts.goldiron.desc=这曾是巨魔铁匠的锤子,其中蕴含了神奇的力量。\n\n因为你一不小心把巨魔镐子给搞丢了,巨魔委托你去杀死他的阴暗面。\n\n如今你已完成巨魔的委托这镀金铁锤便是巨魔给予你的礼物……
items.bombs.laserpython.name=激光十字晶柱召唤器
items.bombs.laserpython.desc=这枚召唤器会在爆炸后立刻生成一个十字晶柱。
@ -80,24 +80,15 @@ items.quest.shopdiedbook.name=诅咒之书
items.quest.shopdiedbook.chill=这层的警报已经拉响,离开这里,快!
items.quest.shopdiedbook.desc=当你准备抢劫的时候,商人向你丢了一本书,这本书蕴含了Γ诅咒的力量Γ的魔力,你无力将其扔掉,源源不断的Γ商人守卫军队Γ正在前来。你只能战斗!!!\n\n诅咒之书在身上时英雄将受到Γ移速减缓一半同时商店守卫军队将源源不断的出兵Γ来阻止你,你也无法离开本层。唯有击败Γ本层商店守卫首领Γ之后,才能解除诅咒之书的力量,获得店主的认可。\n\n_但同时店主会因为缺货问题在下一大层无法开设商店将在下下一大层重新恢复商店交易。_
items.quest.skeletongold.name=染血骷髅金币
items.quest.skeletongold.desc=在寒冰圣域发现的一枚刻有骷髅头的金币,沾染的血渍让这枚金币附着了能改变时空的魔力。抛动金币以扰动地牢的魔力流。
items.quest.skeletongold.ac_select_one=Δ抛动一次金币Δ
items.quest.skeletongold.ac_select_two=Π抛动两次金币Π
items.quest.skeletongold.ac_select_three=Ξ抛动三次金币Ξ
items.quest.skeletongold.ac_select_how=使用方法和介绍
items.quest.skeletongold.preventing=这里还没有寻找到强大的魔力流……
items.quest.skeletongold.wow=染血金币发出诡异的光芒,你感到下层正在分崩离析……
items.weapon.melee.endingblade.name=终焉
items.weapon.melee.endingblade.desc=不知道从哪来的一个拆开的场记板貌似沾染了焰之诅咒会随机产生_一种诅咒_有着强大的侵蚀能力一旦装备了它就无法脱身了……\n\n这个武器在攻击敌人的时候能吸收一定的浊焰能量,在汲取一定的浊焰能量后会产生新的能力以及自我升级。\n\n当前的浊焰能量:
items.weapon.melee.endingblade.desc_2=\n\n死亡宣告当前冷却值为:
items.weapon.melee.endingblade.desc_2=\n\n(通过打击敌人减掉)死亡宣告当前冷却值为:
items.weapon.melee.endingblade.cursed=当你装备上这个武器后,一股无形的力量将你束缚住……
items.weapon.melee.endingblade.donot_eqip=终焉的诅咒已经浸染你的身体,你无力脱下它。
items.weapon.melee.endingblade.procced=终焉:审判一切,归于虚无!!!
items.weapon.melee.endingblade.ac_lastcrystal=Γ激光晶柱Γ
items.weapon.melee.endingblade.ac_diedghost=✦死亡宣告✦
items.weapon.melee.endingblade.ac_healreset=_亡者归来_
items.weapon.melee.endingblade.ac_healreset=_千里追魂_
#MLPDSTOREYBOOKS
@ -2021,6 +2012,11 @@ items.amulet.ac_end=返回主城
items.amulet.rankings_desc=获得水晶之心,而危机仍在
items.amulet.desc=击败了古神后,你发现了水晶之心。但是,前面不再有前进的道路了。莫非,本次旅程已经宣告结束了吗?
items.jamulet.name=水晶之心
items.jamulet.ac_end=返回主城
items.jamulet.rankings_desc=获得水晶之心,而危机仍在
items.jamulet.desc=击败了古神后,你发现了水晶之心。但是,前面不再有前进的道路了。莫非,本次旅程已经宣告结束了吗?
items.ankh.name=重生十字架
items.ankh.ac_bless=祝福
items.ankh.bless=你用散发着治愈魔力的清水祝福了这枚重生十字架。

View File

@ -69,7 +69,9 @@ badges$badge.godd_make=老人与海\n累计完成老杖匠的全部任务\n\n_
badges$badge.clear_water=净化大师\n完成挑战:污泥浊水\n\n_奖励敬请期待_
badges$badge.ghostdage=幽灵大哥\n_在幽灵处获得一次+4品质武器或护甲\n\n_(镀层需求:+5品质武器)
//badges$badge.ghostdage=幽灵大哥\n在幽灵处获得一次_+5_品质武器或护甲\n\nΞ你已成功镀层Ξ
badges$badge.dageto=幽灵大哥\n在幽灵处获得一次_+5_品质武器或护甲\n\nΞ你已成功镀层Ξ
badges$badge.endied=终焉之旅\n\n_(获得终焉)_
badges$badge.halofire_died=死于磷火烈焰
badges$badge.happy_end=幸福结局
@ -116,10 +118,10 @@ challenges.champion_enemies_desc=会升级的不止你一个!\n\n・普通敌
的机率拥有特殊的精英属性。\n・精英敌人刷出时会立即醒来。\n・精英敌人免疫腐化效果。\n\n精英敌人有七种\n_烈焰橙色_ 近战伤害 \
+25% 且带有点燃效果,免疫火焰,死亡时引燃周围。\n_索敌紫色_ 近战伤害 +25%,近战范围 +8。\n_敌法绿色_ 受到伤害 -25%,拥有魔法免疫。\n_巨型蓝色_ 受到伤害 -75%,近战范围 +1无法进入门与过道。\n_祝福黄色_ 精准与躲避 +200%。\n_成长红色_ 精准、躲避、攻击伤害与有效生命值 +20%。每过 3 回合会再增长 1%。\n_鬼磷天蓝色_ 近战伤害 +65% 且带有磷火效果,免疫火焰与磷火,死亡时引燃周围。
challenges.stronger_bosses=Π梦魇Boss
challenges.stronger_bosses_desc=这项挑战让挑战 Boss 变得更有挑战性了!\n\n_粘咕_生命值 +20%\n_-_ 水中恢复量增长,每回合恢复 6 点生命\n_-_ 爆发攻击蓄力时间由 2 回合缩短至 1 回合\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_粘咕_生命值 +20%\n_-_ 水中恢复量增长,每回合恢复 3 点生命\n_-_ 爆发攻击蓄力时间由 2 回合缩短至 1 回合\n_天狗_生命 +25%\n_-_ 第一阶段:陷阱更加致命\n_-_ 第二阶段:技能频率更高\n_钻石宝箱王_: 生命+20% \n_-_ 整场战斗出现额外技能\n_DM-300_生命 +60%\n_-_ 能量塔更坚固。\n_-_ 技能频率更高,威力也更强大\n_-_ 超载时移动速度更高\n_-_ 击败时必掉落荆棘斗篷\n_矮人国王:_生命 +50%\n_-_ 整场战斗内召唤的随从都更强大\n_-_ 第一阶段:技能与召唤频率都更高\n_-_ 第二阶段:每轮额外召唤两个随从\n_-_ 第三阶段:生命值 +100%,召唤频率更高\n_Yog-Dzewa:_\n_-_ 同时召唤两个古神之拳!\n_-_ 激光攻击伤害 +60%\n_-_ 召唤更强大的随从
actors.char.aquaphobia=你受到了来自水的伤害!
challenges.pro=Δ开发者模式Δ
challenges.pro_desc=注解版?\n开局_几乎是全物品_同时你将无法通关
challenges.pro_desc=供测试和开发使用\n开局_几乎是全物品_同时你将无法通关也无法记录在排行榜上面。
challenges.traditional = 现实之声-T1挑战
challenges.hard = 梦境之声-T2挑战
challenges.warning = 寻觅之声-T3挑战
@ -143,5 +145,5 @@ dlc.bossrush_desc=被你击败过多次的首领们熟识了英雄的技能,
dlc.back_go=逆流而上
dlc.back_go_desc=颠倒的一次的冒险,你能顺利离开这里吗5大固定Boss则是在最终楼层出现。
ld=\n_冰雪魔女:_\n_-_生命+25%\n_-_ 水中召唤的仆从更多\n-击败时必定掉落紫金宝石护符\n_矮人大师:_\n_-_ 致命技能更加频繁\n_-_ 生命值+50%\n-击败时必定掉落自然神圣护符\n_史莱姆王:_\n_-_ 生命值+100%\n_-_ 伤害更高,速度更快\n_-_ 在开局额外召唤豺狼诡术师,巨钳螃蟹,腐臭老鼠,蚀化史莱姆\n_-_ 击败时必定掉落凝胶手套\n_DM720:_\n_-_ 获得全新技能\n_-_ 击败时必定掉落DM150控制终端[尚未完成]
kill=\n_冰雪魔女:_\n_-_生命+25%\n_-_ 水中召唤的仆从更多\n-击败时必定掉落紫金宝石护符\n_矮人大师:_\n_-_ 致命技能更加频繁\n_-_ 生命值+50%\n-击败时必定掉落自然神圣护符\n_史莱姆王:_\n_-_ 生命值+100%\n_-_ 伤害更高,速度更快\n_-_ 在开局额外召唤豺狼诡术师,巨钳螃蟹,腐臭老鼠,蚀化史莱姆\n_-_ 击败时必定掉落凝胶手套\n_DM720:_\n_-_ 获得全新技能\n_-_ 击败时必定掉落DM150控制终端[尚未完成]

View File

@ -465,4 +465,6 @@ ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x26=-1.修复了影子盗贼的崩溃
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x28=-1.修复了矮人大师的问题\n-2.修复了部分楼层的错误生成
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x29=-1.修复了不抢劫回归地牢也能获得东西的问题\n-2.修复了从雪凛峡谷回来后复活失效的问题
ui.changelist.mlpd.vm0_6_7_x_changes.bug_06x30=-1.修复了浊焰魔女的错误崩溃\n-2.修复了终焉的错误生成\n-3.红龙之王机制改变,老存档已无法加载,请重新开启新档
//ui.changelist.mlpd.vm0_5_x_changes.xxx//

View File

@ -2,6 +2,13 @@ windows.textchallenges.seed_custom_title = 种子
windows.textchallenges.hint = 不输入即为随机种子
windows.textchallenges.delete_seed_input = 清除
windows.wndtextinput.enter_key=输入你的QQ号
windows.wndgame.dialog_user=为了更好的在后续崩溃维护检查遇到一些问题请在这里Ξ输入你的QQ号Ξ如果开发者遇到问题将可能通过你的ID联系你询问详细崩溃情况。
windows.wndtextinput.yes=确认
windows.wndtextinput.no=稍后
windows.wndsettings$helptab.reset=重设你的用户ID
windows.wndsettings$helptab.title=辅助功能
windows.wndsettings$helptab.helpsettings=启用物品生成查询器

Binary file not shown.

View File

@ -110,6 +110,7 @@ public class Badges {
GODD_MAKE ( 82 ),
CLEAR_WATER ( 83 ),
GHOSTDAGE ( 84 ),
ENDIED ( 85 ),
//gold
PIRANHAS ( 64 ),
//these names are a bit outdated, but it doesn't really matter.
@ -165,6 +166,7 @@ public class Badges {
CHAMPION_4X ( 115 ),
CHAMPION_5X ( 116 ),
NYZ_SHOP ( 117 ),
DAGETO ( 118 ),
//rudy
FIREGIRL ( 128 ),
@ -380,6 +382,21 @@ public class Badges {
displayBadge( badge );
}
public static void GhostDageCollected() {
Badge badge = null;
if (!local.contains( Badge.GHOSTDAGE ) && Statistics.naiyaziCollected == 1) {
badge = Badge.GHOSTDAGE;
local.add( badge );
}
if (!local.contains( Badge.DAGETO ) && Statistics.naiyaziCollected >= 2) {
addGlobal(badge);
badge = Badge.DAGETO;
}
local.add(badge);
displayBadge( badge );
}
public static void validateLevelReached() {
Badge badge = null;
@ -555,6 +572,14 @@ public class Badges {
validateYASD();
}
public static void ENDDIED() {
Badge badge = Badge.ENDIED;
local.add( badge );
displayBadge( badge );
validateYASD();
}
public static void DeathRedNercols() {
Badge badge = Badge.DEATH_FROM_FIRE;
local.add( badge );

View File

@ -35,7 +35,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll;
import com.shatteredpixel.shatteredpixeldungeon.journal.Notes;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton;
import com.watabou.noosa.Game;
import com.watabou.utils.Bundlable;
import com.watabou.utils.Bundle;
import com.watabou.utils.FileUtils;
@ -61,6 +60,10 @@ public enum Rankings {
public void submit( boolean win, Class cause ) {
if(Dungeon.isChallenged(Challenges.PRO)){
return;
}
load();
Record rec = new Record();

View File

@ -37,9 +37,19 @@ import java.util.Locale;
public class SPDSettings extends GameSettings {
//Version info
public static final String KEY_AUTH_KEY = "net_auth_key";
public static final String KEY_CUSTOM_SEED = "Your_Key";
public static final String KEY_CUSTOM_LING = "Your_Key";
public static void customSeed( String value ){
put( KEY_CUSTOM_SEED, value );
}
public static String customSeed() {
return getString( KEY_CUSTOM_SEED, KEY_CUSTOM_LING, 20);
}
public static final String KEY_VERSION = "version";
public static String DEFAULT_KEY = "debug";
public static void quickslots( int value ){
put( KEY_QUICKSLOTS, value );
}

View File

@ -33,6 +33,11 @@ import com.watabou.utils.PlatformSupport;
public class ShatteredPixelDungeon extends Game {
public TitleScene net;
public static TitleScene net(){
return ((ShatteredPixelDungeon)instance).net;
}
private static String log = "";
public static void appendLog(String string) {
log += "\n\n" + string;

View File

@ -55,6 +55,12 @@ public class Statistics {
public static boolean deadshoppingdied = false;
public static boolean wangzheguilai = false;
public static boolean endingbald = false;
public static int dageCollected;
//Directly add float time will cause accuracy lose and stop timing if time is long enough
//so use long to record seconds, float to count sub-seconds.
//SPD-V1.3.2-ITEM SPAWN CODE
@ -89,6 +95,8 @@ public class Statistics {
fireGirlnoshopping = false;
deadshoppingdied = false;
wangzheguilai = false;
endingbald = false;
second_elapsed = 0f;
real_seconds = 0;
@ -121,6 +129,10 @@ public class Statistics {
private static final String SHOPPINGDIED = "deadshoppingdied";
private static final String WZGL = "wangzheguilai";
private static final String ENBR = "endingbald";
private static final String EXLEVEL = "Exlevel";
public static void storeInBundle( Bundle bundle ) {
@ -148,6 +160,8 @@ public class Statistics {
bundle.put( SHOPPINGDIED, deadshoppingdied );
bundle.put( WZGL, wangzheguilai );
//SPD
bundle.put("real_time_passed", second_elapsed);
bundle.put("real_seconds_passed", real_seconds);
@ -178,6 +192,8 @@ public class Statistics {
fireGirlnoshopping = bundle.getBoolean( NOSHOPPING );
deadshoppingdied = bundle.getBoolean( SHOPPINGDIED );
wangzheguilai = bundle.getBoolean( WZGL );
//SPD
second_elapsed = bundle.getFloat("real_time_passed");
real_seconds = bundle.getLong("real_seconds_passed");

View File

@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.hero;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.AQUAPHOBIA;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.LIGHTBLACK;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import static com.shatteredpixel.shatteredpixeldungeon.SPDSettings.HelpSettings;
import static com.shatteredpixel.shatteredpixeldungeon.levels.Level.set;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
@ -376,7 +377,7 @@ public class Hero extends Char {
pre.append("craft_vals_");
pre.append(csname);
int[] trys = bundle.getIntArray(pre.toString());
LinkedHashMap lname = new LinkedHashMap();
LinkedHashMap<String, Integer> lname = new LinkedHashMap<String, Integer>();
for(int lisx = 0; lisx < enus.length && lisx < trys.length; ++lisx) {
lname.put(enus[lisx], trys[lisx]);
@ -495,7 +496,13 @@ public class Hero extends Char {
}
Buff.affect( this, Regeneration.class );
Buff.affect( this, Hunger.class );
Buff.affect(this, GameTracker.class);
if(HelpSettings()) {
Buff.affect(this, GameTracker.class);
} {
//Do Stauff
}
}
public int tier() {

View File

@ -57,14 +57,13 @@ import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClothArmor;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.ChaliceOfBlood;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.CloakOfShadows;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.EtherealChains;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.GoldIron;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.MasterThievesArmband;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TalismanOfForesight;
import com.shatteredpixel.shatteredpixeldungeon.items.bags.BookBag;
import com.shatteredpixel.shatteredpixeldungeon.items.bags.HerbBag;
import com.shatteredpixel.shatteredpixeldungeon.items.bags.KingBag;
import com.shatteredpixel.shatteredpixeldungeon.items.bags.VelvetPouch;
import com.shatteredpixel.shatteredpixeldungeon.items.bombs.LaserPython;
import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.BrokenBooks;
import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.DeepBloodBooks;
import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.GrassKingBooks;
@ -78,7 +77,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.food.MeatPie;
import com.shatteredpixel.shatteredpixeldungeon.items.food.PotionOfLightningShiled;
import com.shatteredpixel.shatteredpixeldungeon.items.lightblack.OilLantern;
import com.shatteredpixel.shatteredpixeldungeon.items.lightblack.OilPotion;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.AlchemicalCatalyst;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfExperience;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfInvisibility;
@ -119,6 +117,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.BlackDog;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Dagger;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.EndingBlade;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.FireFishSword;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Gauntlet;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Gloves;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.GreenSword;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.IceFishSword;
@ -177,12 +176,11 @@ public enum HeroClass {
if (Dungeon.isChallenged(Challenges.PRO)){
new FrozenCarpaccio().quantity(11).identify().collect();
new FireFishSword().quantity(1).identify().collect();
new LaserPython().quantity(100).identify().collect();
new PotionOfInvisibility().quantity(45).identify().collect();
new LockSword().quantity(1).identify().collect();
Buff.affect(hero, ChampionHero.AntiMagic.class, 50000f);
new AlchemicalCatalyst().quantity(45).identify().collect();
new EtherealChains().quantity(1).identify().collect();
new Gauntlet().quantity(1).identify().collect();
new GoldIron().quantity(1).identify().collect();
new ScrollOfIdentify().quantity(45).identify().collect();
new ScrollOfTransmutation().quantity(45).identify().collect();
new BeaconOfReturning().quantity(11).identify().collect();

View File

@ -1,5 +1,7 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.STRONGER_BOSSES;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
@ -22,6 +24,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Flare;
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.effects.TargetedCell;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.EnergyParticle;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.HalomethaneFlameParticle;
@ -43,9 +46,12 @@ import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.MimicSprite;
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.Game;
import com.watabou.noosa.audio.Sample;
import com.watabou.noosa.particles.Emitter;
import com.watabou.utils.Bundle;
@ -63,8 +69,7 @@ public class DimandKing extends Boss {
initBaseStatus(14, 23, 33, 22, 200, 5, 12);
initStatus(120);
properties.add(Property.UNDEAD);
HP=250;
HT=250;
HP = HT = Dungeon.isChallenged(STRONGER_BOSSES) ? 320 : 250;
}
private int phase = 1;
@ -95,6 +100,8 @@ public class DimandKing extends Boss {
private static final String ABILITY_CD = "ability_cd";
private static final String LAST_ABILITY = "last_ability";
private static final String TARGETED_CELLS = "targeted_cells";
@Override
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
@ -104,6 +111,13 @@ public class DimandKing extends Boss {
bundle.put( ABILITY_CD, abilityCooldown );
bundle.put( LAST_ABILITY, lastAbility );
bundle.put("wavePhase2", wave);
//暴力Boss
int[] bundleArr = new int[targetedCells.size()];
for (int i = 0; i < targetedCells.size(); i++){
bundleArr[i] = targetedCells.get(i);
}
bundle.put(TARGETED_CELLS, bundleArr);
}
@Override
@ -117,6 +131,13 @@ public class DimandKing extends Boss {
wave = bundle.getInt("wavePhase2");
if (phase == 2) properties.add(Property.IMMOVABLE);
//暴力Boss
int[] bundleArr = new int[targetedCells.size()];
for (int i = 0; i < targetedCells.size(); i++){
bundleArr[i] = targetedCells.get(i);
}
bundle.put(TARGETED_CELLS, bundleArr);
}
private void resetChanceMap(){
@ -333,6 +354,9 @@ public class DimandKing extends Boss {
if (bestPos != enemy.pos) ScrollOfTeleportation.appear(furthest, bestPos);
yell(Messages.get(this, "teleport_" + Random.IntRange(1, 2)));
if(Dungeon.isChallenged(STRONGER_BOSSES)) {
doYogLasers();
}
return true;
}
return false;
@ -347,12 +371,18 @@ public class DimandKing extends Boss {
}
new Flare(5, 32).color(0xFF6060, false).show(sprite, 1.5f);
yell(Messages.get(this,"buff_all"));
if(Dungeon.isChallenged(STRONGER_BOSSES)) {
doYogLasers();
}
}
private void sacrificeSubject(){
Buff.affect(this, SacrificeSubjectListener.class, 3f);
new Flare(6, 32).color(0xFF22FF, false).show(sprite, 1.5f);
yell(Messages.get(this, "sacrifice"));
if(Dungeon.isChallenged(STRONGER_BOSSES)) {
doYogLasers();
}
}
private void deathRattleSubject(){
@ -370,6 +400,9 @@ public class DimandKing extends Boss {
}
new Flare(7, 32).color(0x303030, false).show(sprite, 1.5f);
yell(Messages.get(this,"death_rattle"));
if(Dungeon.isChallenged(STRONGER_BOSSES)) {
doYogLasers();
}
}
private void extraSummonSubject(){
@ -378,6 +411,9 @@ public class DimandKing extends Boss {
summonSubject(3);
summonsMade++;
yell(Messages.get(this, "more_summon"));
if(Dungeon.isChallenged(STRONGER_BOSSES)) {
doYogLasers();
}
new Flare(4, 32).color(0x4040FF, false).show(sprite, 1.5f);
}
@ -949,4 +985,77 @@ public class DimandKing extends Boss {
return super.attachTo(target);
}
}
private static final int MIN_ABILITY_CD = 7;
private int lastHeroPos;
private static final int MAX_ABILITY_CD = 12;
private ArrayList<Integer> targetedCells = new ArrayList<>();
public void doYogLasers(){
boolean terrainAffected = false;
HashSet<Char> affected = new HashSet<>();
//delay fire on a rooted hero
if (!enemy.rooted) {
for (int i : targetedCells) {
Ballistica b = new Ballistica(i, lastHeroPos, Ballistica.WONT_STOP);
//shoot beams
sprite.parent.add(new Beam.DeathRayS(DungeonTilemap.raisedTileCenterToWorld(i),
DungeonTilemap.raisedTileCenterToWorld(b.collisionPos)));
for (int p : b.path) {
Char ch = Actor.findChar(p);
if (ch != null && (ch.alignment != alignment || ch instanceof Bee)) {
affected.add(ch);
}
if (Dungeon.level.flamable[p]) {
Dungeon.level.destroy(p);
GameScene.updateMap(p);
terrainAffected = true;
}
}
}
if (terrainAffected) {
Dungeon.observe();
}
for (Char ch : affected) {
ch.damage(Random.NormalIntRange(30, 50), new Eye.DeathGaze());
if (Dungeon.level.heroFOV[pos]) {
ch.sprite.flash();
CellEmitter.center(pos).burst(Speck.factory(Speck.COIN), Random.IntRange(2, 3));
}
if (!ch.isAlive() && ch == Dungeon.hero) {
Dungeon.fail(getClass());
GLog.n(Messages.get(Char.class, "kill", name()));
}
}
targetedCells.clear();
}
if (abilityCooldown <= 0 && HP < HT*0.8f){
lastHeroPos = enemy.pos;
int beams = (int) (4 + (HP * 1.0f / HT)*4);
for (int i = 0; i < beams; i++){
int randompos = Random.Int(Dungeon.level.width()) + Dungeon.level.width()*2;
targetedCells.add(randompos);
}
for (int i : targetedCells){
Ballistica b = new Ballistica(i, Dungeon.hero.pos, Ballistica.WONT_STOP);
for (int p : b.path){
Game.scene().addToFront(new TargetedCell(p, Window.TITLE_COLOR));
}
}
spend(TICK*1.5f);
Dungeon.hero.interrupt();
GLog.p(Messages.get(DimandKing.class, "wrning", name()));
abilityCooldown += Random.NormalFloat(MIN_ABILITY_CD - 2*(1 - (HP * 1f / HT)), MAX_ABILITY_CD - 5*(1 - (HP * 1f / HT)));
} else {
spend(TICK);
}
if (abilityCooldown > 0) abilityCooldown--;
}
}

View File

@ -26,6 +26,7 @@ import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.level;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.Statistics;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Freezing;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness;
@ -33,6 +34,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
import com.shatteredpixel.shatteredpixeldungeon.effects.Lightning;
import com.shatteredpixel.shatteredpixeldungeon.effects.Splash;
import com.shatteredpixel.shatteredpixeldungeon.items.Gold;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfFrost;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlame;
import com.shatteredpixel.shatteredpixeldungeon.items.quest.Embers;
@ -40,12 +42,14 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRecharging
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTransmutation;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.CursedWand;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Shocking;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.EndingBlade;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ElementalSprite;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Bundle;
import com.watabou.utils.PathFinder;
import com.watabou.utils.Random;
import java.util.ArrayList;
@ -217,6 +221,27 @@ public abstract class Elemental extends Mob {
}
}
@Override
public void die(Object cause) {
super.die(cause);
//机会
int blobs = Random.chances(new float[]{0, 1, 0, 1, 0});
if(!Statistics.endingbald) {
for (int i = 0; i < blobs; i++) {
int ofs;
do {
ofs = PathFinder.NEIGHBOURS8[Random.NormalIntRange(1,1)];
} while (!Dungeon.level.passable[pos + ofs]);
Dungeon.level.drop(new EndingBlade(), pos + ofs).sprite.drop(pos);
Badges.ENDDIED();
Statistics.endingbald = true;
}
} else {
Dungeon.level.drop(new Gold().quantity(Random.Int(90, 120)), pos).sprite.drop();
}
}
@Override
protected void rangedProc( Char enemy ) {
if (!level.water[enemy.pos]) {
@ -249,6 +274,9 @@ public abstract class Elemental extends Mob {
public void die(Object cause) {
super.die(cause);
if (alignment == Alignment.ENEMY) Dungeon.level.drop( new Embers(), pos ).sprite.drop();
//机会
Badges.KILL_COLDELE();
}

View File

@ -22,11 +22,9 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LifeLink;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ShopLimitLock;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Bee;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.BlackHost;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ColdGurad;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.DM100;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Eye;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Monk;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.SRPDICLRPRO;
@ -43,7 +41,6 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.Flare;
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.effects.TargetedCell;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.EnergyParticle;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.PurpleParticle;
@ -56,7 +53,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMappi
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade;
import com.shatteredpixel.shatteredpixeldungeon.levels.ShopBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
@ -66,7 +62,6 @@ import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.Camera;
import com.watabou.noosa.Game;
import com.watabou.noosa.audio.Music;
import com.watabou.noosa.audio.Sample;
import com.watabou.noosa.particles.Emitter;
@ -357,7 +352,6 @@ public class FireMagicDied extends Mob implements Callback {
@Override
public boolean act() {
if (phase == 1 && HP <= 350) {
doYogLasers();
actScanning();
if (Dungeon.level.water[pos] && HP < HT) {
HP += healInc;
@ -549,7 +543,7 @@ public class FireMagicDied extends Mob implements Callback {
Sample.INSTANCE.play( Assets.Sounds.DEBUFF );
}
int dmg = Random.NormalIntRange( 12, 18 );
int dmg = Random.NormalIntRange( 2, 4 );
for (Mob mob : Dungeon.level.mobs.toArray( new Mob[0] )) {
if(Random.NormalIntRange(0,9)<4) {
@ -690,8 +684,6 @@ public class FireMagicDied extends Mob implements Callback {
LockedFloor lock = Dungeon.hero.buff(LockedFloor.class);
if (lock != null) lock.addTime(dmg*2);
super.damage(dmg, src);
if (phase == 1) {
int dmgTaken = preHP - HP;
abilityCooldown -= dmgTaken/8f;
@ -702,7 +694,7 @@ public class FireMagicDied extends Mob implements Callback {
}
//properties.add(Property.IMMOVABLE);
ScrollOfTeleportation.appear(this, ShopBossLevel.throneling);
doYogLasers();
//doYogLasers();
sprite.centerEmitter().start( Speck.factory( Speck.SCREAM ), 0.4f, 2 );
Sample.INSTANCE.play( Assets.Sounds.CHALLENGE );
phase = 2;
@ -742,7 +734,6 @@ public class FireMagicDied extends Mob implements Callback {
sprite.showStatus(0xff0000, Messages.get(this, "dead"));
} else if (phase == 3 && preHP > 80 && HP <= 80){
doYogLasers();
yell( Messages.get(this, "losing") );
}
@ -752,12 +743,15 @@ public class FireMagicDied extends Mob implements Callback {
GameScene.flash(0x80FFFFFF);
}
}
super.damage(dmg, src);
}
@Override
public void die( Object cause ) {
super.die( cause );
ShatteredPixelDungeon.seamlessResetScene();
Dungeon.level.drop(new BackGoKey().quantity(1).identify(), pos).sprite.drop();
Dungeon.level.drop(new ScrollOfMagicMapping().quantity(1).identify(), pos).sprite.drop();
Dungeon.level.drop(new ScrollOfUpgrade().quantity(3).identify(), pos).sprite.drop();
@ -984,7 +978,7 @@ public class FireMagicDied extends Mob implements Callback {
}
} else {
if (((FireMagicDied)target).phase == 2 && HP > 300){
target.damage(10, new FireMagicDied.KingDamager());
target.damage(30, new FireMagicDied.KingDamager());
}
}
@ -1139,97 +1133,6 @@ public class FireMagicDied extends Mob implements Callback {
}
}
//Next Level 4
public void doYogLasers(){
boolean terrainAffected = false;
HashSet<Char> affected = new HashSet<>();
//delay fire on a rooted hero
if (!enemy.rooted) {
for (int i : targetedCells) {
Ballistica b = new Ballistica(i, lastHeroPos, Ballistica.WONT_STOP);
//shoot beams
sprite.parent.add(new Beam.DeathRayS(DungeonTilemap.raisedTileCenterToWorld(i),
DungeonTilemap.raisedTileCenterToWorld(b.collisionPos)));
for (int p : b.path) {
Char ch = Actor.findChar(p);
if (ch != null && (ch.alignment != alignment || ch instanceof Bee)) {
affected.add(ch);
}
if (Dungeon.level.flamable[p]) {
Dungeon.level.destroy(p);
GameScene.updateMap(p);
terrainAffected = true;
}
}
}
if (terrainAffected) {
Dungeon.observe();
}
for (Char ch : affected) {
ch.damage(Random.NormalIntRange(60, 121), new Eye.DeathGaze());
if (Dungeon.level.heroFOV[pos]) {
ch.sprite.flash();
CellEmitter.center(pos).burst(Speck.factory(Speck.COIN), Random.IntRange(2, 3));
}
if (!ch.isAlive() && ch == Dungeon.hero) {
Dungeon.fail(getClass());
GLog.n(Messages.get(Char.class, "kill", name()));
}
}
targetedCells.clear();
}
if (abilityCooldown <= 0 && HP < HT*0.8f){
lastHeroPos = enemy.pos;
int beams = (int) (4 + (HP * 1.0f / HT)*4);
for (int i = 0; i < beams; i++){
int randompos = Random.Int(Dungeon.level.width()) + Dungeon.level.width()*2;
targetedCells.add(randompos);
}
for (int i : targetedCells){
Ballistica b = new Ballistica(i, Dungeon.hero.pos, Ballistica.WONT_STOP);
for (int p : b.path){
Game.scene().addToFront(new TargetedCell(p, 0xFF0000));
}
}
spend(TICK*1.5f);
Dungeon.hero.interrupt();
abilityCooldown += Random.NormalFloat(MIN_ABILITY_CD - 2*(1 - (HP * 1f / HT)), MAX_ABILITY_CD - 5*(1 - (HP * 1f / HT)));
} else {
spend(TICK);
}
if (abilityCooldown > 0) abilityCooldown--;
}
@Override
public void move(int step) {
super.move(step);
Camera.main.shake( 1, 0.25f );
if(HP < 250) {
if (Dungeon.level.map[step] == Terrain.WATER && state == HUNTING) {
Buff.affect(this, DwarfMaster.DKBarrior.class).setShield(50);
if (Dungeon.level.water[pos] && HP < HT) {
if (Dungeon.level.heroFOV[pos]) {
sprite.emitter().burst(Speck.factory(Speck.HEALING), 1);
}
if (HP * 2 == HT) {
BossHealthBar.bleed(false);
}
HP++;
}
}
}
}
//亡魂显现
public static class ColdGuradA extends ColdGurad {
{
@ -1332,7 +1235,7 @@ public class FireMagicDied extends Mob implements Callback {
super.detach();
for (Mob m : Dungeon.level.mobs.toArray(new Mob[0])){
if (m instanceof FireMagicDied ){
m.damage(10, this);
m.damage(30, this);
}
}
}

View File

@ -24,7 +24,9 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs;
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.Statistics;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.FetidRat;
@ -327,10 +329,18 @@ public class Ghost extends NPC {
hero.sprite.showStatus( CharSprite.NEGATIVE, "+3!!!" );
} else if (itemLevelRoll < 0.95f){
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);

View File

@ -35,11 +35,12 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor;
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.artifacts.Artifact;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.BlizzardBrew;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.Brew;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.CausticBrew;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.InfernalBrew;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.ShockingBrew;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ExoticScroll;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfAffection;
@ -237,7 +238,7 @@ public class RedDragon extends NPC {
public static Ring weapon;
public static Ring RingT;
public static Artifact armor;
public static Armor food;
public static Brew food;
public static ExoticScroll scrolls;
public static Weapon.Enchantment enchant;
@ -308,7 +309,7 @@ public class RedDragon extends NPC {
weapon = (Ring)node.get( WEAPON );
armor = (Artifact) node.get( ARMOR );
food = (Armor) node.get( FOOD );
food = (Brew) node.get( FOOD );
scrolls = (ExoticScroll) node.get( SCROLLS );
if (node.contains(ENCHANT)) {
@ -341,10 +342,10 @@ public class RedDragon extends NPC {
//5
switch (Random.chances(new float[]{0, 0, 10, 6, 3, 1})){
default:
case 2: food = new LeatherArmor(); break;
case 3: food = new MailArmor(); break;
case 4: food = new ScaleArmor(); break;
case 5: food = new PlateArmor(); break;
case 2: food = new BlizzardBrew(); break;
case 3: food = new CausticBrew(); break;
case 4: food = new InfernalBrew(); break;
case 5: food = new ShockingBrew(); break;
}
//TODO Fixed Ring Spawn;

View File

@ -14,7 +14,9 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.Artifact;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.Brew;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ExoticScroll;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
import com.shatteredpixel.shatteredpixeldungeon.levels.RegularLevel;
@ -88,6 +90,8 @@ public class GameTracker extends Buff {
if(m instanceof RedDragon){
appendDesc(RedDragon.Quest.weapon, info, "QUEST_REWARD");
appendDesc(RedDragon.Quest.armor, info, "QUEST_REWARD");
appendDesc(RedDragon.Quest.food, info, "QUEST_REWARD");
appendDesc(RedDragon.Quest.scrolls, info, "QUEST_REWARD");
}
if(m instanceof Imp){
appendDesc(Imp.Quest.reward, info, "QUEST_REWARD");
@ -101,12 +105,12 @@ public class GameTracker extends Buff {
if(item != null) {
if (
((item instanceof Weapon || item instanceof Armor) && item.level() > 0)
|| (item instanceof Ring || item instanceof Wand || item instanceof Artifact)
|| (item instanceof Ring || item instanceof Wand || item instanceof Artifact || item instanceof ExoticScroll|| item instanceof Brew)
) {
String name = item.trueName();
int index = name.indexOf('+');
if(index > 0){
name = name.substring(0, index - 3);
name = name.substring(0, index - 1);
}
info.append(prefix).append(name).append('+').append(item.level()).append(item.cursed ? " CURSED\n" : "\n");
}

View File

@ -365,6 +365,7 @@ public class Generator {
WEP_T2.probs = new float[]{ 6, 5, 5, 4, 4 };
WEP_T3.classes = new Class<?>[]{
Gauntlet.class,
Sword.class,
Mace.class,
Scimitar.class,
@ -374,9 +375,9 @@ public class Generator {
SkyShield.class,
Dairikyan.class,
GreenSword.class,
LockSword.class,
};
WEP_T3.probs = new float[]{ 6, 5, 5, 4, 0, 4 ,3,8,0,7};
WEP_T3.probs = new float[]{ 1, 5, 5, 4, 0, 4 ,3,8,0,4};
WEP_T4.classes = new Class<?>[]{
Longsword.class,
@ -390,12 +391,13 @@ public class Generator {
WEP_T4.probs = new float[]{ 6, 5, 5, 4, 4, 4, 3 };
WEP_T5.classes = new Class<?>[]{
LockSword.class,
Greatsword.class,
WarHammer.class,
Glaive.class,
Greataxe.class,
Greatshield.class,
Gauntlet.class
Greatshield.class
};
WEP_T5.probs = new float[]{ 6, 5, 5, 4, 4, 4 };

View File

@ -8,7 +8,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfEnergy;
@ -16,10 +15,8 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndOptions;
import com.watabou.noosa.audio.Sample;
import com.watabou.noosa.particles.Emitter;
import com.watabou.utils.Bundle;
@ -37,11 +34,12 @@ public class GoldIron extends Artifact {
charge = 5+level();
partialCharge = 0;
chargeCap = 5+level();
defaultAction = AC_ACTIVATE;
}
public static final String AC_ACTIVATE = "ACTIVATE";
public static final String AC_STONETOGOLD = "stonegold";
public static final String AC_ONEDINGYI = "onedingyi";
public static final String AC_CONDONTXA = "condontxa";
//keeps track of generated sandbags.
public int sandBags = 0;
@ -50,7 +48,9 @@ public class GoldIron extends Artifact {
public ArrayList<String> actions(Hero hero ) {
ArrayList<String> actions = super.actions( hero );
if (isEquipped( hero ) && !cursed && (charge > 0 || activeBuff != null)) {
actions.add(AC_ACTIVATE);
actions.add(AC_STONETOGOLD);
actions.add(AC_ONEDINGYI);
actions.add(AC_CONDONTXA);
}
return actions;
}
@ -60,46 +60,12 @@ public class GoldIron extends Artifact {
super.execute(hero, action);
if (action.equals(AC_ACTIVATE)){
if (action.equals(AC_STONETOGOLD)){
if (!isEquipped( hero )) GLog.i( Messages.get(Artifact.class, "need_to_equip") );
else if (activeBuff != null) {
if (activeBuff instanceof GoldIron.timeStasis) { //do nothing
} else {
activeBuff.detach();
GLog.i( Messages.get(this, "deactivate") );
}
} else if (charge <= 0) GLog.i( Messages.get(this, "no_charge") );
else if (cursed) GLog.i( Messages.get(this, "cursed") );
else GameScene.show(
new WndOptions(new ItemSprite(this),
Messages.titleCase(name()),
Messages.get(this, "prompt"),
Messages.get(this, "stasis"),
Messages.get(this, "freeze")) {
@Override
protected void onSelect(int index) {
if (index == 0) {
GLog.i( Messages.get(GoldIron.class, "onstasis") );
GameScene.flash(0x80FFFFFF);
Sample.INSTANCE.play(Assets.Sounds.TELEPORT);
} else if (action.equals(AC_ONEDINGYI)) {
activeBuff = new GoldIron.timeStasis();
Talent.onArtifactUsed(Dungeon.hero);
activeBuff.attachTo(Dungeon.hero);
} else if (index == 1) {
GLog.i( Messages.get(GoldIron.class, "onfreeze") );
GameScene.flash(0x80FFFFFF);
Sample.INSTANCE.play(Assets.Sounds.TELEPORT);
} else if (action.equals(AC_CONDONTXA)) {
activeBuff = new GoldIron.timeFreeze();
Talent.onArtifactUsed(Dungeon.hero);
activeBuff.attachTo(Dungeon.hero);
((GoldIron.timeFreeze)activeBuff).processTime(0f);
}
}
}
);
}
}

View File

@ -3,51 +3,32 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.Statistics;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barrier;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Chill;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corrosion;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Doom;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Drowsy;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Frost;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hex;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicalSleep;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Ooze;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ScrollEmpower;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Slow;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.SoulMark;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Weakness;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Bee;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mimic;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Eye;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Piranha;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Statue;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Swarm;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Wraith;
import com.shatteredpixel.shatteredpixeldungeon.custom.utils.BallisticaReal;
import com.shatteredpixel.shatteredpixeldungeon.effects.Beam;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NPC;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.PurpleParticle;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShaftParticle;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TalismanOfForesight;
import com.shatteredpixel.shatteredpixeldungeon.items.bombs.LaserPython;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRecharging;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfMagicMissile;
@ -67,12 +48,9 @@ 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.Point;
import com.watabou.utils.PointF;
import com.watabou.utils.Random;
import java.util.ArrayList;
import java.util.HashMap;
public class EndingBlade extends Weapon {
@ -134,7 +112,9 @@ public class EndingBlade extends Weapon {
//每100点浊焰能量自动升级
@Override
public int level() {
return fireenergy/100;
int level = Dungeon.hero == null ? 0 : fireenergy/100;
if (Dungeon.hero == null) level += 1;
return level;
}
private int TIME_TO_DIED = 0;
public void execute( Hero hero, String action ) {
@ -142,14 +122,14 @@ public class EndingBlade extends Weapon {
switch (action) {
case AC_LASERCRYSTAL:
if(level >= 4 && firstx){
if(level >= 3 && firstx){
firstx = false;
new LaserPython().quantity(1).identify().collect();
GLog.n("你突然感觉你的背包鼓鼓的……");
} else if(!firstx) {
GLog.n("你尚未使用激光晶柱,无法继续使用");
} else {
GLog.n("等级不足");
GLog.n("等级不足需求等级为3");
}
break;
case AC_DIEDGHOST:
@ -157,15 +137,37 @@ public class EndingBlade extends Weapon {
curUser = hero;
curItem = this;
GameScene.selectCell(zapper);
TIME_TO_DIED = 20;
} else if (TIME_TO_DIED != 0) {
GLog.n("道具正在冷却");
GLog.n("技能正在冷却");
} else {
GLog.n("等级不足");
GLog.n("等级不足,需求等级为5");
}
break;
case AC_HEALRESET:
GLog.w("3");
if(level >= 7 && 0.30f >= (float)(hero.HP/hero.HT) && !Statistics.wangzheguilai) {
//0.30f >= (float)(hero.HP/hero.HT)
PotionOfHealing.cure( hero );
hero.belongings.uncurseEquipped();
hero.buff( Hunger.class ).satisfy( Hunger.STARVING );
hero.HP = hero.HT;
hero.sprite.emitter().start( Speck.factory( Speck.HEALING ), 0.4f, 4 );
CellEmitter.get( hero.pos ).start( ShaftParticle.FACTORY, 0.2f, 3 );
Dungeon.hero.interrupt();
GLog.p( Messages.get(this, "procced") );
Statistics.wangzheguilai = true;
cursed = false;
for(Mob mob : Dungeon.level.mobs.toArray(new Mob[0])){
if (!(mob instanceof NPC) ) {
mob.damage( Random.NormalIntRange( 30*(level/5), 50*(level/5) ), new Eye.DeathGaze() );
}
}
} else if(Statistics.wangzheguilai) {
GLog.n("你本局已经使用千里追魂,无法再次使用。");
} else if(level < 7) {
GLog.n("你的等级尚未达到7级以上打败更多的怪物鲜血会让你的武器变得更强……");
} else if(0.30f <= (float)(hero.HP/hero.HT)) {
GLog.n("你的血量尚未低于30%,无法使用");
}
break;
}
}
@ -311,21 +313,7 @@ public class EndingBlade extends Weapon {
curUser.spendAndNext( TIME_TO_ZAP );
}
protected int nReflections(int level){
//return Math.min(2+level/3, 5);
return 5;
}
protected float reflectionDamageFactor(int reflections){
return 1f+0.1f*reflections*reflections;
}
public void onZap( Ballistica beam ) {
int count = 0;
for(BallisticaReal b: beams){
onZapX(b, count);
++count;
}
Char ch = Actor.findChar(beam.collisionPos);
if (ch != null){
@ -336,104 +324,13 @@ public class EndingBlade extends Weapon {
Mob enemy = (Mob) ch;
float corruptingPower = 3 + buffedLvl()/2f;
AllyBuff.affectAndLoot(enemy, curUser, Corruption.class);
TIME_TO_DIED = 30;
//base enemy resistance is usually based on their exp, but in special cases it is based on other criteria
float enemyResist = 1 + enemy.EXP;
if (ch instanceof Mimic || ch instanceof Statue){
enemyResist = 1 + Dungeon.depth;
} else if (ch instanceof Piranha || ch instanceof Bee) {
enemyResist = 1 + Dungeon.depth/2f;
} else if (ch instanceof Wraith) {
//divide by 5 as wraiths are always at full HP and are therefore ~5x harder to corrupt
enemyResist = (1f + Dungeon.depth/3f) / 5f;
} else if (ch instanceof Swarm){
//child swarms don't give exp, so we force this here.
enemyResist = 1 + 3;
}
//100% health: 5x resist 75%: 3.25x resist 50%: 2x resist 25%: 1.25x resist
enemyResist *= 1 + 4*Math.pow(enemy.HP/(float)enemy.HT, 2);
//debuffs placed on the enemy reduce their resistance
for (Buff buff : enemy.buffs()){
if (MAJOR_DEBUFFS.containsKey(buff.getClass())) enemyResist *= (1f-MAJOR_DEBUFF_WEAKEN);
else if (MINOR_DEBUFFS.containsKey(buff.getClass())) enemyResist *= (1f-MINOR_DEBUFF_WEAKEN);
else if (buff.type == Buff.buffType.NEGATIVE) enemyResist *= (1f-MINOR_DEBUFF_WEAKEN);
}
//cannot re-corrupt or doom an enemy, so give them a major debuff instead
if(enemy.buff(Corruption.class) != null || enemy.buff(Doom.class) != null){
corruptingPower = enemyResist - 0.001f;
}
if (corruptingPower > enemyResist){
corruptEnemy( enemy );
} else {
float debuffChance = corruptingPower / enemyResist;
if (Random.Float() < debuffChance){
debuffEnemy( enemy, MAJOR_DEBUFFS);
} else {
debuffEnemy( enemy, MINOR_DEBUFFS);
}
}
wandProc(ch, chargesPerCast());
Sample.INSTANCE.play( Assets.Sounds.HIT_MAGIC, 1, 0.8f * Random.Float(0.87f, 1.15f) );
}
}
public void onZapX(BallisticaReal beam,int reflection) {
int level = buffedLvl();
int maxDistance = beam.dist;
ArrayList<Char> chars = new ArrayList<>();
for (int c : beam.subPath((reflection>0?0:1), maxDistance)) {
//prevent self_damage
if(c==beam.sourceI && c==curUser.pos) continue;
Char ch;
if ((ch = Actor.findChar( c )) != null) {
chars.add( ch );
}
if (Dungeon.level.flamable[c]) {
Dungeon.level.destroy( c );
GameScene.updateMap( c );
}
CellEmitter.center( c ).burst( PurpleParticle.BURST, Random.IntRange( 1, 2 ) );
}
Dungeon.observe();
boolean alive = curUser.isAlive();
int lvl = level;
for (Char ch : chars) {
wandProc(ch, chargesPerCast());
int damage = Math.round(2*reflectionDamageFactor(reflection));
if(!ch.equals(curUser)) {
ch.damage(damage, this);
}else{
ch.damage(damage/6, this);
}
ch.sprite.centerEmitter().burst( PurpleParticle.BURST, Random.IntRange( 1, 2 ) );
ch.sprite.flash();
}
if (!curUser.isAlive() && alive) {
Dungeon.fail( getClass() );
GLog.n(Messages.get(this, "ondeath"));
}
}
protected int chargesPerCast() {
return 2;
}
@ -457,72 +354,6 @@ public class EndingBlade extends Weapon {
}
}
private static final float MINOR_DEBUFF_WEAKEN = 1/4f;
private static final HashMap<Class<? extends Buff>, Float> MINOR_DEBUFFS = new HashMap<>();
static{
MINOR_DEBUFFS.put(Weakness.class, 2f);
MINOR_DEBUFFS.put(Corruption.class, 2f);
MINOR_DEBUFFS.put(Cripple.class, 1f);
MINOR_DEBUFFS.put(Blindness.class, 1f);
MINOR_DEBUFFS.put(Terror.class, 1f);
MINOR_DEBUFFS.put(Chill.class, 0f);
MINOR_DEBUFFS.put(Ooze.class, 0f);
MINOR_DEBUFFS.put(Corruption.class, 4f);
MINOR_DEBUFFS.put(Vertigo.class, 0f);
MINOR_DEBUFFS.put(Drowsy.class, 0f);
MINOR_DEBUFFS.put(Corruption.class, 10f);
MINOR_DEBUFFS.put(Burning.class, 0f);
MINOR_DEBUFFS.put(Poison.class, 0f);
}
private static final float MAJOR_DEBUFF_WEAKEN = 1/2f;
private static final HashMap<Class<? extends Buff>, Float> MAJOR_DEBUFFS = new HashMap<>();
static{
MAJOR_DEBUFFS.put(Corruption.class, 3f);
MAJOR_DEBUFFS.put(Slow.class, 2f);
MAJOR_DEBUFFS.put(Hex.class, 2f);
MAJOR_DEBUFFS.put(Paralysis.class, 1f);
MAJOR_DEBUFFS.put(Corruption.class, 0f);
MAJOR_DEBUFFS.put(Corruption.class, 0f);
MAJOR_DEBUFFS.put(MagicalSleep.class, 0f);
MAJOR_DEBUFFS.put(SoulMark.class, 0f);
MAJOR_DEBUFFS.put(Corrosion.class, 0f);
MAJOR_DEBUFFS.put(Frost.class, 0f);
MAJOR_DEBUFFS.put(Doom.class, 0f);
}
private void debuffEnemy( Mob enemy, HashMap<Class<? extends Buff>, Float> category ){
//do not consider buffs which are already assigned, or that the enemy is immune to.
HashMap<Class<? extends Buff>, Float> debuffs = new HashMap<>(category);
for (Buff existing : enemy.buffs()){
if (debuffs.containsKey(existing.getClass())) {
debuffs.put(existing.getClass(), 0f);
}
}
for (Class<?extends Buff> toAssign : debuffs.keySet()){
if (debuffs.get(toAssign) > 0 && enemy.isImmune(toAssign)){
debuffs.put(toAssign, 0f);
}
}
//all buffs with a > 0 chance are flavor buffs
Class<?extends FlavourBuff> debuffCls = (Class<? extends FlavourBuff>) Random.chances(debuffs);
if (debuffCls != null){
Buff.append(enemy, debuffCls, 6 + buffedLvl()*3);
} else {
//if no debuff can be applied (all are present), then go up one tier
if (category == MINOR_DEBUFFS) debuffEnemy( enemy, MAJOR_DEBUFFS);
else if (category == MAJOR_DEBUFFS) corruptEnemy( enemy );
}
}
private void corruptEnemy( Mob enemy ){
//cannot re-corrupt or doom an enemy, so give them a major debuff instead
if(enemy.buff(Corruption.class) != null || enemy.buff(Doom.class) != null){
@ -539,9 +370,6 @@ public class EndingBlade extends Weapon {
}
}
protected static ArrayList<PointF> fxS = new ArrayList<>();
protected static ArrayList<PointF> fxE = new ArrayList<>();
public void fxs(Ballistica beam, Callback callback) {
MagicMissile.boltFromChar( curUser.sprite.parent,
MagicMissile.SHADOW,
@ -549,129 +377,9 @@ public class EndingBlade extends Weapon {
beam.collisionPos,
callback);
Sample.INSTANCE.play( Assets.Sounds.ZAP );
buildBeams(beam);
int size = fxE.size();
for(int i=0;i<size;++i){
//Point p = Dungeon.level.cellToPoint(fxE.get(i));
//GLog.i("(%d, %d)", p.x, p.y);
curUser.sprite.parent.add(new Beam.DeathRayS(BallisticaReal.raisedPointToScreen(fxS.get(i)),
BallisticaReal.raisedPointToScreen(fxE.get(i)) ));
}
//buildBeams(beam);
callback.call();
}
protected static ArrayList<BallisticaReal> beams = new ArrayList<>();
protected static ArrayList<Float> offset_1 = new ArrayList<>();
protected void buildOffsetArray(int level){
offset_1.clear();
float offPerStep = 45f* (1.9f+level) / (1.9f+level*3f);
int maxDSB;
if(level>7){maxDSB = 0;}
else if(level>3){maxDSB = 0;}
else{maxDSB = 0;}
//offset_1.add(0f);
if(maxDSB>0) {
for (int i = -maxDSB; i < maxDSB + 1; ++i) {
offset_1.add(i * offPerStep / maxDSB);
}
}else{
offset_1.add(0f);
}
// if(level<9) return base_3;
//else return base_4;
}
protected PointF pointToF(Point p){
return new PointF(p.x, p.y);
}
protected void addBeam(BallisticaReal beam){
beams.add(beam);
fxS.add(beam.sourceF);
fxE.add(beam.collisionF);
}
protected void buildBeams(Ballistica beam){
fxS.clear();
fxE.clear();
beams.clear();
buildOffsetArray(this.level());
//addBeam(new Ballistica(beam.sourcePos, beam.collisionPos, Ballistica.STOP_SOLID | Ballistica.IGNORE_SOFT_SOLID));
float angle = PointF.angle(new PointF(pointToF(Dungeon.level.cellToPoint(beam.sourcePos))),
new PointF(pointToF(Dungeon.level.cellToPoint(beam.collisionPos))));
angle /= PointF.G2R;
if(angle<0f) angle += 360f;
//GLog.i("%f,", angle);
int scatter = offset_1.size();
for(int i=0;i<scatter;++i){
addBeam(new BallisticaReal(beam.sourcePos, angle + offset_1.get(i), 20, BallisticaReal.STOP_SOLID | BallisticaReal.IGNORE_SOFT_SOLID));
}
int maxRf = nReflections(this.level());
for(int ref = 0; ref < maxRf; ++ref) {
for (int i = 0; i < scatter; ++i) {
BallisticaReal br = new BallisticaReal(fxE.get(i+ref*scatter), reflectAngle(fxS.get(i+ref*scatter), fxE.get(i+ref*scatter)), 20, BallisticaReal.STOP_SOLID | BallisticaReal.IGNORE_SOFT_SOLID);
addBeam(br);
}
}
}
protected float horizontalReflectAngle(float angle){
angle = angle%360f;
return 360f-angle;
}
protected float verticalReflectAngle(float angle){
angle = angle%360f;
if(angle<180f) angle=180f-angle;
else angle = 540f-angle;
return angle;
}
protected float reflectAngle(PointF s, PointF e){
//PointF realPoint = nextPF(s,e);
float angle = PointF.angle(s,e)/PointF.G2R;
if(angle<0f) angle+= 360f;
float dx = e.x - s.x;
float dy = e.y - s.y;
boolean up = dy>0;
boolean right = dx>0;
boolean horizontalWall = false;
boolean verticalWall = false;
int xTile=(int)e.x;
if(e.x-(int)e.x<1e-5 && right){
xTile-=1;
}
int yTile=(int)e.y;
if(e.y-(int)e.y<1e-5 && up){
yTile-=1;
}
final int[] neigh = new int[]{-1, 1, -Dungeon.level.width(), Dungeon.level.width()};
boolean[] isWall = new boolean[4];
for(int i=0; i<4; ++i){
isWall[i]=Dungeon.level.solid[xTile+yTile*Dungeon.level.width()+neigh[i]];
}
if(e.x-(int)e.x<1e-5){
verticalWall = (right && isWall[1]) || (!right && isWall[0]);
}
if(e.y-(int)e.y<1e-5){
horizontalWall = (up && isWall[3]) || (!up && isWall[2]);
}
if(horizontalWall != verticalWall){
if(horizontalWall) return horizontalReflectAngle(angle);
else return verticalReflectAngle(angle);
}else if(horizontalWall && verticalWall){
if(Math.abs(dx)<Math.abs(dy)){
return horizontalReflectAngle(angle);
}else{
return verticalReflectAngle(angle);
}
}else{
return angle;
}
}
@Override
public int STRReq(int C) {
@ -687,7 +395,8 @@ public class EndingBlade extends Weapon {
if(TIME_TO_DIED != 0){
TIME_TO_DIED--;
}
//fixme
//todo
if(level >= 10){
fireenergy += 0;
//武器最高级

View File

@ -21,8 +21,6 @@
package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
@ -40,7 +38,7 @@ public class Gauntlet extends MeleeWeapon {
hitSound = Assets.Sounds.HIT_CRUSH;
hitSoundPitch = 1.2f;
tier = 5;
tier = 3;
DLY = 0.25f; //2x speed
}
@ -64,7 +62,7 @@ public class Gauntlet extends MeleeWeapon {
return max(buffedLvl());
case 1:
Buff.affect(defender, Burning.class).reignite(defender);
Buff.affect(hero, Cripple.class, Degrade.ADURATION);
Buff.affect(attacker, Cripple.class, Degrade.ADURATION);
return super.proc(attacker, defender, damage);
}
}

View File

@ -5,31 +5,35 @@
package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.RandomBuff;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Blazing;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Kinetic;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Shocking;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Unstable;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.watabou.utils.Bundle;
public class LockSword extends MeleeWeapon {
public int lvl;
public int lvl = 0;
public LockSword() {
super.image = ItemSpriteSheet.DG3;
super.tier = 3;
if (this.lvl >= 150) {
super.image = ItemSpriteSheet.DG4;
}
super.tier = 5;
}
if (this.lvl >= 450) {
super.image = ItemSpriteSheet.DG5;
}
@Override
public int min(int lvl) {
return Math.round(1.0f*(tier+1)) + //15 base, down from 30
lvl*Math.round(0.5f*(tier+1)); //+3 per level, down from +6
}
@Override
public int max(int lvl) {
return Math.round(1.5f*(tier+1)) + //15 base, down from 30
lvl*Math.round(0.5f*(tier+1)); //+3 per level, down from +6
}
public String desc() {
@ -37,44 +41,57 @@ public class LockSword extends MeleeWeapon {
}
public int image() {
if (this.level() == 3 && Dungeon.hero.buff(RandomBuff.class) != null){
//GLog.n("谢谢你为我升级……");
for (Buff buff : hero.buffs()) {
if (buff instanceof RandomBuff) {
buff.detach();
}
}
return image;
if (lvl == 150) {
super.image = ItemSpriteSheet.DG4;
} else if (lvl >= 350) {
super.image = ItemSpriteSheet.DG5;
}
return image;
}
public int proc(Char var1, Char var2, int var3) {
++this.lvl;
int var4 = var3;
if (this.lvl >= 150) {
var4 = (new Unstable()).proc(this, var1, var2, var3) + 3;
super.image = ItemSpriteSheet.DG4;
public int proc(Char attacker, Char defender, int damage ) {
++lvl;
int dmg;
if(level >= 10){
lvl += 0;
} else if(defender.properties().contains(Char.Property.BOSS) && defender.HP <= damage){
//目标Boss血量小于实际伤害判定为死亡,+20
lvl+=20;
} else if(defender.properties().contains(Char.Property.MINIBOSS) && defender.HP <= damage){
//目标迷你Boss血量小于实际伤害判定为死亡,+10
lvl+=10;
} else if (defender.HP <= damage){
//目标血量小于实际伤害判定为死亡,+5
lvl+=5;
}
var3 = var4;
if (this.lvl >= 450) {
var3 = (new Unstable()).proc(this, var1, var2, var4);
var3 = (new Unstable()).proc(this, var1, var2, var3) + 7;
super.image = ItemSpriteSheet.DG5;
if (level>= 8) {
dmg = (new Unstable()).proc(this, attacker, defender, damage) + 4;
damage = dmg;
} else if (level>= 6){
dmg = (new Shocking()).proc(this, attacker, defender, damage) + 3;
damage = dmg;
} else if (level>= 4){
dmg = (new Blazing()).proc(this, attacker, defender, damage) + 2;
damage = dmg;
} else if (level>= 2){
dmg = (new Kinetic()).proc(this, attacker, defender, damage) + 1;
damage = dmg;
}
return super.proc(var1, var2, var3);
return super.proc(attacker, defender, damage);
}
public void restoreFromBundle(Bundle var1) {
super.restoreFromBundle(var1);
super.image = ItemSpriteSheet.DG3;
if (this.lvl >= 150) {
super.image = ItemSpriteSheet.DG4;
}
if (this.lvl >= 450) {
if (lvl == 150) {
super.image = ItemSpriteSheet.DG4;
} else if (lvl >= 350) {
super.image = ItemSpriteSheet.DG5;
}
@ -84,11 +101,10 @@ public class LockSword extends MeleeWeapon {
public void storeInBundle(Bundle var1) {
super.storeInBundle(var1);
super.image = ItemSpriteSheet.DG3;
if (this.lvl >= 150) {
super.image = ItemSpriteSheet.DG4;
}
if (this.lvl >= 450) {
if (lvl == 150) {
super.image = ItemSpriteSheet.DG4;
} else if (lvl >= 350) {
super.image = ItemSpriteSheet.DG5;
}

View File

@ -21,6 +21,8 @@
package com.shatteredpixel.shatteredpixeldungeon.levels;
import static com.shatteredpixel.shatteredpixeldungeon.Challenges.PRO;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.Statistics;
@ -28,6 +30,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.items.Amulet;
import com.shatteredpixel.shatteredpixeldungeon.items.JAmulet;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTilemap;
@ -154,7 +157,11 @@ public class LastLevel extends Level {
@Override
protected void createItems() {
drop( new Amulet(), exit );
if(Dungeon.isChallenged(PRO)) {
drop(new JAmulet(), exit);
} else {
drop(new Amulet(), exit);
}
}
@Override

View File

@ -182,7 +182,7 @@ public class InterlevelScene extends PixelScene {
fadeTime += 0.9f; //adds 1 second total
//speed up transition when debugging
} else if (DeviceCompat.isDebug()){
fadeTime = 0.1f;
fadeTime = 0.8f;
}
SkinnedBlock bg = new SkinnedBlock(Camera.main.width, Camera.main.height, loadingAsset ){

View File

@ -7,9 +7,11 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.BlueBatSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ColdGuardSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.DiedMonkLoaderSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.FlameBoiSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.GhostSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.sprites.KagenoNusujinSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.MimicSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.SRPDHBLRTT;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ShopkKingSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.WFSprite;
@ -24,6 +26,8 @@ import java.util.ArrayList;
public class vM0_6_7_X_Changes {
public static void addAllChanges(ArrayList<ChangeInfo> changeInfos) {
add_v0_6_10_Changes(changeInfos);
add_v0_6_9_Changes(changeInfos);
add_v0_6_8_Changes(changeInfos);
add_v0_6_7_Changes(changeInfos);
add_v0_6_6_Changes(changeInfos);
@ -35,6 +39,64 @@ public class vM0_6_7_X_Changes {
add_v0_6_0_Changes(changeInfos);
}
public static void add_v0_6_10_Changes( ArrayList<ChangeInfo> changeInfos ) {
ChangeInfo changes = new ChangeInfo("v0.6.0.0-Beta21-p1.2", true, "");
changes.hardlight(Window.TITLE_COLOR);
changeInfos.add(changes);
changes = new ChangeInfo("新内容", false, null);
changes.hardlight(Window.GREEN_COLOR);
changeInfos.add(changes);
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.ENDDIED), ("彩蛋武器:终焉"),
("正式实装,击败火元素概率掉落")));
changes = new ChangeInfo("改动", false, null);
changes.hardlight(Window.CYELLOW);
changeInfos.add(changes);
changes.addButton(new ChangeButton(new Image("sprites/spinner.png", 144, 0, 16, 16), (Messages.get(ChangesScene.class, "bugfixes")),
Messages.get(vM0_6_7_X_Changes.class, "bug_06X30")));
}
public static void add_v0_6_9_Changes( ArrayList<ChangeInfo> changeInfos ) {
ChangeInfo changes = new ChangeInfo("v0.6.0.0-Beta21-p1", true, "");
changes.hardlight(Window.TITLE_COLOR);
changeInfos.add(changes);
changes = new ChangeInfo("新内容", false, null);
changes.hardlight(Window.GREEN_COLOR);
changeInfos.add(changes);
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.ENDDIED), ("彩蛋武器:终焉"),
("在命运的尽头,亦或者是命运的起点")));
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.GAUNTLETS), ("碧灰双刃"),
("武器降级到3阶")));
changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG3), ("钥匙剑"),
("武器提格到5阶进行了一定的重做")));
changes = new ChangeInfo("改动", false, null);
changes.hardlight(Window.CYELLOW);
changeInfos.add(changes);
changes.addButton(new ChangeButton(new MimicSprite.Dimand(), ("钻石宝箱王"),
("在梦魇Boss中出现新的技能")));
changes.addButton(new ChangeButton(new GhostSprite(), ("幽灵奖励改变"),
("幽灵现在更能出现+3以及+4+5品种的武器或护甲")));
changes.addButton(new ChangeButton(Icons.get(Icons.CHANGES), ("药水癔症"),
("暂时为以前的样子,后续会改善")));
changes.addButton(new ChangeButton(Icons.get(Icons.INFO), ("杂项改动"),
("1.部分物品的显示逻辑更新\n2.用户ID系统\n3.调整红龙之王的奖励\n4.修复了一系列的Bug")));
}
public static void add_v0_6_8_Changes( ArrayList<ChangeInfo> changeInfos ) {
ChangeInfo changes = new ChangeInfo("v0.6.0.0-Beta20.80", true, "");
changes.hardlight(Window.TITLE_COLOR);
@ -50,12 +112,6 @@ public class vM0_6_7_X_Changes {
changes.addButton(new ChangeButton(new ShopkKingSprite(), ("商人领主商店终端"),
("交易使人快乐")));
changes = new ChangeInfo("改动", false, null);
changes.hardlight(Window.GREEN_COLOR);
changeInfos.add(changes);
changes.addButton(new ChangeButton(new Image("sprites/spinner.png", 144, 0, 16, 16), (Messages.get(ChangesScene.class, "bugfixes")),
Messages.get(vM0_6_7_X_Changes.class, "bug_06X29")));
}
public static void add_v0_6_7_Changes( ArrayList<ChangeInfo> changeInfos ) {

View File

@ -26,6 +26,17 @@ import com.watabou.utils.Random;
//This class defines the parameters for seeds in ShatteredPD and contains a few convenience methods
public class DungeonSeed {
//USER NAME QQ
public static String formatText( String inputText ){
try {
//if the seed matches a code, then just convert it to using the code system
return convertToCode(convertFromCode(inputText));
} catch (IllegalArgumentException e){
//otherwise just return the input text
return inputText;
}
}
private static long TOTAL_SEEDS = 5429503678976L; //26^9 possible seeds
public static long randomSeed(){

View File

@ -21,6 +21,8 @@
package com.shatteredpixel.shatteredpixeldungeon.windows;
import static com.watabou.utils.DeviceCompat.isAndroid;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Chrome;
import com.shatteredpixel.shatteredpixeldungeon.SPDSettings;
@ -270,7 +272,7 @@ public class WndSettings extends WndTabbed {
add(optScale);
}
if (DeviceCompat.isAndroid() && PixelScene.maxScreenZoom >= 2) {
if (isAndroid() && PixelScene.maxScreenZoom >= 2) {
chkSaver = new CheckBox(Messages.get(this, "saver")) {
@Override
protected void onClick() {
@ -299,7 +301,7 @@ public class WndSettings extends WndTabbed {
add( chkSaver );
}
if (DeviceCompat.isAndroid()) {
if (isAndroid()) {
Boolean landscape = SPDSettings.landscape();
if (landscape == null){
landscape = Game.width > Game.height;
@ -685,6 +687,8 @@ public class WndSettings extends WndTabbed {
ColorBlock sep1;
CheckBox LockFing;
RedButton ResetButton;
@Override
protected void createChildren() {
title = PixelScene.renderTextBlock(Messages.get(this, "title"), 9);
@ -703,6 +707,17 @@ public class WndSettings extends WndTabbed {
};
LockFing.checked(SPDSettings.HelpSettings());
add(LockFing);
ResetButton = new RedButton(Messages.get(this, "reset")) {
@Override
protected void onClick() {
WndStartGame.showKeyInput();
}
};
if(isAndroid()) {
add(ResetButton);
}
}
@Override
@ -718,8 +733,10 @@ public class WndSettings extends WndTabbed {
if (width > 200){
LockFing.setRect(0, bottom, width, SLIDER_HEIGHT);
ResetButton.setRect(0, LockFing.bottom() + GAP, width, SLIDER_HEIGHT);
} else {
LockFing.setRect(0, bottom + GAP, width, SLIDER_HEIGHT);
ResetButton.setRect(0, LockFing.bottom() + GAP, width, SLIDER_HEIGHT);
}
height = LockFing.bottom();

View File

@ -21,7 +21,10 @@
package com.shatteredpixel.shatteredpixeldungeon.windows;
import static com.shatteredpixel.shatteredpixeldungeon.SPDSettings.KEY_CUSTOM_LING;
import static com.shatteredpixel.shatteredpixeldungeon.SPDSettings.KEY_CUSTOM_SEED;
import static com.shatteredpixel.shatteredpixeldungeon.ui.Icons.RENAME_OFF;
import static com.watabou.utils.DeviceCompat.isAndroid;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
@ -46,6 +49,8 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton;
import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock;
import com.shatteredpixel.shatteredpixeldungeon.ui.StyledButton;
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
import com.shatteredpixel.shatteredpixeldungeon.utils.DungeonSeed;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.ColorBlock;
import com.watabou.noosa.Game;
import com.watabou.noosa.Image;
@ -57,6 +62,23 @@ import java.util.ArrayList;
public class WndStartGame extends Window {
public static void showKeyInput(){
Game.runOnRenderThread(() -> ShatteredPixelDungeon.scene().add(new WndTextInput(Messages.get(WndTextInput.class,"enter_key"), Messages.get(WndGame.class,
"dialog_user"), SPDSettings.customSeed(), 10, false, Messages.get(WndTextInput.class,"yes"),
Messages.get(WndTextInput.class,"no")){
@Override
public void onSelect(boolean positive, String text) {
text = DungeonSeed.formatText(text);
if(positive) {
SPDSettings.customSeed(text);
//抛出一个问题保证初始化成功
throw new RuntimeException("成功,信息已录入");
}
}
}));
}
private static final int WIDTH = 120;
private static final int HEIGHT = 160;
@ -252,11 +274,15 @@ public class WndStartGame extends Window {
ActionIndicator.action = null;
InterlevelScene.mode = InterlevelScene.Mode.DESCEND;
if (SPDSettings.intro()) {
//匹配两个值以及为安卓才显示
if(SPDSettings.customSeed().equals(KEY_CUSTOM_LING) && SPDSettings.customSeed().equals(KEY_CUSTOM_SEED) && isAndroid()){
WndStartGame.showKeyInput();
} else if (SPDSettings.intro()) {
SPDSettings.intro( false );
Game.switchScene( IntroScene.class );
} else {
Game.switchScene( InterlevelScene.class );
GLog.n(SPDSettings.customSeed());
}
}

View File

@ -144,7 +144,8 @@ public class WndTextInput extends Window {
}
@Override
@Override
public void offset(int xOffset, int yOffset) {
super.offset(xOffset, yOffset);
if (textBox != null){