1 /*
2 Copyright (C) 2015, by Laszlo Szeremi under the Boost license.
3 
4 VDP Engine
5 */
6 
7 
8 module app;
9 
10 import std.stdio;
11 import std..string;
12 import std.conv;
13 import std.random;
14 
15 import derelict.sdl2.sdl;
16 import derelict.freeimage.freeimage;
17 
18 //import system.config;
19 
20 import PixelPerfectEngine.graphics.outputScreen;
21 import PixelPerfectEngine.graphics.raster;
22 import PixelPerfectEngine.graphics.layers;
23 
24 import PixelPerfectEngine.graphics.bitmap;
25 import PixelPerfectEngine.collision;
26 import PixelPerfectEngine.system.inputHandler;
27 import PixelPerfectEngine.system.file;
28 import PixelPerfectEngine.system.etc;
29 //import system.tgaconv;
30 import PixelPerfectEngine.system.config;
31 import PixelPerfectEngine.system.advBitArray;
32 
33 import editor;
34 import PixelPerfectEngine.extbmp.extbmp;
35 
36 int main(string[] args)
37 {
38 
39     DerelictSDL2.load();
40 	DerelictFI.load();
41 
42 	Editor e = new Editor(args);
43 	e.whereTheMagicHappens;
44     //MainProgram game = new MainProgram();
45 	//testAdvBitArrays(128);
46 	//TileLayerUnittest prg = new TileLayerUnittest();
47 	return 0;
48 }
49 
50 void testAdvBitArrays(int l){
51 	//General rule: at every step, write all the results to the screen
52 	//step 1: Generate 4 bitarrays with the l length
53 	AdvancedBitArray[4] ba;
54 	for(int i; i < ba.length; i++){
55 		int x = (l/8)+1;
56 		void[] rawData;
57 		rawData.length = x;
58 		for(int j; j < l/8 ; j++){
59 			ubyte b = to!ubyte(uniform(0,255));
60 			*cast(ubyte*)(rawData.ptr + j) = b;
61 		}
62 		ba[i] = new AdvancedBitArray(rawData,l);
63 		writeln(ba[i].toString());
64 	}
65 	//step 2: And, or, and then xor all the arrays together
66 	for(int i; i < ba.length; i++){
67 		for(int j; j < ba.length; j++){
68 			AdvancedBitArray resand = ba[i] & ba[j], resor = ba[i] | ba[j], resxor = ba[i] ^ ba[j];
69 			writeln(resand.toString());writeln(resor.toString());writeln(resxor.toString());
70 		}
71 	}//*/
72 	//step 3: Test bit shifting in both ways by 13
73 	/*for(int i; i < ba.length; i++){
74 		AdvancedBitArray shl = ba[i]<<5, shr = ba[i]>>5, sl = ba[i][1..50];
75 		writeln(shl.toString());
76 		writeln(shr.toString());
77 		writeln(sl.toString());
78 	}//*/
79 	ubyte[16] testdata = [0,0,81,51,186,186,0,86,48,82,35,5,99,208,95,9];
80 	ba[0] = new AdvancedBitArray(cast(void[])testdata,128);
81 	ba[1] = new AdvancedBitArray(cast(void[])testdata,128);
82 	for(int i ; i < 32 ; i++){
83 		writeln(ba[0].test(i,40,ba[1],16));
84 	}
85 }
86 
87 class TileLayerUnittest : SystemEventListener, InputListener{
88 	bool isRunning, up, down, left, right;
89 	OutputScreen output;
90 	Raster r;
91 	TileLayer t;
92 	//Bitmap16Bit[wchar] tiles;
93 	InputHandler ih;
94 	this(){
95 		isRunning = true;
96 		ExtendibleBitmap tileSource = new ExtendibleBitmap("tiletest.xmp");
97 		t = new TileLayer(32,32, TileLayerRenderingMode.BLITTER);
98 		for(int i; i < tileSource.bitmapID.length; i++){
99 			string hex = tileSource.bitmapID[i];
100 			//writeln(hex[hex.length-4..hex.length]);
101 			t.addTile(loadBitmapFromXMP(tileSource, hex), to!wchar(parseHex(hex[hex.length-4..hex.length])));
102 		}
103 		wchar[] mapping;
104 		mapping.length = 256*256;
105 		for(int i; i < mapping.length; i++){
106 			mapping[i] = to!wchar(uniform(0x0000,0x00AA));
107 		}
108 		ih = new InputHandler();
109 		ih.sel ~= this;
110 		ih.il ~= this;
111 		ih.kb ~= KeyBinding(4096, SDL_SCANCODE_UP,0, "up", Devicetype.KEYBOARD);
112 		ih.kb ~= KeyBinding(4096, SDL_SCANCODE_DOWN,0, "down", Devicetype.KEYBOARD);
113 		ih.kb ~= KeyBinding(4096, SDL_SCANCODE_LEFT,0, "left", Devicetype.KEYBOARD);
114 		ih.kb ~= KeyBinding(4096, SDL_SCANCODE_RIGHT,0, "right", Devicetype.KEYBOARD);
115 
116 		t.loadMapping(256,256,mapping);
117 
118 		output = new OutputScreen("Tile Layer Unittest", 1280,960);
119 		r = new Raster(320,240,output);
120 		output.setMainRaster(r);
121 		loadPaletteFromXMP(tileSource, "default", r);
122 		r.addLayer(t);
123 		//r.addRefreshListener(output, 0);
124 		while(isRunning){
125 			r.refresh();
126 			ih.test();
127 			if(up) t.relScroll(0, 1);
128 			if(down) t.relScroll(0, -1);
129 			if(left) t.relScroll(1, 0);
130 			if(right) t.relScroll(-1, 0);
131 			//t.relScroll(1,0);
132 		}
133 	}
134 	override public void onQuit() {
135 		isRunning = false;
136 	}
137 	override public void controllerAdded(uint ID) {
138 		
139 	}
140 	override public void controllerRemoved(uint ID) {
141 		
142 	}
143 	override public void keyPressed(string ID,uint timestamp,uint devicenumber,uint devicetype) {
144 		//writeln(ID);
145 		switch(ID){
146 			case "up": up = true; break;
147 			case "down": down = true; break;
148 			case "left": left = true; break;
149 			case "right": right = true; break;
150 			default: break;
151 		}
152 	}
153 	override public void keyReleased(string ID,uint timestamp,uint devicenumber,uint devicetype) {
154 		switch(ID){
155 			case "up": up = false; break;
156 			case "down": down = false; break;
157 			case "left": left = false; break;
158 			case "right": right = false; break;
159 			default: break;
160 		}
161 	}
162 
163 }