Example #1
0
    def decided(self, gamestate, data, audio, face_image, choice, yes,
                scr_capt, display_loot):
        """
        Deze wordt in de callback meegegeven bij het keuze moment in de confirmbox van de quest.
        :param gamestate: self.engine.gamestate
        :param data: self.engine.data
        :param audio: self.engine.audio
        :param face_image: PeopleDatabase[person_sprite.person_id].value['face']
        :param choice: confirmbox.cur_item
        :param yes: confirmbox.TOPINDEX
        :param scr_capt: hetzelfde schermafdruk die ook in de voorgaande confirmbox is gebruikt
        :param display_loot: methode uit Window() waar het overzicht gegeven wordt van wat je ontvangen hebt.
        """
        if choice == yes:
            # ga naar Finished
            self._update_state(is_fulfilled=True)
            # hij kan voldoen, komt daarom met text en plaatjes terug, om dat weer te kunnen geven.
            self._fulfill(data)

            if self.reward:
                text = ["Received:"]
                image = []
                text, image = display_loot(self.reward, text, image)
                push_object = MessageBox(text,
                                         spr_image=image,
                                         scr_capt=scr_capt,
                                         sound=SFX.reward,
                                         last=True)
                gamestate.push(push_object)

                # nog een bedank berichtje van de quest owner.
                for text_part in reversed(self._get_text()):
                    push_object = MessageBox(text_part,
                                             face_image=face_image,
                                             scr_capt=scr_capt)
                    gamestate.push(push_object)

            else:
                # als er geen directe reward is, maar er is wel een soort quest klaring.
                audio.play_sound(SFX.reward)

                # nog een bedank berichtje van de quest owner.
                amount_messages = len(self._get_text()) - 1
                for i, text_part in enumerate(reversed(self._get_text())):
                    push_object = MessageBox(
                        text_part,
                        face_image=face_image,
                        scr_capt=scr_capt,
                        sound=(None if i == amount_messages else SFX.message),
                        last=(True if i == 0 else False))
                    gamestate.push(push_object)

            # ga naar Rewarded
            self._update_state(got_rewarded=True)

        else:
            # bij 'nee' dan word je state weer een stapje omlaag gezet.
            audio.play_sound(SFX.done)
            if self.state == QuestState.Ready:
                self.state = QuestState.Running
Example #2
0
    def is_able_to_equip(self, gamestate, new_equipment_item):
        """
        Hier bekijkt hij of hij het nieuwe equipment item wel mag/kan dragen.
        :param gamestate: self.engine.gamestate uit partydisplay
        :param new_equipment_item: Object van EquipmentItem
        :return: False of True of hij mag/kan
        """
        if not self.has_enough_weapon_skill_to_equip(new_equipment_item):
            text = [
                "{} doesn't have the skill to equip that {}.".format(
                    self.NAM, new_equipment_item.NAM)
            ]
            push_object = MessageBox(text, sound=SFX.menu_cancel)
            gamestate.push(push_object)
            return False

        # loop alle minimals door, bijv:
        # als MIN_INT van het nieuwe item > abs(intelligentie van hero):
        # geef dan de tekst: hero naam, 5, Intelligence, boog.
        for stat in Minimals:
            stat1 = getattr(self, stat.name[4:])  # self.int
            stat2 = getattr(stat1, 'qty')  # self.int.qty
            # die abs() is een hack, -1 wordt 1, en er zijn toch geen items met een min_wiz van 1.
            stat3 = abs(stat2)
            if new_equipment_item.get_value_of(stat.name) > stat3:
                text = [
                    "{} needs {} {} to equip that {}.".format(
                        self.NAM, new_equipment_item.get_value_of(stat.name),
                        stat.value[5:], new_equipment_item.NAM)
                ]
                push_object = MessageBox(text, sound=SFX.menu_cancel)
                gamestate.push(push_object)
                return False

        if (new_equipment_item.get_value_of('SKL') == WeaponType.mis
                and self.sld.is_not_empty()):
            text = [
                '{} can not use a bow when a shield is equipped.'.format(
                    self.NAM)
            ]
            push_object = MessageBox(text, sound=SFX.menu_cancel)
            gamestate.push(push_object)
            return False
        elif (new_equipment_item.get_value_of('SKL') == WeaponType.shd
              and self.wpn.get_value_of('SKL') == WeaponType.mis):
            text = [
                '{} can not use a shield when a bow is equipped.'.format(
                    self.NAM)
            ]
            push_object = MessageBox(text, sound=SFX.menu_cancel)
            gamestate.push(push_object)
            return False

        return True
