ShipData *shipdata ( const char *file ) { if (!victoryditty_datafile) { victoryditty_datafile = tw_load_datafile(data_full_path("victoryditty.dat").c_str()); } if (!file) return NULL; ShipDataMap::iterator shp = shipdatas.find(file); if (shp!=shipdatas.end()) return (*shp).second; if (!exists(file)) return NULL; ShipData *data = new ShipData(file); shipdatas[file] = data; return data; }
void GobGame::init(Log *_log) { STACKTRACE; int i; /* switch(_log->type) { // case Log::log_net1server: // case Log::log_net1client: { // error("unsupported game/log type"); // } // break; default: { } break; }/**/ Game::init(_log); log_file(home_ini_full_path("server.ini")); max_enemies = get_config_int("Gob", "MaxEnemies", 32); int starting_starbucks, starting_buckazoids; starting_starbucks = get_config_int("Gob", "StartingStarbucks", 0); starting_buckazoids = get_config_int("Gob", "StartingBuckazoids", 0); gobenemy = (GobEnemy**) malloc(sizeof(GobEnemy*) * max_enemies); size = Vector2(24000, 24000); enemy_team = new_team(); station_team = new_team(); // set_resolution(videosystem.width, videosystem.height); TW_DATAFILE *tmpdata; tmpdata = tw_load_datafile_object(data_full_path("gob.dat").c_str(), "station0sprite"); if (!tmpdata) tw_error( "couldn't find gob.dat#station0sprite"); stationSprite[0] = new SpaceSprite(tmpdata, 1, SpaceSprite::MASKED | SpaceSprite::MIPMAPED, 64); tw_unload_datafile_object(tmpdata); stationSprite[0]->permanent_phase_shift(8); tmpdata = tw_load_datafile_object(data_full_path("gob.dat").c_str(), "station1sprite"); if (!tmpdata) tw_error ("couldn't find gob.dat#station1sprite"); stationSprite[1] = new SpaceSprite(tmpdata, 1, SpaceSprite::MASKED | SpaceSprite::MIPMAPED, 64); tw_unload_datafile_object(tmpdata); stationSprite[1]->permanent_phase_shift(8); tmpdata = tw_load_datafile_object(data_full_path("gob.dat").c_str(), "station2sprite"); if (!tmpdata) tw_error ("couldn't find gob.dat#station2sprite"); stationSprite[2] = new SpaceSprite(tmpdata, 1, SpaceSprite::MASKED | SpaceSprite::MIPMAPED, 64); tw_unload_datafile_object(tmpdata); stationSprite[2]->permanent_phase_shift(8); tmpdata = tw_load_datafile_object(data_full_path("gob.dat").c_str(), "defender"); if (!tmpdata) tw_error ("couldn't find gob.dat#defender"); defenderSprite = new SpaceSprite(tmpdata, 1, SpaceSprite::MASKED | SpaceSprite::MIPMAPED); tw_unload_datafile_object(tmpdata); station_pic_name[0] = "gob.dat#station0picture.bmp"; station_pic_name[1] = "gob.dat#station1picture.bmp"; station_pic_name[2] = "gob.dat#station2picture.bmp"; station_build_name[0] = "supbl"; station_build_name[1] = "orzne"; station_build_name[2] = "kohma"; prepare(); add(new Stars()); num_planets = 0; i = 0; add_planet_and_station(meleedata.planetSprite, i, stationSprite[i], station_build_name[i], station_pic_name[i]); i = 1; add_planet_and_station(meleedata.planetSprite, i, stationSprite[i], station_build_name[i], station_pic_name[i]); i = 2; add_planet_and_station(meleedata.planetSprite, i, stationSprite[i], station_build_name[i], station_pic_name[i]); i = random() % 3; add_planet_and_station(meleedata.planetSprite, i, stationSprite[i], "utwju", station_pic_name[i]); for (i = 0; i < 42; i += 1) add(new GobAsteroid()); int server_players, client_players; set_config_file("client.ini"); server_players = client_players = get_config_int("Gob", "NumPlayers", 1); if (!lag_frames) client_players = 0; log_int(channel_server, server_players); log_int(channel_client, client_players); for (i = 0; i < server_players; i += 1) { char buffy[256]; sprintf(buffy, "Config%d", i); add_gobplayer(create_control(channel_server, "Human", buffy)); gobplayer[i]->new_ship(shiptype("supbl")); gobplayer[i]->starbucks = starting_starbucks+0; gobplayer[i]->buckazoids = starting_buckazoids+0; Ship *s = gobplayer[i]->ship; s->translate(size/2-s->normal_pos()); double angle = PI2 * i / (client_players + server_players); s->translate(rotate(Vector2(260, 120), angle)); s->accelerate(s, PI2/3 + angle, 0.17, MAX_SPEED); } for (i = server_players; i < client_players + server_players; i += 1) { char buffy[256]; sprintf(buffy, "Config%d", i - server_players); add_gobplayer(create_control(channel_client, "Human", buffy)); gobplayer[i]->new_ship(shiptype("supbl")); gobplayer[i]->starbucks = starting_starbucks; gobplayer[i]->buckazoids = starting_buckazoids; Ship *s = gobplayer[i]->ship; s->translate(size/2-s->normal_pos()); double angle = PI2 * i / (client_players + server_players); s->translate(rotate(Vector2(260, 120), angle)); s->accelerate(s, PI2/3 + angle, 0.17, MAX_SPEED); } for (i = 0; i < gobplayers+0; i += 1) add ( new RainbowRift() ); next_add_new_enemy_time = 1000; this->change_view("Hero"); //view = get_view ( "Hero", NULL ); view_locked = true; view->window->locate( 0,0, 0,0, 0,0.9, 0,1 ); add_new_enemy(); add_new_enemy(); return; }
AyronBS::AyronBS(Vector2 opos, double shipAngle, ShipData *shipData, unsigned int code) : BigShip(opos, shipAngle, shipData, code | SpaceSprite::NO_AA) { STACKTRACE; int i; int ix, iy; // read the layout FILE *inp; inp = tw_fopen(data_full_path("shpayrbs_layout.txt").c_str(), "rt"); if (!inp) {tw_error("couldn't find the AyronBS layout");} fscanf(inp, "%i\n", &nBSinfo); Ntypes = nBSinfo; BSinfo = new AyronShipPartInfo* [nBSinfo]; for ( i = 0; i < nBSinfo; ++i ) { BSinfo[i] = new AyronShipPartInfo(); fscanf(inp, "%*10c %lf %lf %lf %lf %lf", &BSinfo[i]->crew, &BSinfo[i]->batt, &BSinfo[i]->dynamo, &BSinfo[i]->turning, &BSinfo[i]->thrusting); BSinfo[i]->spr_crewed = data->more_sprites[i]; BSinfo[i]->spr_uncrewed = data->more_sprites[i + Ntypes]; } fscanf(inp, "%i %i\n", &Nx, &Ny); Nparts = Nx * Ny; // ayronparts = new (AyronShipPart*) [N]; ayronparts = new AyronShipPart* [Nparts](); parts = (BigShipPart**) ayronparts; int *itype, *iweapon; double *anglecenter, *moveangle; itype = new int [Nparts]; iweapon = new int [Nparts]; anglecenter = new double [Nparts]; moveangle = new double [Nparts]; // the ship hull sprites for ( i = 0; i < Nparts; ++i ) { fscanf(inp, "%i", &itype[i]); } // the ship weapons for ( i = 0; i < Nparts; ++i ) { fscanf(inp, "%i %lf %lf", &iweapon[i], &anglecenter[i], &moveangle[i]); anglecenter[i] *= PI / 180.0; moveangle[i] *= PI / 180.0; } fclose(inp); // the dimension of a single block of the ship (on a regular grid). // note that each block should be square, and of each grid-block is // of the same size. w = data->more_sprites[0]->size(0).x; // the orig picture has 0.5 extra room to allow for rotation; this extra room // is empty. w /= 1.5; // initialize the ship ayronparts. for ( iy = 0; iy < Ny; ++iy ) { for ( ix = 0; ix < Nx; ++ix ) { int k; k = iy*Nx + ix; Vector2 relpos; relpos = w * Vector2(0.5*(Ny-1) - iy, ix - 0.5*(Nx-1)); ayronparts[k] = init_part(relpos, itype[k], BSinfo); if (ayronparts[k]) physics->add(ayronparts[k]); // AutoGun(AyronBS *aowner, Vector2 orelpos, int otype, SpaceSprite *spr); if (iweapon[k] == 1) game->add(new AutoGun(ayronparts[k], relpos, anglecenter[k], moveangle[k], data->spriteWeapon, data->spriteWeaponExplosion)); } } delete[] itype; delete[] iweapon; delete[] anglecenter; delete[] moveangle; for ( i = 0; i < nBSinfo; ++i ) delete BSinfo[i]; delete[] BSinfo; weaponColor = tw_get_config_int("Weapon", "Color", 0); weaponRange = scale_range(tw_get_config_float("Weapon", "Range", 0)); weaponDamage = tw_get_config_int("Weapon", "Damage", 0); recharge_rate_ref = recharge_rate; turn_rate_ref = turn_rate; accel_rate_ref = accel_rate; // remove this from the physics interaction //mass = 0; this value is needed by the ship ayronparts collide_flag_anyone = 0; collide_flag_sameship = 0; collide_flag_sameteam = 0; attributes |= ATTRIB_UNDETECTABLE; // also, add the ship's ayronparts to the physics target list // for (i = 0; i < N; ++i ) // if (ayronparts[i]) // game->add_target(ayronparts[i]); // update: no need to this here anymore, it's done in the part-constructor. crew_max = 0; for ( i = 0; i < Nparts; ++i ) if (ayronparts[i]) crew_max += ayronparts[i]->crew_max; }
void GobStation::station_screen(GobPlayer *s) { STACKTRACE; BITMAP *background = load_bitmap(data_full_path(background_pic).c_str(), NULL); if (!background) { message.print(1000, 15, "%s", background_pic); tw_error ("couldn't load station background"); } game->window->lock(); aa_set_mode(AA_DITHER); aa_stretch_blit(background, game->window->surface, 0,0,background->w,background->h, game->window->x,game->window->y,game->window->w, game->window->h); game->window->unlock(); while (true) { sprintf(dialog_string[0], "%03d Starbucks %03d Buckazoids", s->starbucks, s->buckazoids); int r = 0; if (game->is_local(s->channel)) r = tw_do_dialog(game->window, station_dialog, STATION_DIALOG_DEPART); game->log_int(s->channel, r); switch (r) { case STATION_DIALOG_UPGRADE: { upgrade_menu(this, s); aa_set_mode(AA_DITHER); aa_stretch_blit(background, game->window->surface, 0,0,background->w,background->h, game->window->x,game->window->y, game->window->w, game->window->h); } break; case STATION_DIALOG_NEWSHIP: { buy_new_ship_menu(s); } break; case STATION_DIALOG_REPAIR: { if (s->ship->crew == s->ship->crew_max) { if (game->is_local(s->channel)) alert("You don't need repairs", "", "", "Oh, okay", "I knew that", 0, 0); break; } int p = 0; if (game->is_local(s->channel)) p = alert3("Which would you prefer", "to pay for your repairs", "", "1 &Starbuck", "1 &Buckazoid", "&Nothing!", 's', 'b', 'n'); game->log_int(s->channel, p); switch (p) { case 1: { if (s->starbucks) { s->starbucks -= 1; s->ship->crew = s->ship->crew_max; } else { if (game->is_local(s->channel)) alert("You don't have enough!", NULL, NULL, "&Shit", NULL, 's', 0); } } break; case 2: { if (s->buckazoids) { s->buckazoids -= 1; s->ship->crew = s->ship->crew_max; } else { if (game->is_local(s->channel)) alert("You don't have enough!", NULL, NULL, "&Shit", NULL, 's', 0); } } break; case 3: { r = STATION_DIALOG_DEPART; } break; } } break; } if (r == STATION_DIALOG_DEPART || r == -1) break; } return; }