<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<game format-version="2" db-system="sqlite" db-system-min-version="3.37.0">
    <head>
        <title>Eine miese Nacht</title>
        <teaser>Bitte beende es.

Nach einem Filmriss suchst du dein Portmonnaie. Eine miese Nacht nimmt ihren Lauf.</teaser>
        <copyright>Sami B.</copyright>
    </head>
    <scenes>
        <text-scene>
            <text>Du bist aufgewacht auf einer Toilette, du hast nichts in den Taschen und du weißt nicht mal mehr, was heute Abend passiert ist. Dein schwarzes Portmonnaie mit dem gelben Stern ist weg.</text>
        </text-scene>
        <text-scene>
            <text>Du musst dein Portmonnaie (keine Ahnung, wie man das schreibt) finden. Guck erstmal, wer alles im Club ist.

Die Datenbank bildet diese Geschichte ab. Mit `SELECT` liest du Hinweise und wählst Personen zum Ansprechen aus; mit `UPDATE` überträgst du Gegenstände. `Sichtungsort` und `Fundort` beschreiben Beobachtungen vom Beginn der Nacht und bleiben unverändert, auch wenn sich jemand später bewegt. `Besitzer` ist die `ID` aus `Leute` der Person, die einen Gegenstand gerade bei sich hat – nicht unbedingt die Person, der er gehört. `NULL` bedeutet hier: Niemand hat ihn bei sich. Du selbst stehst als „Du“ in `Leute`.</text>
        </text-scene>
        <select-scene is-row-order-relevant="false" is-col-order-relevant="false" are-col-names-relevant="false">
            <text>Schaue nach, wer im Club ist. Zeige alle Angaben zu den Personen, deren `Sichtungsort` „Club“ ist. Die Reihenfolge ist egal.</text>
            <sql-solution>SELECT * FROM Leute
WHERE Sichtungsort = 'Club';</sql-solution>
            <sql-placeholder></sql-placeholder>
            <hints>
                <expected-result-hint />
            </hints>
        </select-scene>
        <text-scene>
            <text>Der Barkeeper sieht vertrauenswürdig aus. Suche ihn auf, damit du ihn befragen kannst.</text>
        </text-scene>
        <select-scene is-row-order-relevant="false" is-col-order-relevant="false" are-col-names-relevant="false">
            <text>Suche den Barkeeper auf. Zeige alle Angaben zur Person mit dem `Beruf` „Barkeeper“.</text>
            <sql-solution>SELECT * FROM Leute
WHERE Beruf = 'Barkeeper';</sql-solution>
            <sql-placeholder></sql-placeholder>
            <hints>
                <expected-result-hint />
            </hints>
        </select-scene>
        <text-scene>
            <text>Hey Barkeeper, wo sind wir und was ist passiert?</text>
        </text-scene>
        <text-scene>
            <text>Barkeeper: Hast anscheinend gut geschlafen. Wir sind im Club dé Abstúrz und du hast ziemlich übertrieben.
Du hast zuvor mit komischen Gestalten abgehangen, die sind aber schon draußen. Vielleicht hat jemand am Eingang gesehen, wohin sie gegangen sind.</text>
        </text-scene>
        <text-scene>
            <text>Ok, vielen Dank. Dann schaue ich mal draußen nach.</text>
        </text-scene>
        <select-scene is-row-order-relevant="false" is-col-order-relevant="false" are-col-names-relevant="false">
            <text>(Du bist jetzt draußen)
Guck, wer alles draußen auf der Straße ist. Zeige alle Angaben zu den Personen, deren `Sichtungsort` zu Beginn der Nacht „Straße“ war. Die Reihenfolge ist egal.</text>
            <sql-solution>SELECT * FROM Leute
WHERE Sichtungsort = 'Straße';</sql-solution>
            <sql-placeholder></sql-placeholder>
            <hints>
                <expected-result-hint />
            </hints>
        </select-scene>
        <text-scene>
            <text>Hier draußen ist ja auch einiges los. Vielleicht hat der Obdachlose auf der Bank ja was gesehen. Er stellt sich als Manuel vor.</text>
        </text-scene>
        <select-scene is-row-order-relevant="false" is-col-order-relevant="false" are-col-names-relevant="false">
            <text>Suche den Obdachlosen auf. Zeige alle Angaben zu Manuel anhand seines Namens.</text>
            <sql-solution>SELECT * FROM Leute
WHERE Name = 'Manuel';</sql-solution>
            <sql-placeholder></sql-placeholder>
            <hints>
                <expected-result-hint />
            </hints>
        </select-scene>
        <text-scene>
            <text>Obdachloser: Guten Abend, min Jung. Hast du vielleicht etwas Kleingeld?</text>
        </text-scene>
        <text-scene>
            <text>Nein, tut mir leid, mein Portmonnaie ist weg und ich versuche herauszufinden, was passiert ist. Haben Sie zufällig `Leute` aus dem Club kommen sehen, die auffällig aussahen?</text>
        </text-scene>
        <text-scene>
            <text>Obdachloser: Hmm, vielleicht habe ich das ja.
