void sprite_set_anim(struct sprite* self, struct anim* anim) { if (self->anim != anim) { if(self->anim) { anim_free(self->anim); } self->anim = anim; anim_play(anim); } }
/** * Create a new head animation object */ anim_instance* HudGaugeTalkingHead::createAnim(int anim_start_frame, anim* anim_data) { anim_play_struct aps; anim_play_init(&aps, anim_data, position[0] + Anim_offsets[0] + fl2i(HUD_offset_x), position[1] + Anim_offsets[1] + fl2i(HUD_offset_y), base_w, base_h); aps.start_at = anim_start_frame; // aps.color = &HUD_color_defaults[HUD_color_alpha]; aps.color = &HUD_config.clr[HUD_TALKING_HEAD]; // I'd much rather use gr_init_color and retrieve the colors from this object but no, aps.color just happens to be a pointer. // So, just give it the address from the player's HUD configuration. You win, aps.color. I'll take care of you next time. (Swifty) return anim_play(&aps); }
void fish_generate() { fish *f; int idx; if(!Fish_inited){ return; } // bogus anims if((Fish_left_anim == NULL) || (Fish_right_anim == NULL)){ return; } // find a free fish f = NULL; for(idx=0; idx<MAX_FISH; idx++){ if(!Fish[idx].swimming){ f = &Fish[idx]; } } // no fish left if(f == NULL){ return; } // left or right f->left = frand_range(0.0f, 1.0f) < 0.5f ? 0 : 1; // start location if(f->left){ f->x = gr_screen.max_w_unscaled_zoomed + frand_range(0.0f, 50.0f); } else { f->x = frand_range(0.0f, -50.0f) - FISH_ANIM_WIDTH; } f->y = frand_range(-40.0f, (float)gr_screen.max_h_unscaled_zoomed + 40.0f); // speed if(f->left){ f->x_speed = frand_range(-1.0f, -15.0f); } else { f->x_speed = frand_range(1.0f, 15.0f); } f->y_speed = frand_range(0.0f, 1.0f) < 0.5f ? frand_range(1.0f, 4.0f) : frand_range(-1.0f, -4.0f); // all fish start out offscreen f->onscreen = 0; // he's swimming f->swimming = 1; // anim instance anim_play_struct aps; if(f->left){ anim_play_init(&aps, Fish_left_anim, (int)f->x, (int)f->y); f->a = anim_play(&aps); // doh. cancel him if(f->a == NULL){ f->swimming = 0; } else { f->a->screen_id = GS_STATE_MAIN_MENU; f->a->looped = 1; f->a->framerate_independent = 1; } } else { anim_play_init(&aps, Fish_right_anim, (int)f->x, (int)f->y); f->a = anim_play(&aps); // doh. cancel him if(f->a == NULL){ f->swimming = 0; } else { f->a->screen_id = GS_STATE_MAIN_MENU; f->a->looped = 1; f->a->framerate_independent = 1; } } }
static void play_callback( Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { anim_play(); }
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; }