Type
CONTRACT
Validation date
2025-05-07 17:40:03 UTC
Fee
0 UCO

Code (1.82 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 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 5 minutes 
# player can do only one action per turn
actions triggered_by: interval, at: "*/5 * * * *" do
  
  current_turn = State.get("turn",1)
  State.set("turn", current_turn + 1 )

end



# resurrect all archmon every hour
actions triggered_by: interval, at: "0 * * * *" do
  
  current_rez_round = State.get("rez_round",1)
  State.set("rez_round", current_rez_round + 1)

end


condition triggered_by: transaction, on: add_player(), as: [
  content:  ( 
      player = get_player(Chain.get_genesis_address(transaction.address))
      player == nil
   )
]

actions triggered_by: transaction, on: add_player() do

  player_genesis_address_hex = 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),
    consumed_rez_round: State.get("rez_round",1),
    consumed_turn: State.get("turn",1) - 1 ,
    last_action: nil,
    archmon: archmon
  ]

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

end

  #player_attacker = get_player(Chain.get_genesis_address(transaction.address))
      #player_defender = get_player(Chain.get_genesis_address(player_address))

      #player_attacker != nil && player_defender != nil  && !player_attacker.archmon.is_ko 
      #&& !player_defender.archmon.is_ko
      #&& player_attacker.action_points > 0

condition triggered_by: transaction, on: attack(player_address), as: [
  content:  (
            player_attacker = get_player(Chain.get_genesis_address(transaction.address))
            player_defender = get_player(Chain.get_genesis_address(String.to_hex(player_address)))

            player_attacker != nil && player_defender != nil

  )
]

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

players = State.get("players")

  player_raw_transaction_address = transaction.address
  player_raw_genesis_address = Chain.get_genesis_address(transaction.address)

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

  player_defender_genesis_address_hex = Chain.get_genesis_address(String.to_hex(player_address))
  player_defender_without_hex = Chain.get_genesis_address(player_address)

   player_attacker = Map.get(players,player_attacker_genesis_address_hex)
   player_defender = Map.get(players,player_defender_genesis_address_hex)

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

action = 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",
  target: player_defender_genesis_address_hex
]


else

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

action = [
  code: "hit",
  target: player_defender_genesis_address_hex
]

end

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)

players = Map.set(players,player_attacker_genesis_address_hex, player_attacker)
players = Map.set(players,player_defender_genesis_address_hex, player_defender)

State.set("players", players)

Contract.set_content(Json.to_string(action))

#Contract.set_content("attack done to : #{player_address},#{player_raw_transaction_address},#{player_raw_genesis_address},#{player_defender_without_hex},#{Json.to_string(player_attacker)}")


end


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

content: (
  player = get_player(Chain.get_genesis_address(transaction.address))
      player != nil && !player.archmon.is_ko 
      && player.action_points > 0
       
)

]
actions triggered_by: transaction, on: feed() do
  players = State.get("players")
  player_genesis_address_hex = String.to_hex(Chain.get_genesis_address(transaction.address))
  player = Map.get(players,player_genesis_address_hex)
  
  archmon = player.archmon

  xp_from_feed = 20

  xp_after_feed = archmon.xp + xp_from_feed
  xp_to_next_level = get_xp_to_next_level(current_level)

  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 )

  else

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

action = [
  code: "feed",
  target: player_genesis_address_hex
]
player = Map.set(player,"last_action", action)
player = Map.set(player,"action_points", player.action_points - 1)
player = Map.set(player,"archmon", archmon)

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

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

end

condition triggered_by: transaction, on: heal(), as: [
  content: (
      player = get_player(Chain.get_genesis_address(transaction.address))
      player != nil && !player.archmon.is_ko 
      && player.action_points > 0
       
  )
]
actions triggered_by: transaction, on: heal() do
players = State.get("players")
player_genesis_address_hex = String.to_hex(Chain.get_genesis_address(transaction.address))

player = Map.get(players,player_genesis_address_hex)

archmon = player.archmon

if archmon.health + 2 < archmon.base_health do

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

else

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

end


action = [
  code: "heal",
  target: player_genesis_address_hex
]


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

State.set("players", players)

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

condition triggered_by: transaction, on: refrech_action_points(), as: [
  content: (player = get_player(Chain.get_genesis_address(transaction.address))
      player != nil && player.consumed_day < State.get("day", 1))

]

