def __init__( self, character_datas, goto_battle_count_max, **kargs ) : super( UICombatPrepare, self ).__init__( **kargs ) self.goto_battle_count_max= goto_battle_count_max self.bind( on_open= UICombatPrepare.on_opened, on_dismiss= UICombatPrepare.on_dismissing ) self.hp_max_name= get_property( u'hp_max' ).__doc__ self.speed_name= get_property( u'speed' ).__doc__ self.dex_name= get_property( u'dex' ).__doc__ goto_battle_count= 0 for character_data in character_datas : if goto_battle_count >= goto_battle_count_max : character_data[u'goto_battle']= False is_goto_battle= character_data[u'goto_battle'] if is_goto_battle : goto_battle_count += 1 ui_prepare_character= UIPrepareCharacter( self, character_data ) if is_goto_battle : index= self.get_character_middle_index() else : index= 0 self.character_list.add_widget( ui_prepare_character, index ) ui_prepare_character.is_goto_battle= is_goto_battle ui_prepare_character.is_selected= False ui_prepare_character.image= character_data[u'image'] ui_prepare_character.name= character_data[u'name'] self.setup_skill_icons_using( ui_prepare_character ) if self.character_list.children : self.character_on_select( self.character_list.children[-1] ) self.update_skill_value_total() self.update_skill_value_total_max()
def sync( self ) : self.sync_selected_skill_info() show_empty= ( self.active_character is None or \ self.active_character.camp != self.self_camp or \ not isinstance( self.active_character.controller, CommandController ) or \ self.active_character.controller.actions ) if self.selected_detail.current == u'empty' and not show_empty : self.selected_detail.current= u'skills' elif self.selected_detail.current != u'empty' and show_empty : self.selected_detail.current= u'empty' if self.selected_detail.current == u'skills' : skill_src= self.active_character skills= [ ( skill_id, skill_src.get_skill( skill_id ) ) for skill_id in skill_src.skills_using ] skills= filter( lambda ( skill_id, skill ) : skill is not None, skills ) skills.sort( reverse= True, key= lambda ( skill_id, skill ) : skill_id ) len_need= len( skills ) def create_ui_skill_menu_item() : ui_skill_menu_item= Factory.UISkillMenuItem() ui_skill_menu_item.ui_combat= self ui_skill_menu_item.skill_src= None ui_skill_menu_item.skill_id= None return ui_skill_menu_item resize( self.ui_skills, len_need, create_ui_skill_menu_item ) for i in xrange( len_need ) : skill_id, skill= skills[i] ui_skill_item= self.ui_skills.children[i] ui_skill_item.skill_name= skill.name ui_skill_item.skill_src= skill_src ui_skill_item.skill_id= skill_id ui_skill_item.is_valid= skill.valid( self.combat, self.combat.objects, skill_src ) ui_skill_item.icon= skill.icon self.__update_valid_ui_targets() self.__sync_characters( self.self_character_list, self.self_camp ) self.__sync_characters( self.enemy_character_list, self.enemy_camp ) self.light_name= get_property( u'light' ).__doc__ self.light_value= self.combat.light self.light_max= self.combat.light_max self.dark_name= get_property( u'dark' ).__doc__ self.dark_value= self.combat.dark self.dark_max= self.combat.dark_max self.chaos_name= get_property( u'chaos' ).__doc__ self.chaos_value= self.combat.chaos self.chaos_max= self.combat.chaos_max
def __sync_characters( self, ui_character_list, camp ) : characters= [ character for character in self.combat.objects if character.camp == camp ] characters.sort() len_need= len( characters ) def create_ui_character() : ui_character= Factory.UICharacter() ui_character.ui_combat= self return ui_character resize( ui_character_list, len_need, create_ui_character ) assert len( ui_character_list.children ) == len_need for i, character in enumerate( characters ) : ui_character= ui_character_list.children[i] ui_character.character= character ui_character.name= character.name ui_character.image= character.image ui_character.seq= str( 1+self.combat.objects.index( character ) ) ui_character.hp_name= get_property( u'hp' ).__doc__ ui_character.hp_value= character.hp ui_character.hp_max= character.hp_max ui_character.speed_name= get_property( u'speed' ).__doc__ ui_character.speed_value= character.speed ui_character.dex_name= get_property( u'dex' ).__doc__ ui_character.dex_value= character.dex ui_character.is_active= ( character is self.active_character ) ui_character.is_invalid_target= ( self.selected_detail.current == u'skill' and \ character not in self.__valid_targets ) states= [ state for state in character.iter_states() ] len_need= len( states ) resize( ui_character.state_list, len_need, Factory.UIState ) assert( len( ui_character.state_list.children ) == len_need ) for j, state in enumerate( states ) : ui_state= ui_character.state_list.children[j] ui_state.icon= state.icon
def __parse_logs( self, name2text_timelines, logs ) : for log in logs : if isinstance( log, LogSkillCast ) : pattern= u'对 {dst} 使用了 {skill_name}' text= pattern.format( dst= log.dst_name, skill_name= log.skill_name ) full_pattern= u'{src} 对 {dst} 使用了 {skill_name}' full_text= full_pattern.format( src= log.src_name, dst= log.dst_name, skill_name= log.skill_name ) name2text_timelines[log.src_name].append( ( text, full_text, datas.ui_effects.timelines_float_text ) ) self.__parse_logs( name2text_timelines, log.logs ) elif isinstance( log, LogPropChanged ) : pattern= u'{prop} {value_delta:+}' text= pattern.format( prop= log.prop_name, value_delta= log.value_delta ) full_pattern= u'{owner} 的 {prop} {value_delta:+}' full_text= full_pattern.format( owner= log.owner_name, prop= log.prop_name, value_delta= log.value_delta ) if log.prop_name == get_property( u'hp' ).__doc__ : if log.value_delta <= 0 : timeline= datas.ui_effects.timelines_harm else : timeline= datas.ui_effects.timelines_heal else : timeline= datas.ui_effects.timelines_float_text name2text_timelines[log.owner_name].append( ( text, full_text, timeline ) ) elif isinstance( log, LogState ) : if log.logs : pattern= u'{state_name} 生效' text= pattern.format( state_name= log.state_name ) full_pattern= u'{owner} 的 {state_name} 生效' full_text= full_pattern.format( owner= log.owner_name, state_name= log.state_name ) name2text_timelines[log.owner_name].append( ( text, full_text, datas.ui_effects.timelines_float_text ) ) self.__parse_logs( name2text_timelines, log.logs ) elif isinstance( log, LogStateEnter ) : pattern= u'获得了 {state_name} 状态' text= pattern.format( state_name= log.state_name ) full_pattern= u'{owner} 获得了 {state_name} 状态' full_text= full_pattern.format( owner= log.owner_name, state_name= log.state_name ) name2text_timelines[log.owner_name].append( ( text, full_text, datas.ui_effects.timelines_float_text ) ) elif isinstance( log, LogStateLeave ) : pattern= u'失去了 {state_name} 状态' text= pattern.format( state_name= log.state_name ) full_pattern= u'{owner} 失去了 {state_name} 状态' full_text= full_pattern.format( owner= log.owner_name, state_name= log.state_name ) name2text_timelines[log.owner_name].append( ( text, full_text, datas.ui_effects.timelines_float_text ) ) elif isinstance( log, LogEvent ) : name2text_timelines[self.combat.name].append( ( log.text, log.text, log.timeline ) ) elif isinstance( log, LogEffect ) : ui_owner= self.ui_owner_by_name( log.owner_name ) if ui_owner is not None : if isinstance( ui_owner, Factory.UICharacter ) : ui_owner= ui_owner.ids.image_widget timelines= timelines_effects.get( log.effect_name, None ) if timelines : play_effect( ui_owner.canvas.after, ui_owner.center, timelines ) else : Logger.error( u'unknown log: {name}'.format( name= log.__cls__.name ) )