diff --git a/README.md b/README.md index 7120e05..81e8539 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,6 @@ Nearby multiplayer needs two physical devices — the emulator has no real Bluet ├── fastlane/ # F-Droid store listing, screenshots and changelogs ├── fdroid/ # Build recipe for fdroiddata ├── gradle/ # Gradle wrapper -├── tools/ # Helper scripts (sound effect generation) ├── CHANGELOG.md # Per-version build dates, sizes and checksums (links to GitHub Releases) ├── LICENSE # GNU GPLv3 └── README.md diff --git a/app/src/main/java/cc/skysparkle/matewave/ui/screens/LicensesScreen.kt b/app/src/main/java/cc/skysparkle/matewave/ui/screens/LicensesScreen.kt index c466c32..2db17e9 100644 --- a/app/src/main/java/cc/skysparkle/matewave/ui/screens/LicensesScreen.kt +++ b/app/src/main/java/cc/skysparkle/matewave/ui/screens/LicensesScreen.kt @@ -102,11 +102,6 @@ private val DATA = listOf( ) private val ASSETS = listOf( - LicenseEntry( - "Misty forest scene with pine trees in haze", "Jean-Daniel Francoeur", null, "Pexels License", - "https://www.pexels.com/photo/misty-forest-scene-with-pine-trees-in-haze-31737036/", - R.string.licenses_note_photo - ), LicenseEntry( "Material Symbols", "Google", null, APACHE, "https://iconbuddy.com/material-symbols", R.string.licenses_note_icons diff --git a/app/src/main/java/cc/skysparkle/matewave/ui/screens/SettingsScreen.kt b/app/src/main/java/cc/skysparkle/matewave/ui/screens/SettingsScreen.kt index 9c4002f..64a24ca 100644 --- a/app/src/main/java/cc/skysparkle/matewave/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/cc/skysparkle/matewave/ui/screens/SettingsScreen.kt @@ -87,9 +87,7 @@ fun SettingsScreen( } val feedback = remember { cc.skysparkle.matewave.settings.FeedbackSettings(context) } - val appearance = remember { cc.skysparkle.matewave.settings.BoardAppearance(context) } var vibrationOn by remember { mutableStateOf(feedback.vibrationEnabled) } - var openingBarOn by remember { mutableStateOf(appearance.showOpening) } val radioState by SoundManager.radioState.collectAsState() GlassScaffold( @@ -145,12 +143,6 @@ fun SettingsScreen( chevron = true, onClick = onOpenAppearance ) - ListDivider() - ListRow( - title = stringResource(R.string.appearance_opening_in_game), - icon = R.drawable.ic_book, - trailing = { SettingSwitch(openingBarOn) { openingBarOn = it; appearance.showOpening = it } } - ) } SectionCaption(stringResource(R.string.settings_section_system)) @@ -240,12 +232,6 @@ fun SettingsScreen( subtitle = cc.skysparkle.matewave.settings.AppLinks.REPOSITORY_LABEL, onClick = { cc.skysparkle.matewave.settings.AppLinks.open(context, cc.skysparkle.matewave.settings.AppLinks.REPOSITORY) } ) - AboutRow( - iconRes = R.drawable.ic_policy, - title = stringResource(R.string.privacy_policy), - subtitle = "skysparkle.cc/privacy", - onClick = { cc.skysparkle.matewave.settings.AppLinks.open(context, cc.skysparkle.matewave.settings.AppLinks.PRIVACY_POLICY) } - ) } } } diff --git a/app/src/main/res/drawable-nodpi/bg_forest.jpg b/app/src/main/res/drawable-nodpi/bg_forest.jpg index ef998c1..07fa3ed 100644 Binary files a/app/src/main/res/drawable-nodpi/bg_forest.jpg and b/app/src/main/res/drawable-nodpi/bg_forest.jpg differ diff --git a/app/src/main/res/raw/sfx_capture.ogg b/app/src/main/res/raw/sfx_capture.ogg index 448ead0..55291f0 100644 Binary files a/app/src/main/res/raw/sfx_capture.ogg and b/app/src/main/res/raw/sfx_capture.ogg differ diff --git a/app/src/main/res/raw/sfx_move.ogg b/app/src/main/res/raw/sfx_move.ogg index 5cf599a..19d35fe 100644 Binary files a/app/src/main/res/raw/sfx_move.ogg and b/app/src/main/res/raw/sfx_move.ogg differ diff --git a/app/src/main/res/raw/sfx_select.ogg b/app/src/main/res/raw/sfx_select.ogg index 756b970..4263edf 100644 Binary files a/app/src/main/res/raw/sfx_select.ogg and b/app/src/main/res/raw/sfx_select.ogg differ diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index d4698ee..d7b5349 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -178,7 +178,6 @@ Öffentlich zugänglicher Internet-Stream der SRG SSR: ohne Werbung und ohne Moderation, durch Gebühren finanziert. Die Musik gehört dem Sender und den Rechteinhabern; die App spielt den Stream nur ab und speichert nichts. Das Jazzradio in den Einstellungen spielt nur Radio Swiss Jazz; ist einer der offiziellen Stream-Links nicht erreichbar, nutzt die App einen anderen. Materialien - Hintergrundfoto eines Waldes. Die Pexels-Lizenz erlaubt die freie Nutzung ohne Namensnennung – wir danken dem Fotografen trotzdem. Oberflächen-Symbole aus dem Set Material Symbols, bezogen über IconBuddy. Der Text der Apache-2.0-Lizenz steht unter „Bibliotheken“. Bilder der Schachfiguren. Die CC0-Lizenz verlangt keine Namensnennung, der Autor bittet aber um einen Link zu seiner Seite. App teilen diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index b8e5e40..39ce577 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -178,7 +178,6 @@ SRG SSR が公開しているインターネットストリームです。広告もナビゲーターもなく、受信料で運営されています。音楽の権利は放送局と権利者に帰属し、アプリは再生するだけで何も保存しません。 設定のジャズラジオは Radio Swiss Jazz だけを再生します。公式リンクのひとつがつながらないときは、別のリンクに切り替わります。 素材 - 背景の森の写真です。Pexels ライセンスでは表示なしで自由に使えますが、撮影者に感謝します。 インターフェースのアイコンは Material Symbols のもので、IconBuddy から入手しました。Apache 2.0 の全文は「ライブラリ」にあります。 チェスの駒の画像です。CC0 ライセンスでは表示義務はありませんが、作者は自身のページへのリンクを希望しています。 アプリを共有 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index c6bde9d..fe6890d 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -178,7 +178,6 @@ Viešai prieinama SRG SSR interneto transliacija: be reklamos ir be vedėjų, finansuojama iš licencijos mokesčių. Muzikos teisės priklauso transliuotojui ir teisių turėtojams; programa srautą tik groja ir nieko neišsaugo. Nustatymuose esantis džiazo radijas groja tik „Radio Swiss Jazz“; jei viena oficiali nuoroda nepasiekiama, programa naudoja kitą. Medžiaga - Miško nuotrauka fonui. „Pexels“ licencija leidžia laisvai naudoti be autoriaus nurodymo — fotografui vis tiek dėkojame. Sąsajos piktogramos iš rinkinio „Material Symbols“, gautos per „IconBuddy“. Apache 2.0 tekstas — skyriuje „Bibliotekos“. Šachmatų figūrų paveikslėliai. CC0 licencija nereikalauja nurodyti autorystės, tačiau autorius prašo nuorodos į jo puslapį. Dalytis programa diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index e71e321..95352e7 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -184,7 +184,6 @@ Общедоступный интернет-поток SRG SSR: без рекламы и без ведущих, финансируется лицензионными сборами. Права на музыку принадлежат вещателю и правообладателям; приложение только воспроизводит поток и ничего не сохраняет. Джаз-радио в настройках играет только Radio Swiss Jazz; если одна из его официальных ссылок недоступна, приложение берёт другую. Материалы - Фоновая фотография леса. Лицензия Pexels разрешает свободное использование без указания автора — мы всё равно благодарим фотографа. Значки интерфейса из набора Material Symbols, полученные через IconBuddy. Текст лицензии Apache 2.0 — в разделе «Библиотеки». Изображения шахматных фигур. Лицензия CC0 не требует указания авторства, но автор просит ссылку на его страницу. Поделиться приложением diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index c342523..a5fc48d 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -178,7 +178,6 @@ SRG SSR 公开提供的网络电台流:无广告、无主持人,由收视费资助。音乐版权归电台和权利人所有,应用只播放,不保存任何内容。 设置中的爵士电台只播放 Radio Swiss Jazz;其中一个官方地址不可用时,应用会改用另一个。 素材 - 背景森林照片。Pexels 许可证允许免费使用且无需署名,我们仍感谢摄影师。 界面图标来自 Material Symbols 图标集,通过 IconBuddy 获取。Apache 2.0 全文见“库”部分。 国际象棋棋子图片。CC0 许可证无需署名,但作者希望附上其主页链接。 分享应用 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cb6b2b2..1b93205 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -178,7 +178,6 @@ Publicly available internet stream from SRG SSR: no advertising and no presenters, funded by license fees. The music belongs to the broadcaster and rights holders; the app only plays the stream and stores nothing. The jazz radio in Settings plays only Radio Swiss Jazz; if one of its official stream links is unavailable, the app uses another. Assets - Background forest photo. The Pexels License allows free use without attribution — we thank the photographer anyway. Interface icons from the Material Symbols set, obtained via IconBuddy. The Apache 2.0 text is under Libraries. Chess piece images. The CC0 license does not require attribution, but the author asks for a link to their page. Share the app diff --git a/fdroid/cc.skysparkle.matewave.yml b/fdroid/cc.skysparkle.matewave.yml index e24c018..d9570e6 100644 --- a/fdroid/cc.skysparkle.matewave.yml +++ b/fdroid/cc.skysparkle.matewave.yml @@ -1,7 +1,3 @@ -AntiFeatures: - NonFreeAssets: - en-US: The forest background photo is under the Pexels License. - ru: Фоновая фотография леса распространяется по лицензии Pexels. Categories: - Games License: GPL-3.0-or-later diff --git a/tools/sfx/generate_sfx.py b/tools/sfx/generate_sfx.py deleted file mode 100644 index b7fc7cf..0000000 --- a/tools/sfx/generate_sfx.py +++ /dev/null @@ -1,121 +0,0 @@ -"""Synthesizes the board sound effects (CC0 1.0). - -Usage: - python3 generate_sfx.py OUT_DIR - for s in move capture select; do - ffmpeg -y -fflags +bitexact -i OUT_DIR/sfx_$s.wav -map_metadata -1 \ - -c:a libvorbis -q:a 5 ../../app/src/main/res/raw/sfx_$s.ogg - done -""" - -import sys -import wave -from pathlib import Path - -import numpy as np - -SR = 44100 - - -def modes(t, rng, specs): - out = np.zeros_like(t) - for freq, amp, tau in specs: - out += amp * np.sin(2 * np.pi * freq * t + rng.uniform(0, 2 * np.pi)) * np.exp(-t / tau) - return out - - -def band_noise(n, lo, hi, rng): - spectrum = np.fft.rfft(rng.standard_normal(n)) - freqs = np.fft.rfftfreq(n, 1 / SR) - spectrum[(freqs < lo) | (freqs > hi)] = 0 - x = np.fft.irfft(spectrum, n) - return x / np.max(np.abs(x)) - - -def hit(dur, specs, noise_band, noise_tau, noise_amp, rng): - n = int(SR * dur) - t = np.arange(n) / SR - x = modes(t, rng, specs) - x += noise_amp * band_noise(n, *noise_band, rng) * np.exp(-t / noise_tau) - return x * np.minimum(1.0, t / 0.0004) - - -def board_knock(dur, rng, scale=1.0): - return hit( - dur, - [ - (125 * scale, 0.45, 0.018), - (410 * scale, 1.00, 0.042), - (1130 * scale, 0.55, 0.024), - (2210 * scale, 0.30, 0.013), - (3050 * scale, 0.35, 0.007), - (4700 * scale, 0.15, 0.004), - ], - (1200, 8000), 0.0025, 0.55, rng, - ) - - -def piece_clack(dur, rng): - return hit( - dur, - [ - (1650, 0.40, 0.016), - (2450, 1.00, 0.012), - (3900, 0.60, 0.008), - (6100, 0.30, 0.004), - ], - (1800, 10000), 0.0018, 0.70, rng, - ) - - -def finish(x, rms_db, fade=0.012): - n = int(SR * fade) - x = x.copy() - x[-n:] *= np.linspace(1, 0, n) - x *= 10 ** (rms_db / 20) / np.sqrt(np.mean(x ** 2)) - peak = np.max(np.abs(x)) - return x if peak <= 0.94 else x * 0.94 / peak - - -def move(rng): - return finish(board_knock(0.20, rng), -24.0) - - -def capture(rng): - total = int(SR * 0.30) - x = np.zeros(total) - clack = piece_clack(0.10, rng) * 0.85 - x[: len(clack)] += clack - start = int(SR * 0.030) - knock = board_knock(0.30 - 0.030, rng, scale=0.94) - x[start:start + len(knock)] += knock - return finish(x, -25.0) - - -def select(rng): - x = hit( - 0.10, - [(1850, 0.60, 0.007), (3300, 1.00, 0.005), (5200, 0.35, 0.003)], - (2500, 9000), 0.0012, 0.45, rng, - ) - return finish(x, -27.0, fade=0.008) - - -def write_wav(path, x): - pcm = np.clip(np.round(x * 32767), -32768, 32767).astype("