forked from LibraStack/Match3-SDK
-
Notifications
You must be signed in to change notification settings - Fork 0
/
AppContext.cs
118 lines (100 loc) · 3.52 KB
/
AppContext.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
using System;
using System.Collections.Generic;
using Common;
using Common.Interfaces;
using Common.Models;
using Common.SpecialItemDetectors;
using FillStrategies;
using Match3.App;
using Match3.App.Interfaces;
using Match3.Template;
using Match3.Template.Interfaces;
using Match3.Template.SequenceDetectors;
using UnityEngine;
public class AppContext : MonoBehaviour, IAppContext
{
[SerializeField] private GameUiCanvas _gameUiCanvas;
[SerializeField] private CanvasInputSystem _inputSystem;
[SerializeField] private UnityGameBoardRenderer _gameBoardRenderer;
[Space]
[SerializeField] private GameObject _itemPrefab;
[Space]
[SerializeField] private IconsSetModel[] _iconSets;
public void Construct()
{
_registeredTypes = new Dictionary<Type, object>();
RegisterInstance<IInputSystem>(_inputSystem);
RegisterInstance<IconsSetModel[]>(_iconSets);
RegisterInstance<IGameUiCanvas>(_gameUiCanvas);
RegisterInstance<IUnityGameBoardRenderer, IGameBoardDataProvider<IUnityGridSlot>>(_gameBoardRenderer);
RegisterInstance<UnityGame>(GetUnityGame());
RegisterInstance<IUnityItemGenerator, IItemsPool<IUnityItem>>(GetItemGenerator());
RegisterInstance<IBoardFillStrategy<IUnityGridSlot>[]>(GetBoardFillStrategies());
}
private Dictionary<Type, object> _registeredTypes;
public T Resolve<T>()
{
return (T) _registeredTypes[typeof(T)];
}
private void RegisterInstance<T>(T instance)
{
_registeredTypes.Add(typeof(T), instance);
}
private void RegisterInstance<T1, T2>(object instance)
{
_registeredTypes.Add(typeof(T1), instance);
_registeredTypes.Add(typeof(T2), instance);
}
private UnityGame GetUnityGame()
{
var gameConfig = new GameConfig<IUnityGridSlot>
{
GameBoardDataProvider = _gameBoardRenderer,
ItemSwapper = new AnimatedItemSwapper(),
LevelGoalsProvider = new LevelGoalsProvider(),
GameBoardSolver = GetGameBoardSolver(),
SolvedSequencesConsumers = GetSolvedSequencesConsumers()
};
return new UnityGame(_inputSystem, _gameBoardRenderer, gameConfig);
}
private UnityItemGenerator GetItemGenerator()
{
return new UnityItemGenerator(_itemPrefab, new GameObject("ItemsPool").transform);
}
private IGameBoardSolver<IUnityGridSlot> GetGameBoardSolver()
{
return new GameBoardSolver<IUnityGridSlot>(GetSequenceDetectors(), GetSpecialItemDetectors());
}
private ISequenceDetector<IUnityGridSlot>[] GetSequenceDetectors()
{
return new ISequenceDetector<IUnityGridSlot>[]
{
new VerticalLineDetector<IUnityGridSlot>(),
new HorizontalLineDetector<IUnityGridSlot>()
};
}
private ISpecialItemDetector<IUnityGridSlot>[] GetSpecialItemDetectors()
{
return new ISpecialItemDetector<IUnityGridSlot>[]
{
new StoneItemDetector(),
new IceItemDetector()
};
}
private ISolvedSequencesConsumer<IUnityGridSlot>[] GetSolvedSequencesConsumers()
{
return new ISolvedSequencesConsumer<IUnityGridSlot>[]
{
new GameScoreBoard()
};
}
private IBoardFillStrategy<IUnityGridSlot>[] GetBoardFillStrategies()
{
return new IBoardFillStrategy<IUnityGridSlot>[]
{
new SimpleFillStrategy(this),
new FallDownFillStrategy(this),
new SlideDownFillStrategy(this)
};
}
}