actions triggered_by: transaction, on: refrech_action_points() do
  players = State.get("players")
  player_genesis_address_hex = String.to_hex(Chain.get_genesis_address(transaction.address))
  player = Map.get(players,player_genesis_address_hex)

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

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

State.set("players", player)
end



condition triggered_by: transaction, on: resurrect(), as: [
  content:  (
      player = get_player(Chain.get_genesis_address(transaction.address))
      player != nil && player.archmon.is_ko 
      && player.consumed_rez_round < State.get("rez_round",1)
       
   )

]



actions triggered_by: transaction, on: resurrect() do
  players = State.get("players")
  player_genesis_address_hex = String.to_hex(Chain.get_genesis_address transaction.address)
  player = Map.get(players,player_genesis_address_hex )

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

  Map.set(player,"consumed_rez_round", State.get("rez_round",1))
  
  Map.set(players,player_genesis_address_hex,player)
  State.set("players",players)

end

fun save_action(player,action) do

  Map.set(player,"last_action",action)
  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 + 5)

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

 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

 
  Math.pow(current_level, 2) * 10

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

#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_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

Content (0 B)

State (320 B)

{
  "day": 5,
  "players": {
    "00007FF81D78413058B8C9E2799E59F2BE28E3F454767D3DBE479403B40C4DFF5FE9": {
      "action_points": 10,
      "archmon": {
        "base_health": 10,
        "base_power": 2,
        "health": 10,
        "is_ko": false,
        "level": 1,
        "power": 2,
        "xp": 0
      },
      "consumed_day": 1,
      "consumed_rez_round": 1,
      "consumed_turn": 1,
      "last_action": null
    }
  },
  "rez_round": 667,
  "turn": 16560
}
                  
Movements (0)

Ownerships (1)

  • Secret shared with 1 key

    Encoded secret

    FB2A0376E3121B3FD9086E7B89BC7FF508D201029F294A05DA802C2A716D2F3EABDD527C365B88787EEC319899DA3E6C621E0A8B79C7A314280FEBC0

    Authorized keys

    • 00017877BCF4122095926A49489009649603AB129822A19EF9D573B8FD714911ED7F

Contract recipients (0)

Inputs (0)

Contract inputs (0)

Unspent outputs (0)

Proofs and signatures

Previous public key

0001AD1B2ACE0070DE5B3E3E217D6DEDBE9D4366C52F21202C22A0F2ADED79FDC82F

Previous signature

D4EFC5CCE15DA9C4489101169BB044BD225F8B8FD3892880E9DF1325566347A2028E073A66EF5E45536A8D9760FFB4845A517F40778E9CE0B5AC26A626A0E608

Origin signature

3045022100F10DC57BDDD2BB956CC02C2C30822469918121E698AAF489F77F76549D8B0DB302202210F9987402E4DC394E9953AF3E29C4D629623785936493EED4FAE3E147FA1E

Proof of work

0102046C40DA35A5E56A9CE2DBF0098DB8DABF2B7F5E137C7758731F5ABAAEDC16CD890DD9D4D623206B863C8F60FBED5A54DEC7DC5EF2A67BE2F41DD3E3854D4B0331

Proof of integrity

002E4CF3E4A3273072CB2859A082665F6A8EB5A07F8FB617DB4835E513CA646CB9

Coordinator signature

43E90E956C5A0C7DF7A0D49E14FE99B30DDB2BE3EF08F6B6BEF706D494986B409576D36C8CEE75D42D936D6C195E5766D9180B172BD3D74F13CE2743C5917B0A

Validator #1 public key

0001A5E6F6D02CE7E311CF3CC87C79329877BC7E086C52A92FDED417D6F7D43F13C5

Validator #1 signature

A2705C1CA9B40EED48BFEA11CE16DE1D35A0CA17A5E453CBB94ABBCFF27691BBE7A2F280664AA0823DE9E3B99F8761ED309C0B07E0CBCCA92C7469F3D8AE6F0D

Validator #2 public key

0001C889E476394F1D3361438AC70864AFCC1E3E4B25B62D42C6B38E4200B068B5C5

Validator #2 signature

08CE0F44911C711E5793C31ABD33B4E261E986911E4B90D03F44E3DCF19BC8C49999C0A0D470AF4D9E772CD253C2411205E56FBCD63D3D68C739A81C395B1B0B