Merge branch 'develop' of bitbucket.org:usaya/popcorn into develop

This commit is contained in:
koya_15 2021-09-16 11:55:40 +09:00
commit 136721c3fb
6 changed files with 161 additions and 64 deletions

View File

@ -680,6 +680,18 @@ RectTransform:
type: 3} type: 3}
m_PrefabInstance: {fileID: 219610911} m_PrefabInstance: {fileID: 219610911}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
--- !u!114 &219610916 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 3664916832512110619, guid: caaa748dbeed576499e8cae74d33f689,
type: 3}
m_PrefabInstance: {fileID: 219610911}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 351b4ffae35e149bf81549887561d561, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &493087540 --- !u!1 &493087540
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -984,6 +996,7 @@ GameObject:
m_Component: m_Component:
- component: {fileID: 586451195} - component: {fileID: 586451195}
- component: {fileID: 586451196} - component: {fileID: 586451196}
- component: {fileID: 586451197}
m_Layer: 0 m_Layer: 0
m_Name: Manager m_Name: Manager
m_TagString: Untagged m_TagString: Untagged
@ -1019,6 +1032,24 @@ MonoBehaviour:
m_EditorClassIdentifier: m_EditorClassIdentifier:
tastingButton: {fileID: 1280872481} tastingButton: {fileID: 1280872481}
view: {fileID: 639967259} view: {fileID: 639967259}
--- !u!114 &586451197
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 586451194}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 60b7ac089a534e549c0e25a89b113261, type: 3}
m_Name:
m_EditorClassIdentifier:
coinIconTransform: {fileID: 0}
coinCountText: {fileID: 219610916}
coinAnimator: {fileID: 0}
coinPrefab: {fileID: 0}
duration: 0.5
rootTransform: {fileID: 0}
--- !u!1 &613202084 --- !u!1 &613202084
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

View File

