Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}