Example #3
0
 def _handle_leftbox_click(self, event):
     self.train_click, self.selected_skill = self.leftbox.mouse_click(event)
     # selected_skill is hier eventueel .qty = 0. deze zin is kopie. wel van toepassing?
     if self.train_click:
         self.gold_cost = self.selected_skill.gold_cost
         self.xp_cost = self.selected_skill.xp_cost
         succes, text = self.selected_skill.is_able_to_train(
             self.xp_amount, self.gold_amount)
         if succes:
             text = [
                 "{}: {}  --> {}.".format(self.selected_skill.NAM,
                                          self.selected_skill.qty,
                                          self.selected_skill.qty + 1),
                 "Are you sure you wish to train the",
                 "skill {} for {} XP and {} gold?".format(
                     self.selected_skill.NAM, self.xp_cost,
                     self.gold_cost), "", "Yes", "No"
             ]
             self.confirm_box = ConfirmBox(text)
             self.engine.gamestate.push(self.confirm_box)
         else:
             push_object = MessageBox(text, sound=SFX.menu_cancel)
             self.engine.gamestate.push(push_object)
             self._reset_vars()
         return True
     return False
Example #4
0
 def _handle_stat_box_click(self, event):
     """
     ...
     :param event:
     :return:
     """
     if self.stats_box.rect.collidepoint(event.pos):
         self.upgrade_click, self.selected_stat = self.stats_box.mouse_click(
             event)
         if self.upgrade_click:
             self.xp_cost = self.selected_stat.xp_cost
             success, text = self.selected_stat.is_able_to_upgrade(
                 self.cur_hero.exp.rem)
             if success:
                 text = [
                     "{}: {}  --> {}.".format(self.selected_stat.NAM,
                                              self.selected_stat.qty,
                                              self.selected_stat.qty + 1),
                     "You have {} XP Remaining.".format(
                         self.cur_hero.exp.rem),
                     "Are you sure you wish to train",
                     "the stat {} for {} XP?".format(
                         self.selected_stat.NAM,
                         self.xp_cost), "", "Yes", "No"
                 ]
                 self.confirm_box = ConfirmBox(text)
                 self.engine.gamestate.push(self.confirm_box)
             else:
                 push_object = MessageBox(text, sound=SFX.menu_cancel)
                 self.engine.gamestate.push(push_object)
                 self._reset_vars()
         return True
     return False
Example #5
0
    def show_message(self, gamestate, data, person_enum_val):
        """
        Geef een bericht en waneer mogelijk ook een confirmbox erachteraan.
        :param gamestate: self.engine.gamestate
        :param data: self.engine.data
        :param person_enum_val: een Enum .value uit de PeopleDatabase[x].value. het is een dict().
        :return: deze is voor het vullen van een quest_box in window. returnt een confirmbox indien nodig.
        """
        for i, text_part in enumerate(reversed(self._get_text())):
            push_object = MessageBox(text_part,
                                     face_image=person_enum_val['face'],
                                     last=(True if i == 0 and
                                           (not self._is_ready_to_fulfill(data)
                                            or self.is_rewarded()) else False))
            gamestate.push(push_object)

        self._update_state(self._is_ready_to_fulfill(data))

        if self.state == QuestState.Ready:
            push_object = ConfirmBox(self._get_text(),
                                     callback=person_enum_val)
            gamestate.push(push_object)
            # plaats de confirmbox achter alle messageboxen
            gamestate.push_confirmbox_to_end()
            return push_object

        return None
