game.gd 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. extends Control
  2. const _crown = preload("res://img/crown.png")
  3. var _players = []
  4. var _turn = -1
  5. onready var _list = $HBoxContainer/VBoxContainer/ItemList
  6. onready var _action = $HBoxContainer/VBoxContainer/Action
  7. master func set_player_name(name):
  8. var sender = get_tree().get_rpc_sender_id()
  9. rpc("update_player_name", sender, name)
  10. remotesync func update_player_name(player, name):
  11. var pos = _players.find(player)
  12. if pos != -1:
  13. _list.set_item_text(pos, name)
  14. master func request_action(action):
  15. var sender = get_tree().get_rpc_sender_id()
  16. if _players[_turn] != get_tree().get_rpc_sender_id():
  17. rpc("_log", "Someone is trying to cheat! %s" % str(sender))
  18. return
  19. do_action(action)
  20. next_turn()
  21. remotesync func do_action(action):
  22. var name = _list.get_item_text(_turn)
  23. var val = randi() % 100
  24. rpc("_log", "%s: %ss %d" % [name, action, val])
  25. remotesync func set_turn(turn):
  26. _turn = turn
  27. if turn >= _players.size():
  28. return
  29. for i in range(0, _players.size()):
  30. if i == turn:
  31. _list.set_item_icon(i, _crown)
  32. else:
  33. _list.set_item_icon(i, null)
  34. _action.disabled = _players[turn] != get_tree().get_network_unique_id()
  35. remotesync func del_player(id):
  36. var pos = _players.find(id)
  37. if pos == -1:
  38. return
  39. _players.remove(pos)
  40. _list.remove_item(pos)
  41. if _turn > pos:
  42. _turn -= 1
  43. if get_tree().is_network_server():
  44. rpc("set_turn", _turn)
  45. remotesync func add_player(id, name=""):
  46. _players.append(id)
  47. if name == "":
  48. _list.add_item("... connecting ...", null, false)
  49. else:
  50. _list.add_item(name, null, false)
  51. func get_player_name(pos):
  52. if pos < _list.get_item_count():
  53. return _list.get_item_text(pos)
  54. else:
  55. return "Error!"
  56. func next_turn():
  57. _turn += 1
  58. if _turn >= _players.size():
  59. _turn = 0
  60. rpc("set_turn", _turn)
  61. func start():
  62. set_turn(0)
  63. func stop():
  64. _players.clear()
  65. _list.clear()
  66. _turn = 0
  67. _action.disabled = true
  68. func on_peer_add(id):
  69. if not get_tree().is_network_server():
  70. return
  71. for i in range(0, _players.size()):
  72. rpc_id(id, "add_player", _players[i], get_player_name(i))
  73. rpc("add_player", id)
  74. rpc_id(id, "set_turn", _turn)
  75. func on_peer_del(id):
  76. if not get_tree().is_network_server():
  77. return
  78. rpc("del_player", id)
  79. remotesync func _log(what):
  80. $HBoxContainer/RichTextLabel.add_text(what + "\n")
  81. func _on_Action_pressed():
  82. if get_tree().is_network_server():
  83. do_action("roll")
  84. next_turn()
  85. else:
  86. rpc_id(1, "request_action", "roll")