核心交易功能

Core Trading Features

概述

市场系统让价格响应交易活动。当玩家或AI交易者与市场实体(ID 22)买卖商品时,价格会根据供需自动调整。

✅ 开箱即用
无需配置 - 系统已自动完成:MarketManager 追踪需求、TradeManager 报告市场交易、价格自动更新、交易图表实时显示。

使用系统

1. 与市场交易

所有与交易者 ID 22 的交易会自动影响价格:

# 玩家从市场买入
trade_manager.execute_transfer(
    commodity_id,
    22, "trader",        # From: Market Entity
    player_id, "trader", # To: Player
    quantity,
    "player_bag"
)
# → 价格会因买入压力上涨

# 玩家卖给市场
trade_manager.execute_transfer(
    commodity_id,
    player_id, "trader", # From: Player
    22, "trader",        # To: Market Entity
    quantity,
    "market_warehouse"
)
# → 价格会因卖出压力下跌

2. 检查市场状态

# 获取商品的需求信息
var demand = market_manager.get_market_demand(commodity_id)
print("Net Demand: ", demand.net_demand)  # 正数 = 买入压力

# 打印完整的市场报告
market_manager.debug_print_market_demand()

3. 观察价格变化

打开交易图表 UI - 价格自动更新:

  • 买入压力 → 价格上涨(绿色)
  • 卖出压力 → 价格下跌(红色)
  • 需求随时间衰减 → 价格稳定

4. 测试系统

# 运行综合测试
var trade_manager = get_node("/root/GlobalData/TradeManager")
trade_manager.test_market_price_response()

# 输出显示:
# - 初始价格
# - 交易活动
# - 需求变化
# - 最终价格

理解价格变化

价格公式

New Price = Current Price + Random Volatility + Trend + Demand Impact

Demand Impact = Net Demand × 0.0015 × Current Price

示例

  • 铁矿石价格:$15.00
  • 玩家买入 100 单位
  • 净需求:+100
  • 需求影响:100 × 0.0015 × 15 = +$2.25
  • 价格在接下来几个 tick 上涨至约 $17.25

需求衰减

需求自然衰减(每 tick 5%):

  • Tick 0:+100 需求
  • Tick 14:+50 需求(减半)
  • Tick 28:+25 需求
  • 最终:~0 需求 → 价格稳定

调优市场

默认设置(平衡)

demand_decay_rate: 0.95      # 每 tick 衰减 5%
price_sensitivity: 0.0015    # 适度响应
max_price_change: 0.05       # 每 tick 最大 5%
demand_smoothing: 0.3        # 平滑但响应迅速

更剧烈的市场波动

market_manager.set_market_parameters({
    "price_sensitivity": 0.005,        # 3倍响应
    "max_price_change_per_tick": 0.10, # 允许 10% 波动
    "demand_decay_rate": 0.85          # 更快衰减
})

更稳定的市场

market_manager.set_market_parameters({
    "price_sensitivity": 0.0005,       # 更低响应
    "max_price_change_per_tick": 0.02, # 仅 2% 波动
    "demand_decay_rate": 0.98          # 更慢衰减
})

常见场景

场景 1:玩家大量购买

玩家购买 500 铁矿石
→ 高买入压力
→ 价格上涨 10-15%
→ 接下来一分钟,需求衰减
→ 价格稳定在新水平 (+5%)

场景 2:市场崩盘

玩家出售 1000 钻石
→ 高卖出压力
→ 价格暴跌 20-30%
→ 其他玩家看到便宜价格
→ 开始买入
→ 需求平衡
→ 价格部分恢复

场景 3:交易均衡

买卖量相等
→ 净需求 ~0
→ 价格自然波动(随机游走)
→ 无明显趋势

调试

检查系统是否正常工作

# 1. 验证 MarketManager 已连接
var tm = get_node("/root/GlobalData/TradeManager")
tm.print_debug_info()
# 应显示: "MarketManager连接状态: 已连接"

# 2. 执行测试交易
tm.execute_transfer(3, 22, "trader", 1, "trader", 10.0, "test")

# 3. 检查需求是否记录
var mm = get_node("/root/GlobalData/MarketManager")
mm.debug_print_market_demand()
# 应显示商品 ID 3 的需求

故障排除

问题:价格不变

  • 检查交易是否涉及市场实体(ID 22)
  • 验证 MarketManager 已连接:trade_manager.print_debug_info()
  • 检查游戏时间是否运行(未暂停)

问题:价格变化过大/过小

  • 调整 price_sensitivity 参数
  • 检查 max_price_change_per_tick 限制

问题:需求不衰减

  • 验证游戏时间在运行:MarketManager._process() 正在执行
  • 检查衰减率:market_manager.get_market_parameters()

最佳实践

游戏玩法

  1. 从默认参数开始
  2. 运行测试观察行为
  3. 根据期望的经济速度调整
  4. 通过交易图表监控

AI 交易者

# AI 应与市场实体交易
ai_trader.buy_commodity(commodity_id, quantity)
    ↓
# 内部调用
trade_manager.execute_transfer(
    commodity_id,
    22, "trader",           # 始终从/到市场
    ai_trader_id, "trader",
    quantity,
    "ai_inventory"
)

平衡建议

  • 高交易量商品:降低敏感度
  • 稀有商品:提高敏感度
  • 防止操纵:限制每 tick 最大变化
  • 确保流动性:市场实体保持大量储备

控制台命令

用于测试的常用命令:

# 快速查看市场状态
get_node("/root/GlobalData/MarketManager").debug_print_market_demand()

# 运行综合测试
get_node("/root/GlobalData/TradeManager").test_market_price_response()

# 检查参数
print(get_node("/root/GlobalData/MarketManager").get_market_parameters())

# 调整市场
get_node("/root/GlobalData/MarketManager").set_market_parameters({
    "price_sensitivity": 0.003
})

后续步骤

  1. ✅ 系统已就绪
  2. 打开交易图表观察价格
  3. 与市场实体(ID 22)进行一些交易
  4. 实时观察价格响应
  5. 根据需要调整参数

相关资源

  • 完整文档:market_system_design.md
  • 实现细节:MARKET_IMPLEMENTATION_SUMMARY.md
  • Market Manager:gdt/scripts/core/managers/market_manager.gd
  • Trade Manager:gdt/scripts/trade/trade_manager.gd