
来喝一杯吧,赏金猎人!










角色
无主之城是一款让你可以经营自己酒馆的虚拟游戏。
在无主之城中,你可以招募赏金猎人,为他们派发任务以及获取奖励。你也完全可以成为一名赏金猎人来完成任务来获取奖励。
悬赏者 悬赏者发布任务来完成预期目标。在无主之城世界中悬赏者是所有任务的发布者,也是所有任务奖励的提供者。
酒馆掌柜 拥有某个酒馆的用户即为掌柜。一旦你成为掌柜,就会拥有酒馆的买卖权限,同时也拥有酒馆任务奖励的分成权限。
赏金猎人 赏金猎人可以在不同的酒馆中领取悬赏者发布的任务。当把任务完成后,赏金猎人将会得到相应的奖励。
交易在OpenSea
OpenSea 是全世界最大的数字收藏品交易市场。在这里你可以你可以购买、出售和发现独一无二的数字资产。
#800
Shanghai Circus World
121.446536, 31.2797366
0x35d4**09710
Max AP
84
Level
53
Hunters
#1800
Shanghai Art Museum
121.490278, 31.1864101
0x35d4**09607
Max AP
71
Level
50
Hunters
#0
Oriental Pearl Tower
121.495376, 31.2416800
0x35d4**091,121
Max AP
131
Level
496
Hunters
#101
Jing'an Temple
12144.0712, 31.2253722
0x35d4**091,044
Max AP
122
Level
148
Hunters
#100
Bund 27, The House of Roosevelt
121.485552, 31.2423914
0x35d4**09949
Max AP
111
Level
107
Hunters
#801
Xujiahui Saint Ignatius Cathedral
121.431471, 31.1930143
0x35d4**09684
Max AP
80
Level
48
Hunters
#1801
Hengshan Moller Villa Hotel Shanghai
121.451688, 31.2248880
0x1a08**ed581
Max AP
68
Level
47
Hunters
#802
City God Temple of Shanghai
121.488054, 31.2277205
0x35d4**09616
Max AP
73
Level
34
Hunters
智能合约
无主之城整体构建在以太坊上。所有智能合约互相关联形成整体的去中心化体系。
pragma solidity ^0.4.24;
import "../lib/SafeMath.sol";
import "./ITavern.sol";
contract TavernBase is ITavern {
using SafeMath for *;
struct Tavern {
uint256 initAt; // The time of tavern init
int longitude; // The longitude of tavern
int latitude; // The latitude of tavern
uint8 popularity; // The popularity of tavern
uint256 activeness; // The activeness of tavern
}
uint8 public constant decimals = 16; // longitude latitude decimals
mapping(uint256 => Tavern) internal tokenTaverns;
function _tavern(uint256 _tokenId) internal view returns (uint256, int, int, uint8, uint256) {
Tavern storage tavern = tokenTaverns[_tokenId];
return (
tavern.initAt,
tavern.longitude,
tavern.latitude,
tavern.popularity,
tavern.activeness
);
}
function _isBuilt(uint256 _tokenId) internal view returns (bool){
Tavern storage tavern = tokenTaverns[_tokenId];
return (tavern.initAt > 0);
}
function _build(
uint256 _tokenId,
int _longitude,
int _latitude,
uint8 _popularity
) internal {
// Check whether tokenid has been initialized
require(!_isBuilt(_tokenId));
require(_isLongitude(_longitude));
require(_isLatitude(_latitude));
require(_popularity != 0);
uint256 time = block.timestamp;
Tavern memory tavern = Tavern(
time, _longitude, _latitude, _popularity, uint256(0)
);
tokenTaverns[_tokenId] = tavern;
emit Build(time, _tokenId, _longitude, _latitude, _popularity);
}
function _batchBuild(
uint256[] _tokenIds,
int[] _longitudes,
int[] _latitudes,
uint8[] _popularitys
) internal {
uint256 i = 0;
while (i < _tokenIds.length) {
_build(
_tokenIds[i],
_longitudes[i],
_latitudes[i],
_popularitys[i]
);
i += 1;
}
}
function _activenessUpgrade(uint256 _tokenId, uint256 _deltaActiveness) internal {
require(_isBuilt(_tokenId));
Tavern storage tavern = tokenTaverns[_tokenId];
uint256 oActiveness = tavern.activeness;
uint256 newActiveness = tavern.activeness.add(_deltaActiveness);
tavern.activeness = newActiveness;
tokenTaverns[_tokenId] = tavern;
emit ActivenessUpgrade(_tokenId, oActiveness, newActiveness);
}
function _batchActivenessUpgrade(uint256[] _tokenIds, uint256[] __deltaActiveness) internal {
uint256 i = 0;
while (i < _tokenIds.length) {
_activenessUpgrade(_tokenIds[i], __deltaActiveness[i]);
i += 1;
}
}
function _popularitySetting(uint256 _tokenId, uint8 _popularity) internal {
require(_isBuilt(_tokenId));
uint8 oPopularity = tokenTaverns[_tokenId].popularity;
tokenTaverns[_tokenId].popularity = _popularity;
emit PopularitySetting(_tokenId, oPopularity, _popularity);
}
function _batchPopularitySetting(uint256[] _tokenIds, uint8[] _popularitys) internal {
uint256 i = 0;
while (i < _tokenIds.length) {
_popularitySetting(_tokenIds[i], _popularitys[i]);
i += 1;
}
}
function _isLongitude (
int _param
) internal pure returns (bool){
return(
_param <= 180 * int(10 ** uint256(decimals))&&
_param >= -180 * int(10 ** uint256(decimals))
);
}
function _isLatitude (
int _param
) internal pure returns (bool){
return(
_param <= 90 * int(10 ** uint256(decimals))&&
_param >= -90 * int(10 ** uint256(decimals))
);
}
}