Type
CONTRACT
Validation date
2025-05-12 20:00:01 UTC
Fee
0 UCO

Code (2.04 KB)

@version 1

# Battlechain : Decentralized turn based battle game 

# max players number : 1000


# reset action points daily at midnight
# action points can be used for : attack , heal , feed and many more coming ...
# the reset is read and consumed when player do their first resfresh action of the day ( new day find)
actions triggered_by: interval, at: "0 0 * * *" do
  
  current_day = State.get("day",1)
  State.set("day", current_day + 1 )

end

# end turn every 30 minutes 
# player can do only one action per turn
actions triggered_by: interval, at: "*/30 * * * *" do
  
  current_turn = State.get("turn",1)
  State.set("turn", current_turn + 1 )

end



# player can resurrect their archmon every 12 hours
actions triggered_by: interval, at: "0 */12 * * *" do
  
  current_round = State.get("round",1)
  State.set("round", current_round + 1)

end


condition triggered_by: transaction, on: add_player(), as: [
  content:  ( 
      player_previous_address = Chain.get_previous_address(transaction)

      player = get_player(Chain.get_genesis_address(player_previous_address))
      player == nil
   )
]

actions triggered_by: transaction, on: add_player() do
  
  player_genesis_address = Chain.get_genesis_address(transaction.address)
  base_health = 10
  base_power = 2

  archmon = [ 
    level: 1,
    xp: 0,
    base_health: base_health,
    base_power: base_power,
    health: base_health,
    power: base_power,
    is_ko: false
  ]


  player = [
    action_points: 10,
    consumed_day: State.get("day",1) - 1,
    consumed_round: State.get("round",1) - 1,
    consumed_turn: State.get("turn",1) - 1 ,
    last_action: [version: 0],
    archmon: archmon
  ]

  players = State.get("players", Map.new())
  players = Map.set(players,player_genesis_address, player)
  
  State.set("players",players)

end

 

condition triggered_by: transaction, on: attack(player_address), as: [
  content:  (
            player_attacker_previous_address = Chain.get_previous_address(transaction)
            player_attacker_genesis_address = Chain.get_genesis_address(player_attacker_previous_address)
            player_defender_genesis_address = Chain.get_genesis_address(String.to_hex(player_address))
            

            player_attacker = get_player(player_attacker_genesis_address)
            player_defender = get_player(player_defender_genesis_address)

            #if player_attacker_genesis_address != player_defender_genesis_address  do
            
              players_are_known? = player_attacker != nil && player_defender != nil
              archmons_ko? = !player_attacker.archmon.is_ko && !player_defender.archmon.is_ko

              players_are_known? && archmons_ko? && player_attacker.action_points > 0 && player.consumed_turn < State.get("turn",1)
           
            #else 

              #false 

            #end

           
  )
]

actions triggered_by: transaction, on: attack(player_address) do

players = State.get("players")

 
  player_attacker_previous_address = Chain.get_previous_address(transaction)
  player_attacker_genesis_address = Chain.get_genesis_address(player_attacker_previous_address)

  player_defender_genesis_address = Chain.get_genesis_address(String.to_hex(player_address))
  

   player_attacker = Map.get(players,player_attacker_genesis_address)
   player_defender = Map.get(players,player_defender_genesis_address)

   attacker_power = player_attacker.archmon.power
   defender_health = player_defender.archmon.health - attacker_power


action_code = nil

defender_archmon =  player_defender.archmon

if defender_health <= 0  do

defender_archmon = Map.set(defender_archmon,"health", 0)
defender_archmon = Map.set(defender_archmon,"is_ko", true)


action_code = "ko"

else

defender_archmon = Map.set(defender_archmon,"health", defender_health)

action_code = "hit"


end

action = create_action(player_attacker, action_code, player_defender_genesis_address, nil)

player_defender = Map.set(player_defender,"archmon",defender_archmon )


player_attacker = Map.set(player_attacker,"last_action",action)
player_attacker = Map.set(player_attacker,"action_points", player_attacker.action_points - 1)
player_attacker = Map.set(player_attacker,"consumed_turn", State.get("turn",1))

players = Map.set(players,player_attacker_genesis_address, player_attacker)
players = Map.set(players,player_defender_genesis_address, player_defender)

State.set("players", players)

Contract.set_content(Json.to_string(action))

end


condition triggered_by: transaction, on: feed(), as: [

 content: ( 
   player_previous_address = Chain.get_previous_address(transaction)
  player_genesis_address = Chain.get_genesis_address(player_previous_address)
  player = get_player(player_genesis_address)
  player != nil && !player.archmon.is_ko && player.action_points > 0 && player.consumed_turn < State.get("turn",1)

  )

]

