Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified .build/Build/.build.data.gz
Binary file not shown.
Binary file modified .build/Build/.build.framework.js.gz
Binary file not shown.
Binary file modified .build/Build/.build.wasm.gz
Binary file not shown.
Binary file modified .build/index.zip
Binary file not shown.
9 changes: 4 additions & 5 deletions Assets/Scripts/Game/GameService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
using ServiceLocator.Sound;
using ServiceLocator.UI;

public class GameService : GenericMonoSingleton<GameService>
public class GameService : MonoBehaviour
{
public PlayerService PlayerService { get; private set; }
public EventService EventService { get; private set; }
Expand All @@ -31,7 +31,7 @@ public class GameService : GenericMonoSingleton<GameService>
[SerializeField] private AudioSource audioEffects;
[SerializeField] private AudioSource backgroundMusic;

protected override void Initialize()
private void Awake()
{
initializeServices();
injectDependencies();
Expand All @@ -49,8 +49,8 @@ private void initializeServices()
private void injectDependencies() {
PlayerService.Init(MapService, SoundService, UIService);
MapService.Init(EventService);
WaveService.Init(EventService, MapService, SoundService, UIService);
UIService.Init(EventService, WaveService);
WaveService.Init(EventService, MapService, PlayerService, SoundService, UIService);
UIService.Init(EventService, PlayerService, WaveService);
}

private void Start()
Expand All @@ -61,7 +61,6 @@ private void Start()
SoundService.Start();
}


private void Update()
{
PlayerService.Update();
Expand Down
8 changes: 6 additions & 2 deletions Assets/Scripts/Player/MonkeyController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,19 @@ public class MonkeyController
private float attackTimer;
private List<BloonController> bloons;

public MonkeyController(MonkeyScriptableObject monkeyScriptableObject, ProjectilePool projectilePool)
private SoundService soundService;

public MonkeyController(MonkeyScriptableObject monkeyScriptableObject, ProjectilePool projectilePool, SoundService soundService)
{
this.monkeyScriptableObject = monkeyScriptableObject;
this.projectilePool = projectilePool;
this.soundService = soundService;

bloons = new List<BloonController>();

CreateMonkeyView();
ResetAttackTimer();
this.soundService = soundService;
}

private void CreateMonkeyView()
Expand Down Expand Up @@ -72,7 +76,7 @@ private void ShootAtTarget(BloonController bloon)
ProjectileController projectile = projectilePool.GetProjectile(monkeyScriptableObject.projectileType);
projectile.SetPosition(monkeyView.transform.position);
projectile.SetTarget(bloon);
GameService.Instance.SoundService.PlaySoundEffects(Sound.SoundType.MonkeyShoot);
soundService.PlaySoundEffects(Sound.SoundType.MonkeyShoot);
ResetAttackTimer();
}
}
Expand Down
4 changes: 2 additions & 2 deletions Assets/Scripts/Player/PlayerService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public void Init(MapService mapService, SoundService soundService, UIService uiS

public void Start()
{
projectilePool = new ProjectilePool(playerScriptableObject.ProjectilePrefab, playerScriptableObject.ProjectileScriptableObjects);
projectilePool = new ProjectilePool(playerScriptableObject.ProjectilePrefab, playerScriptableObject.ProjectileScriptableObjects, this);
}

private void InitializeVariables()
Expand Down Expand Up @@ -120,7 +120,7 @@ public void TrySpawningMonkey(MonkeyType monkeyType, int monkeyCost, Vector3 dro
public void SpawnMonkey(MonkeyType monkeyType, Vector3 spawnPosition)
{
MonkeyScriptableObject monkeyScriptableObject = GetMonkeyScriptableObjectByType(monkeyType);
MonkeyController monkey = new MonkeyController(monkeyScriptableObject, projectilePool);
MonkeyController monkey = new MonkeyController(monkeyScriptableObject, projectilePool, soundService);
monkey.SetPosition(spawnPosition);
activeMonkeys.Add(monkey);

Expand Down
8 changes: 6 additions & 2 deletions Assets/Scripts/Player/Projectile/ProjectileController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,12 @@ public class ProjectileController
private BloonController target;
private ProjectileState currentState;

public ProjectileController(ProjectileView projectilePrefab, Transform projectileContainer)
private PlayerService playerService;

public ProjectileController(ProjectileView projectilePrefab, Transform projectileContainer, PlayerService playerService)
{
this.playerService = playerService;

projectileView = Object.Instantiate(projectilePrefab, projectileContainer);
projectileView.SetController(this);
}
Expand Down Expand Up @@ -61,7 +65,7 @@ public void ResetProjectile()
{
target = null;
projectileView.gameObject.SetActive(false);
GameService.Instance.PlayerService.ReturnProjectileToPool(this);
playerService.ReturnProjectileToPool(this);
}

private void SetState(ProjectileState newState) => currentState = newState;
Expand Down
7 changes: 5 additions & 2 deletions Assets/Scripts/Player/Projectile/ProjectilePool.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,14 @@ public class ProjectilePool : GenericObjectPool<ProjectileController>
private List<ProjectileScriptableObject> projectileScriptableObjects;
private Transform projectileContainer;

public ProjectilePool(ProjectileView projectilePrefab, List<ProjectileScriptableObject> projectileScriptableObjects)
private PlayerService playerService;

public ProjectilePool(ProjectileView projectilePrefab, List<ProjectileScriptableObject> projectileScriptableObjects, PlayerService playerService)
{
this.projectilePrefab = projectilePrefab;
this.projectileScriptableObjects = projectileScriptableObjects;
this.projectileContainer = new GameObject("Projectile Container").transform;
this.playerService = playerService;
}

public ProjectileController GetProjectile(ProjectileType projectileType)
Expand All @@ -31,6 +34,6 @@ public ProjectileController GetProjectile(ProjectileType projectileType)
return projectile;
}

protected override ProjectileController CreateItem() => new ProjectileController(projectilePrefab, projectileContainer);
protected override ProjectileController CreateItem() => new ProjectileController(projectilePrefab, projectileContainer, playerService);
}
}
8 changes: 7 additions & 1 deletion Assets/Scripts/UI/MapButton.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,15 @@ public class MapButton : MonoBehaviour
{
[SerializeField] private int MapId;

private EventService eventService;
public void Init(EventService eventService)
{
this.eventService = eventService;
}

private void Start() => GetComponent<Button>().onClick.AddListener(OnMapButtonClicked);

// To Learn more about Events and Observer Pattern, check out the course list here: https://outscal.com/courses
private void OnMapButtonClicked() => GameService.Instance.EventService.OnMapSelected.InvokeEvent(MapId);
private void OnMapButtonClicked() => eventService.OnMapSelected.InvokeEvent(MapId);
}
}
10 changes: 7 additions & 3 deletions Assets/Scripts/UI/MonkeySelectionPanel/MonkeyCellController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,26 @@ public class MonkeyCellController
private MonkeyCellView monkeyCellView;
private MonkeyCellScriptableObject monkeyCellSO;

