feat: add ai type and state info

This commit is contained in:
Иванов Иван 2024-08-24 12:13:40 +02:00
parent ee37ffb219
commit f50e218013
7 changed files with 78 additions and 30 deletions

View File

@ -1,4 +1,5 @@
using Client.Domain.Common; using Client.Domain.AI;
using Client.Domain.Common;
using Client.Domain.Entities; using Client.Domain.Entities;
using Client.Domain.ValueObjects; using Client.Domain.ValueObjects;
using System; using System;
@ -59,13 +60,6 @@ namespace Client.Application.ViewModels
return hero.InventoryInfo; return hero.InventoryInfo;
} }
} }
public ulong Money
{
get
{
return 0;
}
}
public TargetSummaryInfoViewModel? Target public TargetSummaryInfoViewModel? Target
{ {
@ -81,10 +75,24 @@ namespace Client.Application.ViewModels
return hero.AttackerIds.ToList(); return hero.AttackerIds.ToList();
} }
} }
public HeroSummaryInfoViewModel(Hero hero) public string AIType
{
get
{
return ai.Type.ToString();
}
}
public string AIState
{
get
{
return ai.IsEnabled ? ai.CurrentState.ToString() : "Disabled";
}
}
public HeroSummaryInfoViewModel(Hero hero, AIInterface ai)
{ {
this.hero = hero; this.hero = hero;
this.ai = ai;
hero.FullName.PropertyChanged += FullName_PropertyChanged; hero.FullName.PropertyChanged += FullName_PropertyChanged;
hero.Phenotype.PropertyChanged += Phenotype_PropertyChanged; hero.Phenotype.PropertyChanged += Phenotype_PropertyChanged;
hero.ExperienceInfo.PropertyChanged += ExperienceInfo_PropertyChanged; hero.ExperienceInfo.PropertyChanged += ExperienceInfo_PropertyChanged;
@ -92,6 +100,19 @@ namespace Client.Application.ViewModels
hero.VitalStats.PropertyChanged += VitalStats_PropertyChanged; hero.VitalStats.PropertyChanged += VitalStats_PropertyChanged;
hero.InventoryInfo.PropertyChanged += InventoryInfo_PropertyChanged; hero.InventoryInfo.PropertyChanged += InventoryInfo_PropertyChanged;
hero.PropertyChanged += Hero_PropertyChanged; hero.PropertyChanged += Hero_PropertyChanged;
ai.PropertyChanged += Ai_PropertyChanged;
}
private void Ai_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == "Type")
{
OnPropertyChanged("AIType");
}
if (e.PropertyName == "CurrentState" || e.PropertyName == "IsEnabled")
{
OnPropertyChanged("AIState");
}
} }
private void Hero_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) private void Hero_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
@ -147,6 +168,7 @@ namespace Client.Application.ViewModels
} }
private readonly Hero hero; private readonly Hero hero;
private readonly AIInterface ai;
private TargetSummaryInfoViewModel? target; private TargetSummaryInfoViewModel? target;
} }
} }

View File

