Wechsel im Kontext: blank the article, make the verb decide, add the rule

The level showed the article already in the sentence ("unter dem Stuhl"),
so it was answerable by recognising "dem" — it never tested wohin/wo at
all. And the frame pool was tiny: one cat, one lamp, eight nouns.

- The article is now blanked. The only evidence is the verb and whether it
  has a direct object, which is the actual skill. The solved sentence is
  revealed on answer, contracted where German really contracts (ins Regal,
  am Bahnhof), with a note naming the fusion.
- Frames rebuilt around what decides the case: 27 new nouns, 18 new verbs,
  and every frame one-way so no verb+noun pairing licenses both readings.
- Motion verbs now appear on the DATIVE side on purpose — schwimmen im See,
  tanzen in der Kueche, spielen auf der Strasse — because "is it moving?" is
  the wrong test and that is the main thing learners get wrong.
- The put/be pairs are drilled properly: legen/liegen, stellen/stehen,
  setzen/sitzen, plus haengen and stecken, which keep the same present tense
  either way so only the direct object tells you.
- ankommen added as the lexical exception: Dativ despite obvious arrival.
- New "Wohin oder wo?" info panel: the rule, the before-and-after test, the
  movement trap, the verb-pair table and the exception. Reachable from the
  practice screen, from the answer feedback, and from Charts.