public MonkeyCellController(Transform cellContainer, MonkeyCellView monkeyCellPrefab, MonkeyCellScriptableObject monkeyCellScriptableObject)
private PlayerService playerService;

public MonkeyCellController(Transform cellContainer, MonkeyCellView monkeyCellPrefab, MonkeyCellScriptableObject monkeyCellScriptableObject, PlayerService playerService)
{
this.monkeyCellSO = monkeyCellScriptableObject;
this.playerService = playerService;

monkeyCellView = Object.Instantiate(monkeyCellPrefab, cellContainer);
monkeyCellView.SetController(this);
monkeyCellView.ConfigureCellUI(monkeyCellSO.Sprite, monkeyCellSO.Name, monkeyCellSO.Cost);
}

public void MonkeyDraggedAt(Vector3 dragPosition)
{
GameService.Instance.PlayerService.ValidateSpawnPosition(monkeyCellSO.Cost, dragPosition);
playerService.ValidateSpawnPosition(monkeyCellSO.Cost, dragPosition);
}

public void MonkeyDroppedAt(Vector3 dropPosition)
{
GameService.Instance.PlayerService.TrySpawningMonkey(monkeyCellSO.Type, monkeyCellSO.Cost, dropPosition);
playerService.TrySpawningMonkey(monkeyCellSO.Type, monkeyCellSO.Cost, dropPosition);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ public class MonkeySelectionUIController
private Transform cellContainer;
private List<MonkeyCellController> monkeyCellControllers;

public MonkeySelectionUIController(Transform cellContainer, MonkeyCellView monkeyCellPrefab, List<MonkeyCellScriptableObject> monkeyCellScriptableObjects)
public MonkeySelectionUIController(Transform cellContainer, MonkeyCellView monkeyCellPrefab, List<MonkeyCellScriptableObject> monkeyCellScriptableObjects, PlayerService playerService)
{
this.cellContainer = cellContainer;
monkeyCellControllers = new List<MonkeyCellController>();

foreach (MonkeyCellScriptableObject monkeySO in monkeyCellScriptableObjects)
{
MonkeyCellController monkeyCell = new MonkeyCellController(cellContainer, monkeyCellPrefab, monkeySO);
MonkeyCellController monkeyCell = new MonkeyCellController(cellContainer, monkeyCellPrefab, monkeySO, playerService);
monkeyCellControllers.Add(monkeyCell);
}
}
Expand Down
11 changes: 9 additions & 2 deletions Assets/Scripts/UI/UIService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using ServiceLocator.Events;
using ServiceLocator.Wave;
using ServiceLocator.Utilities;
using ServiceLocator.Player;

namespace ServiceLocator.UI
{
Expand Down Expand Up @@ -38,16 +39,22 @@ public class UIService : MonoBehaviour

private EventService eventService;
private WaveService waveService;
private PlayerService playerService;

public void Init(EventService eventService, WaveService waveService)
public void Init(EventService eventService, PlayerService playerService, WaveService waveService)
{
this.eventService = eventService;
this.playerService = playerService;
this.waveService = waveService;
}

private void Start()
{
monkeySelectionController = new MonkeySelectionUIController(cellContainer, monkeyCellPrefab, monkeyCellScriptableObjects);
if (Map1Button.TryGetComponent<MapButton>(out MapButton mapButton)) {
mapButton.Init(eventService);
}

monkeySelectionController = new MonkeySelectionUIController(cellContainer, monkeyCellPrefab, monkeyCellScriptableObjects, playerService);
MonkeySelectionPanel.SetActive(false);
monkeySelectionController.SetActive(false);

Expand Down
22 changes: 15 additions & 7 deletions Assets/Scripts/Wave/Bloons/BloonController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,18 @@ public class BloonController
private int currentWaypointIndex;
private BloonState currentState;

private SoundService soundService;
private WaveService waveService;
private PlayerService playerService;

public Vector3 Position => bloonView.transform.position;

public BloonController(BloonView bloonPrefab, Transform bloonContainer)
public BloonController(BloonView bloonPrefab, Transform bloonContainer, PlayerService playerService, SoundService soundService, WaveService waveService)
{
this.playerService = playerService;
this.soundService = soundService;
this.waveService = waveService;

bloonView = Object.Instantiate(bloonPrefab, bloonContainer);
bloonView.Controller = this;
}
Expand Down Expand Up @@ -60,7 +68,7 @@ public void TakeDamage(int damageToTake)
if (currentHealth <= 0 && currentState == BloonState.ACTIVE)
{
PopBloon();
GameService.Instance.SoundService.PlaySoundEffects(Sound.SoundType.BloonPop);
soundService.PlaySoundEffects(Sound.SoundType.BloonPop);
}
}

Expand All @@ -85,8 +93,8 @@ public void FollowWayPoints()

private void ResetBloon()
{
GameService.Instance.WaveService.RemoveBloon(this);
GameService.Instance.PlayerService.TakeDamage(bloonScriptableObject.Damage);
waveService.RemoveBloon(this);
playerService.TakeDamage(bloonScriptableObject.Damage);
bloonView.gameObject.SetActive(false);
}

Expand All @@ -105,13 +113,13 @@ public void OnPopAnimationPlayed()
if (HasLayeredBloons())
SpawnLayeredBloons();

GameService.Instance.PlayerService.GetReward(bloonScriptableObject.Reward);
GameService.Instance.WaveService.RemoveBloon(this);
playerService.GetReward(bloonScriptableObject.Reward);
waveService.RemoveBloon(this);
}

private bool HasLayeredBloons() => bloonScriptableObject.LayeredBloons.Count > 0;

private void SpawnLayeredBloons() => GameService.Instance.WaveService.SpawnBloons(bloonScriptableObject.LayeredBloons,
private void SpawnLayeredBloons() => waveService.SpawnBloons(bloonScriptableObject.LayeredBloons,
bloonView.transform.position,
currentWaypointIndex,
bloonScriptableObject.LayerBloonSpawnRate);
Expand Down
12 changes: 10 additions & 2 deletions Assets/Scripts/Wave/Bloons/BloonPool.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,19 @@ public class BloonPool : GenericObjectPool<BloonController>
private List<BloonScriptableObject> bloonScriptableObjects;
private Transform bloonContainer;

public BloonPool(WaveScriptableObject waveScriptableObject)
private PlayerService playerService;
private SoundService soundService;
private WaveService waveService;

public BloonPool(WaveScriptableObject waveScriptableObject, PlayerService playerService, SoundService soundService, WaveService waveService)
{
this.bloonPrefab = waveScriptableObject.BloonPrefab;
this.bloonScriptableObjects = waveScriptableObject.BloonScriptableObjects;
this.bloonContainer = new GameObject("Bloon Container").transform;

this.playerService = playerService;
this.soundService = soundService;
this.waveService = waveService;
}

public BloonController GetBloon(BloonType bloonType)
Expand All @@ -33,6 +41,6 @@ public BloonController GetBloon(BloonType bloonType)
return bloon;
}

protected override BloonController CreateItem() => new BloonController(bloonPrefab, bloonContainer);
protected override BloonController CreateItem() => new BloonController(bloonPrefab, bloonContainer, playerService, soundService, waveService);
}
}
7 changes: 5 additions & 2 deletions Assets/Scripts/Wave/WaveService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using ServiceLocator.Sound;
using ServiceLocator.Utilities;
using ServiceLocator.Map;
using ServiceLocator.Player;

namespace ServiceLocator.Wave
{
Expand All @@ -23,15 +24,17 @@ public class WaveService
private MapService mapService;
private SoundService soundService;
private UIService uiService;
private PlayerService playerService;

public WaveService(WaveScriptableObject waveScriptableObject) {
this.waveScriptableObject = waveScriptableObject;
}

public void Init(EventService eventService, MapService mapService, SoundService soundService, UIService uiService)
public void Init(EventService eventService, MapService mapService, PlayerService playerService, SoundService soundService, UIService uiService)
{
this.eventService = eventService;
this.mapService = mapService;
this.playerService = playerService;
this.soundService = soundService;
this.uiService = uiService;
}
Expand All @@ -44,7 +47,7 @@ public void Start()

private void InitializeBloons()
{
bloonPool = new BloonPool(waveScriptableObject);
bloonPool = new BloonPool(waveScriptableObject, playerService, soundService, this);
activeBloons = new List<BloonController>();
}

Expand Down