<?php

// Set error reporting to only show errors and parse errors
error_reporting(E_ERROR | E_PARSE);

// Set the time limit for script execution to unlimited
set_time_limit(-1);

// Set the maximum input time to unlimited
ini_set('max_input_time', '-1');

// Set the maximum execution time to unlimited
ini_set('max_execution_time', '0');

// Start the session
session_start();

// Start output buffering
ob_start();

// Define the constant 'DB_FILE' with the value of 'modname' session variable followed by ".db"
define('DB_FILE', $_SESSION['modname'] . ".db");

// Include the configuration file
require_once './config.php';

// Include the PDO wrapper file
require_once './_pdo.php';

// Include the required class files
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';
require_once './src/D2ByteReader.php';

// Create an instance of D2CharStructureData class
$csData = new D2CharStructureData();

$g = $_GET;
$cmd = $g['cmd'];

// Get the file path from the POST data and replace backslashes /
$filePath = $g['filePath'];
$filePath = str_replace("\\", "\\\\", $filePath);

// Handle the WP check/uncheck
if ($cmd == "wp") {
    $diff = $g['diff'];

    if ($diff == "Norm") {
        $offset = 643;
    }

    if ($diff == "NM") {
        $offset = 667;
    }

    if ($diff == "Hell") {
        $offset = 691;
    }

    /*
      array (size=5)
      'cmd' => string 'wp' (length=2)
      'name' => string '1' (length=1)
      'value' => string '1' (length=1)
      'filePath' => string 'D:\\Diablo II\\MODS\\ironman-dev\\save\\Sorc.d2s' (length=48)
      'diff' => string 'Norm' (length=4)
     */



    $fileContents = file_get_contents($filePath); // Read the contents of the file
    $ByteReader = new D2ByteReader($fileContents); // Create a new instance of D2ByteReader with the file data
    $fileData = $ByteReader->getData(); // Get the data from the ByteReader instance      

    $wpBytes = $ByteReader->read($offset, 5, 1);
    $wpBytesToBits = $ByteReader->toBits($wpBytes);

    $BitReader = new D2BitReader($wpBytesToBits);

    $BitReader->setBit($g['name'], $g['value']);

    $newBits = $BitReader->getBits();

    $newBitsToBytes = $ByteReader->bitsToHexString($newBits);

    $ByteReader->writeBytes($offset, $newBitsToBytes);
    
    $newFileData = $ByteReader->getData();      
    $fileSaved = file_put_contents($filePath, $newFileData);
    $checksum = (shell_exec("bin\d2scs.exe \"$filePath\""));
    
    if ($fileSaved) {
        echo "Success";
    } else {
        echo "Fail";
    }
    
}



























die();

// Get the POST data
$p = $_GET;

// Loop through each 'quest' element in the POST data and assign the corresponding value from 'dStruct->_qNorm' to 'q'
foreach ($p['quest'] as $k => $v) {
    $q[$k] = $dStruct->_qNorm[$k];
}

$wpNames_flipped = array_values($dStruct->wpNames_flipped);

// Loop through each 'wp' element in the POST data and assign the corresponding value from 'dStruct->_qNorm' to 'w'
foreach ($p['wp'] as $k => $v) {
    $w[$k] = $dStruct->_qNorm[$k];
}

// Get the file path from the POST data and replace backslashes /
$filePath = $p['filePath'];
$filePath = str_replace("\\", "\\\\", $filePath);

// Open the file in binary mode for both reading and writing
$fp = fopen($filePath, "rb+");

// Edit quests which are checked to set them as 'Just finished' (FE FF)
foreach ($q as $k => $v) {
    // Set the file pointer position to the quest offset
    fseek($fp, $v);

    // Write the byte value 0xFE at the current position
    fwrite($fp, pack('C', 0xFE));

    // Move the file pointer to the next position
    fseek($fp, $v + 1);

    // Write the byte value 0xFF at the current position
    fwrite($fp, pack('C', 0xFF));
}


// Array containing the fseek wp offsets
// 5 acts per difficulty
// starts at 641, but we skip two bytes, go to 643, then read next 5 bytes, each byte is a bitfield per act.



$offsets = [
    643, 644, 645, 646, 647, // First set of offsets Norm
    667, 668, 669, 670, 671, // Second set of offsets NM
    691, 692, 693, 694, 695    // Third set of offsets Hell
];

// Determine the value to write based on the condition $p['wp_all'] == "1"
$valueToWrite = ($p['wp_all'] == "1") ? 0xFF : 0x00;

// Loop over each offset in the $offsets array
foreach ($offsets as $offset) {
    // Set the file pointer position to the current offset
    fseek($fp, $offset);

    // Write the value specified by pack('C', $valueToWrite)
    fwrite($fp, pack('C', $valueToWrite));
}


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

header('Location: /');