S Price: $0.877007 (+2.27%)

Contract Diff Checker

Contract Name:
FARPG_QuestSystemV2

Contract Source Code:

File 1 of 1 : FARPG_QuestSystemV2

// File: @openzeppelin/[email protected]/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/[email protected]/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: FINALdeployFA/LIB - Common Structs.sol


pragma solidity ^0.8.9;
        
        
library S { 

//Pet struct
   
    struct Unit {
        uint hp; //unit fainted when hp <= 0
        uint attack; //attack - defense = damage on hp
        uint defense; //attack - defense = damage on hp
        uint speed; //how frequent to take a move
        uint intelligence; //how frequent to use skill
        uint genestrength; //depends on how many duplicates
        uint range; //range skill, id
        uint special; //special skill, id
    }

    struct Status {
        
        uint id; //unit id
        uint family; //determine which class of gear it can be wore. record while evolve, since its only has max 2 family, example Dragon+phantom, and 30gene max, so can use *100
       
        uint stage; //1 is rookie, 2 is mature, 3 is perfect
       
    }


    struct Time {
        uint bond; //how many time you took on this unit , use to evolve
        uint stamina; //how much you can train it per day. it should follow saturation graph
        uint hunger; //how much you feed it per day. it should follow saturation graph
    }


}
// File: FINALdeployFA/LIB - WeatherOutfit.sol


pragma solidity ^0.8.0;


