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
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
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
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
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
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
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
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
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
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()
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
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