actions triggered_by: transaction, on: feed() do
  players = State.get("players")
  player_previous_address = Chain.get_previous_address(transaction)
  player_genesis_address = Chain.get_genesis_address(player_previous_address)
  player = Map.get(players,player_genesis_address)
  
  archmon = player.archmon

  exp_from_feed = 20
 
  xp_after_feed = archmon.xp + exp_from_feed
  xp_to_next_level = get_xp_to_next_level(archmon.level)

  message = nil

  if xp_after_feed >= xp_to_next_level do

  add_xp = xp_after_feed - xp_to_next_level
  #level up
  archmon = level_up(archmon, add_xp )

  message ="level up"

  else

  archmon = Map.set(archmon,"xp", xp_after_feed)

  message ="xp up"
  
  end

action = create_action(player, "feed",player_genesis_address,message)


player = Map.set(player,"last_action", action)
player = Map.set(player,"action_points", player.action_points - 1)
player = Map.set(player,"consumed_turn", State.get("turn",1))


player = Map.set(player,"archmon", archmon)

players = Map.set(players,player_genesis_address,player)

State.set("players", players)
Contract.set_content(Json.to_string(action))

end

condition triggered_by: transaction, on: heal(), as: [
  content: (
    player_previous_address = Chain.get_previous_address(transaction)
      player_genesis_address = Chain.get_genesis_address(player_previous_address)
      player = get_player(player_genesis_address)
      if player != nil  && player.action_points > 0 do

        player.consumed_turn < State.get("turn",1) && !player.archmon.is_ko  && player.archmon.health < player.archmon.base_health  
       
  
      else 

        false

      end
      )
]
actions triggered_by: transaction, on: heal() do
players = State.get("players")
player_previous_address = Chain.get_previous_address(transaction)
player_genesis_address = Chain.get_genesis_address(player_previous_address)

player = Map.get(players,player_genesis_address)

archmon = player.archmon

if archmon.health + archmon.power < archmon.base_health do

archmon = Map.set(archmon,"health", archmon.health + archmon.power)

else

archmon = Map.set(archmon,"health", archmon.base_health)

end


action = create_action(player, "heal", player_genesis_address, nil)



player = Map.set(player,"last_action",action)
player = Map.set(player,"action_points", player.action_points - 1 )
player = Map.set(player,"consumed_turn",State.get("turn",1))

player = Map.set(player,"archmon",archmon)

players = Map.set(players,player_genesis_address,player)

State.set("players", players)

Contract.set_content(Json.to_string(action))
  
end

condition triggered_by: transaction, on: refresh_action_points(), as: [
  content: (
    player_previous_address = Chain.get_previous_address(transaction)
    player_genesis_address = Chain.get_genesis_address(player_previous_address)
    player = get_player(player_genesis_address)
    player != nil && player.consumed_day < State.get("day", 1)) && player.action_points == 0

]

actions triggered_by: transaction, on: refresh_action_points() do
  players = State.get("players")
  player_previous_address = Chain.get_previous_address(transaction)
  player_genesis_address = Chain.get_genesis_address(player_previous_address)
  player = Map.get(players,player_genesis_address)

 player = Map.set(player,"action_points", 10)
 player = Map.set(player,"consumed_day",State.get("day",1))

players = Map.set(players,player_genesis_address, player)

State.set("players", players)
end



condition triggered_by: transaction, on: resurrect(), as: [
  content:  (
      player_previous_address = Chain.get_previous_address(transaction)
      player_genesis_address = Chain.get_genesis_address(player_previous_address)
      player = get_player(player_genesis_address)
      player != nil && player.archmon.is_ko && player.consumed_round < State.get("round",1)
       
   )

]



actions triggered_by: transaction, on: resurrect() do
  players = State.get("players")
  player_previous_address = Chain.get_previous_address(transaction)
  player_genesis_address = Chain.get_genesis_address(player_previous_address)
  player = Map.get(players,player_genesis_address )

  archmon = player.archmon
  
  archmon = Map.set(archmon, "health", archmon.base_health)
  archmon = Map.set(archmon, "is_ko", false)

  player = Map.set(player,"archmon", archmon)
  player = Map.set(player,"consumed_round", State.get("round",1))
  
  players = Map.set(players,player_genesis_address,player)
  State.set("players",players)

end

fun create_action(player,code,target,message) do

last_action = Map.get(player,"last_action")

action = [
  code: code,
  message: message,
  version: last_action.version + 1
]

action

end

fun save_action(player,action) do

  player = Map.set(player,"last_action",action)
  player = Map.set(player,"action_points", player.action_points - 1)


  player

end

fun level_up(archmon,add_xp) do

 archmon = Map.set(archmon,"base_health", archmon.base_health + 5)
 archmon = Map.set(archmon,"health", archmon.base_health)

 archmon = Map.set(archmon,"base_power", archmon.base_power + 1)
 archmon = Map.set(archmon,"power", archmon.base_power)

 archmon = Map.set(archmon,"level", archmon.level + 1)
 archmon = Map.set(archmon,"xp",add_xp)

 archmon

end