Example #6
0
    def mouse_click(self, event, gamestate, audio, hero):
        """
        Equip het geselecteerde item.
        :param event: pygame.MOUSEBUTTONDOWN uit partyscreen
        :param gamestate: self.engine.gamestate uit partydisplay
        :param audio: self.engine.audio uit partydisplay
        :param hero: de huidige geselecteerde hero uit partyscreen
        """
        for index, row in enumerate(self.table_data):
            if row[5].collidepoint(event.pos):
                self.cur_item = index
                selected_item = row[4]
                equipped_item = hero.get_equipped_item_of_type(
                    self.equipment_type)

                # equip
                # als de geselecteerde geen lege is
                if row[6] != "E":
                    # als de geselecteerde een selecteerbare is
                    if row[6] == "Y":
                        # als de geselecteerde niet dezelfde is als die je al aan hebt
                        if selected_item.get_value_of(
                                'RAW') != equipped_item.get_value_of('RAW'):
                            # als hij in de inventory zit
                            if self.inventory.contains(selected_item):
                                # als het aankleden gelukt is
                                if hero.set_equipment_item(
                                        gamestate, audio, selected_item):
                                    # verwijder hem dan uit de inventory
                                    self.inventory.remove_i(selected_item)
                                    # als degene die je aan had niet een lege is
                                    if equipped_item.is_not_empty():
                                        # voeg die dan toe aan de inventory
                                        self.inventory.add_i(equipped_item)
                                    return True
                    # of niet al van een hero is
                    else:
                        text = [
                            "That {} is already equipped by {}.".format(
                                selected_item.NAM, row[6])
                        ]
                        push_object = MessageBox(text, sound=SFX.menu_cancel)
                        gamestate.push(push_object)

                # unequip
                # als de geselecteerde wel een lege is
                else:
                    # als degene die je al aan hebt geen lege is
                    if equipped_item.is_not_empty():
                        # trek dan de lege aan
                        hero.set_equipment_item(gamestate, audio,
                                                selected_item)
                        # en voeg degene die je aan had toe aan de inventory
                        self.inventory.add_i(equipped_item)
                        return True
        return False
Example #7
0
 def _handle_rightbox_click(self, event):
     self.sell_click, self.selected_item, self.tot_quantity, self.value = self.rightbox.mouse_click(event)
     # als een item maar 0 gc oplevert.
     if self.sell_click and self.value == 0:
         text = ["I do not want that item."]
         push_object = MessageBox(text, sound=SFX.menu_cancel)
         self.engine.gamestate.push(push_object)
         self.sell_click = False
         return True
     elif self.sell_click and self.selected_item:
         text = self._fill_confirm_box_with_sell_text()
         self.confirm_box = ConfirmBox(text)
         self.engine.gamestate.push(self.confirm_box)
         return True
     elif self.sell_click and not self.selected_item:
         text = ["You must unequip that to sell it."]
         push_object = MessageBox(text, sound=SFX.menu_cancel)
         self.engine.gamestate.push(push_object)
         self.sell_click = False
         return True
     return False
Example #8
0
 def _handle_pouch_box_click(self, event):
     """
     ...
     :param event:
     :return:
     """
     if self.pouch_box.rect.collidepoint(event.pos):
         pouch_click, selected_item = self.pouch_box.mouse_click(event)
         if pouch_click:
             # todo, maken dat in battle je niet op deze manier potions kan drinken.
             able, message = selected_item.use(self.cur_hero)
             if able and message:
                 # een img is een string.
                 push_object = MessageBox(
                     message,
                     last=(False if type(message) == list else True))
                 self.engine.gamestate.push(push_object)
             elif not able and message:
                 push_object = MessageBox(message, sound=SFX.menu_cancel)
                 self.engine.gamestate.push(push_object)
         return True
     return False
Example #9
0
 def _handle_leftbox_click(self, event):
     self.buy_click, self.selected_item, self.value = self.leftbox.mouse_click(event)
     if self.buy_click and self.value <= self.gold_amount:
         text = ["You may buy 1 {} for {} gold.".format(self.selected_item.NAM, self.value),
                 "",
                 "Yes please.",
                 "No thanks."]
         self.confirm_box = ConfirmBox(text)
         self.engine.gamestate.push(self.confirm_box)
         return True
     elif self.buy_click and self.value > self.gold_amount:
         text = ["You need {} more gold to".format(self.value - self.gold_amount),
                 "buy that {}.".format(self.selected_item.NAM)]
         push_object = MessageBox(text, sound=SFX.menu_cancel)
         self.engine.gamestate.push(push_object)
         self.buy_click = False
         self.selected_item = None
         self.value = 0
         return True
     return False
