diff --git a/data/save.tres b/data/save.tres new file mode 100644 index 0000000..a687f97 --- /dev/null +++ b/data/save.tres @@ -0,0 +1,14 @@ +[gd_resource type="Resource" script_class="Save" load_steps=4 format=3] + +[ext_resource type="Script" path="res://twitch/player_data.gd" id="1_yphdo"] +[ext_resource type="Script" path="res://twitch/saveFile.gd" id="2_o22i5"] + +[sub_resource type="Resource" id="Resource_hxy0q"] +script = ExtResource("1_yphdo") +money = 130 +user_id = "144628425" +username = "tabbyCatNya" + +[resource] +script = ExtResource("2_o22i5") +player_database = Array[ExtResource("1_yphdo")]([SubResource("Resource_hxy0q")]) diff --git a/game.tscn b/game.tscn index 9f2363c..79d1b8d 100644 --- a/game.tscn +++ b/game.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=21 format=3 uid="uid://jo1lu66y1gx6"] +[gd_scene load_steps=22 format=3 uid="uid://jo1lu66y1gx6"] [ext_resource type="Texture2D" uid="uid://i348o6hqw2dn" path="res://sprites/44389.png" id="1_e2o6t"] [ext_resource type="Script" uid="uid://5qnvkmmtxsw2" path="res://gameManager.gd" id="1_feb5d"] [ext_resource type="AudioStream" uid="uid://cyyivtye4ngmt" path="res://music/90. Multiplayer Results - Win.mp3" id="3_eow3j"] [ext_resource type="AudioStream" uid="uid://ck06glyqpqy3n" path="res://music/Battle Mode - Mario Kart DS OST Extended.mp3" id="3_feb5d"] +[ext_resource type="PackedScene" uid="uid://bxux4tsgmw0sf" path="res://twitch/user.tscn" id="3_j5wjh"] [ext_resource type="AudioStream" uid="uid://igps611ecoc" path="res://music/0014.wav" id="4_fc0e3"] [ext_resource type="AudioStream" uid="uid://xnhjht3k7qvd" path="res://music/intro.mp3" id="5_7jktm"] [ext_resource type="AudioStream" uid="uid://b7v7bcgp3iu8u" path="res://music/85. Battle Flyover.mp3" id="7_j5wjh"] @@ -47,7 +48,7 @@ font_color = Color(0.481789, 0.481789, 0.481789, 1) [sub_resource type="CircleShape2D" id="CircleShape2D_7jktm"] radius = 3.0 -[node name="Game" type="Node2D" node_paths=PackedStringArray("player_spawns_nodes", "starting_shine_nodes", "shine_nodes", "scorecard_container", "elim_timer_label", "game_timer_label", "chime_player", "music_player", "win_player", "flyover_player", "intro_player", "start_button")] +[node name="Game" type="Node2D" node_paths=PackedStringArray("player_spawns_nodes", "starting_shine_nodes", "shine_nodes", "scorecard_container", "elim_timer_label", "game_timer_label", "chime_player", "music_player", "win_player", "flyover_player", "intro_player", "start_button", "user_cards")] script = ExtResource("1_feb5d") autoplay_mode = true max_shinies = 100 @@ -63,6 +64,7 @@ win_player = NodePath("WinMusic") flyover_player = NodePath("Flyover") intro_player = NodePath("IntroPlayer") start_button = NodePath("GameUI/StartButton") +user_cards = NodePath("GameUI/Users/userCards") [node name="Sprite2D" type="Sprite2D" parent="."] texture_filter = 1 @@ -336,6 +338,41 @@ offset_right = 228.0 offset_bottom = -94.0 text = "Reset" +[node name="Users" type="Control" parent="GameUI"] +anchors_preset = 0 +offset_left = 124.0 +offset_top = -87.0 +offset_right = 223.0 +offset_bottom = 86.0 + +[node name="userCards" type="VBoxContainer" parent="GameUI/Users"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -5.0 +offset_top = -6.0 +offset_right = 20.0 +offset_bottom = 42.0 +grow_horizontal = 2 +grow_vertical = 2 +scale = Vector2(0.84, 0.84) + +[node name="User" parent="GameUI/Users/userCards" instance=ExtResource("3_j5wjh")] +layout_mode = 2 + +[node name="User2" parent="GameUI/Users/userCards" instance=ExtResource("3_j5wjh")] +layout_mode = 2 + +[node name="User3" parent="GameUI/Users/userCards" instance=ExtResource("3_j5wjh")] +layout_mode = 2 + +[node name="User4" parent="GameUI/Users/userCards" instance=ExtResource("3_j5wjh")] +layout_mode = 2 + +[node name="User5" parent="GameUI/Users/userCards" instance=ExtResource("3_j5wjh")] +layout_mode = 2 + [node name="PlayerSpawns" type="Node2D" parent="."] [node name="Point" type="CollisionShape2D" parent="PlayerSpawns"] diff --git a/gameManager.gd b/gameManager.gd index ee673b6..dc7fba1 100644 --- a/gameManager.gd +++ b/gameManager.gd @@ -31,6 +31,7 @@ var bets_closed : bool = false @export var flyover_player : AudioStreamPlayer @export var intro_player : AudioStreamPlayer @export var start_button : Button +@export var user_cards : VBoxContainer var state : State = State.prep var game_timer : float = 0 @@ -41,11 +42,14 @@ var play_next_chime : float = 5 func _ready() -> void: + Twitch.load_database() + Twitch.game_node = self player_spawns = player_spawns_nodes.get_children() starting_shine_spawns = starting_shine_nodes.get_children() shine_spawns = shine_nodes.get_children() createPlayers() spawn_shinies() + load_userboard() func createPlayers(): for i in range(8): @@ -104,6 +108,7 @@ func _process(delta: float) -> void: if(elim_timer <= 0): elim_players() update_ui() + update_userboard() if elim_timer < play_next_chime: if play_next_chime > 0: @@ -127,13 +132,16 @@ func elim_players(): func check_win_con(): var gamers : int = 0 + var winning_gamer : int = 0 for player in players: if player.alive: gamers += 1 + winning_gamer = player.id if gamers == 1: music_player.stop() win_player.play() state = State.end + Twitch.end_round(winning_gamer) func update_ui(): elim_timer_label.text = format_time(elim_timer, false) @@ -148,6 +156,7 @@ func order_scoreboard(): pass + func format_time(time : float, include_minutes : bool) -> String: var minutes : int = floor(time / 60) var seconds : int = time - 60*minutes @@ -176,3 +185,17 @@ func _on_start_button_pressed() -> void: func _on_reset_button_pressed() -> void: get_tree().reload_current_scene() + + +func load_userboard(): + for child in user_cards.get_children(): + child.queue_free() + for data : PlayerData in Twitch.save.player_database: + if data.playing: + var user = load("res://twitch/user.tscn").instantiate() + user.player_data = data + user_cards.add_child(user) + +func update_userboard(): + #load_userboard() + pass diff --git a/playerSprites.tres b/playerSprites.tres index e9736a0..ae6378b 100644 --- a/playerSprites.tres +++ b/playerSprites.tres @@ -1,6 +1,7 @@ -[gd_resource type="SpriteFrames" load_steps=22 format=3 uid="uid://c7ceeyn5e3kgr"] +[gd_resource type="SpriteFrames" load_steps=23 format=3 uid="uid://c7ceeyn5e3kgr"] [ext_resource type="Texture2D" uid="uid://kdvf0fwah683" path="res://sprites/62221.png" id="1_ni33q"] +[ext_resource type="Texture2D" uid="uid://bb5ifni471lil" path="res://sprites/noSelection.png" id="2_h111s"] [sub_resource type="AtlasTexture" id="AtlasTexture_onrkg"] atlas = ExtResource("1_ni33q") @@ -144,6 +145,9 @@ animations = [{ }, { "duration": 1.0, "texture": SubResource("AtlasTexture_5tmop") +}, { +"duration": 1.0, +"texture": ExtResource("2_h111s") }], "loop": true, "name": &"default", diff --git a/project.godot b/project.godot index 673b04d..3f958b3 100644 --- a/project.godot +++ b/project.godot @@ -32,6 +32,11 @@ enabled=PackedStringArray("res://addons/very-simple-twitch/plugin.cfg") player="" +[gui] + +theme/default_font_multichannel_signed_distance_field=true +theme/default_font_generate_mipmaps=true + [rendering] textures/canvas_textures/default_texture_filter=0 diff --git a/scorecard.tscn b/scorecard.tscn index 963e9cc..8fd0eb6 100644 --- a/scorecard.tscn +++ b/scorecard.tscn @@ -40,3 +40,4 @@ offset_left = 37.0 offset_right = 56.0 offset_bottom = 23.0 text = "00" +horizontal_alignment = 1 diff --git a/sprites/noSelection.png b/sprites/noSelection.png new file mode 100644 index 0000000..0c7018a Binary files /dev/null and b/sprites/noSelection.png differ diff --git a/sprites/noSelection.png.import b/sprites/noSelection.png.import new file mode 100644 index 0000000..8f95a5a --- /dev/null +++ b/sprites/noSelection.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bb5ifni471lil" +path="res://.godot/imported/noSelection.png-40c4b2482667c2219a7c575ef4268283.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://sprites/noSelection.png" +dest_files=["res://.godot/imported/noSelection.png-40c4b2482667c2219a7c575ef4268283.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/twitch.gd b/twitch.gd index 9c44891..db5534f 100644 --- a/twitch.gd +++ b/twitch.gd @@ -1,11 +1,91 @@ extends Node +var save : Save +var save_path : String = "C:\\Users\\Tabby\\Documents\\Godot\\Projects\\shine-runners-test\\data\\save.tres" +var game_node : Node2D +var current_winner : int = -1 + func _ready() -> void: VerySimpleTwitch.get_token_and_login_chat() - VerySimpleTwitch.chat_message_received.connect(print_chatter_message) + VerySimpleTwitch.chat_message_received.connect(handle_message) + game_node = get_node("/root/Game") + #test_save() func _process(delta: float) -> void: pass -func print_chatter_message(chatter: VSTChatter): +func handle_message(chatter: VSTChatter): print("Message received from %s: %s" % [chatter.tags.display_name, chatter.message]) + var found_player : bool = false + for player in save.player_database: + if(chatter.tags.user_id == player.user_id): + found_player = true + # do whatever we want for a found player + player.playing = true + var splits : PackedStringArray = chatter.message.split(" ") + #print(splits) + if splits[0] == "!bet" and player.betting == false and splits.size() == 3 and game_node.state == game_node.State.prep: #player has not already submitted a bet + if int(splits[1]) <= player.money and player.money >= 0: #they have the money to bet + if int(splits[2]) < 8: #they are betting on a valid character + player.betting = true + player.money -= int(splits[1]) + player.current_wager = int(splits[1]) + player.current_bet = int(splits[2]) + + if(not found_player): + create_new_player(chatter.tags.user_id, chatter.tags.display_name) + game_node.load_userboard() + +func create_new_player(id : String, name : String) -> PlayerData: + var player : PlayerData = PlayerData.new() + player.user_id = id + player.username = name + player.money = 100 + player.playing = true + save.player_database.append(player) + return player + +func end_round(winning_character : int): + current_winner = winning_character + for data in save.player_database: + if data.current_bet == winning_character: + data.money += data.current_wager*8 + data.result = PlayerData.Result.win + else: + data.result = PlayerData.Result.lose + if data.betting == false: + data.result = PlayerData.Result.none + data.current_bet = 20 + data.betting = false + data.current_wager = 0 + save_database() + + +#do before the round +func load_database(): + if ResourceLoader.exists(save_path): + save = ResourceLoader.load(save_path) + else: + save = Save.new() + save.player_database = [] + +#do just before every reset +func save_database(): + ResourceSaver.save(save, save_path) + +func test_save(): + save = Save.new() + var player1 : PlayerData = PlayerData.new() + player1.user_id = "1" + player1.money = 100 + save.player_database = [player1] + #save.player_database.append(player1) + var player2 : PlayerData = PlayerData.new() + player2.user_id = "22" + player2.money = 200 + save.player_database.append(player2) + var player3 : PlayerData = PlayerData.new() + player3.user_id = "333" + player3.money = 300 + save.player_database.append(player3) + ResourceSaver.save(save, save_path) diff --git a/twitch/player_data.gd b/twitch/player_data.gd new file mode 100644 index 0000000..5c0d1aa --- /dev/null +++ b/twitch/player_data.gd @@ -0,0 +1,19 @@ +extends Resource +class_name PlayerData + +@export var money : int = 0 +@export var user_id : String = "" +@export var username : String = "" + +enum Result{ + none, + win, + lose +} + +var playing : bool = true +var unix_timeout : int = 0 # will implement later, hides players who havent done anything for awhile +var betting : bool = false +var result : Result = Result.none +var current_bet : int = 20 # no selection icon +var current_wager : int = 0 diff --git a/twitch/player_data.gd.uid b/twitch/player_data.gd.uid new file mode 100644 index 0000000..cc3ca8d --- /dev/null +++ b/twitch/player_data.gd.uid @@ -0,0 +1 @@ +uid://dgn8nnp7mtgdm diff --git a/twitch/saveFile.gd b/twitch/saveFile.gd new file mode 100644 index 0000000..b3782ea --- /dev/null +++ b/twitch/saveFile.gd @@ -0,0 +1,4 @@ +extends Resource +class_name Save + +@export var player_database : Array[PlayerData] diff --git a/twitch/saveFile.gd.uid b/twitch/saveFile.gd.uid new file mode 100644 index 0000000..d69e019 --- /dev/null +++ b/twitch/saveFile.gd.uid @@ -0,0 +1 @@ +uid://dx5cdskh1njoa diff --git a/twitch/user.tscn b/twitch/user.tscn new file mode 100644 index 0000000..4721518 --- /dev/null +++ b/twitch/user.tscn @@ -0,0 +1,71 @@ +[gd_scene load_steps=6 format=3 uid="uid://bxux4tsgmw0sf"] + +[ext_resource type="Script" uid="uid://byifxe3bjukcb" path="res://twitch/userCard.gd" id="1_05vio"] +[ext_resource type="SpriteFrames" uid="uid://c7ceeyn5e3kgr" path="res://playerSprites.tres" id="1_xl4je"] + +[sub_resource type="LabelSettings" id="LabelSettings_05vio"] +font_size = 6 + +[sub_resource type="LabelSettings" id="LabelSettings_xl4je"] +font_size = 6 + +[sub_resource type="LabelSettings" id="LabelSettings_62tkp"] +font_size = 6 + +[node name="User" type="PanelContainer" node_paths=PackedStringArray("displayname_label", "bank_label", "bet_sprite", "wager_label")] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_right = -1037.0 +offset_bottom = -637.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_05vio") +displayname_label = NodePath("HBoxContainer/displayname") +bank_label = NodePath("HBoxContainer/bank") +bet_sprite = NodePath("HBoxContainer/bet") +wager_label = NodePath("HBoxContainer/wager") + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +layout_mode = 2 +size_flags_vertical = 4 + +[node name="Control" type="Control" parent="HBoxContainer"] +layout_mode = 2 + +[node name="displayname" type="Label" parent="HBoxContainer"] +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +size_flags_horizontal = 4 +text = "Name" +label_settings = SubResource("LabelSettings_05vio") +text_overrun_behavior = 3 + +[node name="bank" type="Label" parent="HBoxContainer"] +custom_minimum_size = Vector2(20, 0) +layout_mode = 2 +size_flags_horizontal = 6 +text = "Bank" +label_settings = SubResource("LabelSettings_xl4je") +horizontal_alignment = 1 +clip_text = true + +[node name="VSeparator" type="VSeparator" parent="HBoxContainer"] +layout_mode = 2 + +[node name="Node" type="Control" parent="HBoxContainer"] +custom_minimum_size = Vector2(10, 0) +layout_mode = 2 + +[node name="bet" type="AnimatedSprite2D" parent="HBoxContainer"] +position = Vector2(94.5, 4) +scale = Vector2(0.714286, 0.714286) +sprite_frames = ExtResource("1_xl4je") +frame = 11 + +[node name="wager" type="Label" parent="HBoxContainer"] +custom_minimum_size = Vector2(20, 0) +layout_mode = 2 +text = "Wager" +label_settings = SubResource("LabelSettings_62tkp") +clip_text = true diff --git a/twitch/userCard.gd b/twitch/userCard.gd new file mode 100644 index 0000000..003be1d --- /dev/null +++ b/twitch/userCard.gd @@ -0,0 +1,24 @@ +extends PanelContainer + +var player_data = PlayerData +@export var displayname_label : Label +@export var bank_label : Label +@export var bet_sprite : AnimatedSprite2D +@export var wager_label : Label + +func _process(delta: float) -> void: + displayname_label.text = player_data.username + bank_label.text = str(player_data.money) + bet_sprite.frame = player_data.current_bet + wager_label.text = str(player_data.current_wager) + apply_effects() + +func apply_effects(): + displayname_label.modulate = Color.WHITE + if Twitch.game_node.state != Twitch.game_node.State.prep and !player_data.betting: + displayname_label.modulate = Color.DIM_GRAY + if Twitch.game_node.state == Twitch.game_node.State.end: + if player_data.result == PlayerData.Result.win: + displayname_label.modulate = Color.GREEN + elif player_data.result == PlayerData.Result.lose: + displayname_label.modulate = Color.RED diff --git a/twitch/userCard.gd.uid b/twitch/userCard.gd.uid new file mode 100644 index 0000000..c57df49 --- /dev/null +++ b/twitch/userCard.gd.uid @@ -0,0 +1 @@ +uid://byifxe3bjukcb