based
This commit is contained in:
parent
341c91742c
commit
0ae3a6be80
16 changed files with 324 additions and 5 deletions
14
data/save.tres
Normal file
14
data/save.tres
Normal 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")])
|
||||
41
game.tscn
41
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"]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
BIN
sprites/noSelection.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3 KiB |
34
sprites/noSelection.png.import
Normal file
34
sprites/noSelection.png.import
Normal 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
|
||||
84
twitch.gd
84
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)
|
||||
|
|
|
|||
19
twitch/player_data.gd
Normal file
19
twitch/player_data.gd
Normal 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
|
||||
1
twitch/player_data.gd.uid
Normal file
1
twitch/player_data.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://dgn8nnp7mtgdm
|
||||
4
twitch/saveFile.gd
Normal file
4
twitch/saveFile.gd
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
extends Resource
|
||||
class_name Save
|
||||
|
||||
@export var player_database : Array[PlayerData]
|
||||
1
twitch/saveFile.gd.uid
Normal file
1
twitch/saveFile.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://dx5cdskh1njoa
|
||||
71
twitch/user.tscn
Normal file
71
twitch/user.tscn
Normal 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
24
twitch/userCard.gd
Normal 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
1
twitch/userCard.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://byifxe3bjukcb
|
||||
Loading…
Add table
Add a link
Reference in a new issue