#include "DxLib.h"
#include "math.h"

unsigned int iro1 = GetColor(0xff,0xff,0xff);
unsigned int iro2 = GetColor(0xaa, 0xaa, 0xff);
unsigned int iro3 = GetColor(0xff, 0xff, 0x00);
int star[240][2];
int xp;
int i,j;
int mm,zz,k,h;
int ss;
int a1,b1,c1,a2,b2,c2,a3,b3,c3;
int xxx, xxx2, yyy, yyy2;

const double PI = 3.14159;
double radian;
double result1;
double result2;
double radian2;
double result1b;
double result2b;
double x, x2;
double y, y2;
double xxa, xxb, zza, zzb, xxf, zzf;

void settei(void);
void seisi(void);
void migi(void);
void hidari(void);
void pt1(void);
void pt2(void);
void pt3(void);
void pt4(void);
void pt5(void);
void pt6(void);


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

	SetOutApplicationLogValidFlag(FALSE);

	if (DxLib_Init() == -1)
	{
		return -1;
	}

	SetDrawScreen(DX_SCREEN_BACK);

	mm = 5;

	for (i = 0; i < 100; i++) {
		star[i][0] = GetRand(639);
		star[i][1] = GetRand(200);
	}

	for (i = 100; i < 140; i++) {
		star[i][0] = GetRand(639);
		star[i][1] = GetRand(6)+220;
	}

	for (i = 140; i < 240; i++) {
		star[i][0] = GetRand(639);
		star[i][1] = GetRand(6)+226;
	}

	a1 = GetRand(2);

	if(a1==0){
		b1 = GetRand(1)+1;
		c1 = 0;
		a2 = GetRand(29) + 3;
		b2 = GetRand(11) + 6;
		c2 = GetRand(29) + 3;
	}

	else {
		b1 = 0;
		c1 = GetRand(1) + 1;
		a2 = GetRand(11) + 6;
		b2 = GetRand(29) + 3;
		c2 = GetRand(11) + 6;
	}

	if (a1 == 0 && b1 == 1 && c1 == 0) ss = 1;
	if (a1 == 0 && b1 == 2 && c1 == 0) ss = 2;
	if (a1 == 1 && b1 == 0 && c1 == 1) ss = 3;
	if (a1 == 1 && b1 == 0 && c1 == 2) ss = 4;
	if (a1 == 2 && b1 == 0 && c1 == 1) ss = 5;
	if (a1 == 2 && b1 == 0 && c1 == 2) ss = 6;

	if (a2 >= 20) {
			a3 = 20; b3 = 0; c3 = 0;
	}
	else if ((a2 + b2) >= 20) {
			a3 = a2; b3 = 20 - a3; c3 = 0;
	}
	else {
			a3 = a2; b3 = b2; c3 = 20 - (a3 + b3);
	}

	while (1) {

		ClearDrawScreen();

		switch (ss) {
		case 1:
			seisi();
			pt1();
			break;
		case 2:
			seisi();
			pt2();
			break;
		case 3:
			migi();
			pt3();
			break;
		case 4:
			migi();
			pt4();
			break;
		case 5:
			hidari();
			pt5();
			break;
		case 6:
			hidari();
			pt6();
			break;
		}

		mm = mm - 1;

		if (mm <= 0) {
			mm = 5;
			a2 = a2 - 1;
		}

		if (a2 <= 0) {
			settei();
		}

		if (a2 >= 20) {
			a3 = 20; b3 = 0; c3 = 0;
		}
		else if ((a2 + b2) >= 20) {
			a3 = a2; b3 = 20 - a3; c3 = 0;
		}
		else {
			a3 = a2; b3 = b2; c3 = 20 - (a3 + b3);
		}

		ScreenFlip();

		WaitTimer(20);

		if (ProcessMessage() == -1)break;

		if (CheckHitKey(KEY_INPUT_SPACE) == 1)break;

	}

	DxLib_End();

	return 0; 

}



void settei(void){

	a1 = b1;
	a2 = b2;
	b1 = c1;
	b2 = c2;

	if (a1 == 0) {
		c1 = 0;
		c2 = GetRand(29) + 3;
	}
	else {
		c1 = GetRand(1) + 1;
		c2 = GetRand(11) + 6;
	}

	if (a1 == 0 && b1 == 1 && c1 == 0) ss = 1;
	if (a1 == 0 && b1 == 2 && c1 == 0) ss = 2;
	if (a1 == 1 && b1 == 0 && c1 == 1) ss = 3;
	if (a1 == 1 && b1 == 0 && c1 == 2) ss = 4;
	if (a1 == 2 && b1 == 0 && c1 == 1) ss = 5;
	if (a1 == 2 && b1 == 0 && c1 == 2) ss = 6;

}