@ -22,36 +22,12 @@ public class ProductManagement : MonoBehaviour
state.AddTo(this); state.AddTo(this);
state.Value = ManagementState.None; state.Value = ManagementState.None;
var gameData = GameDataManager.GameData; var gameData = GameDataManager.GameData;
// CoinManager.Instance.ChangeCoin(gameData.coin); CoinManager.Instance.ChangeCoin(gameData.coin);
HeartMeter.Instance.SetHeart(gameData.Heart);
// タンクデータ読み込み
gameData.StorageTanks = new List<StorageTank>
{
new StorageTank(){Id = 1, Capacity = 50, FlavorId = 1, Stocks = new List<ProductStockData>{new ProductStockData{Rarity = ProductRarity.Normal, Stock = 0}}},
new StorageTank(){Id = 2, Capacity = 50, FlavorId = 1, Stocks = new List<ProductStockData>
{
new ProductStockData{Rarity = ProductRarity.Normal, Stock = 1},
new ProductStockData{Rarity = ProductRarity.Yellow, Stock = 20},
new ProductStockData{Rarity = ProductRarity.Copper, Stock = 1},
new ProductStockData{Rarity = ProductRarity.Rainbow, Stock = 10},
}},
// new StorageTank(){Id = 3, Capacity = 50, FlavorId = 1, Stocks = new List<ProductStockData>{new ProductStockData{Rarity = ProductRarity.Yellow, Stock = 2}}},
new StorageTank(){Id = 5, Capacity = 50, FlavorId = 1, Stocks = new List<ProductStockData>{new ProductStockData{Rarity = ProductRarity.Gold, Stock = 4}}},
};
// 補充方法設定 // 補充方法設定
view.SetRefillType(gameData.RefillMode); view.SetRefillType(gameData.RefillMode);
// TankOrderを更新
Debug.Log(gameData.TankOrder.Aggregate(new StringBuilder(), (builder, i) => builder.Append(i)).ToString());
if (gameData.TankOrder.Length != gameData.StorageTanks.Count)
{
var excepts = gameData.StorageTanks.Select(x => x.Id).Except(gameData.TankOrder);
Debug.Log(excepts.Aggregate("", (s, i) => $"{s},{i}"));
var tmpTankOrder = gameData.TankOrder.ToList();
tmpTankOrder.AddRange(excepts);
gameData.TankOrder = tmpTankOrder.ToArray();
Debug.Log(gameData.TankOrder.Aggregate("", (s, i) => $"{s},{i}"));
}
// tank price list // tank price list
var priceList = new List<int> var priceList = new List<int>
{ {
@ -63,6 +39,25 @@ public class ProductManagement : MonoBehaviour
2000, 2000,
2500, 2500,
}; };
// タンクデータ読み込み
gameData.StorageTanks = new List<StorageTank>
{
new StorageTank(){Id = 1, Capacity = 50, FlavorId = 1, Stocks = new List<ProductStockData>{new ProductStockData{Rarity = ProductRarity.Normal, Stock = 0}}},
new StorageTank(){Id = 2, Capacity = 50, FlavorId = 2, Stocks = new List<ProductStockData>
{
new ProductStockData{Rarity = ProductRarity.Normal, Stock = 1},
new ProductStockData{Rarity = ProductRarity.Yellow, Stock = 20},
}},
new StorageTank(){Id = 3, Capacity = 50, FlavorId = 1, Stocks = new List<ProductStockData>
{
new ProductStockData{Rarity = ProductRarity.Copper, Stock = 1},
new ProductStockData{Rarity = ProductRarity.Silver, Stock = 5},
new ProductStockData{Rarity = ProductRarity.Gold, Stock = 10},
new ProductStockData{Rarity = ProductRarity.Rainbow, Stock = 20},
}},
new StorageTank(){Id = 4, Capacity = 50, FlavorId = 1, Stocks = new List<ProductStockData>{new ProductStockData{Rarity = ProductRarity.Gold, Stock = 4}}},
};
// タンク設定 // タンク設定
var tankList = view.SetTanks(priceList); var tankList = view.SetTanks(priceList);
var rarityDataList = SpreadsheetDataManager.Instance.GetBaseDataList<RarityData>(Const.RarityDataSheet); var rarityDataList = SpreadsheetDataManager.Instance.GetBaseDataList<RarityData>(Const.RarityDataSheet);
@ -70,61 +65,105 @@ public class ProductManagement : MonoBehaviour
{ {
tankView.SetArrow(tankView.TankNumber != 4 && tankView.TankNumber != 7 && tankView.TankNumber != gameData.StorageTanks.Count); tankView.SetArrow(tankView.TankNumber != 4 && tankView.TankNumber != 7 && tankView.TankNumber != gameData.StorageTanks.Count);
if (tankView.TankNumber > gameData.StorageTanks.Count) if (tankView.TankNumber > gameData.StorageTanks.Count)
{
// 価格の一番小さいタンクのみ購入できるようにする
if (tankView.TankNumber == gameData.StorageTanks.Count + 1)
{ {
tankView.SetState(TankState.Lock); tankView.SetState(TankState.Lock);
}
else
{
tankView.SetState(TankState.Unavailable);
}
// タンク購入 // タンク購入
var shopData = new ShopData
{
nameId = 0,
name = "タンク",
price = priceList[tankView.TankNumber - 1],
text = "ポップコーンを保存する容器",
category = 3,
consumeType = 2,
prefabName = ""
};
tankView.PurchaseButtonObservable tankView.PurchaseButtonObservable
.Where(_ => shopData.price <= CoinManager.Instance.OwnCoin)
.TakeWhile(_ => tankView.State.Value == TankState.Lock || tankView.State.Value == TankState.Unavailable) .TakeWhile(_ => tankView.State.Value == TankState.Lock || tankView.State.Value == TankState.Unavailable)
.Subscribe(_ => .Subscribe(_ =>
{ {
var price = priceList[tankView.TankNumber - 1]; Action<int> purchaseAction = amount =>
// 購入処理 {
// タンク追加Order追加 // タンク追加
tankView.SetData(gameData.StorageTanks.First(x => x.Id == gameData.TankOrder[tankView.TankNumber - 1])); gameData.StorageTanks.Add(new StorageTank() {Id = tankView.TankNumber, Capacity = 50});
tankView.SetData(gameData.StorageTanks[tankView.TankNumber - 1]);
tankView.SetState(TankState.Unlock);
CoinManager.Instance.SubCoin(shopData.price);
gameData.coin = CoinManager.Instance.OwnCoin;
GameDataManager.SaveGameData();
// 次に大きいタンクの購入ボタンを表示
if (tankView.TankNumber + 1 <= tankList.Count)
{
tankList[tankView.TankNumber].SetState(TankState.Lock);
}
};
LocalCacheManager.Save(ShopItemPurchaseView.ItemPurchaseTag, (shopData, 0, purchaseAction));
TransitionManager.Instance.LoadSceneAdditive(GameScenes.Purchase);
}).AddTo(tankView); }).AddTo(tankView);
} }
else else
{ {
var tankData = gameData.StorageTanks.First(x => x.Id == gameData.TankOrder[tankView.TankNumber - 1]); tankView.SetData(gameData.StorageTanks[tankView.TankNumber - 1]);
tankView.SetData(tankData);
tankView.SetState(TankState.Unlock); tankView.SetState(TankState.Unlock);
}
tankView.DetailButtonObservable.Subscribe(_ =>
{
state.Value = ManagementState.None;
var tankData = gameData.StorageTanks[tankView.TankNumber - 1];
var totalStock = gameData.ShopStock.Sum(x => x) + gameData.StorageTanks.Where(x => x.FlavorId == tankData.FlavorId).Sum(x => x.Stock); var totalStock = gameData.ShopStock.Sum(x => x) + gameData.StorageTanks.Where(x => x.FlavorId == tankData.FlavorId).Sum(x => x.Stock);
var recipe = RecipeData.GetRecipe(tankData.FlavorId); var recipe = RecipeData.GetRecipe(tankData.FlavorId);
var price = recipe?.Price ?? 0; var price = recipe?.Price ?? 0;
List<(ProductRarity rarity, int price, int stock)> raritySummaryData = rarityDataList.Select(x => List<(ProductRarity rarity, int price, int stock)> raritySummaryData = rarityDataList.Select(x =>
(x.Rarity, price * x.rate / 100, tankData.Stocks.FirstOrDefault(sd => sd.Rarity == x.Rarity)?.Stock ?? 0) (x.Rarity, price * x.rate / 100, tankData.Stocks.FirstOrDefault(sd => sd.Rarity == x.Rarity)?.Stock ?? 0)
).ToList(); ).ToList();
tankView.DetailButtonObservable.Subscribe(_ =>
{
state.Value = ManagementState.None;
LocalCacheManager.Save(TankDetailView.TankDetailDataTag, (tankView.TankNumber, totalStock, tankData, recipe, raritySummaryData)); LocalCacheManager.Save(TankDetailView.TankDetailDataTag, (tankView.TankNumber, totalStock, tankData, recipe, raritySummaryData));
TransitionManager.Instance.LoadSceneAdditive(GameScenes.PopcornDescription); TransitionManager.Instance.LoadSceneAdditive(GameScenes.PopcornDescription);
}).AddTo(tankView); }).AddTo(tankView);
}
state.Subscribe(x => state.Subscribe(x =>
{ {
tankView.SetDetailButtonActive(x != ManagementState.Tasting); tankView.SetDetailButtonActive(x != ManagementState.Tasting);
}).AddTo(tankView); }).AddTo(tankView);
} }
var selectedTankSubject = new Subject<(int num, RecipeData recipe)>().AddTo(this); var selectedTank = new ReactiveProperty<(int num, RecipeData recipe)>().AddTo(this);
var selectedTankObservable = selectedTankSubject.AsObservable();
state.Subscribe(mState => state.Subscribe(mState =>
{ {
switch (mState) switch (mState)
{ {
case ManagementState.None: case ManagementState.None:
ChangeAllTankInteractable(tankList, true);
ClearSelectedTank(tankList); ClearSelectedTank(tankList);
break; break;
case ManagementState.Replacing: case ManagementState.Replacing:
break; break;
case ManagementState.Tasting: case ManagementState.Tasting:
// 1番目選択 // 空以外のタンクを選択
var index = gameData.StorageTanks.FindIndex(tank => tank.Stock > 0);
if (index == -1)
{
state.Value = ManagementState.None;
return;
}
ChangeAllTankInteractable(tankList, false);
ClearSelectedTank(tankList); ClearSelectedTank(tankList);
tankList[0].SetState(TankState.Selected); tankList[index].SetState(TankState.Selected);
var tankData = gameData.StorageTanks.First(x => x.Id == gameData.TankOrder[tankList[0].TankNumber - 1]); var tankData = gameData.StorageTanks[index];
selectedTankSubject.OnNext((1, RecipeData.GetRecipe(tankData.FlavorId))); selectedTank.Value = (tankList[index].TankNumber, RecipeData.GetRecipe(tankData.FlavorId));
LocalCacheManager.Save(TastingView.TastingDataTag, (selectedTankObservable, new Action(() => state.Value = ManagementState.None), new Action<int>(Tasting))); Action tastingAction = () =>
{
Tasting(selectedTank.Value.num);
tankList[selectedTank.Value.num - 1].SetData(gameData.StorageTanks[selectedTank.Value.num - 1]);
};
LocalCacheManager.Save(TastingView.TastingDataTag, (selectedTank.AsObservable(), new Action(() => state.Value = ManagementState.None), tastingAction));
TransitionManager.Instance.LoadSceneAdditive(GameScenes.Tasting); TransitionManager.Instance.LoadSceneAdditive(GameScenes.Tasting);
break; break;
default: default:
@ -148,10 +187,14 @@ public class ProductManagement : MonoBehaviour
case ManagementState.Replacing: case ManagementState.Replacing:
break; break;
case ManagementState.Tasting: case ManagementState.Tasting:
if (gameData.StorageTanks[tankView.TankNumber - 1].Stock == 0)
{
return;
}
ClearSelectedTank(tankList); ClearSelectedTank(tankList);
tankView.SetState(TankState.Selected); tankView.SetState(TankState.Selected);
var tankData = gameData.StorageTanks.First(x => x.Id == gameData.TankOrder[tankView.TankNumber - 1]); var tankData = gameData.StorageTanks[tankView.TankNumber - 1];
selectedTankSubject.OnNext((tankView.TankNumber, RecipeData.GetRecipe(tankData.FlavorId))); selectedTank.Value = (tankView.TankNumber, RecipeData.GetRecipe(tankData.FlavorId));
break; break;
default: default:
throw new ArgumentOutOfRangeException(); throw new ArgumentOutOfRangeException();
@ -172,12 +215,12 @@ public class ProductManagement : MonoBehaviour
{ {
if (tanks.Previous.TankNumber != tanks.Current.TankNumber) if (tanks.Previous.TankNumber != tanks.Current.TankNumber)
{ {
var tmpId = gameData.TankOrder[tanks.Previous.TankNumber - 1]; var tmpData = gameData.StorageTanks[tanks.Previous.TankNumber - 1];
gameData.TankOrder[tanks.Previous.TankNumber - 1] = gameData.TankOrder[tanks.Current.TankNumber - 1]; gameData.StorageTanks[tanks.Previous.TankNumber - 1] = gameData.StorageTanks[tanks.Current.TankNumber - 1];
gameData.TankOrder[tanks.Current.TankNumber - 1] = tmpId; gameData.StorageTanks[tanks.Current.TankNumber - 1] = tmpData;
// 再設定 // 再設定
tanks.Previous.SetData(gameData.StorageTanks.First(x => x.Id == gameData.TankOrder[tanks.Previous.TankNumber - 1])); tanks.Previous.SetData(gameData.StorageTanks[tanks.Previous.TankNumber - 1]);
tanks.Current.SetData(gameData.StorageTanks.First(x => x.Id == gameData.TankOrder[tanks.Current.TankNumber - 1])); tanks.Current.SetData(gameData.StorageTanks[tanks.Current.TankNumber - 1]);
GameDataManager.SaveGameData(); GameDataManager.SaveGameData();
} }
state.Value = ManagementState.None; state.Value = ManagementState.None;
@ -189,8 +232,11 @@ public class ProductManagement : MonoBehaviour
}).AddTo(this); }).AddTo(this);
view.RefillType.Subscribe(mode => view.RefillType.Subscribe(mode =>
{
if (state.Value != ManagementState.Tasting)
{ {
state.Value = ManagementState.None; state.Value = ManagementState.None;
}
// 補充方法変更 // 補充方法変更
gameData.RefillMode = mode; gameData.RefillMode = mode;
GameDataManager.SaveGameData(); GameDataManager.SaveGameData();
@ -208,9 +254,21 @@ public class ProductManagement : MonoBehaviour
} }
} }
private void ChangeAllTankInteractable(List<ProductManagementTankView> tankList, bool active)
{
foreach (var tankView in tankList)
{
if (tankView.State.Value == TankState.Lock)
{
tankView.SetPurchaseButtonActive(active);
}
}
}
private void Tasting(int tankNumber) private void Tasting(int tankNumber)
{ {
state.Value = ManagementState.None; state.Value = ManagementState.None;
Debug.Log($"tasting:{tankNumber}"); GameDataManager.GameData.StorageTanks[tankNumber - 1].ClearStock();
// 試食フラグに終了時間を設定
} }
} }

View File

@ -101,4 +101,9 @@ public class ProductManagementTankView : MonoBehaviour
{ {
detailButtonActive.Value = active; detailButtonActive.Value = active;
} }
public void SetPurchaseButtonActive(bool active)
{
purchaseButton.interactable = active;
}
} }

