void ObjectLayer::lower(const ObjMapObject& obj) { int i = get_object_index(obj); if (i != -1 && i > 0) { std::swap(impl->objects[i], impl->objects[i-1]); } }
void ObjectLayer::raise(const ObjMapObject& obj) { int i = get_object_index(obj); if (i != -1 && impl->objects.size() > 1 && i < int(impl->objects.size())-1) { std::swap(impl->objects[i], impl->objects[i+1]); } }
void build_map(){ TYPE_CO = -1; TYPE_AR = -1; TYPE_PI = -1; int i,j; for(i=0;i<dis_gnum_types;i++){ if( dis_gtype_names[i] == NULL ) continue; if( strncmp(dis_gtype_names[i],"AR",strlen("AR"))==0 )TYPE_AR = i; else if( strncmp(dis_gtype_names[i],"PI",strlen("PI"))==0 ) TYPE_PI = i; } for(i=0;i<dis_gnum_predicates;i++){ if( dis_gpredicates[i]==NULL )continue; if( strncmp(dis_gpredicates[i],"C",strlen("C")) == 0 ) TYPE_CO = i; else if ( strncmp(dis_gpredicates[i],"FI",strlen("FI")) == 0 ) TYPE_FI = i; else if ( strncmp(dis_gpredicates[i],"L",strlen("L")) == 0 ) TYPE_LA = i; else if ( strncmp(dis_gpredicates[i],"FO",strlen("FO")) == 0 ) TYPE_FO = i; else if ( strncmp(dis_gpredicates[i],"O",strlen("O")) == 0 ) TYPE_O = i; } //printf("TYPE_CO%d,FIRST%d,LAST%d,FOLLOW%d,ON%d\n",TYPE_CO,TYPE_FI,TYPE_LA,TYPE_FO,TYPE_O); if( TYPE_CO == -1 || TYPE_AR == -1 || TYPE_PI== -1 ) {printf("CRITICAL ERROR"); return;} area_num = dis_gtype_size[TYPE_AR]; pipe_num = dis_gtype_size[TYPE_PI]; map = malloc( sizeof(int) * area_num * area_num ); for(i=0;i<area_num;i++) for(j=0;j<area_num;j++){ map[i*area_num+j] = -1; map[j*area_num+i] = -1; } for( i=0 ; i<dis_gnum_initial_predicate[TYPE_CO] ; i++ ){ dis_Fact *fact = &(dis_ginitial_predicate[TYPE_CO][i]); int index1 = get_object_index(fact->args[0],TYPE_AR); int index2 = get_object_index(fact->args[1],TYPE_AR); map[index1*area_num+index2] = fact->args[2]; map[index2*area_num+index1] = fact->args[2]; } }
float get_pipe_cost(int pipe_id){ int speed = 1; //return pipe_size[get_object_index(pipe_id,TYPE_PI)] / speed ; return pipe_size[get_object_index(pipe_id,TYPE_PI)]; }
void get_path_1006(int f1, int f2, int *path, int *path_len, dis_State *state){ int len = 0,i,j; dis_Fact *fact1 = &(dis_grelevant_facts[f1]); dis_Fact *fact2 = &(dis_grelevant_facts[f2]); int from_index = -1; int to_index = -1; int is_o_flag = 0; int visited[500]; int expand_list[500]; int pre[500]; int expand_list_size = -1; if( fact1->predicate == TYPE_O ){ //printf("IS_ON\n"); from_index = get_object_index(fact1->args[1],TYPE_AR); to_index = get_object_index(fact2->args[1],TYPE_AR); //printf("from_index%d,to_index %d\n",from_index,to_index); is_o_flag = 1; expand_list[0] = from_index; expand_list_size = 1; }else{ int location = get_hidden_location(state, f1); //printf("HIDDEN LOCATION%s",dis_gconstants[location]); from_index = -1; to_index = get_object_index(fact2->args[1],TYPE_AR); for(i=0;i<dis_gnum_initial_predicate[TYPE_CO];i++){ dis_Fact *fact = &(dis_ginitial_predicate[TYPE_CO][i]); if(fact->args[2]==location){ // printf("CHOSEN FACT:");dis_print_dis_Fact(fact);printf("\n"); expand_list[0] = get_object_index(fact->args[0],TYPE_AR); expand_list[1] = get_object_index(fact->args[1],TYPE_AR); break; } } expand_list_size = 2; is_o_flag = 0; } for( i=0;i<area_num;i++){ pre[i] = -1; visited[i] = 0; } do{ for( i=0 ; i< expand_list_size ; i++) visited[ expand_list[i] ] = 1; int tmp_list[500]; int tmp_list_size = 0; for( i=0 ; i<expand_list_size; i++) for( j=0 ; j<area_num ; j++ ){ int v = map[expand_list[i]*area_num + j ]; if ( v!= -1 && !visited[j]) { //printf("SETTING VALUE FOR PRE[%d]\n",j); pre[j] = expand_list[i]; tmp_list[tmp_list_size++] = j; } } expand_list_size = 0; for(i=0;i<tmp_list_size;i++) expand_list[ expand_list_size++ ] = tmp_list[i]; }while(expand_list_size); int tmp[500]; int tmp_size = 0; int start = to_index; while( start!= from_index && start!=-1 ){ tmp[tmp_size++] = dis_gtype_consts[TYPE_AR][start]; start = pre[start]; } if(start!=-1) tmp[tmp_size++] = dis_gtype_consts[TYPE_AR][start]; //In the tmp list, there are all objects; if( !is_o_flag ) path[len++] = f1; for(i=tmp_size-1;i>=0;i--){ int object = tmp[i]; for(j=0;j<dis_gnum_relevant_facts;j++){ dis_Fact *fact = &(dis_grelevant_facts[j]); if ( fact->predicate == TYPE_O && fact->args[0] == fact2->args[0] && fact->args[1] == object) path[len++] = j; } } *path_len = len; }