Weißt du, ich bräuchte echt dringend eine Glasflasche, damit ich mir Trinken abfüllen könnte. Eine leere, saubere vom Straßenrand wäre gut. Die beschriftete gehört Norbert.</text>
        </text-scene>
        <text-scene>
            <text>Ok, ich weiß, was Sie wollen.
Vielleicht finde ich hier ja eine, die rumliegt.</text>
        </text-scene>
        <select-scene is-row-order-relevant="false" is-col-order-relevant="false" are-col-names-relevant="false">
            <text>Guck, ob hier eine Flasche rumliegt.
Diese sollte am besten niemandem gehören, damit es keinen Ärger gibt. Zeige alle Angaben zu Glasflaschen mit `Fundort` „Straße“, die niemand bei sich hat. Dafür muss `Besitzer` `NULL` sein; die Flasche im Club kommt nicht infrage.</text>
            <sql-solution>SELECT * FROM Gegenstände
WHERE Name = 'Glasflasche'
  AND Fundort = 'Straße'
  AND Besitzer IS NULL;</sql-solution>
            <sql-placeholder></sql-placeholder>
            <hints>
                <expected-result-hint />
                <text-hint>Prüfe fehlende `Besitzer` mit `IS NULL`, nicht mit `= NULL`. Verbinde die Bedingungen mit `AND`.</text-hint>
            </hints>
        </select-scene>
        <text-scene>
            <text>Perfekt, die nehme ich mal mit. Merke dir ihre Gegenstands-ID: Mehrere Gegenstände können denselben Namen haben.</text>
        </text-scene>
        <manipulate-scene>
            <text>Nimm nur die eben gefundene Flasche mit. Setze mit `UPDATE` ihren `Besitzer` auf deine Personen-ID 9. Begrenze die Änderung mit `WHERE` auf die `ID` dieser Flasche; alle anderen Gegenstände müssen unverändert bleiben.</text>
            <sql-solution>UPDATE Gegenstände
SET Besitzer = 9
WHERE ID = 5 AND Besitzer IS NULL;</sql-solution>
            <sql-check>SELECT * FROM Gegenstände;</sql-check>
            <sql-placeholder></sql-placeholder>
            <hints>
                <expected-result-hint />
                <text-hint>Das Gerüst lautet: `UPDATE Tabelle SET Spalte = Wert WHERE Bedingung;` In `SET` steht die Personen-ID, in `WHERE` die Gegenstands-ID.</text-hint>
            </hints>
        </manipulate-scene>
        <select-scene is-row-order-relevant="false" is-col-order-relevant="false" are-col-names-relevant="false">
            <text>Bring die Buddel mal dem Obdachlosen. Ermittle dafür zuerst nur Manuels `ID` aus `Leute` anhand seines Namens. Diese Personen-ID brauchst du für die Übergabe.</text>
            <sql-solution>SELECT ID FROM Leute
WHERE Name = 'Manuel';</sql-solution>
            <sql-placeholder></sql-placeholder>
            <hints>
                <expected-result-hint />
            </hints>
        </select-scene>
        <manipulate-scene>
            <text>So, hier ist die Flasche. Übergib Manuel die Flasche, die du gerade aufgenommen hast: Setze ihren `Besitzer` mit `UPDATE` auf seine ermittelte Personen-ID. Verwende wieder die Gegenstands-ID und ändere sonst nichts.</text>
            <sql-solution>UPDATE Gegenstände
SET Besitzer = 6
WHERE ID = 5 AND Besitzer = 9;</sql-solution>
            <sql-check>SELECT * FROM Gegenstände;</sql-check>
            <sql-placeholder></sql-placeholder>
            <hints>
                <expected-result-hint />
            </hints>
        </manipulate-scene>
        <text-scene>
            <text>Obdachloser: Vielen Dank. Weißt du, diese Mafiosos oder Gangster sind vorhin zügig in diese Richtung gelaufen, in die Seitengasse. Die beiden heißen Berndt und Peter. Einer hatte ein schwarzes Portmonnaie in der Hand.</text>
        </text-scene>
        <text-scene>
            <text>Du rennst in die Richtung, die vom Hobo beschrieben wurde, und du triffst bald auf 2 Gestalten. Einer hält ein schwarzes Portmonnaie mit einem gelben Stern. Das sieht genau aus wie deins.</text>
        </text-scene>
        <select-scene is-row-order-relevant="false" is-col-order-relevant="false" are-col-names-relevant="false">
            <text>Überprüfe sie. Zeige die `ID` und `Beschreibung` deines Portmonnaies sowie den Namen der Person, die es bei sich hat. Es heißt in `Gegenstände` „Portmonnaie“ und hat die Beschreibung „Schwarz mit gelbem Stern“. Verbinde `Gegenstände` und `Leute` mit `JOIN` über `Gegenstände.Besitzer = Leute.ID`.</text>
            <sql-solution>SELECT Gegenstände.ID, Gegenstände.Beschreibung, Leute.Name