View File

@ -30,6 +30,11 @@ public class StorageTank
} }
stockData.Stock += stock; stockData.Stock += stock;
} }
public void ClearStock()
{
Stocks.Clear();
}
} }
public class ProductStockData public class ProductStockData

View File

@ -18,7 +18,7 @@ public class TastingView : MonoBehaviour
private void Start() private void Start()
{ {
var data = LocalCacheManager.Load<(IObservable<(int tankNum, RecipeData recipe)> selectedObservable, Action closeButtonAction, Action<int> tastingButtonAction)>(TastingDataTag); var data = LocalCacheManager.Load<(IObservable<(int tankNum, RecipeData recipe)> selectedObservable, Action closeButtonAction, Action tastingButtonAction)>(TastingDataTag);
data.selectedObservable.Subscribe(x => data.selectedObservable.Subscribe(x =>
{ {
popcornName.text = x.recipe.Name; popcornName.text = x.recipe.Name;
@ -26,18 +26,18 @@ public class TastingView : MonoBehaviour
closeButton.OnClickAsObservable().Subscribe(_ => closeButton.OnClickAsObservable().Subscribe(_ =>
{ {
backgroundAnimator.SetTrigger(CloseTrigger); backgroundAnimator.SetTrigger(CloseTrigger);
this.CallWaitForSeconds(.25f, () => this.CallWaitForSeconds(.5f, () =>
{ {
data.closeButtonAction?.Invoke(); data.closeButtonAction?.Invoke();
TransitionManager.Instance.UnloadScene(GameScenes.Tasting); TransitionManager.Instance.UnloadScene(GameScenes.Tasting);
}); });
}).AddTo(this); }).AddTo(this);
tastingButton.OnClickAsObservable().WithLatestFrom(data.selectedObservable, (_, x) => x.tankNum).Subscribe(tankNum => tastingButton.OnClickAsObservable().Subscribe(_ =>
{ {
backgroundAnimator.SetTrigger(CloseTrigger); backgroundAnimator.SetTrigger(CloseTrigger);
this.CallWaitForSeconds(.25f, () => this.CallWaitForSeconds(.5f, () =>
{ {
data.tastingButtonAction?.Invoke(tankNum); data.tastingButtonAction?.Invoke();
TransitionManager.Instance.UnloadScene(GameScenes.Tasting); TransitionManager.Instance.UnloadScene(GameScenes.Tasting);
}); });
}).AddTo(this); }).AddTo(this);

View File

@ -80,7 +80,6 @@ public sealed class GameData {
[DataMember(Name = "Data22")] [DataMember(Name = "Data22")]
public int[] Pans; public int[] Pans;
// [DataMember(Name = "Data23")] // [DataMember(Name = "Data23")]
public int[] TankOrder;
[DataMember(Name = "Data24")] [DataMember(Name = "Data24")]
public ProductRefillMode RefillMode; public ProductRefillMode RefillMode;
// [DataMember(Name = "Data25")] // [DataMember(Name = "Data25")]
@ -124,7 +123,6 @@ public sealed class GameData {
// lastAdRewardTimeList = lastAdRewardTimeArray == null ? new List<long>() : lastAdRewardTimeArray.ToList(); // lastAdRewardTimeList = lastAdRewardTimeArray == null ? new List<long>() : lastAdRewardTimeArray.ToList();
ShopStock = shopStock?.ToList() ?? new List<int>(); ShopStock = shopStock?.ToList() ?? new List<int>();
Pans = Pans ?? new int[0]; Pans = Pans ?? new int[0];
TankOrder = TankOrder ?? new int[0];
} }
private Dictionary<int, int> ArrayToDictionary(KeyValueOfintint[] array){ private Dictionary<int, int> ArrayToDictionary(KeyValueOfintint[] array){
var dictionary = new Dictionary<int, int>(); var dictionary = new Dictionary<int, int>();