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     84    assert( 1 == w.level(3) );
    85     85    assert( 1 == w.level(4) );
    86     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    117   class Map
    92    118   {
    93    119    mixin DeriveShow;
    94    120   
    95    121    static Map load(string[] raw_data, string[string] params, char[char] trampo)
    96    122    {
    97    123     // TODO: choose optimal representation.
................................................................................
   101    127    char[][] data;
   102    128    Pos robot;
   103    129    Pos lift;
   104    130    int waterproof;
   105    131    // TODO: immutable
   106    132    Pos[char] tr_target;
   107    133    Pos[][char] tr_source;
          134  + const(Hige) hige;
          135  + int razor;
   108    136   
   109    137    Map clone() const { return new Map(this); }
   110    138    this(in Map m) {
   111    139     foreach(s; m.data)
   112    140      this.data ~= s.dup;
   113    141     this.robot = m.robot.clone();
   114    142     this.lift = m.lift.clone();
   115    143     this.waterproof = m.waterproof;
   116    144     this.tr_target = cast(Pos[char])m.tr_target;
   117    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    150    this(string[] raw_data, string[string] params, char[char] trampo)
   121    151    {
   122    152     int width = 0;
   123    153     foreach(r; raw_data)
   124    154      width = max(width, r.length);
................................................................................
   146    176   
   147    177     this.waterproof = params.get("Waterproof", "5").to!int();
   148    178     foreach(fr,to; trampo) {
   149    179      tr_target[fr] = tr_pos[to];
   150    180      if(to !in tr_source) tr_source[to] = [];
   151    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    188    const @property {
   156    189     int H() { return data.length; }
   157    190     int W() { return data[0].length; }
   158    191    }
   159    192   
................................................................................
   385    418    // TODO: when adding members, take care of clone().
   386    419    // TODO: fix this poor design.
   387    420   
   388    421    @property const {
   389    422     long score() { return lambda*25L*(1+exit_bonus) - turn; }
   390    423     int water_level() { return water.level(turn); }
   391    424     int water_until_rise() { return water.until_rise(turn); }
          425  +  int hige_until_rise() { return map.hige.until_rise(turn); }
   392    426     bool cleared() { return exit_bonus>0; }
   393    427     int hp() { return map.waterproof - under_water; }
   394    428     long score_if_abort_now() { return lambda*25*(1+max(1,exit_bonus)) - turn; }
   395    429    }
   396    430   }
   397         -
   398         -unittest
   399         -{
   400         - Game.load(["###","...","#RL"], ["xxx":"yyy"]);
   401         -}