void seisi(void) {
	
	for (i = 0; i < 240; i++) {

		if (i < 100) {
			DrawPixel(star[i][0], star[i][1], iro2);
		}

		else {
			DrawPixel(star[i][0], star[i][1], iro3);
		}

	}

}


void migi(void) {

	for (i = 0; i < 240; i++) {
		xp = star[i][0];
		xp -= 5;
		if (xp < 0)xp = xp + 640;
		star[i][0] = xp;
	}

	for (i = 0; i < 240; i++) {

		if (i < 100) {
			DrawPixel(star[i][0], star[i][1], iro2);
		}

		else {
			DrawPixel(star[i][0], star[i][1], iro3);
		}

	}

}


void hidari(void) {

	for (i = 0; i < 240; i++) {
		xp = star[i][0];
		xp += 5;
		if (xp >= 640)xp = xp - 640;
		star[i][0] = xp;
	}

	for (i = 0; i < 240; i++) {

		if (i < 100) {
			DrawPixel(star[i][0], star[i][1], iro2);
		}

		else {
			DrawPixel(star[i][0], star[i][1], iro3);
		}

	}

}


void pt1(void) {

	for (k = mm; k <= mm + (a3 - 1) * 5; k = k + 5) {

		xxx = (-4 * 320) / k + 320;
		yyy = (2 * 320) / k + 240;
		xxx2 = (4 * 320) / k + 320;
		yyy2 = (2 * 320) / k + 240;

		if (a3 >= 2) {
			DrawPixel(xxx, yyy, iro1);
			DrawPixel(xxx2, yyy2, iro1);
		}

	}

	if (b3 > 0) {

		zz = mm + (a3 - 1) * 5;

		for (k = 5; k <= b3 * 5; k = k + 5) {

			radian = k * PI / 180.0;
			result1 = sin(radian);
			result2 = cos(radian);

			x = (54 - result2 * 58) / (result1 * 58 + zz );
			xxx = x * 320 + 320;
			y = 2 / (result1 * 58 + zz);
			yyy = y * 320 + 240;
			x2 = (54 - result2 * 50) / (result1 * 50 + zz);
			xxx2 = x2 * 320 + 320;
			y2 = 2 / (result1 * 50 + zz);
			yyy2 = y2 * 320 + 240;

			DrawPixel(xxx, yyy, iro1);
			DrawPixel(xxx2, yyy2, iro1);

		}

	}

	if (c3 > 0) {

		h = b3 * 5;
		radian = h * PI / 180.0;
		result1 = sin(radian);
		result2 = cos(radian);

		radian2 = (90.0 - h) * PI / 180.0;
		result1b = sin(radian2);
		result2b = cos(radian2);

		xxa = 54 - result2 * 58;
		zza = result1 * 58 + zz;
		xxb = 54 - result2 * 50;
		zzb = result1 * 50 + zz;
		xxf = result2b * 5;
		zzf = result1b * 5;

		for (k = 1; k <= c3; k = k + 1) {

			x = (xxa + xxf * k) / (zza + zzf * k);
			xxx = x * 320 + 320;
			y = 2 / (zza + zzf * k);
			yyy = y * 320 + 240;
			x2 = (xxb + xxf * k) / (zzb + zzf * k);
			xxx2 = x2 * 320 + 320;
			y2 = 2 / (zzb + zzf * k);
			yyy2 = y2 * 320 + 240;

			DrawPixel(xxx, yyy, iro1);
			DrawPixel(xxx2, yyy2, iro1);

		}

	}

}


