Differences From Artifact [18f8bb38825744d0]:
- File
src/game.d
- 2012-07-16 10:08:05 - part of checkin [03b7073abc] on branch trunk - refactor. (user: kinaba) [annotate]
To Artifact [521705f028ec7e74]:
- File
src/game.d
- 2012-07-16 10:18:57 - part of checkin [7bd1ed1180] on branch trunk - more. (user: kinaba) [annotate]
149 immutable char[] target_of_; 149 immutable char[] target_of_;
150 immutable char[][] source_of_; 150 immutable char[][] source_of_;
151 immutable Pos[] position_of_; 151 immutable Pos[] position_of_;
152 immutable char[] source_list_; 152 immutable char[] source_list_;
153 immutable char[] target_list_; 153 immutable char[] target_list_;
154 Trampoline clone() const { return cast(Trampoline) this; } 154 Trampoline clone() const { return cast(Trampoline) this; }
155 155
156 this(Map m, char[char] tramparam) | 156 this(in Map m, char[char] tramparam)
157 { 157 {
158 auto ta = new char['I'+1]; 158 auto ta = new char['I'+1];
159 auto sr = new char[]['9'+1]; 159 auto sr = new char[]['9'+1];
160 auto po = new Pos[max('I','9')+1]; 160 auto po = new Pos[max('I','9')+1];
161 char[] sl, tl; 161 char[] sl, tl;
162 foreach(fr,to; tramparam) { 162 foreach(fr,to; tramparam) {
163 ta[fr] = to; 163 ta[fr] = to;
................................................................................................................................................................................
441 } 441 }
442 442
443 //////////////////////////////////////////////////////////////////////////////// 443 ////////////////////////////////////////////////////////////////////////////////
444 444
445 class Game 445 class Game
446 { 446 {
447 mixin DeriveShow; 447 mixin DeriveShow;
> 448
> 449 private {
> 450 Map map_;
> 451 Water water_;
> 452 Hige hige_;
> 453 Trampoline tr_;
> 454 int turn = 0;
> 455 bool dead_ = false;
> 456 int under_water = 0;
> 457 }
> 458
> 459 Game clone() const { return new Game(this); }
> 460 this(in Game g) {
> 461 map_ = g.map_.clone();
> 462 water_ = g.water_.clone();
> 463 hige_ = g.hige_.clone();
> 464 tr_ = g.tr_.clone();
> 465 turn = g.turn;
> 466 dead_ = g.dead_;
> 467 under_water = g.under_water;
> 468 }
448 469
449 this(File input) 470 this(File input)
450 { 471 {
451 string[] raw_data; 472 string[] raw_data;
452 string[string] params; 473 string[string] params;
453 474
454 // Raw map data; read until empty line. 475 // Raw map data; read until empty line.
................................................................................................................................................................................
461 string[] ss = line.split(); 482 string[] ss = line.split();
462 if( ss.length == 2 ) 483 if( ss.length == 2 )
463 params[ss[0]] = ss[1]; 484 params[ss[0]] = ss[1];
464 if( ss.length == 4 && ss[0]=="Trampoline" && ss[2]=="tar 485 if( ss.length == 4 && ss[0]=="Trampoline" && ss[2]=="tar
465 trampo[ss[1][0]] = ss[3][0]; 486 trampo[ss[1][0]] = ss[3][0];
466 } 487 }
467 488
468 this.map = new Map(raw_data, params, trampo); | 489 this.map_ = new Map(raw_data, params, trampo);
469 this.water = Water.load(params); | 490 this.water_ = Water.load(params);
470 this.hige = Hige.load(params); | 491 this.hige_ = Hige.load(params);
471 this.tr = new Trampoline(this.map, trampo); | 492 this.tr_ = new Trampoline(this.map, trampo);
472 } <
473 <
474 Game clone() const { return new Game(this); } <
475 this(in Game g) { <
476 map = g.map.clone(); <
477 water = g.water.clone(); <
478 hige = g.hige.clone(); <
479 tr = g.tr.clone(); <
480 turn = g.turn; <
481 dead = g.dead; <
482 under_water = g.under_water; <
483 } 493 }
484 494
485 void command(char c) 495 void command(char c)
486 { 496 {
487 assert(c != 'A'); 497 assert(c != 'A');
488 if(dead || cleared) 498 if(dead || cleared)
489 return; 499 return;
490 500
491 // TODO: clarify the event order 501 // TODO: clarify the event order
492 bool dead_now = map.command(c, turn, hige.is_growing_turn(turn), | 502 bool dead_now = map_.command(c, turn, hige.is_growing_turn(turn)
493 if( dead_now ) 503 if( dead_now )
494 dead = true; | 504 dead_ = true;
495 if(!map.cleared) { 505 if(!map.cleared) {
496 if( map.robot.y <= water_level ) 506 if( map.robot.y <= water_level )
497 ++under_water; 507 ++under_water;
498 else 508 else
499 under_water = 0; 509 under_water = 0;
500 if( under_water > map.waterproof ) 510 if( under_water > map.waterproof )
501 dead = true; | 511 dead_ = true;
502 } 512 }
503 turn += 1; 513 turn += 1;
504 } 514 }
505 515
506 Map map; <
507 Water water; <
508 Hige hige; <
509 Trampoline tr; <
510 int turn = 0; <
511 bool dead = false; <
512 int under_water = 0; <
513 // TODO: when adding members, take care of clone(). <
514 // TODO: fix this poor design. <
515 <
516 @property const: 516 @property const:
517 long score() { return map.collected_lambda*(dead?25L:cleared?7 517 long score() { return map.collected_lambda*(dead?25L:cleared?7
518 int water_level() { return water.level(turn); } 518 int water_level() { return water.level(turn); }
519 int water_until_rise() { return water.until_rise(turn); } 519 int water_until_rise() { return water.until_rise(turn); }
520 int hige_until_rise() { return hige.until_rise(turn); } 520 int hige_until_rise() { return hige.until_rise(turn); }
521 int hp() { return map.waterproof - under_water; } 521 int hp() { return map.waterproof - under_water; }
522 bool cleared() { return map.cleared; } 522 bool cleared() { return map.cleared; }
> 523 bool dead() { return dead_; }
> 524 const(Map) map() { return map_; }
> 525 const(Water) water() { return water_; }
> 526 const(Hige) hige() { return hige_; }
> 527 const(Trampoline) tr() { return tr_; }
523 } 528 }