added win/lose text and fixed several bugs
This commit is contained in:
parent
571197baa7
commit
bd014b7e1d
14
README.md
14
README.md
@ -1,3 +1,17 @@
|
|||||||
# VCGJ 2025
|
# VCGJ 2025
|
||||||
`Theme: Hold It!`
|
`Theme: Hold It!`
|
||||||
|
|
||||||
|
# Extremely Intense Mathematics
|
||||||
|
A simple math game where you have to compete against three other little guys. Be the last player standing to win.
|
||||||
|
|
||||||
|
The four players take turn holding what is known as the "rule enforcement device"
|
||||||
|
|
||||||
|
The initial time set on the rule enforcement device before it "enforces the rules" decreases each time a question is answered correctly.
|
||||||
|
|
||||||
|
Each time a question is answered correctly, the device is handed to the next player and the device has the time reset.
|
||||||
|
|
||||||
|
The three other players have their own strengths:
|
||||||
|
|
||||||
|
- Green: Good at subtraction
|
||||||
|
- Red: Good at multiplication
|
||||||
|
- Blue: Good at division
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -72,27 +72,24 @@ script = ExtResource("2_joe7c")
|
|||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
transform = Transform3D(-0.0475354, -0.0535728, 0.270738, 0.266451, 0.0626881, 0.0591871, -0.0719257, 0.267636, 0.0403304, 0.0257539, -0.692888, -4.06508)
|
transform = Transform3D(-0.0475354, -0.0535728, 0.270738, 0.266451, 0.0626881, 0.0591871, -0.0719257, 0.267636, 0.0403304, 0.0257539, -0.692888, -4.06508)
|
||||||
|
|
||||||
[node name="UI" type="Control" parent="."]
|
[node name="UI" type="MarginContainer" parent="."]
|
||||||
layout_mode = 3
|
|
||||||
anchors_preset = 15
|
anchors_preset = 15
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
anchor_bottom = 1.0
|
anchor_bottom = 1.0
|
||||||
grow_horizontal = 2
|
grow_horizontal = 2
|
||||||
grow_vertical = 2
|
grow_vertical = 2
|
||||||
|
mouse_filter = 2
|
||||||
|
|
||||||
[node name="PanelContainer" type="PanelContainer" parent="UI"]
|
[node name="PanelContainer" type="PanelContainer" parent="UI"]
|
||||||
layout_mode = 0
|
layout_mode = 2
|
||||||
offset_right = 40.0
|
|
||||||
offset_bottom = 40.0
|
|
||||||
theme_override_styles/panel = SubResource("StyleBoxEmpty_sp4xh")
|
theme_override_styles/panel = SubResource("StyleBoxEmpty_sp4xh")
|
||||||
|
|
||||||
[node name="VBoxContainer" type="VBoxContainer" parent="UI/PanelContainer"]
|
[node name="VBoxContainer" type="VBoxContainer" parent="UI/PanelContainer"]
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
alignment = 2
|
alignment = 1
|
||||||
|
|
||||||
[node name="HBoxContainer" type="HBoxContainer" parent="UI/PanelContainer/VBoxContainer"]
|
[node name="HBoxContainer" type="HBoxContainer" parent="UI/PanelContainer/VBoxContainer"]
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
alignment = 2
|
|
||||||
|
|
||||||
[node name="QUESTION" type="Label" parent="UI/PanelContainer/VBoxContainer/HBoxContainer"]
|
[node name="QUESTION" type="Label" parent="UI/PanelContainer/VBoxContainer/HBoxContainer"]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
@ -117,6 +114,20 @@ drag_and_drop_selection_enabled = false
|
|||||||
flat = true
|
flat = true
|
||||||
caret_blink = true
|
caret_blink = true
|
||||||
|
|
||||||
|
[node name="CenterContainer" type="CenterContainer" parent="UI"]
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_filter = 2
|
||||||
|
|
||||||
|
[node name="WINLOSE" type="Label" parent="UI/CenterContainer"]
|
||||||
|
unique_name_in_owner = true
|
||||||
|
visible = false
|
||||||
|
layout_mode = 2
|
||||||
|
theme_override_fonts/font = ExtResource("9_im5ls")
|
||||||
|
theme_override_font_sizes/font_size = 200
|
||||||
|
text = "TEST"
|
||||||
|
horizontal_alignment = 1
|
||||||
|
vertical_alignment = 1
|
||||||
|
|
||||||
[node name="SCREAM" type="AudioStreamPlayer3D" parent="."]
|
[node name="SCREAM" type="AudioStreamPlayer3D" parent="."]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
panning_strength = 0.0
|
panning_strength = 0.0
|
||||||
|
@ -37,7 +37,7 @@ layout_mode = 2
|
|||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
theme_override_fonts/font = ExtResource("1_38vls")
|
theme_override_fonts/font = ExtResource("1_38vls")
|
||||||
theme_override_font_sizes/font_size = 120
|
theme_override_font_sizes/font_size = 120
|
||||||
text = "Extreme Mathematics"
|
text = "Extreme Intense Mathematics"
|
||||||
|
|
||||||
[node name="author" type="Label" parent="PanelContainer/HBoxContainer/VBoxContainer"]
|
[node name="author" type="Label" parent="PanelContainer/HBoxContainer/VBoxContainer"]
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
@ -53,7 +53,8 @@ theme_override_styles/separator = SubResource("StyleBoxEmpty_38vls")
|
|||||||
[node name="start_button" type="Button" parent="PanelContainer/HBoxContainer/VBoxContainer"]
|
[node name="start_button" type="Button" parent="PanelContainer/HBoxContainer/VBoxContainer"]
|
||||||
custom_minimum_size = Vector2(400, 0)
|
custom_minimum_size = Vector2(400, 0)
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
size_flags_horizontal = 4
|
size_flags_horizontal = 0
|
||||||
|
size_flags_vertical = 4
|
||||||
mouse_default_cursor_shape = 2
|
mouse_default_cursor_shape = 2
|
||||||
theme_override_fonts/font = ExtResource("1_38vls")
|
theme_override_fonts/font = ExtResource("1_38vls")
|
||||||
theme_override_font_sizes/font_size = 96
|
theme_override_font_sizes/font_size = 96
|
||||||
|
@ -12,13 +12,13 @@ var currently_executing:bool = false
|
|||||||
var faster_operand:String = ""
|
var faster_operand:String = ""
|
||||||
var wait_time:int
|
var wait_time:int
|
||||||
var is_correct:bool
|
var is_correct:bool
|
||||||
|
var last_executed_player:int
|
||||||
|
|
||||||
var clock:int
|
var clock:int = 0
|
||||||
|
|
||||||
func _physics_process(_delta: float) -> void:
|
func _physics_process(_delta: float) -> void:
|
||||||
if GLOBALVARS.selected_player != 0:
|
if GLOBALVARS.selected_player != 0:
|
||||||
if not currently_executing:
|
if not currently_executing and GLOBALVARS.selected_player != last_executed_player:
|
||||||
clock = 0
|
|
||||||
if GLOBALVARS.selected_player == 1:
|
if GLOBALVARS.selected_player == 1:
|
||||||
faster_operand = "-"
|
faster_operand = "-"
|
||||||
elif GLOBALVARS.selected_player == 2:
|
elif GLOBALVARS.selected_player == 2:
|
||||||
@ -27,20 +27,24 @@ func _physics_process(_delta: float) -> void:
|
|||||||
faster_operand = "/"
|
faster_operand = "/"
|
||||||
|
|
||||||
if GLOBALVARS.current_operand == faster_operand:
|
if GLOBALVARS.current_operand == faster_operand:
|
||||||
wait_time = randi_range(50,120)
|
wait_time = randi_range(45,120)
|
||||||
is_correct = true if randf() > 0.05 else false
|
is_correct = true if randf() > 0.05 else false
|
||||||
else:
|
else:
|
||||||
wait_time = randi_range(60,350)
|
wait_time = randi_range(60,350)
|
||||||
is_correct = true if randf() > 0.15 else false
|
is_correct = true if randf() > 0.15 else false
|
||||||
currently_executing = true
|
currently_executing = true
|
||||||
|
last_executed_player = GLOBALVARS.selected_player
|
||||||
|
|
||||||
elif clock > wait_time:
|
elif clock > wait_time and currently_executing:
|
||||||
if %ANSWER.text == "":
|
if %ANSWER.text == "":
|
||||||
%ANSWER.text = str(GLOBALVARS.current_solution) if is_correct else str(GLOBALVARS.current_solution+randi_range(-2,2))
|
%ANSWER.text = str(GLOBALVARS.current_solution) if is_correct else str(GLOBALVARS.current_solution+(1 if randf() > .5 else -1))
|
||||||
elif clock > wait_time + 30:
|
elif clock > wait_time + 30:
|
||||||
%ANSWER.emit_signal("text_submitted",%ANSWER.text)
|
%ANSWER.emit_signal("text_submitted",%ANSWER.text)
|
||||||
currently_executing = false
|
currently_executing = false
|
||||||
|
clock = 0
|
||||||
else:
|
else:
|
||||||
clock+=1
|
clock+=1
|
||||||
else:
|
else:
|
||||||
clock+=1
|
clock+=1
|
||||||
|
else:
|
||||||
|
last_executed_player = 0
|
||||||
|
@ -3,6 +3,25 @@ extends Node
|
|||||||
var cooldown:int = 0
|
var cooldown:int = 0
|
||||||
static var SCREAM_ARRAY:Array = [0,1]
|
static var SCREAM_ARRAY:Array = [0,1]
|
||||||
|
|
||||||
|
func _explode():
|
||||||
|
%SCREAM.stream = load("res://assets/sounds/scream_%s.wav" % SCREAM_ARRAY.pick_random())
|
||||||
|
%SCREAM.play()
|
||||||
|
%RULE_ENFORCEMENT.explode()
|
||||||
|
%QUESTION.visible = false
|
||||||
|
%ANSWER.visible = false
|
||||||
|
|
||||||
|
cooldown = 180
|
||||||
|
if GLOBALVARS.selected_player == 0:
|
||||||
|
%WINLOSE.visible = true
|
||||||
|
%WINLOSE.self_modulate = Color(1,0,0)
|
||||||
|
%WINLOSE.text = ":("
|
||||||
|
elif GLOBALVARS.players_remaining == [0]:
|
||||||
|
%WINLOSE.visible = true
|
||||||
|
%WINLOSE.self_modulate = Color(0,1,0)
|
||||||
|
%WINLOSE.text = "You Win! :)"
|
||||||
|
else:
|
||||||
|
cooldown = 60
|
||||||
|
|
||||||
func _determine_seconds_left() -> float:
|
func _determine_seconds_left() -> float:
|
||||||
var difficulty_calc:float = 20-float(GLOBALVARS.difficulty)
|
var difficulty_calc:float = 20-float(GLOBALVARS.difficulty)
|
||||||
return difficulty_calc if difficulty_calc >= 3.0 else 3.0
|
return difficulty_calc if difficulty_calc >= 3.0 else 3.0
|
||||||
@ -16,14 +35,13 @@ func _on_answer_text_submitted(_new_text: String) -> void:
|
|||||||
GLOBALVARS.difficulty+=.5
|
GLOBALVARS.difficulty+=.5
|
||||||
GLOBALVARS.seconds_left = _determine_seconds_left()
|
GLOBALVARS.seconds_left = _determine_seconds_left()
|
||||||
_generate_question()
|
_generate_question()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
%SCREAM.stream = load("res://assets/sounds/scream_%s.wav" % SCREAM_ARRAY.pick_random())
|
GLOBALVARS.seconds_left = _determine_seconds_left()
|
||||||
%SCREAM.play()
|
|
||||||
%RULE_ENFORCEMENT.explode()
|
|
||||||
cooldown = 60
|
|
||||||
GLOBALVARS.rotation_paused = true
|
GLOBALVARS.rotation_paused = true
|
||||||
GLOBALVARS.players_remaining.erase(GLOBALVARS.selected_player)
|
GLOBALVARS.players_remaining.erase(GLOBALVARS.selected_player)
|
||||||
get_node("players/player_%s" % GLOBALVARS.selected_player).queue_free()
|
get_node("players/player_%s" % GLOBALVARS.selected_player).queue_free()
|
||||||
|
_explode()
|
||||||
|
|
||||||
%ANSWER.text = ""
|
%ANSWER.text = ""
|
||||||
|
|
||||||
@ -33,8 +51,8 @@ func _generate_question() -> void:
|
|||||||
# 2 - multiply
|
# 2 - multiply
|
||||||
# 3 - divide
|
# 3 - divide
|
||||||
|
|
||||||
var x:int = randi_range(1,100)
|
var x:int = randi_range(1,10)
|
||||||
var y:int = randi_range(1,100)
|
var y:int = randi_range(1,10)
|
||||||
var rand_int:int = randi_range(0,3)
|
var rand_int:int = randi_range(0,3)
|
||||||
|
|
||||||
if rand_int == 0:
|
if rand_int == 0:
|
||||||
@ -44,22 +62,38 @@ func _generate_question() -> void:
|
|||||||
GLOBALVARS.current_solution = x-y
|
GLOBALVARS.current_solution = x-y
|
||||||
GLOBALVARS.current_operand = "-"
|
GLOBALVARS.current_operand = "-"
|
||||||
elif rand_int == 2:
|
elif rand_int == 2:
|
||||||
x = randi_range(0,15) # simplify multiplication
|
x = randi_range(0,10) # simplify multiplication
|
||||||
y = randi_range(0,15)
|
y = randi_range(0,10)
|
||||||
GLOBALVARS.current_solution = x*y
|
GLOBALVARS.current_solution = x*y
|
||||||
GLOBALVARS.current_operand = "*"
|
GLOBALVARS.current_operand = "*"
|
||||||
elif rand_int == 3:
|
elif rand_int == 3:
|
||||||
|
var fail:int = 0
|
||||||
|
var solution:int
|
||||||
GLOBALVARS.current_operand = "/"
|
GLOBALVARS.current_operand = "/"
|
||||||
while x%y != 0: # keep going til the remainder is 0
|
|
||||||
x = randi_range(0,100)
|
while x%y != 0 and fail < 10000: # keep going til the remainder is 0
|
||||||
y = randi_range(1,100)
|
x = randi_range(1,10)
|
||||||
|
y = randi_range(1,10)
|
||||||
|
|
||||||
@warning_ignore('integer_division')
|
@warning_ignore('integer_division')
|
||||||
GLOBALVARS.current_solution = int(x/y)
|
solution = floor(x/y)
|
||||||
|
fail+=1
|
||||||
|
|
||||||
|
GLOBALVARS.current_solution = solution
|
||||||
|
|
||||||
|
if fail >= 10000: # fallback to addition if no division problem can be found in 10000 loops
|
||||||
|
GLOBALVARS.current_operand = "+"
|
||||||
|
GLOBALVARS.current_solution = x+y
|
||||||
|
|
||||||
%QUESTION.text = "%s %s %s = " % [x,GLOBALVARS.current_operand,y]
|
%QUESTION.text = "%s %s %s = " % [x,GLOBALVARS.current_operand,y]
|
||||||
|
%QUESTION.visible = true
|
||||||
|
%ANSWER.visible = true
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
|
%QUESTION.visible = true
|
||||||
|
%ANSWER.visible = true
|
||||||
|
%WINLOSE.visible = false
|
||||||
|
%WINLOSE.text = ""
|
||||||
GLOBALVARS.seconds_left = _determine_seconds_left()
|
GLOBALVARS.seconds_left = _determine_seconds_left()
|
||||||
_generate_question()
|
_generate_question()
|
||||||
|
|
||||||
@ -73,13 +107,12 @@ func _physics_process(_delta: float) -> void:
|
|||||||
%ANSWER.editable = false
|
%ANSWER.editable = false
|
||||||
|
|
||||||
if GLOBALVARS.seconds_left <= 0:
|
if GLOBALVARS.seconds_left <= 0:
|
||||||
%RULE_ENFORCEMENT.explode()
|
|
||||||
cooldown = 60
|
|
||||||
GLOBALVARS.seconds_left = _determine_seconds_left()
|
GLOBALVARS.seconds_left = _determine_seconds_left()
|
||||||
GLOBALVARS.rotation_paused = true
|
GLOBALVARS.rotation_paused = true
|
||||||
if GLOBALVARS.selected_player in GLOBALVARS.players_remaining:
|
if GLOBALVARS.selected_player in GLOBALVARS.players_remaining:
|
||||||
GLOBALVARS.players_remaining.erase(GLOBALVARS.selected_player)
|
GLOBALVARS.players_remaining.erase(GLOBALVARS.selected_player)
|
||||||
get_node("players/player_%s" % GLOBALVARS.selected_player).queue_free()
|
get_node("players/player_%s" % GLOBALVARS.selected_player).queue_free()
|
||||||
|
_explode()
|
||||||
|
|
||||||
if cooldown <= 0 and GLOBALVARS.rotation_paused:
|
if cooldown <= 0 and GLOBALVARS.rotation_paused:
|
||||||
if len(GLOBALVARS.players_remaining) > 1 and 0 in GLOBALVARS.players_remaining:
|
if len(GLOBALVARS.players_remaining) > 1 and 0 in GLOBALVARS.players_remaining:
|
||||||
@ -89,9 +122,6 @@ func _physics_process(_delta: float) -> void:
|
|||||||
_generate_question()
|
_generate_question()
|
||||||
%RULE_ENFORCEMENT.reset_rule_enforcement_device()
|
%RULE_ENFORCEMENT.reset_rule_enforcement_device()
|
||||||
GLOBALVARS.rotation_paused = false
|
GLOBALVARS.rotation_paused = false
|
||||||
elif 0 in GLOBALVARS.players_remaining:
|
|
||||||
get_tree().change_scene_to_file("res://main_scenes/menu.tscn")
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
get_tree().change_scene_to_file("res://main_scenes/menu.tscn")
|
get_tree().change_scene_to_file("res://main_scenes/menu.tscn")
|
||||||
|
|
||||||
|
@ -2,13 +2,17 @@ extends Node3D
|
|||||||
|
|
||||||
static var FUSE_SOUND:AudioStream = preload("res://assets/sounds/fuse.ogg")
|
static var FUSE_SOUND:AudioStream = preload("res://assets/sounds/fuse.ogg")
|
||||||
static var EXPLOSION_SOUND:AudioStream = preload("res://assets/sounds/explode.wav")
|
static var EXPLOSION_SOUND:AudioStream = preload("res://assets/sounds/explode.wav")
|
||||||
|
static var JITTER_AMOUNT:int = 10
|
||||||
|
static var ENFORCEMENT_DEVICE_JITTER_AMOUNT:float = 0.005
|
||||||
|
|
||||||
var grow_explosion:bool = false
|
var grow_explosion:bool = false
|
||||||
|
var original_position:Vector3
|
||||||
|
|
||||||
func reset_rule_enforcement_device() -> void:
|
func reset_rule_enforcement_device() -> void:
|
||||||
'''
|
'''
|
||||||
Start the fuse sound
|
Start the fuse sound
|
||||||
'''
|
'''
|
||||||
|
|
||||||
%SOUNDS.stream = FUSE_SOUND
|
%SOUNDS.stream = FUSE_SOUND
|
||||||
%SOUNDS.volume_db = -10
|
%SOUNDS.volume_db = -10
|
||||||
%SOUNDS.play()
|
%SOUNDS.play()
|
||||||
@ -29,12 +33,23 @@ func explode() -> void:
|
|||||||
%EXPLOSION.visible = true
|
%EXPLOSION.visible = true
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
|
original_position = position
|
||||||
reset_rule_enforcement_device()
|
reset_rule_enforcement_device()
|
||||||
|
|
||||||
func _process(_delta: float) -> void:
|
func _process(_delta: float) -> void:
|
||||||
%TIME_LEFT.text = ("%.02f" % GLOBALVARS.seconds_left).replace(".",":")
|
%TIME_LEFT.text = ("%.02f" % GLOBALVARS.seconds_left).replace(".",":")
|
||||||
|
position = original_position + Vector3(
|
||||||
|
randf_range(-ENFORCEMENT_DEVICE_JITTER_AMOUNT,ENFORCEMENT_DEVICE_JITTER_AMOUNT),
|
||||||
|
randf_range(-ENFORCEMENT_DEVICE_JITTER_AMOUNT,ENFORCEMENT_DEVICE_JITTER_AMOUNT),
|
||||||
|
randf_range(-ENFORCEMENT_DEVICE_JITTER_AMOUNT,ENFORCEMENT_DEVICE_JITTER_AMOUNT)
|
||||||
|
)
|
||||||
if grow_explosion and %EXPLOSION.scale < Vector3(3,3,3):
|
if grow_explosion and %EXPLOSION.scale < Vector3(3,3,3):
|
||||||
%EXPLOSION.scale += Vector3(0.2,0.2,0.2)
|
%EXPLOSION.scale += Vector3(0.25,0.25,0.25)
|
||||||
|
%EXPLOSION.rotation_degrees += Vector3(
|
||||||
|
randf_range(-JITTER_AMOUNT,JITTER_AMOUNT),
|
||||||
|
randf_range(-JITTER_AMOUNT,JITTER_AMOUNT),
|
||||||
|
randf_range(-JITTER_AMOUNT,JITTER_AMOUNT)
|
||||||
|
)
|
||||||
elif grow_explosion:
|
elif grow_explosion:
|
||||||
%EXPLOSION.visible = false
|
%EXPLOSION.visible = false
|
||||||
visible = false
|
visible = false
|
||||||
|
Reference in New Issue
Block a user