void pt2(void) {

	for (k = mm; k <= mm + (a3 - 1) * 5; k = k + 5) {

		xxx = (-4 * 320) / k + 320;
		yyy = (2 * 320) / k + 240;
		xxx2 = (4 * 320) / k + 320;
		yyy2 = (2 * 320) / k + 240;

		if (a3 >= 2) {
			DrawPixel(xxx, yyy, iro1);
			DrawPixel(xxx2, yyy2, iro1);
		}

	}

	if (b3 > 0) {

		zz = mm + (a3 - 1) * 5;

		for (k = 5; k <= b3 * 5; k = k + 5) {
			radian = k * PI / 180.0;
			result1 = sin(radian);
			result2 = cos(radian);

			x = (-54 + result2 * 50) / (result1 * 50 + zz);
			xxx = x * 320 + 320;
			y = 2 / (result1 * 50 + zz);
			yyy = y * 320 + 240;
			x2 = (-54 + result2 * 58) / (result1 * 58 + zz);
			xxx2 = x2 * 320 + 320;
			y2 = 2 / (result1 * 58 + zz);
			yyy2 = y2 * 320 + 240;

			DrawPixel(xxx, yyy, iro1);
			DrawPixel(xxx2, yyy2, iro1);

		}

	}

	if (c3 > 0) {

		h = b3 * 5;
		radian = h * PI / 180.0;
		result1 = sin(radian);
		result2 = cos(radian);

		radian2 = (90.0 - h) * PI / 180.0;
		result1b = sin(radian2);
		result2b = cos(radian2);

		xxa = -54 + result2 * 50;
		zza = result1 * 50 + zz;
		xxb = -54 + result2 * 58;
		zzb = result1 * 58 + zz;
		xxf = result2b * 5;
		zzf = result1b * 5;

		for (k = 1; k <= c3; k = k + 1) {

			x = (xxa - xxf * k) / (zza + zzf * k);
			xxx = x * 320 + 320;
			y = 2 / (zza + zzf * k);
			yyy = y * 320 + 240;
			x2 = (xxb - xxf * k) / (zzb + zzf * k);
			xxx2 = x2 * 320 + 320;
			y2 = 2 / (zzb + zzf * k);
			yyy2 = y2 * 320 + 240;

			DrawPixel(xxx, yyy, iro1);
			DrawPixel(xxx2, yyy2, iro1);

		}

	}

}


void pt3(void) {

	for (k = mm; k <= mm + (a3 - 1) * 5; k = k + 5) {

		radian = k * PI / 180.0;
		result1 = sin(radian);
		result2 = cos(radian);

		x = (54 - result2 * 58) / (result1 * 58);
		xxx = x * 320 + 320;
		y = 2 / (result1 * 58);
		yyy = y * 320 + 240;
		x2 = (54 - result2 * 50) / (result1 * 50);
		xxx2 = x2 * 320 + 320;
		y2 = 2 / (result1 * 50);
		yyy2 = y2 * 320 + 240;

		if (a3 >= 2) {
			DrawPixel(xxx, yyy, iro1);
			DrawPixel(xxx2, yyy2, iro1);
		}

	}

	if (b3 > 0) {

		h = mm + (a3 - 1) * 5;
		radian = h * PI / 180.0;
		result1 = sin(radian);
		result2 = cos(radian);

		radian2 = (90.0 - h) * PI / 180.0;
		result1b = sin(radian2);
		result2b = cos(radian2);

		xxa = 54 - result2 * 58;
		zza = result1 * 58;
		xxb = 54 - result2 * 50;
		zzb = result1 * 50;
		xxf = result2b * 5;
		zzf = result1b * 5;

		for (k = 1; k <= b3; k = k + 1) {

			x = (xxa + xxf * k) / (zza + zzf * k);
			xxx = x * 320 + 320;
			y = 2 / (zza + zzf * k);
			yyy = y * 320 + 240;
			x2 = (xxb + xxf * k) / (zzb + zzf * k);
			xxx2 = x2 * 320 + 320;
			y2 = 2 / (zzb + zzf * k);
			yyy2 = y2 * 320 + 240;

			DrawPixel(xxx, yyy, iro1);
			DrawPixel(xxx2, yyy2, iro1);

		}

	}
	
	if (c3 > 0) {

		radian = h * PI / 180.0;
		result1 = sin(radian);
		result2 = cos(radian);

		xxf = xxa + xxf * b3 + result2 * 58;
		zzf = zza + zzf * b3 - result1 * 58;

		for (k = 1; k <= c3; k = k + 1) {

			x = (xxf - cos((h+k*5) * PI / 180.0) * 58) / (zzf + sin((h+k*5) * PI / 180.0) * 58);
			xxx = x * 320 + 320;
			y = 2 / (zzf + sin((h+k*5) * PI / 180.0) * 58);
			yyy = y * 320 + 240;
			x2 = (xxf - cos((h+k*5) * PI / 180.0) * 50) / (zzf + sin((h+k*5) * PI / 180.0) * 50);
			xxx2 = x2 * 320 + 320;
			y2 = 2 / (zzf + sin((h+k*5) * PI / 180.0) * 50);
			yyy2 = y2 * 320 + 240;

			DrawPixel(xxx, yyy, iro1);
			DrawPixel(xxx2, yyy2, iro1);

		}

	}

}