- Feedback now explains the specific sentence rather than restating theory.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Uza6mhTpAvSwMQuFc4Cz8
This commit is contained in:
2026-09-17 06:55:26 +00:00
co-authored by Claude Opus 5
parent f39db3cb86
commit 047454f23f
3 changed files with 418 additions and 67 deletions
+178 -32
View File
@@ -134,6 +134,33 @@ export const NOUNS = [
{w:'Wetter',g:'neuter',en:'weather',gen:'Wetters',noIndef:true},
{w:'Dach',g:'neuter',en:'roof',gen:'Daches'},
{w:'Konzert',g:'neuter',en:'concert',gen:'Konzerts'},
{w:'See',g:'masculine',en:'lake',gen:'Sees'},
{w:'Fluss',g:'masculine',en:'river',gen:'Flusses'},
{w:'Berg',g:'masculine',en:'mountain',gen:'Berges'},
{w:'Wald',g:'masculine',en:'forest',gen:'Waldes'},
{w:'Bahnhof',g:'masculine',en:'station',gen:'Bahnhofs'},
{w:'Flughafen',g:'masculine',en:'airport',gen:'Flughafens'},
{w:'Schrank',g:'masculine',en:'cupboard',gen:'Schranks'},
{w:'Boden',g:'masculine',en:'floor',gen:'Bodens'},
{w:'Supermarkt',g:'masculine',en:'supermarket',gen:'Supermarkts'},
{w:'Keller',g:'masculine',en:'cellar',gen:'Kellers'},
{w:'Wand',g:'feminine',en:'wall'},
{w:'Küche',g:'feminine',en:'kitchen'},
{w:'Wohnung',g:'feminine',en:'flat'},
{w:'Tafel',g:'feminine',en:'blackboard'},
{w:'Wiese',g:'feminine',en:'meadow'},
{w:'Tasche',g:'feminine',en:'bag'},
{w:'Kirche',g:'feminine',en:'church'},
{w:'Bibliothek',g:'feminine',en:'library'},
{w:'Bank',g:'feminine',en:'bench'},
{w:'Bett',g:'neuter',en:'bed',gen:'Bettes'},
{w:'Zimmer',g:'neuter',en:'room',gen:'Zimmers'},
{w:'Regal',g:'neuter',en:'shelf',gen:'Regals'},
{w:'Sofa',g:'neuter',en:'sofa',gen:'Sofas'},
{w:'Meer',g:'neuter',en:'sea',gen:'Meeres'},
{w:'Dorf',g:'neuter',en:'village',gen:'Dorfes'},
{w:'Bild',g:'neuter',en:'picture',gen:'Bildes'},
{w:'Wasser',g:'neuter',en:'water',gen:'Wassers',noIndef:true},
];
const NOUN_BY_NAME = Object.fromEntries(NOUNS.map(n => [n.w, n]));
export const nounForm = (noun, cas) =>
@@ -146,6 +173,7 @@ const PLACES_IN = ['Park','Garten','Schule','Stadt','Haus','Hotel','Museum','Bü
const POSSESSABLE = new Set([
...PERSONS, 'Hund','Katze','Haus','Garten','Auto','Buch','Tisch','Stuhl',
'Büro','Schule','Stadt','Fenster','Tür','Musik',
'Wohnung','Zimmer','Küche','Tasche','Bett','Sofa','Schrank','Regal','Wand','Bild',
]);
export const PRONOUNS = [
@@ -204,6 +232,24 @@ export const VERBS = {
hängen: {de:{Er:'hängt',Sie:'hängt',Wir:'hängen',Ich:'hänge'}, en:{Er:'hangs',Sie:'hangs',Wir:'hang',Ich:'hang'}},
legen: {de:{Er:'legt',Sie:'legt',Wir:'legen',Ich:'lege'}, en:{Er:'puts',Sie:'puts',Wir:'put',Ich:'put'}},
stellen: {de:{Er:'stellt',Sie:'stellt',Wir:'stellen',Ich:'stelle'}, en:{Er:'puts',Sie:'puts',Wir:'put',Ich:'put'}},
rennen: {de:{Er:'rennt',Sie:'rennt',Wir:'rennen',Ich:'renne'}, en:{Er:'runs',Sie:'runs',Wir:'run',Ich:'run'}},
klettern:{de:{Er:'klettert',Sie:'klettert',Wir:'klettern',Ich:'klettere'}, en:{Er:'climbs',Sie:'climbs',Wir:'climb',Ich:'climb'}},
fliegen: {de:{Er:'fliegt',Sie:'fliegt',Wir:'fliegen',Ich:'fliege'}, en:{Er:'flies',Sie:'flies',Wir:'fly',Ich:'fly'}},
schwimmen:{de:{Er:'schwimmt',Sie:'schwimmt',Wir:'schwimmen',Ich:'schwimme'}, en:{Er:'swims',Sie:'swims',Wir:'swim',Ich:'swim'}},
steigen: {de:{Er:'steigt',Sie:'steigt',Wir:'steigen',Ich:'steige'}, en:{Er:'climbs',Sie:'climbs',Wir:'climb',Ich:'climb'}},
werfen: {de:{Er:'wirft',Sie:'wirft',Wir:'werfen',Ich:'werfe'}, en:{Er:'throws',Sie:'throws',Wir:'throw',Ich:'throw'}},
stecken: {de:{Er:'steckt',Sie:'steckt',Wir:'stecken',Ich:'stecke'}, en:{Er:'puts',Sie:'puts',Wir:'put',Ich:'put'}},
setzen: {de:{Er:'setzt',Sie:'setzt',Wir:'setzen',Ich:'setze'}, en:{Er:'sits',Sie:'sits',Wir:'sit',Ich:'sit'}},
kleben: {de:{Er:'klebt',Sie:'klebt',Wir:'kleben',Ich:'klebe'}, en:{Er:'sticks',Sie:'sticks',Wir:'stick',Ich:'stick'}},
schreiben:{de:{Er:'schreibt',Sie:'schreibt',Wir:'schreiben',Ich:'schreibe'}, en:{Er:'writes',Sie:'writes',Wir:'write',Ich:'write'}},
fallen: {de:{Er:'fällt',Sie:'fällt',Wir:'fallen',Ich:'falle'}, en:{Er:'falls',Sie:'falls',Wir:'fall',Ich:'fall'}},
ziehen: {de:{Er:'zieht',Sie:'zieht',Wir:'ziehen',Ich:'ziehe'}, en:{Er:'moves',Sie:'moves',Wir:'move',Ich:'move'}},
tragen: {de:{Er:'trägt',Sie:'trägt',Wir:'tragen',Ich:'trage'}, en:{Er:'carries',Sie:'carries',Wir:'carry',Ich:'carry'}},
schieben:{de:{Er:'schiebt',Sie:'schiebt',Wir:'schieben',Ich:'schiebe'}, en:{Er:'pushes',Sie:'pushes',Wir:'push',Ich:'push'}},
packen: {de:{Er:'packt',Sie:'packt',Wir:'packen',Ich:'packe'}, en:{Er:'packs',Sie:'packs',Wir:'pack',Ich:'pack'}},
tanzen: {de:{Er:'tanzt',Sie:'tanzt',Wir:'tanzen',Ich:'tanze'}, en:{Er:'is dancing',Sie:'is dancing',Wir:'are dancing',Ich:'am dancing'}},
leben: {de:{Er:'lebt',Sie:'lebt',Wir:'leben',Ich:'lebe'}, en:{Er:'lives',Sie:'lives',Wir:'live',Ich:'live'}},
ankommen:{de:{Er:'kommt',Sie:'kommt',Wir:'kommen',Ich:'komme'}, en:{Er:'arrives',Sie:'arrives',Wir:'arrive',Ich:'arrive'}},
};
export const SUBJ_EN = {Er:'He',Sie:'She',Wir:'We',Ich:'I'};
@@ -307,6 +353,8 @@ export const WECHSEL_SET = new Set(PREPS_BY_CASE.wechsel);
// poss — false: skip this frame for possessive questions
// Wechsel preps use {motion:[...], location:[...]} instead of a flat list.
// ═══════════════════════════════════════════
const ZW_POST = {accusative:' und das Fenster', dative:' und dem Fenster', en:' and the window'};
export const PREP_FRAMES = {
durch: [{verbs:['gehen','laufen','fahren'], nouns:['Park','Stadt','Straße','Garten','Tür']}],
für: [{verbs:['kaufen'], mid:{de:'das Geschenk',en:'the gift'}, nouns:[...PERSONS,'Hund','Katze']}],
@@ -338,69 +386,158 @@ export const PREP_FRAMES = {
außerhalb: [{verbs:['wohnen','arbeiten'], nouns:['Stadt']}],
innerhalb: [{verbs:['wohnen','arbeiten'], nouns:['Stadt']}],
// ── Wechselpräpositionen ────────────────────────────────────
// Split by what DECIDES the case, not by "is there movement?".
// motion → the phrase is the goal: the thing wasn't there, now it is.
// location → the phrase is the arena: the thing was already there.
// Motion verbs deliberately appear on the DATIVE side too (schwimmen im See,
// tanzen in der Küche, spielen auf der Straße) — that is the whole lesson.
// Every frame is one-way: no verb+noun pairing may license both readings,
// because level 18 blanks the article and the learner has only the verb.
an: {
motion: [{verbs:['gehen','laufen'], nouns:['Tür','Fenster']}],
location:[{verbs:['stehen','warten','sitzen'], nouns:['Tür','Fenster']}],
motion: [
{verbs:['gehen','laufen'], nouns:['Tür','Fenster','Tafel']},
{verbs:['hängen'], mid:{de:'das Bild',en:'the picture'}, nouns:['Wand','Tür']},
{verbs:['schreiben'], mid:{de:'das Wort',en:'the word'}, nouns:['Tafel','Wand']},
{verbs:['kleben'], mid:{de:'den Zettel',en:'the note'}, nouns:['Tür','Fenster','Schrank']},
{verbs:['stellen'], mid:{de:'den Stuhl',en:'the chair'}, nouns:['Fenster','Wand','Tür']},
{verbs:['fahren'], nouns:['See','Fluss','Meer']},
],
location: [
{verbs:['stehen','warten','sitzen'], nouns:['Tür','Fenster','Tafel']},
{verbs:['hängen'], fixedSubj:{de:'Das Bild',en:'The picture'}, nouns:['Wand','Tür'], enVerb:{Er:'is hanging',Sie:'is hanging',Wir:'are hanging',Ich:'am hanging'}},
{verbs:['wohnen','leben'], nouns:['See','Fluss']},
{verbs:['arbeiten'], nouns:['Tisch','Fenster']},
{verbs:['spielen','schlafen'], nouns:['See','Fluss','Meer']},
// ankommen takes DATIVE although you obviously arrived — the an- prefix
// already carries the arrival, so the phrase only locates it.
{verbs:['ankommen'], nouns:['Bahnhof','Flughafen'], post:{dative:' an', en:''}},
],
},
auf: {
motion: [
{verbs:['legen'], mid:{de:'das Buch',en:'the book'}, nouns:['Tisch','Stuhl']},
{verbs:['gehen'], nouns:['Straße']},
{verbs:['springen'], fixedSubj:{de:'Die Katze',en:'The cat'}, nouns:['Tisch','Dach']},
{verbs:['legen'], mid:{de:'das Buch',en:'the book'}, nouns:['Tisch','Stuhl','Regal','Bett','Sofa','Boden']},
{verbs:['stellen'], mid:{de:'die Lampe',en:'the lamp'}, nouns:['Tisch','Regal','Boden','Schrank']},
{verbs:['setzen'], mid:{de:'das Kind',en:'the child'}, nouns:['Stuhl','Sofa','Bank','Bett']},
{verbs:['werfen'], mid:{de:'den Ball',en:'the ball'}, nouns:['Dach','Boden','Bett','Sofa']},
{verbs:['klettern','steigen'], nouns:['Berg','Baum','Dach','Schrank']},
{verbs:['springen'], fixedSubj:{de:'Die Katze',en:'The cat'}, nouns:['Tisch','Dach','Sofa','Schrank']},
{verbs:['gehen','laufen'], nouns:['Straße','Wiese','Brücke']},
],
location: [
{verbs:['sitzen'], nouns:['Stuhl']},
{verbs:['liegen'], fixedSubj:{de:'Das Buch',en:'The book'}, nouns:['Tisch']},
{verbs:['stehen','warten'], nouns:['Straße']},
{verbs:['sitzen'], nouns:['Stuhl','Sofa','Bank','Boden','Bett']},
{verbs:['liegen'], fixedSubj:{de:'Das Buch',en:'The book'}, nouns:['Tisch','Bett','Regal','Boden','Sofa']},
{verbs:['stehen','warten'], nouns:['Straße','Dach','Berg','Brücke','Wiese']},
{verbs:['spielen','tanzen'], nouns:['Straße','Wiese','Boden','Brücke']},
{verbs:['schlafen'], nouns:['Sofa','Boden','Bett']},
{verbs:['arbeiten'], nouns:['Dach','Wiese','Straße']},
],
},
hinter: {
motion: [{verbs:['gehen','laufen'], nouns:['Haus','Baum','Garten','Schule']}],
location:[{verbs:['stehen','warten'], nouns:['Haus','Baum','Tür','Schule']}],
motion: [
{verbs:['gehen','laufen','fahren'], nouns:['Haus','Baum','Garten','Schule','Berg','Kirche']},
{verbs:['stellen'], mid:{de:'den Stuhl',en:'the chair'}, nouns:['Tisch','Tür','Schrank','Sofa']},
{verbs:['werfen'], mid:{de:'den Ball',en:'the ball'}, nouns:['Haus','Baum','Schrank','Sofa']},
{verbs:['legen'], mid:{de:'die Tasche',en:'the bag'}, nouns:['Tür','Schrank','Sofa']},
],
location: [
{verbs:['stehen','warten'], nouns:['Haus','Baum','Tür','Schule','Kirche','Bahnhof']},
{verbs:['liegen'], fixedSubj:{de:'Der Ball',en:'The ball'}, nouns:['Schrank','Sofa','Baum','Haus']},
{verbs:['spielen'], nouns:['Haus','Schule','Garten','Kirche']},
{verbs:['sitzen'], nouns:['Tisch','Baum','Schrank']},
{verbs:['wohnen','leben'], nouns:['Bahnhof','Kirche','Supermarkt','Wald']},
],
},
in: {
motion: [{verbs:['gehen','fahren','kommen','laufen'], nouns:PLACES_IN}],
motion: [
{verbs:['gehen','fahren','kommen','laufen','rennen'], nouns:[...PLACES_IN,'Kirche','Bibliothek','Supermarkt','Wald','Dorf','Küche','Zimmer','Keller']},
{verbs:['springen','fallen'], nouns:['See','Fluss','Wasser','Meer']},
{verbs:['legen'], mid:{de:'das Buch',en:'the book'}, nouns:['Tasche','Schrank','Regal']},
{verbs:['stecken'], mid:{de:'den Schlüssel',en:'the key'}, nouns:['Tasche','Tür','Schrank']},
{verbs:['packen'], mid:{de:'das Buch',en:'the book'}, nouns:['Tasche','Schrank']},
{verbs:['tragen'], mid:{de:'die Tasche',en:'the bag'}, nouns:['Küche','Zimmer','Keller','Haus']},
{verbs:['ziehen'], nouns:['Wohnung','Stadt','Dorf','Haus']},
],
location: [
{verbs:['wohnen'], nouns:['Stadt','Haus','Hotel']},
{verbs:['sein','warten','sitzen','arbeiten'], nouns:PLACES_IN},
{verbs:['wohnen','leben'], nouns:['Stadt','Haus','Hotel','Dorf','Wohnung','Wald']},
{verbs:['sein','warten','sitzen','arbeiten'], nouns:[...PLACES_IN,'Kirche','Bibliothek','Supermarkt','Küche','Zimmer','Keller']},
{verbs:['schwimmen'], nouns:['See','Fluss','Meer','Wasser']},
{verbs:['tanzen','spielen'], nouns:['Küche','Zimmer','Garten','Wohnung','Wald']},
{verbs:['schlafen'], nouns:['Bett','Zimmer','Hotel','Keller']},
{verbs:['liegen'], fixedSubj:{de:'Das Buch',en:'The book'}, nouns:['Tasche','Schrank','Regal']},
{verbs:['stecken'], fixedSubj:{de:'Der Schlüssel',en:'The key'}, nouns:['Tür','Tasche','Schrank'], enVerb:{Er:'is stuck',Sie:'is stuck',Wir:'are stuck',Ich:'am stuck'}},
{verbs:['ankommen'], nouns:['Stadt','Hotel','Dorf'], post:{dative:' an', en:''}},
],
},
neben: {
motion: [
{verbs:['stellen'], mid:{de:'die Lampe',en:'the lamp'}, nouns:['Tisch','Stuhl','Tür']},
{verbs:['legen'], mid:{de:'das Buch',en:'the book'}, nouns:['Stuhl','Tisch']},
{verbs:['stellen'], mid:{de:'die Lampe',en:'the lamp'}, nouns:['Tisch','Stuhl','Tür','Bett','Sofa','Schrank']},
{verbs:['legen'], mid:{de:'das Buch',en:'the book'}, nouns:['Stuhl','Tisch','Bett','Sofa']},
{verbs:['setzen'], mid:{de:'das Kind',en:'the child'}, nouns:['Fenster','Tür','Schrank']},
{verbs:['schieben'], mid:{de:'den Stuhl',en:'the chair'}, nouns:['Tisch','Bett','Regal']},
],
location: [
{verbs:['stehen','sitzen'], nouns:['Tisch','Tür','Fenster']},
{verbs:['wohnen'], nouns:['Schule','Park','Museum']},
{verbs:['stehen','sitzen'], nouns:['Tisch','Tür','Fenster','Bett','Schrank','Sofa']},
{verbs:['wohnen','leben'], nouns:['Schule','Park','Museum','Kirche','Bahnhof','Supermarkt','Bibliothek']},
{verbs:['liegen'], fixedSubj:{de:'Das Buch',en:'The book'}, nouns:['Bett','Sofa','Tisch','Regal']},
{verbs:['warten'], nouns:['Tür','Bahnhof','Kirche']},
{verbs:['arbeiten'], nouns:['Fenster','Tür']},
],
},
über: {
motion: [
{verbs:['gehen','laufen'], nouns:['Straße','Brücke']},
{verbs:['hängen'], mid:{de:'die Lampe',en:'the lamp'}, nouns:['Tisch']},
{verbs:['gehen','laufen','fahren','rennen'], nouns:['Straße','Brücke','Wiese']},
{verbs:['hängen'], mid:{de:'die Lampe',en:'the lamp'}, nouns:['Tisch','Bett','Sofa']},
{verbs:['fliegen'], nouns:['Stadt','Berg','Meer','Wald','See']},
{verbs:['werfen'], mid:{de:'den Ball',en:'the ball'}, nouns:['Wand','Brücke','Schrank']},
],
location: [
{verbs:['hängen'], fixedSubj:{de:'Die Lampe',en:'The lamp'}, nouns:['Tisch','Bett','Sofa'], enVerb:{Er:'is hanging',Sie:'is hanging',Wir:'are hanging',Ich:'am hanging'}},
{verbs:['wohnen','leben'], nouns:['Restaurant','Supermarkt','Büro','Bibliothek']},
{verbs:['arbeiten'], nouns:['Restaurant','Büro','Supermarkt']},
],
location:[{verbs:['hängen'], fixedSubj:{de:'Die Lampe',en:'The lamp'}, nouns:['Tisch']}],
},
unter: {
motion: [
{verbs:['legen'], mid:{de:'das Buch',en:'the book'}, nouns:['Tisch','Stuhl']},
{verbs:['laufen'], fixedSubj:{de:'Die Katze',en:'The cat'}, nouns:['Tisch','Baum']},
{verbs:['legen'], mid:{de:'das Buch',en:'the book'}, nouns:['Tisch','Stuhl','Bett','Sofa','Regal']},
{verbs:['stellen'], mid:{de:'die Tasche',en:'the bag'}, nouns:['Tisch','Bett','Stuhl','Regal']},
{verbs:['werfen'], mid:{de:'den Ball',en:'the ball'}, nouns:['Sofa','Bett','Tisch','Schrank']},
{verbs:['schieben'], mid:{de:'die Tasche',en:'the bag'}, nouns:['Bett','Sofa','Tisch']},
{verbs:['laufen','rennen'], fixedSubj:{de:'Die Katze',en:'The cat'}, nouns:['Tisch','Baum','Bett','Sofa']},
],
location: [
{verbs:['sitzen','stehen','schlafen'], nouns:['Baum','Brücke']},
{verbs:['schlafen'], fixedSubj:{de:'Die Katze',en:'The cat'}, nouns:['Tisch','Stuhl']},
{verbs:['sitzen','stehen','schlafen'], nouns:['Baum','Brücke','Dach']},
{verbs:['liegen'], fixedSubj:{de:'Das Buch',en:'The book'}, nouns:['Bett','Sofa','Tisch','Stuhl','Regal']},
{verbs:['spielen','tanzen'], nouns:['Baum','Brücke','Dach']},
{verbs:['warten'], nouns:['Brücke','Baum','Dach']},
{verbs:['wohnen'], nouns:['Dach']},
],
},
vor: {
motion: [{verbs:['fahren','gehen'], nouns:['Haus','Tür','Schule','Hotel']}],
location:[{verbs:['stehen','warten'], nouns:['Tür','Haus','Schule','Hotel','Museum','Restaurant']}],
motion: [
{verbs:['fahren','gehen','laufen'], nouns:['Haus','Tür','Schule','Hotel','Kirche','Bahnhof','Supermarkt']},
{verbs:['stellen'], mid:{de:'den Stuhl',en:'the chair'}, nouns:['Fenster','Tür','Schrank','Regal']},
{verbs:['legen'], mid:{de:'die Tasche',en:'the bag'}, nouns:['Tür','Bett','Sofa']},
],
location: [
{verbs:['stehen','warten'], nouns:['Tür','Haus','Schule','Hotel','Museum','Restaurant','Kirche','Bahnhof','Supermarkt','Bibliothek']},
{verbs:['sitzen'], nouns:['Fenster','Haus','Tür']},
{verbs:['spielen'], nouns:['Haus','Schule','Kirche','Garten']},
{verbs:['tanzen'], nouns:['Haus','Kirche','Hotel']},
{verbs:['liegen'], fixedSubj:{de:'Die Tasche',en:'The bag'}, nouns:['Tür','Bett','Sofa','Schrank']},
],
},
zwischen: {
motion: [{verbs:['stellen'], mid:{de:'die Lampe',en:'the lamp'}, nouns:['Tisch','Stuhl'],
post:{accusative:' und das Fenster', dative:' und dem Fenster', en:' and the window'}}],
location: [{verbs:['stehen','sitzen'], nouns:['Tisch','Stuhl'],
post:{accusative:' und das Fenster', dative:' und dem Fenster', en:' and the window'}}],
motion: [
{verbs:['stellen'], mid:{de:'die Lampe',en:'the lamp'}, nouns:['Tisch','Stuhl','Sofa','Schrank'], post:ZW_POST},
{verbs:['legen'], mid:{de:'das Buch',en:'the book'}, nouns:['Tisch','Stuhl','Bett'], post:ZW_POST},
{verbs:['setzen'], mid:{de:'das Kind',en:'the child'}, nouns:['Stuhl','Sofa'], post:ZW_POST},
],
location: [
{verbs:['stehen','sitzen'], nouns:['Tisch','Stuhl','Sofa','Schrank'], post:ZW_POST},
{verbs:['liegen'], fixedSubj:{de:'Das Buch',en:'The book'}, nouns:['Tisch','Stuhl','Regal'], post:ZW_POST},
{verbs:['warten'], nouns:['Tisch','Schrank'], post:ZW_POST},
],
},
};
@@ -644,9 +781,18 @@ export function genWechselContextQ(level, state = newState()) {
const cas = isMotion ? 'accusative' : 'dative';
const r = realizeFrame(prepKey, cas, isMotion, state);
const art = DEF[r.noun.g][cas];
const sentence = `${r.subjDe} ${r.verbDe}${r.midDe} ${prepKey} ${art} ${nounForm(r.noun, cas)}${r.postDe}.`;
const head = `${r.subjDe} ${r.verbDe}${r.midDe}`;
const tail = `${nounForm(r.noun, cas)}${r.postDe}.`;
// The article is BLANKED. With "unter dem Stuhl" on screen the answer is just
// article recognition; blanked, the only evidence is the verb (and whether it
// has a direct object) — which is the actual wohin/wo skill.
const sentence = `${head} ${prepKey} _____ ${tail}`;
// The solved sentence contracts where German really contracts (in dem → im).
const fused = CONTRACTABLE[prepKey]?.[art] || null;
const answerSentence = fused ? `${head} ${fused} ${tail}` : `${head} ${prepKey} ${art} ${tail}`;
const translation = `${r.subjEn} ${r.verbEn}${r.midEn} ${r.enPrep} ${enNoun(r, r.enDet)}${r.postEn}.`;
return {type:'wechselContext', prepKey, ans:cas, isMotion, verb:r.verbKey, sentence, translation, nounEn:r.noun.en};
return {type:'wechselContext', prepKey, ans:cas, isMotion, verb:r.verbKey, noun:r.noun,
article:art, contraction:fused, sentence, answerSentence, translation, nounEn:r.noun.en};
}
const POSS_ACC_TEMPLATES = [