Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 6 from a total of 6 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Add Master Contr... | 10785516 | 17 hrs ago | IN | 0 S | 0.0030124 | ||||
Add Master Contr... | 9157185 | 7 days ago | IN | 0 S | 0.00397018 | ||||
Add Master Contr... | 7992107 | 13 days ago | IN | 0 S | 0.04215091 | ||||
Add Master Contr... | 7845563 | 14 days ago | IN | 0 S | 0.0030124 | ||||
Add Master Contr... | 7223377 | 19 days ago | IN | 0 S | 0.04104386 | ||||
Add Master Contr... | 7099556 | 20 days ago | IN | 0 S | 0.06119866 |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
FARPG_BattleV4
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-02-09 */ // 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 { //uint32 types; //determine element and some skills. 0=none, 1=fire, 2=water, 3=ice, 4=electic, 5=nature, 6=light, 7=dark //linked to skill right now 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 // family to gene is tricky, need to +1 to make sure 0 means nothing. Thus 1 is Dragon, althought for trainerGene, 0 is dragon // because player wont submit a transaction to set their trainer gene when start. 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: @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 - BattleSystemV4LIB.sol pragma solidity ^0.8.0; library SK1 { function UnitSkills (S.Unit[6] memory _UnitGroup, uint[6] memory _UnitFocus, uint[6] memory _UnitReaction, uint _ithUnit, uint _tempTarget, uint[6] memory _TimeConsume, uint SkillNumber) external pure returns (S.Unit[6] memory UnitGroup, uint[6] memory UnitFocus, uint[6] memory UnitReaction, uint[6] memory TimeConsume){ uint _damage; uint _reactionDamage; UnitGroup = _UnitGroup; UnitFocus = _UnitFocus; UnitReaction = _UnitReaction; TimeConsume = _TimeConsume; uint[3] memory targets_; //having a _ at the back indicates a combine usage of array if (_tempTarget >2) { // then it is player 2 targets_[2] = 1; //1 is player2 as index start from 0, 3rd element [2] of this array store defending player. }//actually no need to use targets_2 because we check _tempTarget at all skill. if >2 means Opponents/player 2 //targets_[0] will use at attacking unit, and targets_[1] use as defending target unit later. // //uint SkillNumber; //-------------------------SKILL START------------------------------------------------- // _____ _ _______ _ _ _____ // / ____| |/ /_ _| | | | / ____| // | (___ | ' / | | | | | | | (___ // \___ \| < | | | | | | \___ \ // ____) | . \ _| |_| |____| |____ ____) | // |_____/|_|\_\_____|______|______|_____/ //------------------------------------------------------------------------------------ if (SkillNumber == 0) { //powerful normal attack _damage = ((UnitGroup[_ithUnit].attack+1) * 13) / 10; //130% //cannot less than 1, safemath not check if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } //-----------------------------------------------------ADD SKILL START HERE----------------------------------------------------- } else if (SkillNumber == 2){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = (UnitGroup[_ithUnit].attack ) + ((UnitGroup[_ithUnit].speed+1) * 2) ; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 3){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 2); //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 4){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT> for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = (UnitGroup[_ithUnit].attack ) + ((UnitGroup[_ithUnit].speed+1) * 3) ; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 5){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT> for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 15) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 6){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT> for (uint i = 0; i < 3; i++) { if (_tempTarget > 2) { //reverse the condition to target allies targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 6,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = (UnitGroup[_ithUnit].speed); //******** _skill damage display seperately with element color. _damage += _reactionDamage; UnitGroup[targets_[1]].hp += _damage; //Light reaction no damage, and this is gain HP += } } } else if (SkillNumber == 8){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 2); //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 9){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 2) ; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 10){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 3); //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 11){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT> for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[targets_[1]].hp+1)* 5) / 10; //******** _skill damage display seperately with element color. //cap damage for attack * 2.5 if (_damage > (UnitGroup[targets_[0]].attack+1)*25/10) { //+1 safe math _damage = (UnitGroup[targets_[0]].attack+1)*25/10; } _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 12){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 3,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].defense+1) * 7); //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 14){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 3,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 2) ; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 15){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 2,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 2); //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 16){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT> for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 3,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].defense+1) * 2); //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 17){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT> for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 2,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].hp+1)*3) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 18){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 35) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 20){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 2) ; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 21){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 22){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 35) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 23){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = (UnitGroup[_ithUnit].attack ) + ((UnitGroup[_ithUnit].intelligence+1) * 5) ; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 24){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT> for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = (UnitGroup[targets_[1]].defense* 2) ; //******** _skill damage display seperately with element color. if (_damage > (UnitGroup[targets_[0]].attack+1)*2) { _damage = (UnitGroup[targets_[0]].attack+1)*2; } _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 25){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 3,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = (UnitGroup[_ithUnit].attack ) + ((UnitGroup[_tempTarget].defense+1)* 5) ; //******** _skill damage display seperately with element color. if (_damage > (UnitGroup[targets_[0]].attack+1)*6) { _damage = (UnitGroup[targets_[0]].attack+1)*6; } _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 26){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT> for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].intelligence+1) * 4) ; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 27){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = (UnitGroup[_ithUnit].attack ) + (UnitGroup[_tempTarget].speed* 6) ; //******** _skill damage display seperately with element color. if (_damage > (UnitGroup[targets_[0]].attack+1)*6) { _damage = (UnitGroup[targets_[0]].attack+1)*6; } _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 28){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: if(UnitGroup[_tempTarget].defense > 1000){ _damage = ((UnitGroup[_ithUnit].attack+1) * 4) ; } //******** _skill damage display seperately with element color. else{ _damage = ((UnitGroup[_ithUnit].attack+1) * 3) ; } _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 29){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT> for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = (UnitGroup[_ithUnit].attack ) + ((UnitGroup[_ithUnit].intelligence+1) * 2) ; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 30){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: if(UnitGroup[_tempTarget].intelligence < UnitGroup[_ithUnit].intelligence){ _damage = ((UnitGroup[_ithUnit].intelligence+1) * 20) ; } //******** _skill damage display seperately with element color. else{ _damage = ((UnitGroup[_ithUnit].intelligence+1) * 10) ; } //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 31){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 2,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].hp+1)*5) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 32){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = (UnitGroup[_ithUnit].attack*2 ) + (UnitGroup[_tempTarget].attack*2) ; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 33){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = (UnitGroup[_ithUnit].attack*3 ) + (UnitGroup[_tempTarget].defense) ; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 34){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT> //Special: need to fix the HP first _damage = ((UnitGroup[_ithUnit].hp+1)*2) / 10; //******** _skill damage display seperately with element color. for (uint i = 0; i < 3; i++) { if (_tempTarget > 2) { //reverse this for targeting allies targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 6,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: UnitGroup[targets_[1]].hp += _damage; //light reaction has no damage, and this is gain HP } } } else if (SkillNumber == 35){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT> for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 2,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: if(UnitGroup[targets_[1]].hp < UnitGroup[_ithUnit].hp){ _damage = ((UnitGroup[_ithUnit].attack+1) * 2) ; } //******** _skill damage display seperately with element color. else{ _damage = ((UnitGroup[_ithUnit].attack+1) * 1) ; } //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 36){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = (UnitGroup[_ithUnit].attack*3 ) + (UnitFocus[_tempTarget]*5) ; //******** _skill damage display seperately with element color. if (_damage > (UnitGroup[targets_[0]].attack+1)*6) { _damage = (UnitGroup[targets_[0]].attack+1)*6; } _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 38){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 39){ //skill number 1 is Youpling, Consider AOE //******** Special: gain allies atk based on its atk*0.5, enemy applied fire. //fix damage number first as atk will gain per loop _damage = ((UnitGroup[_ithUnit].attack+1) * 5) / 10; //50% //******** _skill damage display seperately with element color. //gain allies damage first for (uint i = 0; i < 3; i++) { if (_tempTarget > 2) { //reverse to target self first, no elemental reaction on self targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive UnitGroup[targets_[1]].attack += _damage; } } _damage = 0; //reset for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { //special: after gained attack, then damage enemy targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 2) / 10; //20% //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 40){ //skill number , SINGLE TARGET //special: gain self 5000HP, then damage HP*0.5 UnitGroup[_ithUnit].hp += 5000; targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 6,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].hp+1) * 5) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 42){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 43){ //skill number , SINGLE TARGET //special: atk*1 + oppo hp*0.5 (total cap self atk*6) targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 3,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = UnitGroup[_ithUnit].attack + ((UnitGroup[_tempTarget].hp+1)*5)/10; //******** _skill damage display seperately with element color. /*if (_damage > (UnitGroup[targets_[0]].attack+1)*6) { _damage = (UnitGroup[targets_[0]].attack+1)*6; }*/ _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 44){ //skill number 1 is Youpling, Consider AOE //special: atk*1 stick Dark element even after reactions for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 1); //100% //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } UnitReaction[targets_[1]] = 7;//stick Dark } } } else if (SkillNumber == 46){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 3,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 25) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 47){ //skill number //atk*2.8, if oppo def <1000, atk*4.5 targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 3,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: if (UnitGroup[_tempTarget].defense < 1000) { _damage = ((UnitGroup[_ithUnit].attack+1) * 28) / 10; //******** _skill damage display seperately with element color. } else { _damage = ((UnitGroup[_ithUnit].attack+1) * 45) / 10; //******** _skill damage display seperately with element color. } _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 48){ //skill number 1 is Youpling, Consider AOE //atk*1 to enemy, apply Light on allies for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 10) / 10; //100% //******** _skill damage display seperately with element color. //_damage += _reactionDamage; no reaction if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } for (uint i = 0; i < 3; i++) { if (_tempTarget > 2) { //reverse to allies and gives Light element targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 6,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: //no damage } } } else if (SkillNumber == 50){ //skill number , SINGLE TARGET targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 20) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 51){ //skill number 1 is Youpling, Consider AOE //special: atk*1, if there is Dark on oppo, atk*2.5 for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //SKILL damage first, need to by pass the element reaction and applying dark: if (UnitReaction[targets_[1]] == 7) { //already has dark on them _damage = ((UnitGroup[_ithUnit].attack+1) * 25) / 10; //250% //******** _skill damage display seperately with element color. } else { //no dark element on them _damage = ((UnitGroup[_ithUnit].attack+1) * 10) / 10; //100% //******** _skill damage display seperately with element color. } //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 52){ //skill number , SINGLE TARGET //Special: atk*2.5, if there is already dark on oppo, atk*3.5 targets_[0] = _ithUnit; targets_[1] = _tempTarget; //SKILL damage first, need to by pass the element reaction and applying dark: if (UnitReaction[targets_[1]] == 7) { //already has dark on them _damage = ((UnitGroup[_ithUnit].attack+1) * 35) / 10; //350% //******** _skill damage display seperately with element color. } else { //no dark element on them _damage = ((UnitGroup[_ithUnit].attack+1) * 25) / 10; //250% //******** _skill damage display seperately with element color. } //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 54){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } } function SkillReaction (S.Unit[6] memory _UnitGroup, uint[6] memory _UnitReaction, uint[6] memory _UnitFocus, uint[6] memory _TimeConsume, uint _AtkElement, uint[3] memory _targets_) private pure returns(S.Unit[6] memory UnitGroup,uint[6] memory UnitReaction,uint[6] memory UnitFocus, uint[6] memory TimeConsume, uint damage ) { UnitGroup = _UnitGroup; UnitReaction = _UnitReaction; UnitFocus = _UnitFocus; TimeConsume = _TimeConsume; uint _ithUnit = _targets_[0]; uint _tempTarget = _targets_[1]; //uint _tempPlayer = _targets_[2]; if (UnitReaction[_tempTarget] == 0 || UnitReaction[_tempTarget] == _AtkElement) { //means it has no reaction, place one for it. UnitReaction[_tempTarget] = _AtkElement; } else { //Unit has Element UnitReaction[_tempTarget] = (UnitReaction[_tempTarget]*10) + _AtkElement; //this is to encode for later use, imagine 12 and 21 also means Fire<->Water reaction if (UnitReaction[_tempTarget] == 12 ||UnitReaction[_tempTarget] == 21 ){ //Fire<->Water | Vaporize //Damage +0.3x HP_of_TriggerUnit damage = (UnitGroup[_ithUnit].hp+1) * 3 / 10; UnitReaction[_tempTarget] =0; //Conductive and Ignite need retain. } else if (UnitReaction[_tempTarget] == 13 ||UnitReaction[_tempTarget] == 31 ) { //Fire<->Ice | Melt //Damage +2x Defense_of_TriggerUnit damage = (UnitGroup[_ithUnit].defense+1) * 2; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 14 ||UnitReaction[_tempTarget] == 41 ) { //Fire<->Electric | Flare //Damage +1x Attack_of_TriggerUnit damage = UnitGroup[_ithUnit].attack; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 15 ||UnitReaction[_tempTarget] == 51 ) { //Fire<->Nature | Ignite //Damage +0.5x Attack_of_TriggerUnit, Retain Fire element damage = (UnitGroup[_ithUnit].attack+1) * 2 / 10; UnitReaction[_tempTarget] =1; } else if (UnitReaction[_tempTarget] == 16 ||UnitReaction[_tempTarget] == 61 ) { //Fire<->Light | Holy //Target current Attack +30% (stackable, round down) UnitGroup[_tempTarget].attack = ((UnitGroup[_tempTarget].attack+1) * 13) / 10; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 17 ||UnitReaction[_tempTarget] == 71 ) { //Fire<->Dark | Exhaust //Target current Attack -30% (stackable, round down) UnitGroup[_tempTarget].attack = ((UnitGroup[_tempTarget].attack+1) * 7) / 10; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 23 ||UnitReaction[_tempTarget] == 32 ) { //Water<->Ice | Frost //stop 1 turn, retain Ice Element TimeConsume[_tempTarget] += (100000/UnitGroup[_tempTarget].speed); UnitReaction[_tempTarget] =3; } else if (UnitReaction[_tempTarget] == 24 ||UnitReaction[_tempTarget] == 42 ) { //Water<->Electric | Conduct //Damage +1x Speed_of_TriggerUnit, Retain Electric element damage = UnitGroup[_ithUnit].speed; UnitReaction[_tempTarget] =4; } else if (UnitReaction[_tempTarget] == 25 ||UnitReaction[_tempTarget] == 52 ) { //Water<->Nature | Entangle //stop 1 turn, retain Nature Element TimeConsume[_tempTarget] += (100000/UnitGroup[_tempTarget].speed); UnitReaction[_tempTarget] =5; } else if (UnitReaction[_tempTarget] == 26 ||UnitReaction[_tempTarget] == 62 ) { //Water<->Light | Grow //Target current HP +25% (stackable, round down) UnitGroup[_tempTarget].hp = ((UnitGroup[_tempTarget].hp+1) * 125) / 100; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 27 ||UnitReaction[_tempTarget] == 72 ) { //Water<->Dark | Dehydration //Target current HP -25% (stackable, round down) if ( ((UnitGroup[_tempTarget].hp+1) * 25)/100 > 9999){ UnitGroup[_tempTarget].hp -= 9999; } else { UnitGroup[_tempTarget].hp = ((UnitGroup[_tempTarget].hp+1) * 75) / 100; } UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 34 ||UnitReaction[_tempTarget] == 43 ) { //Ice<->Electric | Spark //Target current Defense -30% (stackable, round down) retain electric UnitGroup[_tempTarget].defense = ((UnitGroup[_tempTarget].defense+1) * 7) / 10; UnitReaction[_tempTarget] =4; } else if (UnitReaction[_tempTarget] == 35 ||UnitReaction[_tempTarget] == 53 ) { //Ice<->Nature | Chill //stop 1 turn, SkillStrategy reset to 0. TimeConsume[_tempTarget] += (100000/UnitGroup[_tempTarget].speed); UnitFocus[_tempTarget] = 0; UnitReaction[_tempTarget] = 0; } else if (UnitReaction[_tempTarget] == 36 ||UnitReaction[_tempTarget] == 63 ) { //Ice<->Light | Radiant //Target current Defense +30% (stackable, round down) UnitGroup[_tempTarget].defense = ((UnitGroup[_tempTarget].defense+1) * 13) / 10; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 37 ||UnitReaction[_tempTarget] == 73 ) { //Ice<-> Dark | Dizzy //Target current Defense -50% (stackable, round down) UnitGroup[_tempTarget].defense = ((UnitGroup[_tempTarget].defense+1) * 5) / 10; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 45 ||UnitReaction[_tempTarget] == 54 ) { //Electric<->Nature | Overgrowth //Damage +2x Intelligence_of_TriggerUnit damage = UnitGroup[_ithUnit].intelligence*2; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 46 ||UnitReaction[_tempTarget] == 64 ) { //Electric<->Light | Reflect //Target current Speed +30% (stackable, round down) UnitGroup[_tempTarget].speed = ((UnitGroup[_tempTarget].speed+1) * 13) / 10; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 47 ||UnitReaction[_tempTarget] == 74 ) { //Electric<->Dark | Pressure //Target current Speed -30% (stackable, round down) UnitGroup[_tempTarget].speed = ((UnitGroup[_tempTarget].speed+1) * 7) / 10; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 56 ||UnitReaction[_tempTarget] == 65 ) { //Nature<->Light | Blossom //Target current Intelligence +30% (stackable, round down) UnitGroup[_tempTarget].intelligence = ((UnitGroup[_tempTarget].intelligence+1) * 13) / 10; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 57 ||UnitReaction[_tempTarget] == 75 ) { //Nature<->Dark | Drain //Target current Intelligence -30% (stackable, round down) UnitGroup[_tempTarget].intelligence = ((UnitGroup[_tempTarget].intelligence+1) * 7) / 10; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 67 ||UnitReaction[_tempTarget] == 76 ) { //Light<->Dark | Neutralize //Remove All Elements UnitReaction[_tempTarget] = 0; } } } } // File: FINALdeployFA/LIB - BattleSystemV4LIB2.sol pragma solidity ^0.8.0; library SK2 { function UnitSkills (S.Unit[6] memory _UnitGroup, uint[6] memory _UnitFocus, uint[6] memory _UnitReaction, uint _ithUnit, uint _tempTarget, uint[6] memory _TimeConsume, uint SkillNumber) external pure returns (S.Unit[6] memory UnitGroup, uint[6] memory UnitFocus, uint[6] memory UnitReaction, uint[6] memory TimeConsume){ uint _damage; uint _reactionDamage; UnitGroup = _UnitGroup; UnitFocus = _UnitFocus; UnitReaction = _UnitReaction; TimeConsume = _TimeConsume; uint[3] memory targets_; //having a _ at the back indicates a combine usage of array if (_tempTarget >2) { // then it is player 2 targets_[2] = 1; //1 is player2 as index start from 0, 3rd element [2] of this array store defending player. }//actually no need to use targets_2 because we check _tempTarget at all skill. if >2 means Opponents/player 2 //targets_[0] will use at attacking unit, and targets_[1] use as defending target unit later. // //uint SkillNumber; //-------------------------SKILL START------------------------------------------------- // _____ _ _______ _ _ _____ // / ____| |/ /_ _| | | | / ____| // | (___ | ' / | | | | | | | (___ // \___ \| < | | | | | | \___ \ // ____) | . \ _| |_| |____| |____ ____) | // |_____/|_|\_\_____|______|______|_____/ //------------------------------------------------------------------------------------ if (SkillNumber == 0) { //powerful normal attack _damage = ((UnitGroup[_ithUnit].attack+1) * 13) / 10; //130% //cannot less than 1, safemath not check if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } //-----------------------------------------------------ADD SKILL START HERE----------------------------------------------------- } else if (SkillNumber == 55){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 56){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 57){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 58){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 60){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 61){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 3,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 62){ //skill number , SINGLE TARGET //special: oppo target HP - 7500 targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: //******** no damage first only reaction. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } _damage += 7500; //then add 7500 here if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 63){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 64){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 3,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 66){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 67){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 68){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 69){ //skill number , SINGLE TARGET //atk*3. if have reaction damage, atk*5 instead targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage += _reactionDamage; if (_damage > 1) { //if have reaction damage (only light and dark dont have) _damage += ((UnitGroup[_ithUnit].attack+1) * 50) / 10; //******** _skill damage display seperately with element color. } else { _damage += ((UnitGroup[_ithUnit].attack+1) * 30) / 10; //******** _skill damage display seperately with element color. } if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 70){ //skill number 1 is Youpling, Consider AOE //special: atk*2.5, if have element onself, clear & atk*0.8 instead for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: if (UnitReaction[_ithUnit] > 0) { //if self have element _damage = ((UnitGroup[_ithUnit].attack+1) * 8) / 10; //80% //******** _skill damage display seperately with element color. } else { //if no element on self _damage = ((UnitGroup[_ithUnit].attack+1) * 25) / 10; //250% //******** _skill damage display seperately with element color. } _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } UnitReaction[_ithUnit] = 0; //clear eleemnt on self after attack } else if (SkillNumber == 71){ //skill number , SINGLE TARGET //atk*2.5, then oppo def - 30% targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 2,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } UnitGroup[_tempTarget].defense = ((UnitGroup[_tempTarget].defense+1)*75) /100; //reduce 25% } else if (SkillNumber == 72){ //skill number 1 is Youpling, Consider AOE //special : atk*1.8, all allies def + 20% for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 18) / 10; //220% //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } for (uint i = 0; i < 3; i++) { if (_tempTarget > 2) { //reverse, target allies targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement UnitGroup[targets_[1]].defense = (UnitGroup[targets_[1]].defense*12) / 10; //+20% } } } else if (SkillNumber == 73){ //skill number 1 is Youpling, Consider AOE //atk*1.5, if self have eletric, atk*3 for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: if (UnitReaction[_ithUnit] == 4) { //if somehow has electric element on self _damage = ((UnitGroup[_ithUnit].attack+1) * 30) / 10; //300% //******** _skill damage display seperately with element color. } else { _damage = ((UnitGroup[_ithUnit].attack+1) * 15) / 10; //150% //******** _skill damage display seperately with element color. } _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 74){ //skill number 1 is Youpling, Consider AOE //atk*1, all oppo speed -10% for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 10) / 10; //100% //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } UnitGroup[targets_[1]].speed = ((UnitGroup[targets_[1]].speed+1)*9)/10; //speed -10% } } } else if (SkillNumber == 75){ //skill number //atk*2.5, if oppo has Ice element, atk*4 targets_[0] = _ithUnit; targets_[1] = _tempTarget; //set damage first to not influence by element reaction if (UnitReaction[targets_[1]] == 3) { //oppo has ice _damage = ((UnitGroup[_ithUnit].attack+1) * 40) / 10; //******** _skill damage display seperately with element color. } else { _damage = ((UnitGroup[_ithUnit].attack+1) * 25) / 10; //******** _skill damage display seperately with element color. } //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 2,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 76){ //skill number , SINGLE TARGET //atk*2.5, if self hp <6000, def+50% targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 25) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } if (UnitGroup[targets_[0]].hp < 6000) { UnitGroup[targets_[0]].defense = ((UnitGroup[targets_[0]].defense+1)*15)/10;//gain 50% defense if hp is low } } else if (SkillNumber == 77){ //skill number 1 is Youpling, Consider AOE //atk*2.5, oppo get light for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 6,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 25) / 10; //250% //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 78){ //skill number 1 is Youpling, Consider AOE //atk*1.5, if oppo has light, atk*2.4 for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive //need to check element first before reaction if (UnitReaction[targets_[1]] == 6) { _damage = ((UnitGroup[_ithUnit].attack+1) * 24) / 10; //240% //******** _skill damage display seperately with element color. } else { _damage = ((UnitGroup[_ithUnit].attack+1) * 15) / 10; //150% //******** _skill damage display seperately with element color. } targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 79){ //skill number , SINGLE TARGET //self hp * 0.4 + oppo hp*0.4 , (cap self atk*6) targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 2,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = (((UnitGroup[_ithUnit].hp+1) * 4) / 10) + (((UnitGroup[_tempTarget].hp+1) * 4) / 10); //******** if (_damage > UnitGroup[_ithUnit].attack*6 ){ _damage = UnitGroup[_ithUnit].attack*6; } _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 80){ //skill number , SINGLE TARGET //atk*2 , if self HP != either leader HP, atk*4 targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: if (UnitGroup[_ithUnit].hp != UnitGroup[0].hp && UnitGroup[_ithUnit].hp != UnitGroup[3].hp ) { _damage = ((UnitGroup[_ithUnit].attack+1) * 40) / 10; //******** _skill damage display seperately with element color. } else { _damage = ((UnitGroup[_ithUnit].attack+1) * 20) / 10; //******** _skill damage display seperately with element color. } _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 81){ //skill number , SINGLE TARGET //atk*2 + spd*5 targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = (((UnitGroup[_ithUnit].attack+1) * 20) / 10) + ((UnitGroup[_ithUnit].speed+1) * 5); //******** _skill damage _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 82){ //skill number , SINGLE TARGET //enemy def -20% first, atk*3 targets_[0] = _ithUnit; targets_[1] = _tempTarget; UnitGroup[_tempTarget].defense = (UnitGroup[_tempTarget].defense+1)*8/10; //target -20% defense first before reaction //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 3,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 30) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 83){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 84){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 85){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 86){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 87){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 88){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 89){ //skill number , SINGLE TARGET < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT targets_[0] = _ithUnit; targets_[1] = _tempTarget; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 6,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[_tempTarget].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[_tempTarget].defense; } if (_damage > UnitGroup[_tempTarget].hp) { //safemath UnitGroup[_tempTarget].hp =0; } else { UnitGroup[_tempTarget].hp -= _damage; } } else if (SkillNumber == 90){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 91){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 7,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 92){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 93){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 94){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 95){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 1,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 96){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 5,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 97){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 4,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 98){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 2,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } else if (SkillNumber == 99){ //skill number 1 is Youpling, Consider AOE < CHECK ELEMENT>DELETE THIS IF ELEMENT CORRECT for (uint i = 0; i < 3; i++) { if (_tempTarget <= 2) { targets_[1] = i; // Loop targets_[2] as 0, 1, 2 } else { targets_[1] = i + 3; // Loop targets_[2] as 3, 4, 5 } if (UnitGroup[targets_[1]].hp!=0){ //unit must be alive targets_[0] = _ithUnit; //0=NoElement, 1=Fire, 2=Water, 3=Ice, 4=Electric, 5=Nature, 6=Light, 7=Dark (UnitGroup,UnitReaction,UnitFocus,TimeConsume,_reactionDamage)=SkillReaction(UnitGroup,UnitReaction,UnitFocus,TimeConsume, 6,targets_); //****** _reactionDamage need to display seperately in game with different color based on reaction /less saturated color //SKILL damage: _damage = ((UnitGroup[_ithUnit].attack+1) * 22) / 10; //220% //******** _skill damage display seperately with element color. _damage += _reactionDamage; if (UnitGroup[targets_[1]].defense >= _damage) { //safemath _damage = 1; } else { _damage = _damage - UnitGroup[targets_[1]].defense; } if (_damage > UnitGroup[targets_[1]].hp) { //safemath UnitGroup[targets_[1]].hp =0; } else { UnitGroup[targets_[1]].hp -= _damage; } } } } } function SkillReaction (S.Unit[6] memory _UnitGroup, uint[6] memory _UnitReaction, uint[6] memory _UnitFocus, uint[6] memory _TimeConsume, uint _AtkElement, uint[3] memory _targets_) private pure returns(S.Unit[6] memory UnitGroup,uint[6] memory UnitReaction,uint[6] memory UnitFocus, uint[6] memory TimeConsume, uint damage ) { UnitGroup = _UnitGroup; UnitReaction = _UnitReaction; UnitFocus = _UnitFocus; TimeConsume = _TimeConsume; uint _ithUnit = _targets_[0]; uint _tempTarget = _targets_[1]; //uint _tempPlayer = _targets_[2]; if (UnitReaction[_tempTarget] == 0 || UnitReaction[_tempTarget] == _AtkElement) { //means it has no reaction, place one for it. UnitReaction[_tempTarget] = _AtkElement; } else { //Unit has Element UnitReaction[_tempTarget] = (UnitReaction[_tempTarget]*10) + _AtkElement; //this is to encode for later use, imagine 12 and 21 also means Fire<->Water reaction if (UnitReaction[_tempTarget] == 12 ||UnitReaction[_tempTarget] == 21 ){ //Fire<->Water | Vaporize //Damage +0.3x HP_of_TriggerUnit damage = (UnitGroup[_ithUnit].hp+1) * 3 / 10; UnitReaction[_tempTarget] =0; //Conductive and Ignite need retain. } else if (UnitReaction[_tempTarget] == 13 ||UnitReaction[_tempTarget] == 31 ) { //Fire<->Ice | Melt //Damage +2x Defense_of_TriggerUnit damage = (UnitGroup[_ithUnit].defense+1) * 2; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 14 ||UnitReaction[_tempTarget] == 41 ) { //Fire<->Electric | Flare //Damage +1x Attack_of_TriggerUnit damage = UnitGroup[_ithUnit].attack; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 15 ||UnitReaction[_tempTarget] == 51 ) { //Fire<->Nature | Ignite //Damage +0.5x Attack_of_TriggerUnit, Retain Fire element damage = (UnitGroup[_ithUnit].attack+1) * 2 / 10; UnitReaction[_tempTarget] =1; } else if (UnitReaction[_tempTarget] == 16 ||UnitReaction[_tempTarget] == 61 ) { //Fire<->Light | Holy //Target current Attack +30% (stackable, round down) UnitGroup[_tempTarget].attack = ((UnitGroup[_tempTarget].attack+1) * 13) / 10; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 17 ||UnitReaction[_tempTarget] == 71 ) { //Fire<->Dark | Exhaust //Target current Attack -30% (stackable, round down) UnitGroup[_tempTarget].attack = ((UnitGroup[_tempTarget].attack+1) * 7) / 10; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 23 ||UnitReaction[_tempTarget] == 32 ) { //Water<->Ice | Frost //stop 1 turn, retain Ice Element TimeConsume[_tempTarget] += (100000/UnitGroup[_tempTarget].speed); UnitReaction[_tempTarget] =3; } else if (UnitReaction[_tempTarget] == 24 ||UnitReaction[_tempTarget] == 42 ) { //Water<->Electric | Conduct //Damage +1x Speed_of_TriggerUnit, Retain Electric element damage = UnitGroup[_ithUnit].speed; UnitReaction[_tempTarget] =4; } else if (UnitReaction[_tempTarget] == 25 ||UnitReaction[_tempTarget] == 52 ) { //Water<->Nature | Entangle //stop 1 turn, retain Nature Element TimeConsume[_tempTarget] += (100000/UnitGroup[_tempTarget].speed); UnitReaction[_tempTarget] =5; } else if (UnitReaction[_tempTarget] == 26 ||UnitReaction[_tempTarget] == 62 ) { //Water<->Light | Grow //Target current HP +25% (stackable, round down) UnitGroup[_tempTarget].hp = ((UnitGroup[_tempTarget].hp+1) * 125) / 100; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 27 ||UnitReaction[_tempTarget] == 72 ) { //Water<->Dark | Dehydration //Target current HP -25% (stackable, round down) if ( ((UnitGroup[_tempTarget].hp+1) * 25)/100 > 9999){ UnitGroup[_tempTarget].hp -= 9999; } else { UnitGroup[_tempTarget].hp = ((UnitGroup[_tempTarget].hp+1) * 75) / 100; } UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 34 ||UnitReaction[_tempTarget] == 43 ) { //Ice<->Electric | Spark //Target current Defense -30% (stackable, round down) retain electric UnitGroup[_tempTarget].defense = ((UnitGroup[_tempTarget].defense+1) * 7) / 10; UnitReaction[_tempTarget] =4; } else if (UnitReaction[_tempTarget] == 35 ||UnitReaction[_tempTarget] == 53 ) { //Ice<->Nature | Chill //stop 1 turn, SkillStrategy reset to 0. TimeConsume[_tempTarget] += (100000/UnitGroup[_tempTarget].speed); UnitFocus[_tempTarget] = 0; UnitReaction[_tempTarget] = 0; } else if (UnitReaction[_tempTarget] == 36 ||UnitReaction[_tempTarget] == 63 ) { //Ice<->Light | Radiant //Target current Defense +30% (stackable, round down) UnitGroup[_tempTarget].defense = ((UnitGroup[_tempTarget].defense+1) * 13) / 10; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 37 ||UnitReaction[_tempTarget] == 73 ) { //Ice<-> Dark | Dizzy //Target current Defense -50% (stackable, round down) UnitGroup[_tempTarget].defense = ((UnitGroup[_tempTarget].defense+1) * 5) / 10; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 45 ||UnitReaction[_tempTarget] == 54 ) { //Electric<->Nature | Overgrowth //Damage +2x Intelligence_of_TriggerUnit damage = UnitGroup[_ithUnit].intelligence*2; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 46 ||UnitReaction[_tempTarget] == 64 ) { //Electric<->Light | Reflect //Target current Speed +30% (stackable, round down) UnitGroup[_tempTarget].speed = ((UnitGroup[_tempTarget].speed+1) * 13) / 10; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 47 ||UnitReaction[_tempTarget] == 74 ) { //Electric<->Dark | Pressure //Target current Speed -30% (stackable, round down) UnitGroup[_tempTarget].speed = ((UnitGroup[_tempTarget].speed+1) * 7) / 10; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 56 ||UnitReaction[_tempTarget] == 65 ) { //Nature<->Light | Blossom //Target current Intelligence +30% (stackable, round down) UnitGroup[_tempTarget].intelligence = ((UnitGroup[_tempTarget].intelligence+1) * 13) / 10; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 57 ||UnitReaction[_tempTarget] == 75 ) { //Nature<->Dark | Drain //Target current Intelligence -30% (stackable, round down) UnitGroup[_tempTarget].intelligence = ((UnitGroup[_tempTarget].intelligence+1) * 7) / 10; UnitReaction[_tempTarget] =0; } else if (UnitReaction[_tempTarget] == 67 ||UnitReaction[_tempTarget] == 76 ) { //Light<->Dark | Neutralize //Remove All Elements UnitReaction[_tempTarget] = 0; } } } } // File: FINALdeployFA/MAIN - BattleSystemV4.sol pragma solidity ^0.8.18; //_______________________________________________________________ // ___ __ __ _ ___ _ ___ _ __ // | _ )\ \ / / _ | | / _ \ _ | | / _ \ (_)\ \ // | _ \ \ V / | || || (_) || || || (_) | _ | | // |___/ |_| \__/ \___/ \__/ \___/ ( ) | | // |/ /_/ //_______________________________________________________________ //V4 added weather system. contract FARPG_BattleV4 is Ownable { bool public confirmed; uint constant NormalAttackEffort = 500; uint forceGas; event BattleResultV2(uint BattleRhythm, uint bit, bool Won, uint randret);//this is facing LView only. Facing Unity need emit S.Unit[6] constructor() { } //_______________________________________________________________ // _ ___ __ __ ___ _ _ // /_\ | \ | \/ ||_ _|| \| | // / _ \ | |) || |\/| | | | | .` | // /_/ \_\|___/ |_| |_||___||_|\_| //_______________________________________________________________ ////////////////////////////////////////////////Advanced Master Contract//////////////////////////////////////////////////////////////////// address[50] public masterContracts; //these are the contract able to control the variables. mapping(address => uint) public masterIndex; modifier onlyMasterContract() { //---this modifier is to make sure mastercontract able to control the data require(masterContracts[masterIndex[msg.sender]] == msg.sender, "Only allowed for master contracts"); _; } function addMasterContract(address _address, uint _index) public onlyOwner { require(_index >0 && _index < 50, "Index out of bounds"); // Ensure index is within array bounds require(_address != address(0), "Invalid address"); // Ensure valid address // Check if the index already has an address address existingAddress = masterContracts[_index]; if (existingAddress != address(0)) { // Reset the index of the existing address to 0 masterIndex[existingAddress] = 0; } // Assign the new address to the array and update the mapping masterContracts[_index] = _address; masterIndex[_address] = _index; // Update the mapping with the new address's index } function addMasterContractBatch(address[] memory _addresses, uint[] memory _indices) public onlyOwner { require(_addresses.length == _indices.length, "Mismatched input lengths"); // Ensure arrays are the same length for (uint i = 0; i < _addresses.length; i++) { addMasterContract(_addresses[i], _indices[i]); // Reuse the existing function } } function removeMasterContract(uint _index) public onlyOwner { require(_index < 50, "Index out of bounds"); // Ensure index is within array bounds address contractToRemove = masterContracts[_index]; require(contractToRemove != address(0), "No contract at this index"); // Ensure there is a contract to remove // reset the address from the array and mapping masterContracts[_index] = address(0); masterIndex[contractToRemove] = 0; } function getAllMasterContracts() public view returns (address[] memory, uint[] memory) { address[] memory contracts = new address[](50); uint[] memory indices = new uint[](50); for (uint i = 0; i < 50; i++) { contracts[i] = masterContracts[i]; if (masterContracts[i] != address(0)) { indices[i] = masterIndex[masterContracts[i]]; } else { indices[i] = 0; } } return (contracts, indices); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //_______________________________________________________________ // ___ _____ _ ___ _____ // / __||_ _|/_\ | _ \|_ _| // \__ \ | | / _ \ | / | | // |___/ |_|/_/ \_\|_|_\ |_| //_______________________________________________________________ function BattleV4_3v3 (S.Unit[6] memory _UnitGroup) public onlyMasterContract returns (uint BattleRhythm, uint bit, bool Won, uint randret){ S.Unit[6] memory UnitGroup = _UnitGroup; uint rand = (uint(keccak256(abi.encodePacked(block.timestamp, block.prevrandao)))&65535)+5082; randret = rand; //rand += rand>>5; //rand%10<x uint[6] memory TimeConsume; //[0]=Player1, [1]=Player2 | The more the TimeConsume, move first. Attack/Skill will gain more opponent Readiness uint UnitLeft; // use 10 to indicate ended. uint[6] memory UnitFocus; //if reach 1000, it will use skill and -1000. Gain by INT and start with 500. uint[6] memory UnitReaction; uint[6] memory genericUint; //genericUint due to stack too deep. [0]=_damage, [1]=AttackingUnitSlot, [2]=LowestTimeConsume //uint playerOffset; (genericUint[3] is playerOffset //uint _dice; (genericUint [4] is _dice (to solve stack too deep) //uint[5] is SkillNumber uint temptarget; forceGas = 1; //...Condition for Unit left Alive... if (UnitGroup[0].hp > 0) {UnitLeft++;} //else {revert("Need to have a leader.");} if (UnitGroup[1].hp > 0) {UnitLeft++;} if (UnitGroup[2].hp > 0) {UnitLeft++;} require(UnitLeft > 0, "Team1 need to have at least 1 unit"); UnitLeft = 0; if (UnitGroup[3].hp > 0) {UnitLeft++;} //else {revert("Need to have a leader.");} if (UnitGroup[4].hp > 0) {UnitLeft++;} if (UnitGroup[5].hp > 0) {UnitLeft++;} require(UnitLeft > 0, "Team2 need to have at least 1 unit"); //UNIT GENE NEED TO ADD FOCUS HERE // UnitFocus loop here //...Start Battle... UnitFocus[0]=UnitGroup[0].genestrength*50; UnitFocus[1]=UnitGroup[1].genestrength*50; UnitFocus[2]=UnitGroup[2].genestrength*50; UnitFocus[3]=UnitGroup[3].genestrength*50; UnitFocus[4]=UnitGroup[4].genestrength*50; UnitFocus[5]=UnitGroup[5].genestrength*50; if (UnitGroup[0].speed ==0) { TimeConsume[0]=100000;} else {TimeConsume[0]=100000/UnitGroup[0].speed;} if (UnitGroup[1].speed ==0) { TimeConsume[1]=100000;} else {TimeConsume[1]=100000/UnitGroup[1].speed;} if (UnitGroup[2].speed ==0) { TimeConsume[2]=100000;} else {TimeConsume[2]=100000/UnitGroup[2].speed;} if (UnitGroup[3].speed ==0) { TimeConsume[3]=100000;} else {TimeConsume[3]=100000/UnitGroup[3].speed;} if (UnitGroup[4].speed ==0) { TimeConsume[4]=100000;} else {TimeConsume[4]=100000/UnitGroup[4].speed;} if (UnitGroup[5].speed ==0) { TimeConsume[5]=100000;} else {TimeConsume[5]=100000/UnitGroup[5].speed;} // _ _ _ // __ _____ _ _ __(_)___ _ _ | | | // \ V / -_) '_(_-< / _ \ ' \ |_ _| // \_/\___|_| /__/_\___/_||_| |_| // while (bit <=209 && UnitLeft != 10 ) { //End at 210 bit, 7 bit x 30 action, Unitleft = 10 is a magic number indicator for stop //temp //... //--------------------VERSION 4 INDEPENDENT READINESS:---------------------- genericUint[2]=100000; //LowestTimeConsume now genericUint[1]=0; //AttackingUnitIndex //Find index who consume the least time, consumed lowest time one attack first for (uint i = 0; i < 6; i++) { if (TimeConsume[i] < genericUint[2] && UnitGroup[i].hp>0) { genericUint[2] = TimeConsume[i]; genericUint[1] = i; } } //-------------------------------------------------------------------------- if (genericUint[1]<3 ) { // Whoever ready first, move (genericUint[1] = 0,1,2 means player 1 unit) genericUint[3] = 0; //Player1 } else { genericUint[3] = 3; //Player2 } // Start to loop each unit within the team // for (uint i = 0+genericUint[3]; i < 3+genericUint[3]; i++) { if (UnitGroup[genericUint[1]].hp > 0) { //attacking unit is alive UnitLeft =1; //means attacking player still has unit alive bit+=7; //assume surely take an action BattleRhythm = BattleRhythm<<3; BattleRhythm += genericUint[1];//attacking unit slot //attack UnitFocus[genericUint[1]] += UnitGroup[genericUint[1]].intelligence; if (UnitFocus[genericUint[1]] >= 1000) { UnitFocus[genericUint[1]] -= 1000; //------------------------------ Use Skill here---------------------------------------------- BattleRhythm = BattleRhythm<<1; BattleRhythm++; //1= useskill rand += rand>>5; genericUint[4] = rand%10; if (genericUint[4] < 2) {//20% //===========================attack order 2,1,0|5,4,3========================= temptarget= (5 + genericUint[3])%6; if (UnitGroup[temptarget].hp == 0) {temptarget= (4 + genericUint[3])%6;} if (UnitGroup[temptarget].hp == 0) {temptarget= (3 + genericUint[3])%6;} if (UnitGroup[temptarget].hp == 0) {UnitLeft =0;bit-=7;BattleRhythm>>=3;} //all dead } else if (genericUint[4] <4) { //20% //===========================attack order 1,2,0|4,5,3=========================== temptarget= (4 + genericUint[3])%6; if (UnitGroup[temptarget].hp == 0) {temptarget= (5 + genericUint[3])%6;} if (UnitGroup[temptarget].hp == 0) {temptarget= (3 + genericUint[3])%6;} if (UnitGroup[temptarget].hp == 0) {UnitLeft =0;bit-=7;BattleRhythm>>=3;} //all dead } else if (genericUint[4] <7) { //30% //===========================attack order 0,1,2|3,4,5=========================== temptarget= (3 + genericUint[3])%6; if (UnitGroup[temptarget].hp == 0) {temptarget= (4 + genericUint[3])%6;} if (UnitGroup[temptarget].hp == 0) {temptarget= (5 + genericUint[3])%6;} if (UnitGroup[temptarget].hp == 0) {UnitLeft =0;bit-=7;BattleRhythm>>=3;} //all dead } else { //30% //===========================attack order 0,2,1|3,5,4=========================== temptarget= (3 + genericUint[3])%6; if (UnitGroup[temptarget].hp == 0) {temptarget= (5 + genericUint[3])%6;} if (UnitGroup[temptarget].hp == 0) {temptarget= (4 + genericUint[3])%6;} if (UnitGroup[temptarget].hp == 0) {UnitLeft =0;bit-=7;BattleRhythm>>=3;} //all dead } //should check target unit dead here? so that dont have to repeat //genericUint[5] is Skill Number //100000 offset to toggle used last turn if (UnitLeft>0) { if (UnitGroup[genericUint[1]].special > 0 && UnitGroup[genericUint[1]].special < 100000) { //has a special skill and never used genericUint[5] = UnitGroup[genericUint[1]].special; //use special skill UnitGroup[genericUint[1]].special += 100000; //offset it so that dont use next turn. If has special, sure has ranged. } else if (UnitGroup[genericUint[1]].range > 0 && UnitGroup[genericUint[1]].range < 100000){ //has a ranged skill, and never used genericUint[5] = UnitGroup[genericUint[1]].range; //use range skill if (UnitGroup[genericUint[1]].special > 100000){ //means has Special Skill and used previously, Not Mature stage UnitGroup[genericUint[1]].special -= 100000; //remove 100000 so that next turn will use Special } } else { //this unit doesn't have special or ranged, then use powerful normal attack. genericUint[5] = 0; } if (genericUint[5] <= 54) { //skill library too large, so divided into 2 library (UnitGroup,UnitFocus,UnitReaction, TimeConsume) = SK1.UnitSkills (UnitGroup, UnitFocus, UnitReaction, genericUint[1], temptarget, TimeConsume, genericUint[5]); } else { (UnitGroup,UnitFocus,UnitReaction, TimeConsume) = SK2.UnitSkills (UnitGroup, UnitFocus, UnitReaction, genericUint[1], temptarget, TimeConsume, genericUint[5]); } } //no. now we wont know whether it is aoe. temptargetwill still return if it is AOE BattleRhythm = BattleRhythm<<3; BattleRhythm+=temptarget; } else { //---- ------------------------Normal Attack here------------------------------------------------ BattleRhythm = BattleRhythm<<1; //BattleRhythm++; //0= normal attack //(UnitGroup,TimeConsume,rand) = normalAttack(i, UnitGroup,TimeConsume,rand); //..try reduce gas.... rand += rand>>5; genericUint[4] = rand%10; if (genericUint[4] < 2) {//20% //===========================attack order 2,1,0|5,4,3========================= temptarget= (5 + genericUint[3])%6; if (UnitGroup[temptarget].hp == 0) {temptarget= (4 + genericUint[3])%6;} if (UnitGroup[temptarget].hp == 0) {temptarget= (3 + genericUint[3])%6;} if (UnitGroup[temptarget].hp == 0) {UnitLeft =0;bit-=7;BattleRhythm>>=3;} //all dead } else if (genericUint[4] <4) { //20% //===========================attack order 1,2,0|4,5,3=========================== temptarget= (4 + genericUint[3])%6; if (UnitGroup[temptarget].hp == 0) {temptarget= (5 + genericUint[3])%6;} if (UnitGroup[temptarget].hp == 0) {temptarget= (3 + genericUint[3])%6;} if (UnitGroup[temptarget].hp == 0) {UnitLeft =0;bit-=7;BattleRhythm>>=3;} //all dead } else if (genericUint[4] <7) { //30% //===========================attack order 0,1,2|3,4,5=========================== temptarget= (3 + genericUint[3])%6; if (UnitGroup[temptarget].hp == 0) {temptarget= (4 + genericUint[3])%6;} if (UnitGroup[temptarget].hp == 0) {temptarget= (5 + genericUint[3])%6;} if (UnitGroup[temptarget].hp == 0) {UnitLeft =0;bit-=7;BattleRhythm>>=3;} //all dead } else { //30% //===========================attack order 0,2,1|3,5,4=========================== temptarget= (3 + genericUint[3])%6; if (UnitGroup[temptarget].hp == 0) {temptarget= (5 + genericUint[3])%6;} if (UnitGroup[temptarget].hp == 0) {temptarget= (4 + genericUint[3])%6;} if (UnitGroup[temptarget].hp == 0) {UnitLeft =0;bit-=7;BattleRhythm>>=3;} //all dead } // Normal Attack start after choosing target if(UnitLeft >0) { //there is still UnitLeft for battle at this moment, either attacking or defending unit. BattleRhythm = BattleRhythm<<3; BattleRhythm+=temptarget; // if (UnitGroup[temptarget].defense >= UnitGroup[genericUint[1]].attack) { //safemath genericUint[0] = 1; } else { genericUint[0] = UnitGroup[genericUint[1]].attack - UnitGroup[temptarget].defense; } if (genericUint[0] > UnitGroup[temptarget].hp) { //safemath UnitGroup[temptarget].hp =0; } else { UnitGroup[temptarget].hp -= genericUint[0]; } } } } // } //finished attack, so added time consume if (UnitGroup[genericUint[1]].speed ==0) { TimeConsume[genericUint[1]]=100000; } else { TimeConsume[genericUint[1]]+=100000/UnitGroup[genericUint[1]].speed; } // After a player's turn, conclude to proceed. if (UnitLeft == 0) { //of no unit left for attacked player, set to 10 to end //end battle. UnitLeft = 10; // =10 then condition check on While loop will stop. } else { UnitLeft = 0;//reset for Player2 to move next iteration //since player 1[0] has moved due to higher speed, then increase player2[1] TimeConsume[1] to take turns } } //end while (after many turns) if ((UnitGroup[0].hp + UnitGroup[1].hp + UnitGroup[2].hp) > (UnitGroup[3].hp+UnitGroup[4].hp+UnitGroup[5].hp)) { Won = true; } //if player 1 more total hp than team 2, then consider win. }//function end }//contract end
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"BattleRhythm","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bit","type":"uint256"},{"indexed":false,"internalType":"bool","name":"Won","type":"bool"},{"indexed":false,"internalType":"uint256","name":"randret","type":"uint256"}],"name":"BattleResultV2","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"components":[{"internalType":"uint256","name":"hp","type":"uint256"},{"internalType":"uint256","name":"attack","type":"uint256"},{"internalType":"uint256","name":"defense","type":"uint256"},{"internalType":"uint256","name":"speed","type":"uint256"},{"internalType":"uint256","name":"intelligence","type":"uint256"},{"internalType":"uint256","name":"genestrength","type":"uint256"},{"internalType":"uint256","name":"range","type":"uint256"},{"internalType":"uint256","name":"special","type":"uint256"}],"internalType":"struct S.Unit[6]","name":"_UnitGroup","type":"tuple[6]"}],"name":"BattleV4_3v3","outputs":[{"internalType":"uint256","name":"BattleRhythm","type":"uint256"},{"internalType":"uint256","name":"bit","type":"uint256"},{"internalType":"bool","name":"Won","type":"bool"},{"internalType":"uint256","name":"randret","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"addMasterContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_indices","type":"uint256[]"}],"name":"addMasterContractBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllMasterContracts","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"masterContracts","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"masterIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"removeMasterContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052348015600e575f5ffd5b50601633601a565b6069565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611ed3806100765f395ff3fe608060405234801561000f575f5ffd5b50600436106100a6575f3560e01c80638da5cb5b1161006e5780638da5cb5b1461011f5780639d392e5b14610143578063a968991b1461017c578063b98b62441461019f578063cf7470fa146101b5578063f2fde38b146101c8575f5ffd5b80631e7a07a7146100aa57806354040610146100dc5780635d51b14c146100f1578063715018a6146101045780637a2a43c51461010c575b5f5ffd5b6100c96100b8366004611843565b60346020525f908152604090205481565b6040519081526020015b60405180910390f35b6100ef6100ea366004611863565b6101db565b005b6100ef6100ff36600461187a565b6102dd565b6100ef610402565b6100ef61011a36600461199e565b610415565b5f546001600160a01b03165b6040516001600160a01b0390911681526020016100d3565b610156610151366004611a61565b6104c2565b6040805194855260208501939093529015159183019190915260608201526080016100d3565b5f5461018f90600160a01b900460ff1681565b60405190151581526020016100d3565b6101a7611578565b6040516100d3929190611b24565b61012b6101c3366004611863565b6116ca565b6100ef6101d6366004611843565b6116e9565b6101e3611762565b6032811061022e5760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b60448201526064015b60405180910390fd5b5f6002826032811061024257610242611bad565b01546001600160a01b031690508061029c5760405162461bcd60e51b815260206004820152601960248201527f4e6f20636f6e7472616374206174207468697320696e646578000000000000006044820152606401610225565b5f600283603281106102b0576102b0611bad565b0180546001600160a01b0319166001600160a01b03928316179055165f9081526034602052604081205550565b6102e5611762565b5f811180156102f45750603281105b6103365760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b6044820152606401610225565b6001600160a01b03821661037e5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610225565b5f6002826032811061039257610392611bad565b01546001600160a01b0316905080156103be576001600160a01b0381165f908152603460205260408120555b82600283603281106103d2576103d2611bad565b0180546001600160a01b0319166001600160a01b03928316179055929092165f9081526034602052604090205550565b61040a611762565b6104135f6117bb565b565b61041d611762565b805182511461046e5760405162461bcd60e51b815260206004820152601860248201527f4d69736d61746368656420696e707574206c656e6774687300000000000000006044820152606401610225565b5f5b82518110156104bd576104b583828151811061048e5761048e611bad565b60200260200101518383815181106104a8576104a8611bad565b60200260200101516102dd565b600101610470565b505050565b335f818152603460205260408120549091829182918291600290603281106104ec576104ec611bad565b01546001600160a01b03161461054e5760405162461bcd60e51b815260206004820152602160248201527f4f6e6c7920616c6c6f77656420666f72206d617374657220636f6e74726163746044820152607360f81b6064820152608401610225565b60408051426020820152449181019190915285905f9060600160408051601f19818403018152919052805160209091012061058f9061ffff166113da611bd5565b905080925061059c61180a565b5f6105a561180a565b6105ad61180a565b6105b561180a565b600180558651515f90156105d157846105cd81611bee565b9550505b602088015151156105ea57846105e681611bee565b9550505b6040880151511561060357846105ff81611bee565b9550505b5f851161065d5760405162461bcd60e51b815260206004820152602260248201527f5465616d31206e65656420746f2068617665206174206c65617374203120756e6044820152611a5d60f21b6064820152608401610225565b6060880151515f955015610679578461067581611bee565b9550505b60808801515115610692578461068e81611bee565b9550505b60a088015151156106ab57846106a781611bee565b9550505b5f85116107055760405162461bcd60e51b815260206004820152602260248201527f5465616d32206e65656420746f2068617665206174206c65617374203120756e6044820152611a5d60f21b6064820152608401610225565b875160a00151610716906032611c06565b8452602088015160a0015161072c906032611c06565b6020850152604088015160a00151610745906032611c06565b6040850152606088015160a0015161075e906032611c06565b6060850152608088015160a00151610777906032611c06565b608085015260a080890151015161078f906032611c06565b60a08501528751606001515f036107ab57620186a086526107c1565b8751606001516107be90620186a0611c31565b86525b6020880151606001515f036107de57620186a060208701526107fa565b6020880151606001516107f490620186a0611c31565b60208701525b6040880151606001515f0361081757620186a06040870152610833565b60408801516060015161082d90620186a0611c31565b60408701525b60608089015101515f0361084f57620186a0606087015261086a565b606080890151015161086490620186a0611c31565b60608701525b6080880151606001515f0361088757620186a060808701526108a3565b60808801516060015161089d90620186a0611c31565b60808701525b60a0880151606001515f036108c057620186a060a08701526108dc565b60a0880151606001516108d690620186a0611c31565b60a08701525b60d18b111580156108ee575084600a14155b1561151557620186a060408301525f602083018190525b600681101561098357604083015187826006811061092557610925611bad565b602002015110801561094d57505f89826006811061094557610945611bad565b602002015151115b1561097b5786816006811061096457610964611bad565b602002015183600260200201528083600160200201525b600101610905565b5060208201516003111561099c575f60608301526109a4565b600360608301525b5f888360016020020151600681106109be576109be611bad565b602002015151111561145757600194506109d960078c611bd5565b602083015160039d909d1b9c909b506109f2908d611bd5565b9b5087826001602002015160068110610a0d57610a0d611bad565b60200201516080015184836001602002015160068110610a2f57610a2f611bad565b60200201818151610a409190611bd5565b9052506103e884836001602002015160068110610a5f57610a5f611bad565b602002015110611071576103e884836001602002015160068110610a8557610a85611bad565b60200201818151610a969190611c44565b90525060019b909b1b9a8b610aaa81611bee565b9c50610abc9050600588901c88611bd5565b9650610ac9600a88611c57565b6080830181905260021115610bae576060820151600690610aeb906005611bd5565b610af59190611c57565b9050878160068110610b0957610b09611bad565b6020020151515f03610b35576060820151600690610b28906004611bd5565b610b329190611c57565b90505b878160068110610b4757610b47611bad565b6020020151515f03610b73576060820151600690610b66906003611bd5565b610b709190611c57565b90505b878160068110610b8557610b85611bad565b6020020151515f03610ba9575f9450610b9f60078c611c44565b9a5060038c901c9b505b610d77565b608082015160041115610c0b576060820151600690610bce906004611bd5565b610bd89190611c57565b9050878160068110610bec57610bec611bad565b6020020151515f03610b35576060820151600690610b28906005611bd5565b608082015160071115610ca6576060820151600690610c2b906003611bd5565b610c359190611c57565b9050878160068110610c4957610c49611bad565b6020020151515f03610c75576060820151600690610c68906004611bd5565b610c729190611c57565b90505b878160068110610c8757610c87611bad565b6020020151515f03610b73576060820151600690610b66906005611bd5565b6060820151600690610cb9906003611bd5565b610cc39190611c57565b9050878160068110610cd757610cd7611bad565b6020020151515f03610d03576060820151600690610cf6906005611bd5565b610d009190611c57565b90505b878160068110610d1557610d15611bad565b6020020151515f03610d41576060820151600690610d34906004611bd5565b610d3e9190611c57565b90505b878160068110610d5357610d53611bad565b6020020151515f03610d77575f9450610d6d60078c611c44565b9a5060038c901c9b505b8415611059575f88836001602002015160068110610d9757610d97611bad565b602002015160e00151118015610dd05750620186a088836001602002015160068110610dc557610dc5611bad565b602002015160e00151105b15610e37576020820151889060068110610dec57610dec611bad565b602002015160e001518260056020020152620186a088836001602002015160068110610e1a57610e1a611bad565b602002015160e001818151610e2f9190611bd5565b905250610f21565b5f88836001602002015160068110610e5157610e51611bad565b602002015160c00151118015610e8a5750620186a088836001602002015160068110610e7f57610e7f611bad565b602002015160c00151105b15610f1a576020820151889060068110610ea657610ea6611bad565b602002015160c001518260056020020152620186a088836001602002015160068110610ed457610ed4611bad565b602002015160e001511115610f1557620186a088836001602002015160068110610f0057610f00611bad565b602002015160e001818151610e2f9190611c44565b610f21565b5f60a08301525b60a0820151603610610fc557602082015160a083015160405163040eb9d160e01b81527374a4603e890192fdcc979315eb636185e71390d09263040eb9d192610f76928d928a928a9289918f91600401611c92565b61084060405180830381865af4158015610f92573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb69190611da6565b929a5091975094509250611059565b602082015160a083015160405163040eb9d160e01b8152734069e8aad36845d4e78188a4c36d840f8ab0b4969263040eb9d19261100e928d928a928a9289918f91600401611c92565b61084060405180830381865af415801561102a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104e9190611da6565b929a50919750945092505b60039b909b1b9a61106a818d611bd5565b9b50611457565b60019b909b1b9a611086600588901c88611bd5565b9650611093600a88611c57565b60808301819052600211156111785760608201516006906110b5906005611bd5565b6110bf9190611c57565b90508781600681106110d3576110d3611bad565b6020020151515f036110ff5760608201516006906110f2906004611bd5565b6110fc9190611c57565b90505b87816006811061111157611111611bad565b6020020151515f0361113d576060820151600690611130906003611bd5565b61113a9190611c57565b90505b87816006811061114f5761114f611bad565b6020020151515f03611173575f945061116960078c611c44565b9a5060038c901c9b505b611341565b6080820151600411156111d5576060820151600690611198906004611bd5565b6111a29190611c57565b90508781600681106111b6576111b6611bad565b6020020151515f036110ff5760608201516006906110f2906005611bd5565b6080820151600711156112705760608201516006906111f5906003611bd5565b6111ff9190611c57565b905087816006811061121357611213611bad565b6020020151515f0361123f576060820151600690611232906004611bd5565b61123c9190611c57565b90505b87816006811061125157611251611bad565b6020020151515f0361113d576060820151600690611130906005611bd5565b6060820151600690611283906003611bd5565b61128d9190611c57565b90508781600681106112a1576112a1611bad565b6020020151515f036112cd5760608201516006906112c0906005611bd5565b6112ca9190611c57565b90505b8781600681106112df576112df611bad565b6020020151515f0361130b5760608201516006906112fe906004611bd5565b6113089190611c57565b90505b87816006811061131d5761131d611bad565b6020020151515f03611341575f945061133760078c611c44565b9a5060038c901c9b505b84156114575760039b909b1b9a611358818d611bd5565b9b508782600160200201516006811061137357611373611bad565b60200201516020015188826006811061138e5761138e611bad565b602002015160400151106113a557600182526113ef565b8781600681106113b7576113b7611bad565b602002015160400151888360016020020151600681106113d9576113d9611bad565b6020020151602001516113ec9190611c44565b82525b87816006811061140157611401611bad565b6020020151518251111561142d575f88826006811061142257611422611bad565b602002015152611457565b815188826006811061144157611441611bad565b60200201518051611453908390611c44565b9052505b602082015188906006811061146e5761146e611bad565b6020020151606001515f036114a457620186a08683600160200201516006811061149a5761149a611bad565b60200201526114fd565b60208201518890600681106114bb576114bb611bad565b6020020151606001516114d190620186a0611c31565b60208301518790600681106114e8576114e8611bad565b602002018181516114f99190611bd5565b9052505b845f0361150d57600a94506108dc565b5f94506108dc565b60a08801515160808901515160608a0151516115319190611bd5565b61153b9190611bd5565b60408901515160208a0151518a51516115549190611bd5565b61155e9190611bd5565b111561156957600199505b50505050505050509193509193565b604080516032808252610660820190925260609182915f916020820161064080368337505060408051603280825261066082019092529293505f92915060208201610640803683370190505090505f5b60328110156116c057600281603281106115e4576115e4611bad565b015483516001600160a01b039091169084908390811061160657611606611bad565b6001600160a01b03909216602092830291909101909101525f6002826032811061163257611632611bad565b01546001600160a01b0316146116985760345f6002836032811061165857611658611bad565b01546001600160a01b0316815260208101919091526040015f2054825183908390811061168757611687611bad565b6020026020010181815250506116b8565b5f8282815181106116ab576116ab611bad565b6020026020010181815250505b6001016115c8565b5090939092509050565b600281603281106116d9575f80fd5b01546001600160a01b0316905081565b6116f1611762565b6001600160a01b0381166117565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610225565b61175f816117bb565b50565b5f546001600160a01b031633146104135760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610225565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040518060c001604052806006906020820280368337509192915050565b80356001600160a01b038116811461183e575f5ffd5b919050565b5f60208284031215611853575f5ffd5b61185c82611828565b9392505050565b5f60208284031215611873575f5ffd5b5035919050565b5f5f6040838503121561188b575f5ffd5b61189483611828565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051610100810167ffffffffffffffff811182821017156118da576118da6118a2565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611909576119096118a2565b604052919050565b5f67ffffffffffffffff82111561192a5761192a6118a2565b5060051b60200190565b5f82601f830112611943575f5ffd5b813561195661195182611911565b6118e0565b8082825260208201915060208360051b860101925085831115611977575f5ffd5b602085015b8381101561199457803583526020928301920161197c565b5095945050505050565b5f5f604083850312156119af575f5ffd5b823567ffffffffffffffff8111156119c5575f5ffd5b8301601f810185136119d5575f5ffd5b80356119e361195182611911565b8082825260208201915060208360051b850101925087831115611a04575f5ffd5b6020840193505b82841015611a2d57611a1c84611828565b825260209384019390910190611a0b565b9450505050602083013567ffffffffffffffff811115611a4b575f5ffd5b611a5785828601611934565b9150509250929050565b5f6106008284031215611a72575f5ffd5b82601f830112611a80575f5ffd5b60c0611a8b816118e0565b80610600850186811115611a9d575f5ffd5b855b81811015611b18576101008189031215611ab7575f5ffd5b611abf6118b6565b813581526020808301358183015260408084013590830152606080840135908301526080808401359083015260a08084013590830152868301358783015260e08084013590830152908552939093019261010001611a9f565b50909695505050505050565b604080825283519082018190525f9060208501906060840190835b81811015611b665783516001600160a01b0316835260209384019390920191600101611b3f565b5050838103602080860191909152855180835291810192508501905f5b81811015611ba1578251845260209384019390920191600101611b83565b50919695505050505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115611be857611be8611bc1565b92915050565b5f60018201611bff57611bff611bc1565b5060010190565b8082028115828204841417611be857611be8611bc1565b634e487b7160e01b5f52601260045260245ffd5b5f82611c3f57611c3f611c1d565b500490565b81810381811115611be857611be8611bc1565b5f82611c6557611c65611c1d565b500690565b805f5b6006811015611c8c578151845260209384019390910190600101611c6d565b50505050565b6108a0810181895f5b6006811015611d09578151805184526020810151602085015260408101516040850152606081015160608501526080810151608085015260a081015160a085015260c081015160c085015260e081015160e08501525061010083019250602082019150600181019050611c9b565b505050611d1a610600830189611c6a565b611d286106c0830188611c6a565b85610780830152846107a0830152611d446107c0830185611c6a565b8261088083015298975050505050505050565b5f82601f830112611d66575f5ffd5b611d7060c06118e0565b8060c0840185811115611d81575f5ffd5b845b81811015611d9b578051845260209384019301611d83565b509095945050505050565b5f5f5f5f6108408587031215611dba575f5ffd5b85601f860112611dc8575f5ffd5b60c0611dd3816118e0565b80610600880189811115611de5575f5ffd5b885b81811015611e6057610100818c031215611dff575f5ffd5b611e076118b6565b815181526020808301518183015260408084015190830152606080840151908301526080808401519083015260a08084015190830152868301518783015260e08084015190830152908552939093019261010001611de7565b50819750611e6e8a82611d57565b965050505050611e82866106c08701611d57565b9150611e92866107808701611d57565b90509295919450925056fea2646970667358221220524433e6869604e128b81d41b8fd95f345817686849ae30a63656da06efcfe1464736f6c634300081c0033
Deployed Bytecode
0x608060405234801561000f575f5ffd5b50600436106100a6575f3560e01c80638da5cb5b1161006e5780638da5cb5b1461011f5780639d392e5b14610143578063a968991b1461017c578063b98b62441461019f578063cf7470fa146101b5578063f2fde38b146101c8575f5ffd5b80631e7a07a7146100aa57806354040610146100dc5780635d51b14c146100f1578063715018a6146101045780637a2a43c51461010c575b5f5ffd5b6100c96100b8366004611843565b60346020525f908152604090205481565b6040519081526020015b60405180910390f35b6100ef6100ea366004611863565b6101db565b005b6100ef6100ff36600461187a565b6102dd565b6100ef610402565b6100ef61011a36600461199e565b610415565b5f546001600160a01b03165b6040516001600160a01b0390911681526020016100d3565b610156610151366004611a61565b6104c2565b6040805194855260208501939093529015159183019190915260608201526080016100d3565b5f5461018f90600160a01b900460ff1681565b60405190151581526020016100d3565b6101a7611578565b6040516100d3929190611b24565b61012b6101c3366004611863565b6116ca565b6100ef6101d6366004611843565b6116e9565b6101e3611762565b6032811061022e5760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b60448201526064015b60405180910390fd5b5f6002826032811061024257610242611bad565b01546001600160a01b031690508061029c5760405162461bcd60e51b815260206004820152601960248201527f4e6f20636f6e7472616374206174207468697320696e646578000000000000006044820152606401610225565b5f600283603281106102b0576102b0611bad565b0180546001600160a01b0319166001600160a01b03928316179055165f9081526034602052604081205550565b6102e5611762565b5f811180156102f45750603281105b6103365760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b6044820152606401610225565b6001600160a01b03821661037e5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610225565b5f6002826032811061039257610392611bad565b01546001600160a01b0316905080156103be576001600160a01b0381165f908152603460205260408120555b82600283603281106103d2576103d2611bad565b0180546001600160a01b0319166001600160a01b03928316179055929092165f9081526034602052604090205550565b61040a611762565b6104135f6117bb565b565b61041d611762565b805182511461046e5760405162461bcd60e51b815260206004820152601860248201527f4d69736d61746368656420696e707574206c656e6774687300000000000000006044820152606401610225565b5f5b82518110156104bd576104b583828151811061048e5761048e611bad565b60200260200101518383815181106104a8576104a8611bad565b60200260200101516102dd565b600101610470565b505050565b335f818152603460205260408120549091829182918291600290603281106104ec576104ec611bad565b01546001600160a01b03161461054e5760405162461bcd60e51b815260206004820152602160248201527f4f6e6c7920616c6c6f77656420666f72206d617374657220636f6e74726163746044820152607360f81b6064820152608401610225565b60408051426020820152449181019190915285905f9060600160408051601f19818403018152919052805160209091012061058f9061ffff166113da611bd5565b905080925061059c61180a565b5f6105a561180a565b6105ad61180a565b6105b561180a565b600180558651515f90156105d157846105cd81611bee565b9550505b602088015151156105ea57846105e681611bee565b9550505b6040880151511561060357846105ff81611bee565b9550505b5f851161065d5760405162461bcd60e51b815260206004820152602260248201527f5465616d31206e65656420746f2068617665206174206c65617374203120756e6044820152611a5d60f21b6064820152608401610225565b6060880151515f955015610679578461067581611bee565b9550505b60808801515115610692578461068e81611bee565b9550505b60a088015151156106ab57846106a781611bee565b9550505b5f85116107055760405162461bcd60e51b815260206004820152602260248201527f5465616d32206e65656420746f2068617665206174206c65617374203120756e6044820152611a5d60f21b6064820152608401610225565b875160a00151610716906032611c06565b8452602088015160a0015161072c906032611c06565b6020850152604088015160a00151610745906032611c06565b6040850152606088015160a0015161075e906032611c06565b6060850152608088015160a00151610777906032611c06565b608085015260a080890151015161078f906032611c06565b60a08501528751606001515f036107ab57620186a086526107c1565b8751606001516107be90620186a0611c31565b86525b6020880151606001515f036107de57620186a060208701526107fa565b6020880151606001516107f490620186a0611c31565b60208701525b6040880151606001515f0361081757620186a06040870152610833565b60408801516060015161082d90620186a0611c31565b60408701525b60608089015101515f0361084f57620186a0606087015261086a565b606080890151015161086490620186a0611c31565b60608701525b6080880151606001515f0361088757620186a060808701526108a3565b60808801516060015161089d90620186a0611c31565b60808701525b60a0880151606001515f036108c057620186a060a08701526108dc565b60a0880151606001516108d690620186a0611c31565b60a08701525b60d18b111580156108ee575084600a14155b1561151557620186a060408301525f602083018190525b600681101561098357604083015187826006811061092557610925611bad565b602002015110801561094d57505f89826006811061094557610945611bad565b602002015151115b1561097b5786816006811061096457610964611bad565b602002015183600260200201528083600160200201525b600101610905565b5060208201516003111561099c575f60608301526109a4565b600360608301525b5f888360016020020151600681106109be576109be611bad565b602002015151111561145757600194506109d960078c611bd5565b602083015160039d909d1b9c909b506109f2908d611bd5565b9b5087826001602002015160068110610a0d57610a0d611bad565b60200201516080015184836001602002015160068110610a2f57610a2f611bad565b60200201818151610a409190611bd5565b9052506103e884836001602002015160068110610a5f57610a5f611bad565b602002015110611071576103e884836001602002015160068110610a8557610a85611bad565b60200201818151610a969190611c44565b90525060019b909b1b9a8b610aaa81611bee565b9c50610abc9050600588901c88611bd5565b9650610ac9600a88611c57565b6080830181905260021115610bae576060820151600690610aeb906005611bd5565b610af59190611c57565b9050878160068110610b0957610b09611bad565b6020020151515f03610b35576060820151600690610b28906004611bd5565b610b329190611c57565b90505b878160068110610b4757610b47611bad565b6020020151515f03610b73576060820151600690610b66906003611bd5565b610b709190611c57565b90505b878160068110610b8557610b85611bad565b6020020151515f03610ba9575f9450610b9f60078c611c44565b9a5060038c901c9b505b610d77565b608082015160041115610c0b576060820151600690610bce906004611bd5565b610bd89190611c57565b9050878160068110610bec57610bec611bad565b6020020151515f03610b35576060820151600690610b28906005611bd5565b608082015160071115610ca6576060820151600690610c2b906003611bd5565b610c359190611c57565b9050878160068110610c4957610c49611bad565b6020020151515f03610c75576060820151600690610c68906004611bd5565b610c729190611c57565b90505b878160068110610c8757610c87611bad565b6020020151515f03610b73576060820151600690610b66906005611bd5565b6060820151600690610cb9906003611bd5565b610cc39190611c57565b9050878160068110610cd757610cd7611bad565b6020020151515f03610d03576060820151600690610cf6906005611bd5565b610d009190611c57565b90505b878160068110610d1557610d15611bad565b6020020151515f03610d41576060820151600690610d34906004611bd5565b610d3e9190611c57565b90505b878160068110610d5357610d53611bad565b6020020151515f03610d77575f9450610d6d60078c611c44565b9a5060038c901c9b505b8415611059575f88836001602002015160068110610d9757610d97611bad565b602002015160e00151118015610dd05750620186a088836001602002015160068110610dc557610dc5611bad565b602002015160e00151105b15610e37576020820151889060068110610dec57610dec611bad565b602002015160e001518260056020020152620186a088836001602002015160068110610e1a57610e1a611bad565b602002015160e001818151610e2f9190611bd5565b905250610f21565b5f88836001602002015160068110610e5157610e51611bad565b602002015160c00151118015610e8a5750620186a088836001602002015160068110610e7f57610e7f611bad565b602002015160c00151105b15610f1a576020820151889060068110610ea657610ea6611bad565b602002015160c001518260056020020152620186a088836001602002015160068110610ed457610ed4611bad565b602002015160e001511115610f1557620186a088836001602002015160068110610f0057610f00611bad565b602002015160e001818151610e2f9190611c44565b610f21565b5f60a08301525b60a0820151603610610fc557602082015160a083015160405163040eb9d160e01b81527374a4603e890192fdcc979315eb636185e71390d09263040eb9d192610f76928d928a928a9289918f91600401611c92565b61084060405180830381865af4158015610f92573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb69190611da6565b929a5091975094509250611059565b602082015160a083015160405163040eb9d160e01b8152734069e8aad36845d4e78188a4c36d840f8ab0b4969263040eb9d19261100e928d928a928a9289918f91600401611c92565b61084060405180830381865af415801561102a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104e9190611da6565b929a50919750945092505b60039b909b1b9a61106a818d611bd5565b9b50611457565b60019b909b1b9a611086600588901c88611bd5565b9650611093600a88611c57565b60808301819052600211156111785760608201516006906110b5906005611bd5565b6110bf9190611c57565b90508781600681106110d3576110d3611bad565b6020020151515f036110ff5760608201516006906110f2906004611bd5565b6110fc9190611c57565b90505b87816006811061111157611111611bad565b6020020151515f0361113d576060820151600690611130906003611bd5565b61113a9190611c57565b90505b87816006811061114f5761114f611bad565b6020020151515f03611173575f945061116960078c611c44565b9a5060038c901c9b505b611341565b6080820151600411156111d5576060820151600690611198906004611bd5565b6111a29190611c57565b90508781600681106111b6576111b6611bad565b6020020151515f036110ff5760608201516006906110f2906005611bd5565b6080820151600711156112705760608201516006906111f5906003611bd5565b6111ff9190611c57565b905087816006811061121357611213611bad565b6020020151515f0361123f576060820151600690611232906004611bd5565b61123c9190611c57565b90505b87816006811061125157611251611bad565b6020020151515f0361113d576060820151600690611130906005611bd5565b6060820151600690611283906003611bd5565b61128d9190611c57565b90508781600681106112a1576112a1611bad565b6020020151515f036112cd5760608201516006906112c0906005611bd5565b6112ca9190611c57565b90505b8781600681106112df576112df611bad565b6020020151515f0361130b5760608201516006906112fe906004611bd5565b6113089190611c57565b90505b87816006811061131d5761131d611bad565b6020020151515f03611341575f945061133760078c611c44565b9a5060038c901c9b505b84156114575760039b909b1b9a611358818d611bd5565b9b508782600160200201516006811061137357611373611bad565b60200201516020015188826006811061138e5761138e611bad565b602002015160400151106113a557600182526113ef565b8781600681106113b7576113b7611bad565b602002015160400151888360016020020151600681106113d9576113d9611bad565b6020020151602001516113ec9190611c44565b82525b87816006811061140157611401611bad565b6020020151518251111561142d575f88826006811061142257611422611bad565b602002015152611457565b815188826006811061144157611441611bad565b60200201518051611453908390611c44565b9052505b602082015188906006811061146e5761146e611bad565b6020020151606001515f036114a457620186a08683600160200201516006811061149a5761149a611bad565b60200201526114fd565b60208201518890600681106114bb576114bb611bad565b6020020151606001516114d190620186a0611c31565b60208301518790600681106114e8576114e8611bad565b602002018181516114f99190611bd5565b9052505b845f0361150d57600a94506108dc565b5f94506108dc565b60a08801515160808901515160608a0151516115319190611bd5565b61153b9190611bd5565b60408901515160208a0151518a51516115549190611bd5565b61155e9190611bd5565b111561156957600199505b50505050505050509193509193565b604080516032808252610660820190925260609182915f916020820161064080368337505060408051603280825261066082019092529293505f92915060208201610640803683370190505090505f5b60328110156116c057600281603281106115e4576115e4611bad565b015483516001600160a01b039091169084908390811061160657611606611bad565b6001600160a01b03909216602092830291909101909101525f6002826032811061163257611632611bad565b01546001600160a01b0316146116985760345f6002836032811061165857611658611bad565b01546001600160a01b0316815260208101919091526040015f2054825183908390811061168757611687611bad565b6020026020010181815250506116b8565b5f8282815181106116ab576116ab611bad565b6020026020010181815250505b6001016115c8565b5090939092509050565b600281603281106116d9575f80fd5b01546001600160a01b0316905081565b6116f1611762565b6001600160a01b0381166117565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610225565b61175f816117bb565b50565b5f546001600160a01b031633146104135760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610225565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040518060c001604052806006906020820280368337509192915050565b80356001600160a01b038116811461183e575f5ffd5b919050565b5f60208284031215611853575f5ffd5b61185c82611828565b9392505050565b5f60208284031215611873575f5ffd5b5035919050565b5f5f6040838503121561188b575f5ffd5b61189483611828565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051610100810167ffffffffffffffff811182821017156118da576118da6118a2565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611909576119096118a2565b604052919050565b5f67ffffffffffffffff82111561192a5761192a6118a2565b5060051b60200190565b5f82601f830112611943575f5ffd5b813561195661195182611911565b6118e0565b8082825260208201915060208360051b860101925085831115611977575f5ffd5b602085015b8381101561199457803583526020928301920161197c565b5095945050505050565b5f5f604083850312156119af575f5ffd5b823567ffffffffffffffff8111156119c5575f5ffd5b8301601f810185136119d5575f5ffd5b80356119e361195182611911565b8082825260208201915060208360051b850101925087831115611a04575f5ffd5b6020840193505b82841015611a2d57611a1c84611828565b825260209384019390910190611a0b565b9450505050602083013567ffffffffffffffff811115611a4b575f5ffd5b611a5785828601611934565b9150509250929050565b5f6106008284031215611a72575f5ffd5b82601f830112611a80575f5ffd5b60c0611a8b816118e0565b80610600850186811115611a9d575f5ffd5b855b81811015611b18576101008189031215611ab7575f5ffd5b611abf6118b6565b813581526020808301358183015260408084013590830152606080840135908301526080808401359083015260a08084013590830152868301358783015260e08084013590830152908552939093019261010001611a9f565b50909695505050505050565b604080825283519082018190525f9060208501906060840190835b81811015611b665783516001600160a01b0316835260209384019390920191600101611b3f565b5050838103602080860191909152855180835291810192508501905f5b81811015611ba1578251845260209384019390920191600101611b83565b50919695505050505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115611be857611be8611bc1565b92915050565b5f60018201611bff57611bff611bc1565b5060010190565b8082028115828204841417611be857611be8611bc1565b634e487b7160e01b5f52601260045260245ffd5b5f82611c3f57611c3f611c1d565b500490565b81810381811115611be857611be8611bc1565b5f82611c6557611c65611c1d565b500690565b805f5b6006811015611c8c578151845260209384019390910190600101611c6d565b50505050565b6108a0810181895f5b6006811015611d09578151805184526020810151602085015260408101516040850152606081015160608501526080810151608085015260a081015160a085015260c081015160c085015260e081015160e08501525061010083019250602082019150600181019050611c9b565b505050611d1a610600830189611c6a565b611d286106c0830188611c6a565b85610780830152846107a0830152611d446107c0830185611c6a565b8261088083015298975050505050505050565b5f82601f830112611d66575f5ffd5b611d7060c06118e0565b8060c0840185811115611d81575f5ffd5b845b81811015611d9b578051845260209384019301611d83565b509095945050505050565b5f5f5f5f6108408587031215611dba575f5ffd5b85601f860112611dc8575f5ffd5b60c0611dd3816118e0565b80610600880189811115611de5575f5ffd5b885b81811015611e6057610100818c031215611dff575f5ffd5b611e076118b6565b815181526020808301518183015260408084015190830152606080840151908301526080808401519083015260a08084015190830152868301518783015260e08084015190830152908552939093019261010001611de7565b50819750611e6e8a82611d57565b965050505050611e82866106c08701611d57565b9150611e92866107808701611d57565b90509295919450925056fea2646970667358221220524433e6869604e128b81d41b8fd95f345817686849ae30a63656da06efcfe1464736f6c634300081c0033
Library Used
SK1 : 0x74a4603e890192fdcc979315eb636185e71390d0UnverifiedSK2 : 0x4069e8aad36845d4e78188a4c36d840f8ab0b496Unverified
Deployed Bytecode Sourcemap
160971:18656:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;161882:43;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;529:25:1;;;517:2;502:18;161882:43:0;;;;;;;;163365:491;;;;;;:::i;:::-;;:::i;:::-;;162186:765;;;;;;:::i;:::-;;:::i;4343:103::-;;;:::i;162958:399::-;;;;;;:::i;:::-;;:::i;3695:87::-;3741:7;3768:6;-1:-1:-1;;;;;3768:6:0;3695:87;;;-1:-1:-1;;;;;4004:32:1;;;3986:51;;3974:2;3959:18;3695:87:0;3840:203:1;164807:14793:0;;;;;;:::i;:::-;;:::i;:::-;;;;6049:25:1;;;6105:2;6090:18;;6083:34;;;;6160:14;;6153:22;6133:18;;;6126:50;;;;6207:2;6192:18;;6185:34;6036:3;6021:19;164807:14793:0;5824:401:1;161015:21:0;;;;;-1:-1:-1;;;161015:21:0;;;;;;;;;6395:14:1;;6388:22;6370:41;;6358:2;6343:18;161015:21:0;6230:187:1;163862:529:0;;;:::i;:::-;;;;;;;;:::i;161785:34::-;;;;;;:::i;:::-;;:::i;4601:201::-;;;;;;:::i;:::-;;:::i;163365:491::-;3581:13;:11;:13::i;:::-;163453:2:::1;163444:6;:11;163436:43;;;::::0;-1:-1:-1;;;163436:43:0;;7800:2:1;163436:43:0::1;::::0;::::1;7782:21:1::0;7839:2;7819:18;;;7812:30;-1:-1:-1;;;7858:18:1;;;7851:49;7917:18;;163436:43:0::1;;;;;;;;;163529:24;163556:15;163572:6;163556:23;;;;;;;:::i;:::-;;::::0;-1:-1:-1;;;;;163556:23:0::1;::::0;-1:-1:-1;163556:23:0;163590:68:::1;;;::::0;-1:-1:-1;;;163590:68:0;;8280:2:1;163590:68:0::1;::::0;::::1;8262:21:1::0;8319:2;8299:18;;;8292:30;8358:27;8338:18;;;8331:55;8403:18;;163590:68:0::1;8078:349:1::0;163590:68:0::1;163802:1;163768:15;163784:6;163768:23;;;;;;;:::i;:::-;;:36:::0;;-1:-1:-1;;;;;;163768:36:0::1;-1:-1:-1::0;;;;;163768:36:0;;::::1;;::::0;;163815:29:::1;-1:-1:-1::0;163815:29:0;;;:11:::1;:29;::::0;;;;:33;-1:-1:-1;163365:491:0:o;162186:765::-;3581:13;:11;:13::i;:::-;162288:1:::1;162280:6;:9;:24;;;;;162302:2;162293:6;:11;162280:24;162272:56;;;::::0;-1:-1:-1;;;162272:56:0;;7800:2:1;162272:56:0::1;::::0;::::1;7782:21:1::0;7839:2;7819:18;;;7812:30;-1:-1:-1;;;7858:18:1;;;7851:49;7917:18;;162272:56:0::1;7598:343:1::0;162272:56:0::1;-1:-1:-1::0;;;;;162386:22:0;::::1;162378:50;;;::::0;-1:-1:-1;;;162378:50:0;;8634:2:1;162378:50:0::1;::::0;::::1;8616:21:1::0;8673:2;8653:18;;;8646:30;-1:-1:-1;;;8692:18:1;;;8685:45;8747:18;;162378:50:0::1;8432:339:1::0;162378:50:0::1;162519:23;162545:15;162561:6;162545:23;;;;;;;:::i;:::-;;::::0;-1:-1:-1;;;;;162545:23:0::1;::::0;-1:-1:-1;162583:29:0;;162579:155:::1;;-1:-1:-1::0;;;;;162690:28:0;::::1;162721:1;162690:28:::0;;;:11:::1;:28;::::0;;;;:32;162579:155:::1;162843:8;162817:15;162833:6;162817:23;;;;;;;:::i;:::-;;:34:::0;;-1:-1:-1;;;;;;162817:34:0::1;-1:-1:-1::0;;;;;162817:34:0;;::::1;;::::0;;162862:21;;;::::1;-1:-1:-1::0;162862:21:0;;;:11:::1;:21;::::0;;;;:30;-1:-1:-1;162186:765:0:o;4343:103::-;3581:13;:11;:13::i;:::-;4408:30:::1;4435:1;4408:18;:30::i;:::-;4343:103::o:0;162958:399::-;3581:13;:11;:13::i;:::-;163100:8:::1;:15;163079:10;:17;:36;163071:73;;;::::0;-1:-1:-1;;;163071:73:0;;8978:2:1;163071:73:0::1;::::0;::::1;8960:21:1::0;9017:2;8997:18;;;8990:30;9056:26;9036:18;;;9029:54;9100:18;;163071:73:0::1;8776:348:1::0;163071:73:0::1;163207:6;163202:148;163223:10;:17;163219:1;:21;163202:148;;;163262:45;163280:10;163291:1;163280:13;;;;;;;;:::i;:::-;;;;;;;163295:8;163304:1;163295:11;;;;;;;;:::i;:::-;;;;;;;163262:17;:45::i;:::-;163242:3;;163202:148;;;;162958:399:::0;;:::o;164807:14793::-;162110:10;164894:17;162082:23;;;:11;:23;;;;;;164894:17;;;;;;;;162066:15;;:40;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;162066:40:0;:54;162058:100;;;;-1:-1:-1;;;162058:100:0;;9331:2:1;162058:100:0;;;9313:21:1;9370:2;9350:18;;;9343:30;9409:34;9389:18;;;9382:62;-1:-1:-1;;;9460:18:1;;;9453:31;9501:19;;162058:100:0;9129:397:1;162058:100:0;165055:51:::1;::::0;;165072:15:::1;165055:51;::::0;::::1;9688:19:1::0;165089:16:0::1;9723:12:1::0;;;9716:28;;;;165006:10:0;;164977:26:::1;::::0;9760:12:1;;165055:51:0::1;::::0;;-1:-1:-1;;165055:51:0;;::::1;::::0;;;;;;165045:62;;165055:51:::1;165045:62:::0;;::::1;::::0;165039:81:::1;::::0;165109:5:::1;165040:74;165116:4;165039:81;:::i;:::-;165027:93;;165141:4;165131:14;;165196:26;;:::i;:::-;165347:13;165400:24;;:::i;:::-;165513:27;;:::i;:::-;165552:26;;:::i;:::-;165894:1;165883:12:::0;;165961;;:15;165855::::1;::::0;165961:19;165957:38:::1;;165983:10:::0;::::1;::::0;::::1;:::i;:::-;;;;165957:38;166052:12;::::0;::::1;::::0;:15;:19;166048:38:::1;;166074:10:::0;::::1;::::0;::::1;:::i;:::-;;;;166048:38;166100:12:::0;;::::1;::::0;:15;:19;166096:38:::1;;166122:10:::0;::::1;::::0;::::1;:::i;:::-;;;;166096:38;166164:1;166153:8;:12;166145:59;;;::::0;-1:-1:-1;;;166145:59:0;;10387:2:1;166145:59:0::1;::::0;::::1;10369:21:1::0;10426:2;10406:18;;;10399:30;10465:34;10445:18;;;10438:62;-1:-1:-1;;;10516:18:1;;;10509:32;10558:19;;166145:59:0::1;10185:398:1::0;166145:59:0::1;166242:12:::0;;::::1;::::0;:15;166226:1:::1;::::0;-1:-1:-1;166242:19:0;166238:38:::1;;166264:10:::0;::::1;::::0;::::1;:::i;:::-;;;;166238:38;166333:12:::0;;::::1;::::0;:15;:19;166329:38:::1;;166355:10:::0;::::1;::::0;::::1;:::i;:::-;;;;166329:38;166382:12:::0;;::::1;::::0;:15;:19;166378:38:::1;;166404:10:::0;::::1;::::0;::::1;:::i;:::-;;;;166378:38;166446:1;166435:8;:12;166427:59;;;::::0;-1:-1:-1;;;166427:59:0;;10790:2:1;166427:59:0::1;::::0;::::1;10772:21:1::0;10829:2;10809:18;;;10802:30;10868:34;10848:18;;;10841:62;-1:-1:-1;;;10919:18:1;;;10912:32;10961:19;;166427:59:0::1;10588:398:1::0;166427:59:0::1;166617:12:::0;;:25:::1;;::::0;:28:::1;::::0;166643:2:::1;166617:28;:::i;:::-;166604:41:::0;;:12:::1;166669::::0;::::1;::::0;:25:::1;;::::0;:28:::1;::::0;166695:2:::1;166669:28;:::i;:::-;166656:12;::::0;::::1;:41:::0;166721:12;;::::1;::::0;:25:::1;;::::0;:28:::1;::::0;166747:2:::1;166721:28;:::i;:::-;166708:12:::0;;::::1;:41:::0;166773:12;;::::1;::::0;:25:::1;;::::0;:28:::1;::::0;166799:2:::1;166773:28;:::i;:::-;166760:12:::0;;::::1;:41:::0;166825:12;;::::1;::::0;:25:::1;;::::0;:28:::1;::::0;166851:2:::1;166825:28;:::i;:::-;166812:12:::0;;::::1;:41:::0;166877:12;;;::::1;::::0;:25:::1;::::0;:28:::1;::::0;166903:2:::1;166877:28;:::i;:::-;166864:12:::0;;::::1;:41:::0;166920:12;;:18:::1;;::::0;166930:1:::1;166920:22:::0;166916:102:::1;;166961:6;166946:21:::0;;166916:102:::1;;;166998:12:::0;;:18:::1;;::::0;166991:25:::1;::::0;:6:::1;:25;:::i;:::-;166976:40:::0;;166916:102:::1;167032:12;::::0;::::1;::::0;:18:::1;;::::0;167053:1:::1;167032:22:::0;167028:102:::1;;167073:6;167058:14;::::0;::::1;:21:::0;167028:102:::1;;;167110:12;::::0;::::1;::::0;:18:::1;;::::0;167103:25:::1;::::0;:6:::1;:25;:::i;:::-;167088:14;::::0;::::1;:40:::0;167028:102:::1;167144:12:::0;;::::1;::::0;:18:::1;;::::0;167165:1:::1;167144:22:::0;167140:102:::1;;167185:6;167170:14:::0;;::::1;:21:::0;167140:102:::1;;;167222:12:::0;;::::1;::::0;:18:::1;;::::0;167215:25:::1;::::0;:6:::1;:25;:::i;:::-;167200:14:::0;;::::1;:40:::0;167140:102:::1;167256:12:::0;;;::::1;::::0;:18:::1;::::0;167277:1:::1;167256:22:::0;167252:102:::1;;167297:6;167282:14:::0;;::::1;:21:::0;167252:102:::1;;;167334:12:::0;;;::::1;::::0;:18:::1;::::0;167327:25:::1;::::0;:6:::1;:25;:::i;:::-;167312:14:::0;;::::1;:40:::0;167252:102:::1;167368:12:::0;;::::1;::::0;:18:::1;;::::0;167389:1:::1;167368:22:::0;167364:102:::1;;167409:6;167394:14:::0;;::::1;:21:::0;167364:102:::1;;;167446:12:::0;;::::1;::::0;:18:::1;;::::0;167439:25:::1;::::0;:6:::1;:25;:::i;:::-;167424:14:::0;;::::1;:40:::0;167364:102:::1;167480:12:::0;;::::1;::::0;:18:::1;;::::0;167501:1:::1;167480:22:::0;167476:102:::1;;167521:6;167506:14:::0;;::::1;:21:::0;167476:102:::1;;;167558:12:::0;;::::1;::::0;:18:::1;;::::0;167551:25:::1;::::0;:6:::1;:25;:::i;:::-;167536:14:::0;;::::1;:40:::0;167476:102:::1;167856:3;167850;:9;;:27;;;;;167863:8;167875:2;167863:14;;167850:27;167843:11490;;;168127:6;168112:14:::0;;::::1;:21:::0;168187:1:::1;168112:14;168172::::0;::::1;:16:::0;;;168316:236:::1;168337:1;168333;:5;168316:236;;;168385:14:::0;;::::1;::::0;168368:11;168380:1;168368:14:::1;::::0;::::1;;;;;:::i;:::-;;;;;:31;:52;;;;;168419:1;168403:9;168413:1;168403:12;;;;;;;:::i;:::-;;;;::::0;:15;:17:::1;168368:52;168364:173;;;168462:11;168474:1;168462:14;;;;;;;:::i;:::-;;;;::::0;168445:11;168457:1:::1;168445:14;;;:31:::0;168516:1;168499:11;168511:1:::1;168499:14;;;:18:::0;168364:173:::1;168340:3;;168316:236;;;-1:-1:-1::0;168660:14:0::1;::::0;::::1;::::0;168675:1:::1;-1:-1:-1::0;168656:229:0::1;;;168789:1;168772:14:::0;;::::1;:18:::0;168656:229:::1;;;168858:1;168841:14:::0;;::::1;:18:::0;168656:229:::1;169064:1;169033:9:::0;169043:11;169055:1:::1;169043:14;;;;169033:25;;;;;;;:::i;:::-;;;;::::0;:28;:32:::1;169029:9469;;;169122:1;::::0;-1:-1:-1;169188:6:0::1;169193:1;169188:6:::0;::::1;:::i;:::-;169309:14;::::0;::::1;::::0;169273:1:::1;169259:15:::0;;;::::1;::::0;;;-1:-1:-1;169293:30:0::1;::::0;169259:15;169293:30:::1;:::i;:::-;::::0;-1:-1:-1;169418:9:0;169428:11;169440:1:::1;169428:14;;;;169418:25;;;;;;;:::i;:::-;;;;::::0;:38:::1;;::::0;169389:9;169399:11;169411:1:::1;169399:14;;;;169389:25;;;;;;;:::i;:::-;;;;:67;;;;;;;:::i;:::-;::::0;;-1:-1:-1;169508:4:0::1;169479:9:::0;169489:11;169501:1:::1;169489:14;;;;169479:25;;;;;;;:::i;:::-;;;;;:33;169475:9008;;169566:4;169537:9:::0;169547:11;169559:1:::1;169547:14;;;;169537:25;;;;;;;:::i;:::-;;;;:33;;;;;;;:::i;:::-;::::0;;-1:-1:-1;169737:1:0::1;169723:15:::0;;;::::1;::::0;;169761:14:::1;169723:15:::0;169761:14:::1;:::i;:::-;::::0;-1:-1:-1;169812:15:0::1;::::0;-1:-1:-1;169826:1:0::1;169820:7:::0;;::::1;:4:::0;169812:15:::1;:::i;:::-;::::0;-1:-1:-1;169867:7:0::1;169872:2;169812:15:::0;169867:7:::1;:::i;:::-;169850:14:::0;;::::1;:24:::0;;;169918:1:::1;-1:-1:-1::0;169897:2481:0::1;;;170098:14:::0;;::::1;::::0;170114:1:::1;::::0;170094:18:::1;::::0;:1:::1;:18;:::i;:::-;170093:22;;;;:::i;:::-;170081:34;;170170:9;170180:10;170170:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;170166:72:::1;;170219:14:::0;;::::1;::::0;170235:1:::1;::::0;170215:18:::1;::::0;:1:::1;:18;:::i;:::-;170214:22;;;;:::i;:::-;170202:34;;170166:72;170292:9;170302:10;170292:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;170288:72:::1;;170341:14:::0;;::::1;::::0;170357:1:::1;::::0;170337:18:::1;::::0;170353:1:::1;170337:18;:::i;:::-;170336:22;;;;:::i;:::-;170324:34;;170288:72;170414:9;170424:10;170414:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;170410:73:::1;;170456:1;::::0;-1:-1:-1;170458:6:0::1;170463:1;170458:6:::0;::::1;:::i;:::-;;;170480:1;170465:16;;;;;170410:73;169897:2481;;;170527:14:::0;;::::1;::::0;170543:1:::1;-1:-1:-1::0;170523:1855:0::1;;;170726:14:::0;;::::1;::::0;170742:1:::1;::::0;170722:18:::1;::::0;:1:::1;:18;:::i;:::-;170721:22;;;;:::i;:::-;170709:34;;170798:9;170808:10;170798:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;170794:72:::1;;170847:14:::0;;::::1;::::0;170863:1:::1;::::0;170843:18:::1;::::0;:1:::1;:18;:::i;170523:1855::-;171155:14:::0;;::::1;::::0;171171:1:::1;-1:-1:-1::0;171151:1227:0::1;;;171354:14:::0;;::::1;::::0;171370:1:::1;::::0;171350:18:::1;::::0;171366:1:::1;171350:18;:::i;:::-;171349:22;;;;:::i;:::-;171337:34;;171426:9;171436:10;171426:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;171422:72:::1;;171475:14:::0;;::::1;::::0;171491:1:::1;::::0;171471:18:::1;::::0;:1:::1;:18;:::i;:::-;171470:22;;;;:::i;:::-;171458:34;;171422:72;171548:9;171558:10;171548:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;171544:72:::1;;171597:14:::0;;::::1;::::0;171613:1:::1;::::0;171593:18:::1;::::0;:1:::1;:18;:::i;171151:1227::-;171959:14:::0;;::::1;::::0;171975:1:::1;::::0;171955:18:::1;::::0;171971:1:::1;171955:18;:::i;:::-;171954:22;;;;:::i;:::-;171942:34;;172031:9;172041:10;172031:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;172027:72:::1;;172080:14:::0;;::::1;::::0;172096:1:::1;::::0;172076:18:::1;::::0;:1:::1;:18;:::i;:::-;172075:22;;;;:::i;:::-;172063:34;;172027:72;172153:9;172163:10;172153:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;172149:72:::1;;172202:14:::0;;::::1;::::0;172218:1:::1;::::0;172198:18:::1;::::0;:1:::1;:18;:::i;:::-;172197:22;;;;:::i;:::-;172185:34;;172149:72;172275:9;172285:10;172275:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;172271:73:::1;;172317:1;::::0;-1:-1:-1;172319:6:0::1;172324:1;172319:6:::0;::::1;:::i;:::-;;;172341:1;172326:16;;;;;172271:73;172607:10:::0;;172603:1729:::1;;172686:1;172650:9:::0;172660:11;172672:1:::1;172660:14;;;;172650:25;;;;;;;:::i;:::-;;;;;:33;;;:37;:83;;;;-1:-1:-1::0;172727:6:0::1;172691:9:::0;172701:11;172713:1:::1;172701:14;;;;172691:25;;;;;;;:::i;:::-;;;;;:33;;;:42;172650:83;172646:1116;;;172830:14;::::0;::::1;::::0;172820:9;;:25:::1;::::0;::::1;;;;;:::i;:::-;;;;::::0;:33:::1;;::::0;172803:11;172815:1:::1;172803:14;;;:50:::0;172941:6:::1;172904:9:::0;172914:11;172926:1:::1;172914:14;;;;172904:25;;;;;;;:::i;:::-;;;;;:33;;:43;;;;;;;:::i;:::-;::::0;;-1:-1:-1;172646:1116:0::1;;;173092:1;173058:9:::0;173068:11;173080:1:::1;173068:14;;;;173058:25;;;;;;;:::i;:::-;;;;;:31;;;:35;:79;;;;-1:-1:-1::0;173131:6:0::1;173097:9:::0;173107:11;173119:1:::1;173107:14;;;;173097:25;;;;;;;:::i;:::-;;;;;:31;;;:40;173058:79;173054:708;;;173233:14;::::0;::::1;::::0;173223:9;;:25:::1;::::0;::::1;;;;;:::i;:::-;;;;::::0;:31:::1;;::::0;173206:11;173218:1:::1;173206:14;;;:48:::0;173343:6:::1;173307:9:::0;173317:11;173329:1:::1;173317:14;;;;173307:25;;;;;;;:::i;:::-;;;;;:33;;;:42;173303:272;;;173486:6;173449:9:::0;173459:11;173471:1:::1;173459:14;;;;173449:25;;;;;;;:::i;:::-;;;;;:33;;:43;;;;;;;:::i;173303:272::-;173054:708;;;173733:1;173716:14:::0;;::::1;:18:::0;173054:708:::1;173792:14:::0;;::::1;::::0;173810:2:::1;-1:-1:-1::0;173788:521:0::1;;174001:14;::::0;::::1;::::0;174042;;::::1;::::0;173948:109:::1;::::0;-1:-1:-1;;;173948:109:0;;:3:::1;::::0;:14:::1;::::0;:109:::1;::::0;173964:9;;173975;;173987:12;;174017:10;;174029:11;;173948:109:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;173898:159:::0;;-1:-1:-1;173898:159:0;;-1:-1:-1;173898:159:0;-1:-1:-1;173898:159:0;-1:-1:-1;173788:521:0::1;;;174225:14;::::0;::::1;::::0;174266;;::::1;::::0;174172:109:::1;::::0;-1:-1:-1;;;174172:109:0;;:3:::1;::::0;:14:::1;::::0;:109:::1;::::0;174188:9;;174199;;174211:12;;174241:10;;174253:11;;174172:109:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;174122:159:::0;;-1:-1:-1;174122:159:0;;-1:-1:-1;174122:159:0;-1:-1:-1;174122:159:0;-1:-1:-1;173788:521:0::1;174487:1;174473:15:::0;;;::::1;::::0;174511:24:::1;174525:10:::0;174473:15;174511:24:::1;:::i;:::-;;;169475:9008;;;174736:1;174722:15:::0;;;::::1;::::0;174961::::1;174975:1;174969:7:::0;;::::1;:4:::0;174961:15:::1;:::i;:::-;::::0;-1:-1:-1;175016:7:0::1;175021:2;174961:15:::0;175016:7:::1;:::i;:::-;174999:14:::0;;::::1;:24:::0;;;175067:1:::1;-1:-1:-1::0;175046:2481:0::1;;;175247:14:::0;;::::1;::::0;175263:1:::1;::::0;175243:18:::1;::::0;:1:::1;:18;:::i;:::-;175242:22;;;;:::i;:::-;175230:34;;175319:9;175329:10;175319:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;175315:72:::1;;175368:14:::0;;::::1;::::0;175384:1:::1;::::0;175364:18:::1;::::0;:1:::1;:18;:::i;:::-;175363:22;;;;:::i;:::-;175351:34;;175315:72;175441:9;175451:10;175441:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;175437:72:::1;;175490:14:::0;;::::1;::::0;175506:1:::1;::::0;175486:18:::1;::::0;175502:1:::1;175486:18;:::i;:::-;175485:22;;;;:::i;:::-;175473:34;;175437:72;175563:9;175573:10;175563:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;175559:73:::1;;175605:1;::::0;-1:-1:-1;175607:6:0::1;175612:1;175607:6:::0;::::1;:::i;:::-;;;175629:1;175614:16;;;;;175559:73;175046:2481;;;175676:14:::0;;::::1;::::0;175692:1:::1;-1:-1:-1::0;175672:1855:0::1;;;175875:14:::0;;::::1;::::0;175891:1:::1;::::0;175871:18:::1;::::0;:1:::1;:18;:::i;:::-;175870:22;;;;:::i;:::-;175858:34;;175947:9;175957:10;175947:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;175943:72:::1;;175996:14:::0;;::::1;::::0;176012:1:::1;::::0;175992:18:::1;::::0;:1:::1;:18;:::i;175672:1855::-;176304:14:::0;;::::1;::::0;176320:1:::1;-1:-1:-1::0;176300:1227:0::1;;;176503:14:::0;;::::1;::::0;176519:1:::1;::::0;176499:18:::1;::::0;176515:1:::1;176499:18;:::i;:::-;176498:22;;;;:::i;:::-;176486:34;;176575:9;176585:10;176575:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;176571:72:::1;;176624:14:::0;;::::1;::::0;176640:1:::1;::::0;176620:18:::1;::::0;:1:::1;:18;:::i;:::-;176619:22;;;;:::i;:::-;176607:34;;176571:72;176697:9;176707:10;176697:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;176693:72:::1;;176746:14:::0;;::::1;::::0;176762:1:::1;::::0;176742:18:::1;::::0;:1:::1;:18;:::i;176300:1227::-;177108:14:::0;;::::1;::::0;177124:1:::1;::::0;177104:18:::1;::::0;177120:1:::1;177104:18;:::i;:::-;177103:22;;;;:::i;:::-;177091:34;;177180:9;177190:10;177180:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;177176:72:::1;;177229:14:::0;;::::1;::::0;177245:1:::1;::::0;177225:18:::1;::::0;:1:::1;:18;:::i;:::-;177224:22;;;;:::i;:::-;177212:34;;177176:72;177302:9;177312:10;177302:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;177298:72:::1;;177351:14:::0;;::::1;::::0;177367:1:::1;::::0;177347:18:::1;::::0;:1:::1;:18;:::i;:::-;177346:22;;;;:::i;:::-;177334:34;;177298:72;177424:9;177434:10;177424:21;;;;;;;:::i;:::-;;;;::::0;:24;::::1;:29:::0;177420:73:::1;;177466:1;::::0;-1:-1:-1;177468:6:0::1;177473:1;177468:6:::0;::::1;:::i;:::-;;;177490:1;177475:16;;;;;177420:73;177618:11:::0;;177615:848:::1;;177776:1;177762:15:::0;;;::::1;::::0;177804:24:::1;177818:10:::0;177762:15;177804:24:::1;:::i;:::-;::::0;-1:-1:-1;177895:9:0;177905:11;177917:1:::1;177905:14;;;;177895:25;;;;;;;:::i;:::-;;;;;:32;;;177862:9;177872:10;177862:21;;;;;;;:::i;:::-;;;;;:29;;;:65;177858:305;;177988:1;177971:18:::0;;177858:305:::1;;;178106:9;178116:10;178106:21;;;;;;;:::i;:::-;;;;::::0;:29:::1;;::::0;178071:9;178081:11;178093:1:::1;178081:14;;;;178071:25;;;;;;;:::i;:::-;;;;;:32;;;:64;;;;:::i;:::-;178054:81:::0;;177858:305:::1;178210:9;178220:10;178210:21;;;;;;;:::i;:::-;;;;::::0;:24;178193:14;;:41:::1;178189:251;;;178304:1;178278:9;178288:10;178278:21;;;;;;;:::i;:::-;;;;::::0;:27;178189:251:::1;;;178398:14:::0;;178370:9;178380:10;178370:21:::1;::::0;::::1;;;;;:::i;:::-;;;;::::0;:42;;::::1;::::0;;;::::1;:::i;:::-;::::0;;-1:-1:-1;178189:251:0::1;178613:14;::::0;::::1;::::0;178603:9;;:25:::1;::::0;::::1;;;;;:::i;:::-;;;;;:31;;;178637:1;178603:35:::0;178599:219:::1;;178688:6;178660:11:::0;178672;178684:1:::1;178672:14;;;;178660:27;;;;;;;:::i;:::-;;;;:34:::0;178599:219:::1;;;178781:14;::::0;::::1;::::0;178771:9;;:25:::1;::::0;::::1;;;;;:::i;:::-;;;;::::0;:31:::1;;::::0;178764:38:::1;::::0;:6:::1;:38;:::i;:::-;178747:14;::::0;::::1;::::0;178735:11;;:27:::1;::::0;::::1;;;;;:::i;:::-;;;;:67;;;;;;;:::i;:::-;::::0;;-1:-1:-1;178599:219:0::1;178899:8;178911:1;178899:13:::0;178895:426:::1;;179032:2;179021:13;;167843:11490;;178895:426;179140:1;179129:12;;167843:11490;;;179467:12:::0;;::::1;::::0;:15;179451:12;;::::1;::::0;:15;179435:12;;::::1;::::0;:15;:31:::1;::::0;179451:15;179435:31:::1;:::i;:::-;:47;;;;:::i;:::-;179415:12:::0;;::::1;::::0;:15;:12:::1;179397::::0;::::1;::::0;:15;179379:12;;:15;:33:::1;::::0;179397:15;179379:33:::1;:::i;:::-;:51;;;;:::i;:::-;179378:105;179374:148;;;179506:4;179500:10;;179374:148;164946:14654;;;;;;;;164807:14793:::0;;;;;:::o;163862:529::-;163989:17;;;164003:2;163989:17;;;;;;;;;163916:16;;;;163960:26;;163989:17;;;;;;;;-1:-1:-1;;164041:14:0;;;164052:2;164041:14;;;;;;;;;163960:46;;-1:-1:-1;164017:21:0;;164041:14;-1:-1:-1;164041:14:0;;;;;;;;;;-1:-1:-1;;164017:38:0;-1:-1:-1;164073:6:0;164068:276;164089:2;164085:1;:6;164068:276;;;164128:15;164144:1;164128:18;;;;;;;:::i;:::-;;;164113:12;;-1:-1:-1;;;;;164128:18:0;;;;164113:9;;164123:1;;164113:12;;;;;;:::i;:::-;-1:-1:-1;;;;;164113:33:0;;;:12;;;;;;;;;;;:33;164195:1;164165:15;164181:1;164165:18;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;164165:18:0;:32;164161:172;;164231:11;:31;164243:15;164259:1;164243:18;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;164243:18:0;164231:31;;;;;;;;;;;164243:18;164231:31;;164218:10;;:7;;164226:1;;164218:10;;;;;;:::i;:::-;;;;;;:44;;;;;164161:172;;;164316:1;164303:7;164311:1;164303:10;;;;;;;;:::i;:::-;;;;;;:14;;;;;164161:172;164093:3;;164068:276;;;-1:-1:-1;164364:9:0;;164375:7;;-1:-1:-1;163862:529:0;-1:-1:-1;163862:529:0:o;161785:34::-;;;;;;;;;;;;;;-1:-1:-1;;;;;161785:34:0;;-1:-1:-1;161785:34:0;:::o;4601:201::-;3581:13;:11;:13::i;:::-;-1:-1:-1;;;;;4690:22:0;::::1;4682:73;;;::::0;-1:-1:-1;;;4682:73:0;;16490:2:1;4682:73:0::1;::::0;::::1;16472:21:1::0;16529:2;16509:18;;;16502:30;16568:34;16548:18;;;16541:62;-1:-1:-1;;;16619:18:1;;;16612:36;16665:19;;4682:73:0::1;16288:402:1::0;4682:73:0::1;4766:28;4785:8;4766:18;:28::i;:::-;4601:201:::0;:::o;3860:132::-;3741:7;3768:6;-1:-1:-1;;;;;3768:6:0;2320:10;3924:23;3916:68;;;;-1:-1:-1;;;3916:68:0;;16897:2:1;3916:68:0;;;16879:21:1;;;16916:18;;;16909:30;16975:34;16955:18;;;16948:62;17027:18;;3916:68:0;16695:356:1;4962:191:0;5036:16;5055:6;;-1:-1:-1;;;;;5072:17:0;;;-1:-1:-1;;;;;;5072:17:0;;;;;;5105:40;;5055:6;;;;;;;5105:40;;5036:16;5105:40;5025:128;4962:191;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;565:226::-;624:6;677:2;665:9;656:7;652:23;648:32;645:52;;;693:1;690;683:12;645:52;-1:-1:-1;738:23:1;;565:226;-1:-1:-1;565:226:1:o;796:300::-;864:6;872;925:2;913:9;904:7;900:23;896:32;893:52;;;941:1;938;931:12;893:52;964:29;983:9;964:29;:::i;:::-;954:39;1062:2;1047:18;;;;1034:32;;-1:-1:-1;;;796:300:1:o;1101:127::-;1162:10;1157:3;1153:20;1150:1;1143:31;1193:4;1190:1;1183:15;1217:4;1214:1;1207:15;1233:255;1305:2;1299:9;1347:6;1335:19;;1384:18;1369:34;;1405:22;;;1366:62;1363:88;;;1431:18;;:::i;:::-;1467:2;1460:22;1233:255;:::o;1493:275::-;1564:2;1558:9;1629:2;1610:13;;-1:-1:-1;;1606:27:1;1594:40;;1664:18;1649:34;;1685:22;;;1646:62;1643:88;;;1711:18;;:::i;:::-;1747:2;1740:22;1493:275;;-1:-1:-1;1493:275:1:o;1773:183::-;1833:4;1866:18;1858:6;1855:30;1852:56;;;1888:18;;:::i;:::-;-1:-1:-1;1933:1:1;1929:14;1945:4;1925:25;;1773:183::o;1961:723::-;2015:5;2068:3;2061:4;2053:6;2049:17;2045:27;2035:55;;2086:1;2083;2076:12;2035:55;2126:6;2113:20;2153:64;2169:47;2209:6;2169:47;:::i;:::-;2153:64;:::i;:::-;2241:3;2265:6;2260:3;2253:19;2297:4;2292:3;2288:14;2281:21;;2358:4;2348:6;2345:1;2341:14;2333:6;2329:27;2325:38;2311:52;;2386:3;2378:6;2375:15;2372:35;;;2403:1;2400;2393:12;2372:35;2439:4;2431:6;2427:17;2453:200;2469:6;2464:3;2461:15;2453:200;;;2561:17;;2591:18;;2638:4;2629:14;;;;2486;2453:200;;;-1:-1:-1;2671:7:1;1961:723;-1:-1:-1;;;;;1961:723:1:o;2689:1146::-;2807:6;2815;2868:2;2856:9;2847:7;2843:23;2839:32;2836:52;;;2884:1;2881;2874:12;2836:52;2924:9;2911:23;2957:18;2949:6;2946:30;2943:50;;;2989:1;2986;2979:12;2943:50;3012:22;;3065:4;3057:13;;3053:27;-1:-1:-1;3043:55:1;;3094:1;3091;3084:12;3043:55;3134:2;3121:16;3157:64;3173:47;3213:6;3173:47;:::i;3157:64::-;3243:3;3267:6;3262:3;3255:19;3299:4;3294:3;3290:14;3283:21;;3356:4;3346:6;3343:1;3339:14;3335:2;3331:23;3327:34;3313:48;;3384:7;3376:6;3373:19;3370:39;;;3405:1;3402;3395:12;3370:39;3437:4;3433:2;3429:13;3418:24;;3451:152;3467:6;3462:3;3459:15;3451:152;;;3535:23;3554:3;3535:23;:::i;:::-;3523:36;;3588:4;3484:14;;;;3579;;;;3451:152;;;3622:5;-1:-1:-1;;;;3680:4:1;3665:20;;3652:34;3711:18;3698:32;;3695:52;;;3743:1;3740;3733:12;3695:52;3766:63;3821:7;3810:8;3799:9;3795:24;3766:63;:::i;:::-;3756:73;;;2689:1146;;;;;:::o;4048:1771::-;4150:6;4203:4;4191:9;4182:7;4178:23;4174:34;4171:54;;;4221:1;4218;4211:12;4171:54;4270:7;4263:4;4252:9;4248:20;4244:34;4234:62;;4292:1;4289;4282:12;4234:62;4371:3;4394:20;4371:3;4394:20;:::i;:::-;4436:3;4477:4;4466:9;4462:20;4505:7;4497:6;4494:19;4491:39;;;4526:1;4523;4516:12;4491:39;4550:9;4568:1221;4584:6;4579:3;4576:15;4568:1221;;;4668:6;4662:3;4653:7;4649:17;4645:30;4642:50;;;4688:1;4685;4678:12;4642:50;4718:22;;:::i;:::-;4793:17;;4823:22;;4920:2;4911:12;;;4898:26;4944:14;;;4937:31;5043:2;5034:12;;;5021:26;5067:14;;;5060:31;5166:2;5157:12;;;5144:26;5190:14;;;5183:31;5289:3;5280:13;;;5267:27;5314:15;;;5307:32;5414:3;5405:13;;;5392:27;5439:15;;;5432:32;5530:14;;;5517:28;5565:16;;;5558:33;5666:3;5657:13;;;5644:27;5691:15;;;5684:32;5729:18;;;5767:12;;;;;4610:6;4601:16;4568:1221;;;-1:-1:-1;5808:5:1;;4048:1771;-1:-1:-1;;;;;;4048:1771:1:o;6422:1171::-;6690:2;6702:21;;;6772:13;;6675:18;;;6794:22;;;6642:4;;6885;6873:17;;;6847:2;6832:18;;;6642:4;6918:199;6932:6;6929:1;6926:13;6918:199;;;6997:13;;-1:-1:-1;;;;;6993:39:1;6981:52;;7062:4;7090:17;;;;7053:14;;;;7029:1;6947:9;6918:199;;;-1:-1:-1;;7155:19:1;;;7148:4;7133:20;;;7126:49;;;;7225:13;;7247:21;;;7286:14;;;;-1:-1:-1;7325:17:1;;;7362:1;7372:193;7388:8;7383:3;7380:17;7372:193;;;7457:15;;7443:30;;7506:4;7495:16;;;;7536:19;;;;7416:1;7407:11;7372:193;;;-1:-1:-1;7582:5:1;;6422:1171;-1:-1:-1;;;;;;6422:1171:1:o;7946:127::-;8007:10;8002:3;7998:20;7995:1;7988:31;8038:4;8035:1;8028:15;8062:4;8059:1;8052:15;9783:127;9844:10;9839:3;9835:20;9832:1;9825:31;9875:4;9872:1;9865:15;9899:4;9896:1;9889:15;9915:125;9980:9;;;10001:10;;;9998:36;;;10014:18;;:::i;:::-;9915:125;;;;:::o;10045:135::-;10084:3;10105:17;;;10102:43;;10125:18;;:::i;:::-;-1:-1:-1;10172:1:1;10161:13;;10045:135::o;10991:168::-;11064:9;;;11095;;11112:15;;;11106:22;;11092:37;11082:71;;11133:18;;:::i;11164:127::-;11225:10;11220:3;11216:20;11213:1;11206:31;11256:4;11253:1;11246:15;11280:4;11277:1;11270:15;11296:120;11336:1;11362;11352:35;;11367:18;;:::i;:::-;-1:-1:-1;11401:9:1;;11296:120::o;11421:128::-;11488:9;;;11509:11;;;11506:37;;;11523:18;;:::i;11554:112::-;11586:1;11612;11602:35;;11617:18;;:::i;:::-;-1:-1:-1;11651:9:1;;11554:112::o;11671:303::-;11764:5;11787:1;11797:171;11811:4;11808:1;11805:11;11797:171;;;11870:13;;11858:26;;11913:4;11904:14;;;;11941:17;;;;11831:1;11824:9;11797:171;;;11801:3;;11671:303;;:::o;11979:1584::-;12513:4;12498:20;;12502:9;12595:6;12471:4;12629:604;12643:4;12640:1;12637:11;12629:604;;;12706:6;12700:13;12744:2;12738:9;12733:3;12726:22;12798:4;12794:2;12790:13;12784:20;12777:4;12772:3;12768:14;12761:44;12855:4;12851:2;12847:13;12841:20;12834:4;12829:3;12825:14;12818:44;12912:4;12908:2;12904:13;12898:20;12891:4;12886:3;12882:14;12875:44;12969:4;12965:2;12961:13;12955:20;12948:4;12943:3;12939:14;12932:44;13026:4;13022:2;13018:13;13012:20;13005:4;13000:3;12996:14;12989:44;13083:4;13079:2;13075:13;13069:20;13062:4;13057:3;13053:14;13046:44;13140:4;13136:2;13132:13;13126:20;13119:4;13114:3;13110:14;13103:44;;13176:6;13171:3;13167:16;13160:23;;13218:4;13210:6;13206:17;13196:27;;12663:1;12660;12656:9;12651:14;;12629:604;;;12633:3;;;13242:54;13290:4;13279:9;13275:20;13267:6;13242:54;:::i;:::-;13305;13353:4;13342:9;13338:20;13330:6;13305:54;:::i;:::-;13397:6;13390:4;13379:9;13375:20;13368:36;13442:6;13435:4;13424:9;13420:20;13413:36;13458:54;13506:4;13495:9;13491:20;13483:6;13458:54;:::i;:::-;13550:6;13543:4;13532:9;13528:20;13521:36;11979:1584;;;;;;;;;;:::o;13568:623::-;13629:5;13682:3;13675:4;13667:6;13663:17;13659:27;13649:55;;13700:1;13697;13690:12;13649:55;13802:20;13779:3;13802:20;:::i;:::-;13846:3;13884;13876:6;13872:16;13911:3;13903:6;13900:15;13897:35;;;13928:1;13925;13918:12;13897:35;13952:6;13967:193;13983:6;13978:3;13975:15;13967:193;;;14075:10;;14098:18;;14145:4;14136:14;;;;14000;13967:193;;;-1:-1:-1;14178:7:1;;13568:623;-1:-1:-1;;;;;13568:623:1:o;14196:2087::-;14405:6;14413;14421;14429;14482:4;14470:9;14461:7;14457:23;14453:34;14450:54;;;14500:1;14497;14490:12;14450:54;14549:7;14542:4;14531:9;14527:20;14523:34;14513:62;;14571:1;14568;14561:12;14513:62;14650:3;14673:20;14650:3;14673:20;:::i;:::-;14715:3;14756:4;14745:9;14741:20;14784:7;14776:6;14773:19;14770:39;;;14805:1;14802;14795:12;14770:39;14829:9;14847:1165;14863:6;14858:3;14855:15;14847:1165;;;14947:6;14941:3;14932:7;14928:17;14924:30;14921:50;;;14967:1;14964;14957:12;14921:50;14997:22;;:::i;:::-;15072:10;;15095:22;;15185:2;15176:12;;;15170:19;15209:14;;;15202:31;15301:2;15292:12;;;15286:19;15325:14;;;15318:31;15417:2;15408:12;;;15402:19;15441:14;;;15434:31;15533:3;15524:13;;;15518:20;15558:15;;;15551:32;15651:3;15642:13;;;15636:20;15676:15;;;15669:32;15760:14;;;15754:21;15795:16;;;15788:33;15889:3;15880:13;;;15874:20;15914:15;;;15907:32;15952:18;;;15990:12;;;;;14889:6;14880:16;14847:1165;;;14851:3;16031:5;16021:15;;16055:52;16099:7;16091:6;16055:52;:::i;:::-;16045:62;;;;;;16126:66;16184:7;16177:4;16166:9;16162:20;16126:66;:::i;:::-;16116:76;;16211:66;16269:7;16262:4;16251:9;16247:20;16211:66;:::i;:::-;16201:76;;14196:2087;;;;;;;:::o
Swarm Source
ipfs://524433e6869604e128b81d41b8fd95f345817686849ae30a63656da06efcfe14
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.