MVC shop project for software architecture, in Unity.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

146 lines
6.4 KiB

using System;
using System.Collections;
using System.Collections.Generic;
/// <summary>
/// This class defines a basic inventory
/// </summary>
public class Inventory : IModelObservable<Item> // Borrowing the model observable here. Probably nothing will sub for items removed and such, but transactions are important! Lazy though, should split the observable
{
public int Money { get; private set; } //Getter for the money, the views need it to display the amount of money.
private List<Item> itemList = new List<Item>(); //Items in the inventory
private List<IShopModelObserver<Item>> observers; // Mostly here for things that want to be up to date on transactions
//Set up the inventory with item count and money
public Inventory(int pItemCount, int pMoney) : this(pMoney)
{
PopulateInventory(pItemCount);
}
public Inventory(int pMoney)
{
Money = pMoney;
observers = new List<IShopModelObserver<Item>>();
}
//------------------------------------------------------------------------------------------------------------------------
// GetItems()
//------------------------------------------------------------------------------------------------------------------------
//Returns a list with all current items in the shop.
public List<Item> GetItems()
{
return new List<Item>(itemList); //Returns a copy of the list, so the original is kept intact,
//however this is shallow copy of the original list, so changes in
//the original list will likely influence the copy, apply
//creational patterns like prototype to fix this.
}
//------------------------------------------------------------------------------------------------------------------------
// GetItemCount()
//------------------------------------------------------------------------------------------------------------------------
//Returns the number of items
public int GetItemCount()
{
return itemList.Count;
}
//------------------------------------------------------------------------------------------------------------------------
// GetItemByIndex()
//------------------------------------------------------------------------------------------------------------------------
//Attempts to get an item, specified by index, returns null if unsuccessful. Depends on how you set up your shop, it might be
//a good idea to return a copy of the original item.
public Item GetItemByIndex(int index)
{
if (index >= 0 && index < itemList.Count)
{
return itemList[index];
}
else
{
return null;
}
}
//------------------------------------------------------------------------------------------------------------------------
// AddItem()
//------------------------------------------------------------------------------------------------------------------------
//Adds an item to the inventory's item list.
public void AddItem(Item item)
{
itemList.Add(item);//In your setup, what would happen if you add an item that's already existed in the list?
}
//------------------------------------------------------------------------------------------------------------------------
// RemoveItem()
//------------------------------------------------------------------------------------------------------------------------
//Attempts to remove an item, fails silently.
public void Remove(Item item)
{
if (itemList.Contains(item))
{
itemList.Remove(item);
}
}
//------------------------------------------------------------------------------------------------------------------------
// RemoveItemByIndex()
//------------------------------------------------------------------------------------------------------------------------
//Attempts to remove an item, specified by index, fails silently.
public void RemoveItemByIndex(int index)
{
if (index >= 0 && index < itemList.Count)
{
itemList.RemoveAt(index);
}
}
//------------------------------------------------------------------------------------------------------------------------
// PopulateInventory()
//------------------------------------------------------------------------------------------------------------------------
//This is obviously not how you should generate items. For this assignment you need either an abstract item factory, or
//make this into a factory method.
private void PopulateInventory(int itemCount)
{
Random random = new Random();
for (int index = 0; index < itemCount; index++)
{
Item item = new ItemWeapon("Student Sword", "items_" + random.Next(73, 145), 50,0,0); //item name, item icon, cost
itemList.Add(item);
}
}
public void ChangeBalance(int change)
{
if (Money + change < 0)
throw new NotEnoughMoneyException(); // We can't change the balance if it's too expensive
Money += change;
NotifyObservers();
}
//Think of other necessary functions for the inventory based on your design of the shop. Don't forget to unit test all the functions.
public IDisposable RegisterObserver(IShopModelObserver<Item> observer)
{
// Check whether observer is already registered. If not, add it
if (! observers.Contains(observer)) {
observers.Add(observer);
// Provide observer with existing data.
observer.OnTransaction(Money);
}
return new Unsubscriber<Item>(observers, observer);
}
public void RemoveObserver(IShopModelObserver<Item> observer)
{
if (observers.Contains(observer))
observers.Remove(observer);
}
private void NotifyObservers()
{
foreach (var observer in observers)
{
observer.OnTransaction(Money);
}
}
}