コード例 #1
0
def _talked_to_nim_in_plane_1(al: "All"):
    al.mas.current_map.npcs = [
        npc for npc in al.mas.current_map.npcs if npc.name != "Nim"
    ]
    new_nim_teaching_second_letter = Npc(
        al=al,
        name="Nim",
        taught=Letter.get_by_thai("ร"),
        ma=al.mas.get_map_from_name("plane"),
        x=8,
        y=7,
        sprite="nim",
        direction=Direction.RIGHT,
        eyesight=1,
        standard_dialog=[
            "Nim: Good!",
            "I think we have time for a last third letter before the landing.",
            "ร is the consonant r.",
            "You have to roll it, like in Spanish or Russian,",
            "but actually in informal speach we Thai people just say 'l', not 'r'.",
            "Oh! Also, if it's at the end of a word, it turns into a 'n' sound.",
            "ราร would be pronounced 'rān' (or 'lān'), not 'rār'.",
        ],
        defeat_dialog=[
            "ร is easy to remember: it looks like the letter r, but reversed!",
        ],
        end_dialog_trigger_event=["talked_to_nim_in_plane"],
    )
    al.mas.current_map.add_npc(new_nim_teaching_second_letter)
コード例 #2
0
 def test_finished(self, failed=False):
     """this is triggered by the test when it ends"""
     if failed:
         self.step = LearningStep.PRESENTATION
         self.al.active_test = None
     else:
         self.goes_to_next_step()
         if self.step == LearningStep.TEST2:
             self.al.active_test = ThaiLetterFromEnglish4(
                 self.al, correct=self.letter, learning=self)
         if self.step == LearningStep.TEST3:
             self.al.active_test = EnglishLetterFromThai16(
                 self.al, learning=self, letter=self.letter)
         if self.step == LearningStep.TEST4:
             self.al.active_test = ThaiLetterFromEnglish16(
                 self.al, correct=self.letter, learning=self)
         if self.step == LearningStep.TEST5:
             word_containing_letter = Letter.get_readable_word_containing_letter(
                 self.letter)
             if word_containing_letter:
                 self.al.active_test = ThaiLettersFromSound4(
                     self.al,
                     correct=self.letter,
                     word=word_containing_letter,
                     learning=self,
                 )
             else:
                 self.al.active_test = ThaiLetterFromEnglish16(
                     self.al, correct=self.letter, learning=self)
コード例 #3
0
def _talked_to_nim_in_plane_0(al: "All"):
    al.mas.current_map.npcs = [
        npc for npc in al.mas.current_map.npcs if npc.name != "Nim"
    ]

    new_nim_teaching_second_letter = Npc(
        al=al,
        name="Nim",
        taught=Letter.get_by_thai("า"),
        ma=al.mas.get_map_from_name("plane"),
        x=8,
        y=7,
        sprite="nim",
        direction=Direction.RIGHT,
        wanna_meet=True,
        eyesight=1,
        standard_dialog=[
            "Nim: Good, that was your first letter.",
            "After the most common consonant, here's the most common vowel:",
            "า is the vowel 'ā', and note the accent on top, meaning it's a long vowel.",
            "Thai has a short 'a' (-ั) and a long 'ā' (า)",
            "It's easy to use it: นา = 'nā'.",
        ],
        defeat_dialog=[
            "It's easy to remember:",
            "า looks like the letter A but without the left part and the bar.",
        ],
        end_dialog_trigger_event=["talked_to_nim_in_plane"],
    )
    al.mas.current_map.add_npc(new_nim_teaching_second_letter)
コード例 #4
0
 def __init__(self, ma):
     self.ma = ma
     self.candidates = []
     self.rates = []
     file_path = f"{os.path.dirname(os.path.realpath(__file__))}/occurrences/{ma.filename}.occurrence"
     try:
         file = open(file_path, "r")
     except FileNotFoundError:
         # print(f"Could not find file {file_path}")
         return
     total_weight = 0
     for line in file:
         line = line.replace("\n", "")
         letter = " L " in line
         if letter:
             elements = line.split(" L ")
         else:
             elements = line.split(" ")
         weight = int(elements[0])
         # TODO do it so that it fetches word by id rather than by thai to avoid confusions
         if letter:
             letter = Letter.get_by_thai(elements[1])
             self.candidates.append(letter)
         else:
             word = Word.get_by_split_form(elements[1])
             self.candidates.append(word)
         total_weight += weight
         self.rates.append(weight)
     self.rates = [rate / total_weight for rate in self.rates]
