<!DOCTYPE html>
<html>
<head>

<meta charset="UTF-8">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>MmM モンスト</title>
<style>
    html, body {
        margin: 0;
        padding: 0;
        height: 100%;
        width: 100%;
        font-family: 'Arial', sans-serif;
        background-color: transparent;
        display: flex;
        justify-content: left;
        align-items: center;
        overflow: hidden;
    }
    
    .app-container {
        width: 220px;
        height: 90%; /* 画面の高さを制限 */
        background-color: #4d0000;
        border-radius: 10px;
        display: flex;
        justify-content: center;
        align-items: center;
        overflow: hidden; /* はみ出しを隠す */
    }

    .app {
        text-align: center;
        width: 100%;
        height: 100%;
        padding: 20px;
        background-color: #4d0000;
        border-radius: 10px;
        display: flex;
        flex-direction: column;
        justify-content: flex-start; /* 上から配置 */
        align-items: center;
        overflow-y: auto; /* 縦スクロールを追加 */
    }
    
    .title {
        font-size: 24px;
        margin-bottom: 20px;
        color: white;
    }
    
    .section {
        margin-bottom: 20px;
    }
    
    .section-title {
        font-size: 20px;
        margin-bottom: 10px;
        border-bottom: 2px solid #7d7e7d;
        padding-bottom: 5px;
        color: rgb(54, 243, 240);
    }
    
    .menu-item {
        background-color: transparent;
        color: #00ff00;
        font-size: 18px;
        margin: 10px 0;
        padding: 10px;
        border: 2px solid #00ff00;
        border-radius: 5px;
        transition: background-color 0.3s, color 0.3s;
        cursor: pointer;
        width: 100%;
        box-sizing: border-box;
    }
    
    .menu-item:hover {
        color: white;
    }
    
    .menu-item.active {
        background-color: #00ff004b;
    }
</style>
</head>
<body>

<div class="app-container"> <!-- スクロールを含むラッパーを追加 -->
<div class="app">

  <h1 class="title">星那 モンスト</h1>
  
    <div class="section">
        <h2 class="section-title">ーキャラクター</h2>
        <div class="menu-item" id="one-billion" onclick="toggleOneBillion()">1億ダメ</div>
        <div class="menu-item" id="invincible" onclick="toggleInvincible()">無敵</div>
    </div>
  
  </div>

<script>


// 1億ダメ
const Address2 = '0x596B0';

//無敵
const Address7 = '0xBD4AF4';


function one_dame(){
    monst_main( Address2,'0174A7D2')
}

function oned_end(){
  monst_main( Address2,'E10316AA')
}


function invincible_on(){
    monst_main( Address7,'C0035FD6')
}

function invincible_off(){
    monst_main( Address7,'EB28B86D')
}

