/ contracts / CosmicCowboy.sol
CosmicCowboy.sol
 1  // SPDX-License-Identifier: MIT
 2  pragma solidity ^0.8.20;
 3  
 4  import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
 5  import "@openzeppelin/contracts/access/Ownable.sol";
 6  import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
 7  import "@openzeppelin/contracts/utils/Strings.sol";
 8  
 9  contract CosmicCowboys is ERC721, Ownable, ERC721URIStorage {
10      uint256 private _nextTokenId;
11      uint256 public latestTokenId;
12      enum Location {
13          Home,
14          Bar,
15          SupplyDepot
16      }
17      mapping(uint256 => Location) public tokenLocation;
18      mapping(uint256 => uint8) public tokenHealth; // Mapping to store health of each token
19  
20      // Events
21      event VisitArea(uint256 indexed tokenId, string location);
22      event GetCurrentLocation(uint256 indexed tokenId, string location);
23      event SetHealth(uint256 indexed tokenId, uint8 health); // Event emitted when health is set
24  
25      constructor(
26          address initialOwner
27      ) ERC721("Cosmic Cowboys", "CCNPC") Ownable(initialOwner) {}
28  
29      //function to set health
30      function setHealth(uint256 tokenId, uint8 health) public onlyOwner {
31          require(health >= 0 && health <= 10, "Health out of range"); // Check health is within valid range
32          tokenHealth[tokenId] = health;
33          emit SetHealth(tokenId, health); // Emit event
34      }
35  
36      function safeMint(address to, string memory uri) public onlyOwner {
37          uint256 tokenId = _nextTokenId++;
38          latestTokenId = tokenId;
39          _safeMint(to, tokenId);
40          _setTokenURI(tokenId, uri);
41          setHealth(tokenId, 6);
42          tokenLocation[tokenId] = Location.Bar;
43      }
44  
45      // Function to get health of a token
46      function getHealth(uint256 tokenId) external view returns (uint8) {
47          return tokenHealth[tokenId];
48      }
49  
50      // Function to visit a location
51  
52      function goToHome(uint256 tokenId) external {
53          tokenLocation[tokenId] = Location.Home;
54          emit VisitArea(tokenId, locationToString(Location.Home));
55      }
56  
57      function goToBar(uint256 tokenId) external {
58          tokenLocation[tokenId] = Location.Bar;
59          emit VisitArea(tokenId, locationToString(Location.Bar));
60      }
61  
62      function goToSupplyDepot(uint256 tokenId) external {
63          tokenLocation[tokenId] = Location.SupplyDepot;
64          emit VisitArea(tokenId, locationToString(Location.SupplyDepot));
65      }
66  
67      // Function to get the current location of a token
68      function getCurrentLocation(
69          uint256 tokenId
70      ) external view returns (string memory) {
71          Location _location = tokenLocation[tokenId];
72          return locationToString(_location);
73      }
74  
75      // Utility function to convert enum to string
76      function locationToString(
77          Location _location
78      ) internal pure returns (string memory) {
79          if (_location == Location.SupplyDepot) return "Supply Depot";
80          if (_location == Location.Bar) return "Bar";
81          return "Home";
82      }
83  
84      // The following functions are overrides required by Solidity.
85  
86      function tokenURI(
87          uint256 tokenId
88      ) public view override(ERC721, ERC721URIStorage) returns (string memory) {
89          return super.tokenURI(tokenId);
90      }
91  
92      function supportsInterface(
93          bytes4 interfaceId
94      ) public view override(ERC721, ERC721URIStorage) returns (bool) {
95          return super.supportsInterface(interfaceId);
96      }
97  }