File Annotation
Not logged in
b6daa1efa1 2012-07-14        kinaba: import dfl.all;
b6daa1efa1 2012-07-14        kinaba: import util;
b6daa1efa1 2012-07-14        kinaba: import game;
b6daa1efa1 2012-07-14        kinaba: import output;
b6daa1efa1 2012-07-14        kinaba: 
b6daa1efa1 2012-07-14        kinaba: class GUI : Form
b6daa1efa1 2012-07-14        kinaba: {
b6daa1efa1 2012-07-14        kinaba: 	private {
b6daa1efa1 2012-07-14        kinaba: 		Game g;
b6daa1efa1 2012-07-14        kinaba: 		int cell;
b6daa1efa1 2012-07-14        kinaba: 		int turn = 0;
b6daa1efa1 2012-07-14        kinaba: 
b6daa1efa1 2012-07-14        kinaba: 		Font font;
b6daa1efa1 2012-07-14        kinaba: 		Color[char] colors;
b6daa1efa1 2012-07-14        kinaba: 		string[char] render;
b6daa1efa1 2012-07-14        kinaba: 	}
b6daa1efa1 2012-07-14        kinaba: 
b6daa1efa1 2012-07-14        kinaba: 	this(Game g)
b6daa1efa1 2012-07-14        kinaba: 	{
b6daa1efa1 2012-07-14        kinaba: 		noMessageFilter();
b6daa1efa1 2012-07-14        kinaba: 		this.setStyle(ControlStyles.OPAQUE, true);
b6daa1efa1 2012-07-14        kinaba: 		this.g = g;
b6daa1efa1 2012-07-14        kinaba: 
b6daa1efa1 2012-07-14        kinaba: 		this.paint ~= &my_paint;
b6daa1efa1 2012-07-14        kinaba: 		this.keyDown ~= &my_keydown;
b6daa1efa1 2012-07-14        kinaba: 
b6daa1efa1 2012-07-14        kinaba: 		const MAX_SIZE = 640;
b6daa1efa1 2012-07-14        kinaba: 		this.formBorderStyle = FormBorderStyle.FIXED_DIALOG;
b6daa1efa1 2012-07-14        kinaba: 		this.maximizeBox = false;
b6daa1efa1 2012-07-14        kinaba: 		this.minimizeBox = false;
b6daa1efa1 2012-07-14        kinaba: 		this.cell = MAX_SIZE / max(g.map.W, g.map.H);
b6daa1efa1 2012-07-14        kinaba: 		this.clientSize = Size(g.map.W*cell, g.map.H*cell);
b6daa1efa1 2012-07-14        kinaba: 		set_text();
b6daa1efa1 2012-07-14        kinaba: 
b6daa1efa1 2012-07-14        kinaba: 		// Resources
b6daa1efa1 2012-07-14        kinaba: 		this.font = new Font("MS Gothic", cell-2, GraphicsUnit.PIXEL);
b6daa1efa1 2012-07-14        kinaba: 		this.backColor = Color(255,255,255);
b6daa1efa1 2012-07-14        kinaba: 		this.colors['#'] =
b6daa1efa1 2012-07-14        kinaba: 		this.colors['.'] = Color(255,191,127);
b6daa1efa1 2012-07-14        kinaba: 		this.colors['*'] = Color(255,127,127);
b6daa1efa1 2012-07-14        kinaba: 		this.colors['R'] = Color(128,128,0);
b6daa1efa1 2012-07-14        kinaba: 		this.colors['D'] = Color(255,0,0); // Dead
b6daa1efa1 2012-07-14        kinaba: 		this.colors['\\'] =
b6daa1efa1 2012-07-14        kinaba: 		this.colors['L'] =
b6daa1efa1 2012-07-14        kinaba: 		this.colors['O'] = Color(127,255,127);
b6daa1efa1 2012-07-14        kinaba: 		this.colors['W'] = Color(204,229,255); // water
b6daa1efa1 2012-07-14        kinaba: 
b6daa1efa1 2012-07-14        kinaba: 		this.render['#'] = "■";
b6daa1efa1 2012-07-14        kinaba: 		this.render['*'] = "✹";
b6daa1efa1 2012-07-14        kinaba: 		this.render['.'] = "♒";
b6daa1efa1 2012-07-14        kinaba: 		this.render['\\'] = "λ";
b6daa1efa1 2012-07-14        kinaba: 		this.render['R'] = "☃";
b6daa1efa1 2012-07-14        kinaba: 		this.render['D'] = "☠";
b6daa1efa1 2012-07-14        kinaba: 		this.render['L'] = "☒";
b6daa1efa1 2012-07-14        kinaba: 		this.render['O'] = "☐";
b6daa1efa1 2012-07-14        kinaba: 	}
b6daa1efa1 2012-07-14        kinaba: 
b6daa1efa1 2012-07-14        kinaba: private:
b6daa1efa1 2012-07-14        kinaba: 	void my_paint(Control, PaintEventArgs ev)
b6daa1efa1 2012-07-14        kinaba: 	{
b6daa1efa1 2012-07-14        kinaba: 		const scrH = this.clientSize.height;
b6daa1efa1 2012-07-14        kinaba: 		const scrW = this.clientSize.width;
b6daa1efa1 2012-07-14        kinaba: 		Graphics gr = new MemoryGraphics(scrW, scrH, ev.graphics);
b6daa1efa1 2012-07-14        kinaba: 		scope(exit) {
b6daa1efa1 2012-07-14        kinaba: 			gr.copyTo(ev.graphics, Rect(0,0,scrW,scrH));
b6daa1efa1 2012-07-14        kinaba: 			gr.dispose();
b6daa1efa1 2012-07-14        kinaba: 		}
b6daa1efa1 2012-07-14        kinaba: 
b6daa1efa1 2012-07-14        kinaba: 		// Fill bg.
b6daa1efa1 2012-07-14        kinaba: 		gr.fillRectangle(this.backColor, Rect(0,0,scrW,scrH));
b6daa1efa1 2012-07-14        kinaba: 
b6daa1efa1 2012-07-14        kinaba: 		// Fill water.
b6daa1efa1 2012-07-14        kinaba: 		int w = g.water_level();
b6daa1efa1 2012-07-14        kinaba: 		gr.fillRectangle(this.colors['W'], Rect(0, scrH-cell*w-1, scrW, cell*w+1));
b6daa1efa1 2012-07-14        kinaba: 
b6daa1efa1 2012-07-14        kinaba: 		// Paint map.
b6daa1efa1 2012-07-14        kinaba: 		for(int y=1; y<=g.map.H; ++y)
b6daa1efa1 2012-07-14        kinaba: 		for(int x=1; x<=g.map.W; ++x) {
b6daa1efa1 2012-07-14        kinaba: 			Rect r = Rect(cell*(x-1), scrH-cell*y, cell, cell);
b6daa1efa1 2012-07-14        kinaba: 			char c = g.map[y,x];
b6daa1efa1 2012-07-14        kinaba: 			if( c != ' ' ) {
b6daa1efa1 2012-07-14        kinaba: 				if( c == 'R' && g.dead )
b6daa1efa1 2012-07-14        kinaba: 					c = 'D';
b6daa1efa1 2012-07-14        kinaba: 				gr.drawText(this.render[c], font, this.colors[c], r);
b6daa1efa1 2012-07-14        kinaba: 			}
b6daa1efa1 2012-07-14        kinaba: 		}
b6daa1efa1 2012-07-14        kinaba: 	}
b6daa1efa1 2012-07-14        kinaba: 
b6daa1efa1 2012-07-14        kinaba: 	void my_keydown(Control c, KeyEventArgs ev)
b6daa1efa1 2012-07-14        kinaba: 	{
b6daa1efa1 2012-07-14        kinaba: 		switch(ev.keyCode)
b6daa1efa1 2012-07-14        kinaba: 		{
b6daa1efa1 2012-07-14        kinaba: 		case Keys.DOWN:  g.command('D'); break;
b6daa1efa1 2012-07-14        kinaba: 		case Keys.UP:    g.command('U'); break;
b6daa1efa1 2012-07-14        kinaba: 		case Keys.LEFT:  g.command('L'); break;
b6daa1efa1 2012-07-14        kinaba: 		case Keys.RIGHT: g.command('R'); break;
b6daa1efa1 2012-07-14        kinaba: 		case Keys.W:     g.command('W'); break;
b6daa1efa1 2012-07-14        kinaba: 		case Keys.A:     g.command('A'); break;
b6daa1efa1 2012-07-14        kinaba: 		default:         break;
b6daa1efa1 2012-07-14        kinaba: 		}
b6daa1efa1 2012-07-14        kinaba: 		if(g.cleared)
b6daa1efa1 2012-07-14        kinaba: 			Application.exit();
b6daa1efa1 2012-07-14        kinaba: 		invalidate();
b6daa1efa1 2012-07-14        kinaba: 		set_text();
b6daa1efa1 2012-07-14        kinaba: 	}
b6daa1efa1 2012-07-14        kinaba: 
b6daa1efa1 2012-07-14        kinaba: 	void set_text() {
b6daa1efa1 2012-07-14        kinaba: 		this.text = .text("Score: ", g.score, " Air: ", g.hp, " Tide: ", g.water_until_rise);
b6daa1efa1 2012-07-14        kinaba: 	}
b6daa1efa1 2012-07-14        kinaba: }
b6daa1efa1 2012-07-14        kinaba: 
b6daa1efa1 2012-07-14        kinaba: void main(string[] args)
b6daa1efa1 2012-07-14        kinaba: {
b6daa1efa1 2012-07-14        kinaba: 	auto g = Game.load(File(args[1]));
b6daa1efa1 2012-07-14        kinaba: 	g.set_output(new StdOutput);
b6daa1efa1 2012-07-14        kinaba: 	auto myForm = new GUI(g);
b6daa1efa1 2012-07-14        kinaba: 	Application.run(myForm);
b6daa1efa1 2012-07-14        kinaba: }