Files
whale-town-front-v2/Config/MallCatalog.gd

271 lines
9.7 KiB
GDScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
class_name MallCatalog
extends RefCounted
# ============================================================================
# MallCatalog.gd - 鲸鱼商城本地配置
# ============================================================================
# 提供商城分类、商品目录和状态文案。
# ============================================================================
const STATUS_AVAILABLE: String = "available"
const STATUS_OWNED: String = "owned"
const STATUS_COMING_SOON: String = "coming_soon"
const STATUS_LOCKED: String = "locked"
const CATEGORY_ICON_PATHS: Dictionary = {
"recommended": "res://assets/ui/mall/icons/processed/category_recommended_128.png",
"outfit": "res://assets/ui/mall/icons/processed/category_outfit_128.png",
"items": "res://assets/ui/mall/icons/processed/category_items_128.png",
"companion": "res://assets/ui/mall/icons/processed/category_companion_128.png",
"space": "res://assets/ui/mall/icons/processed/category_space_128.png",
"limited": "res://assets/ui/mall/icons/processed/category_limited_128.png",
}
const CATEGORIES: Array[Dictionary] = [
{"id": "recommended", "label": "推荐", "icon": "recommended"},
{"id": "outfit", "label": "装扮", "icon": "outfit"},
{"id": "items", "label": "道具", "icon": "items"},
{"id": "companion", "label": "伙伴", "icon": "companion"},
{"id": "space", "label": "空间", "icon": "space"},
{"id": "limited", "label": "限时", "icon": "limited"},
]
const ITEM_TYPE_SKIN: String = "skin"
const ITEM_TYPE_ROOM_DECOR: String = "room_decor"
const MALL_ITEMS: Array[Dictionary] = [
{
"id": "skin_classic_whale",
"itemType": ITEM_TYPE_SKIN,
"skinId": "classic_whale",
"name": "经典鲸鱼",
"category": "outfit",
"description": "圆润、轻快的鲸鱼居民皮肤,适合喜欢海洋感角色的玩家。",
"price": 680,
"status": STATUS_AVAILABLE,
"tags": ["可预览", "永久", "皮肤"],
"icon": "res://assets/ui/mall/skins/classic_whale_product.png",
"sortOrder": 10,
},
{
"id": "skin_human_whale_directional_v2_8x4",
"itemType": ITEM_TYPE_SKIN,
"skinId": "human_whale_directional_v2_8x4",
"name": "海风行者",
"category": "outfit",
"description": "蓝白海风主题的人类角色皮肤,带有鲸鱼小镇风格的服装细节。",
"price": 680,
"status": STATUS_AVAILABLE,
"tags": ["可预览", "永久", "皮肤"],
"icon": "res://assets/ui/mall/skins/human_whale_directional_v2_8x4_product.png",
"sortOrder": 20,
},
{
"id": "skin_girl_sailor_turnaround_v2_8x4",
"itemType": ITEM_TYPE_SKIN,
"skinId": "girl_sailor_turnaround_v2_8x4",
"name": "海风少女",
"category": "outfit",
"description": "水手风格的人类角色皮肤,适合轻松、清爽的 WhaleTown 日常。",
"price": 880,
"status": STATUS_AVAILABLE,
"tags": ["可预览", "永久", "皮肤"],
"icon": "res://assets/ui/mall/skins/girl_sailor_turnaround_v2_8x4_product.png",
"sortOrder": 30,
},
{
"id": "skin_panda_hero_8x4",
"itemType": ITEM_TYPE_SKIN,
"skinId": "panda_hero_8x4",
"name": "熊猫侠",
"category": "outfit",
"description": "黑白连帽外观的人类角色皮肤四方向8帧动作适合想要更鲜明角色辨识度的玩家。",
"price": 980,
"status": STATUS_AVAILABLE,
"tags": ["可预览", "永久", "皮肤"],
"icon": "res://assets/ui/mall/skins/panda_hero_8x4_product.png",
"sortOrder": 40,
},
{
"id": "skin_ordinary_man_male_8x4",
"itemType": ITEM_TYPE_SKIN,
"skinId": "ordinary_man_male_8x4",
"name": "普通人(男)",
"category": "outfit",
"description": "男性日常角色皮肤四方向8帧动作适合普通玩家形象。",
"price": 980,
"status": STATUS_AVAILABLE,
"tags": ["可预览", "永久", "皮肤"],
"icon": "res://assets/ui/mall/skins/ordinary_man_male_8x4_product.png",
"sortOrder": 50,
},
{
"id": "decor_whale_floor_rug",
"itemType": ITEM_TYPE_ROOM_DECOR,
"decorId": "whale_floor_rug",
"name": "鲸浪地毯",
"category": "space",
"description": "蓝白鲸鱼主题地毯,购买后会进入房间家具背包,可在个人房间自由拖拽摆放。",
"price": 260,
"status": STATUS_AVAILABLE,
"tags": ["家具", "可拖拽", "地面"],
"icon": "res://assets/ui/mall/items/room_decor_whale_floor_rug.png",
"sortOrder": 110,
},
{
"id": "decor_whale_memory_board",
"itemType": ITEM_TYPE_ROOM_DECOR,
"decorId": "whale_memory_board",
"name": "鲸语记忆板",
"category": "space",
"description": "鲸鱼木质装饰板,购买后会进入房间家具背包,可在个人房间自由拖拽摆放。",
"price": 220,
"status": STATUS_AVAILABLE,
"tags": ["家具", "可拖拽", "挂件"],
"icon": "res://assets/ui/mall/items/room_decor_whale_memory_board.png",
"sortOrder": 120,
},
{
"id": "decor_whale_tail_lamp",
"itemType": ITEM_TYPE_ROOM_DECOR,
"decorId": "whale_tail_lamp",
"name": "鲸尾暖灯",
"category": "space",
"description": "鲸尾造型的温暖装饰灯,购买后会进入房间家具背包,可在个人房间自由拖拽摆放。",
"price": 360,
"status": STATUS_AVAILABLE,
"tags": ["家具", "可拖拽", "灯具"],
"icon": "res://assets/ui/mall/items/room_decor_whale_tail_lamp.png",
"sortOrder": 130,
},
{
"id": "decor_boat_cabin_bed",
"itemType": ITEM_TYPE_ROOM_DECOR,
"decorId": "boat_cabin_bed",
"name": "船舱小床",
"category": "space",
"description": "白木船舱造型的小床,带海风细节,购买后会进入家具背包,可在个人房间自由拖拽摆放。",
"price": 520,
"status": STATUS_AVAILABLE,
"tags": ["家具", "可拖拽", ""],
"icon": "res://assets/ui/mall/items/room_decor_boat_cabin_bed.png",
"sortOrder": 140,
},
{
"id": "decor_low_wave_bed",
"itemType": ITEM_TYPE_ROOM_DECOR,
"decorId": "low_wave_bed",
"name": "海浪低床",
"category": "space",
"description": "蓝白海浪被面的低矮小床,购买后会进入家具背包,可在个人房间自由拖拽摆放。",
"price": 500,
"status": STATUS_AVAILABLE,
"tags": ["家具", "可拖拽", ""],
"icon": "res://assets/ui/mall/items/room_decor_low_wave_bed.png",
"sortOrder": 150,
},
{
"id": "decor_whale_tail_headboard_bed",
"itemType": ITEM_TYPE_ROOM_DECOR,
"decorId": "whale_tail_headboard_bed",
"name": "鲸尾床头床",
"category": "space",
"description": "鲸尾床头和深蓝被面的主题小床,购买后会进入家具背包,可在个人房间自由拖拽摆放。",
"price": 580,
"status": STATUS_AVAILABLE,
"tags": ["家具", "可拖拽", ""],
"icon": "res://assets/ui/mall/items/room_decor_whale_tail_headboard_bed.png",
"sortOrder": 180,
},
{
"id": "decor_dev_whale_bookshelf",
"itemType": ITEM_TYPE_ROOM_DECOR,
"decorId": "dev_whale_bookshelf",
"name": "程序员鲸书架",
"category": "space",
"description": "带 GitHub、Datawhale 和代码小物件的蓝白书架,购买后会进入家具背包,可在个人房间自由拖拽摆放。",
"price": 620,
"status": STATUS_AVAILABLE,
"tags": ["家具", "可拖拽", "书架"],
"icon": "res://assets/ui/mall/items/room_decor_dev_whale_bookshelf.png",
"sortOrder": 190,
},
{
"id": "decor_datawhale_bug_feature_badge",
"itemType": ITEM_TYPE_ROOM_DECOR,
"decorId": "datawhale_bug_feature_badge",
"name": "BUG特性徽章",
"category": "space",
"description": "写着“这不是BUG 这是feature”的佛系学习小徽章适合贴在个人房间墙面。",
"price": 120,
"status": STATUS_AVAILABLE,
"tags": ["家具", "可拖拽", "徽章"],
"icon": "res://assets/ui/mall/items/room_decor_datawhale_bug_feature_badge.png",
"sortOrder": 200,
},
{
"id": "decor_datawhale_buddhist_learning_badge",
"itemType": ITEM_TYPE_ROOM_DECOR,
"decorId": "datawhale_buddhist_learning_badge",
"name": "佛系学习徽章",
"category": "space",
"description": "Datawhale 佛系学习主题徽章,适合贴在个人房间墙面。",
"price": 140,
"status": STATUS_AVAILABLE,
"tags": ["家具", "可拖拽", "徽章"],
"icon": "res://assets/ui/mall/items/room_decor_datawhale_buddhist_learning_badge.png",
"sortOrder": 210,
},
{
"id": "decor_datawhale_ok_working_badge",
"itemType": ITEM_TYPE_ROOM_DECOR,
"decorId": "datawhale_ok_working_badge",
"name": "已经在做徽章",
"category": "space",
"description": "写着“OKKKK 已经在做了”的工作状态徽章,适合贴在个人房间墙面。",
"price": 120,
"status": STATUS_AVAILABLE,
"tags": ["家具", "可拖拽", "徽章"],
"icon": "res://assets/ui/mall/items/room_decor_datawhale_ok_working_badge.png",
"sortOrder": 220,
},
]
static func get_categories() -> Array[Dictionary]:
return CATEGORIES.duplicate(true)
static func get_items() -> Array[Dictionary]:
return MALL_ITEMS.duplicate(true)
static func get_items_for_category(categoryId: String) -> Array[Dictionary]:
var result: Array[Dictionary] = []
for item in MALL_ITEMS:
var itemCategory := str(item.get("category", ""))
if categoryId == "recommended" or itemCategory == categoryId:
result.append(item.duplicate(true))
result.sort_custom(func(a: Dictionary, b: Dictionary) -> bool:
return int(a.get("sortOrder", 0)) < int(b.get("sortOrder", 0))
)
return result
static func get_category_icon_path(categoryId: String) -> String:
return str(CATEGORY_ICON_PATHS.get(categoryId, CATEGORY_ICON_PATHS["recommended"]))
static func get_status_label(status: String) -> String:
match status:
STATUS_AVAILABLE:
return "可购买"
STATUS_OWNED:
return "已购买"
STATUS_COMING_SOON:
return "未开放"
STATUS_LOCKED:
return "未解锁"
_:
return "未知"
static func can_purchase(item: Dictionary, balance: int) -> bool:
var status := str(item.get("status", STATUS_COMING_SOON))
var price := int(item.get("price", 0))
return status == STATUS_AVAILABLE and balance >= price