65 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { _decorator } from "cc";
 | 
						|
 | 
						|
import { EventManager } from "@max-studio/core/event/EventManager";
 | 
						|
import { Singleton } from "@max-studio/core/Singleton";
 | 
						|
import LogUtils from "@max-studio/core/utils/LogUtils";
 | 
						|
 | 
						|
import { CurrencyEventMessage, CurrencyType } from "./Types";
 | 
						|
 | 
						|
const { ccclass, property } = _decorator;
 | 
						|
 | 
						|
@ccclass("CurrencyManager")
 | 
						|
export class CurrencyManager extends Singleton {
 | 
						|
    private currencyValues: Record<CurrencyType, number> = {} as Record<CurrencyType, number>;
 | 
						|
 | 
						|
    /** 获取货币值 */
 | 
						|
    public getCurrencyValue(type: CurrencyType): number {
 | 
						|
        return this.currencyValues[type] || 0;
 | 
						|
    }
 | 
						|
 | 
						|
    /** 设置货币值 */
 | 
						|
    public setCurrencyValue(type: CurrencyType, value: number, isNotify: boolean = true) {
 | 
						|
        this.currencyValues[type] = value;
 | 
						|
        if (isNotify) {
 | 
						|
            EventManager.getInstance().emit(CurrencyEventMessage.CURRENCY_VALUE_CHANGED, type, value);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /** 格式化货币显示 */
 | 
						|
    public formatCurrencyDisplay(type: CurrencyType, value?: number): string {
 | 
						|
        const amount = value ?? this.getCurrencyValue(type);
 | 
						|
 | 
						|
        // 根据货币类型返回不同的格式
 | 
						|
        if (amount >= 1000000) {
 | 
						|
            return `${(amount / 1000000).toFixed(1)}M`;
 | 
						|
        } else if (amount >= 1000) {
 | 
						|
            return `${(amount / 1000).toFixed(1)}K`;
 | 
						|
        }
 | 
						|
 | 
						|
        return amount.toString();
 | 
						|
    }
 | 
						|
 | 
						|
    /** 检查货币是否足够 */
 | 
						|
    public isCurrencyEnough(type: CurrencyType, amount: number): boolean {
 | 
						|
        return this.getCurrencyValue(type) >= amount;
 | 
						|
    }
 | 
						|
 | 
						|
    /** 消耗货币 */
 | 
						|
    public consumeCurrency(type: CurrencyType, amount: number, isNotify: boolean = true): boolean {
 | 
						|
        if (amount <= 0) {
 | 
						|
            LogUtils.warn(`[CurrencyManager] 消耗货币数量必须大于0: ${amount}`);
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        if (!this.isCurrencyEnough(type, amount)) {
 | 
						|
            LogUtils.warn(`[CurrencyManager] 货币不足: ${type}, 需要: ${amount}, 当前: ${this.getCurrencyValue(type)}`);
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        const currentValue = this.getCurrencyValue(type);
 | 
						|
        const newValue = currentValue - amount;
 | 
						|
        this.setCurrencyValue(type, newValue, isNotify);
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
}
 |