6293256fec 2012-07-14 kinaba: import dfl.all; 6293256fec 2012-07-14 kinaba: import util; 6293256fec 2012-07-14 kinaba: import game; bee0596f0f 2012-07-14 kinaba: import driver; 6293256fec 2012-07-14 kinaba: 9d4aca73fa 2012-07-14 kinaba: class GUI(Solver) : Form, GameObserver 6293256fec 2012-07-14 kinaba: { a0c3529225 2012-07-14 kinaba: this(in Game g) 9d4aca73fa 2012-07-14 kinaba: { 9d4aca73fa 2012-07-14 kinaba: this.solver = new Solver(g); e02668367d 2012-07-15 kinaba: setup_size(g.map.W, g.map.H); b8acb5f918 2012-07-14 kinaba: setup_resources(g); 9d4aca73fa 2012-07-14 kinaba: draw(g); 9d4aca73fa 2012-07-14 kinaba: } 9d4aca73fa 2012-07-14 kinaba: b6026abfcf 2012-07-15 kinaba: void run(void delegate(char c) command, bool automate = true) 9d4aca73fa 2012-07-14 kinaba: { 8a59754e60 2012-07-14 kinaba: if(automate) { 8a59754e60 2012-07-14 kinaba: Timer t = new Timer; 0c10424b3c 2012-07-14 kinaba: t.interval = 50; b6026abfcf 2012-07-15 kinaba: t.tick ~= (Timer s, EventArgs e){command(solver.single_step());}; 8a59754e60 2012-07-14 kinaba: t.start(); 976b6210b7 2012-07-14 kinaba: this.closing ~= (Form f,CancelEventArgs c){t.stop();}; db3405fee7 2012-07-14 kinaba: } else { b6026abfcf 2012-07-15 kinaba: setup_keyhandling(command); 8a59754e60 2012-07-14 kinaba: } 9c48acc38d 2012-07-16 kinaba: this.startPosition = FormStartPosition.CENTER_SCREEN; 9d4aca73fa 2012-07-14 kinaba: Application.run(this); bee0596f0f 2012-07-14 kinaba: } 6293256fec 2012-07-14 kinaba: aea6cfc7e3 2012-07-14 kinaba: override void on_game_changed(char c, in Game g, bool finished) 9d4aca73fa 2012-07-14 kinaba: { 9d4aca73fa 2012-07-14 kinaba: draw(g); 6293256fec 2012-07-14 kinaba: } 6293256fec 2012-07-14 kinaba: 9d4aca73fa 2012-07-14 kinaba: private: 9d4aca73fa 2012-07-14 kinaba: void setup_size(int W, int H) 6293256fec 2012-07-14 kinaba: { 6293256fec 2012-07-14 kinaba: this.formBorderStyle = FormBorderStyle.FIXED_DIALOG; 6293256fec 2012-07-14 kinaba: this.maximizeBox = false; 6293256fec 2012-07-14 kinaba: this.minimizeBox = false; 9d4aca73fa 2012-07-14 kinaba: this.cell = min(1024/W, 640/H); 9d4aca73fa 2012-07-14 kinaba: this.clientSize = Size(W*cell, H*cell); 9d4aca73fa 2012-07-14 kinaba: } bee0596f0f 2012-07-14 kinaba: b6026abfcf 2012-07-15 kinaba: int cell; 9d4aca73fa 2012-07-14 kinaba: Font font; 9d4aca73fa 2012-07-14 kinaba: Color[char] colors; 9d4aca73fa 2012-07-14 kinaba: string[char] render; 9d4aca73fa 2012-07-14 kinaba: Graphics graphicContext; 6293256fec 2012-07-14 kinaba: b8acb5f918 2012-07-14 kinaba: void setup_resources(in Game g) 9d4aca73fa 2012-07-14 kinaba: { 9d4aca73fa 2012-07-14 kinaba: this.graphicContext = new MemoryGraphics(this.clientSize.width, this.clientSize.height); 9d4aca73fa 2012-07-14 kinaba: this.setStyle(ControlStyles.OPAQUE, true); 6293256fec 2012-07-14 kinaba: this.font = new Font("MS Gothic", cell-2, GraphicsUnit.PIXEL); 6293256fec 2012-07-14 kinaba: this.backColor = Color(255,255,255); 6293256fec 2012-07-14 kinaba: this.colors['#'] = 6293256fec 2012-07-14 kinaba: this.colors['.'] = Color(255,191,127); 0e9ec945bb 2012-07-15 kinaba: this.colors['*'] = 0e9ec945bb 2012-07-15 kinaba: this.colors['@'] = Color(255,127,127); 6293256fec 2012-07-14 kinaba: this.colors['R'] = Color(128,128,0); 68b686ff6d 2012-07-15 kinaba: this.colors['r'] = Color(100,128,255); 71cbce70b5 2012-07-14 kinaba: this.colors['d'] = Color(255,0,0); 6293256fec 2012-07-14 kinaba: this.colors['\\'] = 6293256fec 2012-07-14 kinaba: this.colors['L'] = 6293256fec 2012-07-14 kinaba: this.colors['O'] = Color(127,255,127); 9d983af88c 2012-07-15 kinaba: this.colors['w'] = Color(204,229,255); 9d983af88c 2012-07-15 kinaba: this.colors['W'] = 9d983af88c 2012-07-15 kinaba: this.colors['!'] = Color(159,159,159); b8acb5f918 2012-07-14 kinaba: foreach(char c; 'A'..'J') this.colors[c] = Color(142,142,255); b8acb5f918 2012-07-14 kinaba: foreach(char c; '1'..':') this.colors[c] = Color(255,142,255); 6293256fec 2012-07-14 kinaba: this.render['#'] = "■"; 6293256fec 2012-07-14 kinaba: this.render['*'] = "✹"; 0e9ec945bb 2012-07-15 kinaba: this.render['@'] = "❁"; 6293256fec 2012-07-14 kinaba: this.render['.'] = "♒"; 6293256fec 2012-07-14 kinaba: this.render['\\'] = "λ"; 6293256fec 2012-07-14 kinaba: this.render['R'] = "☃"; 68b686ff6d 2012-07-15 kinaba: this.render['r'] = "☃"; 71cbce70b5 2012-07-14 kinaba: this.render['d'] = "☠"; 6293256fec 2012-07-14 kinaba: this.render['L'] = "☒"; deca17f61a 2012-07-14 kinaba: this.render['O'] = "☐"; 9d983af88c 2012-07-15 kinaba: this.render['W'] = "ꔣ"; 9d983af88c 2012-07-15 kinaba: this.render['!'] = "✄"; d40deaae5a 2012-07-15 kinaba: foreach(char c; g.tr.source_list) d40deaae5a 2012-07-15 kinaba: this.render[c] = [cast(dchar)('☢'+g.tr.target_of(c)-'1')].to!string(); d40deaae5a 2012-07-15 kinaba: foreach(char c; g.tr.target_list) d40deaae5a 2012-07-15 kinaba: this.render[c] = [cast(dchar)('☢'+c-'1')].to!string(); 9d4aca73fa 2012-07-14 kinaba: this.paint ~= (Control c, PaintEventArgs ev) { 9d4aca73fa 2012-07-14 kinaba: graphicContext.copyTo(ev.graphics, Rect(0,0,this.clientSize.width,this.clientSize.height)); 9d4aca73fa 2012-07-14 kinaba: }; 6293256fec 2012-07-14 kinaba: } 6293256fec 2012-07-14 kinaba: aea6cfc7e3 2012-07-14 kinaba: void draw(in Game g) 6293256fec 2012-07-14 kinaba: { bee0596f0f 2012-07-14 kinaba: int scrW = this.clientSize.width; bee0596f0f 2012-07-14 kinaba: int scrH = this.clientSize.height; 9d4aca73fa 2012-07-14 kinaba: 6293256fec 2012-07-14 kinaba: // Fill bg. 9d4aca73fa 2012-07-14 kinaba: graphicContext.fillRectangle(this.backColor, Rect(0,0,scrW,scrH)); 6293256fec 2012-07-14 kinaba: 6293256fec 2012-07-14 kinaba: // Fill water. 6293256fec 2012-07-14 kinaba: int w = g.water_level(); 9d983af88c 2012-07-15 kinaba: graphicContext.fillRectangle(this.colors['w'], Rect(0, scrH-cell*w-1, scrW, cell*w+1)); 6293256fec 2012-07-14 kinaba: 6293256fec 2012-07-14 kinaba: // Paint map. e02668367d 2012-07-15 kinaba: for(int y=1; y<=g.map.H; ++y) e02668367d 2012-07-15 kinaba: for(int x=1; x<=g.map.W; ++x) { 6293256fec 2012-07-14 kinaba: Rect r = Rect(cell*(x-1), scrH-cell*y, cell, cell); e02668367d 2012-07-15 kinaba: char c = g.map[y,x]; 6293256fec 2012-07-14 kinaba: if( c != ' ' ) { 68b686ff6d 2012-07-15 kinaba: if( c == 'R' ) 68b686ff6d 2012-07-15 kinaba: c = (g.dead ? 'd' : g.cleared ? 'r' : 'R'); 9d4aca73fa 2012-07-14 kinaba: graphicContext.drawText(this.render[c], font, this.colors[c], r); 6293256fec 2012-07-14 kinaba: } 6293256fec 2012-07-14 kinaba: } bee0596f0f 2012-07-14 kinaba: 9d4aca73fa 2012-07-14 kinaba: // Update textual info. 9d983af88c 2012-07-15 kinaba: this.text = .text( 9d983af88c 2012-07-15 kinaba: "Score: ", g.score, 9d983af88c 2012-07-15 kinaba: " Air: ", g.hp, 9d983af88c 2012-07-15 kinaba: " Tide: ", g.water_until_rise, 9d983af88c 2012-07-15 kinaba: " Wadler: ", g.hige_until_rise, b96971b0b6 2012-07-16 kinaba: " Razor: ", g.map.num_razor); 9d4aca73fa 2012-07-14 kinaba: invalidate(); 6293256fec 2012-07-14 kinaba: } 6293256fec 2012-07-14 kinaba: 9d4aca73fa 2012-07-14 kinaba: private: b6026abfcf 2012-07-15 kinaba: void setup_keyhandling(void delegate(char c) command) 6293256fec 2012-07-14 kinaba: { 9d4aca73fa 2012-07-14 kinaba: noMessageFilter(); b6026abfcf 2012-07-15 kinaba: this.keyDown ~= (Control c, KeyEventArgs ev) { b6026abfcf 2012-07-15 kinaba: void do_manual_command(char c) b6026abfcf 2012-07-15 kinaba: { b6026abfcf 2012-07-15 kinaba: solver.force(c); b6026abfcf 2012-07-15 kinaba: command(c); b6026abfcf 2012-07-15 kinaba: } b6026abfcf 2012-07-15 kinaba: switch(ev.keyCode) b6026abfcf 2012-07-15 kinaba: { b6026abfcf 2012-07-15 kinaba: case Keys.DOWN: do_manual_command('D'); break; b6026abfcf 2012-07-15 kinaba: case Keys.UP: do_manual_command('U'); break; b6026abfcf 2012-07-15 kinaba: case Keys.LEFT: do_manual_command('L'); break; b6026abfcf 2012-07-15 kinaba: case Keys.RIGHT: do_manual_command('R'); break; b6026abfcf 2012-07-15 kinaba: case Keys.W: do_manual_command('W'); break; b6026abfcf 2012-07-15 kinaba: case Keys.S: do_manual_command('S'); break; b6026abfcf 2012-07-15 kinaba: case Keys.A: do_manual_command('A'); break; b6026abfcf 2012-07-15 kinaba: case Keys.G: command(solver.single_step()); break; b6026abfcf 2012-07-15 kinaba: default: break; b6026abfcf 2012-07-15 kinaba: } b6026abfcf 2012-07-15 kinaba: }; 6293256fec 2012-07-14 kinaba: } 6293256fec 2012-07-14 kinaba: 9d4aca73fa 2012-07-14 kinaba: Solver solver; 6293256fec 2012-07-14 kinaba: }