bool SIntro::AddRing(int ns, float r1, float r2, int nr, float rotv)
{
	float a = RANDOM(0.0f, pi2);
	float da = pi2/ns;
	float ma = 0.1f*da;
	int i;
	SISegment* S;

	for (i = 0; i < ns; a += da, i++)
	{
		if (!(S = new SISegment)->Init(this, a + RANDOM(0.0f, ma), a + da - RANDOM(0.0f, ma), 4, r1, r2, nr, rotv)) return false;
		S->DelayTime = 1.0f + ((Segments.Count - 1)%10)*0.2f;
		S->BlinkTime = 0.3f;
	}

	return true;
}

void SIntro::Print(float dly, float x, float y, const char* fn, bool fl)
{
	CVFile* F;
	if (!(F = VDisk->Open(fn, "universe\\texts\\", true))) return;

	static int grp = 0;
	char s[201];

	Screen->DefState();
	Screen->State.Group = grp++;
	Screen->State.AtY = y;
	Screen->State.Height = 3.0f;
	Screen->State.Color = D3DXCOLOR(0.0f, 0.5f, 1.0f, 1.0f);
	/*if (fl)
		Screen->State.FlashT = 0.5f;
	else*/
		Screen->State.BlinkT = 0.3f;
	Screen->State.FadeOutT = 4.0f;

	Screen->State.Delay = dly;
	Screen->PutChar(' ');
	Screen->State.Delay = 0.0f;

	while (F->ReadL(s))
	{
		if (!RANDOM(0, 10))
		{
			Screen->State.Delay = 0.25f;
			Screen->PutChar(' ');
			Screen->State.Delay = 0.0f;
		}

		Screen->State.AtX = x;
		Screen->Print(s);
		Screen->State.AtY += Screen->State.Height;
	}

	Screen->Clear(Screen->State.Group, 0, IG_MAX, false);

	delete F;
}

void SIntro::Move(float dt)
{
	Time += dt;

	if (!eSun && 10.0f <= Time) { SunV = 1.0f/3.0f; eSun = true; }

	if (!eFilter && 13.0f <= Time) { FilterV = 1.0f/3.0f; eFilter = true; }

	if (!eSegm && 16.0f <= Time) { CDELETE(Hole); eSegm = true; }

	SunL += dt*SunV;
	SunL = max(SunL, 0.0f);
	SunL = min(SunL, 1.0f);
	Sun->Active = SunL < 1.0f;
	Sun->Color = MulColor(1.0f - SunL, COL_WHITE);
	SunB->Active = SunL > 0.0f;
	SunB->Color = MulColor(SunL, COL_WHITE);
	if (Hole)
	{
		Hole->RayColA = MulColor(1.0f - SunL, D3DXCOLOR(0.3f, 0.3f, 0.2f, 1.0f));
		Hole->RayColB = MulColor(1.0f - SunL, D3DXCOLOR(0.7f, 0.7f, 0.6f, 1.0f));
	}

	FilterL += dt*FilterV;
	FilterL = max(FilterL, 0.0f);
	FilterL = min(FilterL, 1.0f);
	EfxBase->AddFlash(0, FLASH_AMP, MidColor(D3DXCOLOR(0.2f, 0.1f, 0.1f, 1.0f), D3DXCOLOR(0.0f, 0.2f, 0.5f, 1.0f), FilterL));
	if (FilterL > 0.0f) EfxBase->AddFlash(0, FLASH_FLT, MulColor(FilterL, D3DXCOLOR(0.8f, 0.5f, 0.0f, 1.0f)));
	if (Hole) Hole->Color = MulColor(1.0f - FilterL*FilterL, COL_WHITE);

	PlanetL -= dt*(1.0f/16.0f);
	PlanetL = max(PlanetL, 0.0f);
	Planet->XFLocal = ScaleMatrix(650.0f)*TranslateMatrix(PlanetL*D3DXVECTOR3(3000.0f, -500.0f, 0.0f));
	Planet->LChanged = true;

	if ((BlinkTime -= dt) <= 0.0f)
	{
		Blink = !Blink;
		BlinkTime = 0.05f;
	}

	SScene::Move(dt);

	Camera.Move(dt);
	CameraPos = Camera.Position;
	XFView = Camera.XFView();
	XFCamTran = TranslateMatrix(Camera.Position);

	MoveFlares(dt);
	MoveEfxs(dt);

	Screen->Move(dt);

	if (eSegm)
	{
		CLIST_ITEM<SISegment>* S;
		for (S = Segments.First; S; S = S->Next) S->Ptr->Move(dt);
	}
}