function validateModules() {
    if (typeof h5gg === "undefined") {
        alert("h5gg モジュールが存在しません。この機能は特定の環境でのみ動作します。");
        return;
    }

    try {
        // モジュールを取得
        const modules = h5gg.getRangesList();

        // .dylib を含むモジュール名を抽出
        const dylibModules = modules
            .filter(module => module.name.includes(".dylib"))
            .map(module => module.name.substring(module.name.lastIndexOf("/") + 1));

        if (dylibModules.length === 0) {
            alert(".dylib を含むモジュールが見つかりませんでした。");
            return 1; // .dylib が存在しない場合は問題なしとして扱う
        }

        // 環境矛盾のチェック対象モジュール
        const conflictingModules = [
            "bootstrap.dylib",
            "libroothide.dylib",
            "roothideinit.dylib",
            "roothidepatch.dylib",
            "libinjector.dylib",
            "Shadow.dylib",
            "libsandy.dylib",
            "libellekit.dylib"
        ];

        // "!" を含むモジュールを検出
        const modulesWithExclamation = dylibModules.filter(name => name.includes("!"));

        // 環境矛盾チェック
        const containsSystemHook = dylibModules.includes("systemhook.dylib");
        const conflictingDetected = dylibModules.filter(name => conflictingModules.includes(name));

        // 重複しているモジュールを検出
        const duplicateModules = dylibModules.filter((name, index, array) => array.indexOf(name) !== index);

        // エラーの表示と結果の返却
        if (modulesWithExclamation.length > 0 || duplicateModules.length > 0 || (containsSystemHook && conflictingDetected.length > 0)) {
            let errorMessage = "エラーが検出されました:\n";

            if (modulesWithExclamation.length > 0) {
                errorMessage += "'!' を含むモジュール: " + modulesWithExclamation.join(", ") + "\n";
            }

            if (duplicateModules.length > 0) {
                errorMessage += "重複している: " + [...new Set(duplicateModules)].join(", ") + "\n";
            }

            if (containsSystemHook && conflictingDetected.length > 0) {
                errorMessage += "環境が矛盾しています: " + conflictingDetected.join(", ");
            }

            alert(errorMessage);
            return 0; // 問題がある場合は 0 を返す
        } else {
            return 1; // 問題がない場合は 1 を返す
        }
    } catch (error) {
        console.error("エラーが発生しました:", error);
        alert("エラーが発生しました。詳細はコンソールをご確認ください。");
        return 0; // エラー発生時は 0 を返す
    }
}


let onePanActive = false;
let oneBillionActive = false;
let invincibleActive = false;
let infiniteSSActive = false;  // 友情無限の状態管理
let infiniteSSUsageActive = false;  // SS無限の状態管理
let gatherActive = false;  // 集合の状態管理
let stageSkipActive = false;
let resultSkipActive = false;
let enemyTurnSkipActive = false;
let gaugeMaxActive = false;  // ゲージ(MAX)の状態管理
let gaugeSpeedActive = false;  // ゲージ(スピード)の状態管理

function toggleOnePan() {
    const onePanElement = document.getElementById('one-pan');
    onePanActive = !onePanActive;
    if(validateModules()){
        if (onePanActive) {
            onePanElement.classList.add('active');
            console.log('50万ダメが有効になりました');
            one_hit();
        } else {
            onePanElement.classList.remove('active');
            console.log('50万ダメが無効になりました');
            one_end();
        }
    }
}

function toggleOneBillion() {
    const oneBillionElement = document.getElementById('one-billion');
    oneBillionActive = !oneBillionActive;

    if(validateModules()){
        if (oneBillionActive) {
            oneBillionElement.classList.add('active');
            console.log('1億ダメが有効になりました');
            one_dame();
        } else {
            oneBillionElement.classList.remove('active');
            console.log('1億ダメが無効になりました');
            oned_end();
        }
    }
}

function toggleInvincible() {
    const invincibleElement = document.getElementById('invincible');
    invincibleActive = !invincibleActive;
    if(validateModules()){
        if (invincibleActive) {
            invincibleElement.classList.add('active');
            console.log('無敵が有効になりました');
            invincible_on();
        } else {
            invincibleElement.classList.remove('active');
            console.log('無敵が無効になりました');
            invincible_off();
        }
    }
}

function toggleInfiniteSS() {
    const infiniteSSElement = document.getElementById('infinite-ss');
    infiniteSSActive = !infiniteSSActive;

    if (infiniteSSActive) {
        infiniteSSElement.classList.add('active');
        console.log('友情無限が有効になりました');
        infinite_ss_on();
    } else {
        infiniteSSElement.classList.remove('active');
        console.log('友情無限が無効になりました');
        infinite_ss_off();
    }
}

function toggleInfiniteSSUsage() {
    const infiniteSSUsageElement = document.getElementById('infinite-ss-usage');
    infiniteSSUsageActive = !infiniteSSUsageActive;

    if (infiniteSSUsageActive) {
        infiniteSSUsageElement.classList.add('active');
        console.log('SS無限が有効になりました');
        infinite_ss_usage_on();
    } else {
        infiniteSSUsageElement.classList.remove('active');
        console.log('SS無限が無効になりました');
        infinite_ss_usage_off();
    }
}

