Differences From Artifact [3f9e2911ee63dc4e]:
- File
src/output.d
- 2012-07-14 14:22:32 - part of checkin [a0c3529225] on branch trunk - code cleanup (user: kinaba) [annotate]
To Artifact [62e6040714438eff]:
- File
src/output.d
- 2012-07-14 14:41:22 - part of checkin [95915ac93f] on branch trunk - n*m limitter. (user: kinaba) [annotate]
21 21
22 class GuardedOutput : GameObserver 22 class GuardedOutput : GameObserver
23 { 23 {
24 this(in Game g) 24 this(in Game g)
25 { 25 {
26 setup_sigint_handling(); 26 setup_sigint_handling();
27 ideal_log ~= g.score_if_abort_now; 27 ideal_log ~= g.score_if_abort_now;
> 28 flushed = false;
28 } 29 }
29 30
30 override void on_game_changed(char c, in Game g, bool finished) 31 override void on_game_changed(char c, in Game g, bool finished)
31 { 32 {
> 33 if(flushed)
> 34 return;
> 35
32 log ~= c; 36 log ~= c;
33 score_log ~= g.score; 37 score_log ~= g.score;
34 ideal_log ~= g.score_if_abort_now; 38 ideal_log ~= g.score_if_abort_now;
35 if(finished) | 39 if(finished || log.length+1==g.map.W*g.map.H)
36 flush(); 40 flush();
37 } 41 }
38 42
39 private: 43 private:
40 string log; 44 string log;
41 long[] score_log; 45 long[] score_log;
42 long[] ideal_log; 46 long[] ideal_log;
> 47 bool flushed;
43 48
44 void flush() 49 void flush()
45 { 50 {
46 Tuple!(long, int, int) cand; 51 Tuple!(long, int, int) cand;
47 cand[0] = long.min; 52 cand[0] = long.min;
48 53
49 for(int i=0; i<score_log.length; ++i) 54 for(int i=0; i<score_log.length; ++i)
................................................................................................................................................................................
57 string str = log[0..cand[1]+1]; 62 string str = log[0..cand[1]+1];
58 std.c.stdio.printf("%.*s\n", str.length, str.ptr); 63 std.c.stdio.printf("%.*s\n", str.length, str.ptr);
59 } else { 64 } else {
60 string str = log[0..cand[1]]; 65 string str = log[0..cand[1]];
61 std.c.stdio.printf("%.*sA\n", str.length, str.ptr); 66 std.c.stdio.printf("%.*sA\n", str.length, str.ptr);
62 } 67 }
63 std.c.stdio.fflush(std.c.stdio.stdout); 68 std.c.stdio.fflush(std.c.stdio.stdout);
> 69 flushed = true;
64 } 70 }
65 71
66 private: 72 private:
67 static __gshared GuardedOutput g_output; 73 static __gshared GuardedOutput g_output;
68 74
69 void setup_sigint_handling() 75 void setup_sigint_handling()
70 { 76 {
71 assert(g_output is null); 77 assert(g_output is null);
72 g_output = this; 78 g_output = this;
73 extern(C) static void catch_sigint(int) { g_output.flush(); appl 79 extern(C) static void catch_sigint(int) { g_output.flush(); appl
74 core.stdc.signal.signal(SIGINT, &catch_sigint); 80 core.stdc.signal.signal(SIGINT, &catch_sigint);
75 } 81 }
76 } 82 }