static function freadstring($file, $max, $trim = true)
 {
     $chars = file_helpers::freadchars($file, $max);
     $string = "";
     foreach ($chars as $c) {
         if ($c == 0) {
             break;
         }
         $string .= chr($c);
     }
     return $trim ? file_helpers::_oem2ansi(trim($string)) : $string;
 }
 private function _load()
 {
     $wld = fopen($this->file, "rb");
     if (!$wld) {
         return $this->_error("invalid file");
     }
     if (!file_helpers::freadid($wld)) {
         // WORLD_V1.0
         return $this->_error("no S2-Map");
     }
     $this->header['name'] = file_helpers::freadstring($wld, 20);
     // "foo"
     $this->header['width'] = file_helpers::freadshort($wld);
     // w
     $this->header['height'] = file_helpers::freadshort($wld);
     // h
     $this->header['type'] = file_helpers::freadchar($wld);
     // green-/waste-/winterland
     $this->header['players'] = file_helpers::freadchar($wld);
     // number of players
     $this->header['author'] = file_helpers::freadstring($wld, 20);
     // "bar"
     // jump to first subheader
     fseek($wld, 2342, SEEK_SET);
     if (!file_helpers::freadshid($wld, 0x11)) {
         // 11 27 0 0 0 0
         return $this->_error("invalid S2-Map");
     }
     $this->header['width'] = file_helpers::freadshort($wld);
     // w (again)
     $this->header['height'] = file_helpers::freadshort($wld);
     // h (again)
     $keys = array_keys($this->blocks);
     // read the blocks
     for ($i = 0; $i < 14; $i++) {
         if (!file_helpers::freadshid($wld, 0x10)) {
             // 10 27 0 0 0 0
             return $this->_error("invalid S2-Subheader");
         }
         $width = file_helpers::freadshort($wld);
         // sub w
         $height = file_helpers::freadshort($wld);
         // sub h
         if (file_helpers::freadshort($wld) != 1) {
             // 01 00
             return $this->_error("invalid S2-Sub-Id");
         }
         $length = file_helpers::freadint($wld);
         // length of block (w*h)
         $this->blocks[$keys[$i]] = file_helpers::freadchars($wld, $length);
     }
     fclose($wld);
     return true;
 }