/* Wrap the slices representing the initial moves of the solution with * slices of appropriately equipped slice types * @param adapter identifies the adapter slice at the beginning of the branch * @param state address of structure holding state */ void battle_make_root(slice_index adapter, spin_off_state_type *state) { TraceFunctionEntry(__func__); TraceFunctionParam("%u",adapter); TraceFunctionParamListEnd(); battle_branch_make_root_slices(adapter,state); branch_shorten_slices(adapter,STEndOfRoot,stip_traversal_context_intro); pipe_remove(adapter); TraceFunctionExit(__func__); TraceFunctionParamListEnd(); }
/* Wrap the slices representing the initial moves of the solution with * slices of appropriately equipped slice types * @param adapter identifies the adapter slice at the beginning of the branch * @param state address of structure holding state */ void help_make_root(slice_index adapter, spin_off_state_type *state) { TraceFunctionEntry(__func__); TraceFunctionParam("%u",adapter); TraceFunctionParamListEnd(); assert(SLICE_TYPE(adapter)==STHelpAdapter); { slice_index const prototype = alloc_pipe(STEndOfRoot); slice_insertion_insert(adapter,&prototype,1); help_branch_make_root_slices(adapter,state); branch_shorten_slices(adapter,STEndOfRoot,stip_traversal_context_intro); pipe_remove(adapter); } TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
/* Shorten a help branch by 1 half move * @param identifies entry slice of branch to be shortened */ void help_branch_shorten(slice_index adapter) { slice_index const next = SLICE_NEXT1(adapter); TraceFunctionEntry(__func__); TraceFunctionParam("%u",adapter); TraceFunctionParamListEnd(); assert(SLICE_TYPE(adapter)==STHelpAdapter); { /* find the new spot for adapter by inserting a copy */ slice_index const prototype = copy_slice(adapter); help_branch_insert_slices(next,&prototype,1); } { /* move adapter to its new spot */ slice_index const copy = branch_find_slice(STHelpAdapter, next, stip_traversal_context_help); assert(copy!=no_slice); pipe_link(SLICE_PREV(adapter),next); pipe_append(copy,adapter); pipe_remove(copy); } /* adjust the length and min_length members */ --SLICE_U(adapter).branch.length; if (SLICE_U(adapter).branch.min_length<=0) increase_min_length(adapter); --SLICE_U(adapter).branch.min_length; branch_shorten_slices(next,STHelpAdapter,stip_traversal_context_help); TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
/* Make the postkey play representation of a non-postkey play representation * @param adapter identifies adapter slice into battle branch * @return identifier to adapter slice into postkey representation */ slice_index battle_branch_make_postkeyplay(slice_index adapter) { slice_index result; TraceFunctionEntry(__func__); TraceFunctionParam("%u",adapter); TraceFunctionParamListEnd(); TraceStipulation(adapter); assert(SLICE_TYPE(adapter)==STAttackAdapter); { slice_index const notend = branch_find_slice(STNotEndOfBranchGoal, adapter, stip_traversal_context_intro); stip_length_type const length = SLICE_U(adapter).branch.length; stip_length_type const min_length = SLICE_U(adapter).branch.min_length; slice_index const proto = alloc_defense_adapter_slice(length-1, min_length-1); assert(notend!=no_slice); defense_branch_insert_slices(notend,&proto,1); result = branch_find_slice(STDefenseAdapter, notend, stip_traversal_context_defense); assert(result!=no_slice); branch_shorten_slices(adapter,STDefenseAdapter,stip_traversal_context_intro); pipe_remove(adapter); } TraceFunctionExit(__func__); TraceFunctionParam("%u",result); TraceFunctionParamListEnd(); return result; }