function toggleGather() {
    const gatherElement = document.getElementById('gather');
    gatherActive = !gatherActive;

    if (gatherActive) {
        gatherElement.classList.add('active');
        console.log('集合が有効になりました');
        gather_on();
    } else {
        gatherElement.classList.remove('active');
        console.log('集合が無効になりました');
        gather_off();
    }
}

function toggleEnemyTurnSkip() {
    const enemyTurnSkipElement = document.getElementById('enemy-turn-skip');
    enemyTurnSkipActive = !enemyTurnSkipActive;

    if (enemyTurnSkipActive) {
        enemyTurnSkipElement.classList.add('active');
        console.log('敵ターンスキップが有効になりました');
        enemy_turn_skip_on();
    } else {
        enemyTurnSkipElement.classList.remove('active');
        console.log('敵ターンスキップが無効になりました');
        enemy_turn_skip_off();
    }
}

function toggleStageSkip() {
    const stageSkipElement = document.getElementById('stage-skip');
    stageSkipActive = !stageSkipActive;

    if (stageSkipActive) {
        stageSkipElement.classList.add('active');
        console.log('ステージ飛ばしが有効になりました');
        stage_skip();
    } else {
        stageSkipElement.classList.remove('active');
        console.log('ステージ飛ばしが無効になりました');
        stage_end();
    }
}

function toggleResultSkip() {
    const resultSkipElement = document.getElementById('result-skip');
    resultSkipActive = !resultSkipActive;

    if (resultSkipActive) {
        resultSkipElement.classList.add('active');
        console.log('リザルトスキップが有効になりました');
        result_skip();
    } else {
        resultSkipElement.classList.remove('active');
        console.log('リザルトスキップが無効になりました');
        result_end();
    }
}

function toggleGaugeMax() {
    const gaugeMaxElement = document.getElementById('gauge-max');
    gaugeMaxActive = !gaugeMaxActive;

    if (gaugeMaxActive) {
        gaugeMaxElement.classList.add('active');
        console.log('ゲージ(MAX)が有効になりました');
        gauge_max_on();
    } else {
        gaugeMaxElement.classList.remove('active');
        console.log('ゲージ(MAX)が無効になりました');
        gauge_max_off();
    }
}

function toggleGaugeSpeed() {
    const gaugeSpeedElement = document.getElementById('gauge-speed');
    gaugeSpeedActive = !gaugeSpeedActive;

    if (gaugeSpeedActive) {
        gaugeSpeedElement.classList.add('active');
        console.log('ゲージ(スピード)が有効になりました');
        gauge_speed_on();
    } else {
        gaugeSpeedElement.classList.remove('active');
        console.log('ゲージ(スピード)が無効になりました');
        gauge_speed_off();
    }
}



//binary書き換えの処理
function binary(set_add,set_number){
  h5gg.clearResults()
  h5gg.require(7.8);
  let modules = h5gg.getRangesList("monsterstrike"); //module file name
	let add = document.getElementById(set_add);
	let number = document.getElementById(set_number);
	let value = Number(add.value);
	let value1 = String(number.value);
	let base = modules[0].start; //module base addr in runtime memory
	const addr = Number(base) + value; //offset
	patchBytes(addr, value1); //bytes
}


function monst_main(difference,value){
  h5gg.clearResults()
  h5gg.require(7.8);

  var modules = h5gg.getRangesList("monsterstrike"); //module file name

  var base = modules[0].start; //module base addr in runtime memory

  var addr = Number(base) + Number(difference); //offset

  patchBytes(addr,value); //bytes
}

function patchBytes(addr, hex) {
  for(i = 0;i<hex.length/2;i++) {
    var item = parseInt(hex.substring(i*2, i*2+2), 16);
    h5gg.setValue(addr+i,item, "U8");
  }
}

</script>
</body>
</html>