@ -39,7 +39,7 @@ namespace Client.Application.ViewModels
public void Handle(HeroCreatedEvent @event) public void Handle(HeroCreatedEvent @event)
{ {
Hero = new HeroSummaryInfoViewModel(@event.Hero); Hero = new HeroSummaryInfoViewModel(@event.Hero, ai);
hero = @event.Hero; hero = @event.Hero;
Map.Hero = hero; Map.Hero = hero;
Map.CombatZone = new AICombatZoneMapViewModel(aiConfig.Combat.Zone, hero); Map.CombatZone = new AICombatZoneMapViewModel(aiConfig.Combat.Zone, hero);

View File

@ -225,8 +225,8 @@
<TextBlock Padding="0 0 0 3">Position:</TextBlock> <TextBlock Padding="0 0 0 3">Position:</TextBlock>
<TextBlock Padding="0 0 0 3">Exp:</TextBlock> <TextBlock Padding="0 0 0 3">Exp:</TextBlock>
<TextBlock Padding="0 0 0 3">Weight:</TextBlock> <TextBlock Padding="0 0 0 3">Weight:</TextBlock>
<TextBlock Padding="0 0 0 3">Adena:</TextBlock>
<TextBlock Padding="0 0 0 3">Inv. slots:</TextBlock> <TextBlock Padding="0 0 0 3">Inv. slots:</TextBlock>
<TextBlock Padding="0 0 0 3">AI:</TextBlock>
</StackPanel> </StackPanel>
<StackPanel> <StackPanel>
<TextBlock Padding="0 0 0 3"> <TextBlock Padding="0 0 0 3">
@ -254,7 +254,6 @@
</MultiBinding> </MultiBinding>
</TextBlock.Text> </TextBlock.Text>
</TextBlock> </TextBlock>
<TextBlock Text="{Binding Path=Money, Mode=OneWay}" Padding="0 0 0 3"></TextBlock>
<TextBlock Padding="0 0 0 3"> <TextBlock Padding="0 0 0 3">
<TextBlock.Text> <TextBlock.Text>
<MultiBinding StringFormat="{}{0}/{1}"> <MultiBinding StringFormat="{}{0}/{1}">
@ -263,6 +262,14 @@
</MultiBinding> </MultiBinding>
</TextBlock.Text> </TextBlock.Text>
</TextBlock> </TextBlock>
<TextBlock Padding="0 0 0 3">
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} ({1})">
<Binding Path="AIType" Mode="OneWay"/>
<Binding Path="AIState" Mode="OneWay"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel> </StackPanel>
</DockPanel> </DockPanel>
<StackPanel Grid.Column="1" DataContext="{Binding Target, Mode=OneWay}" Visibility="{Binding Path=.,Converter={StaticResource NullToVisibilityConverter}}" Margin="4"> <StackPanel Grid.Column="1" DataContext="{Binding Target, Mode=OneWay}" Visibility="{Binding Path=.,Converter={StaticResource NullToVisibilityConverter}}" Margin="4">

View File

@ -1,4 +1,5 @@
using Client.Domain.AI.State; using Client.Domain.AI.State;
using Client.Domain.Common;
using Client.Domain.Entities; using Client.Domain.Entities;
using Client.Domain.Events; using Client.Domain.Events;
using Client.Domain.Service; using Client.Domain.Service;
@ -13,7 +14,7 @@ using System.Windows.Input;
namespace Client.Domain.AI namespace Client.Domain.AI
{ {
public class AI : AIInterface public class AI : ObservableObject, AIInterface
{ {
public AI(WorldHandler worldHandler, Config config, AsyncPathMoverInterface asyncPathMover, TransitionBuilderLocator locator) public AI(WorldHandler worldHandler, Config config, AsyncPathMoverInterface asyncPathMover, TransitionBuilderLocator locator)
{ {
@ -27,16 +28,17 @@ namespace Client.Domain.AI
public void Toggle() public void Toggle()
{ {
isEnabled = !isEnabled; IsEnabled = !IsEnabled;
if (isEnabled) if (IsEnabled)
{ {
ResetState(); ResetState();
} }
} }
public bool IsEnabled => isEnabled; public bool IsEnabled { get { return isEnabled; } private set { if (isEnabled != value) { isEnabled = value; OnPropertyChanged(); } } }
public TypeEnum Type { get { return type; } set { if (type != value) { type = value; ResetState(); } } } public TypeEnum Type { get { return type; } set { if (type != value) { type = value; ResetState(); OnPropertyChanged(); } } }
public BaseState.Type CurrentState { get { return currentState; } private set { if (currentState != value) { currentState = value; OnPropertyChanged(); } } }
public async Task Update() public async Task Update()
{ {
@ -44,19 +46,18 @@ namespace Client.Domain.AI
await Task.Run(() => await Task.Run(() =>
{ {
if (isEnabled && worldHandler.Hero != null) if (IsEnabled && worldHandler.Hero != null)
{ {
states[currentState].Execute(); states[CurrentState].Execute();
foreach (var transition in locator.Get(Type).Build(worldHandler, config, asyncPathMover)) foreach (var transition in locator.Get(Type).Build(worldHandler, config, asyncPathMover))
{ {
if (transition.fromStates.ContainsKey(BaseState.Type.Any) && transition.toState != currentState || transition.fromStates.ContainsKey(currentState)) if (transition.fromStates.ContainsKey(BaseState.Type.Any) && transition.toState != CurrentState || transition.fromStates.ContainsKey(CurrentState))
{ {
if (transition.predicate(states[currentState])) if (transition.predicate(states[CurrentState]))
{ {
states[currentState].OnLeave(); states[CurrentState].OnLeave();
currentState = transition.toState; CurrentState = transition.toState;
Debug.WriteLine(currentState.ToString()); states[CurrentState].OnEnter();
states[currentState].OnEnter();
break; break;
} }
} }
@ -87,7 +88,7 @@ namespace Client.Domain.AI
private void ResetState() private void ResetState()
{ {
currentState = BaseState.Type.Idle; CurrentState = BaseState.Type.Idle;
} }
private readonly WorldHandler worldHandler; private readonly WorldHandler worldHandler;

View File

@ -1,4 +1,6 @@
using Client.Domain.Events; using Client.Domain.AI.State;
using Client.Domain.Common;
using Client.Domain.Events;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data; using System.Data;
@ -8,7 +10,7 @@ using System.Threading.Tasks;
namespace Client.Domain.AI namespace Client.Domain.AI
{ {
public interface AIInterface public interface AIInterface : ObservableObjectInterface
{ {
Task Update(); Task Update();
@ -17,5 +19,6 @@ namespace Client.Domain.AI
bool IsEnabled { get; } bool IsEnabled { get; }
TypeEnum Type { get; set; } TypeEnum Type { get; set; }
BaseState.Type CurrentState { get; }
} }
} }

View File

@ -8,7 +8,7 @@ using System.Threading.Tasks;
namespace Client.Domain.Common namespace Client.Domain.Common
{ {
public class ObservableObject : INotifyPropertyChanged public class ObservableObject : ObservableObjectInterface
{ {
public event PropertyChangedEventHandler? PropertyChanged; public event PropertyChangedEventHandler? PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string prop = "") public void OnPropertyChanged([CallerMemberName] string prop = "")

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace Client.Domain.Common
{
public interface ObservableObjectInterface : INotifyPropertyChanged
{
void OnPropertyChanged([CallerMemberName] string prop = "");
}
}