コード例 #5
0
    def make_boxes(self):
        initial_x = self.al.ui.percent_width(0.1)
        x = initial_x
        y = self.answer_y + self.al.ui.percent_height(0.15)
        width = self.al.ui.percent_width(0.1)
        height = self.al.ui.percent_height(0.08)

        boxes = []
        for i, distractor in enumerate(self.distractors):
            try:
                letter = Letter.get_by_thai(distractor)
            except UnboundLocalError:
                try:
                    letter = Letter.get_by_thai(f"-{distractor}")
                except UnboundLocalError:
                    letter = Letter.get_by_thai(f"{distractor}-")
            letter_is_greyed_out = not letter.get_total_xp() > 1
            boxes.append(
                TestAnswerBox(
                    x=x,
                    y=y,
                    width=width,
                    height=height,
                    string=f" {distractor} ",
                    index=i,
                    greyed=letter_is_greyed_out,
                )
            )
            x += width + 20
            if x > self.al.ui.percent_width(0.8):
                x = initial_x
                y += height + self.al.ui.percent_height(0.04)
        boxes.append(
            TestAnswerBox(
                x=x,
                y=y,
                width=self.al.ui.percent_width(0.2) + 20,
                height=height,
                string=VALIDATE_STRING,
                index=len(self.distractors),
            )
        )
        return boxes
コード例 #6
0
def set_consonant_challenge_old_dude(al, npc):
    if al.learner.money >= 1:
        npc.active_dialog = npc.active_dialog[:] + ["Alright, let's do it!"]
        npc.consonants = [
            Letter.get_by_thai(l) for l in [
                "น", "ร", "ก", "ม", "อ", "ล", "ง", "ท", "ว", "ย", "ส", "ต",
                "ด", "บ", "ป", "ค", "จ", "พ", "ห", "ช", "ข", "ฟ"
            ]
        ]
    else:
        npc.active_dialog = npc.active_dialog[:] + [
            "You need to have at least one Baht..."
        ]
        npc.consonants = None
コード例 #7
0
    def select_letters_from_db(self):
        if not self.actualized:
            letters_db = list(get_db_cursor().execute(
                f" SELECT l.id, l.thai, l.pron, l.english, l.alphabet_index, l.final, l.class, l.frequency_index, l.audio, ul.total_xp "
                f"FROM letters l "
                f"LEFT JOIN user_letter ul ON ul.letter_id = l.id "
                f"LEFT JOIN users u ON u.id = ul.user_id "
                f"WHERE u.is_playing = 1 "
                f"ORDER BY l.frequency_index "
                f"LIMIT {self.max_items_to_show} OFFSET {self.offset};"))
            letters_to_show = [
                Letter(
                    id=id,
                    thai=thai,
                    pron=pron,
                    english=english,
                    alphabet_index=alphabet_index,
                    final=final,
                    class_=class_,
                    frequency_index=frequency_index,
                    audio=audio,
                    total_xp=total_xp,
                ) for (id, thai, pron, english, alphabet_index, final, class_,
                       frequency_index, audio, total_xp) in letters_db
            ]

            self.letter_boxes = []
            for line in range(self.number_of_lines):
                for column in range(self.words_per_line):
                    try:
                        letter = letters_to_show[line * self.words_per_line +
                                                 column]
                    except IndexError:
                        letter = None
                    self.letter_boxes.append(
                        LetterBox(
                            x=self.al.ui.percent_width(0.15) +
                            column * self.square_width,
                            y=self.al.ui.percent_height(0.05) +
                            line * self.square_height,
                            width=self.square_width,
                            height=self.square_height,
                            letter=letter,
                        ))
            self.actualized = True
コード例 #8
0
    def __init__(self, letter: Letter, al, npc):
        self.al = al
        self.letter = letter
        self.npc = npc
        self.step = LearningStep.NONE

        self.al.active_presentation = LetterPresentation(al,
                                                         letter,
                                                         from_learning=True)
        self.test_1 = EnglishLetterFromThai4(self.al,
                                             learning=self,
                                             letter=self.letter)
        play_transformed_thai_word(self.letter.audio)

        # remove following
        word_containing_letter = Letter.get_readable_word_containing_letter(
            self.letter)
        print('word_containing_letter', word_containing_letter)
