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 bindbc.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 PixelPerfectEngine.system.config;
30 import PixelPerfectEngine.system.binarySearchTree;
31 import PixelPerfectEngine.system.common;
32 
33 public import editor;
34 import PixelPerfectEngine.extbmp.extbmp;
35 
36 public Editor prg;
37 
38 int main(string[] args){
39 	initialzeSDL();
40 
41 	if(args.length > 1){
42 		if(args[1] == "--test"){
43 			TileLayerTest prg = new TileLayerTest();
44 			prg.whereTheMagicHappens;
45 			//writeln(prg.isRunning);
46 			return 0;
47 		}
48 	}
49 
50 	prg = new Editor(args);
51 	prg.whereTheMagicHappens;
52 
53 	//testBinarySearchTrees(11, 1);
54 	return 0;
55 }
56 
57 void testBinarySearchTrees(int nOfElements, int nOfTimes){
58 	for(int i; i < nOfTimes; i++){
59 		writeln("start test no.",i);
60 		BinarySearchTree!(int,int) sequ, rand;
61 		//sequential element test
62 		for(int j; j < nOfElements; j++){
63 			sequ[j] = j;
64 		}
65 		writeln(sequ);
66 		//randomized element test
67 		for(int j; j < nOfElements; j++){
68 			int k = uniform(short.min,short.max);
69 			rand[k] = k;
70 		}
71 		writeln(rand);
72 		//rand.optimize();
73 		//writeln(rand);
74 	}
75 	readln();
76 }
77 
78 class TileLayerTest : SystemEventListener, InputListener{
79 	bool isRunning, up, down, left, right, scrup, scrdown, scrleft, scrright;
80 	OutputScreen output;
81 	Raster r;
82 	TileLayer t;
83 	TransformableTileLayer!(Bitmap8Bit,16,16) tt;
84 	Bitmap8Bit[] tiles;
85 	Bitmap8Bit dlangMan;
86 	SpriteLayer s;
87 	//Bitmap16Bit[wchar] tiles;
88 	InputHandler ih;
89 	float theta;
90 	//CollisionDetector c;
91 	this(){
92 		theta = 0;
93 		isRunning = true;
94 		Image tileSource = loadImage(File("../assets/sci-fi-tileset.png"));
95 		Image spriteSource = loadImage(File("../assets/d-man.tga"));
96 		t = new TileLayer(16,16, LayerRenderingMode.COPY);
97 		tt = new TransformableTileLayer!(Bitmap8Bit,16,16)(LayerRenderingMode.COPY);
98 		s = new SpriteLayer(LayerRenderingMode.ALPHA_BLENDING);
99 		//c = new CollisionDetector();
100 		dlangMan = loadBitmapFromImage!Bitmap8Bit(spriteSource);
101 		//CollisionModel cm = new CollisionModel(dlangMan.width, dlangMan.height, dlangMan.generateStandardCollisionModel());
102 		dlangMan.offsetIndexes(256,false);
103 		s.addSprite(dlangMan, 0, 0, 0, 1);
104 		//s.scaleSpriteHoriz(0,-1024);
105 		//s.scaleSpriteVert(0,-1024);
106 		for(int i = 1 ; i < 10 ; i++){
107 			s.addSprite(dlangMan, i, uniform(-31,320), uniform(-31,240), 1);
108 		}
109 		//s.collisionDetector[1] = c;
110 		//c.source = s;
111 		//c.addCollisionModel(cm,0);
112 		//c.addCollisionModel(cm,1);
113 		//c.addCollisionListener(this);
114 		//tiles.length = tileSource.bitmapID.length;
115 		tiles = loadBitmapSheetFromImage!Bitmap8Bit(tileSource, 16, 16);//loadBitmapSheetFromFile!Bitmap8Bit("../assets/sci-fi-tileset.png",16,16);
116 		for(int i; i < tiles.length; i++){
117 			//string hex = tileSource.bitmapID[i];
118 			//writeln(hex[hex.length-4..hex.length]);
119 			//ABitmap ab = loadBitmapFromXMP!Bitmap16Bit(tileSource, hex);
120 			//tiles[i] = ab;
121 			t.addTile(tiles[i], cast(wchar)i);
122 		}
123 		//wchar[] mapping;
124 		MappingElement[] mapping;
125 		mapping.length = 64*64;
126 		//attrMapping.length = 256*256;
127 		for(int i; i < mapping.length; i++){
128 			//mapping[i] = to!wchar(uniform(0x0000,0x00AA));
129 			const int rnd = uniform(0,1024);
130 			//attrMapping[i] = BitmapAttrib(rnd & 1 ? true : false, rnd & 2 ? true : false);
131 			mapping[i] = MappingElement(cast(wchar)(rnd & 63), BitmapAttrib(rnd & 1024 ? true : false, rnd & 512 ? true : false));
132 		}
133 		ih = new InputHandler();
134 		ih.sel ~= this;
135 		ih.il ~= this;
136 		ih.kb ~= KeyBinding(0, SDL_SCANCODE_UP,0, "up", Devicetype.KEYBOARD, KeyModifier.ANY);
137 		ih.kb ~= KeyBinding(0, SDL_SCANCODE_DOWN,0, "down", Devicetype.KEYBOARD, KeyModifier.ANY);
138 		ih.kb ~= KeyBinding(0, SDL_SCANCODE_LEFT,0, "left", Devicetype.KEYBOARD, KeyModifier.ANY);
139 		ih.kb ~= KeyBinding(0, SDL_SCANCODE_RIGHT,0, "right", Devicetype.KEYBOARD, KeyModifier.ANY);
140 		ih.kb ~= KeyBinding(0, ScanCode.np8,0, "scrup", Devicetype.KEYBOARD, KeyModifier.ANY);
141 		ih.kb ~= KeyBinding(0, ScanCode.np2,0, "scrdown", Devicetype.KEYBOARD, KeyModifier.ANY);
142 		ih.kb ~= KeyBinding(0, ScanCode.np4,0, "scrleft", Devicetype.KEYBOARD, KeyModifier.ANY);
143 		ih.kb ~= KeyBinding(0, ScanCode.np6,0, "scrright", Devicetype.KEYBOARD, KeyModifier.ANY);
144 		ih.kb ~= KeyBinding(0, ScanCode.F1,0, "A+", Devicetype.KEYBOARD, KeyModifier.ANY);
145 		ih.kb ~= KeyBinding(0, ScanCode.F2,0, "A-", Devicetype.KEYBOARD, KeyModifier.ANY);
146 		ih.kb ~= KeyBinding(0, ScanCode.F3,0, "B+", Devicetype.KEYBOARD, KeyModifier.ANY);
147 		ih.kb ~= KeyBinding(0, ScanCode.F4,0, "B-", Devicetype.KEYBOARD, KeyModifier.ANY);
148 		ih.kb ~= KeyBinding(0, ScanCode.F5,0, "C+", Devicetype.KEYBOARD, KeyModifier.ANY);
149 		ih.kb ~= KeyBinding(0, ScanCode.F6,0, "C-", Devicetype.KEYBOARD, KeyModifier.ANY);
150 		ih.kb ~= KeyBinding(0, ScanCode.F7,0, "D+", Devicetype.KEYBOARD, KeyModifier.ANY);
151 		ih.kb ~= KeyBinding(0, ScanCode.F8,0, "D-", Devicetype.KEYBOARD, KeyModifier.ANY);
152 		ih.kb ~= KeyBinding(0, ScanCode.F9,0, "x0+", Devicetype.KEYBOARD, KeyModifier.ANY);
153 		ih.kb ~= KeyBinding(0, ScanCode.F10,0, "x0-", Devicetype.KEYBOARD, KeyModifier.ANY);
154 		ih.kb ~= KeyBinding(0, ScanCode.PAGEUP,0, "y0+", Devicetype.KEYBOARD, KeyModifier.ANY);
155 		ih.kb ~= KeyBinding(0, ScanCode.PAGEDOWN,0, "y0-", Devicetype.KEYBOARD, KeyModifier.ANY);
156 		ih.kb ~= KeyBinding(0, ScanCode.NP_PLUS,0, "theta+", Devicetype.KEYBOARD, KeyModifier.ANY);
157 		ih.kb ~= KeyBinding(0, ScanCode.NP_MINUS,0, "theta-", Devicetype.KEYBOARD, KeyModifier.ANY);
158 		ih.kb ~= KeyBinding(0, ScanCode.n1,0, "sV+", Devicetype.KEYBOARD, KeyModifier.ANY);
159 		ih.kb ~= KeyBinding(0, ScanCode.n2,0, "sV-", Devicetype.KEYBOARD, KeyModifier.ANY);
160 		ih.kb ~= KeyBinding(0, ScanCode.n3,0, "sH+", Devicetype.KEYBOARD, KeyModifier.ANY);
161 		ih.kb ~= KeyBinding(0, ScanCode.n4,0, "sH-", Devicetype.KEYBOARD, KeyModifier.ANY);
162 		ih.kb ~= KeyBinding(0, ScanCode.Q,0, "HM", Devicetype.KEYBOARD, KeyModifier.ANY);
163 		ih.kb ~= KeyBinding(0, ScanCode.W,0, "VM", Devicetype.KEYBOARD, KeyModifier.ANY);
164 
165 		t.loadMapping(64,64,mapping);
166 		t.setWarpMode(false);
167 
168 		//t.setWrapMode(true);
169 		//tt.D = -256;
170 		output = new OutputScreen("TileLayer test", 1280,960);
171 		r = new Raster(320,240,output);
172 		output.setMainRaster(r);
173 		//loadPaletteFromXMP(tileSource, "default", r);
174 
175 		/*for(int y ; y < 240 ; y++){
176 			for(int x ; x < 240 ; x++){
177 				writeln('[',x,',',y,"] : ", t.transformFunc([x,y]));
178 			}
179 		}*/
180 		r.addLayer(t, 0);
181 		r.addLayer(s, 1);
182 		Color[] localPal = loadPaletteFromImage(tileSource);
183 		localPal.length = 256;
184 		r.palette ~= localPal;
185 		localPal = loadPaletteFromImage(spriteSource);
186 		localPal.length = 256;
187 		r.palette ~= localPal;
188 		//r.palette[0].alpha = 255;
189 		r.palette[256].raw = 0;
190 		//writeln(tt);
191 		//r.palette[0] = 255;
192 		//r.addRefreshListener(output, 0);
193 
194 	}
195 	private @nogc void ttlHBlankInterrupt(ref short[4] localABCD, ref short[2] localsXsY, ref short[2] localx0y0, short y){
196 		localABCD[0]++;
197 	}
198 	public void whereTheMagicHappens(){
199 		while(isRunning){
200 			r.refresh();
201 			ih.test();
202 			if(up) s.relMoveSprite(0,0,-1);
203 			if(down) s.relMoveSprite(0,0,1);
204 			if(left) s.relMoveSprite(0,-1,0);
205 			if(right) s.relMoveSprite(0,1,0);
206 			if(scrup) t.relScroll(0,-1);
207 			if(scrdown) t.relScroll(0,1);
208 			if(scrleft) t.relScroll(-1,0);
209 			if(scrright) t.relScroll(1,0);
210 			//t.relScroll(1,0);
211 		}
212 	}
213 	override public void onQuit() {
214 		isRunning = false;
215 	}
216 	override public void controllerAdded(uint ID) {
217 
218 	}
219 	override public void controllerRemoved(uint ID) {
220 
221 	}
222 	override public void keyPressed(string ID,uint timestamp,uint devicenumber,uint devicetype) {
223 		//writeln(ID);
224 		import PixelPerfectEngine.graphics.transformFunctions;
225 		switch(ID){
226 			case "up": up = true; break;
227 			case "down": down = true; break;
228 			case "left": left = true; break;
229 			case "right": right = true; break;
230 			case "scrup": scrup = true; break;
231 			case "scrdown": scrdown = true; break;
232 			case "scrleft": scrleft = true; break;
233 			case "scrright": scrright = true; break;
234 			case "A+": tt.A = cast(short)(tt.A + 16);
235 				break;
236 			case "A-": tt.A = cast(short)(tt.A - 16);
237 				break;
238 			case "B+": tt.B = cast(short)(tt.B + 16); break;
239 			case "B-": tt.B = cast(short)(tt.B - 16); break;
240 			case "C+": tt.C = cast(short)(tt.C + 16); break;
241 			case "C-": tt.C = cast(short)(tt.C - 16); break;
242 			case "D+": tt.D = cast(short)(tt.D + 16); break;
243 			case "D-": tt.D = cast(short)(tt.D - 16); break;
244 			case "x0+": tt.x_0 = cast(short)(tt.x_0 + 1); break;
245 			case "x0-": tt.x_0 = cast(short)(tt.x_0 - 1); break;
246 			case "y0+": tt.y_0 = cast(short)(tt.y_0 + 1); break;
247 			case "y0-": tt.y_0 = cast(short)(tt.y_0 - 1); break;
248 			case "sH-":
249 				if(s.readSpriteAttribute!("scaleHoriz", int)(0) == 16){
250 					s.scaleSpriteHoriz(0,-16);
251 					return;
252 				}
253 				s.scaleSpriteHoriz(0,s.readSpriteAttribute!("scaleHoriz", int)(0) - 16);
254 				writeln(s.readSpriteAttribute!("scaleHoriz", int)(0));
255 				break;
256 			case "sH+":
257 				if(s.readSpriteAttribute!("scaleHoriz", int)(0) == -16){
258 					s.scaleSpriteHoriz(0,16);
259 					return;
260 				}
261 				s.scaleSpriteHoriz(0,s.readSpriteAttribute!("scaleHoriz", int)(0) + 16);
262 				writeln(s.readSpriteAttribute!("scaleHoriz", int)(0));
263 				break;
264 			case "sV-":
265 				if(s.readSpriteAttribute!("scaleVert", int)(0) == 16){
266 					s.scaleSpriteVert(0,-16);
267 					return;
268 				}
269 				s.scaleSpriteVert(0,s.readSpriteAttribute!("scaleVert", int)(0) - 16);
270 				break;
271 			case "sV+":
272 				if(s.readSpriteAttribute!("scaleVert", int)(0) == -16){
273 					s.scaleSpriteVert(0,16);
274 					return;
275 				}
276 				s.scaleSpriteVert(0,s.readSpriteAttribute!("scaleVert", int)(0) + 16);
277 				break;
278 			case "HM":
279 				s.scaleSpriteHoriz(0,s.readSpriteAttribute!("scaleHoriz", int)(0) * -1);
280 				break;
281 			case "VM":
282 				s.scaleSpriteVert(0,s.readSpriteAttribute!("scaleVert", int)(0) * -1);
283 				break;
284 			case "theta+":
285 				theta += 1;
286 				short[4] newTP = rotateFunction(theta);
287 				tt.A = newTP[0];
288 				tt.B = newTP[1];
289 				tt.C = newTP[2];
290 				tt.D = newTP[3];
291 				break;
292 			case "theta-":
293 				theta -= 1;
294 				short[4] newTP = rotateFunction(theta);
295 				tt.A = newTP[0];
296 				tt.B = newTP[1];
297 				tt.C = newTP[2];
298 				tt.D = newTP[3];
299 				break;
300 			default: break;
301 		}
302 	}
303 	override public void keyReleased(string ID,uint timestamp,uint devicenumber,uint devicetype) {
304 		switch(ID){
305 			case "up": up = false; break;
306 			case "down": down = false; break;
307 			case "left": left = false; break;
308 			case "right": right = false; break;
309 			case "scrup": scrup = false; break;
310 			case "scrdown": scrdown = false; break;
311 			case "scrleft": scrleft = false; break;
312 			case "scrright": scrright = false; break;
313 			default: break;
314 		}
315 	}
316 /*public void spriteCollision(CollisionEvent ce){
317 		writeln("COLLISION!!!!11!1111!!!ONEONEONE!!!");
318 	}
319 
320 	public void backgroundCollision(CollisionEvent ce){}*/
321 }