pragma solidity >=0.6.0; contract questFreeton{ constructor() public { require(tvm.pubkey() != 0); tvm.accept(); } uint16 constant SIEGE_TIME = 10770; uint24 constant QUEST_WINDOW_TIME = 86400; uint16 version = 0; uint16 questID =0; struct PirateStation{ string blkch; uint24[] crd; uint16 siegeTime; uint24 exculibr; uint24 loki; uint32[] tokens; uint16 questID; uint24 appearance; } struct Pool{ string blkch; uint8 minStCount; uint8 maxStCount; uint24 shipsCoeff; uint32[] tCount; } mapping(uint32=>PirateStation) maplogs; function setCode(TvmCell newcode) public onlyOwner { tvm.setcode(newcode); tvm.setCurrentCode(newcode); onCodeUpgrade(); } function onCodeUpgrade() private { version += 1; } modifier onlyOwner(){ require(msg.pubkey() == tvm.pubkey(), 100); tvm.accept(); _; } function genCount(uint8 _minCount,uint8 _maxCount) internal pure returns(uint8){ rnd.shuffle(); uint8 _countStation = _minCount + rnd.next(_maxCount - _minCount); return _countStation; } function genCoordinates(uint24 a, uint24 b)internal pure returns(uint24[] crd){ rnd.shuffle(); uint24 crdX = a + rnd.next(b); crd.push(crdX); rnd.shuffle(); uint24 crdY = a + rnd.next(b); crd.push(crdY); } function getPrize(uint32[] tokenArray,uint8 count)internal pure returns(uint32[] tokens){ uint32 genPrize; for(uint8 k=0;k<tokenArray.length;k++){ if(tokenArray[k]<=0){ tokens.push(0); continue; } else { uint32 halfLimit = tokenArray[k] / count / 2; rnd.shuffle(); genPrize = halfLimit + rnd.next(halfLimit); tokens.push(genPrize); } } } function genQuestPoint(Pool _pool,uint8 _count,uint8 _type) internal returns(PirateStation[]){ PirateStation[] _ps; uint24 _appearance = 0; uint16 _questID = questID; PirateStation tmpStation; for(uint8 j=1;j<=_count;j++){ tmpStation.blkch = _pool.blkch; if(_type == 0){ if(j % 3 == 0){ tmpStation.crd = genCoordinates(5000,30000); } else { tmpStation.crd = genCoordinates(12000,9000); } } else if(_type == 1){ if(j % 3 == 0){ tmpStation.crd = genCoordinates(5000,123000); } else { tmpStation.crd = genCoordinates(45000,38000); } } rnd.shuffle(); tmpStation.siegeTime = SIEGE_TIME + rnd.next(SIEGE_TIME); (tmpStation.exculibr,tmpStation.loki) = getShips(_pool.shipsCoeff); tmpStation.tokens = getPrize(_pool.tCount,_count); tmpStation.questID = _questID; tmpStation.appearance = _appearance; _ps.push(tmpStation); maplogs[_questID] = tmpStation; if(_count != 1){ _appearance += QUEST_WINDOW_TIME / uint24(_count -1); } _questID += 1; } questID = _questID; return _ps; } function getShips(uint24 shipsCoeff) internal pure returns(uint24 exculibr, uint24 loki){ rnd.shuffle(); exculibr = 2 * rnd.next(shipsCoeff); loki = exculibr * 2; } function setTokens(Pool _pool,uint8 _type)public onlyOwner returns(bool,PirateStation[] _ps){ uint8 _count; _count = genCount(_pool.minStCount, _pool.maxStCount); _ps = genQuestPoint(_pool,_count,_type); return (true,_ps); } function getLogs(uint32 id)view onlyOwner external returns(PirateStation){ return maplogs[id]; } }
0.4.18