Example #10
0
    def on_select(self, menu_item, title, animation, scr_capt, index):
        """
        Zie BaseMenu.
        :param menu_item: zie BaseMenu
        :param title: zie BaseMenu
        :param animation: zie BaseMenu
        :param scr_capt: zie BaseMenu
        :param index: zie BaseMenu
        """
        if menu_item.text == "New Game":
            self.engine.audio.fade_bg_music()
            self.engine.data = Data()
            if Script.new_game(
                    self.engine.data,
                    self.engine.debug_mode):  # als het voor de datum is
                # als deze stack leeg is, komt Overworld er op.
                self.engine.gamestate.push(Transition())
                self.engine.gamestate.deep_pop()
                self.engine.gamestate.push(
                    MessageBox(Script.intro_text(), scr_capt=False, last=True))
                self.engine.gamestate.push(Transition())
                self.engine.gamestate.push(LoadScreen())
                self.engine.gamestate.push(Transition(wait=2))
                self.engine.force_bg_music = True

        elif menu_item.text == "Load Game":
            push_object = screens.menu.create_menu(GameState.LoadMenu,
                                                   self.engine)
            self.engine.gamestate.push(push_object)
            self.engine.gamestate.push(Transition())

        elif menu_item.text == "Settings":
            push_object = screens.menu.create_menu(GameState.SettingsMenu,
                                                   self.engine,
                                                   title1=title,
                                                   animation1=animation)
            self.engine.gamestate.push(push_object)

        elif menu_item.text == "Exit":
            self.on_quit()
Example #11
0
    def _handle_leftbox_click(self, event):
        create_click, selected_equipment = self.leftbox.mouse_click(event)
        if create_click:
            cloth = inventoryitems.factory_pouch_item(PouchItemDatabase.cloth)
            leather = inventoryitems.factory_pouch_item(
                PouchItemDatabase.leather)
            wood = inventoryitems.factory_pouch_item(PouchItemDatabase.wood)
            metals = inventoryitems.factory_pouch_item(
                PouchItemDatabase.metals)
            clt_qty = self.engine.data.pouch.get_quantity(cloth)
            ltr_qty = self.engine.data.pouch.get_quantity(leather)
            wod_qty = self.engine.data.pouch.get_quantity(wood)
            mtl_qty = self.engine.data.pouch.get_quantity(metals)

            if selected_equipment.CLT > clt_qty or \
               selected_equipment.LTR > ltr_qty or \
               selected_equipment.WOD > wod_qty or \
               selected_equipment.MTL > mtl_qty:
                text = [
                    "You do not have the right components",
                    "to create that {}.".format(selected_equipment.NAM)
                ]
                push_object = MessageBox(text, sound=SFX.menu_cancel)
                self.engine.gamestate.push(push_object)
                return True
            elif self.cur_hero.sta.cur < self.cur_hero.mec.STA_COST:
                text = [
                    "{} does not have enough stamina".format(
                        self.cur_hero.NAM),
                    "to create that {}.".format(selected_equipment.NAM)
                ]
                push_object = MessageBox(text, sound=SFX.menu_cancel)
                self.engine.gamestate.push(push_object)
                return True
            elif 'pouch is full' is False:  # todo, moet 'pouch is vol' hier? of in pouch?
                self.engine.audio.play_sound(SFX.menu_cancel)
                return True

            self.engine.data.pouch.remove(cloth,
                                          selected_equipment.CLT,
                                          force=True)  # want kan ook 0 zijn.
            self.engine.data.pouch.remove(leather,
                                          selected_equipment.LTR,
                                          force=True)
            self.engine.data.pouch.remove(wood,
                                          selected_equipment.WOD,
                                          force=True)
            self.engine.data.pouch.remove(metals,
                                          selected_equipment.MTL,
                                          force=True)

            self.cur_hero.sta.cur -= self.cur_hero.mec.STA_COST

            # hoog het custom nummer op en zet die achter de .RAW zodat er meerdere customs in de inventory kunnen
            self.engine.data.custom_inventory_counter += 1
            selected_equipment.RAW += str(
                self.engine.data.custom_inventory_counter)

            # loop door alle attributen van selected_equipment heen
            # list(), zodat uit de iterate verwijderd kan worden
            for attr, value in list(vars(selected_equipment).items()):
                # als er een waarde van een attribute op 'X' vanuit de database staat,
                # dat betekent dat hij nog gevuld moet worden.
                if value == 'X':
                    # wat is de waarde van de gelijknamige attribute met 'MIN_' ervoor
                    min_value = getattr(selected_equipment, 'MIN_' + attr)
                    max_value = getattr(selected_equipment, 'MAX_' + attr)
                    # vraag bij de Mechanic Skill de berekende waarden op. en zet attribute op die waarde.
                    setattr(
                        selected_equipment, attr,
                        self.cur_hero.mec.get_eqp_itm_attr_value(
                            min_value, max_value))
                    # en verwijder de overblijfselen
                    delattr(selected_equipment, 'MIN_' + attr)
                    delattr(selected_equipment, 'MAX_' + attr)

            text = ["{} successfully created.".format(selected_equipment.NAM)]
            self.engine.data.inventory.add_i(selected_equipment)
            push_object = MessageBox(text)
            self.engine.gamestate.push(push_object)

            self._init_boxes()
            return True
        return False