fun get_xp_to_next_level(current_level) do

 
  current_level * 20

end



fun is_known(player_genesis_address) do 
players = State.get("players", Map.new())

 player = Map.get(players, player_genesis_address)

 player != nil

end

fun get_player(player_genesis_address) do

players = State.get("players", Map.new())

 Map.get(players, player_genesis_address, nil)

end




export fun get_player_info(player_genesis_address) do
  player_genesis_address = String.to_hex(player_genesis_address)

  players = State.get("players", Map.new())


  Map.get(players, player_genesis_address, nil)


end



export fun get_archmon_info(player_genesis_address) do

player_genesis_address = String.to_hex(player_genesis_address)

players = State.get("players")

player = Map.get(players, player_genesis_address)

archmon = nil

if player do

  archmon = player.archmon

  end


  archmon

end



export fun get_last_action(player_genesis_address) do

player_genesis_address = String.to_hex(player_genesis_address)

players = State.get("players")

player = Map.get(players, player_genesis_address)

last_action = nil

if player do 

last_action = player.last_action

end

  
last_action

end

export fun get_turn() do
State.get("turn",1)

end

export fun get_round() do
State.get("round",1)

end

export fun get_day() do
State.get("day",1)

end

Content (0 B)

State (605 B)

{
  "day": 8,
  "players": {
    "00000ADB339FE21E5B7D58B967182B43603C3B26C4452B5EBA6EF6E9C99C54231EEC": {
      "action_points": 10,
      "archmon": {
        "base_health": 10,
        "base_power": 2,
        "health": 10,
        "is_ko": false,
        "level": 1,
        "power": 2,
        "xp": 0
      },
      "consumed_day": 0,
      "consumed_round": 0,
      "consumed_turn": 1,
      "last_action": {
        "version": 0
      }
    },
    "00007FF81D78413058B8C9E2799E59F2BE28E3F454767D3DBE479403B40C4DFF5FE9": {
      "action_points": 10,
      "archmon": {
        "base_health": 10,
        "base_power": 2,
        "health": 10,
        "is_ko": false,
        "level": 1,
        "power": 2,
        "xp": 0
      },
      "consumed_day": 0,
      "consumed_round": 0,
      "consumed_turn": 0,
      "last_action": {
        "version": 0
      }
    }
  },
  "round": 47,
  "turn": 2419
}
                  
Movements (0)

Ownerships (1)

  • Secret shared with 1 key

    Encoded secret

    65002EA07B66DDCA4DAA642E097ED96E0B72050EF8093EE5EEBBDCC459490655CB1D4829558684DFC8F1B7B80421D1C19430B1E904BE5BFE2FC1E712

    Authorized keys

    • 00017877BCF4122095926A49489009649603AB129822A19EF9D573B8FD714911ED7F

Contract recipients (0)

Inputs (0)

Contract inputs (0)

Unspent outputs (0)

Proofs and signatures

Previous public key

000181419F8462B273FE3645B4F3A7BBD3550889CA2B9A24F0A913E40BF452B0539F

Previous signature

FD1F8918F8F190F4341F6E015F9F3E6514649DEA86A0D26394360AC6AEC8898F27D3D6E328AD7A294D0A9215888A72BBCB39126AD7334A1C42509AADE637DE0D

Origin signature

30450221009134F6520E5AD1027CD5855B18FCC8912C2142AB7938AF6D145EA88F53EB49B302201A5BB96DBB0DD1EB10A5D7358DB60428C55BD4952D3CA3F31F7C64482CD45F0E

Proof of work

010204AA023E1E039788AD4B8F713C8871CA39A177414A99A0788993AD725B1FBB7AD5E4CAC86151A9E03451DCACB1EFC100B1E450FCEDAF5E5005F3A4C503D1D29712

Proof of integrity

00D5340964D18AB15F11986DA5722432AF739D2B91CAC1587F6E6CBF9D48DF9CDE

Coordinator signature

4AE01AC5C42CDE6300969FA15BCA55F1A194AA8AE5B39B90D1FB51449433766E2FC3FAE19AE232FE1E40DB747656FA498DA25EA2BC630AF9B56D003225F9B10C

Validator #1 public key

00013979F182FBF100A7D850091072443374862E8A007B24B5E14A1405B1F3B1F406

Validator #1 signature

AF9F545F7E23BE1C4CCD3448E54C690F553AF28A280A4454820EB569FBA1EFE337A53403C135FD316AB6D7A455D6AA19A6848FE874471DE11A0CCCE6C4B7910F

Validator #2 public key

0001118FF200888730B2963590093B3E384A49F58832314D00A9E65E07505DBBC73E

Validator #2 signature

9CFBFF1934DC9E37E147C7B3100467813F29C6A8388DFDEAFE01F1198E647EF5529C4D2D8ABBD4A2A4907C7B030FD84C6C6049A082B5E8FFA7079846C824470C