params ?? []; $betSeconds = (int) ($config['bet_window_seconds'] ?? 90); $horseCount = (int) ($config['horse_count'] ?? 4); $minBet = (int) ($config['min_bet'] ?? 100); $maxBet = (int) ($config['max_bet'] ?? 100000); $seedPool = (int) ($config['seed_pool'] ?? 0); $now = now(); $closesAt = $now->copy()->addSeconds($betSeconds); // 生成参赛马匹 $horses = HorseRace::generateHorses($horseCount); // 创建新场次 $race = HorseRace::create([ 'status' => 'betting', 'bet_opens_at' => $now, 'bet_closes_at' => $closesAt, 'horses' => $horses, 'total_pool' => $seedPool, ]); // 广播开赛事件 broadcast(new HorseRaceOpened($race)); // 公屏系统公告 $horseList = implode(' ', array_map( fn ($h) => "{$h['emoji']}{$h['name']}", $horses )); $quickOpenButton = ''; $content = "🐎 【赛马】第 #{$race->id} 场开始!押注时间 {$betSeconds} 秒,参赛马匹:{$horseList}。押注范围 ".number_format($minBet).'~'.number_format($maxBet).' 金币!'.$quickOpenButton; $msg = [ 'id' => $chatState->nextMessageId(1), 'room_id' => 1, 'from_user' => '系统传音', 'to_user' => '大家', 'content' => $content, 'is_secret' => false, 'font_color' => '#f59e0b', 'action' => '大声宣告', 'sent_at' => $now->toDateTimeString(), ]; $chatState->pushMessage(1, $msg); broadcast(new MessageSent(1, $msg)); SaveMessageJob::dispatch($msg); // 押注截止后触发跑马 & 结算任务 RunHorseRaceJob::dispatch($race)->delay($closesAt); } }