コード例 #9
0
def pick_a_test_for_letter(al, chosen_letter):
    test = None
    while test is None:
        r = random.randint(0, 6)  # can be 0, ..., n-1   (5)
        if r == 0:
            test = EnglishLetterFromThai4(al, letter=chosen_letter)
        elif r == 1:
            test = ThaiLetterFromEnglish4(al, correct=chosen_letter)
        elif r == 2:
            test = EnglishLetterFromThai16(al, letter=chosen_letter)
        elif r == 3:
            test = ThaiLetterFromEnglish16(al, correct=chosen_letter)
        else:
            word_containing_letter = Letter.get_readable_word_containing_letter(
                chosen_letter)
            if word_containing_letter:
                test = ThaiLettersFromSound4(al,
                                             correct=chosen_letter,
                                             word=word_containing_letter)
            else:
                test = ThaiLetterFromEnglish16(al, correct=chosen_letter)
    al.active_test = test
コード例 #10
0
def wild_letters(al):
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("ม"),
        ma=al.mas.get_map_from_name("ko_kut"),
        x=51,
        y=55,
        standard_dialog=["Nim: oh, you see that letter? It's ม, the m!"],
        defeat_dialog=[
            "Nim: Well done [Name], that's one more letter!",
            "It looks a lot like the n: น - but in the m, the loops are on the sa>M<e side.",
            "And for the น (n) the loops are >N<ot on the same side.",
        ],
    ))

    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("-ั"),
        ma=al.mas.get_map_from_name("ko_kut"),
        x=50,
        y=53,
        standard_dialog=[
            "Nim: You see this thing, blocking our way?",
            "That is a wild letter.",
            "To have it go away, we have to learn it!",
            "This one is -ั: shorter version of the letter a า.",
        ],
        defeat_dialog=[
            "Nim: If you put it over a consonant like so: นั ,",
            "Then you get the sound na.",
            "Alright, let's carry on!",
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("ก"),
        ma=al.mas.get_map_from_name("ko_kut"),
        x=50,
        y=49,
        standard_dialog=[
            "Nim: Another one?",
            "This one is ก, the consonant g - and it's the first letter of the Thai alphabet.",
        ],
        defeat_dialog=["Nim: Well done [Name]!"],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("เ-"),
        ma=al.mas.get_map_from_name("ko_kut"),
        x=52,
        y=45,
        standard_dialog=[
            "Nim: This is the very common vowel เ, the long ē!",
            "It's pronounced e, like in 'neck'.",
            "It's quite similar to the french é, like in café or Pokémon.",
            "It's an interesting vowel, because it comes before the consonant:",
            "For example, to write 'nay', you write เน!",
            "เ can also be combined with า and sandwich a consonant to form the ao sound!",
            "For example, เนา is read nao!",
        ],
        defeat_dialog=[
            "Nim: The vowel เ has a very similar friend, the vowel แ!",
            "You'll learn it later, but แ is pronounced ae, pronounced like in ham.",
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("อ"),
        ma=al.mas.get_map_from_name("ko_kut"),
        x=54,
        y=41,
        standard_dialog=[
            "Nim: This the letter o: อ. It is both used as a vowel and a consonant.",
            "As a vowel, it's a long ō, like in 'saw'.",
            "For example, รอ is pronounced 'ro:'.",
            "But it can also be used as a consonant placeholder - and it's silent.",
            'For example, to say "uncle" in Thai, we say a:.',
            "But you cannot just write า, because each vowel in Thai needs a consonant.",
            "So you use instead the silent consonant placeholder อ.",
            'So, "uncle" is อา.',
        ],
        defeat_dialog=[
            "Nim: อ is quite easy to remember, because it looks like an o.",
            'Given that it\'s both a consonant and a vowel, "ออ" is a syllable!',
            '"ออ" is read "o:", and means "to congregate"!',
            'There\'s also this crazy word "เออออ", read "er o", meaning "to agree"!',
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("ว"),
        ma=al.mas.get_map_from_name("ko_kut"),
        x=51,
        y=41,
        standard_dialog=[
            "Nim: Good find, I didn't see this one!",
            "This is the w, ว!",
            "Don't get it confused with the า (ā): ว has an extra loop.",
            "By the way, the loop indicates how to write a letter:.",
            "You have to write starting from the loop.",
        ],
        defeat_dialog=["Nim: Good job!"],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("ย"),
        ma=al.mas.get_map_from_name("ko_kut"),
        x=44,
        y=48,
        standard_dialog=[
            "Nim: Here's the y!",
            "ยาย is my favorite word, it means grandmother, and it's pronounced yai!",
        ],
        defeat_dialog=[
            "Nim: I find that ย looks like a y, somehow, so it's easy to remember!"
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("ล"),
        ma=al.mas.get_map_from_name("ko_kut"),
        x=49,
        y=42,
        standard_dialog=[
            "Nim: That's the consonant l!",
            "Don't get ล confused with the s: ส!",
        ],
        defeat_dialog=[
            'Nim: At the end of a word, l is pronounced "n".',
            'For example, มล is pronounced "mon", not "mol"!',
            "You can't end a word in l in Thai.",
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("ง"),
        ma=al.mas.get_map_from_name("ko_kut"),
        x=49,
        y=35,
        standard_dialog=[
            "Nim: That's ง, the ng consonant!",
            "Don't you think ง looks like a muscle flexing?",
            "I like to imagine somebody flexing and making the sound ng.",
            "Nim: 'ng' can come at the end of a syllable like in English,",
            "but it can also come at the beginning.",
            'For example, the word "confused" in Thai is งง: ngong!',
        ],
        defeat_dialog=["Well done [Name]!"],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("ท"),
        ma=al.mas.get_map_from_name("ko_kut"),
        x=57,
        y=38,
        standard_dialog=[
            "Nim: Here's ท!",
            "It's pronounced like a t, but aspirated, so we can write it t'h.",
        ],
        defeat_dialog=[
            "Nim: the sound t doesn't exist in Thai, it's either ด d, ต dt or ท t'h.",
            'However, all three sounds become a "t" at the end of a syllable.',
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("-ี"),
        ma=al.mas.get_map_from_name("ko_kut"),
        x=46,
        y=39,
        standard_dialog=[
            "Nim: Here's the vowel -ี!",
            'This is the long sound "ee", written ī.',
            "It sits like an accent on the consonant: mī is มี.",
        ],
        defeat_dialog=[
            "Nim: Good!",
            'By the way, มี means "to have", it\'s very commonly used!',
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("-ิ"),
        ma=al.mas.get_map_from_name("ko_kut"),
        x=45,
        y=39,
        standard_dialog=[
            "Nim: And here is her short sister -ิ, pronounced i.",
            "-ิ is like -ี, but -ิ is short while -ี is long.",
            "Can you see the difference?",
        ],
        defeat_dialog=[
            "Nim: I remember that -ิ is shorter than -ี,",
            "because it's shorter to write -ิ than -ี!",
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("ส"),
        ma=al.mas.get_map_from_name("ko_kut"),
        x=47,
        y=42,
        standard_dialog=[
            "Nim: Here's ส, don't get it confused with the l ล!",
            "It's the s, well, one of them.",
            "Thai has four letters for s: ส, ษ, ซ, and ศ.",
            "ส is the most common of them.",
            "Notice how most of them are >s<triken though:",
            "It makes it easy to remember that ส, ษ, ซ, and ศ are s.",
        ],
        defeat_dialog=[
            'Nim: At the end of a word, s is pronounced "t".',
            "By the way, do you know why letters are pronounced differently at the end?",
            "Because Thai people don't voice the last part of syllable.",
            "You can think that they don't take the time to properly finish.",
            "So, l becomes n, g becomes k, d becomes t, and s becomes t also!",
            "Try yourself!",
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("ด"),
        ma=al.mas.get_map_from_name("ko_kut"),
        x=47,
        y=32,
        standard_dialog=["Nim: Here's the consonant ด!", "This is the d."],
        defeat_dialog=[
            'Nim: At the end of a syllable, it\'s pronounced "t", not d.'
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("ต"),
        ma=al.mas.get_map_from_name("ko_kut"),
        x=48,
        y=32,
        standard_dialog=[
            "Nim: And here's ด's sister: ต.",
            "It has a little dent on top, and it's pronounced dt.",
        ],
        defeat_dialog=[
            'Nim: This one too is pronounced "t" at the end of a syllable.'
        ],
    ))
コード例 #11
0
def wild_letters(al):
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("บ"),
        ma=al.mas.get_map_from_name("ko_mak"),
        x=35,
        y=13,
        standard_dialog=[
            "Nim: oh, you see these letters?",
            "It's บ the b, and it's big brother ป the bp!", "Let's get them!"
        ],
        defeat_dialog=[
            "Nim: Nice!",
            "To remember บ, think of it as a bowl containing some beverage!",
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("ป"),
        ma=al.mas.get_map_from_name("ko_mak"),
        x=36,
        y=13,
        standard_dialog=[
            "Nim: Let's get this one too!",
        ],
        defeat_dialog=[
            "Nim: Wow, what is that garbage doing here? How dirty!",
            "Let's pick it up!",
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("ะ"),
        ma=al.mas.get_map_from_name("ko_mak"),
        x=31,
        y=15,
        standard_dialog=[
            "Nim: This one will be easy to learn, you know it already!",
            "This is the same as -ั (the short a),",
            "but this is the shape it takes when it's at the end of a syllable.",
            "So, dtap is ตับ, but dta is ตะ.",
            "You get it?",
        ],
        defeat_dialog=[
            "Nim: This symbol is also used to shorten a vowel.",
            "For example, โ− is long on it's own, while โ−ะ is short!",
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("ค"),
        ma=al.mas.get_map_from_name("ko_mak"),
        x=28,
        y=17,
        standard_dialog=[
            "Nim: That's ค, and it's pronounced k'h - just like a k, but aspirated.",
            "At the end of a syllable, it's more like a k.",
            "Careful not to get ค and ด (d) confused!",
            "ค looks like a cow (kow) looking at you,",
            "while ด spirals in like a digital finger print.",
        ],
        defeat_dialog=[
            "Nim: Great, let's carry on!",
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("จ"),
        ma=al.mas.get_map_from_name("ko_mak"),
        x=19,
        y=20,
        standard_dialog=[
            "Nim: Now this is จ, the j sound.",
            "Guess how it's pronounced at the end of a syllable.",
            "It would be pronounced t.",
        ],
        defeat_dialog=[
            "Nim: Here's my mnemonic for it:",
            "จ looks like the trajectory of a >j<umping circle.",
            "Although I must say I've heard other mnemonics concerning >g<enitals.",
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("-ื"),
        ma=al.mas.get_map_from_name("ko_mak"),
        x=24,
        y=21,
        standard_dialog=[
            "Nim: This vowel is the long \"eu\" sound.",
            "It's in the same family as -ิ and -ี, but it has two streaks on top: -ื.",
            "(And we also have -ึ in that family).",
            "This sound is a bit hard to make:",
            "You have to make the sound \"oo\" with your teeth and tongue,",
            "But you smile with your lips as if you say the sound \"ee\".",
            "I call this the smiling letter because it forces people to smile.",
            "Sometimes, it's on its own, like in มืด (that means \"dark\" by the way),",
            "but sometimes it comes with อ: for example, \"hand\" is มือ.",
            "It's pronounced the same way with or without the extra placeholder.",
        ],
        defeat_dialog=[
            "Nim: Well done!",
            "To remember it, imagine it's a smile with two teeth out.",
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("พ"),
        ma=al.mas.get_map_from_name("ko_mak"),
        x=20,
        y=14,
        standard_dialog=[
            "Nim: This letter is the p'h: the aspirated p sound.",
            "พ is low class, and it has a high-class brother ผ also pronounced p'h.",
            "The low-class one looks outside, while the high-class looks inside.",
            "To remember it, imagine that people in the upper class are full of themselves.",
            "While people in the lower class look outside.",
        ],
        defeat_dialog=[
            "Nim: To remember it, I imagine that พ is a wiggly >p<asta.",
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("ฟ"),
        ma=al.mas.get_map_from_name("ko_mak"),
        x=20,
        y=13,
        standard_dialog=[
            "Nim: And this is p'h brother: the f.",
            "Just like พ, ฟ has a high-class brother ฝ also pronounced f.",
            "Here too, the low-class one looks outside, while the high-class looks inside.",
        ],
        defeat_dialog=[
            "Nim: To remember it,",
            "I imagine that ฟ is a พ that is >f<ull-grown and >f<lamboyant.",
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("แ-"),
        ma=al.mas.get_map_from_name("ko_mak"),
        x=25,
        y=15,
        standard_dialog=[
            "Nim: This is แ-, it looks like twice the เ-, that you learnt already!",
            "It's pronounced ae, like the sound in cat.",
            "Just like the เ-, it is before the consonant.",
        ],
        defeat_dialog=[
            "Nim: Don't forget that แ- and เ- are long vowels!",
            "Their shorter counterparts are แ−ะ and เ−ะ.",
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("ห"),
        ma=al.mas.get_map_from_name("ko_mak"),
        x=26,
        y=19,
        standard_dialog=[
            "Nim: This is ห, the h.",
            "For example, หก is pronounced hok - and that's how you write six!",
            "Notice how it looks like a h: it's quite easy to remember.",
            "The ห is also sometimes silent,",
            "and it's used to turn another consonant into a high-class.",
            "High-class helps with telling which is the tone of a syllable.",
            "For example in the word หลัง, you can just ignore the ห: it's simply read \"lang\".",
        ],
        defeat_dialog=[
            "Nim: Great, let's carry on!",
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("ไ-"),
        ma=al.mas.get_map_from_name("ko_mak_cave"),
        x=12,
        y=12,
        standard_dialog=[
            "Nim: These two vowels are very similar: ไ and ใ.",
            "Both are pronounced ai, like in \"I\" or \"eye\",",
            "and both are to be placed before the consonant, like แ- and เ-.",
            "In the past, in Sukhotai period, they used to be different,",
            "but now they're exactly the same.",
            "When we talk about them, to distinguish, we call them maimalai and maimuan.",
        ],
        defeat_dialog=[
            "Nim: Well done!",
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("ใ-"),
        ma=al.mas.get_map_from_name("ko_mak_cave"),
        x=13,
        y=12,
        standard_dialog=[
            "Nim: ใ is interesting because it appears in only twenty words!",
            "But because these words are all quite common,",
            "ใ is actually more frequent than ไ!",
        ],
        defeat_dialog=[
            "Nim: There's a poem that contains all the twenty ใ- words.",
            "If you're interested, we can learn it later!",
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("โ-"),
        ma=al.mas.get_map_from_name("ko_mak_cave"),
        x=18,
        y=12,
        standard_dialog=[
            "Nim: Here's โ, the cousin of ใ- and ไ-.",
            "Like them, it is placed before the consonant,",
            "and like them, it is taller than the rest of the letters.",
            "However, it's pronounced ōh.",
            "Your mouth when you pronounce โ (ōh) is more closed than with the อ (ō).",
            "Also, notice how โ- looks like a tall ร.",
        ],
        defeat_dialog=[
            "Nim: To remember it, I think of the sound roh: โร,",
            "and I picture โ next to ร.",
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("ข"),
        ma=al.mas.get_map_from_name("ko_mak"),
        x=12,
        y=18,
        standard_dialog=[
            "Nim: Here's the k'h: the aspirated k sound.",
            "We've learnt another letter that is pronounced k'h: ค.",
            "It happens that Thai language has several letters for the same sound.",
            "But most languages do, right?",
            "However, ค and ข are different:",
            "ค is low class, and ข is high class.",
            "Each consonant in Thai is either high-, middle-, or low-class.",
            "This helps us determine the tone of a syllable.",
            "You'll have to learn for each eventually,",
            "It will be necessary to unlock their magical potential and use spells.",
        ],
        defeat_dialog=[
            "Nim: Did you see how ข looks like a บ (b), but flattened?",
            "Don't get them confused!",
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("ช"),
        ma=al.mas.get_map_from_name("ko_mak"),
        x=10,
        y=21,
        standard_dialog=[
            "Nim: This is ข's brother, ช!",
            "It looks the same, but has an extra dent.",
            "It's pronounced \"ch\", and \"t\" at the end of a word.",
        ],
        defeat_dialog=[
            "Nim: Did you see how ข looks like a บ (b), but flattened?",
            "Don't get them confused!",
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("-ู"),
        ma=al.mas.get_map_from_name("ko_mak"),
        x=10,
        y=14,
        standard_dialog=[
            "Nim: That's the vowel ū, the long \"oo\" sound like in \"noon\".",
            "It goes under the consonant:",
            "หู is pronounced hoo (it means ear).",
        ],
        defeat_dialog=[
            "Nim: It's the only letter that goes under, so it's easy to remember:",
            "ū goes ūnder!",
        ],
    ))
    add_wild_letter(wild_letter=Npc(
        al=al,
        letter=Letter.get_by_thai("-ุ"),
        ma=al.mas.get_map_from_name("ko_mak"),
        x=11,
        y=14,
        standard_dialog=[
            "Nim: And here's -ุ, -ู short sister: the same sound, but shorter.",
            "It's quite similar, but -ุ lack the little bit on the side of -ู.",
        ],
        defeat_dialog=[
            "Nim: These are the only letters that goes under, so it's easy to remember:",
            "ū goes ūnder!",
        ],
    ))