← index
Old.DirectX.Programs/apps/hshuffle/mxIntution/mxIntution.h
Source: Old.DirectX.Programs/apps/hshuffle/mxIntution/mxIntution.h
/* The HPPD Shuffle-LmaSterD*/


#pragma once

#include "mx3d.h"


LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);

static char *imgz[] = {"card_back.bmp", NULL};

class mxShuffle {
public:
	inline int getRval(int x) {
		return (unsigned char) x;   
	}

	inline int getGval(int x) {
		return ((unsigned char)((x)>>8));
	}
	inline int getBval(int x) {
		return ((unsigned char)((x)>>16));
	}
	void start() {
		shuffle();
		int offset_x = 800/2-110;
		for(int i = 0; i < 5; i++) {
			cards[i].x = offset_x+(20*i);
			cards[i].y = 200;
			for(int p = 0; p < 83; p++) 
				for(int q = 0; q < 118; q++) {
					cards[i].p[p][q].xv = (timeGetTime()%2 == 0) ? (-rand()%4)+1 : (rand()%4)+1;
					cards[i].p[p][q].x = offset_x+(20*i)+p;
					cards[i].p[p][q].y = 200+q;
					cards[i].p[p][q].x_off = 0;
					cards[i].p[p][q].y_off = 0;
				}
		}

		speed = 1;
		sys_timer = 0;
		sys_speed = 100;
		loadPixelData();
	}

	void loadPixelData() {
		HBITMAP hbm = (HBITMAP)LoadImage(NULL, "card_back.bmp", IMAGE_BITMAP,0,0,LR_LOADFROMFILE | LR_CREATEDIBSECTION);
		HDC dc = GetDC(GetForegroundWindow());
		HDC cdc = CreateCompatibleDC(dc);
		SelectObject(cdc,hbm);
		for(int i = 0; i < 83; i++) 
			for(int z = 0; z < 118; z++) {
				cards[0].p[i][z].color = GetPixel(cdc,i,z);
			}

		DeleteDC(cdc);
		DeleteDC(dc);
		DeleteObject(hbm);

	}
protected:
	void shuffle() {
		memset(cards,0,sizeof(cards));
		for(int i = 0; i < 5; i++) {
			cards[i].card_id = rand()%5;
		}
	}

	bool circled;

	bool proc() {


		if(timeGetTime()%2 == 0)
			sys_timer++;

		if(sys_speed <= 0) {

			static int circle = 0;
			for(int i =0; i < 5; i++) {
				double rad = 100.0f;
				int X = int(rad * cos(cards[i].deg));
				int Y = int(rad * sin(cards[i].deg));
				switch(i) {
				case 0:
				case 2:
					cards[i].deg += 0.001f;
					break;
				case 1:
				case 3:
					cards[i].deg -= 0.001f;
					break;
				case 4:
					cards[i].deg -= 0.01f;
					break;
				}

				cards[i].dx = X;
				cards[i].dy = Y;
				if(cards[i].deg > 10)  	
					return true;
			}
		}
		else if(sys_timer > sys_speed) {

			for(int i = 0; i < 5; i++) {
				if(cards[i].x <= 800/2-110) 
					cards[i].x += 800/2-110;
				else 
					cards[i].x -= speed;
			}
			sys_timer = 0;
			sys_speed--;
		}


		return false;
	}
	void setspeed(int speed) {
		this->speed = speed;
	}

	virtual void display() = 0;

	struct TCard {
		BYTE card_id;
		int x,y,dx,dy;
		struct points {
			int xv;
			int x,x_off;
			int y,y_off;
			COLORREF color;
		};
		points p[84][118];
		float deg;

	};
	struct TCard cards[5];
	int speed,sys_timer,sys_speed;

};


class mxIntution : public mxApp , public mxShuffle {
public:

	enum { INTRO, GAME, ABOUT };
	virtual void init() {
		if(Init("mxIntution",false,0,0,800,600,WndProc,LoadIcon(NULL,IDI_APPLICATION)) && InitDX(false,32)) {
			load();
			InitLoop();
		}
	}

	inline void setCircle(bool circled) {
		this->circled = circled;
	}

	inline void load() {
		for(int i = 0; imgz[i] != NULL; i++) {
			img[i].init(&this->screen);
			img[i].setcolorkey(0x0);
			img[i].load(imgz[i]);
		}
		start();
		this->SetScreen(INTRO);
	}

	virtual void render(int screen) {
		this->screen.pd3d_dev->BeginScene();

		switch(this->GetScreen()) {
			case INTRO:
				display();
				break;
			case GAME:
				break;
		}

		this->screen.pd3d_dev->EndScene();
	}

	virtual void display() {

		text.printtextf(10,10,"HPPD Shuffle-LmaSterD");
		if(proc()) {
			paint.Lock();

			for(int p = 0; p < 5; p++)
				for(int i = 0; i < 83; i++) 
					for(int z = 0; z < 118; z++) {
					if(cards[p].p[i][z].x+cards[p].p[i][z].x_off+cards[p].dx > 0 && cards[p].dy+cards[p].p[i][z].y+cards[p].p[i][z].y_off > 0 && cards[p].p[i][z].x+cards[p].p[i][z].x_off+cards[p].dx < 800 && cards[p].dy+cards[p].p[i][z].y+cards[p].p[i][z].y_off < 600)
						paint.fast_sp(cards[p].p[i][z].x+cards[p].p[i][z].x_off+cards[p].dx,cards[p].dy+cards[p].p[i][z].y+cards[p].p[i][z].y_off,paint.rect.Pitch, D3DCOLOR_XRGB(getRval(cards[0].p[i][z].color),getGval(cards[0].p[i][z].color),getBval(cards[0].p[i][z].color)));
					if(circled == false) {
						cards[p].p[i][z].x_off += cards[p].p[i][z].xv+-rand()%5;
						cards[p].p[i][z].y_off += cards[p].p[i][z].xv+-rand()%5;
					}
					else {
						double rad = 100.0f;
					int X = int(rad * cos(cards[p].deg));
					int Y = int(rad * sin(cards[p].deg));
					cards[p].p[i][z].x_off = X;
					cards[p].p[i][z].y_off = Y;
					cards[p].deg += 0.001f;
					
					}
				}
					paint.UnLock();


		}
		else {
			for(int p = 0; p < 5; p++)
				img[0].display((float)cards[p].x+cards[p].dx,(float)cards[p].y+cards[p].dy);
		}
	}

	int get(int g) {
		return 0;
	}

	int give() {
		return 0;
	}

private:
	mxSprite img[10];
};

extern mxIntution in;