Untitled
unknown
plain_text
2 years ago
4.3 kB
13
Indexable
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SolahParchiThap {
error Unauthorized();
error Invalid_player();
error Invalid_distribution();
error Gameon();
error Gameoff();
address immutable owner;
uint256 constant duration = 1 hours;
uint8 turn;
address[4] private players;
uint8[4][4] private chits;
uint256 startTime;
mapping(address => uint256) wins;
constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
if(msg.sender != owner) {
revert Unauthorized();
}
_;
}
modifier isGameEnded() {
if(startTime != 0) {
revert Gameon();
}
_;
}
modifier isGameStarted() {
if(startTime == 0) {
revert Gameoff();
}
_;
}
// To set and start the game
function setState(address[4] memory _players, uint8[4][4] memory _parchis) public onlyOwner isGameEnded {
for (uint8 i; i<4; ){
if(_players[i] == address(0) || _players[i] == owner) {
revert Invalid_player();
}
uint8 sum;
for(uint8 j; j<4;){
uint8 num = _parchis[i][j];
sum = sum + num;
if(num > 4) {
revert Invalid_distribution();
}
unchecked {
j = j+1;
}
}
if(i==0 && sum > 4) {
revert Invalid_distribution();
}
unchecked {
i = i+1;
}
}
players = _players;
chits = _parchis;
startTime = block.timestamp;
}
// To pass the parchi to next player
function passParchi(uint8 _parchi) public isGameStarted {
if(msg.sender != players[turn] || chits[turn][_parchi-1] < 1) {
revert Unauthorized();
}
uint8 _turn = turn;
chits[_turn][_parchi-1] -= 1;
turn = (_turn + 1) % 4;
chits[turn][_parchi-1] += 1;
if(chits[turn][_parchi-1] > 4) {
revert Invalid_distribution();
}
}
// To claim win
function claimWin() public isGameStarted {
for (uint8 i; i<4;) {
if (players[i] == msg.sender) {
for (uint8 j; j < 4; ) {
if (chits[i][j] == 4) {
wins[msg.sender] += 1;
startTime = 0;
return;
}
unchecked {
j = j+1;
}
}
}
unchecked {
i = i+1;
}
}
revert Unauthorized();
}
// To end the game
function endGame() public {
for(uint8 i; i<4;) {
if (players[i] == msg.sender) {
if(block.timestamp >= (startTime + duration)){
startTime = 0;
return;
}
}
unchecked {
i = i + 1;
}
}
revert Unauthorized();
}
// To see the number of wins
function getWins(address add) public view returns (uint256) {
for (uint8 i; i<4;) {
if (players[i] == add) {
return wins[add];
}
unchecked{
i = i+1;
}
}
revert Unauthorized();
}
// To see the parchis held by the caller of this function
function myParchis() public isGameStarted view returns (uint8[4] memory) {
for (uint8 i; i<4;) {
if (msg.sender == players[i]) {
return chits[i];
}
unchecked {
i = i+1;
}
}
revert Unauthorized();
}
// To get the state of the game
function getState() public view onlyOwner isGameStarted returns (address[4] memory, address, uint8[4][4] memory) {
return (players, players[turn], chits);
}
}Editor is loading...