From 31c26d60eb5302e0047fbe88cdb79e3868ec4dcc Mon Sep 17 00:00:00 2001 From: LingASDJ <2735951230@qq.com> Date: Tue, 8 Aug 2023 15:42:14 +0800 Subject: [PATCH 1/6] Add Android Library Test --- android/build.gradle | 2 +- android/src/main/AndroidManifest.xml | 1 + build.gradle | 4 +- .../services/analyticsfirebase/Beta.java | 5 +++ services/analyticsfirebase/.gitignore | 1 + services/analyticsfirebase/build.gradle | 37 +++++++++++++++++++ services/analyticsfirebase/consumer-rules.pro | 0 services/analyticsfirebase/proguard-rules.pro | 21 +++++++++++ .../ExampleInstrumentedTest.java | 26 +++++++++++++ .../src/main/AndroidManifest.xml | 4 ++ .../analyticsfirebase/FireBaseLing.java | 4 ++ .../analyticsfirebase/ExampleUnitTest.java | 17 +++++++++ services/build.gradle | 5 ++- .../analyticsfirebase/FireBaseService.java | 3 ++ settings.gradle | 1 + 15 files changed, 127 insertions(+), 4 deletions(-) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/Beta.java create mode 100644 services/analyticsfirebase/.gitignore create mode 100644 services/analyticsfirebase/build.gradle create mode 100644 services/analyticsfirebase/consumer-rules.pro create mode 100644 services/analyticsfirebase/proguard-rules.pro create mode 100644 services/analyticsfirebase/src/androidTest/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/ExampleInstrumentedTest.java create mode 100644 services/analyticsfirebase/src/main/AndroidManifest.xml create mode 100644 services/analyticsfirebase/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/FireBaseLing.java create mode 100644 services/analyticsfirebase/src/test/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/ExampleUnitTest.java create mode 100644 services/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/FireBaseService.java diff --git a/android/build.gradle b/android/build.gradle index ea7454d69..6793b95a6 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -81,7 +81,7 @@ dependencies { implementation project(path: ':services:news:shatteredNews') - // implementation project(path: ':services:analytics:analyticsFirebase') + implementation project(path: ':services:analyticsfirebase') natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86" diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index 255557bf1..2581c9b12 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -47,6 +47,7 @@ diff --git a/build.gradle b/build.gradle index 256676a80..0d7891c3e 100644 --- a/build.gradle +++ b/build.gradle @@ -23,9 +23,9 @@ allprojects { appJavaCompatibility = JavaVersion.VERSION_11 - appAndroidCompileSDK = 30 + appAndroidCompileSDK = 33 appAndroidMinSDK = 19 - appAndroidTargetSDK = 30 + appAndroidTargetSDK = 33 gdxControllersVersion = '2.2.1' diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/Beta.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/Beta.java new file mode 100644 index 000000000..02d2160a6 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/Beta.java @@ -0,0 +1,5 @@ +package com.shatteredpixel.shatteredpixeldungeon.services.analyticsfirebase; + +public class Beta { + public static FireBaseService service; +} diff --git a/services/analyticsfirebase/.gitignore b/services/analyticsfirebase/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/services/analyticsfirebase/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/services/analyticsfirebase/build.gradle b/services/analyticsfirebase/build.gradle new file mode 100644 index 000000000..b67007851 --- /dev/null +++ b/services/analyticsfirebase/build.gradle @@ -0,0 +1,37 @@ +plugins { + id 'com.android.library' +} + +android { + namespace 'com.shatteredpixel.shatteredpixeldungeon.services.analyticsfirebase' + compileSdk 33 + + defaultConfig { + minSdk 19 + targetSdk 33 + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } +} + +dependencies { + implementation project(':SPD-classes') + api project(':services') + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.5.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' +} \ No newline at end of file diff --git a/services/analyticsfirebase/consumer-rules.pro b/services/analyticsfirebase/consumer-rules.pro new file mode 100644 index 000000000..e69de29bb diff --git a/services/analyticsfirebase/proguard-rules.pro b/services/analyticsfirebase/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/services/analyticsfirebase/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/services/analyticsfirebase/src/androidTest/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/ExampleInstrumentedTest.java b/services/analyticsfirebase/src/androidTest/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/ExampleInstrumentedTest.java new file mode 100644 index 000000000..9b982c52a --- /dev/null +++ b/services/analyticsfirebase/src/androidTest/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.shatteredpixel.shatteredpixeldungeon.services.analyticsfirebase; + +import static org.junit.Assert.assertEquals; + +import android.content.Context; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; + +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.shatteredpixel.shatteredpixeldungeon.services.analyticsfirebase.test", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/services/analyticsfirebase/src/main/AndroidManifest.xml b/services/analyticsfirebase/src/main/AndroidManifest.xml new file mode 100644 index 000000000..a5918e68a --- /dev/null +++ b/services/analyticsfirebase/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/services/analyticsfirebase/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/FireBaseLing.java b/services/analyticsfirebase/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/FireBaseLing.java new file mode 100644 index 000000000..b94bdf594 --- /dev/null +++ b/services/analyticsfirebase/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/FireBaseLing.java @@ -0,0 +1,4 @@ +package com.shatteredpixel.shatteredpixeldungeon.services.analyticsfirebase; + +public class FireBaseLing { +} diff --git a/services/analyticsfirebase/src/test/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/ExampleUnitTest.java b/services/analyticsfirebase/src/test/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/ExampleUnitTest.java new file mode 100644 index 000000000..187b73c69 --- /dev/null +++ b/services/analyticsfirebase/src/test/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.shatteredpixel.shatteredpixeldungeon.services.analyticsfirebase; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/services/build.gradle b/services/build.gradle index e94412de9..b0fdb50bb 100644 --- a/services/build.gradle +++ b/services/build.gradle @@ -1,4 +1,7 @@ apply plugin: 'java-library' [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' -sourceCompatibility = targetCompatibility = appJavaCompatibility \ No newline at end of file +sourceCompatibility = targetCompatibility = appJavaCompatibility +dependencies { + implementation project(path: ':services:analyticsfirebase') +} \ No newline at end of file diff --git a/services/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/FireBaseService.java b/services/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/FireBaseService.java new file mode 100644 index 000000000..bd0b0e176 --- /dev/null +++ b/services/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/FireBaseService.java @@ -0,0 +1,3 @@ +package com.shatteredpixel.shatteredpixeldungeon.services.analyticsfirebase; +public class FireBaseService { +} diff --git a/settings.gradle b/settings.gradle index da66e41ac..6ae8f88fd 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,3 +11,4 @@ include ':services' //news include ':services:news:shatteredNews' +include ':services:analyticsfirebase' From f1c20c48080fff18c28fa29395058c3c9ede4c8a Mon Sep 17 00:00:00 2001 From: LingASDJ <2735951230@qq.com> Date: Tue, 8 Aug 2023 18:04:32 +0800 Subject: [PATCH 2/6] Update build.gradle --- services/build.gradle | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/services/build.gradle b/services/build.gradle index b0fdb50bb..e94412de9 100644 --- a/services/build.gradle +++ b/services/build.gradle @@ -1,7 +1,4 @@ apply plugin: 'java-library' [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' -sourceCompatibility = targetCompatibility = appJavaCompatibility -dependencies { - implementation project(path: ':services:analyticsfirebase') -} \ No newline at end of file +sourceCompatibility = targetCompatibility = appJavaCompatibility \ No newline at end of file From 670dbaf732083c202101141a9310317f13a1b7d1 Mon Sep 17 00:00:00 2001 From: LingASDJ <2735951230@qq.com> Date: Tue, 22 Aug 2023 21:27:52 +0800 Subject: [PATCH 3/6] Update V0.6.4.0-Beta12 --- android/build.gradle | 7 +- .../android/AndroidGame.java | 3 - .../android/AndroidPlatformSupport.java | 21 +- build.gradle | 4 +- .../src/main/assets/interfaces/LanterLing.png | Bin 133 -> 267 bytes core/src/main/assets/interfaces/boss_hp.png | Bin 428 -> 1204 bytes core/src/main/assets/interfaces/chrome.png | Bin 1458 -> 3830 bytes .../interfaces/status_pane-puresoul.png | Bin 3551 -> 0 bytes .../interfaces/status_pane-puresoul_dark.png | Bin 1456 -> 0 bytes .../main/assets/interfaces/status_pane.png | Bin 3551 -> 3012 bytes .../assets/interfaces/status_pane_normal.png | Bin 1475 -> 1606 bytes core/src/main/assets/interfaces/toolbar.png | Bin 3516 -> 3813 bytes .../main/assets/interfaces/toolbar_normal.png | Bin 4571 -> 4769 bytes .../main/assets/messages/misc/misc.properties | 2 +- .../src/main/assets/messages/ui/ui.properties | 2 +- .../messages/windows/windows.properties | 10 +- .../shatteredpixeldungeon/Assets.java | 2 - .../shatteredpixeldungeon/Badges.java | 4 +- .../shatteredpixeldungeon/QuickSlot.java | 9 +- .../shatteredpixeldungeon/SPDAction.java | 4 + .../shatteredpixeldungeon/SPDSettings.java | 18 +- .../actors/mobs/Rat.java | 2 +- .../custom/utils/Constants.java | 8 +- .../items/lightblack/OilLantern.java | 9 +- .../levels/rooms/standard/EyeRoom.java | 4 +- .../levels/rooms/standard/YinYangRoom.java | 5 +- .../scenes/GameScene.java | 72 +- .../scenes/PixelScene.java | 6 +- .../services/analyticsfirebase/Beta.java | 5 - .../ui/BossHealthBar.java | 6 +- .../ui/JoinIndicator.java | 2 +- .../ui/QuickSlotButton.java | 4 + .../shatteredpixeldungeon/ui/StatusPane.java | 23 +- .../shatteredpixeldungeon/ui/ToobarV.java | 632 ++++++++++++++++++ .../shatteredpixeldungeon/ui/Toolbar.java | 5 +- .../ui/changelist/mlpd/vM0_6_7_X_Changes.java | 5 +- .../windows/WndSettings.java | 336 ++++++---- gradle.properties | 3 +- services/analyticsfirebase/.gitignore | 1 - services/analyticsfirebase/build.gradle | 37 - services/analyticsfirebase/consumer-rules.pro | 0 services/analyticsfirebase/proguard-rules.pro | 21 - .../ExampleInstrumentedTest.java | 26 - .../src/main/AndroidManifest.xml | 4 - .../analyticsfirebase/FireBaseLing.java | 4 - .../analyticsfirebase/ExampleUnitTest.java | 17 - .../services/news/GameNesImpl.java | 4 - .../analyticsfirebase/FireBaseService.java | 3 - settings.gradle | 1 - 49 files changed, 1023 insertions(+), 308 deletions(-) delete mode 100644 core/src/main/assets/interfaces/status_pane-puresoul.png delete mode 100644 core/src/main/assets/interfaces/status_pane-puresoul_dark.png create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ToobarV.java delete mode 100644 services/analyticsfirebase/.gitignore delete mode 100644 services/analyticsfirebase/build.gradle delete mode 100644 services/analyticsfirebase/consumer-rules.pro delete mode 100644 services/analyticsfirebase/proguard-rules.pro delete mode 100644 services/analyticsfirebase/src/androidTest/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/ExampleInstrumentedTest.java delete mode 100644 services/analyticsfirebase/src/main/AndroidManifest.xml delete mode 100644 services/analyticsfirebase/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/FireBaseLing.java delete mode 100644 services/analyticsfirebase/src/test/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/ExampleUnitTest.java delete mode 100644 services/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/FireBaseService.java diff --git a/android/build.gradle b/android/build.gradle index 6793b95a6..dea00ca6b 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -3,7 +3,10 @@ apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.firebase.crashlytics' android { - compileSdkVersion appAndroidCompileSDK + compileSdkVersion 30 + + buildToolsVersion "30.0.2" +// compileSdkVersion appAndroidCompileSDK compileOptions.sourceCompatibility = compileOptions.targetCompatibility = appJavaCompatibility 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:analyticsfirebase') - 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-arm64-v8a" diff --git a/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidGame.java b/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidGame.java index a2702fba0..38191169d 100644 --- a/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidGame.java +++ b/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidGame.java @@ -33,7 +33,6 @@ import com.badlogic.gdx.backends.android.AndroidApplication; import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; import com.badlogic.gdx.backends.android.AndroidAudio; import com.badlogic.gdx.backends.android.AsynchronousAndroidAudio; -import com.google.firebase.analytics.FirebaseAnalytics; import com.shatteredpixel.shatteredpixeldungeon.SPDSettings; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.services.news.GameNesImpl; @@ -48,8 +47,6 @@ public class AndroidGame extends AndroidApplication { public static AndroidApplication instance; - public FirebaseAnalytics mFirebaseAnalytics; - private static AndroidPlatformSupport support; @Override diff --git a/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidPlatformSupport.java b/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidPlatformSupport.java index 8a54d190a..e723df273 100644 --- a/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidPlatformSupport.java +++ b/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidPlatformSupport.java @@ -198,7 +198,8 @@ public class AndroidPlatformSupport extends PlatformSupport { } else if (Gdx.files.absolute("/system/fonts/DroidSans.ttf").exists()){ basicFontGenerator = new FreeTypeFontGenerator(Gdx.files.absolute("/system/fonts/DroidSans.ttf")); } - if (!systemfont) { + + if (basicFontGenerator == null) { basicFontGenerator = fallbackFontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/pixel_font.ttf")); } @@ -206,7 +207,7 @@ public class AndroidPlatformSupport extends PlatformSupport { fallbackFontGenerator = basicFontGenerator; basicFontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/pixel_font.ttf")); } - } + //android 7.0+. all asian fonts are nicely contained in one spot if (Gdx.files.absolute("/system/fonts/NotoSansCJK-Regular.ttc").exists()) { @@ -216,9 +217,6 @@ public class AndroidPlatformSupport extends PlatformSupport { case JAPANESE: typeFace = 0; break; -// case KOREAN: -// typeFace = 1; -// break; case HARDCHINESE: case CHINESE: default: @@ -284,6 +282,19 @@ public class AndroidPlatformSupport extends PlatformSupport { break; } 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; + } + KRFontGenerator = SCFontGenerator = TCFontGenerator = JPFontGenerator = new FreeTypeFontGenerator(Gdx.files.absolute("/system/fonts/NotoSansCJK-Regular.ttc")); } if (basicFontGenerator != null) fonts.put(basicFontGenerator, new HashMap<>()); diff --git a/build.gradle b/build.gradle index 832cc6afc..2d4610675 100644 --- a/build.gradle +++ b/build.gradle @@ -18,8 +18,8 @@ allprojects { appName = 'Magic Ling Pixel Dungeon' appPackageName = 'com.ansdomagiclingpixeldungeon.ling' - appVersionCode =903000 - appVersionName = '0.6.4.0-Beta9' + appVersionCode =906000 + appVersionName = '0.6.4.0-Beta-XII' appJavaCompatibility = JavaVersion.VERSION_11 diff --git a/core/src/main/assets/interfaces/LanterLing.png b/core/src/main/assets/interfaces/LanterLing.png index c1622c605f77515a7b7770b010e86a0c26c6b981..019f28d38e4b4f3efacee3e7565e87d827885dc8 100644 GIT binary patch delta 239 zcmV1b_4?x z0|)>)Yfgb#Pyq-VOhQzk3&50v#F@YbqN_mS<1zH*Lx?);w!maTYOt#y&K8&|Qq2H{ z3llh`U2fn7jc9-#-j3XnWZ6>b$UQHXB}e8Pfm&002ovPDHLkV1hTxUv~fi delta 104 zcmeBXYGs_DlIY{<;uvDln><74$j|wVoCbyl1_n8PDgXPG4gf*Hx`xO0T@1|3%!mJ* zwf)y%lF)Kv1;MsPhGbD@<(LB*hxpxgaNYlDFPSLBU~bEs|8TnUMg}18boFyt=akR{ E0LC07egFUf diff --git a/core/src/main/assets/interfaces/boss_hp.png b/core/src/main/assets/interfaces/boss_hp.png index 6d5d4d3866b820149058b40d62ba9605cd10c82f..aac5f4042579a65ae8ea3e521ac10648833ec653 100644 GIT binary patch delta 1195 zcmV;c1XTO11GEW{8Gi-<005$$euMx31bazDK~!i3?O07{R96%}FF!NQBsB@TNZtgK z5<_WdN5M^WlUgw`5(kZfjR};v(6|UHv?BP2aZ|GK4_t_?2ujSNnKA*bwTfNe1G4&_nkMR(c7WF73Yl< z(E!!Jxb_oA{q(?ox*QHuTVs ziyAU=ws9Ica!~2f9~z~v$DdH_`p@KE-{=Ja`t;RnV*tMMfs5)rLma3oI_h~yeU&;V z=;lPN%Eb}3Q-8h~1&2bkFZ$e@Cn^@;@l@|TAOhIo*uP?#&(%~&JN_zUavc1<+}};> zPEpqULG+3CDJyr7I01P2^`7{)-xiM0a2^95ON9eMstbnrE{GFBRP6#G&KkgRwsxAT z2PsYf&U}#a*^_t0!KcAv-4$tE9kC>j0M7PKw)L|ePJbsv5|Ax$`1@Y3kYQ^J{v_3l z@m=lKc&jc8$WrJJg%A(KcujEWiWHS4%I`k202T27d|`YzEotW9$Q zczYX}WPko2TVvAd=-c8(Ygy4ZdoS_gL=cLs^b}C|<%A>w;9)<>ND*L?{gLO^v#0b$ z$r1|wc$EB`j?utmRQl&^X!62;--ad;mhs%|svD!x5Nq?xs4FQ-UsJr;*p$DLUrP%< zFzl{>e4iOCnQ@|c5x*cK1~UfiVitZv7qiNaI)6|X*4VcR&j*{(lWLxoh`Ny%7lufp zW8ut)MFwWvFdYF{7X*kzNM=ngZj^}~z5po-`mbkv3GxC23D^xP5&#}+rxz88f*t?+ zfqx1!#v{}0Df->3sL_3&`g7d0*_fm+t3FD37*`&SP*?N?(JmtGoQCrlNpW(J0WU!S z(0_9@O~X#WORb-M4F)tf-C`d`))Do%sf&T{dBj&74IT*iufZgc*=%XYgHOV}AkJF` ztVci+@%Q)-vMqVT!=$a)KclY|v+>}0cL>u}>8JAnLmG!(euD=#`#b6Sg`yr7*M_hGey?f*_n1{G&D5WrmCx}v-O#+LwR|*GBgkfP)ke8 z%w0ekr7%`hRHP+95i+Bxxw(19HM<2nqRYz4WQwY)DgrU03%t_~c%KBw3KPO?3CV;E zkf7^2$8PRD)+%iDY>KoiOx$WNk0gY+M|XF(5EteJ2Ie~hZvc@IALUrp=LrA+002ov JPDHLkV1mQyK0E*b delta 413 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 literal 1458 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 Z{tvXj0GfXniopN?002ovPDHLkV1hP2lY;;N diff --git a/core/src/main/assets/interfaces/status_pane-puresoul_dark.png b/core/src/main/assets/interfaces/status_pane-puresoul_dark.png deleted file mode 100644 index e5dc3b758a96d16b7f2a4f4446b03005a6651d98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1456 zcmeAS@N?(olHy`uVBq!ia0vp^4M5z^!3-o{K3(X@z`z(8;1l9%=U`dgP@IvI7#bN+ zT#;jGZQ9&X1yo~UWnyh>zIfSGdq=DO$t~uV##T0FW)?=a_7P9BI zS~_Zm#yXnXss={d8d@s)hFa>H%6bNxY8pzq`WmY0iaL7gDrySax@yX*@>)8oN-A=i z+A505vICa;^Ev-tFInqkGC^CvR@ER=UMEpj^U$F~bLY-&X=%yM z&W?|d|8#HWr>h;G&J=$-mig&G%%^QGpH|B<{CD8EXvII%h__agJwjSwktx?<3*oEI zd@o#8wtUi@b55>dm2^)3|2Bqm1st0b*{1|?awT=I1BPR9NswRge+XcJ()6IXr?YHg zU|^o?>EaktG3V{9o5ezo0`1b%QVN)ql$4TOTwIQHbaZsOJ*vI`eeKi0SKY_||9{|j zXc6mX_rpHh`G4)pxKVOEhb&Z!r_PIbsjY@gOTr=-Z@1CV34H`v=s zeYaH)EqVv36!3ihQNrn3T7DT8!Y;md#hgnU?;M)BQQ=c8ho5@BCxGycWdV zSiLmhn90K)paDyF_$mrMzGm7xHF&be^4E#K(+gOC z&AmL?<9b%NT;qWS)oDU6BTIj=FstZq>^FQObmPMV!4o=tyA=;ADg1lMzWeK6mKP1& z89dxEN0PSfYw-5qxh`HH+5Yku)4BzQIt8NLH-Rig!+<(^ z&Eph(9=M0(aQ^A(So({p&h>CuE#rRW#I^tGH%J|0+UTGozmS-`#n}wh!MV=AW_?DfhEPmx&3@0_-V-0Zdi>k>O0jw*x5>x9KXy)D!#e9n-Jd(2 z*O+{3_8-+c8?~VOy}P2_$*2YW@7=i>jz%r$eP4P*$fL)6Uht03(^G=2Ui>mpxHYA( z?X1YFcn6~nx5H^%rnMey7c*}7EL_HaQbFq1*+#{y3b#He%DI>{dpvkwFvH~lbJ~Y; z4<2UznU3*EhP*aOY}MVzEI!PT6!4EIWEcFWG|`jACY7yz;z@%KJ(6F1wJskhPTLT^ zvxixK2II#`qU8d6lUxsEr#;{`{xD6l;yBNqbhabxVJrvA!x-$0nD5VMTz}?(dfEeH eV}|&MM*EGn4i}`FYzl#;1B0ilpUXO@geCx(Ftua= diff --git a/core/src/main/assets/interfaces/status_pane.png b/core/src/main/assets/interfaces/status_pane.png index a22ea846071dd46ed7e6af7c50058606d6314e86..dd53e404319bde437b4db826335e5dd313bf27e7 100644 GIT binary patch literal 3012 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 Z{tvXj0GfXniopN?002ovPDHLkV1hP2lY;;N diff --git a/core/src/main/assets/interfaces/status_pane_normal.png b/core/src/main/assets/interfaces/status_pane_normal.png index 4161e1d37808d1950c0f9be02b92a92b7996db0e..c4afb2643fc6fb2c9c8b5fb2350aa01af301ad1c 100644 GIT binary patch delta 1114 zcmV-g1f~1K3&sqP7Y>dH0{{R3&g$@q0004ou_bH)CJwLY51h^tjkghaod#5J1363r zA}tMwvyT4&1f43!;E-wn004rMnE`y0zyS(>A}sj?000B+Nkle&>5QiH! z*}(~jh%q8YL_|bHL|ie^NWAa+zHdu?_AY(!KbIj(VujgZ2BxQd;Co9_mETvDPS>)( z2B0QJOB`b0MWXnTK5^BTQy#=TZ#sgwANiwbe9nyM3M4i}kl9XRuRA&^aNk&?=CvmqQMUkJ>m zw@OLR8V%uS`9feWvrS57t~-P?y7M<;z7WV|w@b<9Oonj8d?ApZ-63T*Z!&}<<_m%O zxt&tx=JkhgcI zQVM16aV^Hk7Xp>yJ}Jct_s03v+5*+mekrA@BY|4^fRu90kwCq2P)eolNT5+YG=QZE z(-Uac4zGvD)*c(<=mM?!k@aw|*$4a2&=m+8N7uu<0bO7UWZT_a3{D7wMRb9<^zp`9YM&Iem(T^I-{oE>{9|;e z1eW{I2qgX0X^4>suz%(OH$O_i9dODR%L1oOv767}j3Jiu8Jso4c0Pl1##k0OZ;IV~ z1{VymoX_B*8MgBoT1qL|`H?5zy_~u|6g1*Y{`w%KF|5RzMX{)%QX8 z!WQp+<&gS52zoDU15^Q3eZLe6;JvLIQr~yN8Nhp6H>AGzIxBEY0Y!a(&y)SPb$}?K zs_&ib0abnPWDlt7dnbE9Ro@5AvH({=Ro^>VM5_AU$s$tK_f8g(s=jx!h!pkx+5rLP zzoDwWce02S^}X+hdjM5HQQ!N`u))QvkR$4QLAAmCpx#?Vb<{l|sqcH#nq2`Gn^02U z_o%lV2}tVuesk_SS;dln`o7?Cz7HP+S04!x zSFyCdmw_b^TYc^uz}08Nb~A#uqi4eKTx0-oKjLH&h36szi2D&Iizqx789>~RI9WuU zs6Ehe^GrCET#kS{c_vgYA{QS{$rlkbzu~Y6gImOy-;h`aZWCjFe8gfKxI>KT6^(V^ zE-}FFk&z0@^2?SinbO-~%!6mKb delta 988 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 O3TUb6t0Gh!;{F3%Eg_Zw literal 3516 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 diff --git a/core/src/main/assets/interfaces/toolbar_normal.png b/core/src/main/assets/interfaces/toolbar_normal.png index dbb1f1ad46a3bcab7543a6eb31c5ca3af01a4539..b3e49dcad410274d91259ef26748075b31c9c3ad 100644 GIT binary patch literal 4769 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

@4w)33CC8>ph+rf@DNyC-z_HiC~ZvVln zC(hlwz@wLYv$$7|QYf36VIyzK!gVcd43@$*C!tTF))OcJDi|nr)qG{TfxuFA^$VY3 zJRf{8!OM3J@|lFDPi&cD0P0Dh;Uvu1zty&%69w*$8&=3ngJ-=up34vizsIbt+W=r} zGr|nKD8;PCb^HnV_&xeu*|z!I$pgUsG~+Dab3FczD4ID)TJaNZ?k=&9)F*Po?>AOr z@W5DA5;rE5BPnap9ljq8ZB?$dtwFu7zAu(wV>1%VLfY%dxcl?1)i-EOL9Gk=tn<)* zt$1+qF8ld(OvF=T11%UUpWg?Ko_D5FPA7=l&ZFv&{$fBUX*950UBbZgr;q!--1}h+ z==Kx-_UB|ca3{YW^T_oc33&g_2TAupAD?$l%LI-5P+^f&QC$B1XttZ~)oG|j79)SZ z6-$1d+}vfX^Zo0z@p}wFe%)?fZc#}7I6>49m{yR(#Bs&vTtJV%9ZL2B_)q(ei-ZU$ zPRkEU;nd6&JtS_5=fSRCM^pu7qcfsq`Tat3wh@C5Ldvne;=rxm&uK~#yWr@ozTUzB zs1ZNkG3?k?^tv_kn9SxP(iDseq&G@Y22{=_46TTIH01rvmPyo3e5-t1)U3%fJf9{p z>)u~8JA4vN>&qY_?^x{6nEp*@ed3l`6xC5VhjF0GJ@ZqvdOk>Rsd84cA!Gre*c{l! zg)HdvqQj`y_tOt7Ttn&2^&JmH0fXaEkiQWRnqY-f%ZQ`2p)!4>2xpGQ{@jOc+dA>TMD!l9ma*(V~t z|KhHQ;!8VELY)piX_1ZH!kK`vzbpCc^-Ij>n#Xpzx|DHghU5APOxE4mHQ5|TubA5x zK;h&4egV%e+eR|R^yz0HF4)w(Q2(Sh2F8a5v$9zTj`%w&onO+Wq;N~{ml+*M^k~;B zqxqi}zR66K;MU&<%lJqQkpO0{4$G4hGs>C~-R`L{isjDz)~#?XwHPE?{l0$Ig9c#D z2(rEg33>74fmB47q1awzU)^Z$ZDj^rv$sIylz*37BinLn8k#fVY(F_t(Cy)oCk&sj z%`%|Wbmb;{OH6q9_Uh*A5S2o<`?w~Cj`Q^pkxbLkD>@mP274@T6x0WN9j%Pw7B@vc zTNP!^ckI>2I?P&p1sro$4T(Nm-M+WCEN-P`skR#Xt^enY+hbQanDieI!}(NER!#r( zzkb6wV10o0hqCMG`oETx8fPNv@y&UFb>wpMC){^5ZOPWH-Rg5oTC3^P(kw3DRifJe z#<4l(g-q}kWBztFN3!bO`po&M+$*Fxf+X^p^FerHqs3!=y8!fLqXp_3mo6%=u@}6w zzSisrz;G=s?1+0S+Xy1!2rzE$;Y%+WOL`XU;hIwIHpr{?k$ULHU~Kv2v{2v0<<8~U zH<$4gPUf+g!eg(Ajto`=C}oK`m}pj(&N2WRT0RcoZI!v`!7D3WoAL6@JHm_%eAQ%6H{i?QcJldxey$W9w`~D>&OZ z&*IGgjSUaSEdBlnjeD>w(D1?>Q}UPSpaKy__Io>9M5JTjT(z~eE%kOs>W3hU`{@at zEfmm`GExw{*yv-j$M(t!omtHbNQJ`*H%0y#r4hAY0q$-X+N;h!*s*j?O!SEz=*>Pm zv)Y!3h#|*-SXt+*+xn%wMr(VSHwNqZSD_o^dO55_yHrROUq`u7;eB4|?}!E>(w7FX zf$&HRlbN5mF$HB_CV!23SswT&rDpBwRU5BuyE=eX@zK$LPq90h$L#pP`r z61JZr`6jKCys9eN0*yI~jS96BsZLLe%RPs+Q>TNW=L|P5Z+9iRSTJ_skekWiUt}lq zVwb5y-oXRjP3z=6_}gKTp_|=-`72SPy zKA}#3m(7*ld1~K1Sn$qb>1mF&_9n)7bc}$wC^4#|DwTB9jQbkpNK<&X$05muQGE3J zUM%?%iPqEW`#fS?!_WT&YI2$Fs2OGse^RddzZ{vT*)VoD>cXhV(9+vbZneUmjW4E; zpkFi4A0*O}Im{6F7>=82I<`_uKqc}0_oVk6Wiy8JGyPw!z4MHQ YyKDbV=?2Zy^QR4= 50) { badge = Badge.GAMES_PLAYED_2; } - if (Rankings.INSTANCE.totalNumber >= 250) { + if (Rankings.INSTANCE.totalNumber >= 75) { badge = Badge.GAMES_PLAYED_3; } - if (Rankings.INSTANCE.totalNumber >= 1000) { + if (Rankings.INSTANCE.totalNumber >= 100) { badge = Badge.GAMES_PLAYED_4; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/QuickSlot.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/QuickSlot.java index d4a57d93e..0471c6fc7 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/QuickSlot.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/QuickSlot.java @@ -21,7 +21,6 @@ package com.shatteredpixel.shatteredpixeldungeon; -import com.shatteredpixel.shatteredpixeldungeon.custom.utils.Constants; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.watabou.utils.Bundlable; 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. - public static int SIZE = Constants.MAX_QUICKSLOTS; - private Item[] slots = new Item[SIZE]; + public static int SIZE = 12; + + public static int VSIZE = 9; + + public int quickslots; + private Item[] slots = new Item[SIZE]; //direct array interaction methods, everything should build from these methods. diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDAction.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDAction.java index cb226f785..7d9979a00 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDAction.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDAction.java @@ -55,6 +55,8 @@ public class SPDAction extends GameAction { public static final GameAction SE = new SPDAction("se"); 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 QUICKSLOT_1 = new SPDAction("quickslot_1"); 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.SPACE, SPDAction.WAIT ); + defaultBindings.put( Input.Keys.K, SPDAction.SLPD ); + defaultBindings.put( Input.Keys.UP, SPDAction.N ); defaultBindings.put( Input.Keys.LEFT, SPDAction.W ); defaultBindings.put( Input.Keys.DOWN, SPDAction.S ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDSettings.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDSettings.java index 557f65bbd..93d1179f6 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDSettings.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDSettings.java @@ -137,6 +137,8 @@ public class SPDSettings extends GameSettings { private static final String ATBSettings = "ATBsettings"; + private static final String V1TOOL = "v1tool"; + public static void fullscreen( boolean value ) { put( KEY_FULLSCREEN, value ); @@ -231,7 +233,7 @@ public class SPDSettings extends GameSettings { } 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){ //force mobile UI if there is not enough space for full UI float wMin = Game.width / PixelScene.MIN_WIDTH_FULL; @@ -240,6 +242,10 @@ public class SPDSettings extends GameSettings { size = 0; } } + + if(size == 2){ + size = 1; + } 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(){ return getBoolean(KEY_SYSTEMFONT, (language() == Languages.CHINESE || language() == Languages.JAPANESE)); @@ -544,4 +554,10 @@ public class SPDSettings extends GameSettings { public static void ClassPage(boolean value) { put( KEY_PAGE, value ); } + + public static boolean quickSwapper() { + return getBoolean(V1TOOL, false); + } + + public static void quickSwapper(boolean value ){ put( V1TOOL, value ); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Rat.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Rat.java index eb186b180..f84ce3ac7 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Rat.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Rat.java @@ -37,7 +37,7 @@ public class Rat extends Mob { HP = HT = 8; defenseSkill = 2; - maxLvl = 30; + maxLvl = 5; } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/utils/Constants.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/utils/Constants.java index 6877fa834..400270d2c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/utils/Constants.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/custom/utils/Constants.java @@ -1,15 +1,9 @@ package com.shatteredpixel.shatteredpixeldungeon.custom.utils; -import com.watabou.noosa.Game; - public class Constants { public static final int MAX_DEPTH = 26; 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 boolean gameIsAndroid(){ - return Game.platform.getClass().getSimpleName().contains("Android"); - } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/lightblack/OilLantern.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/lightblack/OilLantern.java index 49fea8753..caf5b778b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/lightblack/OilLantern.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/lightblack/OilLantern.java @@ -1,7 +1,4 @@ package com.shatteredpixel.shatteredpixeldungeon.items.lightblack; -// -// Decompiled by Jadx - 759ms -// import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero; @@ -71,14 +68,14 @@ public class OilLantern extends Item { } public void storeInBundle(Bundle bundle) { - OilLantern.super.storeInBundle(bundle); + super.storeInBundle(bundle); bundle.put(ACTIVE, this.active); bundle.put(CHARGE, this.charge); bundle.put(FLASKS, this.flasks); } public void restoreFromBundle(Bundle bundle) { - OilLantern.super.restoreFromBundle(bundle); + super.restoreFromBundle(bundle); this.active = bundle.getBoolean(ACTIVE); this.charge = bundle.getInt(CHARGE); this.flasks = bundle.getInt(FLASKS); @@ -146,7 +143,7 @@ public class OilLantern extends Item { } public void refills(Hero hero) { - this.flasks--; + this.plingks--; this.charge += Math.min(MIX_CHARGE,100); hero.spend(TIME_TO_USE); hero.busy(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/EyeRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/EyeRoom.java index 402e2d3f6..296eb5b58 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/EyeRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/EyeRoom.java @@ -12,7 +12,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mimic; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.SRPDHBLR; import com.shatteredpixel.shatteredpixeldungeon.items.Generator; -import com.shatteredpixel.shatteredpixeldungeon.items.Gold; import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; @@ -83,8 +82,7 @@ public class EyeRoom extends SpecialRoom { int chestPos = (top + 6) * level.width() + left + 6; - /** 套五个宝箱 */ - level.drop( new Gold(),chestPos).type = Heap.Type.TELECRYSTL; + /** 套4个宝箱 */ 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.WEAPON ) ), diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/YinYangRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/YinYangRoom.java index 3ac78240a..24ec204fa 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/YinYangRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/YinYangRoom.java @@ -8,6 +8,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.Item; 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.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; @@ -120,11 +121,11 @@ public class YinYangRoom extends SpecialRoom { if(Dungeon.depth == 1){ door.set(Door.Type.REGULAR); } else { - door.set(Door.Type.HIDDEN); + door.set(Door.Type.LOCKED); } } - + level.addItemToSpawn( new IronKey( Dungeon.depth ) ); level.addItemToSpawn( new CrystalKey( Dungeon.depth ) ); level.addItemToSpawn( new PotionOfLevitation()); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java index 15741978c..3e12ed3bd 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java @@ -120,6 +120,7 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.StyledButton; import com.shatteredpixel.shatteredpixeldungeon.ui.Tag; import com.shatteredpixel.shatteredpixeldungeon.ui.TargetHealthIndicator; import com.shatteredpixel.shatteredpixeldungeon.ui.Toast; +import com.shatteredpixel.shatteredpixeldungeon.ui.ToobarV; import com.shatteredpixel.shatteredpixeldungeon.ui.Toolbar; import com.shatteredpixel.shatteredpixeldungeon.ui.Window; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; @@ -217,7 +218,8 @@ public class GameScene extends PixelScene { private InventoryPane inventory; private static boolean invVisible = true; - private Toolbar toolbar; + private ToobarV toolbar; + private Toolbar toolbarv1; private Toast prompt; private AttackIndicator attack; @@ -414,19 +416,35 @@ public class GameScene extends PixelScene { bringToFront(status); } - toolbar = new Toolbar(); - toolbar.camera = uiCamera; - add( toolbar ); + /**Toolbar V1+V2 */ + if(SPDSettings.quickSwapper()) { + toolbarv1 = new Toolbar(); + toolbarv1.camera = uiCamera; + add(toolbarv1); + } else { + toolbar = new ToobarV(); + toolbar.camera = uiCamera; + add( toolbar ); + } + if (uiSize == 2) { inventory = new InventoryPane(); inventory.camera = uiCamera; inventory.setPos(uiCamera.width - inventory.width(), uiCamera.height - inventory.height()); add(inventory); - - toolbar.setRect( 0, uiCamera.height - toolbar.height() - inventory.height(), uiCamera.width, toolbar.height() ); + if(SPDSettings.quickSwapper()) { + 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 { - 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(); @@ -935,7 +953,9 @@ public class GameScene extends PixelScene { 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) { scene.log.setRect(tagWidth, y, uiCamera.width - tagWidth - insets.right - invWidth, 0); } else if (invWidth > 0) { @@ -944,7 +964,7 @@ public class GameScene extends PixelScene { 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){ pos = scene.status.top(); } @@ -1190,7 +1210,13 @@ public class GameScene extends PixelScene { } 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 ) { @@ -1308,10 +1334,19 @@ public class GameScene extends PixelScene { if (scene != null && scene.inventory != null){ if (scene.inventory.visible){ 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 { 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(); } @@ -1605,7 +1640,18 @@ public class GameScene extends PixelScene { selectCell( defaultCellListener ); QuickSlotButton.cancel(); 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(){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PixelScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PixelScene.java index 4488a38a8..20286c4db 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PixelScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PixelScene.java @@ -147,12 +147,12 @@ public class PixelScene extends Scene { renderedTextPageSize = 1024; } //asian languages have many more unique characters, so increase texture size to anticipate that - if - (Messages.lang() == Languages.CHINESE || + //asian languages have many more unique characters, so increase texture size to anticipate that + if (Messages.lang() == Languages.CHINESE || Messages.lang() == Languages.JAPANESE){ renderedTextPageSize *= 2; } - Game.platform.setupFontGenerators(renderedTextPageSize, false); + Game.platform.setupFontGenerators(renderedTextPageSize, SPDSettings.systemFont()); Tooltip.resetLastUsedTime(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/Beta.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/Beta.java index 02d2160a6..e69de29bb 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/Beta.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/Beta.java @@ -1,5 +0,0 @@ -package com.shatteredpixel.shatteredpixeldungeon.services.analyticsfirebase; - -public class Beta { - public static FireBaseService service; -} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BossHealthBar.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BossHealthBar.java index c3ec72457..82ba40bdc 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BossHealthBar.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BossHealthBar.java @@ -166,11 +166,15 @@ public class BossHealthBar extends Component { float health = boss.HP; float shield = boss.shielding(); float max = boss.HT; - int maxHp = boss.HP; hp.scale.x = Math.max( 0, (health-shield)/max); shieldedHP.scale.x = health/max; rawShielding.scale.x = shield/max; + + if (hp.scale.x < 0.25f){ + bleed( true ); + } + if (shield <= 0){ hpText.text(health + "/" + max); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/JoinIndicator.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/JoinIndicator.java index 0d6a45234..7185dc1db 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/JoinIndicator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/JoinIndicator.java @@ -66,7 +66,7 @@ public class JoinIndicator extends Button { bg.hardlight(0x00ffff); add(bg); - add(slot = new Toolbar.Tool(48, 26, 48, 72) { + add(slot = new Toolbar.Tool(48, 26, 24, 72) { @Override protected void onClick() { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickSlotButton.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickSlotButton.java index 20ddf8d88..6bc82cd24 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickSlotButton.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickSlotButton.java @@ -70,6 +70,10 @@ public class QuickSlotButton extends Button { reset(); } + public void slotMargins( int left, int top, int right, int bottom){ + slot.setMargins(left, top, right, bottom); + } + public static void reset() { instance = new QuickSlotButton[Constants.MAX_QUICKSLOTS]; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java index 5f7e460eb..2a0e2e426 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java @@ -104,7 +104,7 @@ public class StatusPane extends Component { public JoinIndicator joinxxx; public LanterFireCator lanter; - private static String asset = Assets.Interfaces.STATUS; + private static String asset = Assets.Interfaces.STATUS_DARK; private boolean large; @@ -164,8 +164,10 @@ public class StatusPane extends Component { else hg = new Image(asset, 0, 45, 49, 4); add( hg ); - if (large) icehp = new Image(asset, 0, 128, 128, 7); - else icehp = new Image(asset, 0, 49, 52, 4); + if (large) + icehp = new Image(asset, 0, 135, 128, 6); + else icehp = new Image(asset, 0, 49, 52, 4); + add( icehp ); lanterfirevae = new Image(Assets.Interfaces.LANTERLING); @@ -175,7 +177,6 @@ public class StatusPane extends Component { hpText.alpha(0.6f); add(hpText); - hgText = new BitmapText(PixelScene.pixelFont); hgText.alpha(0.6f); add(hgText); @@ -280,14 +281,18 @@ public class StatusPane extends Component { PixelScene.align(hpText); hg.x= x + 30; - hg.y= y + 10; + hg.y= y + 10f; hgText.x = x+80; hgText.y = hg.y; PixelScene.align(hgText); icehp.x = x+ 30; - icehp.y = y + 4; + icehp.y = y + 2f; + + icehpText.x = x+80; + icehpText.y = icehp.y-0.6f; + PixelScene.align(icehpText); expText.x = exp.x + (128 - expText.width())/2f; expText.y = exp.y; @@ -378,6 +383,12 @@ public class StatusPane extends Component { public void update() { super.update(); + if (SPDSettings.ClassUI()) { + asset = Assets.Interfaces.STATUS; + } else { + asset = Assets.Interfaces.STATUS_DARK; + } + int maxHunger = (int) Hunger.STARVING; int maxPureSole = Dungeon.hero.lanterfire; int mtPureSole = 100; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ToobarV.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ToobarV.java new file mode 100644 index 000000000..046e70b71 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ToobarV.java @@ -0,0 +1,632 @@ +package com.shatteredpixel.shatteredpixeldungeon.ui; + +import static com.shatteredpixel.shatteredpixeldungeon.QuickSlot.VSIZE; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.QuickSlot; +import com.shatteredpixel.shatteredpixeldungeon.SPDAction; +import com.shatteredpixel.shatteredpixeldungeon.SPDSettings; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; +import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTerrainTilemap; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndKeyBindings; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndQuickBag; +import com.watabou.gltextures.TextureCache; +import com.watabou.input.GameAction; +import com.watabou.noosa.Camera; +import com.watabou.noosa.ColorBlock; +import com.watabou.noosa.Game; +import com.watabou.noosa.Gizmo; +import com.watabou.noosa.Image; +import com.watabou.noosa.PointerArea; +import com.watabou.noosa.audio.Sample; +import com.watabou.noosa.ui.Component; +import com.watabou.utils.Point; +import com.watabou.utils.PointF; + +public class ToobarV extends Component { + + private Tool btnWait; + private Tool btnExamine; + private Tool btnInventory; + private SwitchQuickSlotTool btnSwitchSlot; + private QuickslotTool[] btnQuick; + private int numVisibleSlots; + + private PickedUpItem pickedUp; + + private boolean lastEnabled = true; + public boolean examining = false; + + private static ToobarV instance; + + public enum Mode { + SPLIT, + GROUP, + CENTER + } + + public ToobarV() { + super(); + instance = this; + height = btnInventory.height(); + } + + @Override + protected void createChildren() { + + numVisibleSlots = 2; + if (PixelScene.uiCamera.width > 120) numVisibleSlots++; + if (PixelScene.uiCamera.width > 138) numVisibleSlots++; + if (PixelScene.uiCamera.width > 156) numVisibleSlots++; + if (PixelScene.uiCamera.width > 174) numVisibleSlots++; + if (PixelScene.uiCamera.width > 192) numVisibleSlots++; + if (PixelScene.uiCamera.width > 210) numVisibleSlots++; + if (PixelScene.uiCamera.width > 228) numVisibleSlots++; + + if (numVisibleSlots < VSIZE) { + numVisibleSlots--; + add( btnSwitchSlot = new SwitchQuickSlotTool( 125, 0, 16, 16) ); + } + + btnQuick = new QuickslotTool[VSIZE]; + for (int i = 0; i < btnQuick.length; i++){ + add( btnQuick[i] = new QuickslotTool(64, 0, 22, 24, i) ); + } + + add(btnWait = new Tool(24, 0, 20, 26) { + @Override + protected void onClick() { + if (Dungeon.hero.ready && !GameScene.cancel()) { + examining = false; + Dungeon.hero.rest(false); + } + } + + @Override + public GameAction keyAction() { + return SPDAction.WAIT; + } + + @Override + protected String hoverText() { + return Messages.titleCase(Messages.get(WndKeyBindings.class, "wait")); + } + + protected boolean onLongClick() { + if (Dungeon.hero.ready && !GameScene.cancel()) { + examining = false; + Dungeon.hero.rest(true); + } + return true; + } + }); + + add(new Button(){ + @Override + protected void onClick() { + if (Dungeon.hero.ready && !GameScene.cancel()) { + examining = false; + Dungeon.hero.rest(true); + } + } + + @Override + public GameAction keyAction() { + if (btnWait.active) return SPDAction.REST; + else return null; + } + }); + + add(btnExamine = new Tool(44, 0, 20, 26) { + @Override + protected void onClick() { + if (Dungeon.hero.ready) { + if (!examining && !GameScene.cancel()) { + GameScene.selectCell(informer); + examining = true; + } else if (examining) { + informer.onSelect(null); + Dungeon.hero.search(true); + } + } + } + + @Override + public GameAction keyAction() { + return SPDAction.EXAMINE; + } + + @Override + protected String hoverText() { + return Messages.titleCase(Messages.get(WndKeyBindings.class, "examine")); + } + + @Override + protected boolean onLongClick() { + Dungeon.hero.search(true); + return true; + } + }); + + addToBack(btnInventory = new Tool(0, 0, 24, 26) { + private GoldIndicator gold; + + @Override + protected void onClick() { + if (Dungeon.hero.ready || !Dungeon.hero.isAlive()) { + if (!GameScene.cancel()) { + GameScene.show(new WndBag(Dungeon.hero.belongings.backpack)); + } + } + } + + @Override + public GameAction keyAction() { + return SPDAction.INVENTORY; + } + + @Override + protected String hoverText() { + return Messages.titleCase(Messages.get(WndKeyBindings.class, "inventory")); + } + + @Override + protected boolean onLongClick() { + GameScene.show(new WndQuickBag(null)); + return true; + } + + @Override + protected void createChildren() { + super.createChildren(); + gold = new GoldIndicator(); + add(gold); + } + + @Override + protected void layout() { + super.layout(); + gold.fill(this); + } + }); + + add(pickedUp = new PickedUpItem()); + } + + @Override + protected void layout() { + + float right = width; + + final int quickSlots = numVisibleSlots == QuickSlot.VSIZE ? 0 : Dungeon.quickslot.quickslots; + int slotIndex; + for(int i = 0; i < numVisibleSlots; i++) { + slotIndex = boundIndex(quickSlots + i); + if (i == 0 && !SPDSettings.flipToolbar() || + i == numVisibleSlots -1 && SPDSettings.flipToolbar()){ + btnQuick[slotIndex].border(0, 2); + btnQuick[slotIndex].frame(106, 0, 19, 24); + } else if (i == 0 && SPDSettings.flipToolbar() || + i == numVisibleSlots -1 && !SPDSettings.flipToolbar()){ + btnQuick[slotIndex].border(2, 1); + btnQuick[slotIndex].frame(86, 0, 20, 24); + } else { + btnQuick[slotIndex].border(0, 1); + btnQuick[slotIndex].frame(88, 0, 18, 24); + } + } + + boolean[] visible = new boolean[QuickSlot.VSIZE]; + slotIndex = boundIndex(quickSlots); + visible[slotIndex] = true; + + + if (SPDSettings.interfaceSize() == 0) { + switch (Mode.valueOf(SPDSettings.toolbarMode())) { + case SPLIT: + btnWait.setPos(x, y); + btnExamine.setPos(btnWait.right(), y); + + btnInventory.setPos(right - btnInventory.width(), y); + + btnQuick[slotIndex].setPos(btnInventory.left() - btnQuick[slotIndex].width(), y + 2); + for (int i = 1; i < numVisibleSlots; i++) { + slotIndex = boundIndex(quickSlots + i); + visible[slotIndex] = true; + btnQuick[slotIndex].setPos(btnQuick[boundIndex(quickSlots + i - 1)].left() - btnQuick[slotIndex].width(), y + 2); + } + if (numVisibleSlots < QuickSlot.VSIZE) + btnSwitchSlot.setPos(btnQuick[slotIndex].left() - btnSwitchSlot.width(), y + 10); + + break; + + //center = group but.. well.. centered, so all we need to do is pre-emptively set the right side further in. + case CENTER: + float toolbarWidth = btnWait.width() + btnExamine.width() + btnInventory.width(); + for (int i = 0; i < numVisibleSlots; i++) { + toolbarWidth += btnQuick[boundIndex(quickSlots + i)].width(); + } + if (numVisibleSlots < QuickSlot.VSIZE) toolbarWidth += btnSwitchSlot.width(); + right = (width + toolbarWidth) / 2; + + case GROUP: + btnWait.setPos(right - btnWait.width(), y); + btnExamine.setPos(btnWait.left() - btnExamine.width(), y); + btnInventory.setPos(btnExamine.left() - btnInventory.width(), y); + + btnQuick[slotIndex].setPos(btnInventory.left() - btnQuick[slotIndex].width(), y + 2); + for (int i = 1; i < numVisibleSlots; i++) { + slotIndex = boundIndex(quickSlots + i); + visible[slotIndex] = true; + btnQuick[slotIndex].setPos(btnQuick[boundIndex(quickSlots + i - 1)].left() - btnQuick[slotIndex].width(), y + 2); + } + if (numVisibleSlots < QuickSlot.VSIZE) + btnSwitchSlot.setPos(btnQuick[slotIndex].left() - btnSwitchSlot.width(), y + 10); + + break; + } + } else { + btnWait.setPos(x, y); + btnExamine.setPos(btnWait.right(), y); + + btnInventory.setPos(right - btnInventory.width(), y); + + btnQuick[slotIndex].setPos(btnInventory.left() - btnQuick[slotIndex].width(), y + 2); + for (int i = 1; i < numVisibleSlots; i++) { + slotIndex = boundIndex(quickSlots + i); + visible[slotIndex] = true; + btnQuick[slotIndex].setPos(btnQuick[boundIndex(quickSlots + i - 1)].left() - btnQuick[slotIndex].width(), y + 2); + } + if (numVisibleSlots < QuickSlot.VSIZE) + btnSwitchSlot.setPos(btnQuick[slotIndex].left() - btnSwitchSlot.width(), y + 10); + } + for (int i = 0; i < visible.length; i ++) { + btnQuick[i].visible = visible[i]; + if (!visible[i]) btnQuick[i].setPos(Integer.MAX_VALUE, Integer.MAX_VALUE); + } + right = width; + + if (SPDSettings.interfaceSize() > 0){ + btnInventory.setPos( right- btnInventory.width(), y); + btnWait.setPos(right - btnInventory.width(), y/3); + btnExamine.setPos(right - btnInventory.width(), btnWait.bottom()); + float toolbarWidth = btnWait.width() + btnExamine.width() + btnInventory.width(); + for (int i = 0; i < numVisibleSlots; i++) { + toolbarWidth += btnQuick[boundIndex(quickSlots + i)].width(); + } + if (numVisibleSlots < QuickSlot.VSIZE) toolbarWidth += btnSwitchSlot.width(); + right = (width + toolbarWidth)/2; + } + + if (SPDSettings.flipToolbar()) { + + btnWait.setPos( (right - btnWait.right()), y); + btnExamine.setPos( (right - btnExamine.right()), y); + btnInventory.setPos( (right - btnInventory.right()), y); + + for(int i = 0; i < numVisibleSlots; i++) { + slotIndex = boundIndex(quickSlots + i); + btnQuick[slotIndex].setPos( right - btnQuick[slotIndex].right(), y+2); + } + if (numVisibleSlots < QuickSlot.VSIZE) btnSwitchSlot.setPos(right - btnSwitchSlot.right(), y+10); + + } + + + } + + public static void updateLayout(){ + if (instance != null) instance.layout(); + } + + @Override + public void update() { + super.update(); + + if (lastEnabled != (Dungeon.hero.ready && Dungeon.hero.isAlive())) { + lastEnabled = (Dungeon.hero.ready && Dungeon.hero.isAlive()); + + for (Gizmo tool : members.toArray(new Gizmo[0])) { + if (tool instanceof Tool) { + ((Tool)tool).enable( lastEnabled ); + } + } + } + + if (!Dungeon.hero.isAlive()) { + btnInventory.enable(true); + } + } + + public void pickup(Item item, int cell ) { + pickedUp.reset( item, + cell, + btnInventory.centerX(), + btnInventory.centerY()); + } + + private int boundIndex(int index) { + int result = index; + while (result < 0) result += QuickSlot.VSIZE; + while (result >= QuickSlot.VSIZE) result -= QuickSlot.VSIZE; + return result; + } + + + @SuppressWarnings("FieldMayBeFinal") + private static CellSelector.Listener informer = new CellSelector.Listener() { + @Override + public void onSelect( Integer cell ) { + instance.examining = false; + GameScene.examineCell( cell ); + } + @Override + public String prompt() { + return Messages.get(Toolbar.class, "examine_prompt"); + } + }; + + private static class SwitchQuickSlotTool extends Tool { + + Tool bg; + ColorBlock[] fill; + + public SwitchQuickSlotTool(int x, int y, int width, int height) { + super(x, y, width, height); + } + + + @Override + protected void onClick() { + // + } + private Toolbar.Tool slot; + @Override + protected void createChildren() { + + super.createChildren(); + + bg = new Tool(72, 26, 16, 16){ + @Override + protected void onClick() { + super.onClick(); + Dungeon.quickslot.quickslots = instance.boundIndex(Dungeon.quickslot.quickslots + instance.numVisibleSlots); + instance.layout(); + } + @Override + protected String hoverText() { + return Messages.titleCase(Messages.get(WndKeyBindings.class, "quickslot_switch")); + } + + @Override + protected boolean onLongClick() { + GameScene.show(new WndQuickBag(null)); + return true; + } + + @Override + protected void onPointerDown() { + Sample.INSTANCE.play( Assets.Sounds.CLICK, 0.7f, 0.7f, 1.2f ); + super.onPointerDown(); + } + + @Override + public GameAction keyAction() { + return SPDAction.SLPD; + } + + }; + fill = new ColorBlock[9]; + for (int i = 0; i < fill.length; i ++) { + fill[i] = new ColorBlock(4, 4, SPDSettings.ClassUI() ? 0xFF00ffff : 0xffffff00); + add(fill[i]); + } + add(bg); + } + + protected void setFill(int quickslots) { + boolean[] visible = new boolean[9]; + for (int i = 0; i < instance.numVisibleSlots; i ++) { + visible[instance.boundIndex(i + quickslots)] = true; + } + fill[0].x = fill[3].x = fill[6].x = x + 2; + fill[1].x = fill[4].x = fill[7].x = x + 6; + fill[2].x = fill[5].x = fill[8].x = x + 10; + fill[0].y = fill[1].y = fill[2].y = y + 2; + fill[3].y = fill[4].y = fill[5].y = y + 6; + fill[6].y = fill[7].y = fill[8].y = y + 10; + for (int i = 0; i < visible.length; i ++) { + PixelScene.align(fill[i]); + fill[i].visible = visible[i]; + } + } + + @Override + protected void layout(){ + super.layout(); + bg.x = x; + bg.y = y; + PixelScene.align(bg); + setFill(Dungeon.quickslot.quickslots); + } + + + + } + + private static class Tool extends Button { + + private static final int BGCOLOR = 0x7B8073; + + private Image base; + + @Override + public void update() { + super.update(); + if (SPDSettings.ClassUI()) { + base.texture = TextureCache.get(Assets.Interfaces.TOOLBAR); + } else { + base.texture = TextureCache.get(Assets.Interfaces.TOOLBARDRAK); + } + } + + public Tool( int x, int y, int width, int height ) { + super(); + + hotArea.blockLevel = PointerArea.ALWAYS_BLOCK; + frame(x, y, width, height); + } + + public void frame( int x, int y, int width, int height) { + base.frame( x, y, width, height ); + + this.width = width; + this.height = height; + } + + @Override + protected void createChildren() { + super.createChildren(); + + base = new Image( Assets.Interfaces.TOOLBAR ); + add( base ); + } + + @Override + protected void layout() { + super.layout(); + + base.x = x; + base.y = y; + } + + @Override + protected void onPointerDown() { + base.brightness( 1.4f ); + } + + @Override + protected void onPointerUp() { + if (active) { + base.resetColor(); + } else { + base.tint( BGCOLOR, 0.7f ); + } + } + + public void enable( boolean value ) { + if (value != active) { + if (value) { + base.resetColor(); + } else { + base.tint( BGCOLOR, 0.7f ); + } + active = value; + } + } + + } + + @SuppressWarnings("FieldMayBeFinal") + private static class QuickslotTool extends Tool { + + private QuickSlotButton slot; + private int borderLeft = 2; + private int borderRight = 2; + + public QuickslotTool( int x, int y, int width, int height, int slotNum ) { + super( x, y, width, height ); + + slot = new QuickSlotButton( slotNum ); + add( slot ); + } + + public void border( int left, int right ){ + borderLeft = left; + borderRight = right; + layout(); + } + + @Override + protected void layout() { + super.layout(); + slot.setRect( x, y, width, height ); + slot.slotMargins(borderLeft, 4, borderRight, 2); + } + + @Override + public void enable( boolean value ) { + super.enable( value ); + slot.enable( value ); + } + } + + public static class PickedUpItem extends ItemSprite { + + private static final float DURATION = 0.5f; + + private float startScale; + private float startX, startY; + private float endX, endY; + private float left; + + public PickedUpItem() { + super(); + + originToCenter(); + + active = + visible = + false; + } + + public void reset( Item item, int cell, float endX, float endY ) { + view( item ); + + active = + visible = + true; + + PointF tile = DungeonTerrainTilemap.raisedTileCenterToWorld(cell); + Point screen = Camera.main.cameraToScreen(tile.x, tile.y); + PointF start = camera().screenToCamera(screen.x, screen.y); + + x = this.startX = start.x - width() / 2; + y = this.startY = start.y - width() / 2; + + this.endX = endX - width() / 2; + this.endY = endY - width() / 2; + left = DURATION; + + scale.set( startScale = Camera.main.zoom / camera().zoom ); + + } + + @Override + public void update() { + super.update(); + + if ((left -= Game.elapsed) <= 0) { + + visible = + active = + false; + if (emitter != null) emitter.on = false; + + } else { + float p = left / DURATION; + scale.set( startScale * (float)Math.sqrt( p ) ); + + x = startX*p + endX*(1-p); + y = startY*p + endY*(1-p); + } + } + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Toolbar.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Toolbar.java index f49e66c1c..b4ad8fbd0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Toolbar.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Toolbar.java @@ -232,7 +232,7 @@ public class Toolbar extends Component { */ float wMin = Game.width / PixelScene.MIN_WIDTH_FULL; float hMin = Game.height / PixelScene.MIN_HEIGHT_FULL; - final int maxHorizontalQuickslots = PixelScene.landscape() ? 8 : 4; + final int maxHorizontalQuickslots = PixelScene.landscape() ? 9 : 3; float right = width; if (SPDSettings.interfaceSize() > 0){ btnInventory.setPos(right - btnInventory.width(), y); @@ -479,7 +479,8 @@ public class Toolbar extends Component { @Override protected void layout() { super.layout(); - slot.setRect( x + borderLeft, y + 2, width - borderLeft-borderRight, height - 4 ); + slot.setRect( x, y, width, height ); + slot.slotMargins(borderLeft, 4, borderRight, 2); } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java index d8907674c..b10828825 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java @@ -143,7 +143,7 @@ public class vM0_6_7_X_Changes { } public static void add_v0_6_55_Changes( ArrayList changeInfos ) { - ChangeInfo changes = new ChangeInfo("v0.6.4.0-Beta2-9", true, ""); + ChangeInfo changes = new ChangeInfo("v0.6.4.0-BetaI-XI", true, ""); changes.hardlight(Window.TITLE_COLOR); changeInfos.add(changes); @@ -162,6 +162,9 @@ public class vM0_6_7_X_Changes { "现实仍然有很多东西,我是时候调节一下了。\n"+ "那么还是祝各位游戏中冒险愉快吧!"))); + changes.addButton(new ChangeButton(Icons.get(Icons.PREFS), ("快捷栏V1/V2"), + ("快捷栏降至9个,并且V1是魔绫原版快捷栏,V2是碳素那边借鉴优化的快捷栏。任君挑选。"))); + changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.ALCH_PAGE), ("炼金界面优化"), ("炼金指南进行优化。"))); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java index 7f5ec7df5..27b440881 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java @@ -41,6 +41,7 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.Icons; import com.shatteredpixel.shatteredpixeldungeon.ui.OptionSlider; import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton; import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; +import com.shatteredpixel.shatteredpixeldungeon.ui.ToobarV; import com.shatteredpixel.shatteredpixeldungeon.ui.Toolbar; import com.shatteredpixel.shatteredpixeldungeon.ui.Window; import com.watabou.noosa.ColorBlock; @@ -406,14 +407,12 @@ public class WndSettings extends WndTabbed { RenderedTextBlock title; ColorBlock sep1; - OptionSlider optUISize; - RenderedTextBlock barDesc; - RedButton btnSplit; - CheckBox chkFlipToolbar; + OptionSlider optUIMode; + OptionSlider optUIScale; + RedButton btnToolbarSettings; CheckBox chkFlipTags; ColorBlock sep2; - ColorBlock sep3; - RedButton btnKeyBindings; + CheckBox chkFont; @Override protected void createChildren() { @@ -427,10 +426,9 @@ public class WndSettings extends WndTabbed { //add slider for UI size only if device has enough space to support it float wMin = Game.width / PixelScene.MIN_WIDTH_FULL; float hMin = Game.height / PixelScene.MIN_HEIGHT_FULL; - Boolean landscape = SPDSettings.landscape(); - if (Math.min(wMin, hMin) >= 2*Game.density){ - optUISize = new OptionSlider( - Messages.get(this, "size"), + if (Math.min(wMin, hMin) >= 2*Game.density && !SPDSettings.quickSwapper()){ + optUIMode = new OptionSlider( + Messages.get(this, "ui_mode"), Messages.get(this, "mobile"), Messages.get(this, "full"), 0, @@ -442,141 +440,245 @@ public class WndSettings extends WndTabbed { ShatteredPixelDungeon.seamlessResetScene(); } }; - optUISize.setSelectedValue(SPDSettings.interfaceSize()); - add(optUISize); + optUIMode.setSelectedValue(SPDSettings.interfaceSize()); + add(optUIMode); + } + + if ((int)Math.ceil(2* Game.density) < PixelScene.maxDefaultZoom) { + optUIScale = new OptionSlider(Messages.get(this, "scale"), + (int)Math.ceil(2* Game.density)+ "X", + PixelScene.maxDefaultZoom + "X", + (int)Math.ceil(2* Game.density), + PixelScene.maxDefaultZoom ) { + @Override + protected void onChange() { + if (getSelectedValue() != SPDSettings.scale()) { + SPDSettings.scale(getSelectedValue()); + ShatteredPixelDungeon.seamlessResetScene(); + } + } + }; + optUIScale.setSelectedValue(PixelScene.defaultZoom); + add(optUIScale); } if (SPDSettings.interfaceSize() == 0) { - barDesc = PixelScene.renderTextBlock(Messages.get(this, "mode"), 9); - add(barDesc); - - btnSplit = new RedButton(Messages.get(this, "split")) { + btnToolbarSettings = new RedButton(Messages.get(this, "toolbar_settings"), 9){ @Override protected void onClick() { - SPDSettings.toolbarMode(Toolbar.Mode.SPLIT.name()); - Toolbar.updateLayout(); + ShatteredPixelDungeon.scene().addToFront(new Window(){ + + RenderedTextBlock barDesc; + RedButton btnSplit; RedButton btnGrouped; RedButton btnCentered; + CheckBox chkQuickSwapper; + RenderedTextBlock swapperDesc; + CheckBox chkFlipToolbar; + CheckBox chkFlipTags; + + { + barDesc = PixelScene.renderTextBlock(Messages.get(WndSettings.UITab.this, "mode"), 9); + add(barDesc); + + btnSplit = new RedButton(Messages.get(WndSettings.UITab.this, "split")) { + @Override + protected void onClick() { + textColor(TITLE_COLOR); + btnGrouped.textColor(WHITE); + btnCentered.textColor(WHITE); + SPDSettings.toolbarMode(ToobarV.Mode.SPLIT.name()); + ToobarV.updateLayout(); + } + }; + if (SPDSettings.toolbarMode().equals(ToobarV.Mode.SPLIT.name())) { + btnSplit.textColor(TITLE_COLOR); + } + add(btnSplit); + + btnGrouped = new RedButton(Messages.get(WndSettings.UITab.this, "group")) { + @Override + protected void onClick() { + btnSplit.textColor(WHITE); + textColor(TITLE_COLOR); + btnCentered.textColor(WHITE); + SPDSettings.toolbarMode(ToobarV.Mode.GROUP.name()); + ToobarV.updateLayout(); + } + }; + if (SPDSettings.toolbarMode().equals(ToobarV.Mode.GROUP.name())) { + btnGrouped.textColor(TITLE_COLOR); + } + add(btnGrouped); + + btnCentered = new RedButton(Messages.get(WndSettings.UITab.this, "center")) { + @Override + protected void onClick() { + btnSplit.textColor(WHITE); + btnGrouped.textColor(WHITE); + textColor(TITLE_COLOR); + SPDSettings.toolbarMode(ToobarV.Mode.CENTER.name()); + ToobarV.updateLayout(); + } + }; + if (SPDSettings.toolbarMode().equals(ToobarV.Mode.CENTER.name())) { + btnCentered.textColor(TITLE_COLOR); + } + add(btnCentered); + + if(SPDSettings.quickSwapper()){ + btnSplit.alpha(0.5f); + btnGrouped.alpha(0.5f); + btnCentered.alpha(0.5f); + btnCentered.active = false; + btnGrouped.active = false; + btnSplit.active = false; + } + + chkQuickSwapper = new CheckBox(Messages.get(WndSettings.UITab.this, "quickslot_swapper")) { + @Override + protected void onClick() { + super.onClick(); + SPDSettings.quickSwapper(checked()); + ShatteredPixelDungeon.resetScene(); + } + }; + chkQuickSwapper.checked(SPDSettings.quickSwapper()); + add(chkQuickSwapper); + + swapperDesc = PixelScene.renderTextBlock(Messages.get(WndSettings.UITab.this, "swapper_desc"), 5); + swapperDesc.hardlight(0x888888); + add(swapperDesc); + + chkFlipToolbar = new CheckBox(Messages.get(WndSettings.UITab.this, "flip_toolbar")) { + @Override + protected void onClick() { + super.onClick(); + SPDSettings.flipToolbar(checked()); + //ToobarV.updateLayout(); + } + }; + chkFlipToolbar.checked(SPDSettings.flipToolbar()); + add(chkFlipToolbar); + + chkFlipTags = new CheckBox(Messages.get(WndSettings.UITab.this, "flip_indicators")){ + @Override + protected void onClick() { + super.onClick(); + SPDSettings.flipTags(checked()); + GameScene.layoutTags(); + } + }; + chkFlipTags.checked(SPDSettings.flipTags()); + add(chkFlipTags); + + //layout + resize(WIDTH_P, 0); + + barDesc.setPos((width - barDesc.width()) / 2f, GAP); + PixelScene.align(barDesc); + + int btnWidth = (int) (width - 2 * GAP) / 3; + + btnSplit.setRect(0, barDesc.bottom() + GAP, btnWidth, BTN_HEIGHT-2); + btnGrouped.setRect(btnSplit.right() + GAP, btnSplit.top(), btnWidth, BTN_HEIGHT-2); + btnCentered.setRect(btnGrouped.right() + GAP, btnSplit.top(), btnWidth, BTN_HEIGHT-2); + chkQuickSwapper.setRect(0, btnGrouped.bottom() + GAP, width, BTN_HEIGHT); + + + swapperDesc.maxWidth(width); + swapperDesc.setPos(0, chkQuickSwapper.bottom()+1); + + if (width > 200) { + chkFlipToolbar.setRect(0, swapperDesc.bottom() + GAP, width / 2 - 1, BTN_HEIGHT); + chkFlipTags.setRect(chkFlipToolbar.right() + GAP, chkFlipToolbar.top(), width / 2 - 1, BTN_HEIGHT); + } else { + chkFlipToolbar.setRect(0, swapperDesc.bottom() + GAP, width, BTN_HEIGHT); + chkFlipTags.setRect(0, chkFlipToolbar.bottom() + GAP, width, BTN_HEIGHT); + } + + resize(WIDTH_P, (int)chkFlipTags.bottom()); + + } + }); } }; - if (SPDSettings.toolbarMode().equals(Toolbar.Mode.SPLIT.name())) - btnSplit.textColor(TITLE_COLOR); - add(btnSplit); + add(btnToolbarSettings); - chkFlipToolbar = new CheckBox(Messages.get(this, "flip_toolbar")) { + } else { + + chkFlipTags = new CheckBox(Messages.get(this, "flip_indicators")) { @Override protected void onClick() { super.onClick(); - SPDSettings.flipToolbar(checked()); - Toolbar.updateLayout(); + SPDSettings.flipTags(checked()); + GameScene.layoutTags(); } }; - chkFlipToolbar.checked(SPDSettings.flipToolbar()); - add(chkFlipToolbar); - } + chkFlipTags.checked(SPDSettings.flipTags()); + add(chkFlipTags); - chkFlipTags = new CheckBox(Messages.get(this, "flip_indicators")){ - @Override - protected void onClick() { - super.onClick(); - SPDSettings.flipTags(checked()); - GameScene.layoutTags(); - } - }; - chkFlipTags.checked(SPDSettings.flipTags()); - add(chkFlipTags); + } sep2 = new ColorBlock(1, 1, 0xFF000000); add(sep2); -// chkFont = new CheckBox(Messages.get(this, "system_font")){ -// @Override -// protected void onClick() { -// super.onClick(); -// ShatteredPixelDungeon.seamlessResetScene(new Game.SceneChangeCallback() { -// @Override -// public void beforeCreate() { -// SPDSettings.systemFont(); -// } -// -// @Override -// public void afterCreate() { -// //do nothing -// } -// }); -// } -// }; -// chkFont.checked(SPDSettings.systemFont()); -// add(chkFont); + chkFont = new CheckBox(Messages.get(this, "system_font")){ + @Override + protected void onClick() { + super.onClick(); + ShatteredPixelDungeon.seamlessResetScene(new Game.SceneChangeCallback() { + @Override + public void beforeCreate() { + SPDSettings.systemFont(checked()); + } - if (DeviceCompat.hasHardKeyboard()){ - - sep3 = new ColorBlock(1, 1, 0xFF000000); - add(sep3); - - btnKeyBindings = new RedButton(Messages.get(this, "key_bindings")){ - @Override - protected void onClick() { - super.onClick(); - ShatteredPixelDungeon.scene().addToFront(new WndKeyBindings()); - } - }; - - add(btnKeyBindings); - } + @Override + public void afterCreate() { + //do nothing + } + }); + } + }; + chkFont.checked(SPDSettings.systemFont()); + add(chkFont); } @Override protected void layout() { title.setPos((width - title.width())/2, y + GAP); sep1.size(width, 1); - sep1.y = title.bottom() + 2*GAP; + sep1.y = title.bottom() + 3*GAP; height = sep1.y + 1; - if (optUISize != null){ - optUISize.setRect(0, height + GAP, width, SLIDER_HEIGHT); - height = optUISize.bottom(); + if (optUIMode != null && optUIScale != null && width > 200){ + optUIMode.setRect(0, height + GAP, width/2-1, SLIDER_HEIGHT); + optUIScale.setRect(width/2+1, height + GAP, width/2-1, SLIDER_HEIGHT); + height = optUIScale.bottom(); + } else { + if (optUIMode != null) { + optUIMode.setRect(0, height + GAP, width, SLIDER_HEIGHT); + height = optUIMode.bottom(); + } + + if (optUIScale != null) { + optUIScale.setRect(0, height + GAP, width, SLIDER_HEIGHT); + height = optUIScale.bottom(); + } } - if (barDesc != null) { - barDesc.setPos((width - barDesc.width()) / 2f, height + GAP); - PixelScene.align(barDesc); - if(Game.scene()!=null && Game.scene().getClass() == GameScene.class) { - btnSplit.setRect(0, barDesc.bottom() + GAP, width, 16); - } else { - btnSplit.setRect(500, barDesc.bottom() + GAP, width, 16); - } - - if (width > 200) { - chkFlipToolbar.setRect(0, btnSplit.bottom() + GAP, width / 2 - 1, BTN_HEIGHT); - chkFlipTags.setRect(chkFlipToolbar.right() + GAP, chkFlipToolbar.top(), width / 2 - 1, BTN_HEIGHT); - } else { - chkFlipToolbar.setRect(0, btnSplit.bottom() + GAP, width, BTN_HEIGHT); - chkFlipTags.setRect(0, chkFlipToolbar.bottom() + GAP, width, BTN_HEIGHT); - } + if (btnToolbarSettings != null) { + btnToolbarSettings.setRect(0, height + GAP, width, BTN_HEIGHT); + height = btnToolbarSettings.bottom(); } else { chkFlipTags.setRect(0, height + GAP, width, BTN_HEIGHT); + height = chkFlipTags.bottom(); } sep2.size(width, 1); - sep2.y = chkFlipTags.bottom() + 2; + sep2.y = height + GAP; - if (btnKeyBindings != null){ - if (width > 200){ - chkFlipTags.setSize(width/2-1, BTN_HEIGHT); - sep3.size(1, BTN_HEIGHT + 2*GAP); - sep3.x = chkFlipTags.right() + 0.5f; - sep3.y = sep2.y+1; - PixelScene.align(sep3); - btnKeyBindings.setRect(chkFlipTags.right()+2, chkFlipTags.top(), width/2 - 1, BTN_HEIGHT); - } else { - sep3.size(width, 1); - sep3.y = chkFlipTags.bottom() + 2; - btnKeyBindings.setRect(0, sep3.y + 1 + GAP, width, BTN_HEIGHT); - } - height = btnKeyBindings.bottom(); - } else { - height = chkFlipTags.bottom(); - } + chkFont.setRect(0, sep2.y + 1 + GAP, width, BTN_HEIGHT); + height = chkFont.bottom(); } } @@ -640,7 +742,12 @@ public class WndSettings extends WndTabbed { @Override protected void onChange() { SPDSettings.quickslots(getSelectedValue()); - Toolbar.updateLayout(); + if(SPDSettings.quickSwapper()){ + Toolbar.updateLayout(); + } else { + ToobarV.updateLayout(); + } + } }; quickslots.setSelectedValue(SPDSettings.quickslots()); @@ -662,11 +769,16 @@ public class WndSettings extends WndTabbed { bottom = sep1.y + 1; + if(!SPDSettings.quickSwapper()){ + quickslots.active = false; + quickslots.visible = false; + } + if (width > 200){ ClassUI.setRect(0, bottom, width, SLIDER_HEIGHT); optSplashScreen.setRect(0, ClassUI.bottom() + GAP, width, SLIDER_HEIGHT); optFPSLimit.setRect(0, optSplashScreen.bottom() + GAP, width/2, SLIDER_HEIGHT); - if(Game.scene()!=null && Game.scene().getClass() == GameScene.class) { + if ((Game.scene() == null || Game.scene().getClass() != GameScene.class) && SPDSettings.quickSwapper()) { quickslots.setRect(optFPSLimit.right(), optFPSLimit.top(), width/2, SLIDER_HEIGHT); wxts.visible = false; } else { @@ -677,7 +789,7 @@ public class WndSettings extends WndTabbed { ClassUI.setRect(0, bottom + GAP, width, SLIDER_HEIGHT); optSplashScreen.setRect(0, ClassUI.bottom() + GAP, width, SLIDER_HEIGHT); optFPSLimit.setRect(0, optSplashScreen.bottom() + GAP, width, SLIDER_HEIGHT); - if (Game.scene() == null || Game.scene().getClass() != GameScene.class) { + if ((Game.scene() == null || Game.scene().getClass() != GameScene.class) && SPDSettings.quickSwapper()) { quickslots.visible = false; } else { quickslots.setRect(0, optFPSLimit.bottom() + GAP, width, SLIDER_HEIGHT); diff --git a/gradle.properties b/gradle.properties index 95d128a89..fe57b0fa7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,4 +10,5 @@ # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects android.useAndroidX=true -android.enableJetifier=true \ No newline at end of file +android.enableJetifier=true +android.suppressUnsupportedCompileSdk=33 \ No newline at end of file diff --git a/services/analyticsfirebase/.gitignore b/services/analyticsfirebase/.gitignore deleted file mode 100644 index 42afabfd2..000000000 --- a/services/analyticsfirebase/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/services/analyticsfirebase/build.gradle b/services/analyticsfirebase/build.gradle deleted file mode 100644 index b67007851..000000000 --- a/services/analyticsfirebase/build.gradle +++ /dev/null @@ -1,37 +0,0 @@ -plugins { - id 'com.android.library' -} - -android { - namespace 'com.shatteredpixel.shatteredpixeldungeon.services.analyticsfirebase' - compileSdk 33 - - defaultConfig { - minSdk 19 - targetSdk 33 - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles "consumer-rules.pro" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 - } -} - -dependencies { - implementation project(':SPD-classes') - api project(':services') - implementation 'androidx.appcompat:appcompat:1.6.1' - implementation 'com.google.android.material:material:1.5.0' - testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.1.3' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' -} \ No newline at end of file diff --git a/services/analyticsfirebase/consumer-rules.pro b/services/analyticsfirebase/consumer-rules.pro deleted file mode 100644 index e69de29bb..000000000 diff --git a/services/analyticsfirebase/proguard-rules.pro b/services/analyticsfirebase/proguard-rules.pro deleted file mode 100644 index 481bb4348..000000000 --- a/services/analyticsfirebase/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/services/analyticsfirebase/src/androidTest/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/ExampleInstrumentedTest.java b/services/analyticsfirebase/src/androidTest/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/ExampleInstrumentedTest.java deleted file mode 100644 index 9b982c52a..000000000 --- a/services/analyticsfirebase/src/androidTest/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.shatteredpixel.shatteredpixeldungeon.services.analyticsfirebase; - -import static org.junit.Assert.assertEquals; - -import android.content.Context; - -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.platform.app.InstrumentationRegistry; - -import org.junit.Test; -import org.junit.runner.RunWith; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); - assertEquals("com.shatteredpixel.shatteredpixeldungeon.services.analyticsfirebase.test", appContext.getPackageName()); - } -} \ No newline at end of file diff --git a/services/analyticsfirebase/src/main/AndroidManifest.xml b/services/analyticsfirebase/src/main/AndroidManifest.xml deleted file mode 100644 index a5918e68a..000000000 --- a/services/analyticsfirebase/src/main/AndroidManifest.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/services/analyticsfirebase/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/FireBaseLing.java b/services/analyticsfirebase/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/FireBaseLing.java deleted file mode 100644 index b94bdf594..000000000 --- a/services/analyticsfirebase/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/FireBaseLing.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.shatteredpixel.shatteredpixeldungeon.services.analyticsfirebase; - -public class FireBaseLing { -} diff --git a/services/analyticsfirebase/src/test/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/ExampleUnitTest.java b/services/analyticsfirebase/src/test/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/ExampleUnitTest.java deleted file mode 100644 index 187b73c69..000000000 --- a/services/analyticsfirebase/src/test/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/ExampleUnitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.shatteredpixel.shatteredpixeldungeon.services.analyticsfirebase; - -import static org.junit.Assert.assertEquals; - -import org.junit.Test; - -/** - * Example local unit test, which will execute on the development machine (host). - * - * @see Testing documentation - */ -public class ExampleUnitTest { - @Test - public void addition_isCorrect() { - assertEquals(4, 2 + 2); - } -} \ No newline at end of file diff --git a/services/news/shatteredNews/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/news/GameNesImpl.java b/services/news/shatteredNews/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/news/GameNesImpl.java index 447f6fc26..b708a0d68 100644 --- a/services/news/shatteredNews/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/news/GameNesImpl.java +++ b/services/news/shatteredNews/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/news/GameNesImpl.java @@ -8,8 +8,4 @@ public class GameNesImpl{ return newsChecker; } - public static boolean supportsNews(){ - return true; - } - } diff --git a/services/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/FireBaseService.java b/services/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/FireBaseService.java deleted file mode 100644 index bd0b0e176..000000000 --- a/services/src/main/java/com/shatteredpixel/shatteredpixeldungeon/services/analyticsfirebase/FireBaseService.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.shatteredpixel.shatteredpixeldungeon.services.analyticsfirebase; -public class FireBaseService { -} diff --git a/settings.gradle b/settings.gradle index 6ae8f88fd..da66e41ac 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,4 +11,3 @@ include ':services' //news include ':services:news:shatteredNews' -include ':services:analyticsfirebase' From e6dcc371cc5cd98ad960aca39d7e837a7755dd20 Mon Sep 17 00:00:00 2001 From: LingASDJ <2735951230@qq.com> Date: Sat, 9 Sep 2023 03:16:30 +0800 Subject: [PATCH 4/6] update Test 0.6.5.0-Alpha --- .../android/AndroidPlatformSupport.java | 1 - build.gradle | 4 +- .../assets/messages/actors/actors.properties | 6 + .../main/assets/sprites/npc/whitepinkgirl.png | Bin 0 -> 2210 bytes core/src/main/assets/sprites/tribesman.png | Bin 0 -> 2617 bytes .../shatteredpixeldungeon/Assets.java | 3 + .../actors/mobs/Bestiary.java | 3 +- .../actors/mobs/bosses/SakaFishBoss.java | 12 +- .../actors/mobs/npcs/Ghost.java | 90 +- .../actors/mobs/spical/GnollHero.java | 49 + .../shatteredpixeldungeon/effects/Speck.java | 1018 ++++++++--------- .../items/weapon/melee/Sai.java | 2 +- .../levels/features/LevelTransition.java | 156 +++ .../levels/rooms/standard/YinYangRoom.java | 3 +- .../messages/Messages.java | 2 - .../scenes/CellSelector.java | 14 +- .../sprites/TribesmanSprite.java | 29 + .../ui/changelist/mlpd/vM0_6_7_X_Changes.java | 7 +- .../windows/WndSadGhost.java | 5 +- 19 files changed, 817 insertions(+), 587 deletions(-) create mode 100644 core/src/main/assets/sprites/npc/whitepinkgirl.png create mode 100644 core/src/main/assets/sprites/tribesman.png create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/spical/GnollHero.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/features/LevelTransition.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/TribesmanSprite.java diff --git a/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidPlatformSupport.java b/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidPlatformSupport.java index e723df273..95bde8646 100644 --- a/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidPlatformSupport.java +++ b/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidPlatformSupport.java @@ -294,7 +294,6 @@ public class AndroidPlatformSupport extends PlatformSupport { fallbackFontGenerator = JPFontGenerator; break; } - KRFontGenerator = SCFontGenerator = TCFontGenerator = JPFontGenerator = new FreeTypeFontGenerator(Gdx.files.absolute("/system/fonts/NotoSansCJK-Regular.ttc")); } if (basicFontGenerator != null) fonts.put(basicFontGenerator, new HashMap<>()); diff --git a/build.gradle b/build.gradle index 2d4610675..b8082c8a3 100644 --- a/build.gradle +++ b/build.gradle @@ -18,8 +18,8 @@ allprojects { appName = 'Magic Ling Pixel Dungeon' appPackageName = 'com.ansdomagiclingpixeldungeon.ling' - appVersionCode =906000 - appVersionName = '0.6.4.0-Beta-XII' + appVersionCode =907000 + appVersionName = '0.6.5.0-Alpha1' appJavaCompatibility = JavaVersion.VERSION_11 diff --git a/core/src/main/assets/messages/actors/actors.properties b/core/src/main/assets/messages/actors/actors.properties index 423bcf835..97008eb5f 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -1,5 +1,11 @@ #####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.desc=曾经远古时代的海洋王者,因为不可避免的末日来临时,潜入了地底的阴暗水潭进入了沉睡。想着有朝一日回到大海,然而地牢的魔力和陆上的变化,它再也不可能回到那片理想的海洋。 actors.mobs.bosses.sakafishboss.notice=sakasaka……saka?腻……系……甚磨?! diff --git a/core/src/main/assets/sprites/npc/whitepinkgirl.png b/core/src/main/assets/sprites/npc/whitepinkgirl.png new file mode 100644 index 0000000000000000000000000000000000000000..be687a95f540b8bc0d129bdbdceb18f55c97e2e9 GIT binary patch literal 2210 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 literal 0 HcmV?d00001 diff --git a/core/src/main/assets/sprites/tribesman.png b/core/src/main/assets/sprites/tribesman.png new file mode 100644 index 0000000000000000000000000000000000000000..c74c1cfc497a2fb37ed4f423d7620d1241eae135 GIT binary patch literal 2617 zcmeH|=U3BP7KVRGh#?7~s(85}ArQJmKtO?@AwVRQ&=C=l(3L8Q6d56*NE;E64hpDL zg`u~h1d*l?#-YU^2#CU!dS$GD+;G?Y3G;34UhC|0*8Z^9-tT(eby93;=THb41ONai zs=28>0DuHfKu#DU$S)$Crv#UfpRu(u0My?>?$V(E00C^R9L)rE6c|850VOz~h(c+@ z07FfAG}_8s1fU%TY_KpZG@7i7Bk61SD65p)U`n~z41_?CA@)b_D3h&&nD zd@MFkMw?B5Co3WDY9R{^MN*YzVH@HNId@D3vM8hZ7URV<-Xpu(`?vDD$Da($aLN;BxotciZ*_Hbe}7*v z@L%zl0{<%oZuEt3ADD${Pje8^_5U1z!&jK1Kv#IE`2_|5h;|(u(7BzA8bR?FrkM-V zA;gy%K@al*Lg`n6nS@{;rkoBzlc25jyWEv*0DwNAni@O$o6NeP7<`JjqJ`5#J{0m3 zSTjxcqI)UVqnhx0`}?au<~DAEpWzwf+@(=oN5yP3|B^E}Xs~Gk8@=0)gQ~1y8Q}rj zvr-okArknJyN~_Je2t{u^;{$Pa6)?in6(`Z^nqC1V^}aY_^w{-Z6~`dxl`|gJkX|D zHRY=>Zg-j*2t#&?GC3|jxLxa^$iE5YoeSao#tTU62itM0TV}Ke^|In7c}QViXeJN; zkhqek(09!2tAsay;(o`5X2?%lB<4RID3{KQ^d%@YHq1V;xE$H^Ep*!8-$$eC+k~!$(H~G&=VwN6T ziy~>KLRPMHVS@DEJV*#!>KyZY!k(N9-&(-e-}R0=Dz`L}!QNp9=Bq+muVN$y^UhY+1KnV$8&u#m65dxyWu>}qHVAA z>ga@}g7gn~mD+dj>u0Ok)_hTiH}F?`tf@NbGLlu8F(wYx(a;OM%aEHUpXomG%x%s9 zxiCwtvOpYOu_?Jloj|No;zXVUaeh>-t^T#_=76MX8s?5heTpl_92BWKa6-RAXrF4{ zmB>>Xx*yFP4YOq_cgX}b^mnwcw<#a0ZGO>E`(!IpWV)0@)@DO9RDyQd!Y%-A{1eI$R@S{40r#3(4o_3zp3O;m`_yWGC42BOwR5`R=pF2ILn;?H$q4Cr6oM#t> z;0(NKK}PsXdgzXi4OzR?i=wb!&;gE`mc4zeuT;x#j$?1?UU*yraLaQHXhbKg6yaOq zq3$pPkIDw|Gg8{4%18NS zLTvU*^hW&2qVNUjPF}1;8eE9XeK_T73>D3XB?vsDl7alByTUl?dHJ<3cdO*>mnq8~ z+!}Sr#7)L&Cg``0Kk@%B)`vM=wI~pV4WP12DW1H3MYJKcFWt_YRquaJwFRkW~ zbMy>OR9P{<1Zqxrrs&QIsi99zOR#Pj@rrw5Y{*YZS&V-w?#^5D=@0_?JS`t4JS?Qa zx@m28fc|i8$hwUr&Z%tOW7gSEJw_o&m{+9G9As%AmdvNWi>U(-Ab3##Rf(k0SuVf) z?Y`4+g+E5q@&l+bX*3EDY?i{$DZ7r*p!$P)Txg*Y$y zWD&Luq6R+9f!PD@slQutReNJ4?L%-a@UUgfrAGAOdFnqXg@N_K!8^v=00NJfasg8Q zJ%CMSLB$u-dmGGv&3=<)$%-rw<3`4IZA^;SOCm`~G7~bei<}t`h;-iMS{(eHR5O}s IE!iXP4=I8bI{*Lx literal 0 HcmV?d00001 diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java index a1b1aac11..5377ade5a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java @@ -421,6 +421,9 @@ public class Assets { public static final String ROT_LASH = "sprites/rot_lasher.png"; public static final String ROT_HEART= "sprites/rot_heart.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 GUARDIAN = "sprites/guardian.png"; public static final String SLIME = "sprites/slime.png"; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java index 993edca9d..b1759f4fe 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java @@ -25,6 +25,7 @@ import static com.shatteredpixel.shatteredpixeldungeon.Challenges.RLPT; import com.shatteredpixel.shatteredpixeldungeon.Conducts; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.spical.GnollHero; import com.watabou.utils.Random; import java.util.ArrayList; @@ -47,7 +48,7 @@ public class Bestiary { case 1: //3x rat, 1x snake return new ArrayList<>(Arrays.asList( - Rat.class, Rat.class, + GnollHero.class, Rat.class, Rat.class)); case 2: return new ArrayList<>(Arrays.asList(Rat.class, diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/SakaFishBoss.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/SakaFishBoss.java index 7e470f2f6..96834c197 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/SakaFishBoss.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/SakaFishBoss.java @@ -169,7 +169,7 @@ public class SakaFishBoss extends Boss { @Override public int drRoll() { AncientMysteryCityBossLevel.State level = ((AncientMysteryCityBossLevel)Dungeon.level).pro(); - return level == AncientMysteryCityBossLevel.State.FALL_BOSS ? 10 : 45; + return level == AncientMysteryCityBossLevel.State.FALL_BOSS ? 10 : 40; } @@ -445,6 +445,7 @@ public class SakaFishBoss extends Boss { } else { endPos = leapPos; } + //do leap sprite.visible = Dungeon.level.heroFOV[pos] || Dungeon.level.heroFOV[leapPos] || Dungeon.level.heroFOV[endPos]; sprite.dirtcar(pos, leapPos, new Callback() { @@ -462,9 +463,12 @@ public class SakaFishBoss extends Boss { Sample.INSTANCE.play(Assets.Sounds.HIT); } - if (!enemy.isAlive() && enemy == hero) { - Dungeon.fail( getClass() ); - GLog.n( Messages.get(SakaFishBoss.class, "dictcar_kill"),Dungeon.hero.name() ); + Char ch = hero; + if(hero != null){ + if (!ch.isAlive()) { + Dungeon.fail( getClass() ); + GLog.n( Messages.get(SakaFishBoss.class, "dictcar_kill"),Dungeon.hero.name() ); + } } if (endPos != leapPos){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java index f25b6ad68..a732b0b81 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java @@ -50,7 +50,6 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.ItemLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.SewerLevel; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; -import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.GhostSprite; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.shatteredpixel.shatteredpixeldungeon.windows.WndQuest; @@ -291,6 +290,35 @@ public class Ghost extends NPC { 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 ) { 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)]); //26%:+0, 25%:+1, 15%:+2, 10%:+3, 5%:+4 - 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; - 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); + ghostQuest(); //10% to be enchanted. We store it separately so enchant status isn't revealed early if (Random.Int(10) == 0){ @@ -396,35 +396,7 @@ public class Ghost extends NPC { Generator.Category c = Generator.wepTiers[wepTier - 1]; weapon = (MeleeWeapon) Reflection.newInstance(c.classes[Random.chances(c.probs)]); - //26%:+0, 25%:+1, 15%:+2, 10%:+3, 5%:+4, 5%+5 - 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); + ghostQuest(); //10% to be enchanted. We store it separately so enchant status isn't revealed early if (Random.Int(10) == 0){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/spical/GnollHero.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/spical/GnollHero.java new file mode 100644 index 000000000..8d9fa84e8 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/spical/GnollHero.java @@ -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() { + { + 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); + } + +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/Speck.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/Speck.java index 931824240..dae6d46d5 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/Speck.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/Speck.java @@ -34,515 +34,511 @@ import com.watabou.utils.SparseArray; public class Speck extends Image { - public static final int HEALING = 0; - public static final int STAR = 1; - public static final int LIGHT = 2; - public static final int QUESTION = 3; - public static final int UP = 4; - public static final int SCREAM = 5; - public static final int BONE = 6; - public static final int WOOL = 7; - public static final int ROCK = 8; - public static final int NOTE = 9; - public static final int CHANGE = 10; - public static final int HEART = 11; - public static final int BUBBLE = 12; - public static final int STEAM = 13; - public static final int COIN = 14; - - public static final int DISCOVER = 101; - public static final int EVOKE = 102; - public static final int MASK = 103; - public static final int KIT = 104; - public static final int RATTLE = 105; - public static final int JET = 106; - public static final int TOXIC = 107; - public static final int CORROSION = 108; - public static final int PARALYSIS = 109; - public static final int DUST = 110; - public static final int STENCH = 111; - public static final int FORGE = 112; - public static final int CONFUSION = 113; - public static final int RED_LIGHT = 114; - public static final int CALM = 115; - public static final int SMOKE = 116; - public static final int STORM = 117; - public static final int INFERNO = 118; - public static final int BLIZZARD = 119; - //New Blobs - public static final int DIED = 120; - - private static final int SIZE = 7; - - private int type; - private float lifespan; - private float left; - - private static TextureFilm film; - - private static SparseArray factories = new SparseArray<>(); - - public Speck() { - super(); - - texture( Assets.Effects.SPECKS ); - if (film == null) { - film = new TextureFilm( texture, SIZE, SIZE ); - } - - origin.set( SIZE / 2f ); - } - - public Speck image( int type ){ - reset(0, 0, 0, type); - - left = lifespan = Float.POSITIVE_INFINITY; - this.type = -1; - - resetColor(); - scale.set( 1 ); - speed.set( 0 ); - acc.set( 0 ); - angle = 0; - angularSpeed = 0; - - return this; - } - - public void reset( int index, float x, float y, int type ) { - revive(); - - this.type = type; - switch (type) { - case DISCOVER: - case RED_LIGHT: - frame( film.get( LIGHT ) ); - break; - case EVOKE: - case MASK: - case KIT: - case FORGE: - frame( film.get( STAR ) ); - break; - case RATTLE: - frame( film.get( BONE ) ); - break; - case JET: - case TOXIC: - case DIED: - case CORROSION: - case PARALYSIS: - case STENCH: - case CONFUSION: - case STORM: - case DUST: - case SMOKE: - case BLIZZARD: - case INFERNO: - frame( film.get( STEAM ) ); - break; - case CALM: - frame( film.get( SCREAM ) ); - break; - default: - frame( film.get( type ) ); - } - - this.x = x - origin.x; - this.y = y - origin.y; - - resetColor(); - scale.set( 1 ); - speed.set( 0 ); - acc.set( 0 ); - angle = 0; - angularSpeed = 0; - - switch (type) { - - case HEALING: - speed.set( 0, -20 ); - lifespan = 1f; - break; - - case STAR: - speed.polar( Random.Float( 2 * 3.1415926f ), Random.Float( 128 ) ); - acc.set( 0, 128 ); - angle = Random.Float( 360 ); - angularSpeed = Random.Float( -360, +360 ); - lifespan = 1f; - break; - - case FORGE: - speed.polar( Random.Float( -3.1415926f ), Random.Float( 64 ) ); - acc.set( 0, 128 ); - angle = Random.Float( 360 ); - angularSpeed = Random.Float( -360, +360 ); - lifespan = 0.51f; - break; - - case EVOKE: - speed.polar( Random.Float( -3.1415926f ), 50 ); - acc.set( 0, 50 ); - angle = Random.Float( 360 ); - angularSpeed = Random.Float( -180, +180 ); - lifespan = 1f; - break; - - case KIT: - speed.polar( index * 3.1415926f / 5, 50 ); - acc.set( -speed.x, -speed.y ); - angle = index * 36; - angularSpeed = 360; - lifespan = 1f; - break; - - case MASK: - speed.set( Random.Int( 2 ) == 0 ? Random.Float( -128, -64 ) : Random.Float( +64, +128 ), 0 ); - angularSpeed = speed.x < 0 ? -180 : +180; - acc.set( -speed.x, 0 ); - lifespan = 0.5f; - break; - - case RED_LIGHT: - tint(0xFFCC0000); - case LIGHT: - angle = Random.Float( 360 ); - angularSpeed = 90; - lifespan = 1f; - break; - - case DISCOVER: - angle = Random.Float( 360 ); - angularSpeed = 90; - lifespan = 0.5f; - am = 0; - break; - - case QUESTION: - lifespan = 0.8f; - break; - - case UP: - speed.set( 0, -20 ); - lifespan = 1f; - break; - - case CALM: - color(0, 1, 1); - case SCREAM: - lifespan = 0.9f; - break; - - case BONE: - lifespan = 0.2f; - speed.polar( Random.Float( 2 * 3.1415926f ), 24 / lifespan ); - acc.set( 0, 128 ); - angle = Random.Float( 360 ); - angularSpeed = 360; - break; - - case RATTLE: - lifespan = 0.5f; - speed.set( 0, -100 ); - acc.set( 0, -2 * speed.y / lifespan ); - angle = Random.Float( 360 ); - angularSpeed = 360; - break; - - case WOOL: - lifespan = 0.5f; - speed.set( 0, -50 ); - angle = Random.Float( 360 ); - angularSpeed = Random.Float( -360, +360 ); - break; - - case ROCK: - angle = Random.Float( 360 ); - angularSpeed = Random.Float( -360, +360 ); - scale.set( Random.Float( 1, 2 ) ); - speed.set( 0, 64 ); - lifespan = 0.2f; - this.y -= speed.y * lifespan; - break; - - case NOTE: - angularSpeed = Random.Float( -30, +30 ); - speed.polar( (angularSpeed - 90) * PointF.G2R, 30 ); - lifespan = 1f; - break; - - case CHANGE: - angle = Random.Float( 360 ); - speed.polar( (angle - 90) * PointF.G2R, Random.Float( 4, 12 ) ); - lifespan = 1.5f; - break; - - case HEART: - speed.set( Random.Int( -10, +10 ), -40 ); - angularSpeed = Random.Float( -45, +45 ); - lifespan = 1f; - break; - - case BUBBLE: - speed.set( 0, -15 ); - scale.set( Random.Float( 0.8f, 1 ) ); - lifespan = Random.Float( 0.8f, 1.5f ); - break; - - case STEAM: - speed.y = -Random.Float( 10, 15 ); - angularSpeed = Random.Float( +180 ); - angle = Random.Float( 360 ); - lifespan = 1f; - break; - - case JET: - speed.y = +32; - acc.y = -64; - angularSpeed = Random.Float( 180, 360 ); - angle = Random.Float( 360 ); - lifespan = 0.5f; - break; - - case TOXIC: - hardlight( 0x50FF60 ); - angularSpeed = 30; - angle = Random.Float( 360 ); - lifespan = Random.Float( 1f, 3f ); - break; - - case DIED: - if(Dungeon.depth==27){ - hardlight(0x0); - } else { - hardlight(0xff5060); - } - - angularSpeed = 30; - angle =Random.Float( 360 ); - lifespan = Random.Float( 1f,3f); - break; - - case CORROSION: - hardlight( 0xAAAAAA ); - angularSpeed = 30; - angle = Random.Float( 360 ); - lifespan = Random.Float( 1f, 3f ); - break; - - case PARALYSIS: - hardlight( 0xFFFF66 ); - angularSpeed = -30; - angle = Random.Float( 360 ); - lifespan = Random.Float( 1f, 3f ); - break; - - case STENCH: - hardlight( 0x003300 ); - angularSpeed = -30; - angle = Random.Float( 360 ); - lifespan = Random.Float( 1f, 3f ); - break; - - case CONFUSION: - hardlight( Random.Int( 0x1000000 ) | 0x000080 ); - angularSpeed = Random.Float( -20, +20 ); - angle = Random.Float( 360 ); - lifespan = Random.Float( 1f, 3f ); - break; - - case STORM: - hardlight( 0x8AD8D8 ); - angularSpeed = Random.Float( -20, +20 ); - angle = Random.Float( 360 ); - lifespan = Random.Float( 1f, 3f ); - break; - - case INFERNO: - hardlight( 0xEE7722 ); - angularSpeed = Random.Float( 200, 300 ) * (Random.Int(2) == 0 ? -1 : 1); - angle = Random.Float( 360 ); - lifespan = Random.Float( 1f, 3f ); - break; - - case BLIZZARD: - hardlight( 0xFFFFFF ); - angularSpeed = Random.Float( 200, 300 ) * (Random.Int(2) == 0 ? -1 : 1); - angle = Random.Float( 360 ); - lifespan = Random.Float( 1f, 3f ); - break; - - case SMOKE: - hardlight( 0x000000 ); - angularSpeed = 30; - angle = Random.Float( 360 ); - lifespan = Random.Float( 1f, 1.5f ); - break; - - case DUST: - hardlight( 0xFFFF66 ); - angle = Random.Float( 360 ); - speed.polar( Random.Float( 2 * 3.1415926f ), Random.Float( 16, 48 ) ); - lifespan = 0.5f; - break; - - case COIN: - speed.polar( -PointF.PI * Random.Float( 0.3f, 0.7f ), Random.Float( 48, 96 ) ); - acc.y = 256; - lifespan = -speed.y / acc.y * 2; - break; - } - - left = lifespan; - } - - @Override - public void update() { - super.update(); - - left -= Game.elapsed; - if (left <= 0) { - - kill(); - - } else { - - float p = 1 - left / lifespan; // 0 -> 1 - - switch (type) { - - case STAR: - case FORGE: - scale.set( 1 - p ); - am = p < 0.2f ? p * 5f : (1 - p) * 1.25f; - break; - - case KIT: - case MASK: - am = 1 - p * p; - break; - - case EVOKE: - - case HEALING: - am = p < 0.5f ? 1 : 2 - p * 2; - break; - - case RED_LIGHT: - case LIGHT: - am = scale.set( p < 0.2f ? p * 5f : (1 - p) * 1.25f ).x; - break; - - case DISCOVER: - am = 1 - p; - scale.set( (p < 0.5f ? p : 1 - p) * 2 ); - break; - - case QUESTION: - scale.set( (float)(Math.sqrt( p < 0.5f ? p : 1 - p ) * 3) ); - break; - - case UP: - scale.set( (float)(Math.sqrt( p < 0.5f ? p : 1 - p ) * 2) ); - break; - - case CALM: - case SCREAM: - am = (float)Math.sqrt( (p < 0.5f ? p : 1 - p) * 2f ); - scale.set( p * 7 ); - break; - - case BONE: - case RATTLE: - am = p < 0.9f ? 1 : (1 - p) * 10; - break; - - case ROCK: - am = p < 0.2f ? p * 5 : 1 ; - break; - - case NOTE: - am = 1 - p * p; - break; - - case WOOL: - scale.set( 1 - p ); - break; - - case CHANGE: - am = (float)Math.sqrt( (p < 0.5f ? p : 1 - p) * 2); - scale.y = (1 + p) * 0.5f; - scale.x = scale.y * (float)Math.cos( left * 15 ); - break; - - case HEART: - scale.set( 1 - p ); - am = 1 - p * p; - break; - - case BUBBLE: - am = p < 0.2f ? p * 5 : 1; - break; - - case STEAM: - case TOXIC: - case PARALYSIS: - case DIED: - case CONFUSION: - case STORM: - case BLIZZARD: - case INFERNO: - case DUST: - am = (float)Math.sqrt( (p < 0.5f ? p : 1 - p) * 0.5f ); - scale.set( 1 + p ); - break; - - case CORROSION: - hardlight( ColorMath.interpolate( 0xAAAAAA, 0xFF8800 , p )); - case STENCH: - case SMOKE: - am = (float)Math.sqrt( (p < 0.5f ? p : 1 - p) ); - scale.set( 1 + p ); - break; - - case JET: - am = (p < 0.5f ? p : 1 - p) * 2; - scale.set( p * 1.5f ); - break; - - case COIN: - scale.x = (float)Math.cos( left * 5 ); - rm = gm = bm = (Math.abs( scale.x ) + 1) * 0.5f; - am = p < 0.9f ? 1 : (1 - p) * 10; - break; - } - } - } - - public static Emitter.Factory factory( final int type ) { - return factory( type, false ); - } - - public static Emitter.Factory factory( final int type, final boolean lightMode ) { - - Emitter.Factory factory = factories.get( type ); - - if (factory == null) { - factory = new Emitter.Factory() { - @Override - public void emit ( Emitter emitter, int index, float x, float y ) { - Speck p = (Speck)emitter.recycle( Speck.class ); - p.reset( index, x, y, type ); - } - @Override - public boolean lightMode() { - return lightMode; - } - }; - factories.put( type, factory ); - } - - return factory; - } + public static final int HEALING = 0; + public static final int STAR = 1; + public static final int LIGHT = 2; + public static final int QUESTION = 3; + public static final int UP = 4; + public static final int SCREAM = 5; + public static final int BONE = 6; + public static final int WOOL = 7; + public static final int ROCK = 8; + public static final int NOTE = 9; + public static final int CHANGE = 10; + public static final int HEART = 11; + public static final int BUBBLE = 12; + public static final int STEAM = 13; + public static final int COIN = 14; + + public static final int DISCOVER = 101; + public static final int EVOKE = 102; + public static final int MASK = 103; + public static final int KIT = 104; + public static final int RATTLE = 105; + public static final int JET = 106; + public static final int TOXIC = 107; + public static final int CORROSION = 108; + public static final int PARALYSIS = 109; + public static final int DUST = 110; + public static final int STENCH = 111; + public static final int FORGE = 112; + public static final int CONFUSION = 113; + public static final int RED_LIGHT = 114; + public static final int CALM = 115; + public static final int SMOKE = 116; + public static final int STORM = 117; + public static final int INFERNO = 118; + public static final int BLIZZARD = 119; + //New Blobs + public static final int DIED = 120; + + private static final int SIZE = 7; + + private int type; + private float lifespan; + private float left; + + private static TextureFilm film; + + private static SparseArray factories = new SparseArray<>(); + + public Speck() { + super(); + + texture(Assets.Effects.SPECKS); + if (film == null) { + film = new TextureFilm(texture, SIZE, SIZE); + } + + origin.set(SIZE / 2f); + } + + public Speck image(int type) { + reset(0, 0, 0, type); + + left = lifespan = Float.POSITIVE_INFINITY; + this.type = -1; + + resetColor(); + scale.set(1); + speed.set(0); + acc.set(0); + angle = 0; + angularSpeed = 0; + + return this; + } + + public void reset(int index, float x, float y, int type) { + revive(); + + this.type = type; + switch (type) { + case DISCOVER: + case RED_LIGHT: + frame(film.get(LIGHT)); + break; + case EVOKE: + case MASK: + case KIT: + case FORGE: + frame(film.get(STAR)); + break; + case RATTLE: + frame(film.get(BONE)); + break; + case JET: + case TOXIC: + case DIED: + case CORROSION: + case PARALYSIS: + case STENCH: + case CONFUSION: + case STORM: + case DUST: + case SMOKE: + case BLIZZARD: + case INFERNO: + frame(film.get(STEAM)); + break; + case CALM: + frame(film.get(SCREAM)); + break; + default: + frame(film.get(type)); + } + + this.x = x - origin.x; + this.y = y - origin.y; + + resetColor(); + scale.set(1); + speed.set(0); + acc.set(0); + angle = 0; + angularSpeed = 0; + + switch (type) { + + case HEALING: + speed.set(0, -20); + lifespan = 1f; + break; + + case STAR: + speed.polar(Random.Float(2 * 3.1415926f), Random.Float(128)); + acc.set(0, 128); + angle = Random.Float(360); + angularSpeed = Random.Float(-360, +360); + lifespan = 1f; + break; + + case FORGE: + speed.polar(Random.Float(-3.1415926f), Random.Float(64)); + acc.set(0, 128); + angle = Random.Float(360); + angularSpeed = Random.Float(-360, +360); + lifespan = 0.51f; + break; + + case EVOKE: + speed.polar(Random.Float(-3.1415926f), 50); + acc.set(0, 50); + angle = Random.Float(360); + angularSpeed = Random.Float(-180, +180); + lifespan = 1f; + break; + + case KIT: + speed.polar(index * 3.1415926f / 5, 50); + acc.set(-speed.x, -speed.y); + angle = index * 36; + angularSpeed = 360; + lifespan = 1f; + break; + + case MASK: + speed.set(Random.Int(2) == 0 ? Random.Float(-128, -64) : Random.Float(+64, +128), 0); + angularSpeed = speed.x < 0 ? -180 : +180; + acc.set(-speed.x, 0); + lifespan = 0.5f; + break; + + case RED_LIGHT: + tint(0xFFCC0000); + + case DISCOVER: + angle = Random.Float(360); + angularSpeed = 90; + lifespan = 0.5f; + am = 0; + break; + + case QUESTION: + lifespan = 0.8f; + break; + + case UP: + speed.set(0, -20); + lifespan = 1f; + break; + + case CALM: + color(0, 1, 1); + case SCREAM: + lifespan = 0.9f; + break; + + case BONE: + lifespan = 0.2f; + speed.polar(Random.Float(2 * 3.1415926f), 24 / lifespan); + acc.set(0, 128); + angle = Random.Float(360); + angularSpeed = 360; + break; + + case RATTLE: + lifespan = 0.5f; + speed.set(0, -100); + acc.set(0, -2 * speed.y / lifespan); + angle = Random.Float(360); + angularSpeed = 360; + break; + + case WOOL: + lifespan = 0.5f; + speed.set(0, -50); + angle = Random.Float(360); + angularSpeed = Random.Float(-360, +360); + break; + + case ROCK: + angle = Random.Float(360); + angularSpeed = Random.Float(-360, +360); + scale.set(Random.Float(1, 2)); + speed.set(0, 64); + lifespan = 0.2f; + this.y -= speed.y * lifespan; + break; + + case NOTE: + angularSpeed = Random.Float(-30, +30); + speed.polar((angularSpeed - 90) * PointF.G2R, 30); + lifespan = 1f; + break; + + case CHANGE: + angle = Random.Float(360); + speed.polar((angle - 90) * PointF.G2R, Random.Float(4, 12)); + lifespan = 1.5f; + break; + + case HEART: + speed.set(Random.Int(-10, +10), -40); + angularSpeed = Random.Float(-45, +45); + lifespan = 1f; + break; + + case BUBBLE: + speed.set(0, -15); + scale.set(Random.Float(0.8f, 1)); + lifespan = Random.Float(0.8f, 1.5f); + break; + + case STEAM: + speed.y = -Random.Float(10, 15); + angularSpeed = Random.Float(+180); + angle = Random.Float(360); + lifespan = 1f; + break; + + case JET: + speed.y = +32; + acc.y = -64; + angularSpeed = Random.Float(180, 360); + angle = Random.Float(360); + lifespan = 0.5f; + break; + + case TOXIC: + hardlight(0x50FF60); + angularSpeed = 30; + angle = Random.Float(360); + lifespan = Random.Float(1f, 3f); + break; + + case DIED: + if (Dungeon.depth == 27) { + hardlight(0x0); + } else { + hardlight(0xff5060); + } + + angularSpeed = 30; + angle = Random.Float(360); + lifespan = Random.Float(1f, 3f); + break; + + case CORROSION: + hardlight(0xAAAAAA); + angularSpeed = 30; + angle = Random.Float(360); + lifespan = Random.Float(1f, 3f); + break; + + case PARALYSIS: + hardlight(0xFFFF66); + angularSpeed = -30; + angle = Random.Float(360); + lifespan = Random.Float(1f, 3f); + break; + + case STENCH: + hardlight(0x003300); + angularSpeed = -30; + angle = Random.Float(360); + lifespan = Random.Float(1f, 3f); + break; + + case CONFUSION: + hardlight(Random.Int(0x1000000) | 0x000080); + angularSpeed = Random.Float(-20, +20); + angle = Random.Float(360); + lifespan = Random.Float(1f, 3f); + break; + + case STORM: + hardlight(0x8AD8D8); + angularSpeed = Random.Float(-20, +20); + angle = Random.Float(360); + lifespan = Random.Float(1f, 3f); + break; + + case INFERNO: + hardlight(0xEE7722); + angularSpeed = Random.Float(200, 300) * (Random.Int(2) == 0 ? -1 : 1); + angle = Random.Float(360); + lifespan = Random.Float(1f, 3f); + break; + + case BLIZZARD: + hardlight(0xFFFFFF); + angularSpeed = Random.Float(200, 300) * (Random.Int(2) == 0 ? -1 : 1); + angle = Random.Float(360); + lifespan = Random.Float(1f, 3f); + break; + + case SMOKE: + hardlight(0x000000); + angularSpeed = 30; + angle = Random.Float(360); + lifespan = Random.Float(1f, 1.5f); + break; + + case DUST: + hardlight(0xFFFF66); + angle = Random.Float(360); + speed.polar(Random.Float(2 * 3.1415926f), Random.Float(16, 48)); + lifespan = 0.5f; + break; + + case COIN: + speed.polar(-PointF.PI * Random.Float(0.3f, 0.7f), Random.Float(48, 96)); + acc.y = 256; + lifespan = -speed.y / acc.y * 2; + break; + } + + left = lifespan; + } + + @Override + public void update() { + super.update(); + + left -= Game.elapsed; + if (left <= 0) { + + kill(); + + } else { + + float p = 1 - left / lifespan; // 0 -> 1 + + switch (type) { + + case STAR: + case FORGE: + scale.set(1 - p); + am = p < 0.2f ? p * 5f : (1 - p) * 1.25f; + break; + + case KIT: + case MASK: + am = 1 - p * p; + break; + + case EVOKE: + + case HEALING: + am = p < 0.5f ? 1 : 2 - p * 2; + break; + + case RED_LIGHT: + case LIGHT: + am = scale.set(p < 0.2f ? p * 5f : (1 - p) * 1.25f).x; + break; + + case DISCOVER: + am = 1 - p; + scale.set((p < 0.5f ? p : 1 - p) * 2); + break; + + case QUESTION: + scale.set((float) (Math.sqrt(p < 0.5f ? p : 1 - p) * 3)); + break; + + case UP: + scale.set((float) (Math.sqrt(p < 0.5f ? p : 1 - p) * 2)); + break; + + case CALM: + case SCREAM: + am = (float) Math.sqrt((p < 0.5f ? p : 1 - p) * 2f); + scale.set(p * 7); + break; + + case BONE: + case RATTLE: + am = p < 0.9f ? 1 : (1 - p) * 10; + break; + + case ROCK: + am = p < 0.2f ? p * 5 : 1; + break; + + case NOTE: + am = 1 - p * p; + break; + + case WOOL: + scale.set(1 - p); + break; + + case CHANGE: + am = (float) Math.sqrt((p < 0.5f ? p : 1 - p) * 2); + scale.y = (1 + p) * 0.5f; + scale.x = scale.y * (float) Math.cos(left * 15); + break; + + case HEART: + scale.set(1 - p); + am = 1 - p * p; + break; + + case BUBBLE: + am = p < 0.2f ? p * 5 : 1; + break; + + case STEAM: + case TOXIC: + case PARALYSIS: + case DIED: + case CONFUSION: + case STORM: + case BLIZZARD: + case INFERNO: + case DUST: + am = (float) Math.sqrt((p < 0.5f ? p : 1 - p) * 0.5f); + scale.set(1 + p); + break; + + case CORROSION: + hardlight(ColorMath.interpolate(0xAAAAAA, 0xFF8800, p)); + case STENCH: + case SMOKE: + am = (float) Math.sqrt((p < 0.5f ? p : 1 - p)); + scale.set(1 + p); + break; + + case JET: + am = (p < 0.5f ? p : 1 - p) * 2; + scale.set(p * 1.5f); + break; + + case COIN: + scale.x = (float) Math.cos(left * 5); + rm = gm = bm = (Math.abs(scale.x) + 1) * 0.5f; + am = p < 0.9f ? 1 : (1 - p) * 10; + break; + } + } + } + + public static Emitter.Factory factory(final int type) { + return factory(type, false); + } + + public static Emitter.Factory factory(final int type, final boolean lightMode) { + + Emitter.Factory factory = factories.get(type); + + if (factory == null) { + factory = new Emitter.Factory() { + @Override + public void emit(Emitter emitter, int index, float x, float y) { + Speck p = (Speck) emitter.recycle(Speck.class); + p.reset(index, x, y, type); + } + + @Override + public boolean lightMode() { + return lightMode; + } + }; + factories.put(type, factory); + } + + return factory; + } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Sai.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Sai.java index f1a0dc1bf..c2244e754 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Sai.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Sai.java @@ -61,7 +61,7 @@ public class Sai extends MeleeWeapon { //50x0.1+7x0.5+1=10+3.5+1=15 if(attacker.HP >= attacker.HT){ 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); attacker.HP +=attacker.HT * 0.1 + (buffedLvl()) + 1.5; attacker.sprite.showStatus(CharSprite.POSITIVE, ("+" + R + "HP")); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/features/LevelTransition.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/features/LevelTransition.java new file mode 100644 index 000000000..24ca621b7 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/features/LevelTransition.java @@ -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 + */ + +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); + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/YinYangRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/YinYangRoom.java index 24ec204fa..c6947a52e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/YinYangRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/YinYangRoom.java @@ -121,11 +121,12 @@ public class YinYangRoom extends SpecialRoom { if(Dungeon.depth == 1){ door.set(Door.Type.REGULAR); } else { + level.addItemToSpawn( new IronKey( Dungeon.depth ) ); door.set(Door.Type.LOCKED); } } - level.addItemToSpawn( new IronKey( Dungeon.depth ) ); + level.addItemToSpawn( new CrystalKey( Dungeon.depth ) ); level.addItemToSpawn( new PotionOfLevitation()); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/messages/Messages.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/messages/Messages.java index e52a83cac..489ebc46f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/messages/Messages.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/messages/Messages.java @@ -53,8 +53,6 @@ public class Messages { return lang; } - - /** * Setup Methods */ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/CellSelector.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/CellSelector.java index 817c2a105..99f59fd94 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/CellSelector.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/CellSelector.java @@ -96,8 +96,8 @@ public class CellSelector extends ScrollArea { } } - //then mobs - for (Char mob : Dungeon.level.mobs.toArray(new Mob[0])){ + Mob[] mobs = Dungeon.level.mobs.toArray(new Mob[0]); + for (Char mob : mobs) { 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) { @@ -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 for (Heap heap : Dungeon.level.heaps.valueList()){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/TribesmanSprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/TribesmanSprite.java new file mode 100644 index 000000000..c45d4d827 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/TribesmanSprite.java @@ -0,0 +1,29 @@ +package com.shatteredpixel.shatteredpixeldungeon.sprites; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.watabou.noosa.TextureFilm; + +public class TribesmanSprite extends MobSprite { + + public TribesmanSprite() { + super(); + + texture( Assets.Sprites.HEROGNOLL ); + + TextureFilm frames = new TextureFilm( texture, 13, 16 ); + + idle = new Animation( 2, true ); + idle.frames( frames, 0, 0, 0, 1, 0, 0, 1, 1 ); + + run = new Animation( 12, true ); + run.frames( frames, 5, 6, 7, 8 ); + + attack = new Animation( 12, false ); + attack.frames( frames, 2, 3, 4, 0 ); + + die = new Animation( 12, false ); + die.frames( frames, 9, 10, 11 ); + + play( idle ); + } +} \ No newline at end of file diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java index b10828825..eb2710ee1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java @@ -143,7 +143,7 @@ public class vM0_6_7_X_Changes { } public static void add_v0_6_55_Changes( ArrayList changeInfos ) { - ChangeInfo changes = new ChangeInfo("v0.6.4.0-BetaI-XI", true, ""); + ChangeInfo changes = new ChangeInfo("v0.6.4.0-BetaI-XIII", true, ""); changes.hardlight(Window.TITLE_COLOR); changeInfos.add(changes); @@ -198,6 +198,9 @@ public class vM0_6_7_X_Changes { changes.hardlight(Window.CYELLOW); changeInfos.add(changes); + changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.SAI), ("吸血鬼刀-Beta13"), + ("修复了一些吸血权重问题。"))); + changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.WRALIPS), ("暗金宝石护符"), ("现在最高上限+10,并调整优化了一些问题"))); @@ -219,7 +222,7 @@ public class vM0_6_7_X_Changes { changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.GREATSHIELD), ("5阶武器"), ("现在5阶武器生成平均化"))); - changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.SAI), ("吸血鬼刀"), + changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.SAI), ("吸血鬼刀-Beta12"), ("优化数值,调整吸血权重。"))); changes.addButton(new ChangeButton(new ItemSprite(ItemSpriteSheet.DG3), ("归溯钥剑"), diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSadGhost.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSadGhost.java index 9c92c7284..374b740ef 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSadGhost.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSadGhost.java @@ -22,9 +22,9 @@ package com.shatteredpixel.shatteredpixeldungeon.windows; import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Chrome; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; -import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Ghost; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; @@ -113,6 +113,9 @@ public class WndSadGhost extends Window { reward.identify(false); if (reward.doPickUp( Dungeon.hero )) { GLog.i( Messages.get(Dungeon.hero, "you_now_have", reward.name()) ); + if(reward.level() == 4 || reward.level() == 3){ + Badges.GhostDageCollected(); + } } else { Dungeon.level.drop( reward, ghost.pos ).sprite.drop(); } From 28cd52cc0cf8d0d6ad868231d51bda1cfe744a6f Mon Sep 17 00:00:00 2001 From: LingASDJ <2735951230@qq.com> Date: Thu, 21 Sep 2023 23:35:38 +0800 Subject: [PATCH 5/6] Update 0.6.5.0-Alpha2 --- build.gradle | 4 +- core/src/main/assets/interfaces/badges.png | Bin 21695 -> 21560 bytes core/src/main/assets/interfaces/banners.png | Bin 23154 -> 22682 bytes .../main/assets/interfaces/passwordbadges.png | Bin 0 -> 6228 bytes .../assets/interfaces/status_pane_normal.png | Bin 1606 -> 1609 bytes .../assets/messages/actors/actors.properties | 8 +- .../assets/messages/items/items.properties | 18 +- .../main/assets/messages/misc/misc.properties | 78 ++--- .../assets/messages/scenes/scenes.properties | 5 +- .../src/main/assets/messages/ui/ui.properties | 2 + .../messages/windows/windows.properties | 2 +- core/src/main/assets/sprites/items/items.png | Bin 89400 -> 89431 bytes .../shatteredpixeldungeon/Assets.java | 1 + .../shatteredpixeldungeon/Badges.java | 68 +---- .../shatteredpixeldungeon/Dungeon.java | 2 + .../shatteredpixeldungeon/PaswordBadges.java | 280 ++++++++++++++++++ .../actors/hero/Hero.java | 3 +- .../actors/hero/HeroClass.java | 18 +- .../actors/mobs/Bestiary.java | 3 +- .../actors/mobs/YogDzewa.java | 5 +- .../actors/mobs/bosses/DMZERO.java | 4 +- .../actors/mobs/bosses/DiamondKnight.java | 3 +- .../actors/mobs/bosses/DwarfMaster.java | 3 +- .../actors/mobs/bosses/FireMagicDied.java | 4 +- .../actors/mobs/bosses/SakaFishBoss.java | 4 +- .../effects/PasswordBadgeBanner.java | 198 +++++++++++++ .../shatteredpixeldungeon/items/Amulet.java | 2 + .../items/Generator.java | 79 ++--- .../shatteredpixeldungeon/items/Item.java | 2 +- .../items/MainBooks.java | 3 +- .../items/artifacts/Artifact.java | 2 +- .../items/books/Books.java | 28 +- .../items/weapon/melee/LifeTreeSword.java | 11 +- .../weapon/melee/legend/DiedCrossBow.java | 263 ++++++++++++++++ .../weapon/melee/legend/LegendWeapon.java | 128 ++++++++ .../levels/ZeroLevel.java | 14 +- .../shatteredpixeldungeon/scenes/GoScene.java | 2 +- .../scenes/PassWordBadgesScene.java | 147 +++++++++ .../scenes/PixelScene.java | 27 ++ .../scenes/TitleScene.java | 5 + .../scenes/WelcomeScene.java | 4 +- .../sprites/ItemSpriteSheet.java | 27 ++ .../ui/changelist/mlpd/vM0_6_7_X_Changes.java | 36 ++- .../windows/WndProBadge.java | 74 +++++ .../windows/WndSettings.java | 24 +- 45 files changed, 1369 insertions(+), 222 deletions(-) create mode 100644 core/src/main/assets/interfaces/passwordbadges.png create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/PaswordBadges.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/PasswordBadgeBanner.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/legend/DiedCrossBow.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/legend/LegendWeapon.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PassWordBadgesScene.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndProBadge.java diff --git a/build.gradle b/build.gradle index b8082c8a3..44b320f0c 100644 --- a/build.gradle +++ b/build.gradle @@ -18,8 +18,8 @@ allprojects { appName = 'Magic Ling Pixel Dungeon' appPackageName = 'com.ansdomagiclingpixeldungeon.ling' - appVersionCode =907000 - appVersionName = '0.6.5.0-Alpha1' + appVersionCode =907300 + appVersionName = '0.6.5.0-Alpha2' appJavaCompatibility = JavaVersion.VERSION_11 diff --git a/core/src/main/assets/interfaces/badges.png b/core/src/main/assets/interfaces/badges.png index 3b9be2f25d9e8730b5e12ce51b2104772aa1eade..62fc07ea5ffe8490649e2c634ee1ea98efb86bc6 100644 GIT binary patch literal 21560 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 diff --git a/core/src/main/assets/interfaces/passwordbadges.png b/core/src/main/assets/interfaces/passwordbadges.png new file mode 100644 index 0000000000000000000000000000000000000000..196ece7deec26b5d6d570ce5c11db1859c173bd5 GIT binary patch literal 6228 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 f|B-_w5?PQ8IP~2w&X8BaMVY8 literal 0 HcmV?d00001 diff --git a/core/src/main/assets/interfaces/status_pane_normal.png b/core/src/main/assets/interfaces/status_pane_normal.png index c4afb2643fc6fb2c9c8b5fb2350aa01af301ad1c..713ee15f332bcdf41a88065b6e5eaead66d3ce71 100644 GIT binary patch delta 1045 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 LYAV#cwg~xOo{Xtq diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java index 5377ade5a..30a92297a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java @@ -123,6 +123,7 @@ public class Assets { public static final String BANNERSSD = "interfaces/banners_sd.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 CHROME = "interfaces/chrome.png"; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java index cbac632c3..1a257dd24 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java @@ -144,7 +144,7 @@ public class Badges { VICTORY ( 78 ), YASD ( 79, true ), - GODD_MAKE ( 82 ), + CLEAR_WATER ( 83 ), GHOSTDAGE ( 84 ), // ENDIED ( 85 ), @@ -190,27 +190,15 @@ public class Badges { NYZ_SHOP ( 117 ), DAGETO ( 118 ), KILL_SM ( 119 ), - - TAKE_ITEM ( 120 ), - //rudy - FIREGIRL ( 128 ), - //SLIMEPR ( 129 ), - DRAWF_HEAD ( 130 ), - SPICEALBOSS ( 131), + + STORM ( 132), KILL_MG (133), - BIG_X (134), - EXSG (135), - BRCLER (136), - HIGH_SCORE_5 ( 137 ), - - SAKA_DIED ( 138 ), - - RESET_DAY ( 139 ); + HIGH_SCORE_5 ( 137 ); public boolean meta; @@ -265,7 +253,7 @@ public class Badges { displayBadge( badge ); } - private static HashSet global; + public static HashSet global; private static HashSet local = new HashSet<>(); private static boolean saveNeeded = false; @@ -755,17 +743,17 @@ public class Badges { global.contains( Badge.GET_SC ) && global.contains( Badge.KILL_COLDELE)) { - Badge badge = Badge.GODD_MAKE; - displayBadge( badge ); + PaswordBadges.Badge badge = PaswordBadges.Badge.GODD_MAKE; + PaswordBadges.displayBadge( badge ); } } - private static void validateAMZ() { + public 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)) { + global.contains( Badge.KILL_MG) && PaswordBadges.global.contains( PaswordBadges.Badge.FIREGIRL) && PaswordBadges.global.contains( PaswordBadges.Badge.DRAWF_HEAD) && PaswordBadges.global.contains( PaswordBadges.Badge.SAKA_DIED)) { - Badge badge = Badge.SPICEALBOSS; - displayBadge( badge ); + PaswordBadges.Badge badge = PaswordBadges.Badge.SPICEALBOSS; + PaswordBadges.displayBadge( badge ); } } @@ -1035,14 +1023,9 @@ public class Badges { validateAMZ(); } - public static void KILLSAKA() { - displayBadge( Badge.SAKA_DIED); - validateAMZ(); - } - public static void REHOMESKY() { - displayBadge( Badge.RESET_DAY ); - } + + public static void STORM() { displayBadge( Badge.STORM); @@ -1061,15 +1044,6 @@ public class Badges { 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() { displayBadge( Badge.KILL_MG ); @@ -1081,22 +1055,6 @@ public class Badges { 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() { displayBadge( Badge.RLPT ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java index 64f288cfe..ac4af6755 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java @@ -836,8 +836,10 @@ public class Dungeon { Bundle badges = bundle.getBundle(BADGES); if (!badges.isNull()) { Badges.loadLocal( badges ); + PaswordBadges.loadLocal( badges ); } else { Badges.reset(); + PaswordBadges.reset(); } Notes.restoreFromBundle( bundle ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/PaswordBadges.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/PaswordBadges.java new file mode 100644 index 000000000..b11069180 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/PaswordBadges.java @@ -0,0 +1,280 @@ +package com.shatteredpixel.shatteredpixeldungeon; + +import static com.shatteredpixel.shatteredpixeldungeon.Badges.validateAMZ; +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 ); + validateAMZ(); + } + + public static void KILLFIREGIRL() { + displayBadge( PaswordBadges.Badge.FIREGIRL ); + validateAMZ(); + } + + public static void KILLSAKA() { + displayBadge( PaswordBadges.Badge.SAKA_DIED); + validateAMZ(); + } + + 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 global; + private static HashSet local = new HashSet<>(); + + + + private static boolean saveNeeded = false; + + public static void reset() { + local.clear(); + loadGlobal(); + } + + public static final String BADGES_FILE = "badges.dat"; + private static final String BADGES = "badges"; + + private static final HashSet 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 renamedBadges = new HashMap<>(); + static{ + //0.6.5 + renamedBadges.put("CHAMPION", "CHAMPION_1"); + } + + public static HashSet restore( Bundle bundle ) { + HashSet 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 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( BADGES_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(BADGES_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.desc()) ); + } + + } else { + + global.add( badge ); + saveNeeded = true; + + if (badge.meta) { + GLog.h( Messages.get(Badges.class, "new_super", badge.desc()) ); + } else { + GLog.h( Messages.get(Badges.class, "new", badge.desc()) ); + } + PixelScene.showProBadge( badge ); + } + } + + public static boolean isUnlocked( Badge badge ) { + return global.contains( badge ); + } + + public static HashSet 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 filtered( boolean global ) { + + HashSet filtered = new HashSet<>(global ? PaswordBadges.global : PaswordBadges.local); + + Iterator iterator = filtered.iterator(); + while (iterator.hasNext()) { + Badge badge = iterator.next(); + if ((!global && badge.meta) || badge.image == -1) { + iterator.remove(); + } + } + + ArrayList list = new ArrayList<>(filtered); + Collections.sort( list ); + + return list; + } + + private static void leaveBest( HashSet 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; + } + } + } +} \ No newline at end of file diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java index dcb3cae41..98626732f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java @@ -39,6 +39,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Challenges; import com.shatteredpixel.shatteredpixeldungeon.Conducts; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.GamesInProgress; +import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges; import com.shatteredpixel.shatteredpixeldungeon.SPDSettings; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.Statistics; @@ -1323,7 +1324,7 @@ public class Hero extends Char { if (Dungeon.depth == 0) { if (belongings.getItem(SakaFishSketon.class) != null) { - Badges.REHOMESKY(); + PaswordBadges.REHOMESKY(); } if (belongings.getItem(Amulet.class) == null) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java index a70928042..37af73d67 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java @@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Challenges; import com.shatteredpixel.shatteredpixeldungeon.Conducts; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges; import com.shatteredpixel.shatteredpixeldungeon.QuickSlot; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionHero; @@ -61,7 +62,6 @@ 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.TalismanOfForesight; -import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.WraithAmulet; import com.shatteredpixel.shatteredpixeldungeon.items.bags.BookBag; import com.shatteredpixel.shatteredpixeldungeon.items.bags.HerbBag; @@ -69,7 +69,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.bags.KingBag; 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.IceCityBooks; import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.TestBooks; import com.shatteredpixel.shatteredpixeldungeon.items.books.bookslist.YellowSunBooks; import com.shatteredpixel.shatteredpixeldungeon.items.food.Food; @@ -114,13 +113,17 @@ 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.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.ThrowingStone; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.HaloDart; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.plants.AikeLaier; import com.shatteredpixel.shatteredpixeldungeon.plants.Firebloom; import com.shatteredpixel.shatteredpixeldungeon.plants.SkyBlueFireBloom; +import java.util.List; + public enum HeroClass { WARRIOR( HeroSubClass.BERSERKER, HeroSubClass.GLADIATOR ), @@ -151,7 +154,9 @@ public enum HeroClass { Dungeon.gold += 320; } - if ( Badges.isUnlocked(Badges.Badge.EXSG)){ + PaswordBadges.loadGlobal(); + List passwordbadges = PaswordBadges.filtered( true ); + if(passwordbadges.contains(PaswordBadges.Badge.EXSG)){ Dungeon.gold += 720; } @@ -165,12 +170,10 @@ public enum HeroClass { new LockSword().quantity(1).identify().collect(); new IceFishSword().quantity(1).identify().collect(); new PotionOfInvisibility().quantity(45).identify().collect(); - //new CommRelay().quantity(1).identify().collect(); new AncityArmor().quantity(1).identify().collect(); new TengusMask().quantity(1).identify().collect(); new RingOfWealth().quantity(1).identify().collect(); - new TimekeepersHourglass().quantity(1).identify().collect(); - //new WandOfAnmy().quantity(1).identify().collect(); + new DiedCrossBow().quantity(1).identify().collect(); Buff.affect(hero, ChampionHero.AntiMagic.class, 50000f); new WraithAmulet().quantity(1).identify().collect(); new BloodthirstyThorn().quantity(1).identify().collect(); @@ -197,7 +200,6 @@ public enum HeroClass { new SkyBlueFireBloom.Seed().quantity(51).identify().collect(); new AikeLaier.Seed().quantity(51).identify().collect(); new Firebloom.Seed().quantity(15).identify().collect(); - new WandOfRegrowth().quantity(1).identify().collect(); new WandOfFrost().quantity(1).identify().collect(); new MagicalInfusion().quantity(1).identify().collect(); @@ -220,7 +222,7 @@ public enum HeroClass { new PotionOfLiquidFlameX().quantity(100).identify().collect(); new YellowSunBooks().quantity(1).identify().collect(); new BrokenBooks().quantity(12).identify().collect(); - new IceCityBooks().quantity(12).identify().collect(); + new HaloDart().quantity(100).identify().collect(); new ScrollOfFlameCursed().quantity(44).identify().collect(); new MailArmor().quantity(1).identify().collect(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java index b1759f4fe..993edca9d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bestiary.java @@ -25,7 +25,6 @@ import static com.shatteredpixel.shatteredpixeldungeon.Challenges.RLPT; import com.shatteredpixel.shatteredpixeldungeon.Conducts; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.spical.GnollHero; import com.watabou.utils.Random; import java.util.ArrayList; @@ -48,7 +47,7 @@ public class Bestiary { case 1: //3x rat, 1x snake return new ArrayList<>(Arrays.asList( - GnollHero.class, Rat.class, + Rat.class, Rat.class, Rat.class)); case 2: return new ArrayList<>(Arrays.asList(Rat.class, diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogDzewa.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogDzewa.java index 4b1b58ff5..f9a9a2f9e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogDzewa.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogDzewa.java @@ -9,6 +9,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Challenges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges; import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; @@ -493,11 +494,11 @@ public class YogDzewa extends Mob { } if(Dungeon.isChallenged(SBSG)){ - Badges.BIGX(); + PaswordBadges.BIGX(); } if(Dungeon.isChallenged(EXSG)){ - Badges.EXSG(); + PaswordBadges.EXSG(); } updateVisibility(Dungeon.level); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DMZERO.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DMZERO.java index b2eea127b..4744a2390 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DMZERO.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DMZERO.java @@ -3,8 +3,8 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses; 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.PaswordBadges; import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; @@ -382,7 +382,7 @@ public class DMZERO extends Mob GameScene.add(((Mob) (obj))); Actor.addDelayed(new Pushing(((Char) (obj)), pos, ((NullDiedTO) (obj)).pos), -1F); Statistics.bossScores[4] += 3000; - Badges.BOSSRUSH(); + PaswordBadges.BOSSRUSH(); yell( Messages.get(this, "defeated") ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DiamondKnight.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DiamondKnight.java index 6aed0f5b2..1e8c16cf6 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DiamondKnight.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DiamondKnight.java @@ -27,6 +27,7 @@ import static com.shatteredpixel.shatteredpixeldungeon.levels.Level.set; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; @@ -278,7 +279,7 @@ public class DiamondKnight extends Boss { Badges.KILL_SMK(); if(Statistics.dimandchestmazeCollected>=3){ - Badges.KILL_OMP(); + PaswordBadges.validateOMP(); Statistics.bossScores[1] += 1000; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DwarfMaster.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DwarfMaster.java index 64b74b276..27b4c2583 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DwarfMaster.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/DwarfMaster.java @@ -6,6 +6,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Conducts; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges; import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; 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 PotionOfHealing().quantity(Random.NormalIntRange(2,4)), pos).sprite.drop(); Dungeon.level.drop(new MeatPie().quantity(Random.NormalIntRange(1,2)), pos).sprite.drop(); - Badges.KILLDWARF(); + PaswordBadges.KILLDWARF(); Badges.validateBossSlain(); yell( Messages.get(this, "defeated") ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/FireMagicDied.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/FireMagicDied.java index b27d4f0b6..d32750d86 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/FireMagicDied.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/FireMagicDied.java @@ -7,9 +7,9 @@ import static com.shatteredpixel.shatteredpixeldungeon.levels.ShopBossLevel.FALS import static com.shatteredpixel.shatteredpixeldungeon.levels.ShopBossLevel.TRUEPosition; import com.shatteredpixel.shatteredpixeldungeon.Assets; -import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Conducts; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges; import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; @@ -763,7 +763,7 @@ public class FireMagicDied extends Mob implements Callback { GameScene.bossSlain(); - Badges.KILLFIREGIRL(); + PaswordBadges.KILLFIREGIRL(); yell( Messages.get(this, "defeated",Dungeon.hero.name()) ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/SakaFishBoss.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/SakaFishBoss.java index 96834c197..e28581468 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/SakaFishBoss.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/bosses/SakaFishBoss.java @@ -3,8 +3,8 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses; 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.PaswordBadges; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Boss; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; @@ -279,7 +279,7 @@ public class SakaFishBoss extends Boss { Dungeon.level.drop( new SakaFishSketon(), pos ).sprite.drop(); Dungeon.level.drop( new WaterSoul(), pos ).sprite.drop(); - Badges.KILLSAKA(); + PaswordBadges.KILLSAKA(); yell( Messages.get(this, "defeated") ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/PasswordBadgeBanner.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/PasswordBadgeBanner.java new file mode 100644 index 000000000..b15314519 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/PasswordBadgeBanner.java @@ -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 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 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; + } +} + diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Amulet.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Amulet.java index 9292708f8..a8c4bc8e1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Amulet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Amulet.java @@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Challenges; import com.shatteredpixel.shatteredpixeldungeon.Conducts; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; @@ -111,6 +112,7 @@ public class Amulet extends Item { public void afterCreate() { Badges.validateVictory(); Badges.validateChampion(Challenges.activeChallenges()); + PaswordBadges.ALLCS(Challenges.activeChallenges()); Badges.saveGlobal(); } }); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java index 2521536bb..4791e3441 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java @@ -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.Whip; 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.FishingSpear; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ForceCube; @@ -211,7 +212,7 @@ public class Generator { return randomWeapon(Dungeon.depth / 5, useDefaults); } - public enum Category { + public enum Category { WEAPON ( 2, 2, MeleeWeapon.class), WEP_T1 ( 0, 0, MeleeWeapon.class), WEP_T2 ( 0, 0, MeleeWeapon.class), @@ -219,30 +220,30 @@ public class Generator { WEP_T4 ( 0, 0, MeleeWeapon.class), WEP_T5 ( 0, 0, MeleeWeapon.class), WEP_T6 ( 0, 0, MeleeWeapon.class), - + ARMOR ( 2, 1, Armor.class ), - + MISSILE ( 1, 2, MissileWeapon.class ), MIS_T1 ( 0, 0, MissileWeapon.class ), MIS_T2 ( 0, 0, MissileWeapon.class ), MIS_T3 ( 0, 0, MissileWeapon.class ), MIS_T4 ( 0, 0, MissileWeapon.class ), MIS_T5 ( 0, 0, MissileWeapon.class ), - + WAND ( 1, 1, Wand.class ), RING ( 1, 0, Ring.class ), ARTIFACT( 0, 1, Artifact.class), - + FOOD ( 0, 0, Food.class ), - + POTION ( 8, 8, Potion.class ), SEED ( 1, 1, Plant.Seed.class ), - + SCROLL ( 8, 8, Scroll.class ), STONE ( 1, 1, Runestone.class), - + GOLD ( 10, 10, Gold.class ); - + public Class[] classes; //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 secondProb; public Class superClass; - + private Category( float firstProb, float secondProb, Class superClass ) { this.firstProb = firstProb; this.secondProb = secondProb; this.superClass = superClass; } - + public static int order( Item item ) { for (int i=0; i < values().length; i++) { if (values()[i].superClass.isInstance( item )) { @@ -421,17 +422,21 @@ public class Generator { Glaive.class, Greataxe.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[]{ IceFishSword.class, IceDewVialSword.class }; WEP_T6.probs = new float[]{ 1,0 }; - + //see Generator.randomArmor ARMOR.classes = new Class[]{ ClothArmor.class, @@ -441,38 +446,38 @@ public class Generator { PlateArmor.class, LamellarArmor.class}; ARMOR.probs = new float[]{ 0, 0, 0, 0, 0, 0 }; - + //see Generator.randomMissile MISSILE.classes = new Class[]{}; MISSILE.probs = new float[]{}; - + MIS_T1.classes = new Class[]{ ThrowingStone.class, ThrowingKnife.class }; MIS_T1.probs = new float[]{ 6, 5 }; - + MIS_T2.classes = new Class[]{ FishingSpear.class, ThrowingClub.class, Shuriken.class }; MIS_T2.probs = new float[]{ 6, 5, 4 }; - + MIS_T3.classes = new Class[]{ ThrowingSpear.class, Kunai.class, Bolas.class }; MIS_T3.probs = new float[]{ 6, 5, 4 }; - + MIS_T4.classes = new Class[]{ Javelin.class, Tomahawk.class, HeavyBoomerang.class }; MIS_T4.probs = new float[]{ 6, 5, 4 }; - + MIS_T5.classes = new Class[]{ Trident.class, ThrowingHammer.class, @@ -491,10 +496,10 @@ public class Generator { RiceDumplings.RiceDumplingsBottle.class, RiceDumplings.RiceDumplingsRed.class, RiceDumplings.RiceDumplingsOrange.class, - RiceDumplings.RiceDumplingsPink.class, + RiceDumplings.RiceDumplingsPink.class, }; FOOD.probs = new float[]{ 4, 1, 0, isDWJ,isDWJ,isDWJ,isDWJ,isDWJ }; - + RING.classes = new Class[]{ RingOfAccuracy.class, RingOfEvasion.class, @@ -508,7 +513,7 @@ public class Generator { RingOfTenacity.class, RingOfWealth.class}; RING.probs = new float[]{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - + ARTIFACT.classes = new Class[]{ CapeOfThorns.class, ChaliceOfBlood.class, @@ -558,7 +563,7 @@ public class Generator { public static void reset(Category cat){ if (cat.defaultProbs != null) cat.probs = cat.defaultProbs.clone(); } - + public static Item random() { Category cat = Random.chances( categoryProbs ); if (cat == null){ @@ -569,7 +574,7 @@ public class Generator { categoryProbs.put( cat, categoryProbs.get( cat ) - 1); return random( cat ); } - + public static Item random( Category cat ) { switch (cat) { case ARMOR: @@ -601,7 +606,7 @@ public class Generator { return ((Item) Reflection.newInstance(cat.classes[Random.chances(cat.defaultProbs)])).random(); } } - + public static Item random( Class cl ) { return Reflection.newInstance(cl).random(); } @@ -609,11 +614,11 @@ public class Generator { public static Armor randomArmor(){ return randomArmor((Dungeon.depth + 1) / 3); } - + public static Armor randomArmor(int floorSet) { floorSet = (int)GameMath.gate(0, floorSet, floorSetTierProbs.length-1); - + Armor a = (Armor)Reflection.newInstance(Category.ARMOR.classes[Random.chances(floorSetTierProbs[floorSet])]); a.random(); return a; @@ -631,17 +636,17 @@ public class Generator { public static MeleeWeapon randomWeapon(){ return randomWeapon(Dungeon.depth / 5); } - + public static MeleeWeapon randomWeapon(int floorSet) { floorSet = (int)GameMath.gate(0, floorSet, floorSetTierProbs.length-1); - + Category c = wepTiers[Random.chances(floorSetTierProbs[floorSet])]; MeleeWeapon w = (MeleeWeapon)Reflection.newInstance(c.classes[Random.chances(c.probs)]); w.random(); return w; } - + public static final Category[] misTiers = new Category[]{ Category.MIS_T1, Category.MIS_T2, @@ -649,15 +654,15 @@ public class Generator { Category.MIS_T4, Category.MIS_T5 }; - + public static MissileWeapon randomMissile(){ return randomMissile(Dungeon.depth / 5); } - + public static MissileWeapon randomMissile(int floorSet) { - + floorSet = (int)GameMath.gate(0, floorSet, floorSetTierProbs.length-1); - + Category c = misTiers[Random.chances(floorSetTierProbs[floorSet])]; MissileWeapon w = (MissileWeapon)Reflection.newInstance(c.classes[Random.chances(c.probs)]); w.random(); @@ -694,7 +699,7 @@ public class Generator { private static final String FIRST_DECK = "first_deck"; private static final String GENERAL_PROBS = "general_probs"; private static final String CATEGORY_PROBS = "_probs"; - + public static void storeInBundle(Bundle bundle) { bundle.put(FIRST_DECK, usingFirstDeck); @@ -741,6 +746,6 @@ public class Generator { } } } - + } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java index ac7ac94f5..c0dac9182 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java @@ -76,7 +76,7 @@ public class Item implements Bundlable { public int flasks; - protected int quantity = 1; + public int quantity = 1; public boolean dropsDownHeap = false; public int level = 0; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/MainBooks.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/MainBooks.java index 3c0b00647..734f844e2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/MainBooks.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/MainBooks.java @@ -4,7 +4,6 @@ import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; public class MainBooks extends Item { //extends 相当于 copyfrom,但不同的是 它是一种继承自己 - @Override public String info() { return author; @@ -13,7 +12,7 @@ public class MainBooks extends Item { public int value() { 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"); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/Artifact.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/Artifact.java index d2107958f..8ba3c04bb 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/Artifact.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/Artifact.java @@ -154,7 +154,7 @@ public class Artifact extends KindofMisc { //display the current cooldown if (cooldown != 0) - return Messages.format( "%d", cooldown ); + return Messages.format( "CD:%d", cooldown ); //display as percent if (chargeCap == 100) diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/books/Books.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/books/Books.java index f71391375..15187a11e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/books/Books.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/books/Books.java @@ -5,20 +5,13 @@ import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.items.MainBooks; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; -import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; 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.utils.Bundle; import java.util.ArrayList; public class Books extends MainBooks { - //每本书的计数只能计算一次,避免玩家重复阅读同一本书刷成就。 - public boolean readOnly = false; - { defaultAction = Read; stackable = true; @@ -64,29 +57,10 @@ public class Books extends MainBooks { @Override public void execute(final Hero hero, String action ) { super.execute(hero, action); - if (action.equals( Read ) && quantity>1) { - if(!readOnly){ + if (action.equals( Read )) { Statistics.readBooks++; 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); - } - - } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/LifeTreeSword.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/LifeTreeSword.java index 2a360fd58..d3279dc9a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/LifeTreeSword.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/LifeTreeSword.java @@ -51,7 +51,7 @@ import com.watabou.utils.Random; import java.util.ArrayList; public class LifeTreeSword extends MeleeWeapon { - + private int getFood; { image = ItemSpriteSheet.LifeTreeSword; hitSoundPitch = 1f; @@ -133,7 +133,7 @@ public class LifeTreeSword extends MeleeWeapon { return super.proc(attacker, defender, damage); } - private int getFood; + public void restoreFromBundle(Bundle bundle) { super.restoreFromBundle(bundle); @@ -159,6 +159,9 @@ public class LifeTreeSword extends MeleeWeapon { spriteClass = CrivusFruitsRedSprites.class; alignment = Alignment.ALLY; + + HT = HP = 10+level(); + state = WANDERING = new Waiting(); properties.add(Property.IMMOVABLE); @@ -171,12 +174,12 @@ public class LifeTreeSword extends MeleeWeapon { @Override public int damageRoll() { - return Random.NormalIntRange( 5, 8 ); + return Random.NormalIntRange( 5+level(), 8+level() ); } @Override public int attackSkill( Char target ) { - return 6; + return 6+level(); } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/legend/DiedCrossBow.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/legend/DiedCrossBow.java new file mode 100644 index 000000000..6c20afd1a --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/legend/DiedCrossBow.java @@ -0,0 +1,263 @@ +package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.legend; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.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.bombs.Bomb; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.SpiritBow; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.Dart; +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 = true; + } + + @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 ); + + + Dart missile = Dungeon.hero.belongings.getItem(Dart.class); + if(missile != null){ + return ""+missile.quantity()/5; + } else { + return null; + } + + } + + + @Override + public void execute(Hero hero, String action ) { + + super.execute( hero, action ); + Dart missile = Dungeon.hero.belongings.getItem(Dart.class); + if (action.equals( AC_KING )) { + + if (!isEquipped(hero)){ + GLog.i( Messages.get(this, "no_equip") ); + } else if(cooldown == 0) { + if (missile != null) + if (missile.quantity() > 5) { + curUser = hero; + curItem = this; + GameScene.selectCell(bomb); + } else { + GLog.w(Messages.get(this, "no_king")); + } + } 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; + Dart missile = Dungeon.hero.belongings.getItem(Dart.class); + missile.quantity -= 5; + 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 = Dungeon.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 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 = Dungeon.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 == Dungeon.hero && !ch.isAlive()) { + Dungeon.fail(Bomb.class); + } + } + + 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 + } + +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/legend/LegendWeapon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/legend/LegendWeapon.java new file mode 100644 index 000000000..b4f784158 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/legend/LegendWeapon.java @@ -0,0 +1,128 @@ +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 actions(Hero hero) { + ArrayList 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", 9); + } + } else { + return ""; + } + + } + +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ZeroLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ZeroLevel.java index 87e035f73..78d6bd2d4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ZeroLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ZeroLevel.java @@ -25,6 +25,7 @@ import static com.shatteredpixel.shatteredpixeldungeon.items.Generator.randomArt import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Badges; +import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NxhyNpc; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Nyz; @@ -34,11 +35,14 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Slyl; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.obSir; import com.shatteredpixel.shatteredpixeldungeon.items.Ankh; import com.shatteredpixel.shatteredpixeldungeon.items.Generator; +import com.shatteredpixel.shatteredpixeldungeon.items.Gold; import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Stylus; import com.shatteredpixel.shatteredpixeldungeon.items.food.Pasty; +import java.util.List; + 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}; @@ -121,15 +125,21 @@ public class ZeroLevel extends Level { drop( new Pasty(), this.width * 20 + 19 ); - if ( Badges.isUnlocked(Badges.Badge.GODD_MAKE)){ + PaswordBadges.loadGlobal(); + List passwordbadges = PaswordBadges.filtered( true ); + + if(passwordbadges.contains(PaswordBadges.Badge.GODD_MAKE)){ 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 ( Badges.isUnlocked(Badges.Badge.KILL_DM720)||Badges.isUnlocked(Badges.Badge.KILL_MG) ){ drop(( Generator.randomUsingDefaults( Generator.Category.WEP_T2 )), this.width * 18 + 17 ); } + if(passwordbadges.contains(PaswordBadges.Badge.EXSG)){ + drop(new Gold().quantity(720), this.width * 18 + 18 ); + } if ( Badges.isUnlocked(Badges.Badge.RLPT)){ Item item = randomArtifact(); drop(item, this.width * 18 + 19 ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GoScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GoScene.java index a048201d1..b1ba858f4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GoScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GoScene.java @@ -38,7 +38,7 @@ public class GoScene extends PixelScene { int w = Camera.main.width; int h = Camera.main.height; - gdx = new Image(Assets.Splashes.MLPD2Y) { + gdx = new Image(Assets.Splashes.GDX) { @Override public void update() { if (SPDSettings.splashScreen() > 0 && sec < 1f) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PassWordBadgesScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PassWordBadgesScene.java new file mode 100644 index 000000000..c44228e89 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PassWordBadgesScene.java @@ -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 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 ) ); + } + } +} \ No newline at end of file diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PixelScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PixelScene.java index 20286c4db..b72425258 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PixelScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PixelScene.java @@ -23,8 +23,10 @@ package com.shatteredpixel.shatteredpixeldungeon.scenes; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Badges; +import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges; import com.shatteredpixel.shatteredpixeldungeon.SPDSettings; import com.shatteredpixel.shatteredpixeldungeon.effects.BadgeBanner; +import com.shatteredpixel.shatteredpixeldungeon.effects.PasswordBadgeBanner; import com.shatteredpixel.shatteredpixeldungeon.messages.Languages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; @@ -289,6 +291,31 @@ public class PixelScene extends Scene { 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 ) { Game.runOnRenderThread(new Callback() { @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/TitleScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/TitleScene.java index 1c624acb0..784bd82b1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/TitleScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/TitleScene.java @@ -202,6 +202,11 @@ public class TitleScene extends PixelScene { protected void onClick() { ShatteredPixelDungeon.switchNoFade(BadgesScene.class); } + @Override + protected boolean onLongClick() { + ShatteredPixelDungeon.switchNoFade(PassWordBadgesScene.class); + return super.onLongClick(); + } }; btnBadges.icon(new ItemSprite(ItemSpriteSheet.GREENBOOKS, null)); add(btnBadges); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/WelcomeScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/WelcomeScene.java index 5df10fe0b..515274d6e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/WelcomeScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/WelcomeScene.java @@ -70,8 +70,10 @@ public class WelcomeScene extends PixelScene { return; } - if (ShatteredPixelDungeon.versionCode == previousVersion && !SPDSettings.intro()) { + if (ShatteredPixelDungeon.versionCode == previousVersion && !SPDSettings.intro() && !SPDSettings.firebase()) { ShatteredPixelDungeon.switchNoFade(GameNewsScene.class); + } else { + ShatteredPixelDungeon.switchNoFade(TitleScene.class); return; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java index 36dbd7047..ae379e0c1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java @@ -712,6 +712,33 @@ public class ItemSpriteSheet { assignItemRect(RiceDumplingsBottle, 14, 14); } + //传奇武器 + private static final int LENGYWEAPONS = xy(1, 39); //16 slots + + public static final int MOONDAILY= LENGYWEAPONS+1; + + public static final int DCSURANG= LENGYWEAPONS+2; + + public static final int THEDIED= LENGYWEAPONS+3; + + public static final int CURSEDAXE= LENGYWEAPONS+4; + + public static final int EAGLEPOWER= LENGYWEAPONS+5; + + public static final int GOLDLANGGUN= LENGYWEAPONS+6; + + public static final int CLEARPRO= LENGYWEAPONS+7; + + public static final int FORESTCROSSBOW= LENGYWEAPONS+8; + + public static final int DIEDCROSSBOW = LENGYWEAPONS+9; + + public static final int DIEDBOOK= LENGYWEAPONS+10; + + static { + assignItemRect(DIEDCROSSBOW, 16, 15); + } + private static final int BAGS = xy(1, 31); //16 slots public static final int VIAL = BAGS+0; public static final int POUCH = BAGS+1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java index eb2710ee1..a5be52f13 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/mlpd/vM0_6_7_X_Changes.java @@ -119,7 +119,7 @@ public class vM0_6_7_X_Changes { } public static void add_v0_6_56_Changes( ArrayList changeInfos ) { - ChangeInfo changes = new ChangeInfo("Coming Soon V0.6.5.0", true, ""); + ChangeInfo changes = new ChangeInfo("Coming Soon V0.6.5.0-Alpha3", true, ""); changes.hardlight(Window.CBLACK); changeInfos.add(changes); @@ -140,6 +140,40 @@ public class vM0_6_7_X_Changes { i.scale.set(PixelScene.align(0.74f)); changes.addButton(new ChangeButton(i, ("熔岩火龙"), ("丛林暴乱的真相"))); + + changes = new ChangeInfo("v0.6.5.0-Alpha1-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.DIEDCROSSBOW), ("传奇武器"), + ("新类别传奇武器测试已经开始。在后续版本中需要通过货币解锁。"))); + + changes.addButton(new ChangeButton(Icons.get(Icons.BADGES), ("加密徽章"), + ("添加了加密徽章,长按徽章按钮进入。记录一些隐藏成就。\n\n_注意:_这些成就不会在获取之前不会显示出来"))); + + changes.addButton(new ChangeButton(Icons.get(Icons.PREFS), ("杂项改动"), + ("1.添加了暂停更新界面的功能\n\n" + + "2.少量bug修复"))); + + changes = new ChangeInfo("改动", false, null); + changes.hardlight(Window.CYELLOW); + changeInfos.add(changes); + + Image a = new SakaFishBossSprites(); + a.scale.set(PixelScene.align(0.72f)); + changes.addButton(new ChangeButton(a, "萨卡班甲鱼", + "数值方面进行了一定平衡。")); + + 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_06X83"))); + + changes.addButton(new ChangeButton(Icons.get(Icons.PREFS), ("杂项调整"), + ("1.书籍现在不可堆积,且成就有一些变化\n\n" + + "2.其它bug修复"))); } public static void add_v0_6_55_Changes( ArrayList changeInfos ) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndProBadge.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndProBadge.java new file mode 100644 index 000000000..8d0efb695 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndProBadge.java @@ -0,0 +1,74 @@ +/* + * 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 + */ + +package com.shatteredpixel.shatteredpixeldungeon.windows; + +import com.shatteredpixel.shatteredpixeldungeon.PaswordBadges; +import com.shatteredpixel.shatteredpixeldungeon.effects.PasswordBadgeBanner; +import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; +import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; +import com.shatteredpixel.shatteredpixeldungeon.ui.Window; +import com.watabou.noosa.Image; + +public class WndProBadge extends Window { + + private static final int WIDTH = 120; + private static final int MARGIN = 4; + + public WndProBadge(PaswordBadges.Badge badge) { + + super(); + + Image icon = PasswordBadgeBanner.image( badge.image ); + icon.scale.set( 2 ); + + add( icon ); + + RenderedTextBlock title = PixelScene.renderTextBlock( badge.title(), 9 ); + title.maxWidth(WIDTH - MARGIN * 2); + title.align(RenderedTextBlock.CENTER_ALIGN); + title.hardlight(TITLE_COLOR); + + add(title); + + String desc = badge.desc(); + + RenderedTextBlock info = PixelScene.renderTextBlock( desc, 6 ); + info.maxWidth(WIDTH - MARGIN * 2); + info.align(RenderedTextBlock.CENTER_ALIGN); + add(info); + + float w = Math.max( icon.width(), Math.max(title.width(), info.width()) ) + MARGIN * 2; + + icon.x = (w - icon.width()) / 2f; + icon.y = MARGIN; + PixelScene.align(icon); + + title.setPos((w - title.width()) / 2, icon.y + icon.height() + MARGIN); + PixelScene.align(title); + + info.setPos((w - info.width()) / 2, title.bottom() + MARGIN); + PixelScene.align(info); + resize( (int)w, (int)(info.bottom() + MARGIN) ); + + PasswordBadgeBanner.highlight( icon, badge.image ); + } +} \ No newline at end of file diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java index 27b440881..9cc76abf2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java @@ -910,27 +910,11 @@ public class WndSettings extends WndTabbed { add(chkWifi); } - chkFireBase = new CheckBox("firebase") { + chkFireBase = new CheckBox(Messages.get(this, "autoupdate")) { @Override protected void onClick() { super.onClick(); - if (checked()) { - checked(!checked()); - ShatteredPixelDungeon.scene().add(new WndOptions(Icons.get(Icons.DATA), - "firebase_active", - "firebase_desc", - "cancel") { - @Override - protected void onSelect(int index) { - if (index == 0) { - checked(!checked()); - SPDSettings.firebase(checked()); - } - } - }); - } else { - SPDSettings.firebase(checked()); - } + SPDSettings.firebase(checked()); } }; chkFireBase.checked( SPDSettings.firebase() ); @@ -949,14 +933,10 @@ public class WndSettings extends WndTabbed { chkNews.setRect(0, sep1.y + 1 + GAP, width/2-1, BTN_HEIGHT); //chkUpdates.setRect(chkNews.right() + GAP, chkNews.top(), width/2-1, BTN_HEIGHT); chkFireBase.setRect(chkNews.right() + GAP, chkNews.top(), width/2-1, BTN_HEIGHT); - chkFireBase.visible = false; - chkFireBase.active = false; pos = chkFireBase.bottom(); } else { chkNews.setRect(0, sep1.y + 1 + GAP, width, BTN_HEIGHT); chkFireBase.setRect(0, chkNews.bottom() + GAP, width, BTN_HEIGHT); - chkFireBase.visible = false; - chkFireBase.active = false; pos = chkNews.bottom(); } From d101c86c5f362c4ca23195c71c3d36e13da8f0be Mon Sep 17 00:00:00 2001 From: LingASDJ <2735951230@qq.com> Date: Fri, 22 Sep 2023 00:10:31 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BE=BD=E7=AB=A0?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E5=92=8C=E4=B8=80=E4=BA=9B=E5=85=B6=E4=BB=96?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shatteredpixeldungeon/Badges.java | 5 ++-- .../shatteredpixeldungeon/Challenges.java | 3 --- .../weapon/melee/legend/DiedCrossBow.java | 19 +++---------- .../items/weapon/missiles/darts/Dart.java | 3 +++ .../levels/LaveCavesBossLevel.java | 27 +++++++++++++++++++ .../levels/ZeroLevel.java | 12 +++++---- .../levels/rooms/special/CrystalPathRoom.java | 4 ++- 7 files changed, 46 insertions(+), 27 deletions(-) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/LaveCavesBossLevel.java diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java index 1a257dd24..1b9e98010 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java @@ -749,8 +749,9 @@ public class Badges { } public static void validateAMZ() { - if (global.contains( Badge.KILL_APPLE ) &&global.contains( Badge.KILL_DM720 ) && - global.contains( Badge.KILL_MG) && PaswordBadges.global.contains( PaswordBadges.Badge.FIREGIRL) && PaswordBadges.global.contains( PaswordBadges.Badge.DRAWF_HEAD) && PaswordBadges.global.contains( PaswordBadges.Badge.SAKA_DIED)) { + List passwordbadges = PaswordBadges.filtered( true ); + if (global.contains( Badge.KILL_APPLE ) && global.contains( Badge.KILL_DM720 ) && + global.contains( 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 ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Challenges.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Challenges.java index 8775d081a..c2f574fdd 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Challenges.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Challenges.java @@ -28,7 +28,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClassArmor; import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClothArmor; 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.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.InterlevelScene; @@ -86,8 +85,6 @@ public class Challenges { if (Dungeon.isChallenged(NO_FOOD)) { if (item instanceof SmallRation) { return true; - } else if (item instanceof HornOfPlenty) { - return true; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/legend/DiedCrossBow.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/legend/DiedCrossBow.java index 6c20afd1a..135f0fa4b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/legend/DiedCrossBow.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/legend/DiedCrossBow.java @@ -65,13 +65,8 @@ public class DiedCrossBow extends LegendWeapon { public String status() { //display the current cooldown - if (cooldown != 0) - return Messages.format( "CD:%d", cooldown ); - - - Dart missile = Dungeon.hero.belongings.getItem(Dart.class); - if(missile != null){ - return ""+missile.quantity()/5; + if (cooldown != 0){ + return Messages.format("CD:%d", cooldown); } else { return null; } @@ -83,20 +78,12 @@ public class DiedCrossBow extends LegendWeapon { public void execute(Hero hero, String action ) { super.execute( hero, action ); - Dart missile = Dungeon.hero.belongings.getItem(Dart.class); if (action.equals( AC_KING )) { if (!isEquipped(hero)){ GLog.i( Messages.get(this, "no_equip") ); } else if(cooldown == 0) { - if (missile != null) - if (missile.quantity() > 5) { - curUser = hero; - curItem = this; - GameScene.selectCell(bomb); - } else { - GLog.w(Messages.get(this, "no_king")); - } + GameScene.selectCell(bomb); } else { GLog.w(Messages.get(this, "no_cooldown")); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/Dart.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/Dart.java index 6aecfd739..864e6c2e6 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/Dart.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/Dart.java @@ -30,6 +30,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.bags.Bag; import com.shatteredpixel.shatteredpixeldungeon.items.bags.VelvetPouch; 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.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.plants.Plant; @@ -96,6 +97,8 @@ public class Dart extends MissileWeapon { } private static Crossbow bow; + + private static DiedCrossBow diedCrossBow; private void updateCrossbow(){ if (Dungeon.hero.belongings.weapon() instanceof Crossbow){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/LaveCavesBossLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/LaveCavesBossLevel.java new file mode 100644 index 000000000..c760ec50f --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/LaveCavesBossLevel.java @@ -0,0 +1,27 @@ +package com.shatteredpixel.shatteredpixeldungeon.levels; + +public class LaveCavesBossLevel extends Level{ + /** + * @return + */ + @Override + protected boolean build() { + return false; + } + + /** + * + */ + @Override + protected void createMobs() { + + } + + /** + * + */ + @Override + protected void createItems() { + + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ZeroLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ZeroLevel.java index 78d6bd2d4..10e76c8a3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ZeroLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/ZeroLevel.java @@ -25,6 +25,8 @@ import static com.shatteredpixel.shatteredpixeldungeon.items.Generator.randomArt import com.shatteredpixel.shatteredpixeldungeon.Assets; 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.npcs.NxhyNpc; @@ -35,7 +37,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Slyl; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.obSir; import com.shatteredpixel.shatteredpixeldungeon.items.Ankh; import com.shatteredpixel.shatteredpixeldungeon.items.Generator; -import com.shatteredpixel.shatteredpixeldungeon.items.Gold; import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Stylus; @@ -132,14 +133,15 @@ public class ZeroLevel extends Level { drop( ( Generator.randomUsingDefaults( Generator.Category.RING ) ), this.width * 17 + 18 ); } 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) ){ drop(( Generator.randomUsingDefaults( Generator.Category.WEP_T2 )), this.width * 18 + 17 ); } - if(passwordbadges.contains(PaswordBadges.Badge.EXSG)){ - drop(new Gold().quantity(720), this.width * 18 + 18 ); - } if ( Badges.isUnlocked(Badges.Badge.RLPT)){ Item item = randomArtifact(); drop(item, this.width * 18 + 19 ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/CrystalPathRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/CrystalPathRoom.java index aef0a21bf..2f3197816 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/CrystalPathRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/CrystalPathRoom.java @@ -21,6 +21,7 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special; +import com.shatteredpixel.shatteredpixeldungeon.Challenges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.Gold; @@ -150,7 +151,8 @@ public class CrystalPathRoom extends SpecialRoom { item = new LamellarArmor(); } else { item = Generator.random(Random.oneOf( - Generator.Category.ARMOR, + Dungeon.isChallenged(Challenges.NO_ARMOR) ? Generator.Category.WAND : + Generator.Category.ARMOR, Generator.Category.STONE, Generator.Category.WAND, Generator.Category.ARTIFACT)