Source Code

;; title: MindDexq
;; version:
;; summary:
;; description:

;; title: quest
;; version:
;; summary:
;; description:
;; Constants
(define-constant ERR-NOT-ADMIN (err u100))
(define-constant ERR-NOT-FOUND (err u101))
(define-constant ERR-INVALID-PARAMS (err u102))
(define-constant ERR-UNAUTHORIZED (err u103))
(define-constant ERR-INVALID-PRICE (err u104))
(define-constant ERR-INVALID-LEVEL (err u105))
(define-constant ERR-INVALID-TEAM (err u106))

;; traits
;;
;; Data Variables
(define-data-var admin principal tx-sender)
(define-data-var min-price uint u1)
(define-data-var max-price uint u1000000000)
(define-data-var max-level uint u100)

;; token definitions
;;
;; Non-Fungible Token Definition
(define-non-fungible-token game-item uint)

;; constants
;;
;; Maps
(define-map players
  principal
  {
    level: uint,
    experience: uint,
    inventory: (list 10 uint),
    achievements: (list 5 uint),
  }
)

;; data vars
;;
(define-map teams
  uint
  {
    leader: principal,
    members: (list 4 principal),
  }
)

;; data maps
;;
(define-map market-listings
  uint
  {
    price: uint,
    seller: principal,
    active: bool,
  }
)

;; Private functions
;;
(define-private (is-valid-item (item-id uint))
  (is-some (nft-get-owner? game-item item-id))
)

(define-private (validate-price (price uint))
  (and
    (>= price (var-get min-price))
    (<= price (var-get max-price))
  )
)

(define-private (validate-level (level uint))
  (<= level (var-get max-level))
)

(define-private (own-item (item-id uint))
  (is-eq (some tx-sender) (nft-get-owner? game-item item-id))
)

;; Read-Only Functions
(define-read-only (get-player-data (player principal))
  (map-get? players player)
)

(define-read-only (get-team-data (team-id uint))
  (map-get? teams team-id)
)

(define-read-only (get-market-listing (item-id uint))
  (map-get? market-listings item-id)
)

;; Player Management
(define-public (register-player)
  (begin
    (asserts! (is-none (map-get? players tx-sender)) ERR-INVALID-PARAMS)
    (ok (map-set players tx-sender {
      level: u1,
      experience: u0,
      inventory: (list u0 u0 u0 u0 u0 u0 u0 u0 u0 u0),
      achievements: (list u0 u0 u0 u0 u0),
    }))
  )
)

;; Team System
(define-public (create-team (team-id uint))
  (begin
    (asserts! (is-none (map-get? teams team-id)) ERR-INVALID-TEAM)
    (asserts! (is-some (map-get? players tx-sender)) ERR-NOT-FOUND)
    (ok (map-set teams team-id {
      leader: tx-sender,
      members: (list tx-sender tx-sender tx-sender tx-sender),
    }))
  )
)

;; Marketplace System
(define-public (list-item-for-sale
    (item-id uint)
    (price uint)
  )
  (begin
    (asserts! (validate-price price) ERR-INVALID-PRICE)
    (asserts! (own-item item-id) ERR-UNAUTHORIZED)
    (asserts! (is-valid-item item-id) ERR-NOT-FOUND)
    (ok (map-set market-listings item-id {
      price: price,
      seller: tx-sender,
      active: true,
    }))
  )
)

(define-public (buy-item (item-id uint))
  (let (
      (listing (unwrap! (map-get? market-listings item-id) ERR-NOT-FOUND))
      (price (get price listing))
      (seller (get seller listing))
      (active (get active listing))
    )
    (begin
      (asserts! active ERR-NOT-FOUND)
      (asserts! (is-valid-item item-id) ERR-NOT-FOUND)
      (try! (stx-transfer? price tx-sender seller))
      (try! (nft-transfer? game-item item-id seller tx-sender))
      (map-set market-listings item-id (merge listing { active: false }))
      (ok true)
    )
  )
)

;; Game Item Management
(define-public (mint-item
    (item-id uint)
    (recipient principal)
  )
  (begin
    (asserts! (is-eq tx-sender (var-get admin)) ERR-NOT-ADMIN)
    (asserts! (is-some (map-get? players recipient)) ERR-NOT-FOUND)
    (asserts! (not (is-valid-item item-id)) ERR-INVALID-PARAMS)
    (nft-mint? game-item item-id recipient)
  )
)

;; Player Progress
(define-public (gain-experience (amount uint))
  (let (
      (player-data (unwrap! (map-get? players tx-sender) ERR-NOT-FOUND))
      (current-exp (get experience player-data))
      (new-exp (+ current-exp amount))
    )
    (ok (map-set players tx-sender (merge player-data { experience: new-exp })))
  )
)

;; Level System
(define-public (level-up)
  (let (
      (player-data (unwrap! (map-get? players tx-sender) ERR-NOT-FOUND))
      (current-exp (get experience player-data))
      (current-level (get level player-data))
      (next-level (+ current-level u1))
    )
    (begin
      (asserts! (validate-level next-level) ERR-INVALID-LEVEL)
      (asserts! (>= current-exp (* current-level u100)) ERR-INVALID-PARAMS)
      (ok (map-set players tx-sender
        (merge player-data {
          level: next-level,
          experience: u0,
        })
      ))
    )
  )
)

;; Admin Functions
(define-public (set-admin (new-admin principal))
  (begin
    (asserts! (is-eq tx-sender (var-get admin)) ERR-NOT-ADMIN)
    (asserts! (not (is-eq new-admin (var-get admin))) ERR-INVALID-PARAMS)
    (ok (var-set admin new-admin))
  )
)

Functions (13)

FunctionAccessArgs
level-uppublic
is-valid-itemprivateitem-id: uint
validate-priceprivateprice: uint
validate-levelprivatelevel: uint
own-itemprivateitem-id: uint
get-player-dataread-onlyplayer: principal
get-team-dataread-onlyteam-id: uint
get-market-listingread-onlyitem-id: uint
register-playerpublic
create-teampublicteam-id: uint
buy-itempublicitem-id: uint
gain-experiencepublicamount: uint
set-adminpublicnew-admin: principal