This commit is contained in:
Tabby 2025-04-21 15:57:48 +10:00
parent 341c91742c
commit 0ae3a6be80
16 changed files with 324 additions and 5 deletions

14
data/save.tres Normal file
View file

@ -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")])

View file

@ -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"]

View file

@ -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

View file

@ -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",

View file

@ -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

View file

@ -40,3 +40,4 @@ offset_left = 37.0
offset_right = 56.0
offset_bottom = 23.0
text = "00"
horizontal_alignment = 1

BIN
sprites/noSelection.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

View file

@ -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

View file

@ -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)

19
twitch/player_data.gd Normal file
View file

@ -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

View file

@ -0,0 +1 @@
uid://dgn8nnp7mtgdm

4
twitch/saveFile.gd Normal file
View file

@ -0,0 +1,4 @@
extends Resource
class_name Save
@export var player_database : Array[PlayerData]

1
twitch/saveFile.gd.uid Normal file
View file

@ -0,0 +1 @@
uid://dx5cdskh1njoa

71
twitch/user.tscn Normal file
View file

@ -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

24
twitch/userCard.gd Normal file
View file

@ -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

1
twitch/userCard.gd.uid Normal file
View file

@ -0,0 +1 @@
uid://byifxe3bjukcb