fix: 完善拼消消模板运行规则

This commit is contained in:
2026-06-11 00:50:18 +08:00
parent c98c3de96d
commit 21ac5642e8
19 changed files with 1952 additions and 317 deletions

View File

@@ -6,8 +6,8 @@ pub use types::*;
use crate::{ProcedureContext, ReducerContext, SpacetimeType, Table, Timestamp, json};
use module_puzzle_clear::{
PUZZLE_CLEAR_LEVEL_DURATION_SECONDS, PuzzleClearBoard, PuzzleClearCard, PuzzleClearDeck,
PuzzleClearMove, PuzzleClearRunSnapshot as DomainRunSnapshot, advance_puzzle_clear_level,
PuzzleClearBoard, PuzzleClearCard, PuzzleClearDeck, PuzzleClearMove,
PuzzleClearRunSnapshot as DomainRunSnapshot, advance_puzzle_clear_level,
apply_puzzle_clear_swap, create_puzzle_clear_board, fail_puzzle_clear_level_on_timeout,
parse_puzzle_clear_orientation, parse_puzzle_clear_shape_kind, puzzle_clear_level_configs,
retry_puzzle_clear_level, start_puzzle_clear_run,
@@ -976,6 +976,7 @@ fn build_level_board_and_deck(
.collect::<Vec<_>>(),
seed,
level.target_clears as usize,
&level.unlocked_shapes,
);
let board = create_puzzle_clear_board(&level, seed, allowed.clone())
.map_err(|error| error.to_string())?;
@@ -991,6 +992,7 @@ fn ordered_level_cards(
cards: Vec<PuzzleClearCard>,
seed: &str,
target_groups: usize,
unlocked_shapes: &[module_puzzle_clear::PuzzleClearShapeKind],
) -> Vec<PuzzleClearCard> {
let mut groups: BTreeMap<String, Vec<PuzzleClearCard>> = BTreeMap::new();
for card in cards {
@@ -1008,9 +1010,40 @@ fn ordered_level_cards(
.unwrap_or_default();
left_key.cmp(&right_key)
});
grouped
let mut selected = Vec::new();
let mut selected_group_ids = std::collections::BTreeSet::new();
for shape in unlocked_shapes {
if selected.len() >= target_groups {
break;
}
let Some(group) = grouped.iter().find(|group| {
group
.first()
.is_some_and(|card| card.shape == *shape && !selected_group_ids.contains(&card.group_id))
}) else {
continue;
};
if let Some(first) = group.first() {
selected_group_ids.insert(first.group_id.clone());
selected.push(group.clone());
}
}
for group in grouped {
if selected.len() >= target_groups {
break;
}
let Some(first) = group.first() else {
continue;
};
if selected_group_ids.contains(&first.group_id) {
continue;
}
selected_group_ids.insert(first.group_id.clone());
selected.push(group);
}
selected
.into_iter()
.take(target_groups)
.flat_map(|mut group| {
group.sort_by_key(|card| (card.part_y, card.part_x));
group
@@ -1061,7 +1094,7 @@ fn build_runtime_snapshot(
level_index: snapshot.level_index,
clears_done: snapshot.clears_done,
target_clears: level.target_clears,
level_duration_seconds: PUZZLE_CLEAR_LEVEL_DURATION_SECONDS,
level_duration_seconds: level.duration_seconds,
level_started_at_ms: snapshot.level_started_at_ms,
board: PuzzleClearBoardSnapshot {
rows: snapshot.board.rows,