Replace background and sound effects with own artwork
The Pexels forest photo is replaced by the author's own background, so its credit is dropped from the Licenses screen (all six locales) and the NonFreeAssets anti-feature is removed from the F-Droid recipe. Sound effects are replaced as well, and the old generator script in tools/ is removed. Settings no longer duplicates the opening-bar switch, which lives in Appearance. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015g6ECVSKcBG8CJPrqC3G5o
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) }
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 228 KiB After Width: | Height: | Size: 61 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -178,7 +178,6 @@
|
||||
<string name="licenses_note_swissjazz">Ö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.</string>
|
||||
<string name="licenses_radio_hint">Das Jazzradio in den Einstellungen spielt nur Radio Swiss Jazz; ist einer der offiziellen Stream-Links nicht erreichbar, nutzt die App einen anderen.</string>
|
||||
<string name="licenses_group_assets">Materialien</string>
|
||||
<string name="licenses_note_photo">Hintergrundfoto eines Waldes. Die Pexels-Lizenz erlaubt die freie Nutzung ohne Namensnennung – wir danken dem Fotografen trotzdem.</string>
|
||||
<string name="licenses_note_icons">Oberflächen-Symbole aus dem Set Material Symbols, bezogen über IconBuddy. Der Text der Apache-2.0-Lizenz steht unter „Bibliotheken“.</string>
|
||||
<string name="licenses_note_pieces">Bilder der Schachfiguren. Die CC0-Lizenz verlangt keine Namensnennung, der Autor bittet aber um einen Link zu seiner Seite.</string>
|
||||
<string name="share_row_title">App teilen</string>
|
||||
|
||||
@@ -178,7 +178,6 @@
|
||||
<string name="licenses_note_swissjazz">SRG SSR が公開しているインターネットストリームです。広告もナビゲーターもなく、受信料で運営されています。音楽の権利は放送局と権利者に帰属し、アプリは再生するだけで何も保存しません。</string>
|
||||
<string name="licenses_radio_hint">設定のジャズラジオは Radio Swiss Jazz だけを再生します。公式リンクのひとつがつながらないときは、別のリンクに切り替わります。</string>
|
||||
<string name="licenses_group_assets">素材</string>
|
||||
<string name="licenses_note_photo">背景の森の写真です。Pexels ライセンスでは表示なしで自由に使えますが、撮影者に感謝します。</string>
|
||||
<string name="licenses_note_icons">インターフェースのアイコンは Material Symbols のもので、IconBuddy から入手しました。Apache 2.0 の全文は「ライブラリ」にあります。</string>
|
||||
<string name="licenses_note_pieces">チェスの駒の画像です。CC0 ライセンスでは表示義務はありませんが、作者は自身のページへのリンクを希望しています。</string>
|
||||
<string name="share_row_title">アプリを共有</string>
|
||||
|
||||
@@ -178,7 +178,6 @@
|
||||
<string name="licenses_note_swissjazz">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.</string>
|
||||
<string name="licenses_radio_hint">Nustatymuose esantis džiazo radijas groja tik „Radio Swiss Jazz“; jei viena oficiali nuoroda nepasiekiama, programa naudoja kitą.</string>
|
||||
<string name="licenses_group_assets">Medžiaga</string>
|
||||
<string name="licenses_note_photo">Miško nuotrauka fonui. „Pexels“ licencija leidžia laisvai naudoti be autoriaus nurodymo — fotografui vis tiek dėkojame.</string>
|
||||
<string name="licenses_note_icons">Sąsajos piktogramos iš rinkinio „Material Symbols“, gautos per „IconBuddy“. Apache 2.0 tekstas — skyriuje „Bibliotekos“.</string>
|
||||
<string name="licenses_note_pieces">Šachmatų figūrų paveikslėliai. CC0 licencija nereikalauja nurodyti autorystės, tačiau autorius prašo nuorodos į jo puslapį.</string>
|
||||
<string name="share_row_title">Dalytis programa</string>
|
||||
|
||||
@@ -184,7 +184,6 @@
|
||||
<string name="licenses_note_swissjazz">Общедоступный интернет-поток SRG SSR: без рекламы и без ведущих, финансируется лицензионными сборами. Права на музыку принадлежат вещателю и правообладателям; приложение только воспроизводит поток и ничего не сохраняет.</string>
|
||||
<string name="licenses_radio_hint">Джаз-радио в настройках играет только Radio Swiss Jazz; если одна из его официальных ссылок недоступна, приложение берёт другую.</string>
|
||||
<string name="licenses_group_assets">Материалы</string>
|
||||
<string name="licenses_note_photo">Фоновая фотография леса. Лицензия Pexels разрешает свободное использование без указания автора — мы всё равно благодарим фотографа.</string>
|
||||
<string name="licenses_note_icons">Значки интерфейса из набора Material Symbols, полученные через IconBuddy. Текст лицензии Apache 2.0 — в разделе «Библиотеки».</string>
|
||||
<string name="licenses_note_pieces">Изображения шахматных фигур. Лицензия CC0 не требует указания авторства, но автор просит ссылку на его страницу.</string>
|
||||
<string name="share_row_title">Поделиться приложением</string>
|
||||
|
||||
@@ -178,7 +178,6 @@
|
||||
<string name="licenses_note_swissjazz">SRG SSR 公开提供的网络电台流:无广告、无主持人,由收视费资助。音乐版权归电台和权利人所有,应用只播放,不保存任何内容。</string>
|
||||
<string name="licenses_radio_hint">设置中的爵士电台只播放 Radio Swiss Jazz;其中一个官方地址不可用时,应用会改用另一个。</string>
|
||||
<string name="licenses_group_assets">素材</string>
|
||||
<string name="licenses_note_photo">背景森林照片。Pexels 许可证允许免费使用且无需署名,我们仍感谢摄影师。</string>
|
||||
<string name="licenses_note_icons">界面图标来自 Material Symbols 图标集,通过 IconBuddy 获取。Apache 2.0 全文见“库”部分。</string>
|
||||
<string name="licenses_note_pieces">国际象棋棋子图片。CC0 许可证无需署名,但作者希望附上其主页链接。</string>
|
||||
<string name="share_row_title">分享应用</string>
|
||||
|
||||
@@ -178,7 +178,6 @@
|
||||
<string name="licenses_note_swissjazz">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.</string>
|
||||
<string name="licenses_radio_hint">The jazz radio in Settings plays only Radio Swiss Jazz; if one of its official stream links is unavailable, the app uses another.</string>
|
||||
<string name="licenses_group_assets">Assets</string>
|
||||
<string name="licenses_note_photo">Background forest photo. The Pexels License allows free use without attribution — we thank the photographer anyway.</string>
|
||||
<string name="licenses_note_icons">Interface icons from the Material Symbols set, obtained via IconBuddy. The Apache 2.0 text is under Libraries.</string>
|
||||
<string name="licenses_note_pieces">Chess piece images. The CC0 license does not require attribution, but the author asks for a link to their page.</string>
|
||||
<string name="share_row_title">Share the app</string>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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("<i2")
|
||||
with wave.open(str(path), "wb") as w:
|
||||
w.setnchannels(1)
|
||||
w.setsampwidth(2)
|
||||
w.setframerate(SR)
|
||||
w.writeframes(pcm.tobytes())
|
||||
|
||||
|
||||
def main():
|
||||
out = Path(sys.argv[1])
|
||||
out.mkdir(parents=True, exist_ok=True)
|
||||
for seed, (name, make) in enumerate([("move", move), ("capture", capture), ("select", select)]):
|
||||
write_wav(out / f"sfx_{name}.wav", make(np.random.default_rng(seed + 1)))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user