void pt4(void) {

	for (k = mm; k <= mm + (a3 - 1) * 5; k = k + 5) {

		radian = k * PI / 180.0;
		result1 = sin(radian);
		result2 = cos(radian);

		x = (54 - result2 * 58) / (result1 * 58);
		xxx = x * 320 + 320;
		y = 2 / (result1 * 58);
		yyy = y * 320 + 240;
		x2 = (54 - result2 * 50) / (result1 * 50);
		xxx2 = x2 * 320 + 320;
		y2 = 2 / (result1 * 50);
		yyy2 = y2 * 320 + 240;

		if (a3 >= 2) {
			DrawPixel(xxx, yyy, iro1);
			DrawPixel(xxx2, yyy2, iro1);
		}

	}

	if (b3 > 0) {

		h = mm + (a3 - 1) * 5;
		radian = h * PI / 180.0;
		result1 = sin(radian);
		result2 = cos(radian);

		radian2 = (90.0 - h) * PI / 180.0;
		result1b = sin(radian2);
		result2b = cos(radian2);

		xxa = 54 - result2 * 58;
		zza = result1 * 58;
		xxb = 54 - result2 * 50;
		zzb = result1 * 50;
		xxf = result2b * 5;
		zzf = result1b * 5;

		for (k = 1; k <= b3; k = k + 1) {

			x = (xxa + xxf * k) / (zza + zzf * k);
			xxx = x * 320 + 320;
			y = 2 / (zza + zzf * k);
			yyy = y * 320 + 240;
			x2 = (xxb + xxf * k) / (zzb + zzf * k);
			xxx2 = x2 * 320 + 320;
			y2 = 2 / (zzb + zzf * k);
			yyy2 = y2 * 320 + 240;

			DrawPixel(xxx, yyy, iro1);
			DrawPixel(xxx2, yyy2, iro1);

		}

	}

	if (c3 > 0) {

		radian = h * PI / 180.0;
		result1 = sin(radian);
		result2 = cos(radian);

		xxf = xxa + xxf * b3 - result2 * 50;
		zzf = zza + zzf * b3 + result1 * 50;

		for (k = 1; k <= c3; k = k + 1) {

			x = (xxf + cos((h-k*5) * PI / 180.0) * 50) / (zzf - sin((h-k*5) * PI / 180.0) * 50);
			xxx = x * 320 + 320;
			y = 2 / (zzf - sin((h-k*5) * PI / 180.0) * 50);
			yyy = y * 320 + 240;
			x2 = (xxf + cos((h-k*5) * PI / 180.0) * 58) / (zzf - sin((h-k*5) * PI / 180.0) * 58);
			xxx2 = x2 * 320 + 320;
			y2 = 2 / (zzf - sin((h-k*5) * PI / 180.0) * 58);
			yyy2 = y2 * 320 + 240;

			DrawPixel(xxx, yyy, iro1);
			DrawPixel(xxx2, yyy2, iro1);

		}

	}

}
void pt5(void) {

	for (k = mm; k <= mm + (a3 - 1) * 5; k = k + 5) {

		radian = k * PI / 180.0;
		result1 = sin(radian);
		result2 = cos(radian);

		x = (-54 + result2 * 50) / (result1 * 50);
		xxx = x * 320 + 320;
		y = 2 / (result1 * 50);
		yyy = y * 320 + 240;
		x2 = (-54 + result2 * 58) / (result1 * 58);
		xxx2 = x2 * 320 + 320;
		y2 = 2 / (result1 * 58);
		yyy2 = y2 * 320 + 240;

		if (a3 >= 2) {
			DrawPixel(xxx, yyy, iro1);
			DrawPixel(xxx2, yyy2, iro1);
		}

	}

	if (b3 > 0) {

		h = mm + (a3 - 1) * 5;
		radian = h * PI / 180.0;
		result1 = sin(radian);
		result2 = cos(radian);

		radian2 = (90.0 - h) * PI / 180.0;
		result1b = sin(radian2);
		result2b = cos(radian2);

		xxa = -54 + result2 * 50;
		zza = result1 * 50;
		xxb = -54 + result2 * 58;
		zzb = result1 * 58;
		xxf = result2b * 5;
		zzf = result1b * 5;

		for (k = 1; k <= b3; k = k + 1) {
			
			x = (xxa - xxf * k) / (zza + zzf * k);
			xxx = x * 320 + 320;
			y = 2 / (zza + zzf * k);
			yyy = y * 320 + 240;
			x2 = (xxb - xxf * k) / (zzb + zzf * k);
			xxx2 = x2 * 320 + 320;
			y2 = 2 / (zzb + zzf * k);
			yyy2 = y2 * 320 + 240;

			DrawPixel(xxx, yyy, iro1);
			DrawPixel(xxx2, yyy2, iro1);

		}

	}

	if (c3 > 0) {

		radian = h * PI / 180.0;
		result1 = sin(radian);
		result2 = cos(radian);

		xxf = xxa - xxf * b3 + result2 * 58;
		zzf = zza + zzf * b3 + result1 * 58;

		for (k = 1; k <= c3; k = k + 1) {

			x = (xxf - cos((h-k*5) * PI / 180.0) * 58) / (zzf - sin((h-k*5) * PI / 180.0) * 58);
			xxx = x * 320 + 320;
			y = 2 / (zzf - sin((h-k*5) * PI / 180.0) * 58);
			yyy = y * 320 + 240;
			x2 = (xxf - cos((h-k*5) * PI / 180.0) * 50) / (zzf - sin((h-k*5) * PI / 180.0) * 50);
			xxx2 = x2 * 320 + 320;
			y2 = 2 / (zzf - sin((h-k*5) * PI / 180.0) * 50);
			yyy2 = y2 * 320 + 240;

			DrawPixel(xxx, yyy, iro1);
			DrawPixel(xxx2, yyy2, iro1);

		}

	}

}