library WO {


    function WeatherBuff (S.Unit[6] memory _UnitGroup, uint _weather) external pure returns (S.Unit[6] memory UnitGroup) {
        UnitGroup = _UnitGroup;
     
        for (uint i = 0; i < UnitGroup.length; i++) {
                if (_weather == 0 && (  UnitGroup[i].special == 3 || 
                                        UnitGroup[i].special == 5 || 
                                        UnitGroup[i].special == 10 || 
                                        UnitGroup[i].special == 23 || 
                                        UnitGroup[i].special == 28 || 
                                        UnitGroup[i].special == 38 || 
                                        UnitGroup[i].special == 39 || 
                                        UnitGroup[i].special == 60 || 
                                        UnitGroup[i].special == 63 || 
                                        UnitGroup[i].special == 69 || 
                                        UnitGroup[i].special == 81 || 
                                        UnitGroup[i].special == 95)) { //Fire
                    UnitGroup[i].attack = UnitGroup[i].attack*2;
                } else if (_weather == 0 && (   UnitGroup[i].special == 20 || 
                                                UnitGroup[i].special == 21 || 
                                                UnitGroup[i].special == 22 || 
                                                UnitGroup[i].special == 24 || 
                                                UnitGroup[i].special == 26 || 
                                                UnitGroup[i].special == 29 || 
                                                UnitGroup[i].special == 30 || 
                                                UnitGroup[i].special == 42 || 
                                                UnitGroup[i].special == 51 || 
                                                UnitGroup[i].special == 72 || 
                                                UnitGroup[i].special == 76 || 
                                                UnitGroup[i].special == 80 || 
                                                UnitGroup[i].special == 86 || 
                                                UnitGroup[i].special == 96)) { //Nature
                    UnitGroup[i].intelligence = UnitGroup[i].intelligence*2;
                } else if (_weather == 2 && (   UnitGroup[i].special == 15 || 
                                                UnitGroup[i].special == 17 || 
                                                UnitGroup[i].special == 31 || 
                                                UnitGroup[i].special == 35 || 
                                                UnitGroup[i].special == 71 || 
                                                UnitGroup[i].special == 75 || 
                                                UnitGroup[i].special == 79 || 
                                                UnitGroup[i].special == 98)) { //Water
                    UnitGroup[i].hp = (UnitGroup[i].hp*15)/10;
                } else if (_weather == 3 && (   UnitGroup[i].special == 2 || 
                                                UnitGroup[i].special == 4 || 
                                                UnitGroup[i].special == 27 || 
                                                UnitGroup[i].special == 55 || 
                                                UnitGroup[i].special == 57 || 
                                                UnitGroup[i].special == 62 || 
                                                UnitGroup[i].special == 73 || 
                                                UnitGroup[i].special == 85 || 
                                                UnitGroup[i].special == 87 || 
                                                UnitGroup[i].special == 97)) { //Electric
                    UnitGroup[i].speed = UnitGroup[i].speed*2;
                } else if (_weather == 4 && (   UnitGroup[i].special == 12 || 
                                                UnitGroup[i].special == 14 || 
                                                UnitGroup[i].special == 16 || 
                                                UnitGroup[i].special == 25 || 
                                                UnitGroup[i].special == 43 || 
                                                UnitGroup[i].special == 46 || 
                                                UnitGroup[i].special == 47 || 
                                                UnitGroup[i].special == 61 || 
                                                UnitGroup[i].special == 64 || 
                                                UnitGroup[i].special == 82)) { //Ice
                    UnitGroup[i].defense = UnitGroup[i].defense*2;
                } else if (_weather == 6 && (   UnitGroup[i].special == 8 || 
                                                UnitGroup[i].special == 9 || 
                                                UnitGroup[i].special == 11 || 
                                                UnitGroup[i].special == 18 || 
                                                UnitGroup[i].special == 32 || 
                                                UnitGroup[i].special == 33 || 
                                                UnitGroup[i].special == 36 || 
                                                UnitGroup[i].special == 44 || 
                                                UnitGroup[i].special == 54 || 
                                                UnitGroup[i].special == 56 || 
                                                UnitGroup[i].special == 58 || 
                                                UnitGroup[i].special == 70 || 
                                                UnitGroup[i].special == 74 || 
                                                UnitGroup[i].special == 78 || 
                                                UnitGroup[i].special == 84 || 
                                                UnitGroup[i].special == 88)) { //Dark
                    UnitGroup[i].hp = UnitGroup[i].hp*2;
                } else if (_weather == 5 && (   UnitGroup[i].special == 6 || 
                                                UnitGroup[i].special == 34 || 
                                                UnitGroup[i].special == 40 || 
                                                UnitGroup[i].special == 48 || 
                                                UnitGroup[i].special == 77 || 
                                                UnitGroup[i].special == 89 || 
                                                UnitGroup[i].special == 99)) { //Light
                    UnitGroup[i].speed = UnitGroup[i].speed*2;
                }
            }

    }

    function TrainersOutfitBonus (S.Unit[6] memory _UnitGroup, uint[5] memory _outfitsID, uint[5] memory _outfitBalance) 
                internal pure returns (S.Unit[6] memory UnitGroup) {
        //_outfit[0~4] is outfit ID for the trainer ID. (what to wear) ID 0 means wearing nothing
        //[0] = Aerobot  [1] = headgear  [2] = Body   [3] = Leggings  [4 = Boots
        UnitGroup = _UnitGroup;
        //convert Outfit balance into Multiplier
        for (uint i=0; i<5; i++) {
            if (_outfitBalance[i] >= 4096) {
                _outfitBalance[i] = 5;
            } else if (_outfitBalance[i] >= 512) {
                _outfitBalance[i] = 4;
            } else if (_outfitBalance[i] >= 64) {
                _outfitBalance[i] = 3;
            } else if (_outfitBalance[i] >= 8) {
                _outfitBalance[i] = 2;
            } else if (_outfitBalance[i] >= 1) {
                _outfitBalance[i] = 1;
            } //otherwise = 0, multiplier =0
        }
        S.Unit memory Bonus;

        //Get Bonus from each outfit
       //==========   AEROBOT ======================
        if (_outfitsID[0] == 3001) { //Bolt (Aerobot) //spd + 6
            Bonus.speed += (6 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3002) { //Pixi (Aerobot) //atk + 6
            Bonus.attack += (6 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3003) { //Finspark (Aerobot) //SPD + 10
            Bonus.speed += (10 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3004) { //Cyanite //ATK + 10
            Bonus.attack += (10 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3005) { //Daemon //all (20, 2, 2, 2, 1)
            Bonus.hp += (20 * _outfitBalance[0]);
            Bonus.attack += (2 * _outfitBalance[0]);
            Bonus.defense += (2 * _outfitBalance[0]);
            Bonus.speed += (2 * _outfitBalance[0]);
            Bonus.intelligence += (1 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3006) { //Skye //Int +4
            Bonus.intelligence += (4 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3007) { //Cocoon //int +3
            Bonus.intelligence += (3 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3008) { //Orbitron //Spd +8
            Bonus.speed += (8 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3009) { //Glide //Atk +8
            Bonus.attack += (8 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3010) { //Bolt Mark II //Def + 8
            Bonus.defense += (8 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3011) { //Lovey //Hp + 80
            Bonus.hp += (80 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3012) { //Zetabot //hp + 60
            Bonus.hp += (60 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3013) { //Roxie //def + 6
            Bonus.defense += (6 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3014) { //Puzzle //INT + 5
            Bonus.intelligence += (5 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3015) { //Aura //all (20, 2, 2, 2, 1)
            Bonus.hp += (20 * _outfitBalance[0]);
            Bonus.attack += (2 * _outfitBalance[0]);
            Bonus.defense += (2 * _outfitBalance[0]);
            Bonus.speed += (2 * _outfitBalance[0]);
            Bonus.intelligence += (1 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3016) { //Goldon //DEF + 10
            Bonus.defense += (10 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3017) { //Meteoron //HP + 100
            Bonus.hp += (100 * _outfitBalance[0]);
        }

       //==========   Headgear ======================
        if (_outfitsID[1] == 6001) { //headgear 1 //hp+50
            Bonus.hp += (50 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6002) { //headgear 2 //atk+3
            Bonus.attack += (3 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6003) { //headgear 3 //def+3
            Bonus.defense += (3 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6004) { //headgear 4 //spd+3
            Bonus.speed += (3 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6005) { //headgear 5 //int+1
            Bonus.intelligence += (1 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6006) { //headgear 6 //hp+60
            Bonus.hp += (60 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6007) { //headgear 7 //atk+6
            Bonus.attack += (6 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6008) { //headgear 8 //def+6
            Bonus.defense += (6 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6009) { //headgear 9 //spd+6
            Bonus.speed += (6 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6010) { //headgear 10 //int+3
            Bonus.intelligence += (3 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6011) { //headgear 11 //hp+80
            Bonus.hp += (80 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6012) { //headgear 12 //atk+8
            Bonus.attack += (8 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6013) { //headgear 13 //def+8
            Bonus.defense += (8 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6014) { //headgear 14 //spd+8
            Bonus.speed += (8 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6015) { //headgear 15 //int+4
            Bonus.intelligence += (4 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6016) { //headgear 16 //hp+100
            Bonus.hp += (100 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6017) { //headgear 17 //atk+10
            Bonus.attack += (10 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6018) { //headgear 18 //def+10
            Bonus.defense += (10 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6019) { //headgear 19 //spd+10
            Bonus.speed += (10 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6020) { //headgear 20 //int+5
            Bonus.intelligence += (5 * _outfitBalance[1]);
        }
        
        //==========   Body ======================
        if (_outfitsID[2] == 1001) { //Scholar (Body) //hp 50
            Bonus.hp += (50 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1002) { //Scholar (Body) //atk 3
            Bonus.attack += (3 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1003) { //Scholar (Body) //def 3
            Bonus.defense += (3 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1004) { //Scholar (Body) //spd 3
            Bonus.speed += (3 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1005) { //Scholar (Body) //int 1
            Bonus.intelligence += (1 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1006 || _outfitsID[2] == 1007) { //Scholar (Body) //all (10,1,1,1,1)
            Bonus.hp += (10 * _outfitBalance[2]);
            Bonus.attack += (1 * _outfitBalance[2]);
            Bonus.defense += (1 * _outfitBalance[2]);
            Bonus.speed += (1 * _outfitBalance[2]);
            Bonus.intelligence += (1 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1022) { //Love Embrace (Body) //hp 60
            Bonus.hp += (60 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1023) { //Love Embrace (Body) //atk 6
            Bonus.attack += (6 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1024) { //Love Embrace (Body) //def 6
            Bonus.defense += (6 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1025) { //Love Embrace (Body) //spd 6
            Bonus.speed += (6 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1026) { //Love Embrace (Body) //int 3
            Bonus.intelligence += (3 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1027 || _outfitsID[2] == 1028) { //Love Embrace (Body) //all (12,2,1,1,1)
            Bonus.hp += (12 * _outfitBalance[2]);
            Bonus.attack += (2 * _outfitBalance[2]);
            Bonus.defense += (1 * _outfitBalance[2]);
            Bonus.speed += (1 * _outfitBalance[2]);
            Bonus.intelligence += (1 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1043) { //Celestial Harmony (Body) //hp 80
            Bonus.hp += (80 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1044) { //Celestial Harmony (Body) //atk 8
            Bonus.attack += (8 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1045) { //Celestial Harmony (Body) //def 8
            Bonus.defense += (8 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1046) { //Celestial Harmony (Body) //spd 8
            Bonus.speed += (8 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1047) { //Celestial Harmony (Body) //int 4
            Bonus.intelligence += (4 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1048 || _outfitsID[2] == 1049) { //Celestial Harmony (Body) //all (16,2,2,1,1)
            Bonus.hp += (16 * _outfitBalance[2]);
            Bonus.attack += (2 * _outfitBalance[2]);
            Bonus.defense += (2 * _outfitBalance[2]);
            Bonus.speed += (1 * _outfitBalance[2]);
            Bonus.intelligence += (1 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1064) { //Cyber Strike (Body) //hp 80
            Bonus.hp += (80 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1065) { //Cyber Strike (Body) //atk 8
            Bonus.attack += (8 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1066) { //Cyber Strike (Body) //def 8
            Bonus.defense += (8 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1067) { //Cyber Strike (Body) //spd 8
            Bonus.speed += (8 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1068) { //Cyber Strike (Body) //int 4
            Bonus.intelligence += (4 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1069 || _outfitsID[2] == 1070) { //Cyber Strike (Body) //all (16,2,2,1,1)
            Bonus.hp += (16 * _outfitBalance[2]);
            Bonus.attack += (2 * _outfitBalance[2]);
            Bonus.defense += (2 * _outfitBalance[2]);
            Bonus.speed += (1 * _outfitBalance[2]);
            Bonus.intelligence += (1 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1085) { //Serpent Tribe (Body) //hp 50
            Bonus.hp += (50 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1086) { //Serpent Tribe (Body) //atk 3
            Bonus.attack += (3 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1087) { //Serpent Tribe (Body) //def 3
            Bonus.defense += (3 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1088) { //Serpent Tribe (Body) //spd 3
            Bonus.speed += (3 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1089) { //Serpent Tribe (Body) //int 1
            Bonus.intelligence += (1 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1090 || _outfitsID[2] == 1091) { //Serpent Tribe (Body) //all (10,1,1,1,1)
            Bonus.hp += (10 * _outfitBalance[2]);
            Bonus.attack += (1 * _outfitBalance[2]);
            Bonus.defense += (1 * _outfitBalance[2]);
            Bonus.speed += (1 * _outfitBalance[2]);
            Bonus.intelligence += (1 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1106) { //Pearl Empress (Body) //hp 60
            Bonus.hp += (60 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1107) { //Pearl Empress (Body) //atk 6
            Bonus.attack += (6 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1108) { //Pearl Empress (Body) //def 6
            Bonus.defense += (6 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1109) { //Pearl Empress (Body) //spd 6
            Bonus.speed += (6 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1110) { //Pearl Empress (Body) //int 3
            Bonus.intelligence += (3 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1111 || _outfitsID[2] == 1112) { //Pearl Empress (Body) //all (12,2,1,1,1)
            Bonus.hp += (12 * _outfitBalance[2]);
            Bonus.attack += (2 * _outfitBalance[2]);
            Bonus.defense += (1 * _outfitBalance[2]);
            Bonus.speed += (1 * _outfitBalance[2]);
            Bonus.intelligence += (1 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1127) { //Starlight Diva (Body) //hp 100
            Bonus.hp += (100 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1128) { //Starlight Diva (Body) //atk 10
            Bonus.attack += (10 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1129) { //Starlight Diva (Body) //def 10
            Bonus.defense += (10 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1130) { //Starlight Diva (Body) //spd 10
            Bonus.speed += (10 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1131) { //Starlight Diva (Body) //int 5
            Bonus.intelligence += (5 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1132 || _outfitsID[2] == 1133) { //Starlight Diva (Body) //all (20,2,2,2,1)
            Bonus.hp += (20 * _outfitBalance[2]);
            Bonus.attack += (2 * _outfitBalance[2]);
            Bonus.defense += (2 * _outfitBalance[2]);
            Bonus.speed += (2 * _outfitBalance[2]);
            Bonus.intelligence += (1 * _outfitBalance[2]);
        }
        
        //========== Leggings======================
        if (_outfitsID[3] == 1008) { //Scholar (Leggings) //hp 50
            Bonus.hp += (50 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1009) { //Scholar (Leggings) //atk 3
            Bonus.attack += (3 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1010) { //Scholar (Leggings) //def 3
            Bonus.defense += (3 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1011) { //Scholar (Leggings) //spd 3
            Bonus.speed += (3 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1012) { //Scholar (Leggings) //int 1
            Bonus.intelligence += (1 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1013 || _outfitsID[3] == 1014) { //Scholar (Leggings) //all (10,1,1,1,1)
            Bonus.hp += (10 * _outfitBalance[3]);
            Bonus.attack += (1 * _outfitBalance[3]);
            Bonus.defense += (1 * _outfitBalance[3]);
            Bonus.speed += (1 * _outfitBalance[3]);
            Bonus.intelligence += (1 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1029) { //Love Embrace (Leggings) //hp 60
            Bonus.hp += (60 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1030) { //Love Embrace (Leggings) //atk 6
            Bonus.attack += (6 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1031) { //Love Embrace (Leggings) //def 6
            Bonus.defense += (6 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1032) { //Love Embrace (Leggings) //spd 6
            Bonus.speed += (6 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1033) { //Love Embrace (Leggings) //int 3
            Bonus.intelligence += (3 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1034 || _outfitsID[3] == 1035) { //Love Embrace (Leggings) //all (12,2,1,1,1)
            Bonus.hp += (12 * _outfitBalance[3]);
            Bonus.attack += (2 * _outfitBalance[3]);
            Bonus.defense += (1 * _outfitBalance[3]);
            Bonus.speed += (1 * _outfitBalance[3]);
            Bonus.intelligence += (1 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1050) { //Celestial Harmony (Leggings) //hp 80
            Bonus.hp += (80 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1051) { //Celestial Harmony (Leggings) //atk 8
            Bonus.attack += (8 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1052) { //Celestial Harmony (Leggings) //def 8
            Bonus.defense += (8 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1053) { //Celestial Harmony (Leggings) //spd 8
            Bonus.speed += (8 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1054) { //Celestial Harmony (Leggings) //int 4
            Bonus.intelligence += (4 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1055 || _outfitsID[3] == 1056) { //Celestial Harmony (Leggings) //all (16,2,2,1,1)
            Bonus.hp += (16 * _outfitBalance[3]);
            Bonus.attack += (2 * _outfitBalance[3]);
            Bonus.defense += (2 * _outfitBalance[3]);
            Bonus.speed += (1 * _outfitBalance[3]);
            Bonus.intelligence += (1 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1071) { //Cyber Strike (Leggings) //hp 80
            Bonus.hp += (80 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1072) { //Cyber Strike (Leggings) //atk 8
            Bonus.attack += (8 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1073) { //Cyber Strike (Leggings) //def 8
            Bonus.defense += (8 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1074) { //Cyber Strike (Leggings) //spd 8
            Bonus.speed += (8 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1075) { //Cyber Strike (Leggings) //int 4
            Bonus.intelligence += (4 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1076 || _outfitsID[3] == 1077) { //Cyber Strike (Leggings) //all (16,2,2,1,1)
            Bonus.hp += (16 * _outfitBalance[3]);
            Bonus.attack += (2 * _outfitBalance[3]);
            Bonus.defense += (2 * _outfitBalance[3]);
            Bonus.speed += (1 * _outfitBalance[3]);
            Bonus.intelligence += (1 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1092) { //Serpent Tribe (Leggings) //hp 50
            Bonus.hp += (50 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1093) { //Serpent Tribe (Leggings) //atk 3
            Bonus.attack += (3 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1094) { //Serpent Tribe (Leggings) //def 3
            Bonus.defense += (3 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1095) { //Serpent Tribe (Leggings) //spd 3
            Bonus.speed += (3 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1096) { //Serpent Tribe (Leggings) //int 1
            Bonus.intelligence += (1 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1097 || _outfitsID[3] == 1098) { //Serpent Tribe (Leggings) //all (10,1,1,1,1)
            Bonus.hp += (10 * _outfitBalance[3]);
            Bonus.attack += (1 * _outfitBalance[3]);
            Bonus.defense += (1 * _outfitBalance[3]);
            Bonus.speed += (1 * _outfitBalance[3]);
            Bonus.intelligence += (1 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1113) { //Pearl Empress (Leggings) //hp 60
            Bonus.hp += (60 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1114) { //Pearl Empress (Leggings) //atk 6
            Bonus.attack += (6 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1115) { //Pearl Empress (Leggings) //def 6
            Bonus.defense += (6 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1116) { //Pearl Empress (Leggings) //spd 6
            Bonus.speed += (6 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1117) { //Pearl Empress (Leggings) //int 3
            Bonus.intelligence += (3 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1118 || _outfitsID[3] == 1119) { //Pearl Empress (Leggings) //all (12,2,1,1,1)
            Bonus.hp += (12 * _outfitBalance[3]);
            Bonus.attack += (2 * _outfitBalance[3]);
            Bonus.defense += (1 * _outfitBalance[3]);
            Bonus.speed += (1 * _outfitBalance[3]);
            Bonus.intelligence += (1 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1134) { //Starlight Diva (Leggings) //hp 100
            Bonus.hp += (100 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1135) { //Starlight Diva (Leggings) //atk 10
            Bonus.attack += (10 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1136) { //Starlight Diva (Leggings) //def 10
            Bonus.defense += (10 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1137) { //Starlight Diva (Leggings) //spd 10
            Bonus.speed += (10 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1138) { //Starlight Diva (Leggings) //int 5
            Bonus.intelligence += (5 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1139 || _outfitsID[3] == 1140) { //Starlight Diva (Leggings) //all (20,2,2,2,1)
            Bonus.hp += (20 * _outfitBalance[3]);
            Bonus.attack += (2 * _outfitBalance[3]);
            Bonus.defense += (2 * _outfitBalance[3]);
            Bonus.speed += (2 * _outfitBalance[3]);
            Bonus.intelligence += (1 * _outfitBalance[3]);
        }

        //========== Boots======================
        if (_outfitsID[4] == 1015) { //Scholar (Boots) //hp 50
            Bonus.hp += (50 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1016) { //Scholar (Boots) //atk 3
            Bonus.attack += (3 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1017) { //Scholar (Boots) //def 3
            Bonus.defense += (3 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1018) { //Scholar (Boots) //spd 3
            Bonus.speed += (3 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1019) { //Scholar (Boots) //int 1
            Bonus.intelligence += (1 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1020 || _outfitsID[4] == 1021) { //Scholar (Boots) //all (10,1,1,1,1)
            Bonus.hp += (10 * _outfitBalance[4]);
            Bonus.attack += (1 * _outfitBalance[4]);
            Bonus.defense += (1 * _outfitBalance[4]);
            Bonus.speed += (1 * _outfitBalance[4]);
            Bonus.intelligence += (1 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1036) { //Love Embrace (Boots) //hp 60
            Bonus.hp += (60 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1037) { //Love Embrace (Boots) //atk 6
            Bonus.attack += (6 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1038) { //Love Embrace (Boots) //def 6
            Bonus.defense += (6 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1039) { //Love Embrace (Boots) //spd 6
            Bonus.speed += (6 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1040) { //Love Embrace (Boots) //int 3
            Bonus.intelligence += (3 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1041 || _outfitsID[4] == 1042) { //Love Embrace (Boots) //all (12,2,1,1,1)
            Bonus.hp += (12 * _outfitBalance[4]);
            Bonus.attack += (2 * _outfitBalance[4]);
            Bonus.defense += (1 * _outfitBalance[4]);
            Bonus.speed += (1 * _outfitBalance[4]);
            Bonus.intelligence += (1 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1057) { //Celestial Harmony (Boots) //hp 80
            Bonus.hp += (80 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1058) { //Celestial Harmony (Boots) //atk 8
            Bonus.attack += (8 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1059) { //Celestial Harmony (Boots) //def 8
            Bonus.defense += (8 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1060) { //Celestial Harmony (Boots) //spd 8
            Bonus.speed += (8 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1061) { //Celestial Harmony (Boots) //int 4
            Bonus.intelligence += (4 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1062 || _outfitsID[4] == 1063) { //Celestial Harmony (Boots) //all (16,2,2,1,1)
            Bonus.hp += (16 * _outfitBalance[4]);
            Bonus.attack += (2 * _outfitBalance[4]);
            Bonus.defense += (2 * _outfitBalance[4]);
            Bonus.speed += (1 * _outfitBalance[4]);
            Bonus.intelligence += (1 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1078) { //Cyber Strike (Boots) //hp 80
            Bonus.hp += (80 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1079) { //Cyber Strike (Boots) //atk 8
            Bonus.attack += (8 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1080) { //Cyber Strike (Boots) //def 8
            Bonus.defense += (8 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1081) { //Cyber Strike (Boots) //spd 8
            Bonus.speed += (8 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1082) { //Cyber Strike (Boots) //int 4
            Bonus.intelligence += (4 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1083 || _outfitsID[4] == 1084) { //Cyber Strike (Boots) //all (16,2,2,1,1)
            Bonus.hp += (16 * _outfitBalance[4]);
            Bonus.attack += (2 * _outfitBalance[4]);
            Bonus.defense += (2 * _outfitBalance[4]);
            Bonus.speed += (1 * _outfitBalance[4]);
            Bonus.intelligence += (1 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1099) { //Serpent Tribe (Boots) //hp 50
            Bonus.hp += (50 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1100) { //Serpent Tribe (Boots) //atk 3
            Bonus.attack += (3 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1101) { //Serpent Tribe (Boots) //def 3
            Bonus.defense += (3 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1102) { //Serpent Tribe (Boots) //spd 3
            Bonus.speed += (3 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1103) { //Serpent Tribe (Boots) //int 1
            Bonus.intelligence += (1 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1104 || _outfitsID[4] == 1105) { //Serpent Tribe (Boots) //all (10,1,1,1,1)
            Bonus.hp += (10 * _outfitBalance[4]);
            Bonus.attack += (1 * _outfitBalance[4]);
            Bonus.defense += (1 * _outfitBalance[4]);
            Bonus.speed += (1 * _outfitBalance[4]);
            Bonus.intelligence += (1 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1120) { //Pearl Empress (Boots) //hp 60
            Bonus.hp += (60 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1121) { //Pearl Empress (Boots) //atk 6
            Bonus.attack += (6 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1122) { //Pearl Empress (Boots) //def 6
            Bonus.defense += (6 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1123) { //Pearl Empress (Boots) //spd 6
            Bonus.speed += (6 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1124) { //Pearl Empress (Boots) //int 3
            Bonus.intelligence += (3 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1125 || _outfitsID[4] == 1126) { //Pearl Empress (Boots) //all (12,2,1,1,1)
            Bonus.hp += (12 * _outfitBalance[4]);
            Bonus.attack += (2 * _outfitBalance[4]);
            Bonus.defense += (1 * _outfitBalance[4]);
            Bonus.speed += (1 * _outfitBalance[4]);
            Bonus.intelligence += (1 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1141) { //Starlight Diva (Boots) //hp 100
            Bonus.hp += (100 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1142) { //Starlight Diva (Boots) //atk 10
            Bonus.attack += (10 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1143) { //Starlight Diva (Boots) //def 10
            Bonus.defense += (10 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1144) { //Starlight Diva (Boots) //spd 10
            Bonus.speed += (10 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1145) { //Starlight Diva (Boots) //int 5
            Bonus.intelligence += (5 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1146 || _outfitsID[4] == 1147) { //Starlight Diva (Boots) //all (20,2,2,2,1)
            Bonus.hp += (20 * _outfitBalance[4]);
            Bonus.attack += (2 * _outfitBalance[4]);
            Bonus.defense += (2 * _outfitBalance[4]);
            Bonus.speed += (2 * _outfitBalance[4]);
            Bonus.intelligence += (1 * _outfitBalance[4]);
        }

        for (uint i=0; i<3; i++) {
            if (UnitGroup[i].hp >0 ) { //not empty slot
                UnitGroup[i].hp = _UnitGroup[i].hp += Bonus.hp;
                UnitGroup[i].attack = _UnitGroup[i].attack += Bonus.attack;
                UnitGroup[i].defense = _UnitGroup[i].defense += Bonus.defense;
                UnitGroup[i].speed = _UnitGroup[i].speed += Bonus.speed;
                UnitGroup[i].intelligence = _UnitGroup[i].intelligence += Bonus.intelligence;
            }
           
        }

    }


    
    function readOutfitBonus (uint[5] memory _outfitsID, uint[5] memory _outfitBalance) 
                internal pure returns (S.Unit memory Bonus) {
       
        for (uint i=0; i<5; i++) {
            if (_outfitBalance[i] >= 4096) {
                _outfitBalance[i] = 5;
            } else if (_outfitBalance[i] >= 512) {
                _outfitBalance[i] = 4;
            } else if (_outfitBalance[i] >= 64) {
                _outfitBalance[i] = 3;
            } else if (_outfitBalance[i] >= 8) {
                _outfitBalance[i] = 2;
            } else if (_outfitBalance[i] >= 1) {
                _outfitBalance[i] = 1;
            } //otherwise = 0, multiplier =0
        }

        //Get Bonus from each outfit
       //==========   AEROBOT ======================
        if (_outfitsID[0] == 3001) { //Bolt (Aerobot) //spd + 6
            Bonus.speed += (6 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3002) { //Pixi (Aerobot) //atk + 6
            Bonus.attack += (6 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3003) { //Finspark (Aerobot) //SPD + 10
            Bonus.speed += (10 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3004) { //Cyanite //ATK + 10
            Bonus.attack += (10 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3005) { //Daemon //all (20, 2, 2, 2, 1)
            Bonus.hp += (20 * _outfitBalance[0]);
            Bonus.attack += (2 * _outfitBalance[0]);
            Bonus.defense += (2 * _outfitBalance[0]);
            Bonus.speed += (2 * _outfitBalance[0]);
            Bonus.intelligence += (1 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3006) { //Skye //Int +4
            Bonus.intelligence += (4 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3007) { //Cocoon //int +3
            Bonus.intelligence += (3 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3008) { //Orbitron //Spd +8
            Bonus.speed += (8 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3009) { //Glide //Atk +8
            Bonus.attack += (8 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3010) { //Bolt Mark II //Def + 8
            Bonus.defense += (8 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3011) { //Lovey //Hp + 80
            Bonus.hp += (80 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3012) { //Zetabot //hp + 60
            Bonus.hp += (60 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3013) { //Roxie //def + 6
            Bonus.defense += (6 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3014) { //Puzzle //INT + 5
            Bonus.intelligence += (5 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3015) { //Aura //all (20, 2, 2, 2, 1)
            Bonus.hp += (20 * _outfitBalance[0]);
            Bonus.attack += (2 * _outfitBalance[0]);
            Bonus.defense += (2 * _outfitBalance[0]);
            Bonus.speed += (2 * _outfitBalance[0]);
            Bonus.intelligence += (1 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3016) { //Goldon //DEF + 10
            Bonus.defense += (10 * _outfitBalance[0]);
        } else if (_outfitsID[0] == 3017) { //Meteoron //HP + 100
            Bonus.hp += (100 * _outfitBalance[0]);
        }

       //==========   Headgear ======================
        if (_outfitsID[1] == 6001) { //headgear 1 //hp+50
            Bonus.hp += (50 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6002) { //headgear 2 //atk+3
            Bonus.attack += (3 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6003) { //headgear 3 //def+3
            Bonus.defense += (3 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6004) { //headgear 4 //spd+3
            Bonus.speed += (3 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6005) { //headgear 5 //int+1
            Bonus.intelligence += (1 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6006) { //headgear 6 //hp+60
            Bonus.hp += (60 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6007) { //headgear 7 //atk+6
            Bonus.attack += (6 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6008) { //headgear 8 //def+6
            Bonus.defense += (6 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6009) { //headgear 9 //spd+6
            Bonus.speed += (6 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6010) { //headgear 10 //int+3
            Bonus.intelligence += (3 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6011) { //headgear 11 //hp+80
            Bonus.hp += (80 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6012) { //headgear 12 //atk+8
            Bonus.attack += (8 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6013) { //headgear 13 //def+8
            Bonus.defense += (8 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6014) { //headgear 14 //spd+8
            Bonus.speed += (8 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6015) { //headgear 15 //int+4
            Bonus.intelligence += (4 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6016) { //headgear 16 //hp+100
            Bonus.hp += (100 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6017) { //headgear 17 //atk+10
            Bonus.attack += (10 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6018) { //headgear 18 //def+10
            Bonus.defense += (10 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6019) { //headgear 19 //spd+10
            Bonus.speed += (10 * _outfitBalance[1]);
        } else if (_outfitsID[1] == 6020) { //headgear 20 //int+5
            Bonus.intelligence += (5 * _outfitBalance[1]);
        }
        
        //==========   Body ======================
        if (_outfitsID[2] == 1001) { //Scholar (Body) //hp 50
            Bonus.hp += (50 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1002) { //Scholar (Body) //atk 3
            Bonus.attack += (3 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1003) { //Scholar (Body) //def 3
            Bonus.defense += (3 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1004) { //Scholar (Body) //spd 3
            Bonus.speed += (3 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1005) { //Scholar (Body) //int 1
            Bonus.intelligence += (1 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1006 || _outfitsID[2] == 1007) { //Scholar (Body) //all (10,1,1,1,1)
            Bonus.hp += (10 * _outfitBalance[2]);
            Bonus.attack += (1 * _outfitBalance[2]);
            Bonus.defense += (1 * _outfitBalance[2]);
            Bonus.speed += (1 * _outfitBalance[2]);
            Bonus.intelligence += (1 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1022) { //Love Embrace (Body) //hp 60
            Bonus.hp += (60 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1023) { //Love Embrace (Body) //atk 6
            Bonus.attack += (6 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1024) { //Love Embrace (Body) //def 6
            Bonus.defense += (6 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1025) { //Love Embrace (Body) //spd 6
            Bonus.speed += (6 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1026) { //Love Embrace (Body) //int 3
            Bonus.intelligence += (3 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1027 || _outfitsID[2] == 1028) { //Love Embrace (Body) //all (12,2,1,1,1)
            Bonus.hp += (12 * _outfitBalance[2]);
            Bonus.attack += (2 * _outfitBalance[2]);
            Bonus.defense += (1 * _outfitBalance[2]);
            Bonus.speed += (1 * _outfitBalance[2]);
            Bonus.intelligence += (1 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1043) { //Celestial Harmony (Body) //hp 80
            Bonus.hp += (80 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1044) { //Celestial Harmony (Body) //atk 8
            Bonus.attack += (8 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1045) { //Celestial Harmony (Body) //def 8
            Bonus.defense += (8 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1046) { //Celestial Harmony (Body) //spd 8
            Bonus.speed += (8 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1047) { //Celestial Harmony (Body) //int 4
            Bonus.intelligence += (4 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1048 || _outfitsID[2] == 1049) { //Celestial Harmony (Body) //all (16,2,2,1,1)
            Bonus.hp += (16 * _outfitBalance[2]);
            Bonus.attack += (2 * _outfitBalance[2]);
            Bonus.defense += (2 * _outfitBalance[2]);
            Bonus.speed += (1 * _outfitBalance[2]);
            Bonus.intelligence += (1 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1064) { //Cyber Strike (Body) //hp 80
            Bonus.hp += (80 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1065) { //Cyber Strike (Body) //atk 8
            Bonus.attack += (8 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1066) { //Cyber Strike (Body) //def 8
            Bonus.defense += (8 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1067) { //Cyber Strike (Body) //spd 8
            Bonus.speed += (8 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1068) { //Cyber Strike (Body) //int 4
            Bonus.intelligence += (4 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1069 || _outfitsID[2] == 1070) { //Cyber Strike (Body) //all (16,2,2,1,1)
            Bonus.hp += (16 * _outfitBalance[2]);
            Bonus.attack += (2 * _outfitBalance[2]);
            Bonus.defense += (2 * _outfitBalance[2]);
            Bonus.speed += (1 * _outfitBalance[2]);
            Bonus.intelligence += (1 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1085) { //Serpent Tribe (Body) //hp 50
            Bonus.hp += (50 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1086) { //Serpent Tribe (Body) //atk 3
            Bonus.attack += (3 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1087) { //Serpent Tribe (Body) //def 3
            Bonus.defense += (3 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1088) { //Serpent Tribe (Body) //spd 3
            Bonus.speed += (3 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1089) { //Serpent Tribe (Body) //int 1
            Bonus.intelligence += (1 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1090 || _outfitsID[2] == 1091) { //Serpent Tribe (Body) //all (10,1,1,1,1)
            Bonus.hp += (10 * _outfitBalance[2]);
            Bonus.attack += (1 * _outfitBalance[2]);
            Bonus.defense += (1 * _outfitBalance[2]);
            Bonus.speed += (1 * _outfitBalance[2]);
            Bonus.intelligence += (1 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1106) { //Pearl Empress (Body) //hp 60
            Bonus.hp += (60 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1107) { //Pearl Empress (Body) //atk 6
            Bonus.attack += (6 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1108) { //Pearl Empress (Body) //def 6
            Bonus.defense += (6 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1109) { //Pearl Empress (Body) //spd 6
            Bonus.speed += (6 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1110) { //Pearl Empress (Body) //int 3
            Bonus.intelligence += (3 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1111 || _outfitsID[2] == 1112) { //Pearl Empress (Body) //all (12,2,1,1,1)
            Bonus.hp += (12 * _outfitBalance[2]);
            Bonus.attack += (2 * _outfitBalance[2]);
            Bonus.defense += (1 * _outfitBalance[2]);
            Bonus.speed += (1 * _outfitBalance[2]);
            Bonus.intelligence += (1 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1127) { //Starlight Diva (Body) //hp 100
            Bonus.hp += (100 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1128) { //Starlight Diva (Body) //atk 10
            Bonus.attack += (10 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1129) { //Starlight Diva (Body) //def 10
            Bonus.defense += (10 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1130) { //Starlight Diva (Body) //spd 10
            Bonus.speed += (10 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1131) { //Starlight Diva (Body) //int 5
            Bonus.intelligence += (5 * _outfitBalance[2]);
        } else if (_outfitsID[2] == 1132 || _outfitsID[2] == 1133) { //Starlight Diva (Body) //all (20,2,2,2,1)
            Bonus.hp += (20 * _outfitBalance[2]);
            Bonus.attack += (2 * _outfitBalance[2]);
            Bonus.defense += (2 * _outfitBalance[2]);
            Bonus.speed += (2 * _outfitBalance[2]);
            Bonus.intelligence += (1 * _outfitBalance[2]);
        }
        
        //========== Leggings======================
        if (_outfitsID[3] == 1008) { //Scholar (Leggings) //hp 50
            Bonus.hp += (50 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1009) { //Scholar (Leggings) //atk 3
            Bonus.attack += (3 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1010) { //Scholar (Leggings) //def 3
            Bonus.defense += (3 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1011) { //Scholar (Leggings) //spd 3
            Bonus.speed += (3 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1012) { //Scholar (Leggings) //int 1
            Bonus.intelligence += (1 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1013 || _outfitsID[3] == 1014) { //Scholar (Leggings) //all (10,1,1,1,1)
            Bonus.hp += (10 * _outfitBalance[3]);
            Bonus.attack += (1 * _outfitBalance[3]);
            Bonus.defense += (1 * _outfitBalance[3]);
            Bonus.speed += (1 * _outfitBalance[3]);
            Bonus.intelligence += (1 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1029) { //Love Embrace (Leggings) //hp 60
            Bonus.hp += (60 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1030) { //Love Embrace (Leggings) //atk 6
            Bonus.attack += (6 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1031) { //Love Embrace (Leggings) //def 6
            Bonus.defense += (6 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1032) { //Love Embrace (Leggings) //spd 6
            Bonus.speed += (6 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1033) { //Love Embrace (Leggings) //int 3
            Bonus.intelligence += (3 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1034 || _outfitsID[3] == 1035) { //Love Embrace (Leggings) //all (12,2,1,1,1)
            Bonus.hp += (12 * _outfitBalance[3]);
            Bonus.attack += (2 * _outfitBalance[3]);
            Bonus.defense += (1 * _outfitBalance[3]);
            Bonus.speed += (1 * _outfitBalance[3]);
            Bonus.intelligence += (1 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1050) { //Celestial Harmony (Leggings) //hp 80
            Bonus.hp += (80 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1051) { //Celestial Harmony (Leggings) //atk 8
            Bonus.attack += (8 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1052) { //Celestial Harmony (Leggings) //def 8
            Bonus.defense += (8 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1053) { //Celestial Harmony (Leggings) //spd 8
            Bonus.speed += (8 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1054) { //Celestial Harmony (Leggings) //int 4
            Bonus.intelligence += (4 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1055 || _outfitsID[3] == 1056) { //Celestial Harmony (Leggings) //all (16,2,2,1,1)
            Bonus.hp += (16 * _outfitBalance[3]);
            Bonus.attack += (2 * _outfitBalance[3]);
            Bonus.defense += (2 * _outfitBalance[3]);
            Bonus.speed += (1 * _outfitBalance[3]);
            Bonus.intelligence += (1 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1071) { //Cyber Strike (Leggings) //hp 80
            Bonus.hp += (80 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1072) { //Cyber Strike (Leggings) //atk 8
            Bonus.attack += (8 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1073) { //Cyber Strike (Leggings) //def 8
            Bonus.defense += (8 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1074) { //Cyber Strike (Leggings) //spd 8
            Bonus.speed += (8 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1075) { //Cyber Strike (Leggings) //int 4
            Bonus.intelligence += (4 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1076 || _outfitsID[3] == 1077) { //Cyber Strike (Leggings) //all (16,2,2,1,1)
            Bonus.hp += (16 * _outfitBalance[3]);
            Bonus.attack += (2 * _outfitBalance[3]);
            Bonus.defense += (2 * _outfitBalance[3]);
            Bonus.speed += (1 * _outfitBalance[3]);
            Bonus.intelligence += (1 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1092) { //Serpent Tribe (Leggings) //hp 50
            Bonus.hp += (50 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1093) { //Serpent Tribe (Leggings) //atk 3
            Bonus.attack += (3 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1094) { //Serpent Tribe (Leggings) //def 3
            Bonus.defense += (3 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1095) { //Serpent Tribe (Leggings) //spd 3
            Bonus.speed += (3 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1096) { //Serpent Tribe (Leggings) //int 1
            Bonus.intelligence += (1 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1097 || _outfitsID[3] == 1098) { //Serpent Tribe (Leggings) //all (10,1,1,1,1)
            Bonus.hp += (10 * _outfitBalance[3]);
            Bonus.attack += (1 * _outfitBalance[3]);
            Bonus.defense += (1 * _outfitBalance[3]);
            Bonus.speed += (1 * _outfitBalance[3]);
            Bonus.intelligence += (1 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1113) { //Pearl Empress (Leggings) //hp 60
            Bonus.hp += (60 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1114) { //Pearl Empress (Leggings) //atk 6
            Bonus.attack += (6 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1115) { //Pearl Empress (Leggings) //def 6
            Bonus.defense += (6 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1116) { //Pearl Empress (Leggings) //spd 6
            Bonus.speed += (6 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1117) { //Pearl Empress (Leggings) //int 3
            Bonus.intelligence += (3 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1118 || _outfitsID[3] == 1119) { //Pearl Empress (Leggings) //all (12,2,1,1,1)
            Bonus.hp += (12 * _outfitBalance[3]);
            Bonus.attack += (2 * _outfitBalance[3]);
            Bonus.defense += (1 * _outfitBalance[3]);
            Bonus.speed += (1 * _outfitBalance[3]);
            Bonus.intelligence += (1 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1134) { //Starlight Diva (Leggings) //hp 100
            Bonus.hp += (100 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1135) { //Starlight Diva (Leggings) //atk 10
            Bonus.attack += (10 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1136) { //Starlight Diva (Leggings) //def 10
            Bonus.defense += (10 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1137) { //Starlight Diva (Leggings) //spd 10
            Bonus.speed += (10 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1138) { //Starlight Diva (Leggings) //int 5
            Bonus.intelligence += (5 * _outfitBalance[3]);
        } else if (_outfitsID[3] == 1139 || _outfitsID[3] == 1140) { //Starlight Diva (Leggings) //all (20,2,2,2,1)
            Bonus.hp += (20 * _outfitBalance[3]);
            Bonus.attack += (2 * _outfitBalance[3]);
            Bonus.defense += (2 * _outfitBalance[3]);
            Bonus.speed += (2 * _outfitBalance[3]);
            Bonus.intelligence += (1 * _outfitBalance[3]);
        }

        //========== Boots======================
        if (_outfitsID[4] == 1015) { //Scholar (Boots) //hp 50
            Bonus.hp += (50 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1016) { //Scholar (Boots) //atk 3
            Bonus.attack += (3 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1017) { //Scholar (Boots) //def 3
            Bonus.defense += (3 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1018) { //Scholar (Boots) //spd 3
            Bonus.speed += (3 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1019) { //Scholar (Boots) //int 1
            Bonus.intelligence += (1 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1020 || _outfitsID[4] == 1021) { //Scholar (Boots) //all (10,1,1,1,1)
            Bonus.hp += (10 * _outfitBalance[4]);
            Bonus.attack += (1 * _outfitBalance[4]);
            Bonus.defense += (1 * _outfitBalance[4]);
            Bonus.speed += (1 * _outfitBalance[4]);
            Bonus.intelligence += (1 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1036) { //Love Embrace (Boots) //hp 60
            Bonus.hp += (60 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1037) { //Love Embrace (Boots) //atk 6
            Bonus.attack += (6 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1038) { //Love Embrace (Boots) //def 6
            Bonus.defense += (6 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1039) { //Love Embrace (Boots) //spd 6
            Bonus.speed += (6 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1040) { //Love Embrace (Boots) //int 3
            Bonus.intelligence += (3 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1041 || _outfitsID[4] == 1042) { //Love Embrace (Boots) //all (12,2,1,1,1)
            Bonus.hp += (12 * _outfitBalance[4]);
            Bonus.attack += (2 * _outfitBalance[4]);
            Bonus.defense += (1 * _outfitBalance[4]);
            Bonus.speed += (1 * _outfitBalance[4]);
            Bonus.intelligence += (1 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1057) { //Celestial Harmony (Boots) //hp 80
            Bonus.hp += (80 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1058) { //Celestial Harmony (Boots) //atk 8
            Bonus.attack += (8 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1059) { //Celestial Harmony (Boots) //def 8
            Bonus.defense += (8 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1060) { //Celestial Harmony (Boots) //spd 8
            Bonus.speed += (8 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1061) { //Celestial Harmony (Boots) //int 4
            Bonus.intelligence += (4 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1062 || _outfitsID[4] == 1063) { //Celestial Harmony (Boots) //all (16,2,2,1,1)
            Bonus.hp += (16 * _outfitBalance[4]);
            Bonus.attack += (2 * _outfitBalance[4]);
            Bonus.defense += (2 * _outfitBalance[4]);
            Bonus.speed += (1 * _outfitBalance[4]);
            Bonus.intelligence += (1 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1078) { //Cyber Strike (Boots) //hp 80
            Bonus.hp += (80 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1079) { //Cyber Strike (Boots) //atk 8
            Bonus.attack += (8 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1080) { //Cyber Strike (Boots) //def 8
            Bonus.defense += (8 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1081) { //Cyber Strike (Boots) //spd 8
            Bonus.speed += (8 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1082) { //Cyber Strike (Boots) //int 4
            Bonus.intelligence += (4 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1083 || _outfitsID[4] == 1084) { //Cyber Strike (Boots) //all (16,2,2,1,1)
            Bonus.hp += (16 * _outfitBalance[4]);
            Bonus.attack += (2 * _outfitBalance[4]);
            Bonus.defense += (2 * _outfitBalance[4]);
            Bonus.speed += (1 * _outfitBalance[4]);
            Bonus.intelligence += (1 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1099) { //Serpent Tribe (Boots) //hp 50
            Bonus.hp += (50 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1100) { //Serpent Tribe (Boots) //atk 3
            Bonus.attack += (3 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1101) { //Serpent Tribe (Boots) //def 3
            Bonus.defense += (3 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1102) { //Serpent Tribe (Boots) //spd 3
            Bonus.speed += (3 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1103) { //Serpent Tribe (Boots) //int 1
            Bonus.intelligence += (1 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1104 || _outfitsID[4] == 1105) { //Serpent Tribe (Boots) //all (10,1,1,1,1)
            Bonus.hp += (10 * _outfitBalance[4]);
            Bonus.attack += (1 * _outfitBalance[4]);
            Bonus.defense += (1 * _outfitBalance[4]);
            Bonus.speed += (1 * _outfitBalance[4]);
            Bonus.intelligence += (1 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1120) { //Pearl Empress (Boots) //hp 60
            Bonus.hp += (60 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1121) { //Pearl Empress (Boots) //atk 6
            Bonus.attack += (6 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1122) { //Pearl Empress (Boots) //def 6
            Bonus.defense += (6 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1123) { //Pearl Empress (Boots) //spd 6
            Bonus.speed += (6 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1124) { //Pearl Empress (Boots) //int 3
            Bonus.intelligence += (3 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1125 || _outfitsID[4] == 1126) { //Pearl Empress (Boots) //all (12,2,1,1,1)
            Bonus.hp += (12 * _outfitBalance[4]);
            Bonus.attack += (2 * _outfitBalance[4]);
            Bonus.defense += (1 * _outfitBalance[4]);
            Bonus.speed += (1 * _outfitBalance[4]);
            Bonus.intelligence += (1 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1141) { //Starlight Diva (Boots) //hp 100
            Bonus.hp += (100 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1142) { //Starlight Diva (Boots) //atk 10
            Bonus.attack += (10 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1143) { //Starlight Diva (Boots) //def 10
            Bonus.defense += (10 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1144) { //Starlight Diva (Boots) //spd 10
            Bonus.speed += (10 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1145) { //Starlight Diva (Boots) //int 5
            Bonus.intelligence += (5 * _outfitBalance[4]);
        } else if (_outfitsID[4] == 1146 || _outfitsID[4] == 1147) { //Starlight Diva (Boots) //all (20,2,2,2,1)
            Bonus.hp += (20 * _outfitBalance[4]);
            Bonus.attack += (2 * _outfitBalance[4]);
            Bonus.defense += (2 * _outfitBalance[4]);
            Bonus.speed += (2 * _outfitBalance[4]);
            Bonus.intelligence += (1 * _outfitBalance[4]);
        }


    }






}
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

// File: FINALdeployFA/INTERFACE - StorageV2.sol


pragma solidity ^0.8.20;

// Import your custom structs


/**
 * @title IFARPG_Storage
 * @dev Interface for FARPG_Storage so other contracts can call it
 */
interface IFARPG_Storage {
    //-------------------------------------------------------------------------
    // Administrative / Master Contract Access
    //-------------------------------------------------------------------------
    function owner() external view returns (address);
    function masterContracts(uint index) external view returns (address);
    function masterIndex(address) external view returns (uint);
    function addMasterContract(address _address, uint _index) external;
    function addMasterContractBatch(address[] memory _addresses, uint[] memory _indices) external;
    function removeMasterContract(uint _index) external;
    function getAllMasterContracts() external view returns (address[] memory, uint[] memory);

    //-------------------------------------------------------------------------
    // UID Management
    //-------------------------------------------------------------------------
    function UIDmain(address) external view returns (uint);
    function UID_ownedby(uint) external view returns (address);
    function UIDcounter() external view returns (uint);
    function getUID(address player) external view returns (uint _UID);
    function transferUID(address player, address newplayerwallet) external;
    function registerUID(address player) external;

    function setUIDmain (address playerAddress, uint UID) external;
    function setUID_ownedby (uint UID, address playerAddress) external;

    //-------------------------------------------------------------------------
    // Quest (setters)
    //-------------------------------------------------------------------------
    function setMainQuest(address player, uint index, uint8 progress) external;
    function setSideQuest(address player, uint index, uint8 progress) external;
    function setPremiumScore(address player, uint score) external;
    function setPlayerGeneStrength(address player, uint index, uint strength) external;
    function setPlayerVitamin(address player, uint index, uint amount) external;

    //-------------------------------------------------------------------------
    // Quest (getters)
    //-------------------------------------------------------------------------
    function getMainQuestProgress(address player, uint index) external view returns (uint8);
    function getSideQuestProgress(address player, uint index) external view returns (uint8);
    function getPremiumScore(address player) external view returns (uint);
    function getPlayerQuestAndScore(address player, uint index) external view returns (uint, uint, uint);
    function getMainQuestProgressArray(address player) external view returns (uint8[64] memory);
    function getSideQuestProgressArray(address player) external view returns (uint8[64] memory);


    //-------------------------------------------------------------------------
    // Player Stats (setters)
    //-------------------------------------------------------------------------
    function setPersonalWallet(address player, address personal) external;
    function setGiveControlTo(address player, address web2wallet) external;
    function setExp(address player, uint experience) external;
    function setRankScore(address player, uint score) external;
    function setEnergy1(address player, uint energy) external;
    function setEnergy2(address player, uint energy) external;
    function setEnergy22(address player, uint energy) external;
    function setEnergy3(address player, uint energy) external;
    function setTeamFormat(address player, uint[60] calldata format) external;
    function setUsernameToUID(string memory username, uint _UID) external;
    function setUIDToUsername(uint _UID, string memory username) external;
    function deleteUsernameToAddress (string memory username) external;

    // Points
    function setPoint1(address player, uint point) external;
    function setPoint2(address player, uint point) external;
    function setPoint3(address player, uint point) external;
    function setPoint4(address player, uint point) external;
    function setPoint5(address player, uint point) external;
    function addPoint1(address player, uint point) external;
    function addPoint2(address player, uint point) external;
    function addPoint3(address player, uint point) external;
    function addPoint4(address player, uint point) external;
    function addPoint5(address player, uint point) external;

    //-------------------------------------------------------------------------
    // Player Stats (getters)
    //-------------------------------------------------------------------------
    function personalwallet(address) external view returns (address);
    function givecontrolto(address) external view returns (address);
    function getExperience(address player) external view returns (uint);
    function getRankingScore(address player) external view returns (uint);
    function getEnergy1(address player) external view returns (uint);
    function getEnergy2(address player) external view returns (uint);
    function getEnergy22(address player) external view returns (uint);
    function getEnergy3(address player) external view returns (uint);
    function getPlayerStats(address player) external view returns (uint, uint, uint, uint, uint, uint);
    function UIDToUsername(uint) external view returns (string memory);
    function usernameToUID(string memory) external view returns (uint);
    function getPoint1(address player) external view returns (uint);
    function getPoint2(address player) external view returns (uint);
    function getPoint3(address player) external view returns (uint);
    function getPoint4(address player) external view returns (uint);
    function getPoint5(address player) external view returns (uint);
    function getPlayerPoints(address player) external view returns (uint, uint, uint, uint, uint);
    function getPlayergenestrengthArray(address player) external view returns (uint[50] memory);
    function getPlayerGeneStrength(address player, uint index) external view returns (uint);
    function getPlayervitaminArray(address player) external view returns (uint[50] memory);
    function getPlayerVitamin(address player, uint index) external view returns (uint);
    //-------------------------------------------------------------------------
    // Limits (setters)
    //-------------------------------------------------------------------------
    function setLimit1(address player, uint limit) external;
    function setLimit2(address player, uint limit) external;
    function setLimit3(address player, uint limit) external;
    function setTimebound1(address player, uint timestamp) external;
    function setTimebound2(address player, uint timestamp) external;
    function setTimebound3(address player, uint timestamp) external;

    //-------------------------------------------------------------------------
    // Limits (getters)
    //-------------------------------------------------------------------------
    function getLimit1(address player) external view returns (uint);
    function getLimit2(address player) external view returns (uint);
    function getLimit3(address player) external view returns (uint);
    function getTimebound1(address player) external view returns (uint);
    function getTimebound2(address player) external view returns (uint);
    function getTimebound3(address player) external view returns (uint);
    function getPlayerLimits(address player) external view returns (uint, uint, uint, uint, uint, uint);

    //-------------------------------------------------------------------------
    // Numberset (setters)
    //-------------------------------------------------------------------------
    function setNumberSet1(address player, uint[6] memory number) external;
    function setNumberSet2(address player, uint[5] memory number) external;
    function setNumberSet3(address player, uint[5] memory number) external;
    function setNumberSet4(address player, uint[5] memory number) external;
    function setNumberSet5(address player, uint[5] memory number) external;
    function setNumberSet6(address player, uint[5] memory number) external;
    function setNumberSet7(address player, uint[5] memory number) external;
    function setNumberSet8(address player, uint[5] memory number) external;
    function setNumberSet9(address player, uint[5] memory number) external;
     function setNumberSetA(address player, uint[5] memory number) external; 
    function setNumberSetB(address player, uint[5] memory number) external; 
    function setNumberSetC(address player, uint[5] memory number) external; 
    function setNumberSetD(address player, uint[5] memory number) external; 
    function setNumberSetE(address player, uint[10] memory number) external; 
    function setNumberSetF(address player, uint[10] memory number) external; 
    function setNumberSetG(address player, uint[10] memory number) external; 
    function setNumberSetH(address player, uint[10] memory number) external;    

    //-------------------------------------------------------------------------
    // Numberset (getters)
    //-------------------------------------------------------------------------
    function getNumberSet1(address player) external view returns (uint[6] memory);
    function getNumberSet2(address player) external view returns (uint[5] memory);
    function getNumberSet3(address player) external view returns (uint[5] memory);
    function getNumberSet4(address player) external view returns (uint[5] memory);
    function getNumberSet5(address player) external view returns (uint[5] memory);
    function getNumberSet6(address player) external view returns (uint[5] memory);
    function getNumberSet7(address player) external view returns (uint[5] memory);
    function getNumberSet8(address player) external view returns (uint[5] memory);
    function getNumberSet9(address player) external view returns (uint[5] memory);
    function getNumberSetA(address player) external view returns (uint[5] memory);
    function getNumberSetB(address player) external view returns (uint[5] memory);
    function getNumberSetC(address player) external view returns (uint[5] memory);
    function getNumberSetD(address player) external view returns (uint[5] memory);
    function getNumberSetE(address player) external view returns (uint[10] memory);
    function getNumberSetF(address player) external view returns (uint[10] memory);
    function getNumberSetG(address player) external view returns (uint[10] memory);
    function getNumberSetH(address player) external view returns (uint[10] memory);
    
    //-------------------------------------------------------------------------
    // PVP Ranks
    //-------------------------------------------------------------------------
    struct Player {
        uint256 rankPoints;
        uint256 league;
        uint256 indexInLeague; // Index of the player within their league array
    }
    function setPlayers(address player, Player memory rankpointleagueindexinleague) external; 
    function setReset_Time_Attempts(address player, uint[2] memory resettimeattemps) external;  
    function setEligible_Opponents(address player, address[5] memory eligibleOppo) external;  
    function setFaught_Opponents(address player, uint[5] memory faughtOppo) external;  
    function setDefending_Formation(address player, uint[3] memory defendingslot) external;  
    function getPlayers(address player) external view returns (Player memory ) ;
    function getReset_Time_Attempts(address player ) external view returns (uint[2] memory );
    function getEligible_Opponents(address player  ) external view returns (address[5] memory);
    function getFaught_Opponents(address player ) external view returns(uint[5] memory) ;
    function getDefending_Formation(address player) external view returns (uint[3] memory );



    //-------------------------------------------------------------------------
    // Pet data (setters)
    //-------------------------------------------------------------------------
    function setPetUnits(address player, uint index, S.Unit memory newUnit) external;
    function setPetUnitsMaxVitamined(address player, uint index, S.Unit memory newUnit) external;
    function setPetStatuses(address player, uint index, S.Status memory newStatus) external;
    function setPetTimes(address player, uint index, S.Time memory newTime) external;

    //-------------------------------------------------------------------------
    // Pet data (getters)
    //-------------------------------------------------------------------------
    function getPetUnitsAll(address player) external view returns (S.Unit[500] memory);
    function getPetUnits(address player, uint _index) external view returns (S.Unit memory);
    function getPetUnitsMaxVitaminedAll(address player) external view returns (S.Unit[500] memory);
    function getPetUnitsMaxVitamined(address player, uint _index) external view returns (S.Unit memory);
    function getPetStatusesAll(address player) external view returns (S.Status[500] memory);
    function getPetStatuses(address player, uint _index) external view returns (S.Status memory);
    function getPetTimesAll(address player) external view returns (S.Time[500] memory);
    function getPetTimes(address player, uint _index) external view returns (S.Time memory);

    //-------------------------------------------------------------------------
    // Party / Outfit
    //-------------------------------------------------------------------------
    function setPartyFormation(address player, uint[30] memory slots) external;
    function setTrainerOutfitPosition(address player, uint[150] memory outfitIds) external;
    function getPartyFormation(address player) external view returns (uint[30] memory);
    function getAllOutfits(address player) external view returns (uint[150] memory);

    //-------------------------------------------------------------------------
    // Trainer Gene Infusing
    //-------------------------------------------------------------------------
    function setTrainerGeneInfusingGene(address player, uint index, uint value) external; 
    function setTrainerGeneInfusingGeneAll(address player, uint[50] memory newData) external;
    function setTrainerGeneInfusingTimer(address player, uint index, uint value) external; 
    function setTrainerGeneInfusingTimerAll(address player, uint[50] memory newData) external;

    function getTrainerGeneInfusingGeneAll(address player) external view returns (uint[50] memory) ;
    function getTrainerGeneInfusingTimerAll(address player) external view returns (uint[50] memory);
    function getTrainerGeneInfusingGene(address player, uint Index)external  view returns (uint ) ;
    function getTrainerGeneInfusingTimer(address player, uint Index)external  view returns (uint );


    //-------------------------------------------------------------------------
    // Additional Utility
    //-------------------------------------------------------------------------
    function getBattleUnit3(address player, uint[3] calldata slots)
        external
        view
        returns (S.Unit[3] memory Units3, uint[3] memory UnitIds);

    function getSlotUnitMore(address player, uint startindex, uint stopindex)
        external
        view
        returns (S.Unit[] memory Units, uint[] memory UnitIds);

    function getTeamFormat(address _addr) external view returns (uint[60] memory);

    //-------------------------------------------------------------------------
    // Weather System
    //-------------------------------------------------------------------------
    function getWeatherUnity() external view returns (uint _weather, uint _daylight, uint _blocktime);
    function getWeatherBattle(uint _timenow) external view returns (uint _weather);
    function setWeatherConstants(uint[12] memory _weatherIndices) external;
    function getWeatherIndexConstants() external view returns (uint[] memory);
}

// File: FINALdeployFA/PUBLIC - QuestSystemV2.sol


pragma solidity ^0.8.19;

//_______________________________________________________________
//    ___ __   __     _   ___      _   ___    _ __  
//   | _ )\ \ / /  _ | | / _ \  _ | | / _ \  (_)\ \ 
//   | _ \ \ V /  | || || (_) || || || (_) |  _  | |
//   |___/  |_|    \__/  \___/  \__/  \___/  ( ) | |
//                                           |/ /_/ 
//_______________________________________________________________






// Interface for accessing Storage
//-------------------------------------------------------------------
//    _____ _   _ _______ ______ _____  ______      _____ ______ 
//   |_   _| \ | |__   __|  ____|  __ \|  ____/\   / ____|  ____|
//     | | |  \| |  | |  | |__  | |__) | |__ /  \ | |    | |__   
//     | | | . ` |  | |  |  __| |  _  /|  __/ /\ \| |    |  __|  
//    _| |_| |\  |  | |  | |____| | \ \| | / ____ \ |____| |____ 
//   |_____|_| \_|  |_|  |______|_|  \_\_|/_/    \_\_____|______|
//                                                          
//-------------------------------------------------------------------


interface BattleV4 {
    //enum Weather { Sunny, Cloudy, Rainy, Thunderstorm, Snowy, Aurora, BloodMoon, NONE }
    function BattleV4_3v3(S.Unit[6] memory _UnitGroup) external 
    returns (uint BattleRhythm, uint bit, bool Won, uint randret);

    function Calibrate(uint index) external returns (uint, uint, bool, uint);
}

contract FARPG_QuestSystemV2 is ReentrancyGuard ,Ownable {
    IFARPG_Storage public contractStorage;
    BattleV4 public Battle;
    constructor() {
        
    }
    event StatChangedResult(S.Unit AfterUnit, S.Status AfterStatus, S.Time AfterTime);
    event BattleResultV2(uint BattleRythm, uint bit, bool Won, uint randret, S.Unit[6] unitgroup,uint[3] oponentid, uint[3] attackerid);

//-------------------------------------------------------------------
//    _____ _      ____  ____          _       __      __    
//   / ____| |    / __ \|  _ \   /\   | |      \ \    / /    
//  | |  __| |   | |  | | |_) | /  \  | |       \ \  / /     
//  | | |_ | |   | |  | |  _ < / /\ \ | |        \ \/ /      
//  | |__| | |___| |__| | |_) / ____ \| |____     \  /     _ 
//   \_____|______\____/|____/_/    \_\______|     \/     (_)
//                                                                                                             
//-------------------------------------------------------------------
    uint private QuesttoQuestDelay3 = 3 seconds; //prevent a bot to finish the quest too fast
    uint private QuesttoQuestDelay10 = 10 seconds; //prevent a bot to finish the quest too fast
    mapping (address => uint) private reentrant_time;
    uint constant PRICE_TOOPENBOX = 5 ether; //dont have to change, as this will not happened since First quest only run once. Even is, that is attempt to exploit. 5 FTM will prevent that.
    uint constant TIME_INITIALSTAMINA = 24 hours; //initial stamina
    uint constant TIME_INITIALENDURANCE = 3 hours; //initial endurance/hunger
    string constant MESSAGE_STANDARDQUESTCONDITIONUNMATCHED = "Quest requirement unmatched.";
//--------------------------------------------------------- 
//                     _____  __  __ _____ _   _ 
//               /\   |  __ \|  \/  |_   _| \ | |
//              /  \  | |  | | \  / | | | |  \| |
//             / /\ \ | |  | | |\/| | | | | . ` |
//            / ____ \| |__| | |  | |_| |_| |\  |
//           /_/    \_\_____/|_|  |_|_____|_| \_|
//                                               
//---------------------------------------------------------                                               

    function updateStorageContractAAddress(address _newContractAAddress) external onlyOwner {
        require(_newContractAAddress != address(0), "Invalid address");
        contractStorage = IFARPG_Storage(_newContractAAddress);
    }
    
    function updateBattleV4Address(address _newContractAAddress) external onlyOwner {
        require(_newContractAAddress != address(0), "Invalid address");
        Battle = BattleV4(_newContractAAddress);
    }
    function withdraw() external onlyOwner {
        // Function to withdraw all balance from the contract for revenue
        require(address(this).balance > 0, "Contract balance is zero");
        payable(msg.sender).transfer(address(this).balance);
    }
//---------------------------------------------------------
//              
//             _____ _______       _____ _______ 
//            / ____|__   __|/\   |  __ \__   __|
//           | (___    | |  /  \  | |__) | | |   
//            \___ \   | | / /\ \ |  _  /  | |   
//            ____) |  | |/ ____ \| | \ \  | |   
//           |_____/   |_/_/    \_\_|  \_\ |_|   
//                                               
//---------------------------------------------------------                                     

//--------- sub functions ---------------
    function accountAddressToProceed() public view returns (address) {
   
    address playerAddress = contractStorage.personalwallet(msg.sender);
        if (playerAddress == address(0)) {
            return msg.sender;
        } else {
            return playerAddress;
        }
    }

    modifier onlyEOA() {
        require(!isContract(msg.sender), "Smart contracts not allowed");
        _;
    }
    function noneReentrant_time(address player, uint delay) internal {
      
        require(reentrant_time[player] < block.timestamp ,"Spam prevention activated.");
        reentrant_time[player] = block.timestamp + delay;
    }
    function isContract(address _addr) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(_addr)
        }
        return size > 0;
    }



///////////////////////////////////////   QUEST START  //////////////////////////////////////////////////////////////////    

    
    uint constant REENTRANT_TIMELIMIT = 2 seconds; // default 2 seconds. means u cannot run the nonreentrant functions >1 time within 3 seconds.
    uint constant PET_STAMINA_MAX = 24 hours; //maximum stamina even rested for so long
    uint constant PET_HUNGER_MAX = 24 hours; // if a pet left for very long time. the MAX hunger should be...

    uint constant ROOKIETOMATURE_BOND = 35 hours; // if Bond more than this, evolve. BUT it is Stamina + Hunger, thus 48hr per day, open Box gave 24+21= 45 hours
   
    uint constant MATURETOPERFECT_BOND = 81 hours; // on evolved, you gain max stamina and initial hunger again, means 45hours again.

 

    function Q6_1EmoFightAndLetPass(uint[3] calldata attackersID) public nonReentrant {
      
        address playerAddress = accountAddressToProceed();
        noneReentrant_time(playerAddress,QuesttoQuestDelay10); //prevent spam
        //after completed Michael Simulated Dungeon quest
        require(contractStorage.getMainQuestProgress(playerAddress,5) >= 2,MESSAGE_STANDARDQUESTCONDITIONUNMATCHED);  
       
        bool AttackerWin;
        uint BattleRhythm;
        uint randret;
        S.Unit[3] memory AttackerUnits; //0,1,2 is Attacker, defender on PvPFULLRecords storage
        uint[3] memory AttackerIDs; //0,1,2 is Attacker, defender on PvPFULLRecords storage
        S.Unit[6] memory UnitGroup; //this is a group that will send to battlecontract
        uint bit;
        uint[3] memory OpponIDs;
        (AttackerUnits,AttackerIDs) = contractStorage.getBattleUnit3(playerAddress,attackersID);
        require(AttackerUnits[0].hp>0 || AttackerUnits[1].hp>0 || AttackerUnits[2].hp>0,"3 empty slots, cannot battle.");
        //player's Lings
        UnitGroup[0] = AttackerUnits[0];
        UnitGroup[1] = AttackerUnits[1];
        UnitGroup[2] = AttackerUnits[2];
        //Emo show mercy - use only Grizzleclaw Wombat P1
        UnitGroup[3] = S.Unit({ hp: 18000, attack: 3000, defense: 890, speed: 1500, intelligence: 420, genestrength: 10, range: 20, special: 22 }); //buffed for challenge
        //Emo show mercy, only use 1 Ling.
        OpponIDs = [uint(22), uint(0), uint(0)];
        // Call the BattleV4_3v3 function with matching types
        (BattleRhythm, bit, AttackerWin, randret) = Battle.BattleV4_3v3(UnitGroup);
        if (contractStorage.getMainQuestProgress(playerAddress,6) == 0) {   
            contractStorage.setMainQuest(playerAddress,6,1); //lose or win also set complete.
        }
        emit BattleResultV2(BattleRhythm, bit, AttackerWin, randret,UnitGroup,OpponIDs,AttackerIDs);
        //This suppose to be sure lose battle. but even lose, will complete the quest
    }

    function Q6_2EmoExplainPVP() public nonReentrant {
      
        address playerAddress = accountAddressToProceed();
        noneReentrant_time(playerAddress,QuesttoQuestDelay3); //prevent spam
        
        require(contractStorage.getMainQuestProgress(playerAddress,6) == 1,MESSAGE_STANDARDQUESTCONDITIONUNMATCHED);  
        contractStorage.setMainQuest(playerAddress,6,2);    
    }



    function Q7_1YukaMeetAtShine() public nonReentrant {
       
        address playerAddress = accountAddressToProceed();
        noneReentrant_time(playerAddress,QuesttoQuestDelay3); //prevent spam
        
        require(contractStorage.getMainQuestProgress(playerAddress,6) >= 1,MESSAGE_STANDARDQUESTCONDITIONUNMATCHED);  
        if (contractStorage.getMainQuestProgress(playerAddress,7) == 0) {   
            contractStorage.setMainQuest(playerAddress,7,1);    
        }
    }

    function Q7_2YukaExplainTutorial() public nonReentrant {
       
        address playerAddress = accountAddressToProceed();
        noneReentrant_time(playerAddress,QuesttoQuestDelay3); //prevent spam
        
        require(contractStorage.getMainQuestProgress(playerAddress,7) == 1,MESSAGE_STANDARDQUESTCONDITIONUNMATCHED);  
        contractStorage.setMainQuest(playerAddress,7,2);    
    }

    function Q8_1SamOpenResearchCenter() public nonReentrant {
       
        address playerAddress = accountAddressToProceed();
        noneReentrant_time(playerAddress,QuesttoQuestDelay3); //prevent spam
        
        require(contractStorage.getMainQuestProgress(playerAddress,6) >= 1,MESSAGE_STANDARDQUESTCONDITIONUNMATCHED);  
        if (contractStorage.getMainQuestProgress(playerAddress,8) == 0) {   
            contractStorage.setMainQuest(playerAddress,8,1); 
        }
    }

    function Q8_2SamExplainTransformInfuseTutorial() public nonReentrant {
      
        address playerAddress = accountAddressToProceed();
        noneReentrant_time(playerAddress,QuesttoQuestDelay3); //prevent spam
        
        require(contractStorage.getMainQuestProgress(playerAddress,8) == 1,MESSAGE_STANDARDQUESTCONDITIONUNMATCHED);  
        contractStorage.setMainQuest(playerAddress,8,2);    
    }



    function Q9_1TopenAdvertistment() public nonReentrant {
       
        address playerAddress = accountAddressToProceed();
        noneReentrant_time(playerAddress,QuesttoQuestDelay3); //prevent spam
        
        require(contractStorage.getMainQuestProgress(playerAddress,5) >= 1,MESSAGE_STANDARDQUESTCONDITIONUNMATCHED);  
        if (contractStorage.getMainQuestProgress(playerAddress,9) == 0) { 
            contractStorage.setMainQuest(playerAddress,9,1); 
        }
    }





}

Please enter a contract address above to load the contract details and source code.

Context size (optional):