67 lines
2.1 KiB
C#
67 lines
2.1 KiB
C#
using Code.Configs;
|
|
using UnityEngine;
|
|
using Random = UnityEngine.Random;
|
|
|
|
namespace Code.Gameplay.Orders.Order
|
|
{
|
|
public class OrderService : IOrderService
|
|
{
|
|
public event IOrderService.OrderProgressDelegate OnOrderGiven;
|
|
public event IOrderService.OrderProgressDelegate OnOrderRecieved;
|
|
public event IOrderService.OrderDeliveredDelegate OnOrderDelivered;
|
|
public event IOrderService.OrderFailureDelegate OnOrderFailure;
|
|
|
|
private OrderState _orderState;
|
|
public OrderState OrderState => _orderState;
|
|
|
|
private float _deliveryTimer;
|
|
public float DeliveryTimer => _deliveryTimer;
|
|
|
|
private Vector2 _timeBounds;
|
|
private float _koefRooms, _koefOvertime;
|
|
|
|
private int _roomsPassed;
|
|
|
|
public OrderService(OrderServiceConfig config)
|
|
{
|
|
_orderState = OrderState.Delivered;
|
|
|
|
_timeBounds = config.timeBounds;
|
|
_koefRooms = config.koefRooms;
|
|
_koefOvertime = config.koefOvertime;
|
|
}
|
|
|
|
public void RoomPassed() => _roomsPassed++;
|
|
public void DecreaseTimer(float delta) => _deliveryTimer -= delta;
|
|
|
|
public void OrderGive()
|
|
{
|
|
_orderState = OrderState.Given;
|
|
_roomsPassed = 0;
|
|
|
|
_deliveryTimer = Random.Range(_timeBounds.x, _timeBounds.y);
|
|
OnOrderGiven?.Invoke(_deliveryTimer);
|
|
}
|
|
|
|
public void OrderRecieved()
|
|
{
|
|
_orderState = OrderState.Recieved;
|
|
OnOrderRecieved?.Invoke(_deliveryTimer);
|
|
}
|
|
public void OrderFailed() => OnOrderFailure?.Invoke();
|
|
|
|
public void OrderDelivered()
|
|
{
|
|
if (_orderState != OrderState.Recieved)
|
|
{
|
|
OnOrderFailure?.Invoke();
|
|
return;
|
|
}
|
|
|
|
_orderState = OrderState.Delivered;
|
|
|
|
int score = (int)(_koefRooms * _roomsPassed + _deliveryTimer * _koefOvertime);
|
|
OnOrderDelivered?.Invoke(score, _deliveryTimer);
|
|
}
|
|
}
|
|
} |