hex='';
if (is_file($filename)) {
$handle=fopen($filename,"r");
while (!feof($handle)) {
$this->hex.=fgets($handle,filesize($filename));
}
fclose($handle);
} else {
die ("$filename not exists!");
}
}
public function save($filename,$charinfo=false) {
if (!$handle = fopen($filename, 'w')) {
die("Can't open file $filename");
}
if (!$charinfo) $this->setChecksum(); //вычислить CRC
fwrite($handle, $this->hex);
fclose($handle);
}
public function getValue($start,$length) { //выбрать срез строки
return substr($this->hex, $start, $length);
}
public function setValue($hexstr,$start,$length) { //заменить срез строки значением $hexstr
$this->hex=substr($this->hex, 0, $start) . $hexstr . substr($this->hex, $start+$length);
}
public function setName ($charname,$start=20) {
//для charinfo $start = 48
$this->checkName($charname);
$charname=str_pad($charname, 16,chr(0), STR_PAD_RIGHT); //заполнить все пустые справа
$this->setValue($charname,$start,16);
}
public function checkName($charname) {
if(!preg_match("/^[a-zA-Z-_]+$/", $charname) or strlen($charname)<3 or strlen($charname)>15) {
die ("Имя должно быть 3-15 символов и содержать только буквы и _-
Name must contain 3-15 characters and allowed only letters, numeral and _-");
}
}
public function getName ($start=20) {
//для charinfo $start = 48
$charname=$this->getValue($start,16);
$charname=str_replace("?","",$charname);
return $charname;
}
public function getCharinfo() {
$charname=str_replace('?','',$charname);
return $charname;
}
public function setUndead() { //снять dead
$this->setValue("d",36,1);
}
public function setLock() { //отредактирован в php моем редакторе :-)
$this->setValue("lock",52,4);
}
private function setChecksum()
{
$this->setValue(chr(0).chr(0).chr(0).chr(0), 12,4); //обнулить CRC
$sum = 0;
for($i=0;$i < strlen($this->hex);$i++)
{
$sum = sprintf('%032s',decbin($sum));
$sum = substr($sum,1) . substr($sum, 0, 1);
$sum = bindec($sum);
$sum += ord(substr($this->hex,$i,1));
}
$this->setValue($this->dec2str($sum,true), 12,4); //записать CRC
}
private function dec2str($int,$reverse=false) { //число в строку(символы)
$hex=dechex($int);
$arr=str_split($hex,2);
if ($reverse==true) $arr=array_reverse($arr);
$str="";
foreach ($arr as $key=>$value) {
$str.=chr(hexdec($value));
}
return $str;
}
private function str2hex($str) { //строку в hex
$hexStr='';
for ($i=0; $i