small refactors
This commit is contained in:
parent
86ad9c5e1a
commit
9e15e0eb2a
@ -10,8 +10,8 @@ import "../src/Constants.sol";
|
|||||||
|
|
||||||
contract RaidGeld is ERC20, Ownable, Constants {
|
contract RaidGeld is ERC20, Ownable, Constants {
|
||||||
uint256 public constant MANTISSA = 1e4;
|
uint256 public constant MANTISSA = 1e4;
|
||||||
uint256 public constant BUY_IN_AMOUNT = 0.0005 ether;
|
uint256 public constant BUY_IN_AMOUNT = 0.00005 ether;
|
||||||
uint256 public immutable BUY_IN_DAO_TOKEN_AMOUNT;
|
uint256 public BUY_IN_DAO_TOKEN_AMOUNT;
|
||||||
uint256 public constant INITIAL_GELD = 50 * MANTISSA;
|
uint256 public constant INITIAL_GELD = 50 * MANTISSA;
|
||||||
mapping(address => Player) private players;
|
mapping(address => Player) private players;
|
||||||
mapping(address => Army) private armies;
|
mapping(address => Army) private armies;
|
||||||
@ -28,6 +28,7 @@ contract RaidGeld is ERC20, Ownable, Constants {
|
|||||||
// Events
|
// Events
|
||||||
|
|
||||||
event PlayerRegistered(address indexed player, uint256 initialGeld);
|
event PlayerRegistered(address indexed player, uint256 initialGeld);
|
||||||
|
event PleyerStrikesAgain(address indexed player, uint256 totalRewards, uint256 initialGeld);
|
||||||
event RaidPerformed(address indexed player, uint256 totalMinted, uint256 geldBalance);
|
event RaidPerformed(address indexed player, uint256 totalMinted, uint256 geldBalance);
|
||||||
event UnitAdded(
|
event UnitAdded(
|
||||||
address indexed player,
|
address indexed player,
|
||||||
@ -40,6 +41,7 @@ contract RaidGeld is ERC20, Ownable, Constants {
|
|||||||
uint16 anointedLevel,
|
uint16 anointedLevel,
|
||||||
uint16 championLevel
|
uint16 championLevel
|
||||||
);
|
);
|
||||||
|
event DaoTokenBuyInAmountSet(address indexed owner, uint256 oldAmount, uint256 newAmount);
|
||||||
|
|
||||||
// Modifier for functions that should only be available to registered players
|
// Modifier for functions that should only be available to registered players
|
||||||
modifier onlyPlayer() {
|
modifier onlyPlayer() {
|
||||||
@ -53,7 +55,7 @@ contract RaidGeld is ERC20, Ownable, Constants {
|
|||||||
}
|
}
|
||||||
|
|
||||||
modifier newPlay() {
|
modifier newPlay() {
|
||||||
Player memory player = players[msg.sender];
|
Player storage player = players[msg.sender];
|
||||||
bool notRegistered = player.created_at == 0;
|
bool notRegistered = player.created_at == 0;
|
||||||
bool returningPlayer = player.is_registered && !player.has_active_session;
|
bool returningPlayer = player.is_registered && !player.has_active_session;
|
||||||
require(notRegistered || returningPlayer, "Active session already in progress");
|
require(notRegistered || returningPlayer, "Active session already in progress");
|
||||||
@ -72,44 +74,37 @@ contract RaidGeld is ERC20, Ownable, Constants {
|
|||||||
// Mint some starting tokens to the player
|
// Mint some starting tokens to the player
|
||||||
_mint(player, INITIAL_GELD);
|
_mint(player, INITIAL_GELD);
|
||||||
// Reset or set player
|
// Reset or set player
|
||||||
reset_player(player);
|
resetPlayer(player);
|
||||||
players[player].has_active_session = true;
|
players[player].has_active_session = true;
|
||||||
players[player].is_registered = true;
|
players[player].is_registered = true;
|
||||||
players[player].n_runs += 1;
|
players[player].n_runs += 1;
|
||||||
|
|
||||||
if (existing_player) {
|
if (existing_player) {
|
||||||
// TODO: Emit new run
|
// TODO: Emit new run
|
||||||
|
emit PleyerStrikesAgain(player, players[player].total_rewards, INITIAL_GELD);
|
||||||
} else {
|
} else {
|
||||||
// Emit event
|
// Emit event
|
||||||
emit PlayerRegistered(msg.sender, INITIAL_GELD);
|
emit PlayerRegistered(msg.sender, INITIAL_GELD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function reset_player(address addr) private {
|
function resetPlayer(address _playerAddress) private {
|
||||||
Player memory player = players[addr];
|
Player storage player = players[_playerAddress];
|
||||||
uint32 current_n_runs = player.n_runs;
|
|
||||||
uint256 current_total_rewards = player.total_rewards;
|
|
||||||
bool current_is_registered = player.is_registered;
|
|
||||||
uint32 current_prestige_level = player.prestige_level;
|
|
||||||
// Set initial states
|
// Set initial states
|
||||||
players[addr] = Player({
|
|
||||||
total_minted: INITIAL_GELD,
|
player.total_minted = INITIAL_GELD;
|
||||||
created_at: block.timestamp,
|
player.created_at = block.timestamp;
|
||||||
last_raided_at: block.timestamp,
|
player.last_raided_at = block.timestamp;
|
||||||
n_runs: current_n_runs,
|
player.has_active_session = false;
|
||||||
total_rewards: current_total_rewards,
|
|
||||||
has_active_session: false,
|
armies[_playerAddress] = Army({
|
||||||
is_registered: current_is_registered,
|
|
||||||
prestige_level: current_prestige_level
|
|
||||||
});
|
|
||||||
armies[addr] = Army({
|
|
||||||
moloch_denier: Raider({level: 0}),
|
moloch_denier: Raider({level: 0}),
|
||||||
apprentice: Raider({level: 0}),
|
apprentice: Raider({level: 0}),
|
||||||
anointed: Raider({level: 0}),
|
anointed: Raider({level: 0}),
|
||||||
champion: Raider({level: 0}),
|
champion: Raider({level: 0}),
|
||||||
profit_per_second: 0
|
profit_per_second: 0
|
||||||
});
|
});
|
||||||
bosses[addr] = Boss({level: 0, variants: RaidGeldUtils.generate_boss_variants(block.prevrandao)});
|
bosses[_playerAddress] = Boss({level: 0, variants: RaidGeldUtils.generate_boss_variants(block.prevrandao)});
|
||||||
}
|
}
|
||||||
|
|
||||||
// New player want to register with ETH
|
// New player want to register with ETH
|
||||||
@ -202,14 +197,11 @@ contract RaidGeld is ERC20, Ownable, Constants {
|
|||||||
|
|
||||||
uint256 cost = RaidGeldUtils.calculateUnitPrice(unit, currentLevel, n_units);
|
uint256 cost = RaidGeldUtils.calculateUnitPrice(unit, currentLevel, n_units);
|
||||||
|
|
||||||
// First trigger a raid so player receives what he is due at to this moment
|
|
||||||
uint256 time_past = block.timestamp - players[msg.sender].last_raided_at;
|
|
||||||
uint256 new_geld = armies[msg.sender].profit_per_second * time_past;
|
|
||||||
require(balanceOf(msg.sender) + new_geld >= cost, "Not enough GELD to add this unit");
|
|
||||||
performRaid(msg.sender);
|
performRaid(msg.sender);
|
||||||
|
|
||||||
// TODO: Since we are first minting then burning the token, this could be simplified
|
// TODO: Since we are first minting then burning the token, this could be simplified
|
||||||
// by first calculating the difference and then minting / burning in just one operation
|
require(balanceOf(msg.sender) >= cost, "Not enough GELD to add this unit");
|
||||||
|
|
||||||
// then burn the cost of the new army
|
// then burn the cost of the new army
|
||||||
_burn(msg.sender, cost);
|
_burn(msg.sender, cost);
|
||||||
@ -278,11 +270,17 @@ contract RaidGeld is ERC20, Ownable, Constants {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function player_dies(address player) private {
|
function player_dies(address player) private {
|
||||||
reset_player(player);
|
resetPlayer(player);
|
||||||
players[player].has_active_session = false;
|
players[player].has_active_session = false;
|
||||||
_burn(msg.sender, balanceOf(player));
|
_burn(msg.sender, balanceOf(player));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setDaoTokenBuyInAmount(uint256 newAmount) external onlyOwner {
|
||||||
|
require(newAmount > 0, "Amount must be greater than 0");
|
||||||
|
emit DaoTokenBuyInAmountSet(msg.sender, BUY_IN_DAO_TOKEN_AMOUNT, newAmount);
|
||||||
|
BUY_IN_DAO_TOKEN_AMOUNT = newAmount;
|
||||||
|
}
|
||||||
|
|
||||||
receive() external payable {
|
receive() external payable {
|
||||||
revert("No plain Ether accepted, use register() function to check in :)");
|
revert("No plain Ether accepted, use register() function to check in :)");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,6 +22,8 @@ library RaidGeldUtils {
|
|||||||
|
|
||||||
uint256 constant RISK_BETA = 15e17;
|
uint256 constant RISK_BETA = 15e17;
|
||||||
|
|
||||||
|
uint256 constant NUMBER_OF_BOSSES = 7;
|
||||||
|
|
||||||
function getBossPower(uint8 level) internal pure returns (uint256 power) {
|
function getBossPower(uint8 level) internal pure returns (uint256 power) {
|
||||||
require(level <= 7, "Bosses only go to level 7");
|
require(level <= 7, "Bosses only go to level 7");
|
||||||
if (level == 0) return 9000000;
|
if (level == 0) return 9000000;
|
||||||
@ -31,7 +33,6 @@ library RaidGeldUtils {
|
|||||||
else if (level == 4) return 90000000000;
|
else if (level == 4) return 90000000000;
|
||||||
else if (level == 5) return 900000000000;
|
else if (level == 5) return 900000000000;
|
||||||
else if (level == 6) return 9000000000000;
|
else if (level == 6) return 9000000000000;
|
||||||
else return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function getBossCumulativeChance(uint8 level) internal pure returns (uint256 chance) {
|
function getBossCumulativeChance(uint8 level) internal pure returns (uint256 chance) {
|
||||||
@ -102,11 +103,11 @@ library RaidGeldUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Calculates whether user survives the fight
|
// Calculates whether user survives the fight
|
||||||
function calculateBossFight(uint8 bossLevel, uint256 geldBurnt, uint256 prevrandao) internal pure returns (bool) {
|
function calculateBossFight(uint8 bossLevel, uint256 geldBurnt, uint256 _randomSeed) internal pure returns (bool) {
|
||||||
uint256 bossPower = getBossPower(bossLevel);
|
uint256 bossPower = getBossPower(bossLevel);
|
||||||
uint256 bossRoll = getBossChance(bossLevel);
|
uint256 bossRoll = getBossChance(bossLevel);
|
||||||
require(geldBurnt <= bossPower, "Cant try to defeat boss with more than what boss power is");
|
require(geldBurnt <= bossPower, "Cant try to defeat boss with more than what boss power is");
|
||||||
uint256 random_n = random(prevrandao, 1, 100);
|
uint256 random_n = random(_randomSeed, 1, 100);
|
||||||
// Relative power as in, you can only put in 800 geld to defeat 900 geld boss,
|
// Relative power as in, you can only put in 800 geld to defeat 900 geld boss,
|
||||||
// but you will get exponentially worse chances
|
// but you will get exponentially worse chances
|
||||||
uint256 relativePower = ((geldBurnt ** 2) * 100) / bossPower ** 2;
|
uint256 relativePower = ((geldBurnt ** 2) * 100) / bossPower ** 2;
|
||||||
@ -114,25 +115,25 @@ library RaidGeldUtils {
|
|||||||
return roll < bossRoll;
|
return roll < bossRoll;
|
||||||
}
|
}
|
||||||
|
|
||||||
function generate_boss_variants(uint256 prevrandao) internal pure returns (uint8[7] memory boss_variants) {
|
function generate_boss_variants(uint256 _randomSeed) internal pure returns (uint8[7] memory boss_variants) {
|
||||||
// We shuffle the possible variants so each run is a bit different
|
// We shuffle the possible variants so each run is a bit different
|
||||||
uint8[6] memory array = [0, 1, 2, 3, 4, 5];
|
uint8[NUMBER_OF_BOSSES] memory array = [0, 1, 2, 3, 4, 5, 6];
|
||||||
for (uint256 i = array.length - 1; i > 0; i--) {
|
for (uint256 i = NUMBER_OF_BOSSES - 2; i > 0; i--) {
|
||||||
// generate a pseudo-random index based on the prevrandao
|
// generate a pseudo-random index based on the prevrandao
|
||||||
uint256 j = uint256(keccak256(abi.encodePacked(prevrandao, i))) % (i + 1);
|
uint256 j = uint256(keccak256(abi.encodePacked(_randomSeed, i))) % (i + 1);
|
||||||
// swap elements at i and j
|
// swap elements at i and j
|
||||||
(array[i], array[j]) = (array[j], array[i]);
|
(array[i], array[j]) = (array[j], array[i]);
|
||||||
}
|
}
|
||||||
// Last boss is always the same old super Moloch
|
// Last boss is always the same old super Moloch
|
||||||
return [array[0], array[1], array[2], array[3], array[4], array[5], 6];
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Implement actual randomness
|
// TODO: Implement actual randomness
|
||||||
function random(uint256 prevrandao, uint256 min, uint256 max) internal pure returns (uint256) {
|
function random(uint256 _randomSeed, uint256 min, uint256 max) internal pure returns (uint256) {
|
||||||
// returns 0 - 100
|
// returns 0 - 100
|
||||||
require(max > min, "Max must be greater than min");
|
require(max > min, "Max must be greater than min");
|
||||||
require(max < type(uint256).max, "Dont use largest possible uint");
|
require(max < type(uint256).max, "Dont use largest possible uint");
|
||||||
uint256 range = max - min + 1;
|
uint256 range = max - min + 1;
|
||||||
return min + (uint256(keccak256(abi.encodePacked(prevrandao))) % range);
|
return min + (uint256(keccak256(abi.encodePacked(_randomSeed))) % range);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user