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: }