static slice_index make_opponent_moves_counter_fork(Side side) { slice_index result; TraceFunctionEntry(__func__); TraceEnumerator(Side,side); TraceFunctionParamListEnd(); if (is_countnropponentmoves_defense_move_optimisation_enabled(side)) { slice_index const proxy = alloc_proxy_slice(); slice_index const prototypes[] = { alloc_opponent_moves_counter_slice(), alloc_legal_attack_counter_slice() }; enum { nr_prototypes = sizeof prototypes / sizeof prototypes[0] }; slice_index const attack = alloc_defense_branch(slack_length+2,slack_length+1); slice_insertion_insert(attack,prototypes,nr_prototypes); link_to_branch(proxy,attack); result = alloc_conditional_pipe(STOpponentMovesCounterFork,proxy); solving_impose_starter(result,side); } else result = alloc_proxy_slice(); TraceFunctionExit(__func__); TraceFunctionResult("%u",result); TraceFunctionResultEnd(); return result; }
static slice_index make_back_home_finder(Side side) { slice_index const proxy = alloc_proxy_slice(); slice_index const result = alloc_conditional_pipe(STBackHomeFinderFork,proxy); slice_index const defense = alloc_defense_branch(slack_length+1,slack_length+1); slice_index const prototypes[] = { alloc_pipe(STBackHomeMovesOnly), alloc_legal_defense_counter_slice() }; slice_insertion_insert(defense,prototypes,2); link_to_branch(proxy,defense); solving_impose_starter(result,side); return result; }
/* Produce the sequence of slices that tests whether a self stipulation has been * solved * @param proxy_to_goal identifies sequence of slices testing for the goal * @return identifier of the entry slice */ static slice_index MakeEndOfSelfPlay(slice_index proxy_to_goal) { slice_index result; TraceFunctionEntry(__func__); TraceFunctionParam("%u",proxy_to_goal); TraceFunctionParamListEnd(); result = alloc_defense_branch(1,1); battle_branch_insert_self_end_of_branch_goal(result,proxy_to_goal); TraceFunctionExit(__func__); TraceFunctionResult("%u",result); TraceFunctionResultEnd(); return result; }
/* Allocate a STGoalImmobileReachedTester slice. * @param starter_or_adversary is the starter immobilised or its adversary? * @return index of allocated slice */ slice_index alloc_goal_immobile_reached_tester_slice(goal_applies_to_starter_or_adversary starter_or_adversary) { slice_index result; TraceFunctionEntry(__func__); TraceValue("%u",starter_or_adversary); TraceFunctionParamListEnd(); { slice_index const proxy = alloc_proxy_slice(); slice_index const tester = alloc_pipe(STImmobilityTester); result = alloc_conditional_pipe(STGoalImmobileReachedTester,proxy); pipe_link(proxy,tester); link_to_branch(tester,alloc_defense_branch(1,1)); SLICE_U(result).goal_filter.applies_to_who = starter_or_adversary; } TraceFunctionExit(__func__); TraceFunctionResult("%u",result); TraceFunctionResultEnd(); return result; }