Adding a help button

This commit is contained in:
ml
2026-06-14 08:33:29 +02:00
parent e2cbf2b37d
commit 285c5984ac
4 changed files with 240 additions and 0 deletions
@@ -0,0 +1,99 @@
ÜBER DIE APP
────────────
Diese App führt die klassische deutsche C64-Rollenspielreihe Schwert und
Magie über den VICE-C64-Emulator aus. Eine gekoppelte Pebble-Watch-App
kann den Spielbildschirm anzeigen und Tastendrücke per Bluetooth übertragen.
MENÜ ☰
───────
Öffnet das linke Seitenmenü zur Verwaltung von Disketten und Einstellungen.
SPIELFOLGEN (DISKETTEN)
───────────────────────
Auf eine Folge tippen, um das Spiel zu laden und automatisch zu starten.
Der C64 wird zurückgesetzt und startet direkt in die gewählte Episode.
B-Seiten (Folge 2, 4, 6, 8) sind erst verfügbar, nachdem die zugehörige
A-Seite in dieser Sitzung mindestens einmal gespielt wurde.
HELDENDISKETTEN
───────────────
Persönliche Speicherdisketten, die ohne Maschinenneustart gewechselt werden.
Mit „Neu" eine leere Heldendiskette erstellen. Die Heldendiskette speichert
den Charakter über alle acht Folgen hinweg — gut aufbewahren!
RESET
─────
Wirft die aktuelle Diskette aus und setzt den C64 kalt auf den BASIC-Prompt
zurück. Nach einem Reset starten Spieldisketten beim nächsten Antippen
wieder automatisch.
TON
───
Schaltet die SID-Audioausgabe ein oder aus. Standardmäßig deaktiviert.
DISKETTEN IMPORTIEREN
─────────────────────
Importiert .D64-Disk-Images aus dem Gerätespeicher. Alle vier Images
(SCHWUM1SCHWUM4) müssen importiert werden, bevor die Folgen verfügbar sind.
BILDSCHIRMTASTATUR
──────────────────
Einmal auf SHF tippen, um die Umschalttaste dauerhaft zu aktivieren (Taste
leuchtet auf). Erneut auf SHF tippen zum Deaktivieren. Alle anderen Tasten
reagieren normal auf Berühren und Loslassen.
ARBEITSABLAUF
─────────────
1. .D64-Disk-Images über „Disketten importieren" laden
2. Eine Spieldiskette antippen — das Spiel startet automatisch
3. Wenn das Spiel nach der Heldendiskette fragt, im Menü eine Held-
Diskette auswählen (Heißtausch, kein Reset)
4. Nach Abschluss die Spieldiskette im Menü wieder einlegen
(ebenfalls Heißtausch)
5. Reset nur verwenden, wenn ein vollständiger Neustart nötig ist
────────────────────────────────────────────────────────────────────────────
SCHWERT UND MAGIE — GESCHICHTE
───────────────────────────────
Schwert und Magie ist eine Reihe von acht Rollenspielen, die von der
German Design Group (GDG) entwickelt und zwischen 1989 und 1992 von
CP Verlag für den Commodore 64 veröffentlicht wurde.
In einer mittelalterlichen Fantasiewelt folgt die Reihe einem Helden,
dessen Fortschritt auf einer persönlichen Diskette gespeichert und über
alle acht Folgen mitgeführt wird. Je zwei Episoden befinden sich auf einer
doppelseitigen Diskette: die A-Seite startet die erste, die B-Seite die
zweite Episode.
Die Spiele zeichneten sich durch aufwendige Grafiken, atmosphärische
SID-Musik und eine persistente gemeinsame Spielwelt aus — zur damaligen
Zeit eine Besonderheit auf Heimcomputern. Ein einziger Held konnte mit
allen erworbenen Fähigkeiten und Ausrüstungsgegenständen nahtlos von
Episode zu Episode übertragen werden, was der Reihe den Charakter einer
durchgehenden Kampagne gab.
Die Serie wurde zu einem geliebten Klassiker in der deutschsprachigen
C64-Gemeinschaft und gilt als Meilenstein der frühen deutschen
Spieleentwicklung.
Die acht Folgen:
1. Das geheimnisvolle Kraut
2. Der unheimliche Tempel
3. Das Piratenhaus
4. Die Burg des Magiers
5. Das Haus des Vampirs
6. Der Turm des Todes
7. Unter Wasser
8. Insel der Wunder
@@ -0,0 +1,95 @@
ABOUT
─────
This app runs the classic German C64 RPG series Schwert und Magie through
the VICE C64 emulator. A paired Pebble watchapp can display the game screen
and relay button presses over Bluetooth.
DRAWER ☰
─────────
Open the left drawer to manage disks and settings.
EPISODE DISKS (DISKETTEN)
─────────────────────────
Tap an episode to load and autostart the game. The C64 resets and boots
directly into the selected episode. B-side episodes (Folge 2, 4, 6, 8) are
only available after their A-side has been played at least once in this
session.
HERO DISKS (HELDEN-DISKETTEN)
──────────────────────────────
Personal save disks that are hot-swapped without resetting the machine.
Tap "Neu" to create a blank hero disk. Your hero disk stores your character
across all eight episodes — keep it safe.
RESET
─────
Ejects the current disk and power-cycles the C64 to the BASIC prompt.
After a reset, episode disks autostart again when tapped.
SOUND
─────
Toggles SID audio output. Off by default.
IMPORT DISKS
────────────
Import .D64 disk image files from device storage. All four disk images
(SCHWUM1SCHWUM4) must be imported before their episodes become available.
VIRTUAL KEYBOARD
────────────────
Tap SHF once to lock Shift on (the key stays highlighted). Tap SHF again
to release. All other keys fire on touch and release normally.
WORKFLOW
────────
1. Import your .D64 disk images via Import Disks
2. Tap an episode disk — the game autostarts
3. When the game asks for your hero disk, open the drawer and select a
Held disk (hot-swap, no reset)
4. When done with the hero disk, swap back to the episode disk from the
drawer (also a hot-swap)
5. Use Reset only when you need a clean cold start
────────────────────────────────────────────────────────────────────────────
SCHWERT UND MAGIE — HISTORY
────────────────────────────
Schwert und Magie (Sword and Magic) is a series of eight role-playing games
developed by German Design Group (GDG) and published by CP Verlag between
1989 and 1992 for the Commodore 64.
Set in a medieval fantasy world, the series follows a hero whose progress
is saved on a personal floppy disk and carried across all eight episodes.
Each pair of episodes ships on one double-sided disk, with the A-side
launching the first episode and the B-side continuing the story.
The games were notable for their richly drawn graphics, atmospheric SID
music, and a persistent shared world — a rarity on home computers of the
era. A single hero character, with all earned skills and equipment, could
be transferred seamlessly from one episode to the next, giving the series
the feel of a continuous campaign rather than isolated adventures.
The series became a beloved classic in the German-speaking C64 community
and stands as a landmark of early German game development, remembered
fondly alongside other GDG titles for its ambition and production quality.
The eight episodes:
1. Das geheimnisvolle Kraut (The Mysterious Herb)
2. Der unheimliche Tempel (The Eerie Temple)
3. Das Piratenhaus (The Pirate House)
4. Die Burg des Magiers (The Wizard's Castle)
5. Das Haus des Vampirs (The House of the Vampire)
6. Der Turm des Todes (The Tower of Death)
7. Unter Wasser (Underwater)
8. Insel der Wunder (Island of Wonders)
@@ -147,6 +147,8 @@ class MainActivity : AppCompatActivity() {
drawerLayout.openDrawer(GravityCompat.START) drawerLayout.openDrawer(GravityCompat.START)
} }
findViewById<Button>(R.id.btn_help).setOnClickListener { showHelp() }
findViewById<Button>(R.id.btn_import_disks).setOnClickListener { findViewById<Button>(R.id.btn_import_disks).setOnClickListener {
launchPicker(diskPickerLauncher, "Select SCHWUM disk images", multiSelect = true) launchPicker(diskPickerLauncher, "Select SCHWUM disk images", multiSelect = true)
} }
@@ -458,6 +460,40 @@ class MainActivity : AppCompatActivity() {
// ---- helpers ------------------------------------------------------------ // ---- helpers ------------------------------------------------------------
private fun showHelp() {
fun load(german: Boolean) = try {
assets.open(if (german) "help_de.md" else "help_en.md").bufferedReader().readText()
} catch (e: Exception) { "Help text unavailable." }
var german = true
val tv = android.widget.TextView(this).apply {
text = load(true)
typeface = android.graphics.Typeface.MONOSPACE
textSize = 12f
setTextColor(Color.parseColor("#DDDDDD"))
val p = (16 * resources.displayMetrics.density).toInt()
setPadding(p, p, p, p)
}
val scroll = android.widget.ScrollView(this).apply {
addView(tv)
setBackgroundColor(Color.parseColor("#1A1A2E"))
}
val dialog = AlertDialog.Builder(this)
.setTitle("Schwert und Magie auf Pebble")
.setView(scroll)
.setPositiveButton("OK", null)
.setNeutralButton("English", null)
.show()
dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener {
german = !german
tv.text = load(german)
scroll.scrollTo(0, 0)
(it as android.widget.Button).text = if (german) "English" else "Deutsch"
}
}
private fun appendLog(entry: String) { private fun appendLog(entry: String) {
val ts = timeFormat.format(Date()) val ts = timeFormat.format(Date())
tvLog.text = "[$ts] $entry\n${tvLog.text}" tvLog.text = "[$ts] $entry\n${tvLog.text}"
@@ -50,6 +50,16 @@
android:layout_width="12dp" android:layout_width="12dp"
android:layout_height="12dp" android:layout_height="12dp"
android:layout_marginEnd="4dp" /> android:layout_marginEnd="4dp" />
<Button
android:id="@+id/btn_help"
style="?attr/materialButtonOutlinedStyle"
android:layout_width="36dp"
android:layout_height="36dp"
android:minWidth="0dp"
android:padding="0dp"
android:text="?"
android:textSize="16sp" />
</LinearLayout> </LinearLayout>
<!-- C64 display (320×200, scaled with correct aspect ratio) --> <!-- C64 display (320×200, scaled with correct aspect ratio) -->