Files
2026-10-20 13:21:04 +08:00

54 lines
3.3 KiB
C#

#if UNITY_EDITOR
using System;
using System.Collections;
using UnityEngine;
namespace BlockOutReplica.Gameplay
{
public sealed partial class BlockOutGameController
{
public IEnumerator ReviewPaidBoosterFlow()
{
if(IsFullLoopSandbox)throw new InvalidOperationException("Restore manual sandbox before paid-booster review.");
int checks=0;
Action<bool,string> check=(condition,name)=>{if(!condition)throw new InvalidOperationException(name);checks++;};
BeginFullLoopSandbox();
try
{
RequestEnterLevel();EnterPreparedLevel();IsInputReviewRunning=true;yield return null;
while(Player.SpendBooster(BoosterType.Rocket)){}
check(Player.Amount(BoosterType.Rocket)==0&&Player.Coins==1000,"zero rocket fixture");
System.IO.Directory.CreateDirectory("Docs/iterations");
ScreenCapture.CaptureScreenshot("Docs/iterations/2026-10-20-paid-rocket-600.png");yield return null;
ClickBooster(BoosterType.Rocket);
check(SelectedBooster==BoosterType.Rocket&&Modal==GameModal.None&&Player.Coins==1000,"600 tap selects without charge or purchase modal");
BeginDrag(new Vector2(-100,-100),gameCamera);
check(Player.Coins==1000&&Player.Amount(BoosterType.Rocket)==0,"invalid target is free");
CancelBoosterSelection();
check(SelectedBooster==BoosterType.None&&Player.Coins==1000,"cancel is free");
ClickBooster(BoosterType.Rocket);ClickBooster(BoosterType.Rocket);
check(SelectedBooster==BoosterType.None&&Player.Coins==1000,"repeat tap cancels for free");
ClickBooster(BoosterType.Rocket);
var target=pieces[0];int before=pieces.Count;
BeginDrag(gameCamera.WorldToScreenPoint(target.transform.position),gameCamera);
check(Player.Coins==400&&Player.Amount(BoosterType.Rocket)==0&&pieces.Count==before-1,"valid target pays exactly 600 for this use, no inventory grant");
ClickBooster(BoosterType.Rocket);
check(Player.Coins==400,"busy duplicate tap cannot charge twice");
yield return WaitReviewCondition(()=>!InputLocked,"paid rocket ends");
check(target==null&&activeExits==0,"paid rocket effect retires target");
ClickBooster(BoosterType.Rocket);
check(Modal==GameModal.Info&&Player.Coins==400&&SelectedBooster==BoosterType.None,"underfunded purchase does not select, spend or pretend billing is connected");
CloseModal();
while(Player.SpendBooster(BoosterType.Freeze)){}
ClickBooster(BoosterType.Freeze);
check(Player.Coins==100&&Player.Amount(BoosterType.Freeze)==0&&FreezeRemaining==10,"zero inventory freeze buys immediate one use");
ClickBooster(BoosterType.Freeze);
check(Player.Coins==100,"active freeze cannot be paid twice");
Debug.Log($"BLOCKOUT_PAID_BOOSTER_REVIEW: passed=True, checks={checks}, rocketPrice=600, inventoryGranted=False, persistentPlayerDataUntouched=True, originalFundedRuntimeNotObserved=True");
}
finally{RestoreFullLoopSandbox();}
}
}
}
#endif