+state *encode_goal(sokoban_screen *screen){
+ int boxes = 0;
+ int targets = 0;
+
+ LACE_ME;
+
+ BDDVAR vars[HASH_COUNT(screen) * 3];
+ for (uint8_t i = 0; i < HASH_COUNT(screen) * 3; i++){
+ vars[i] = i * 2;
+ }
+
+ uint8_t st_enc[HASH_COUNT(screen) * 3];
+
+ BDDSET varset = sylvan_set_fromarray(vars, HASH_COUNT(screen) * 3);
+ BDD s;
+ state *fullState = NULL;
+ fullState = (state *)malloc(sizeof(state));
+ fullState->vars.varset = varset;
+ fullState->vars.size = HASH_COUNT(screen) * 3;
+ int tile_index = 0;
+ sokoban_screen *r;
+ for(r=screen; r != NULL; r = (sokoban_screen *)(r->hh.next)){
+ switch(r->tile){
+ case FREE: //001 -> any
+ st_enc[tile_index] = 2;
+ tile_index++;
+ st_enc[tile_index] = 2;
+ tile_index++;
+ st_enc[tile_index] = 2;
+ tile_index++;
+ break;
+ case WALL: //000 -> stays the same
+ st_enc[tile_index] = 0;
+ tile_index++;
+ st_enc[tile_index] = 0;
+ tile_index++;
+ st_enc[tile_index] = 0;
+ tile_index++;
+ break;
+ case BOX: //010 -> any
+ boxes++;
+ st_enc[tile_index] = 2;
+ tile_index++;
+ st_enc[tile_index] = 2;
+ tile_index++;
+ st_enc[tile_index] = 2;
+ tile_index++;
+ break;
+ case TARGET: //011 -> targbox
+ targets++;
+ st_enc[tile_index] = 1;
+ tile_index++;
+ st_enc[tile_index] = 0;
+ tile_index++;
+ st_enc[tile_index] = 0;
+ tile_index++;
+ break;
+ case AGENT: //101 -> any
+ st_enc[tile_index] = 2;
+ tile_index++;
+ st_enc[tile_index] = 2;
+ tile_index++;
+ st_enc[tile_index] = 2;
+ tile_index++;
+ break;
+ case TARGAGENT: //110 -> targbox
+ targets++;
+ st_enc[tile_index] = 1;
+ tile_index++;
+ st_enc[tile_index] = 0;
+ tile_index++;
+ st_enc[tile_index] = 0;
+ tile_index++;
+ break;
+ case TARGBOX: //100 -> stays the same
+ targets++;
+ boxes++;
+ st_enc[tile_index] = 1;
+ tile_index++;
+ st_enc[tile_index] = 0;
+ tile_index++;
+ st_enc[tile_index] = 0;
+ tile_index++;
+ break;
+ }
+ }
+ s = sylvan_cube(varset, st_enc);
+ fullState->bdd = s;
+ printf("Goal state encoded\n");
+ if (targets == 0 || (boxes != targets)) return NULL;
+ else return fullState;
+
+}
+