Example #12
0
    def _handle_leftbox_click(self, event):
        create_click, selected_potion = self.leftbox.mouse_click(event)
        if create_click:
            herbs = inventoryitems.factory_pouch_item(PouchItemDatabase.herbs)
            spices = inventoryitems.factory_pouch_item(
                PouchItemDatabase.spices)
            gemstones = inventoryitems.factory_pouch_item(
                PouchItemDatabase.gemstones)
            hrb_qty = self.engine.data.pouch.get_quantity(herbs)
            spc_qty = self.engine.data.pouch.get_quantity(spices)
            gms_qty = self.engine.data.pouch.get_quantity(gemstones)

            if selected_potion.HRB > hrb_qty or \
               selected_potion.SPC > spc_qty or \
               selected_potion.GMS > gms_qty:
                text = [
                    "You do not have the right components",
                    "to create that {}.".format(selected_potion.NAM)
                ]
                push_object = MessageBox(text, sound=SFX.menu_cancel)
                self.engine.gamestate.push(push_object)
                return True
            elif self.cur_hero.sta.cur < self.cur_hero.alc.STA_COST:
                text = [
                    "{} does not have enough stamina".format(
                        self.cur_hero.NAM),
                    "to create that {}.".format(selected_potion.NAM)
                ]
                push_object = MessageBox(text, sound=SFX.menu_cancel)
                self.engine.gamestate.push(push_object)
                return True
            elif 'pouch is full' is False:  # todo, moet 'pouch is vol' hier? of in pouch?
                self.engine.audio.play_sound(SFX.menu_cancel)
                return True

            self.engine.data.pouch.remove(herbs,
                                          selected_potion.HRB,
                                          force=True)  # want kan ook 0 zijn.
            self.engine.data.pouch.remove(spices,
                                          selected_potion.SPC,
                                          force=True)
            self.engine.data.pouch.remove(gemstones,
                                          selected_potion.GMS,
                                          force=True)

            self.cur_hero.sta.cur -= self.cur_hero.alc.STA_COST

            rnd_percentage = random.randint(1, 100)
            potion_chance = self.cur_hero.alc.get_percentage(
                selected_potion.ALC)
            if potion_chance >= rnd_percentage:
                text = ["{} successfully created.".format(selected_potion.NAM)]
                self.engine.data.pouch.add(selected_potion)
                push_object = MessageBox(text)
                self.engine.gamestate.push(push_object)
            else:
                text = ["Failed to create a {}.".format(selected_potion.NAM)]
                push_object = MessageBox(text, sound=SFX.menu_cancel)
                self.engine.gamestate.push(push_object)

            self._init_boxes()
            return True
        return False