void map_display(struct map* map) { assert(map != NULL); assert(map->height > 0 && map->width > 0); int x, y; for (int i = 0; i < map->width; i++) { for (int j = 0; j < map->height; j++) { x = i * SIZE_BLOC; y = j * SIZE_BLOC; unsigned char type = map->grid[CELL(i,j)]; switch (type & 15) { case CELL_SCENERY: display_scenery(map, x, y, type); break; case CELL_CASE: window_display_image(sprite_get_box(), x, y); break; case CELL_BONUS: display_bonus(map, x, y, type); break; case CELL_KEY: window_display_image(sprite_get_key(), x, y); break; case CELL_DOOR: window_display_image(sprite_get_door(), x, y); break; case CELL_CLOSED_DOOR: window_display_image(sprite_get_closed_door(), x, y); break; case CELL_GOAL: window_display_image(sprite_get_princess(), x, y); break; } } } }
/* Display the game's interface */ void game_banner_display(struct game* game) { assert(game); struct level* level = game->curr_level; struct map* map = level_get_curr_map(level); if(game->nb_player <= 1) { struct player* player = game->players[0]; int y = (map_get_height(map)) * SIZE_BLOC; for (int i = 0; i < map_get_width(map); i++) window_display_image(sprite_get_banner_line(), i * SIZE_BLOC, y); int white_bloc = ((map_get_width(map) * SIZE_BLOC) - 9 * SIZE_BLOC) / 6; int x = white_bloc; y = (map_get_height(map) * SIZE_BLOC) + LINE_HEIGHT; window_display_image(sprite_get_number(game->nb_curr_level), x, y); x += SIZE_BLOC - 5; window_display_image(sprite_get_number(10), x, y); x += 10; window_display_image(sprite_get_number(level_get_curr_nb_map(level)),x, y); x += white_bloc + SIZE_BLOC; window_display_image(sprite_get_banner_life(), x, y); // sprite life x += SIZE_BLOC; window_display_image( sprite_get_number(player_get_nb_life(game_get_player(game, 1))), x, y); // life number x += white_bloc + SIZE_BLOC; window_display_image(sprite_get_banner_bomb(), x, y); // bomb sprite x += SIZE_BLOC; window_display_image( sprite_get_number(player_get_nb_bomb(game_get_player(game, 1))), x, y); // bomb number x += white_bloc + SIZE_BLOC; window_display_image(sprite_get_banner_range(), x, y); // range sprite x += SIZE_BLOC; window_display_image( sprite_get_number(player_get_nb_range(game_get_player(game, 1))), x, y); // range number x += white_bloc + SIZE_BLOC; if(player_get_key(player) > 0) window_display_image(sprite_get_key(), x, y); } else { int y = (map_get_height(map)) * SIZE_BLOC; for (int i = 0; i < map_get_width(map); i++) window_display_image(sprite_get_banner_line(), i * SIZE_BLOC, y); y = (map_get_height(map) * SIZE_BLOC) + LINE_HEIGHT; int white_bloc = ((map_get_width(map) * SIZE_BLOC) - 2*game->nb_player * SIZE_BLOC) / (game->nb_player + 1); int x = 0; for(int i = 0; i < game->nb_player; i++) { x+= white_bloc; window_display_sprite( sprite_get_players(i+1), sprite_get_rect_player_anim(0, i+1, SOUTH), x, y + 2); x+= SIZE_BLOC; window_display_image(sprite_get_number(game->scores[i]), x, y); x+=SIZE_BLOC; } } }
int main(int argc, char *argv[]) { // commandline argument parser options struct arg_lit *help = arg_lit0("h", "help", "print this help and exit"); struct arg_lit *vers = arg_lit0("v", "version", "print version information and exit"); struct arg_file *file = arg_file1("f", "file", "<file>", "Input .BK file"); struct arg_file *output = arg_file0("o", "output", "<file>", "Output .BK file"); struct arg_int *anim = arg_int0("a", "anim", "<animation_id>", "Select animation"); struct arg_lit *all_anims = arg_lit0("A", "all_anims", "All animations"); struct arg_int *sprite = arg_int0("s", "sprite", "<sprite_id>", "Select sprite (requires --anim)"); struct arg_lit *keylist = arg_lit0(NULL, "keylist", "Prints a list of valid fields for --key."); struct arg_str *key = arg_strn("k", "key", "<key>", 0, 2, "Select key"); struct arg_str *value = arg_str0(NULL, "value", "<value>", "Set value (requires --key)"); struct arg_lit *play = arg_lit0(NULL, "play", "Play animation or sprite (requires --anim)"); struct arg_int *scale = arg_int0(NULL, "scale", "<factor>", "Scales sprites (requires --play)"); struct arg_lit *parse = arg_lit0(NULL, "parse", "Parse value (requires --key)"); struct arg_end *end = arg_end(20); void* argtable[] = {help,vers,file,output,anim,all_anims,sprite,keylist,key,value,play,scale,parse,end}; const char* progname = "bktool"; // Make sure everything got allocated if(arg_nullcheck(argtable) != 0) { printf("%s: insufficient memory\n", progname); goto exit_0; } // Parse arguments int nerrors = arg_parse(argc, argv, argtable); // Handle help if(help->count > 0) { printf("Usage: %s", progname); arg_print_syntax(stdout, argtable, "\n"); printf("\nArguments:\n"); arg_print_glossary(stdout, argtable, "%-30s %s\n"); goto exit_0; } // Handle version if(vers->count > 0) { printf("%s v0.1\n", progname); printf("Command line One Must Fall 2097 .BK file editor.\n"); printf("Source code is available at https://github.com/omf2097 under MIT license.\n"); printf("(C) 2013 Tuomas Virtanen\n"); goto exit_0; } // Argument dependencies if(anim->count == 0) { if(sprite->count > 0) { printf("--sprite requires --anim\n"); printf("Try '%s --help' for more information.\n", progname); goto exit_0; } if(play->count > 0) { printf("--play requires --anim\n"); printf("Try '%s --help' for more information.\n", progname); goto exit_0; } } if(key->count == 0) { if(value->count > 0) { printf("--value requires --key\n"); printf("Try '%s --help' for more information.\n", progname); goto exit_0; } } if(output->count == 0) { if(value->count > 0) { printf("--value requires --output\n"); printf("Try '%s --help' for more information.\n", progname); goto exit_0; } } if(play->count == 0) { if(scale->count > 0) { printf("--scale requires --play\n"); printf("Try '%s --help' for more information.\n", progname); goto exit_0; } } // Handle errors if(nerrors > 0) { arg_print_errors(stdout, end, progname); printf("Try '%s --help' for more information.\n", progname); goto exit_0; } // Init SDL SDL_Init(SDL_INIT_VIDEO); // Load file sd_bk_file *bk = sd_bk_create(); int ret = sd_bk_load(bk, file->filename[0]); if(ret) { printf("Unable to load BK file! Make sure the file exists and is a valid BK file.\n"); goto exit_1; } // Scaling variable int _sc = 1; if(scale->count > 0) { _sc = scale->ival[0]; if(_sc > 4) _sc = 4; if(_sc < 1) _sc = 1; } // Handle args if(sprite->count > 0) { // Make sure sprite exists. if(!check_anim_sprite(bk, anim->ival[0], sprite->ival[0])) { goto exit_1; } sd_sprite *sp = bk->anims[anim->ival[0]]->animation->sprites[sprite->ival[0]]; // Handle arguments if(key->count > 0) { if(value->count > 0) { sprite_set_key(sp, key->sval, key->count, value->sval[0]); } else { sprite_get_key(sp, key->sval, key->count); } } else if(keylist->count > 0) { sprite_keylist(); } else if(play->count > 0) { sprite_play(bk, _sc, anim->ival[0], sprite->ival[0]); } else { sprite_info(sp, anim->ival[0], sprite->ival[0]); } } else if(anim->count > 0) { // Make sure the bkanim exists if(!check_anim(bk, anim->ival[0])) { goto exit_1; } sd_bk_anim *bka = bk->anims[anim->ival[0]]; sd_animation *ani = bka->animation; if(key->count > 0) { if(value->count > 0) { bkanim_set_key(bka, ani, key->sval, key->count, value->sval[0]); } else { bkanim_get_key(bka, ani, key->sval, key->count, parse->count); } } else if(keylist->count > 0) { bkanim_keylist(); } else if(play->count > 0) { anim_play(bk, _sc, anim->ival[0]); } else { bkanim_info(bka, ani, anim->ival[0]); } } else if(all_anims->count > 0) { sd_bk_anim *bka; sd_animation *ani; for(int i = 0; i < 50; i++) { if (bk->anims[i]) { bka = bk->anims[i]; ani = bka->animation; if(key->count > 0) { if(value->count > 0) { bkanim_set_key(bka, ani, key->sval, key->count, value->sval[0]); } else { printf("Animation %2u: ", i); bkanim_get_key(bka, ani, key->sval, key->count, parse->count); } } else { printf("\n"); bkanim_info(bka, ani, i); } } } } else { if(key->count > 0) { if(value->count > 0) { bk_set_key(bk, key->sval, key->count, value->sval[0]); } else { bk_get_key(bk, key->sval, key->count); } } else if(keylist->count > 0) { bk_keylist(); } else { bk_info(bk); } } // Write output file if(output->count > 0) { sd_bk_save(bk, output->filename[0]); } // Quit exit_1: sd_bk_delete(bk); SDL_Quit(); exit_0: arg_freetable(argtable, sizeof(argtable)/sizeof(argtable[0])); return 0; }