void pt6(void) {

	for (k = mm; k <= mm + (a3 - 1) * 5; k = k + 5) {

		radian = k * PI / 180.0;
		result1 = sin(radian);
		result2 = cos(radian);

		x = (-54 + result2 * 50) / (result1 * 50);
		xxx = x * 320 + 320;
		y = 2 / (result1 * 50);
		yyy = y * 320 + 240;
		x2 = (-54 + result2 * 58) / (result1 * 58);
		xxx2 = x2 * 320 + 320;
		y2 = 2 / (result1 * 58);
		yyy2 = y2 * 320 + 240;

		if (a3 >= 2) {
			DrawPixel(xxx, yyy, iro1);
			DrawPixel(xxx2, yyy2, iro1);
		}

	}

	if (b3 > 0) {

		h = mm + (a3 - 1) * 5;
		radian = h * PI / 180.0;
		result1 = sin(radian);
		result2 = cos(radian);

		radian2 = (90.0 - h) * PI / 180.0;
		result1b = sin(radian2);
		result2b = cos(radian2);

		xxa = -54 + result2 * 50;
		zza = result1 * 50;
		xxb = -54 + result2 * 58;
		zzb = result1 * 58;
		xxf = result2b * 5;
		zzf = result1b * 5;

		for (k = 1; k <= b3; k = k + 1) {

			x = (xxa - xxf * k) / (zza + zzf * k);
			xxx = x * 320 + 320;
			y = 2 / (zza + zzf * k);
			yyy = y * 320 + 240;
			x2 = (xxb - xxf * k) / (zzb + zzf * k);
			xxx2 = x2 * 320 + 320;
			y2 = 2 / (zzb + zzf * k);
			yyy2 = y2 * 320 + 240;

			DrawPixel(xxx, yyy, iro1);
			DrawPixel(xxx2, yyy2, iro1);

		}

	}

	if (c3 > 0) {

		radian = h * PI / 180.0;
		result1 = sin(radian);
		result2 = cos(radian);

		xxf = xxa - xxf * b3 - result2 * 50;
		zzf = zza + zzf * b3 - result1 * 50;

		for (k = 1; k <= c3; k = k + 1) {

			x = (xxf + cos((h+k*5) * PI / 180.0) * 50) / (zzf + sin((h+k*5) * PI / 180.0) * 50);
			xxx = x * 320 + 320;
			y = 2 / (zzf + sin((h+k*5) * PI / 180.0) * 50);
			yyy = y * 320 + 240;
			x2 = (xxf + cos((h+k*5) * PI / 180.0) * 58) / (zzf + sin((h+k*5) * PI / 180.0) * 58);
			xxx2 = x2 * 320 + 320;
			y2 = 2 / (zzf + sin((h+k*5) * PI / 180.0) * 58);
			yyy2 = y2 * 320 + 240;

			DrawPixel(xxx, yyy, iro1);
			DrawPixel(xxx2, yyy2, iro1);

		}

	}

}



