<?php

error_reporting(E_ERROR | E_PARSE);
set_time_limit(-1);
ini_set('max_input_time', '-1');
ini_set('max_execution_time', '0');
session_start();
ob_start();

define('DB_FILE', $_SESSION['modname'] . ".db");

require_once './config.php';
require_once './_pdo.php';

require_once "./src/D2Functions.php";
require_once "./src/D2Database.php";
require_once './src/D2Files.php';
require_once './src/D2TxtParser.php';
require_once './src/D2ItemDesc.php';
require_once  './src/D2Char.php';
require_once './src/D2CharStructureData.php';

$dStruct = new D2CharStructureData();


$p = $_POST;

// ddump($p);

foreach($p['quest'] as $k => $v) {
    $q[$k] = ($dStruct->_qNorm[$k]);
}

foreach($p['wp'] as $k => $v) {
    $w[$k] = ($dStruct->_qNorm[$k]);
}


$filePath = $p['filePath'];
$filePath = str_replace("\\", "\\\\", $filePath);
$fp = fopen($filePath, "rb+");

// delete old checksum at offset 0x0C - byte 12
//fseek($fp, 12);
// (I) unsigned integer (machine dependent size and byte order)
//fwrite($fp, pack('I', 0)); // produces 4 bytes

// edit quests which are checked, to Just finished FE FF
foreach ($q as $k => $v) {
    fseek($fp, $v);
    fwrite($fp, pack('C', 0xFE));
    fseek($fp, $v+1);
    fwrite($fp, pack('C', 0xFF));
}

if ($p['wp_all'] == "1") {
    fseek($fp, 643);
    fwrite($fp, pack('C', 0xFF));
    fseek($fp, 644);
    fwrite($fp, pack('C', 0xFF));    
    fseek($fp, 645);
    fwrite($fp, pack('C', 0xFF));
    fseek($fp, 646);
    fwrite($fp, pack('C', 0xFF));
    fseek($fp, 647);
    fwrite($fp, pack('C', 0x7F));    
    
    fseek($fp, 667);
    fwrite($fp, pack('C', 0xFF));
    fseek($fp, 668);
    fwrite($fp, pack('C', 0xFF));    
    fseek($fp, 669);
    fwrite($fp, pack('C', 0xFF));
    fseek($fp, 670);
    fwrite($fp, pack('C', 0xFF));
    fseek($fp, 671);
    fwrite($fp, pack('C', 0x7F)); 
    
    fseek($fp, 691);
    fwrite($fp, pack('C', 0xFF));
    fseek($fp, 692);
    fwrite($fp, pack('C', 0xFF));    
    fseek($fp, 693);
    fwrite($fp, pack('C', 0xFF));
    fseek($fp, 694);
    fwrite($fp, pack('C', 0xFF));
    fseek($fp, 695);
    fwrite($fp, pack('C', 0x7F)); 
    
} 
    else if ($p['wp_all'] == "0") 
{
    fseek($fp, 643);
    fwrite($fp, pack('C', 0x00));
    fseek($fp, 644);
    fwrite($fp, pack('C', 0x00));    
    fseek($fp, 645);
    fwrite($fp, pack('C', 0x00));
    fseek($fp, 646);
    fwrite($fp, pack('C', 0x00));
    fseek($fp, 647);
    fwrite($fp, pack('C', 0x00));    
    
    fseek($fp, 667);
    fwrite($fp, pack('C', 0x00));
    fseek($fp, 668);
    fwrite($fp, pack('C', 0x00));    
    fseek($fp, 669);
    fwrite($fp, pack('C', 0x00));
    fseek($fp, 670);
    fwrite($fp, pack('C', 0x00));
    fseek($fp, 671);
    fwrite($fp, pack('C', 0x00)); 
    
    fseek($fp, 691);
    fwrite($fp, pack('C', 0x00));
    fseek($fp, 692);
    fwrite($fp, pack('C', 0x00));    
    fseek($fp, 693);
    fwrite($fp, pack('C', 0x00));
    fseek($fp, 694);
    fwrite($fp, pack('C', 0x00));
    fseek($fp, 695);
    fwrite($fp, pack('C', 0x00));    
}


$checksum = (shell_exec("bin\d2scs.exe \"$filePath\""));

// write NEW checksum at offset 0x0C - byte 12
//fseek($fp, 12);
// (I) unsigned integer (machine dependent size and byte order)
//fwrite($fp, pack('H*', $checksum)); // produces 4 bytes


fclose($fp);

header('Location: /');