fix: 完善拼消消模板运行规则
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user