Differences From Artifact [1b2e4ad2dae20251]:
- File
src/game.d
- 2012-07-14 17:38:38 - part of checkin [deca17f61a] on branch trunk - trampoline map supported. (user: kinaba) [annotate]
To Artifact [06258bf9d419d24b]:
- File
src/game.d
- 2012-07-15 01:58:08 - part of checkin [9d983af88c] on branch trunk - Hige parsing and rendering. (user: kinaba) [annotate]
84 assert( 1 == w.level(3) ); 84 assert( 1 == w.level(3) );
85 assert( 1 == w.level(4) ); 85 assert( 1 == w.level(4) );
86 assert( 1 == w.level(5) ); 86 assert( 1 == w.level(5) );
87 } 87 }
88 88
89 //////////////////////////////////////////////////////////////////////////////// 89 ////////////////////////////////////////////////////////////////////////////////
90 90
> 91 class Hige
> 92 {
> 93 public immutable int pace;
> 94 mixin DeriveCreate;
> 95 mixin DeriveCompare;
> 96 mixin DeriveShow;
> 97 Hige clone() const { return cast(Hige)this; }
> 98
> 99 static load(string[string] params)
> 100 {
> 101 return new Hige(params.get("Growth", "25").to!int());
> 102 }
> 103
> 104 bool is_growing_turn(int turn) const
> 105 {
> 106 return pace ? turn%pace == pace-1 : false;
> 107 }
> 108
> 109 int until_rise(int turn) const
> 110 {
> 111 return pace ? pace-turn%pace : int.max;
> 112 }
> 113 }
> 114
> 115 ////////////////////////////////////////////////////////////////////////////////
> 116
91 class Map 117 class Map
92 { 118 {
93 mixin DeriveShow; 119 mixin DeriveShow;
94 120
95 static Map load(string[] raw_data, string[string] params, char[char] tra 121 static Map load(string[] raw_data, string[string] params, char[char] tra
96 { 122 {
97 // TODO: choose optimal representation. 123 // TODO: choose optimal representation.
................................................................................................................................................................................
101 char[][] data; 127 char[][] data;
102 Pos robot; 128 Pos robot;
103 Pos lift; 129 Pos lift;
104 int waterproof; 130 int waterproof;
105 // TODO: immutable 131 // TODO: immutable
106 Pos[char] tr_target; 132 Pos[char] tr_target;
107 Pos[][char] tr_source; 133 Pos[][char] tr_source;
> 134 const(Hige) hige;
> 135 int razor;
108 136
109 Map clone() const { return new Map(this); } 137 Map clone() const { return new Map(this); }
110 this(in Map m) { 138 this(in Map m) {
111 foreach(s; m.data) 139 foreach(s; m.data)
112 this.data ~= s.dup; 140 this.data ~= s.dup;
113 this.robot = m.robot.clone(); 141 this.robot = m.robot.clone();
114 this.lift = m.lift.clone(); 142 this.lift = m.lift.clone();
115 this.waterproof = m.waterproof; 143 this.waterproof = m.waterproof;
116 this.tr_target = cast(Pos[char])m.tr_target; 144 this.tr_target = cast(Pos[char])m.tr_target;
117 this.tr_source = cast(Pos[][char])m.tr_source; 145 this.tr_source = cast(Pos[][char])m.tr_source;
> 146 this.hige = m.hige.clone();
> 147 this.razor = m.razor;
118 } 148 }
119 149
120 this(string[] raw_data, string[string] params, char[char] trampo) 150 this(string[] raw_data, string[string] params, char[char] trampo)
121 { 151 {
122 int width = 0; 152 int width = 0;
123 foreach(r; raw_data) 153 foreach(r; raw_data)
124 width = max(width, r.length); 154 width = max(width, r.length);
................................................................................................................................................................................
146 176
147 this.waterproof = params.get("Waterproof", "5").to!int(); 177 this.waterproof = params.get("Waterproof", "5").to!int();
148 foreach(fr,to; trampo) { 178 foreach(fr,to; trampo) {
149 tr_target[fr] = tr_pos[to]; 179 tr_target[fr] = tr_pos[to];
150 if(to !in tr_source) tr_source[to] = []; 180 if(to !in tr_source) tr_source[to] = [];
151 tr_source[to] ~= tr_pos[fr]; 181 tr_source[to] ~= tr_pos[fr];
152 } 182 }
> 183
> 184 this.hige = Hige.load(params);
> 185 this.razor = params.get("Razors", "0").to!int();
153 } 186 }
154 187
155 const @property { 188 const @property {
156 int H() { return data.length; } 189 int H() { return data.length; }
157 int W() { return data[0].length; } 190 int W() { return data[0].length; }
158 } 191 }
159 192
................................................................................................................................................................................
385 // TODO: when adding members, take care of clone(). 418 // TODO: when adding members, take care of clone().
386 // TODO: fix this poor design. 419 // TODO: fix this poor design.
387 420
388 @property const { 421 @property const {
389 long score() { return lambda*25L*(1+exit_bonus) - turn; } 422 long score() { return lambda*25L*(1+exit_bonus) - turn; }
390 int water_level() { return water.level(turn); } 423 int water_level() { return water.level(turn); }
391 int water_until_rise() { return water.until_rise(turn); } 424 int water_until_rise() { return water.until_rise(turn); }
> 425 int hige_until_rise() { return map.hige.until_rise(turn); }
392 bool cleared() { return exit_bonus>0; } 426 bool cleared() { return exit_bonus>0; }
393 int hp() { return map.waterproof - under_water; } 427 int hp() { return map.waterproof - under_water; }
394 long score_if_abort_now() { return lambda*25*(1+max(1,exit_bonus 428 long score_if_abort_now() { return lambda*25*(1+max(1,exit_bonus
395 } 429 }
396 } 430 }
397 <
398 unittest <
399 { <
400 Game.load(["###","...","#RL"], ["xxx":"yyy"]); <
401 } <