FROM Gegenstände
JOIN Leute ON Gegenstände.Besitzer = Leute.ID
WHERE Gegenstände.Name = 'Portmonnaie'
  AND Gegenstände.Beschreibung = 'Schwarz mit gelbem Stern';</sql-solution>
            <sql-placeholder></sql-placeholder>
            <hints>
                <expected-result-hint />
                <text-hint>Die Verknüpfungsbedingung folgt auf `ON`. Beide Tabellen haben `ID` und `Name`; kennzeichne diese Spalten mit dem Tabellennamen.</text-hint>
            </hints>
        </select-scene>
        <text-scene>
            <text>Du hörst, wie sie darüber reden, dass sie dich abgezogen haben, und du entscheidest dich einzugreifen. Berndt hat dein Portmonnaie. Neben dir liegt ein Baseballschläger. In deiner Wut denkst du, es wäre besser, wenn du den mitnimmst.</text>
        </text-scene>
        <manipulate-scene>
            <text>Nimm den Baseballschläger mit. Setze seinen `Besitzer` mit `UPDATE` auf deine Personen-ID 9. Nutze `Name`, `Fundort` „Seitengasse“ und den bisherigen `Besitzer` `NULL`, um nur diesen Gegenstand zu ändern.</text>
            <sql-solution>UPDATE Gegenstände
SET Besitzer = 9
WHERE Name = 'Baseballschläger'
  AND Fundort = 'Seitengasse'
  AND Besitzer IS NULL;</sql-solution>
            <sql-check>SELECT * FROM Gegenstände;</sql-check>
            <sql-placeholder></sql-placeholder>
            <hints>
                <expected-result-hint />
            </hints>
        </manipulate-scene>
        <text-scene>
            <text>Du gehst auf sie zu und verlangst dein Portmonnaie.
ABER EINER ZIEHT EINE WAFFE UND ZIEHT SIE DIR ÜBER DIE SEMMEL!</text>
        </text-scene>
        <text-scene>
            <text>DU bist aufgewacht im Krankenhaus, ohne dein Portmonnaie und mit einer Beule.
Das Ende ist nicht immer gut.</text>
        </text-scene>
    </scenes>
    <initial-sql-script>PRAGMA foreign_keys = ON;
BEGIN TRANSACTION;
CREATE TABLE Orte (
    Name TEXT PRIMARY KEY NOT NULL
);
INSERT INTO Orte (Name) VALUES ('Club'), ('Straße'), ('Seitengasse');

CREATE TABLE Leute (
    ID INTEGER PRIMARY KEY,
    Name TEXT NOT NULL,
    Beruf TEXT,
    Geld INTEGER NOT NULL CHECK (typeof(Geld) = 'integer' AND Geld &gt;= 0),
    Sichtungsort TEXT NOT NULL REFERENCES Orte (Name)
);
INSERT INTO Leute (ID, Name, Beruf, Geld, Sichtungsort) VALUES
    (2, 'Berndt', NULL, 100, 'Straße'),
    (3, 'Robert', 'Türsteher', 21, 'Club'),
    (4, 'Norbert', 'Barkeeper', 0, 'Club'),
    (5, 'Peter', NULL, 100, 'Straße'),
    (6, 'Manuel', NULL, 0, 'Straße'),
    (7, 'Hendrok', 'Sachbearbeiter', 5600, 'Straße'),
    (8, 'Roman', 'Polizist', 0, 'Straße'),
    (9, 'Du', NULL, 0, 'Club');

CREATE TABLE Gegenstände (
    ID INTEGER PRIMARY KEY,
    Name TEXT NOT NULL,
    Beschreibung TEXT NOT NULL,
    Besitzer INTEGER REFERENCES Leute (ID),
    Fundort TEXT NOT NULL REFERENCES Orte (Name)
);
INSERT INTO Gegenstände (ID, Name, Beschreibung, Besitzer, Fundort) VALUES
    (1, 'Messer', 'Kleines Taschenmesser', NULL, 'Straße'),
    (2, 'Pistole', 'Dienstwaffe', 8, 'Straße'),
    (3, 'Gewehr', 'Gewehr mit Holzkolben', 2, 'Straße'),
    (4, 'Baseballschläger', 'Abgegriffener Holzschläger', NULL, 'Seitengasse'),
    (5, 'Glasflasche', 'Leer, sauber und unbeschriftet', NULL, 'Straße'),
    (6, 'Glasflasche', 'Mit Norberts Namen beschriftet', 4, 'Straße'),
    (7, 'Glasflasche', 'Leere Flasche neben der Tanzfläche', NULL, 'Club'),
    (8, 'Portmonnaie', 'Schwarz mit gelbem Stern', 2, 'Straße'),
    (9, 'Portmonnaie', 'Braun ohne Aufkleber', 7, 'Straße');
COMMIT;</initial-sql-script>
</game>
