From 02d30d9e5470d9c309991d00f3113bb1910d34fe Mon Sep 17 00:00:00 2001 From: Exobyt Date: Tue, 20 Aug 2024 18:27:21 +0200 Subject: [PATCH 01/10] Added Cover --- assets/Text.pxo | Bin 0 -> 817 bytes assets/cover.png | Bin 0 -> 13549 bytes assets/cover.png.import | 34 ++++++++++++++++++++++++++++++++++ assets/cover.pxo | Bin 0 -> 19685 bytes scenes/Grid/grid.gd | 6 +----- scenes/Grid/grid.tscn | 2 +- 6 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 assets/Text.pxo create mode 100644 assets/cover.png create mode 100644 assets/cover.png.import create mode 100644 assets/cover.pxo diff --git a/assets/Text.pxo b/assets/Text.pxo new file mode 100644 index 0000000000000000000000000000000000000000..48d375d674cc144aa49d2d2ef73b64d73a8a1c0a GIT binary patch literal 817 zcmWIWW@Zs#VBp|jcs4;Ka)z(qj9^9vh8`vc22KVBhLpsTM7^xy{Jh-2(|OGX0)M7v zoo7j0v_$v&Kgayg6x|I1s}rKPEu5h7|K8Jy({Bl<9XGZ%wsU@GRjC&2n#^kW7RS!{a!T8b zJ+eU7mvNqWq-j9%4xK5s=`(|!^&hE-Ny`@`eOh|(&c$4oKCMTgte#hsYI6^-7WRA> zpz`w9;cY?N9vq)GeOF-A;x97sDoTEn*Lsvstmyxqzux*8`;aj|r}`g{Jy=u?Zj#iY~DxU*)u zeN-zuG-LXVDJq^_TGO?KzJ5MG$4EHsZg}N=^;!4!%yQp&vHR@bjX(3>$C)(deA3ms z_S-jR*6+Te4)3Gs;q{wi9++$DxfeOk39#M#|L#|r{@D9#ce)mJe%syU{rcaF80W8# zirA+M`YEoTT�T-+FnZUXI-><5$wQ?<+;b)BE$DGyRGzeb?=+TDbG|9rfQcpI+Kk z|7&OetFu*)K25j0_W0<(=k}eRdKdp_=`FU2n15pXj)?!}g^7E1nzk1>{tN{PP2Umm zUVDefq?E600p5(jWQaR)0z-)bm{y?xo>bAbp@%F?0|P@9P&b}%4)A7W11V+#!UiBc J8|WGa1^}TgP!IqB literal 0 HcmV?d00001 diff --git a/assets/cover.png b/assets/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..b28fc778bd0b10c55e37d3d476c5c6b8e8da47e1 GIT binary patch literal 13549 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 E4`(da=l}o! literal 0 HcmV?d00001 diff --git a/assets/cover.png.import b/assets/cover.png.import new file mode 100644 index 0000000..aee3f37 --- /dev/null +++ b/assets/cover.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d3mhmo7wgidet" +path="res://.godot/imported/cover.png-a54a6cb34ab8b6028826d2209ff06e38.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/cover.png" +dest_files=["res://.godot/imported/cover.png-a54a6cb34ab8b6028826d2209ff06e38.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/assets/cover.pxo b/assets/cover.pxo new file mode 100644 index 0000000000000000000000000000000000000000..4dfee05c136666552aad30154050710c1e15805d GIT binary patch literal 19685 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 void: fillNextBlocks() func _ready() -> void: - if GLOBAL.time <= 30: - get_tree().paused = true tickerTimer.start(blockSpeed) getNewPatterns() PlacePattern() -func _physics_process(delta: float) -> void: - - +func _physics_process(delta: float) -> void: var blockGroups = getBlockGroupsList() #if Input.is_action_pressed("down"): diff --git a/scenes/Grid/grid.tscn b/scenes/Grid/grid.tscn index 14c9adb..a03f04a 100644 --- a/scenes/Grid/grid.tscn +++ b/scenes/Grid/grid.tscn @@ -289,7 +289,7 @@ scale = Vector2(10, 20) [node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."] stream = ExtResource("16_ng6e7") -volume_db = 5.0 +volume_db = 3.0 autoplay = true [connection signal="timeout" from="Ticker" to="." method="_on_ticker_timeout"] From 2d9b0f716010cb823d831d26b7911345a49b6fbc Mon Sep 17 00:00:00 2001 From: Exobyt Date: Thu, 22 Aug 2024 00:46:52 +0200 Subject: [PATCH 02/10] Added Additional Assets --- assets/Text.pxo | Bin 817 -> 817 bytes assets/background_cover.png | Bin 0 -> 13801 bytes assets/background_cover.png.import | 34 +++++++++++++++++++++++++++++ assets/banner.png | Bin 0 -> 2835 bytes assets/banner.png.import | 34 +++++++++++++++++++++++++++++ assets/banner.pxo | Bin 0 -> 6356 bytes background_cover.pxo | Bin 0 -> 16891 bytes cover.png | Bin 0 -> 13801 bytes cover.png.import | 34 +++++++++++++++++++++++++++++ 9 files changed, 102 insertions(+) create mode 100644 assets/background_cover.png create mode 100644 assets/background_cover.png.import create mode 100644 assets/banner.png create mode 100644 assets/banner.png.import create mode 100644 assets/banner.pxo create mode 100644 background_cover.pxo create mode 100644 cover.png create mode 100644 cover.png.import diff --git a/assets/Text.pxo b/assets/Text.pxo index 48d375d674cc144aa49d2d2ef73b64d73a8a1c0a..ac64cdc61614bdf41c9eaf6cdc94fc395388ae58 100644 GIT binary patch delta 43 ucmdnUwvmk|z?+#xgn@yBgW=HRjXV{MOot|KZevsg(UVs)nS!VXOo0IYBn@T& delta 43 ucmdnUwvmk|z?+#xgn@yBgW=hPjXV{MOwT54Zevsg(UVs)nS!VXOo0Fg0}bi` diff --git a/assets/background_cover.png b/assets/background_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..dc965cc91aa20117829a616d2bd62579788f2442 GIT binary patch literal 13801 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 literal 0 HcmV?d00001 diff --git a/assets/background_cover.png.import b/assets/background_cover.png.import new file mode 100644 index 0000000..4089e4e --- /dev/null +++ b/assets/background_cover.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://concfa0ucfh5r" +path="res://.godot/imported/background_cover.png-4f369e6ec747afd3624cb72d387cb60f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/background_cover.png" +dest_files=["res://.godot/imported/background_cover.png-4f369e6ec747afd3624cb72d387cb60f.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/assets/banner.png b/assets/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..7ba8806c3a1b895b6d608de1b5fbf022d43b004d GIT binary patch literal 2835 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 UB$3YSa>ext8*6)fiKS=kpK>Pz!~g&Q literal 0 HcmV?d00001 diff --git a/assets/banner.png.import b/assets/banner.png.import new file mode 100644 index 0000000..a747be5 --- /dev/null +++ b/assets/banner.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://fb88qdd1n03w" +path="res://.godot/imported/banner.png-e7286fd0372c3fd293fa9b7b04a52c04.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/banner.png" +dest_files=["res://.godot/imported/banner.png-e7286fd0372c3fd293fa9b7b04a52c04.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/assets/banner.pxo b/assets/banner.pxo new file mode 100644 index 0000000000000000000000000000000000000000..c35a955bf7017e4b350cd32174273b739801ab6a GIT binary patch literal 6356 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 literal 0 HcmV?d00001 diff --git a/cover.png b/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..dc965cc91aa20117829a616d2bd62579788f2442 GIT binary patch literal 13801 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 literal 0 HcmV?d00001 diff --git a/cover.png.import b/cover.png.import new file mode 100644 index 0000000..1720b0d --- /dev/null +++ b/cover.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b0ap7he0u85gf" +path="res://.godot/imported/cover.png-7415a2400197f69905d305dff229e3ab.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://cover.png" +dest_files=["res://.godot/imported/cover.png-7415a2400197f69905d305dff229e3ab.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 From 5d00df8534f3ada199d215eb0bababa276a92ea4 Mon Sep 17 00:00:00 2001 From: Exobyt Date: Thu, 22 Aug 2024 22:36:40 +0200 Subject: [PATCH 03/10] Cleanup --- assets/Spash Screen.png | Bin 0 -> 16052 bytes assets/Spash Screen.png.import | 14 +++++++++++++ assets/Spash Screen.svg.import | 37 +++++++++++++++++++++++++++++++++ project.godot | 3 ++- scenes/Grid/grid.gd | 7 ------- 5 files changed, 53 insertions(+), 8 deletions(-) create mode 100644 assets/Spash Screen.png create mode 100644 assets/Spash Screen.png.import create mode 100644 assets/Spash Screen.svg.import diff --git a/assets/Spash Screen.png b/assets/Spash Screen.png new file mode 100644 index 0000000000000000000000000000000000000000..b3ca68ddf67ca5c49c4ccb8a402e026db3c85898 GIT binary patch literal 16052 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 ZiafLoKBDm#1%N+v(a6-W^8EEb{|DrWe7OJs literal 0 HcmV?d00001 diff --git a/assets/Spash Screen.png.import b/assets/Spash Screen.png.import new file mode 100644 index 0000000..9822d01 --- /dev/null +++ b/assets/Spash Screen.png.import @@ -0,0 +1,14 @@ +[remap] + +importer="image" +type="Image" +uid="uid://dsvcsn4a3u3by" +path="res://.godot/imported/Spash Screen.png-e4bf3d868c64976d7faedf235e897dc7.image" + +[deps] + +source_file="res://assets/Spash Screen.png" +dest_files=["res://.godot/imported/Spash Screen.png-e4bf3d868c64976d7faedf235e897dc7.image"] + +[params] + diff --git a/assets/Spash Screen.svg.import b/assets/Spash Screen.svg.import new file mode 100644 index 0000000..96888d7 --- /dev/null +++ b/assets/Spash Screen.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ijlwgubxu60f" +path="res://.godot/imported/Spash Screen.svg-9e2cdb46753c22f03ad4e202afa8c8c0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/Spash Screen.svg" +dest_files=["res://.godot/imported/Spash Screen.svg-9e2cdb46753c22f03ad4e202afa8c8c0.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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/project.godot b/project.godot index e6795c3..372159e 100644 --- a/project.godot +++ b/project.godot @@ -12,11 +12,12 @@ config_version=5 config/name="Texpand" config/description="Submission for the GMTK Game jam 2024. Tetris with special Blocks that expands" -config/version="0.1.2" +config/version="01.0.0" config/tags=PackedStringArray("game_jam") run/main_scene="res://scenes/Main/main.tscn" config/features=PackedStringArray("4.3", "GL Compatibility") run/max_fps=60 +boot_splash/image="res://assets/Spash Screen.png" config/icon="res://icon.svg" [autoload] diff --git a/scenes/Grid/grid.gd b/scenes/Grid/grid.gd index daa6bc5..347f72b 100644 --- a/scenes/Grid/grid.gd +++ b/scenes/Grid/grid.gd @@ -96,7 +96,6 @@ func getBlockGroupsList(): func getBlockedDirection(direction : GLOBAL.Direction, uid : int) -> bool: #var blockslist = getBlockGroupsList() var isBlocked = false - #print(getBlockGroupsList()) if getBlockGroupsList().has(uid): for i in getBlockGroupsList()[uid]: if i.getCollider(direction) != null: @@ -110,14 +109,9 @@ func getBlockedDirection(direction : GLOBAL.Direction, uid : int) -> bool: func splitOphansUID(uid): var compareList = {} - #print(uid) - #print(getBlockGroupsList()[uid]) var group = [] for i in getBlockGroupsList()[uid]: compareList[i] = i.getNeighboursUID(uid) - #if i.getNeighboursUID(uid) == []: - # i.UID = GLOBAL.getNewUID() - #print(i.getNeighboursUID(uid)) if i.getNeighboursUID(uid) == []: i.UID = GLOBAL.getNewUID() @@ -245,7 +239,6 @@ func test(): #currentPattern.position.y -= 64 for i in getBlockGroupsList()[GLOBAL.currentUID]: - print(i.name) if i.turningPoint: currentPattern.set_scale(Vector2(2,2)) currentPattern.moveToPosition(i.global_position-spawnpoint.position) From 5a9d686da42bc081a68c4b8e9a5fc2d3cc75955b Mon Sep 17 00:00:00 2001 From: Exobyt Date: Thu, 22 Aug 2024 22:42:58 +0200 Subject: [PATCH 04/10] Second Cleanup --- Spash Screen.png | Bin 0 -> 519228 bytes Spash Screen.png.import | 34 ++++++++++++++++++++++++++++++++++ project.godot | 2 ++ 3 files changed, 36 insertions(+) create mode 100644 Spash Screen.png create mode 100644 Spash Screen.png.import diff --git a/Spash Screen.png b/Spash Screen.png new file mode 100644 index 0000000000000000000000000000000000000000..bf8ff66faa1b5b5cf07610804e17cbc180609014 GIT binary patch literal 519228 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

<#05id=3|21v{X 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 U@bd4HI9LA7MqRDwujv2y|9f8F(EtDd literal 0 HcmV?d00001 diff --git a/Spash Screen.png.import b/Spash Screen.png.import new file mode 100644 index 0000000..1c12156 --- /dev/null +++ b/Spash Screen.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dqray31t2hrpr" +path="res://.godot/imported/Spash Screen.png-ed51e1282ab008bd58c5c442fcf2b95c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Spash Screen.png" +dest_files=["res://.godot/imported/Spash Screen.png-ed51e1282ab008bd58c5c442fcf2b95c.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/project.godot b/project.godot index 372159e..488ed0c 100644 --- a/project.godot +++ b/project.godot @@ -17,8 +17,10 @@ config/tags=PackedStringArray("game_jam") run/main_scene="res://scenes/Main/main.tscn" config/features=PackedStringArray("4.3", "GL Compatibility") run/max_fps=60 +boot_splash/bg_color=Color(0.2, 0.2, 0.2, 1) boot_splash/image="res://assets/Spash Screen.png" config/icon="res://icon.svg" +boot_splash/minimum_display_time=1 [autoload] From 1245ebc9e81a7d8a76c9a6b65c9bc16045d1b61b Mon Sep 17 00:00:00 2001 From: Exobyt Date: Thu, 22 Aug 2024 22:45:25 +0200 Subject: [PATCH 05/10] Fixed play Again Button From ed9f6712569c48e4f9000c928c13a51921087db2 Mon Sep 17 00:00:00 2001 From: Exobyt Date: Thu, 22 Aug 2024 23:46:07 +0200 Subject: [PATCH 06/10] Added Infinite Mode; Improved Timer --- scenes/Globals/global.gd | 21 +++++++++- scenes/Grid/camera_2d.gd | 2 +- scenes/Grid/grid.gd | 31 +++++++++----- scenes/Grid/grid.tscn | 3 +- scenes/Main/main.gd | 1 + scenes/Main/main.tscn | 56 ++++++++++++++++++++------ scenes/Menu/start_menu.gd | 7 +++- scenes/Menu/start_menu.tscn | 21 ++++++---- scenes/ScoreOverview/score_overview.gd | 11 +---- 9 files changed, 109 insertions(+), 44 deletions(-) diff --git a/scenes/Globals/global.gd b/scenes/Globals/global.gd index aba9705..fd8db83 100644 --- a/scenes/Globals/global.gd +++ b/scenes/Globals/global.gd @@ -32,6 +32,10 @@ var time = 60 var lost = false +enum MODES {INFINITE, TIME} + +var currentMode = MODES.INFINITE + func getNewUID() -> int: lastUID += 1 return lastUID @@ -42,7 +46,7 @@ func resetGame(): points = 0 lastUID = 0 currentUID = lastUID - time = 60 + resetTime() lost = false func _ready() -> void: @@ -50,3 +54,18 @@ func _ready() -> void: func lose(): lost = true + +func resetTime(): + time = 0 + + +func setTimeModeTimer(): + time = 60 + +func convertIntToTime(value) -> String: + var time = str(value) + var seconds = value % 60 + var minutes = value / 60 + if seconds < 10: + seconds = "0"+ str(seconds) + return str(minutes) + ":" + str(seconds) diff --git a/scenes/Grid/camera_2d.gd b/scenes/Grid/camera_2d.gd index 657391d..e0f391c 100644 --- a/scenes/Grid/camera_2d.gd +++ b/scenes/Grid/camera_2d.gd @@ -11,4 +11,4 @@ func _ready() -> void: # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: scoreLabel.text = str(GLOBAL.points) - timeLabel.text = str(GLOBAL.time) + timeLabel.text = GLOBAL.convertIntToTime(GLOBAL.time) diff --git a/scenes/Grid/grid.gd b/scenes/Grid/grid.gd index 347f72b..eb3cc12 100644 --- a/scenes/Grid/grid.gd +++ b/scenes/Grid/grid.gd @@ -8,7 +8,6 @@ extends Node2D @onready var loseArea = $LoseArea @onready var gameTimer = $GameTimer - var nextBlocks = [] var currentPattern = null @@ -20,6 +19,18 @@ var blockSpeed = 0.5 var stopped = false +func startGame(): + GLOBAL.resetGame() + match GLOBAL.currentMode: + GLOBAL.MODES.INFINITE: + GLOBAL.resetTime() + GLOBAL.MODES.TIME: + GLOBAL.setTimeModeTimer() + gameTimer.start(1) + tickerTimer.start(blockSpeed) + getNewPatterns() + PlacePattern() + func spawnBlock() -> void: var block = nextBlocks[0] GLOBAL.currentBlock = block @@ -28,10 +39,7 @@ func spawnBlock() -> void: if nextBlocks.size() < 2: fillNextBlocks() -func _ready() -> void: - tickerTimer.start(blockSpeed) - getNewPatterns() - PlacePattern() + func _physics_process(delta: float) -> void: var blockGroups = getBlockGroupsList() @@ -220,10 +228,15 @@ func _on_ticker_timeout() -> void: func _on_game_timer_timeout() -> void: - if GLOBAL.time - 1 > 0: - GLOBAL.time -= 1 - else: - GLOBAL.lose() + match GLOBAL.currentMode: + GLOBAL.MODES.INFINITE: + GLOBAL.time += 1 + GLOBAL.MODES.TIME: + if GLOBAL.time - 1 < 0: + GLOBAL.lose() + else: + GLOBAL.time -= 1 + gameTimer.start(1) diff --git a/scenes/Grid/grid.tscn b/scenes/Grid/grid.tscn index a03f04a..ee04933 100644 --- a/scenes/Grid/grid.tscn +++ b/scenes/Grid/grid.tscn @@ -148,7 +148,6 @@ position = Vector2(320, -128) shape = SubResource("RectangleShape2D_m21a1") [node name="GameTimer" type="Timer" parent="."] -autostart = true [node name="Camera2D" type="Camera2D" parent="."] position = Vector2(320, 640) @@ -193,7 +192,7 @@ layout_mode = 2 [node name="Time" type="Label" parent="Camera2D/CanvasLayer/Control/VBoxContainer/HBoxContainer2"] layout_mode = 2 -text = "Time:" +text = "Time: " label_settings = ExtResource("9_i2h5u") horizontal_alignment = 1 vertical_alignment = 1 diff --git a/scenes/Main/main.gd b/scenes/Main/main.gd index d9da935..b7bfa88 100644 --- a/scenes/Main/main.gd +++ b/scenes/Main/main.gd @@ -29,6 +29,7 @@ func loadGrid(): $scenes/StartMenu.queue_free() scenes.add_child(load("res://scenes/Grid/grid.tscn").instantiate()) $scenes/Grid.toggleButton() + $scenes/Grid.startGame() func scoreOverview(): if $scenes/Grid != null: diff --git a/scenes/Main/main.tscn b/scenes/Main/main.tscn index 269ea11..9706a19 100644 --- a/scenes/Main/main.tscn +++ b/scenes/Main/main.tscn @@ -11,10 +11,10 @@ show_behind_parent = true anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 -offset_left = -832.0 -offset_top = -1008.0 -offset_right = 674.0 -offset_bottom = -1991.0 +offset_left = -2856.0 +offset_top = -2504.0 +offset_right = 4287.0 +offset_bottom = -3032.0 grow_horizontal = 2 grow_vertical = 2 scale = Vector2(0.996259, 9.13391) @@ -22,56 +22,86 @@ color = Color(0.000693898, 0.000693898, 0.000693898, 1) [node name="CPUParticles2D" type="CPUParticles2D" parent="ColorRect"] modulate = Color(1, 1, 1, 0.478431) -position = Vector2(1300.87, 37.6618) +position = Vector2(3195.96, 14.0137) scale = Vector2(0.501878, 0.054741) -amount = 20 +amount = 50 lifetime = 5.0 preprocess = 5.0 speed_scale = 0.5 local_coords = true texture = ExtResource("2_5ae6b") emission_shape = 3 -emission_rect_extents = Vector2(2000, 0) +emission_rect_extents = Vector2(4000, 0) spread = 0.0 tangential_accel_max = 100.0 damping_max = 100.0 scale_amount_max = 2.0 +split_scale = true +scale_curve_x = null +scale_curve_y = null color = Color(1, 0, 0, 1) [node name="CPUParticles2D2" type="CPUParticles2D" parent="ColorRect"] modulate = Color(1, 1, 1, 0.478431) -position = Vector2(1300.87, 37.6618) +position = Vector2(3195.96, 14.0137) scale = Vector2(0.501878, 0.054741) -amount = 20 +amount = 50 lifetime = 5.0 preprocess = 5.0 speed_scale = 0.5 local_coords = true texture = ExtResource("2_5ae6b") emission_shape = 3 -emission_rect_extents = Vector2(2000, 0) +emission_rect_extents = Vector2(4000, 0) spread = 0.0 tangential_accel_max = 100.0 damping_max = 100.0 scale_amount_max = 2.0 +split_scale = true +scale_curve_x = null +scale_curve_y = null color = Color(0, 0.0499997, 1, 1) [node name="CPUParticles2D3" type="CPUParticles2D" parent="ColorRect"] modulate = Color(1, 1, 1, 0.478431) -position = Vector2(1300.87, 37.6618) +position = Vector2(3195.96, 14.0137) scale = Vector2(0.501878, 0.054741) -amount = 20 +amount = 50 lifetime = 5.0 preprocess = 5.0 speed_scale = 0.5 local_coords = true texture = ExtResource("2_5ae6b") emission_shape = 3 -emission_rect_extents = Vector2(2000, 0) +emission_rect_extents = Vector2(4000, 0) spread = 0.0 tangential_accel_max = 100.0 damping_max = 100.0 scale_amount_max = 2.0 +split_scale = true +scale_curve_x = null +scale_curve_y = null color = Color(0.966667, 1, 0, 1) +[node name="CPUParticles2D4" type="CPUParticles2D" parent="ColorRect"] +modulate = Color(1, 1, 1, 0.478431) +position = Vector2(3195.96, 14.0137) +scale = Vector2(0.501878, 0.054741) +amount = 50 +lifetime = 5.0 +preprocess = 5.0 +speed_scale = 0.5 +local_coords = true +texture = ExtResource("2_5ae6b") +emission_shape = 3 +emission_rect_extents = Vector2(4000, 0) +spread = 0.0 +tangential_accel_max = 100.0 +damping_max = 100.0 +scale_amount_max = 2.0 +split_scale = true +scale_curve_x = null +scale_curve_y = null +color = Color(0.138, 0.92, 0, 1) + [node name="scenes" type="Node" parent="."] diff --git a/scenes/Menu/start_menu.gd b/scenes/Menu/start_menu.gd index 719c1de..5d75538 100644 --- a/scenes/Menu/start_menu.gd +++ b/scenes/Menu/start_menu.gd @@ -11,5 +11,10 @@ func _process(delta: float) -> void: pass -func _on_start_button_pressed() -> void: +func _on_infinite_mode_button_pressed() -> void: + GLOBAL.currentMode = GLOBAL.MODES.INFINITE + get_parent().get_parent().loadGrid() + +func _on_time_mode_button_pressed() -> void: + GLOBAL.currentMode = GLOBAL.MODES.TIME get_parent().get_parent().loadGrid() diff --git a/scenes/Menu/start_menu.tscn b/scenes/Menu/start_menu.tscn index 8c5b908..0017176 100644 --- a/scenes/Menu/start_menu.tscn +++ b/scenes/Menu/start_menu.tscn @@ -19,7 +19,7 @@ grow_vertical = 2 theme = ExtResource("1_t0oee") script = ExtResource("2_1x51p") -[node name="StartButton" type="Button" parent="."] +[node name="VBoxContainer2" type="VBoxContainer" parent="."] layout_mode = 1 anchors_preset = 7 anchor_left = 0.5 @@ -27,13 +27,19 @@ anchor_top = 1.0 anchor_right = 0.5 anchor_bottom = 1.0 offset_left = -156.0 -offset_top = -320.0 -offset_right = 4.0 -offset_bottom = -224.0 +offset_top = -448.0 +offset_right = 164.0 +offset_bottom = -256.0 grow_horizontal = 2 grow_vertical = 0 -scale = Vector2(2, 2) -text = "Start" + +[node name="InfiniteModeButton" type="Button" parent="VBoxContainer2"] +layout_mode = 2 +text = "Infinite Mode" + +[node name="TimeModeButton" type="Button" parent="VBoxContainer2"] +layout_mode = 2 +text = "Time Mode" [node name="Label" type="Label" parent="."] layout_mode = 1 @@ -111,4 +117,5 @@ alignment = 1 layout_mode = 2 texture = ExtResource("7_mn4r0") -[connection signal="pressed" from="StartButton" to="." method="_on_start_button_pressed"] +[connection signal="pressed" from="VBoxContainer2/InfiniteModeButton" to="." method="_on_infinite_mode_button_pressed"] +[connection signal="pressed" from="VBoxContainer2/TimeModeButton" to="." method="_on_time_mode_button_pressed"] diff --git a/scenes/ScoreOverview/score_overview.gd b/scenes/ScoreOverview/score_overview.gd index df56329..f69caaa 100644 --- a/scenes/ScoreOverview/score_overview.gd +++ b/scenes/ScoreOverview/score_overview.gd @@ -9,17 +9,8 @@ func _ready() -> void: time.text = str(GLOBAL.time) GLOBAL.resetGame() - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta: float) -> void: - pass - - - - func _on_play_again_button_pressed() -> void: - get_parent().get_parent().laodGrid() - + get_parent().get_parent().loadGrid() func _on_home_pressed() -> void: get_parent().get_parent().loadStartMenu() From 9f6750b08aa1aabd9ded3a2a6be1f2594d739160 Mon Sep 17 00:00:00 2001 From: Exobyt Date: Tue, 27 Aug 2024 22:35:24 +0200 Subject: [PATCH 07/10] Cleaned up the Code; reworked the Block Physics --- project.godot | 13 +- scenes/Blocks/Patterns/1x3/1x3_Collision.tscn | 5 - .../Patterns/1x3/1x3_block_pattern.tscn | 18 - scenes/Blocks/Patterns/2x2/2x2_Collision.tscn | 4 - .../Patterns/2x2/2x2_block_pattern.tscn | 22 -- scenes/Blocks/Patterns/I/I_Collision.tscn | 4 - scenes/Blocks/Patterns/I/I_block_pattern.tscn | 22 -- .../L-Reverse/L-Reverse_Collision.tscn | 4 - .../L-Reverse/L-Reverse_block_pattern.tscn | 22 -- scenes/Blocks/Patterns/L/L_Collision.tscn | 4 - scenes/Blocks/Patterns/L/L_block_pattern.tscn | 22 -- scenes/Blocks/Patterns/T/T_Collision.tscn | 4 - scenes/Blocks/Patterns/T/T_block_pattern.tscn | 22 -- .../Z-Reverse/Z-Reverse_Collision.tscn | 5 - .../Z-Reverse/Z-Reverse_block_pattern.tscn | 21 -- scenes/Blocks/Patterns/Z/Z-Collision.tscn | 4 - scenes/Blocks/Patterns/Z/Z_block_pattern.tscn | 21 -- scenes/Blocks/Patterns/block_pattern.gd | 209 ------------ scenes/Blocks/Patterns/block_pattern.tscn | 12 - scenes/Blocks/Patterns/position_marker.gd | 3 - scenes/Blocks/Patterns/position_marker.tscn | 6 - scenes/Blocks/block.gd | 76 ----- scenes/Blocks/block.tscn | 85 ----- scenes/Globals/global.gd | 56 ++-- scenes/Grid/SpeedScale.tscn | 33 -- scenes/Grid/border.tscn | 4 +- scenes/Grid/grid.gd | 313 +++--------------- scenes/Grid/grid.tscn | 213 +++++------- scenes/Grid/lose_area.tscn | 5 - scenes/Grid/row_test.gd | 49 +-- scenes/Grid/row_test.tscn | 73 +++- scenes/Grid/speed_scale.gd | 9 - scenes/Main/main.gd | 23 +- scenes/Main/main.tscn | 8 +- scenes/NewBlocks/1x1/1x1.tscn | 24 ++ scenes/NewBlocks/1x3/1x3.tscn | 47 +++ scenes/NewBlocks/1x4/1x4.tscn | 62 ++++ scenes/NewBlocks/2x2/2x2.tscn | 62 ++++ scenes/NewBlocks/L/L.tscn | 60 ++++ scenes/NewBlocks/L_Reverse/L_Reverse.tscn | 60 ++++ scenes/NewBlocks/Z/Z.tscn | 60 ++++ scenes/NewBlocks/Z_Reverse/Z_Reverse.tscn | 60 ++++ scenes/NewBlocks/block.gd | 238 +++++++++++++ scenes/NewBlocks/block.tscn | 64 ++++ scenes/NewBlocks/part.gd | 108 ++++++ scenes/NewBlocks/part.tscn | 86 +++++ scenes/ScoreOverview/score_overview.gd | 12 +- scenes/ScoreOverview/score_overview.tscn | 16 + 48 files changed, 1237 insertions(+), 1116 deletions(-) delete mode 100644 scenes/Blocks/Patterns/1x3/1x3_Collision.tscn delete mode 100644 scenes/Blocks/Patterns/1x3/1x3_block_pattern.tscn delete mode 100644 scenes/Blocks/Patterns/2x2/2x2_Collision.tscn delete mode 100644 scenes/Blocks/Patterns/2x2/2x2_block_pattern.tscn delete mode 100644 scenes/Blocks/Patterns/I/I_Collision.tscn delete mode 100644 scenes/Blocks/Patterns/I/I_block_pattern.tscn delete mode 100644 scenes/Blocks/Patterns/L-Reverse/L-Reverse_Collision.tscn delete mode 100644 scenes/Blocks/Patterns/L-Reverse/L-Reverse_block_pattern.tscn delete mode 100644 scenes/Blocks/Patterns/L/L_Collision.tscn delete mode 100644 scenes/Blocks/Patterns/L/L_block_pattern.tscn delete mode 100644 scenes/Blocks/Patterns/T/T_Collision.tscn delete mode 100644 scenes/Blocks/Patterns/T/T_block_pattern.tscn delete mode 100644 scenes/Blocks/Patterns/Z-Reverse/Z-Reverse_Collision.tscn delete mode 100644 scenes/Blocks/Patterns/Z-Reverse/Z-Reverse_block_pattern.tscn delete mode 100644 scenes/Blocks/Patterns/Z/Z-Collision.tscn delete mode 100644 scenes/Blocks/Patterns/Z/Z_block_pattern.tscn delete mode 100644 scenes/Blocks/Patterns/block_pattern.gd delete mode 100644 scenes/Blocks/Patterns/block_pattern.tscn delete mode 100644 scenes/Blocks/Patterns/position_marker.gd delete mode 100644 scenes/Blocks/Patterns/position_marker.tscn delete mode 100644 scenes/Blocks/block.gd delete mode 100644 scenes/Blocks/block.tscn delete mode 100644 scenes/Grid/SpeedScale.tscn delete mode 100644 scenes/Grid/lose_area.tscn delete mode 100644 scenes/Grid/speed_scale.gd create mode 100644 scenes/NewBlocks/1x1/1x1.tscn create mode 100644 scenes/NewBlocks/1x3/1x3.tscn create mode 100644 scenes/NewBlocks/1x4/1x4.tscn create mode 100644 scenes/NewBlocks/2x2/2x2.tscn create mode 100644 scenes/NewBlocks/L/L.tscn create mode 100644 scenes/NewBlocks/L_Reverse/L_Reverse.tscn create mode 100644 scenes/NewBlocks/Z/Z.tscn create mode 100644 scenes/NewBlocks/Z_Reverse/Z_Reverse.tscn create mode 100644 scenes/NewBlocks/block.gd create mode 100644 scenes/NewBlocks/block.tscn create mode 100644 scenes/NewBlocks/part.gd create mode 100644 scenes/NewBlocks/part.tscn diff --git a/project.godot b/project.godot index 488ed0c..d1e2035 100644 --- a/project.godot +++ b/project.godot @@ -11,8 +11,8 @@ config_version=5 [application] config/name="Texpand" -config/description="Submission for the GMTK Game jam 2024. Tetris with special Blocks that expands" -config/version="01.0.0" +config/description="Tetris with special Blocks that expands" +config/version="2.0.0" config/tags=PackedStringArray("game_jam") run/main_scene="res://scenes/Main/main.tscn" config/features=PackedStringArray("4.3", "GL Compatibility") @@ -48,6 +48,7 @@ enabled=PackedStringArray("res://addons/debug_menu/plugin.cfg") Block="Block" ExpandBlock="" +Border="" [input] @@ -105,11 +106,9 @@ locale/locale_filter_mode=0 2d_physics/layer_1="map" 2d_physics/layer_2="block" -2d_physics/layer_3="rowTest" -2d_physics/layer_4="TurnTest" -2d_physics/layer_5="oneBlock" -2d_physics/layer_6="expandBlock" -2d_physics/layer_7="LoseArea" +2d_physics/layer_3="border" +2d_physics/layer_4="part" +2d_physics/layer_5="partTest" [rendering] diff --git a/scenes/Blocks/Patterns/1x3/1x3_Collision.tscn b/scenes/Blocks/Patterns/1x3/1x3_Collision.tscn deleted file mode 100644 index 9910313..0000000 --- a/scenes/Blocks/Patterns/1x3/1x3_Collision.tscn +++ /dev/null @@ -1,5 +0,0 @@ -[gd_scene format=3 uid="uid://yw2cspv5rkwh"] - -[node name="CollisionPolygon2D" type="CollisionPolygon2D"] -position = Vector2(32, 32) -polygon = PackedVector2Array(48, -16, 48, -48, -112, -48, -112, -16) diff --git a/scenes/Blocks/Patterns/1x3/1x3_block_pattern.tscn b/scenes/Blocks/Patterns/1x3/1x3_block_pattern.tscn deleted file mode 100644 index a875f4e..0000000 --- a/scenes/Blocks/Patterns/1x3/1x3_block_pattern.tscn +++ /dev/null @@ -1,18 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://b6aa24lk0ush1"] - -[ext_resource type="PackedScene" uid="uid://7knb2yqvkw6i" path="res://scenes/Blocks/Patterns/block_pattern.tscn" id="1_cqyb4"] -[ext_resource type="PackedScene" uid="uid://2v7wok4hnr6c" path="res://scenes/Blocks/Patterns/position_marker.tscn" id="2_4ivv2"] -[ext_resource type="PackedScene" uid="uid://yw2cspv5rkwh" path="res://scenes/Blocks/Patterns/1x3/1x3_Collision.tscn" id="3_vkhdr"] - -[node name="BlockPattern" instance=ExtResource("1_cqyb4")] - -[node name="PositionMarker" parent="Positions" index="0" instance=ExtResource("2_4ivv2")] -position = Vector2(-64, 0) - -[node name="PositionMarker2" parent="Positions" index="1" instance=ExtResource("2_4ivv2")] -turningPoint = true - -[node name="PositionMarker3" parent="Positions" index="2" instance=ExtResource("2_4ivv2")] -position = Vector2(64, 0) - -[node name="CollisionPolygon2D" parent="CollisionTest" index="0" instance=ExtResource("3_vkhdr")] diff --git a/scenes/Blocks/Patterns/2x2/2x2_Collision.tscn b/scenes/Blocks/Patterns/2x2/2x2_Collision.tscn deleted file mode 100644 index acac5a1..0000000 --- a/scenes/Blocks/Patterns/2x2/2x2_Collision.tscn +++ /dev/null @@ -1,4 +0,0 @@ -[gd_scene format=3 uid="uid://dw1dt1jp6e06h"] - -[node name="CollisionPolygon2D" type="CollisionPolygon2D"] -polygon = PackedVector2Array(48, 48, 48, -48, -48, -48, -48, 48) diff --git a/scenes/Blocks/Patterns/2x2/2x2_block_pattern.tscn b/scenes/Blocks/Patterns/2x2/2x2_block_pattern.tscn deleted file mode 100644 index 3b4840f..0000000 --- a/scenes/Blocks/Patterns/2x2/2x2_block_pattern.tscn +++ /dev/null @@ -1,22 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://dneih4b0e2snv"] - -[ext_resource type="PackedScene" uid="uid://7knb2yqvkw6i" path="res://scenes/Blocks/Patterns/block_pattern.tscn" id="1_sj41y"] -[ext_resource type="PackedScene" uid="uid://2v7wok4hnr6c" path="res://scenes/Blocks/Patterns/position_marker.tscn" id="2_csenr"] -[ext_resource type="PackedScene" uid="uid://dw1dt1jp6e06h" path="res://scenes/Blocks/Patterns/2x2/2x2_Collision.tscn" id="3_10q5w"] - -[node name="BlockPattern" instance=ExtResource("1_sj41y")] - -[node name="PositionMarker" parent="Positions" index="0" instance=ExtResource("2_csenr")] -turningPoint = true - -[node name="PositionMarker2" parent="Positions" index="1" instance=ExtResource("2_csenr")] -position = Vector2(0, -64) - -[node name="PositionMarker3" parent="Positions" index="2" instance=ExtResource("2_csenr")] -position = Vector2(-64, -64) - -[node name="PositionMarker4" parent="Positions" index="3" instance=ExtResource("2_csenr")] -position = Vector2(-64, 0) - -[node name="CollisionPolygon2D" parent="CollisionTest" index="0" instance=ExtResource("3_10q5w")] -position = Vector2(-32, -32) diff --git a/scenes/Blocks/Patterns/I/I_Collision.tscn b/scenes/Blocks/Patterns/I/I_Collision.tscn deleted file mode 100644 index ad51e82..0000000 --- a/scenes/Blocks/Patterns/I/I_Collision.tscn +++ /dev/null @@ -1,4 +0,0 @@ -[gd_scene format=3 uid="uid://ufbeturvvirh"] - -[node name="CollisionPolygon2D" type="CollisionPolygon2D"] -polygon = PackedVector2Array(112, -16, 112, -48, -112, -48, -112, -16) diff --git a/scenes/Blocks/Patterns/I/I_block_pattern.tscn b/scenes/Blocks/Patterns/I/I_block_pattern.tscn deleted file mode 100644 index 886a9b1..0000000 --- a/scenes/Blocks/Patterns/I/I_block_pattern.tscn +++ /dev/null @@ -1,22 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://hlwbhtymstbv"] - -[ext_resource type="PackedScene" uid="uid://7knb2yqvkw6i" path="res://scenes/Blocks/Patterns/block_pattern.tscn" id="1_ri22b"] -[ext_resource type="PackedScene" uid="uid://2v7wok4hnr6c" path="res://scenes/Blocks/Patterns/position_marker.tscn" id="2_6qvmy"] -[ext_resource type="PackedScene" uid="uid://ufbeturvvirh" path="res://scenes/Blocks/Patterns/I/I_Collision.tscn" id="3_1ktcx"] - -[node name="BlockPattern" instance=ExtResource("1_ri22b")] - -[node name="PositionMarker" parent="Positions" index="0" instance=ExtResource("2_6qvmy")] -position = Vector2(-64, 0) - -[node name="PositionMarker2" parent="Positions" index="1" instance=ExtResource("2_6qvmy")] -turningPoint = true - -[node name="PositionMarker3" parent="Positions" index="2" instance=ExtResource("2_6qvmy")] -position = Vector2(64, 0) - -[node name="PositionMarker4" parent="Positions" index="3" instance=ExtResource("2_6qvmy")] -position = Vector2(128, 0) - -[node name="CollisionPolygon2D" parent="CollisionTest" index="0" instance=ExtResource("3_1ktcx")] -position = Vector2(32, 32) diff --git a/scenes/Blocks/Patterns/L-Reverse/L-Reverse_Collision.tscn b/scenes/Blocks/Patterns/L-Reverse/L-Reverse_Collision.tscn deleted file mode 100644 index a0955b8..0000000 --- a/scenes/Blocks/Patterns/L-Reverse/L-Reverse_Collision.tscn +++ /dev/null @@ -1,4 +0,0 @@ -[gd_scene format=3 uid="uid://w0ak23cjswln"] - -[node name="CollisionPolygon2D" type="CollisionPolygon2D"] -polygon = PackedVector2Array(48, -16, 48, -48, -80, -48, -80, -112, -112, -112, -112, -16) diff --git a/scenes/Blocks/Patterns/L-Reverse/L-Reverse_block_pattern.tscn b/scenes/Blocks/Patterns/L-Reverse/L-Reverse_block_pattern.tscn deleted file mode 100644 index ef368d2..0000000 --- a/scenes/Blocks/Patterns/L-Reverse/L-Reverse_block_pattern.tscn +++ /dev/null @@ -1,22 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://1ubuiryqny62"] - -[ext_resource type="PackedScene" uid="uid://7knb2yqvkw6i" path="res://scenes/Blocks/Patterns/block_pattern.tscn" id="1_y8gyp"] -[ext_resource type="PackedScene" uid="uid://2v7wok4hnr6c" path="res://scenes/Blocks/Patterns/position_marker.tscn" id="2_tsq70"] -[ext_resource type="PackedScene" uid="uid://w0ak23cjswln" path="res://scenes/Blocks/Patterns/L-Reverse/L-Reverse_Collision.tscn" id="3_k23nd"] - -[node name="BlockPattern" instance=ExtResource("1_y8gyp")] - -[node name="PositionMarker" parent="Positions" index="0" instance=ExtResource("2_tsq70")] -position = Vector2(-64, 0) - -[node name="PositionMarker2" parent="Positions" index="1" instance=ExtResource("2_tsq70")] -turningPoint = true - -[node name="PositionMarker3" parent="Positions" index="2" instance=ExtResource("2_tsq70")] -position = Vector2(64, 0) - -[node name="PositionMarker4" parent="Positions" index="3" instance=ExtResource("2_tsq70")] -position = Vector2(-64, -64) - -[node name="CollisionPolygon2D" parent="CollisionTest" index="0" instance=ExtResource("3_k23nd")] -position = Vector2(32, 32) diff --git a/scenes/Blocks/Patterns/L/L_Collision.tscn b/scenes/Blocks/Patterns/L/L_Collision.tscn deleted file mode 100644 index 9f4c82b..0000000 --- a/scenes/Blocks/Patterns/L/L_Collision.tscn +++ /dev/null @@ -1,4 +0,0 @@ -[gd_scene format=3 uid="uid://663ocu3x6tjb"] - -[node name="CollisionPolygon2D" type="CollisionPolygon2D"] -polygon = PackedVector2Array(48, 48, 48, -48, 16, -48, 16, 16, -112, 16, -112, 48) diff --git a/scenes/Blocks/Patterns/L/L_block_pattern.tscn b/scenes/Blocks/Patterns/L/L_block_pattern.tscn deleted file mode 100644 index 4c1e5f9..0000000 --- a/scenes/Blocks/Patterns/L/L_block_pattern.tscn +++ /dev/null @@ -1,22 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://d00ywshnytrdo"] - -[ext_resource type="PackedScene" uid="uid://7knb2yqvkw6i" path="res://scenes/Blocks/Patterns/block_pattern.tscn" id="1_e7pv8"] -[ext_resource type="PackedScene" uid="uid://2v7wok4hnr6c" path="res://scenes/Blocks/Patterns/position_marker.tscn" id="2_q62gn"] -[ext_resource type="PackedScene" uid="uid://663ocu3x6tjb" path="res://scenes/Blocks/Patterns/L/L_Collision.tscn" id="3_ji3us"] - -[node name="BlockPattern" instance=ExtResource("1_e7pv8")] - -[node name="PositionMarker" parent="Positions" index="0" instance=ExtResource("2_q62gn")] -position = Vector2(-64, 0) - -[node name="PositionMarker2" parent="Positions" index="1" instance=ExtResource("2_q62gn")] -turningPoint = true - -[node name="PositionMarker3" parent="Positions" index="2" instance=ExtResource("2_q62gn")] -position = Vector2(64, 0) - -[node name="PositionMarker4" parent="Positions" index="3" instance=ExtResource("2_q62gn")] -position = Vector2(64, -64) - -[node name="CollisionPolygon2D" parent="CollisionTest" index="0" instance=ExtResource("3_ji3us")] -position = Vector2(32, -32) diff --git a/scenes/Blocks/Patterns/T/T_Collision.tscn b/scenes/Blocks/Patterns/T/T_Collision.tscn deleted file mode 100644 index fa7cc0b..0000000 --- a/scenes/Blocks/Patterns/T/T_Collision.tscn +++ /dev/null @@ -1,4 +0,0 @@ -[gd_scene format=3 uid="uid://dwfkvfcrbxr43"] - -[node name="CollisionPolygon2D" type="CollisionPolygon2D"] -polygon = PackedVector2Array(-48, 48, 112, 48, 112, 16, 48, 16, 48, -48, 16, -48, 16, 16, -48, 16) diff --git a/scenes/Blocks/Patterns/T/T_block_pattern.tscn b/scenes/Blocks/Patterns/T/T_block_pattern.tscn deleted file mode 100644 index 4b981a4..0000000 --- a/scenes/Blocks/Patterns/T/T_block_pattern.tscn +++ /dev/null @@ -1,22 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://c25mwygtprl08"] - -[ext_resource type="PackedScene" uid="uid://7knb2yqvkw6i" path="res://scenes/Blocks/Patterns/block_pattern.tscn" id="1_1p2cg"] -[ext_resource type="PackedScene" uid="uid://2v7wok4hnr6c" path="res://scenes/Blocks/Patterns/position_marker.tscn" id="2_pponh"] -[ext_resource type="PackedScene" uid="uid://dwfkvfcrbxr43" path="res://scenes/Blocks/Patterns/T/T_Collision.tscn" id="3_svqqd"] - -[node name="BlockPattern" instance=ExtResource("1_1p2cg")] - -[node name="PositionMarker" parent="Positions" index="0" instance=ExtResource("2_pponh")] -position = Vector2(-64, 0) - -[node name="PositionMarker2" parent="Positions" index="1" instance=ExtResource("2_pponh")] -turningPoint = true - -[node name="PositionMarker3" parent="Positions" index="2" instance=ExtResource("2_pponh")] -position = Vector2(64, 0) - -[node name="PositionMarker4" parent="Positions" index="3" instance=ExtResource("2_pponh")] -position = Vector2(0, -64) - -[node name="CollisionPolygon2D" parent="CollisionTest" index="0" instance=ExtResource("3_svqqd")] -position = Vector2(-24, -32) diff --git a/scenes/Blocks/Patterns/Z-Reverse/Z-Reverse_Collision.tscn b/scenes/Blocks/Patterns/Z-Reverse/Z-Reverse_Collision.tscn deleted file mode 100644 index 0d31ea2..0000000 --- a/scenes/Blocks/Patterns/Z-Reverse/Z-Reverse_Collision.tscn +++ /dev/null @@ -1,5 +0,0 @@ -[gd_scene format=3 uid="uid://wv65ib41nt8v"] - -[node name="CollisionPolygon2D" type="CollisionPolygon2D"] -position = Vector2(32, -32) -polygon = PackedVector2Array(48, 48, 48, 16, -16, 16, -16, -48, -112, -48, -112, -16, -48, -16, -48, 48) diff --git a/scenes/Blocks/Patterns/Z-Reverse/Z-Reverse_block_pattern.tscn b/scenes/Blocks/Patterns/Z-Reverse/Z-Reverse_block_pattern.tscn deleted file mode 100644 index 8f0a555..0000000 --- a/scenes/Blocks/Patterns/Z-Reverse/Z-Reverse_block_pattern.tscn +++ /dev/null @@ -1,21 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://bnpmnhr43ls40"] - -[ext_resource type="PackedScene" uid="uid://7knb2yqvkw6i" path="res://scenes/Blocks/Patterns/block_pattern.tscn" id="1_skje3"] -[ext_resource type="PackedScene" uid="uid://2v7wok4hnr6c" path="res://scenes/Blocks/Patterns/position_marker.tscn" id="2_prllt"] -[ext_resource type="PackedScene" uid="uid://wv65ib41nt8v" path="res://scenes/Blocks/Patterns/Z-Reverse/Z-Reverse_Collision.tscn" id="3_xf113"] - -[node name="BlockPattern" instance=ExtResource("1_skje3")] - -[node name="PositionMarker" parent="Positions" index="0" instance=ExtResource("2_prllt")] -position = Vector2(-64, -64) - -[node name="PositionMarker2" parent="Positions" index="1" instance=ExtResource("2_prllt")] -position = Vector2(0, -64) - -[node name="PositionMarker3" parent="Positions" index="2" instance=ExtResource("2_prllt")] -turningPoint = true - -[node name="PositionMarker4" parent="Positions" index="3" instance=ExtResource("2_prllt")] -position = Vector2(64, 0) - -[node name="CollisionPolygon2D" parent="CollisionTest" index="0" instance=ExtResource("3_xf113")] diff --git a/scenes/Blocks/Patterns/Z/Z-Collision.tscn b/scenes/Blocks/Patterns/Z/Z-Collision.tscn deleted file mode 100644 index 91b637a..0000000 --- a/scenes/Blocks/Patterns/Z/Z-Collision.tscn +++ /dev/null @@ -1,4 +0,0 @@ -[gd_scene format=3 uid="uid://dkugrxq2fo1vh"] - -[node name="CollisionPolygon2D" type="CollisionPolygon2D"] -polygon = PackedVector2Array(16, 16, 16, -48, 80, -48, 80, -80, -16, -80, -16, -16, -80, -16, -80, 16) diff --git a/scenes/Blocks/Patterns/Z/Z_block_pattern.tscn b/scenes/Blocks/Patterns/Z/Z_block_pattern.tscn deleted file mode 100644 index 380031b..0000000 --- a/scenes/Blocks/Patterns/Z/Z_block_pattern.tscn +++ /dev/null @@ -1,21 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://ba70ybe7ico7f"] - -[ext_resource type="PackedScene" uid="uid://7knb2yqvkw6i" path="res://scenes/Blocks/Patterns/block_pattern.tscn" id="1_ccvbw"] -[ext_resource type="PackedScene" uid="uid://2v7wok4hnr6c" path="res://scenes/Blocks/Patterns/position_marker.tscn" id="2_y06oe"] -[ext_resource type="PackedScene" uid="uid://dkugrxq2fo1vh" path="res://scenes/Blocks/Patterns/Z/Z-Collision.tscn" id="3_0127o"] - -[node name="BlockPattern" instance=ExtResource("1_ccvbw")] - -[node name="PositionMarker" parent="Positions" index="0" instance=ExtResource("2_y06oe")] -position = Vector2(-64, 0) - -[node name="PositionMarker2" parent="Positions" index="1" instance=ExtResource("2_y06oe")] -turningPoint = true - -[node name="PositionMarker3" parent="Positions" index="2" instance=ExtResource("2_y06oe")] -position = Vector2(0, -64) - -[node name="PositionMarker4" parent="Positions" index="3" instance=ExtResource("2_y06oe")] -position = Vector2(64, -64) - -[node name="CollisionPolygon2D" parent="CollisionTest" index="0" instance=ExtResource("3_0127o")] diff --git a/scenes/Blocks/Patterns/block_pattern.gd b/scenes/Blocks/Patterns/block_pattern.gd deleted file mode 100644 index 7ad7b3f..0000000 --- a/scenes/Blocks/Patterns/block_pattern.gd +++ /dev/null @@ -1,209 +0,0 @@ -extends Node2D - -@onready var positions = $Positions -@onready var collision = $CollisionTest - -var lastDirection = null - -var type = GLOBAL.BLOCKTYPES.LIGHT -var expand = false - -func getPositions(): - return positions.get_children() - -func checkDirection(): - print("xfsdfdsfd") - var leftCollision = false - var rightCollision = false - - movePattern(GLOBAL.Direction.RIGHT) - print("0: ", await isColliding()) - if await isColliding(): - movePattern(GLOBAL.Direction.LEFT) - print("1: ", await isColliding()) - #if await isColliding(): - #movePattern(GLOBAL.Direction.RIGHT, 2) - #print("2: ", await isColliding()) - #if await isColliding(): - #movePattern(GLOBAL.Direction.LEFT, 2) - #print("3: ", await isColliding()) - #if await isColliding(): - #resetPosition() - #print("4: ", await isColliding()) - #if await isColliding(): - #rightCollision = true - #resetPosition() - #movePattern(GLOBAL.Direction.LEFT) - #if await isColliding(): - #leftCollision = true - #print(" LEFT: ", leftCollision, "\n RIGHT: ", rightCollision) - #resetPosition() - #if await getCollidingAreas() != []: - #rightCollision = true - #resetPosition() - #movePattern(GLOBAL.Direction.LEFT) - #if await getCollidingAreas() != []: - #leftCollision = true - #resetPosition() - # - #if leftCollision: - #movePattern(GLOBAL.Direction.RIGHT) - #elif rightCollision: - #movePattern(GLOBAL.Direction.LEFT) - - - #else: - - #resetPosition() - -func moveToPosition(newPosition): - resetPosition() - position = newPosition - -func turn(direction, newPosition): - reset(newPosition) - #moveToPosition(newPosition) - rotatePattern(direction) - - #if await isColliding(): - #print(1) - #movePattern(GLOBAL.Direction.RIGHT, 1) - #if await isColliding(): - #print(2) - #movePattern(GLOBAL.Direction.LEFT,2) - #if await isColliding(): - #print(3) - #movePattern(GLOBAL.Direction.RIGHT, 3) - #if await isColliding(): - #print(4) - #movePattern(GLOBAL.Direction.LEFT, 4) - - #if await isColliding(): - #print(1) - #movePattern(GLOBAL.Direction.RIGHT, 2) - #if await isColliding(): - #print(2) - #movePattern(GLOBAL.Direction.LEFT,4) - # - if await isColliding(): - movePattern(GLOBAL.Direction.RIGHT, 1) - if await isColliding(): - movePattern(GLOBAL.Direction.RIGHT, 1) - if await isColliding(): - movePattern(GLOBAL.Direction.LEFT,3) - if await isColliding(): - movePattern(GLOBAL.Direction.LEFT,1) - - #if await isColliding(): - #print(2) - #movePattern(GLOBAL.Direction.RIGHT, 1) - #if await isColliding(): - #print(3) - #movePattern(GLOBAL.Direction.LEFT,3) - #if await isColliding(): - #print(4) - #movePattern(GLOBAL.Direction.LEFT,1) - #if await isColliding(): - #print(3) - #movePattern(GLOBAL.Direction.LEFT, 1) - #movePattern(GLOBAL.Direction.RIGHT, 3) - #if await isColliding(): - #movePattern(GLOBAL.Direction.LEFT, 2) - if await isColliding(): - resetPosition() - - - -func getCollidingAreas(): - collision.force_update_transform() - #collision.monitoring = false - #collision.monitorable = false - #await get_tree().process_frame - #await get_tree().process_frame - #collision.monitoring = true - collision.monitorable = false - await get_tree().process_frame - collision.monitorable = true - collision.monitorable = false - await get_tree().process_frame - collision.monitorable = true - var collidingAreas = [] - for i in collision.get_overlapping_areas(): - if i.is_in_group("Block"): - if i.UID != GLOBAL.currentUID: - collidingAreas.append(i) - else: - collidingAreas.append(i) - return collidingAreas - -func isColliding(): - return await getCollidingAreas() != [] - -func getCollidingBorder(): - await get_tree().process_frame - await get_tree().process_frame - await get_tree().process_frame - await get_tree().process_frame - var collidingAreas = [] - for i in collision.get_overlapping_areas(): - if not i.is_in_group("Block"): - collidingAreas.append(i) - return collidingAreas - -func getCollidingBlocks(): - await get_tree().process_frame - await get_tree().process_frame - await get_tree().process_frame - var collidingAreas = [] - for i in collision.get_overlapping_areas(): - if i.is_in_group("Block"): - if i.UID != GLOBAL.currentUID: - collidingAreas.append(i) - return collidingAreas - -#func _on_collision_test_area_entered(area: Area2D) -> void: - #if lastDirection == null: - #checkLeft() - #else: - #if lastDirection == GLOBAL.Direction.LEFT: - #print(getCollidingAreas()) - #checkRight() - #if lastDirection == GLOBAL.Direction.LEFT: - #print(getCollidingAreas()) - #print(collision.get_overlapping_areas()) - #print(getCollidingAreas()) - #print(checkLeft()) - #print(checkRight()) - -func reset(newPosition): - position = newPosition - positions.position.x = 0 - collision.position.x = 0 - rotation_degrees = 0 - -func movePattern(direction, steps = 1): - match direction: - GLOBAL.Direction.LEFT: - positions.position.x -= GLOBAL.GRID * steps - collision.position.x -= GLOBAL.GRID * steps - #print("Left") - #print(positions.position) - GLOBAL.Direction.RIGHT: - positions.position.x += GLOBAL.GRID * steps - collision.position.x += GLOBAL.GRID * steps - #print("Right") - #print(positions.position) - -func resetPosition(): - #print("RESET") - positions.position.x = 0 - collision.position.x = 0 - -func rotatePattern(direction): - match direction: - GLOBAL.Direction.LEFT: - positions.rotation_degrees += 90 - collision.rotation_degrees += 90 - GLOBAL.Direction.RIGHT: - positions.rotation_degrees -= 90 - collision.rotation_degrees -= 90 diff --git a/scenes/Blocks/Patterns/block_pattern.tscn b/scenes/Blocks/Patterns/block_pattern.tscn deleted file mode 100644 index 649a5ce..0000000 --- a/scenes/Blocks/Patterns/block_pattern.tscn +++ /dev/null @@ -1,12 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://7knb2yqvkw6i"] - -[ext_resource type="Script" path="res://scenes/Blocks/Patterns/block_pattern.gd" id="1_ne3bj"] - -[node name="BlockPattern" type="Node2D"] -script = ExtResource("1_ne3bj") - -[node name="Positions" type="Node2D" parent="."] - -[node name="CollisionTest" type="Area2D" parent="."] -collision_layer = 8 -collision_mask = 3 diff --git a/scenes/Blocks/Patterns/position_marker.gd b/scenes/Blocks/Patterns/position_marker.gd deleted file mode 100644 index 0755fdb..0000000 --- a/scenes/Blocks/Patterns/position_marker.gd +++ /dev/null @@ -1,3 +0,0 @@ -extends Marker2D - -@export var turningPoint = false diff --git a/scenes/Blocks/Patterns/position_marker.tscn b/scenes/Blocks/Patterns/position_marker.tscn deleted file mode 100644 index 4009581..0000000 --- a/scenes/Blocks/Patterns/position_marker.tscn +++ /dev/null @@ -1,6 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://2v7wok4hnr6c"] - -[ext_resource type="Script" path="res://scenes/Blocks/Patterns/position_marker.gd" id="1_775kb"] - -[node name="PositionMarker" type="Marker2D"] -script = ExtResource("1_775kb") diff --git a/scenes/Blocks/block.gd b/scenes/Blocks/block.gd deleted file mode 100644 index 3556923..0000000 --- a/scenes/Blocks/block.gd +++ /dev/null @@ -1,76 +0,0 @@ -extends Area2D - -@onready var floorRaycast = $RaycastFloor -@onready var raycastLeft = $RaycastLeft -@onready var raycastRight = $RaycastRight -@onready var raycastTop = $RaycastTop - -@onready var spriteBlock = $Block -@onready var spriteSpecialBlock = $SpecialBlock -@onready var spriteExpandBlock = $ExpandBlock -@onready var spriteSpecialExpandedBlock = $SpecialExpandedBlock - -@export var UID = 1 - -var secretPosition = Vector2() - -var turningPoint = false - -var type = GLOBAL.BLOCKTYPES.LIGHT - -var expand = false - -func _ready() -> void: - secretPosition = position - -func getCollider(direction : GLOBAL.Direction): - match direction: - GLOBAL.Direction.BOTTOM: - return floorRaycast.get_collider() - GLOBAL.Direction.LEFT: - return raycastLeft.get_collider() - GLOBAL.Direction.RIGHT: - return raycastRight.get_collider() - GLOBAL.Direction.TOP: - return raycastTop.get_collider() - -func getNeighbours(): - var neighbours = [] - for i in get_overlapping_areas(): - if i.is_in_group("Block"): - neighbours.append(i) - return neighbours - -func getNeighboursUID(uid): - var neighbours = [] - for i in get_overlapping_areas(): - if i.is_in_group("Block"): - if i.UID == uid: - neighbours.append(i) - return neighbours - -func move(x,y): - secretPosition = position - secretPosition.x += x - secretPosition.y += y - position = secretPosition.snapped(Vector2(64, 64)) - -func moveDown(): - move(0, 64) -func moveLeft(): - move(-64, 0) -func moveRight(): - move(64, 0) - -func setlook(): - match type: - GLOBAL.BLOCKTYPES.LIGHT: - if expand: - spriteExpandBlock.show() - else: - spriteBlock.show() - GLOBAL.BLOCKTYPES.HEAVY: - if expand: - spriteSpecialExpandedBlock.show() - else: - spriteSpecialBlock.show() diff --git a/scenes/Blocks/block.tscn b/scenes/Blocks/block.tscn deleted file mode 100644 index b990606..0000000 --- a/scenes/Blocks/block.tscn +++ /dev/null @@ -1,85 +0,0 @@ -[gd_scene load_steps=9 format=3 uid="uid://do8gr42oq2a0y"] - -[ext_resource type="Script" path="res://scenes/Blocks/block.gd" id="1_t1hpt"] -[ext_resource type="Texture2D" uid="uid://cbuxv7iwn0qm7" path="res://assets/Blocks/Block.png" id="2_dyhpk"] -[ext_resource type="Texture2D" uid="uid://dni2qahrw2p0k" path="res://assets/Blocks/SpecialBlock.png" id="3_do2c5"] -[ext_resource type="Texture2D" uid="uid://jmobplsqdy6o" path="res://assets/Blocks/ExpandBlock.png" id="4_c0a60"] -[ext_resource type="Texture2D" uid="uid://13wfksnp806p" path="res://assets/Blocks/SpecialExpandedBlock.png" id="5_nea42"] - -[sub_resource type="QuadMesh" id="QuadMesh_lsuac"] - -[sub_resource type="RectangleShape2D" id="RectangleShape2D_gvev2"] -size = Vector2(80, 80) - -[sub_resource type="RectangleShape2D" id="RectangleShape2D_ti23g"] -size = Vector2(48, 48) - -[node name="Block" type="Area2D" groups=["Block"]] -collision_layer = 2 -collision_mask = 14 -script = ExtResource("1_t1hpt") - -[node name="MeshInstance2D" type="MeshInstance2D" parent="."] -visible = false -position = Vector2(31, 31) -scale = Vector2(62, 62) -mesh = SubResource("QuadMesh_lsuac") - -[node name="RaycastFloor" type="RayCast2D" parent="."] -position = Vector2(32, 72) -target_position = Vector2(0, 8) -collision_mask = 3 -hit_from_inside = true -collide_with_areas = true - -[node name="RaycastLeft" type="RayCast2D" parent="."] -position = Vector2(-8, 32) -target_position = Vector2(-8, 0) -collision_mask = 3 -hit_from_inside = true -collide_with_areas = true - -[node name="RaycastRight" type="RayCast2D" parent="."] -position = Vector2(72, 32) -target_position = Vector2(8, 0) -collision_mask = 3 -hit_from_inside = true -collide_with_areas = true - -[node name="RaycastTop" type="RayCast2D" parent="."] -position = Vector2(32, -8) -target_position = Vector2(0, -8) -collision_mask = 3 -hit_from_inside = true -collide_with_areas = true - -[node name="CollisionShape2D" type="CollisionShape2D" parent="."] -position = Vector2(32, 32) -shape = SubResource("RectangleShape2D_gvev2") - -[node name="Area2D" type="Area2D" parent="." groups=["Block"]] -collision_layer = 16 - -[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"] -position = Vector2(32, 32) -shape = SubResource("RectangleShape2D_ti23g") - -[node name="Block" type="Sprite2D" parent="."] -visible = false -position = Vector2(32, 32) -texture = ExtResource("2_dyhpk") - -[node name="SpecialBlock" type="Sprite2D" parent="."] -visible = false -position = Vector2(32, 32) -texture = ExtResource("3_do2c5") - -[node name="ExpandBlock" type="Sprite2D" parent="."] -visible = false -position = Vector2(32, 32) -texture = ExtResource("4_c0a60") - -[node name="SpecialExpandedBlock" type="Sprite2D" parent="."] -visible = false -position = Vector2(32, 32) -texture = ExtResource("5_nea42") diff --git a/scenes/Globals/global.gd b/scenes/Globals/global.gd index fd8db83..4e0f121 100644 --- a/scenes/Globals/global.gd +++ b/scenes/Globals/global.gd @@ -2,9 +2,9 @@ extends Node var points = 0 -const minSpeed = 0.5 -const maxSpeed = 0.15 -var currentSpeed := minSpeed +enum SPEED {MIN=30, MAX=100} + +var currentSpeed := SPEED.MIN var hasSelectedSpeed = false @@ -12,21 +12,27 @@ const GRID := 64 enum BLOCKTYPES {LIGHT=1, HEAVY=3} -const BLOCKSPATTERS : Dictionary = { - "Z": "res://scenes/Blocks/Patterns/Z/Z_block_pattern.tscn", - "L": "res://scenes/Blocks/Patterns/L/L_block_pattern.tscn", - "L-Reverse": "res://scenes/Blocks/Patterns/L-Reverse/L-Reverse_block_pattern.tscn", - "Z-Reverse": "res://scenes/Blocks/Patterns/Z-Reverse/Z-Reverse_block_pattern.tscn", - "2x2": "res://scenes/Blocks/Patterns/2x2/2x2_block_pattern.tscn", - "T": "res://scenes/Blocks/Patterns/T/T_block_pattern.tscn", - #"I": "res://scenes/Blocks/Patterns/I/I_block_pattern.tscn", - "1x3": "res://scenes/Blocks/Patterns/1x3/1x3_block_pattern.tscn" +var blockStopped = false + +var testingPhase = false + +var rowRemoved = false + +const BLOCKS : Dictionary = { + #"1x1": "res://scenes/NewBlocks/1x1/1x1.tscn", + "1x3": "res://scenes/NewBlocks/1x3/1x3.tscn", + #"1x4": "res://scenes/NewBlocks/1x4/1x4.tscn", + "2x2": "res://scenes/NewBlocks/2x2/2x2.tscn", + "L": "res://scenes/NewBlocks/L/L.tscn", + "L_Reverse": "res://scenes/NewBlocks/L_Reverse/L_Reverse.tscn", + "Z": "res://scenes/NewBlocks/Z/Z.tscn", + "Z_Reverse": "res://scenes/NewBlocks/Z_Reverse/Z_Reverse.tscn", } enum Direction {BOTTOM, LEFT, RIGHT, TOP} -var lastUID = 1 +var currentUID : int = 0 -var currentUID = lastUID +var currentID : int = 0 var time = 60 @@ -36,16 +42,22 @@ enum MODES {INFINITE, TIME} var currentMode = MODES.INFINITE -func getNewUID() -> int: - lastUID += 1 - return lastUID +func getNewUID() -> int: + currentUID += 1 + return currentUID + +func getNewID() -> int: + currentID += 1 + return currentID func resetGame(): + rowRemoved = false + blockStopped = false + testingPhase = false lost = false points = 0 - lastUID = 0 - currentUID = lastUID + currentUID = 0 resetTime() lost = false @@ -69,3 +81,9 @@ func convertIntToTime(value) -> String: if seconds < 10: seconds = "0"+ str(seconds) return str(minutes) + ":" + str(seconds) + +func speedUp(): + if currentSpeed + 1 <= SPEED.MAX: + currentSpeed += 1 + else: + currentSpeed = SPEED.MAX diff --git a/scenes/Grid/SpeedScale.tscn b/scenes/Grid/SpeedScale.tscn deleted file mode 100644 index f26ccd3..0000000 --- a/scenes/Grid/SpeedScale.tscn +++ /dev/null @@ -1,33 +0,0 @@ -[gd_scene load_steps=5 format=3 uid="uid://c03h0nwewolfx"] - -[ext_resource type="Texture2D" uid="uid://dbspjkdc5q1mc" path="res://assets/Slider.png" id="1_idpo1"] -[ext_resource type="Texture2D" uid="uid://blj4h34gr3s0q" path="res://assets/SpeedScale.png" id="1_otl7y"] -[ext_resource type="Script" path="res://scenes/Grid/speed_scale.gd" id="1_w2ui3"] - -[sub_resource type="Curve2D" id="Curve2D_jnpcs"] -_data = { -"points": PackedVector2Array(0, 0, 0, 0, 0, 628, 0, 0, 0, 0, 0, -636) -} -point_count = 2 - -[node name="SpeedScale" type="Node2D"] -script = ExtResource("1_w2ui3") - -[node name="Sprite2D" type="Sprite2D" parent="."] -scale = Vector2(12.8, 12.8) -texture = ExtResource("1_otl7y") - -[node name="Path2D" type="Path2D" parent="."] -position = Vector2(0, 3.94867) -scale = Vector2(1, 0.99359) -curve = SubResource("Curve2D_jnpcs") - -[node name="Slider" type="PathFollow2D" parent="Path2D"] -position = Vector2(0, -636) -progress = 1264.0 -rotates = false -loop = false - -[node name="Sprite2D" type="Sprite2D" parent="Path2D/Slider"] -scale = Vector2(12.8, 12.8) -texture = ExtResource("1_idpo1") diff --git a/scenes/Grid/border.tscn b/scenes/Grid/border.tscn index a03dabb..262c13e 100644 --- a/scenes/Grid/border.tscn +++ b/scenes/Grid/border.tscn @@ -1,6 +1,6 @@ [gd_scene format=3 uid="uid://bm7rshwf6pjb"] -[node name="Border" type="Area2D"] -collision_mask = 16 +[node name="Border" type="StaticBody2D" groups=["Border"]] +collision_mask = 2 [node name="CollisionShape2D" type="CollisionShape2D" parent="."] diff --git a/scenes/Grid/grid.gd b/scenes/Grid/grid.gd index eb3cc12..2086d65 100644 --- a/scenes/Grid/grid.gd +++ b/scenes/Grid/grid.gd @@ -1,13 +1,11 @@ extends Node2D @onready var spawnpoint = $Spawnpoint -@onready var blocks = $Blocks -@onready var tickerTimer = $Ticker -@onready var patterns = $Patterns -@onready var turnTickTimer = $TurnTick -@onready var loseArea = $LoseArea +@onready var blockContainer = $Blocks @onready var gameTimer = $GameTimer +var partPath = "res://scenes/NewBlocks/part.tscn" + var nextBlocks = [] var currentPattern = null @@ -18,8 +16,28 @@ var blockSpeed = 0.5 var stopped = false +#func _ready() -> void: + #addBlocks() + #for i in blockContainer.get_children(): + #i.init(i.global_position) + +func _physics_process(delta: float) -> void: + if GLOBAL.blockStopped: + GLOBAL.testingPhase = true + for i in $Rows.get_children(): + i.check() + + if $Borders/RayCast2D.is_colliding(): + GLOBAL.lose() + spawnBlock() + GLOBAL.testingPhase = false + GLOBAL.blockStopped = false + $TestTimer.start(0.2) + func startGame(): + fillNextBlocks() + spawnBlock() GLOBAL.resetGame() match GLOBAL.currentMode: GLOBAL.MODES.INFINITE: @@ -27,205 +45,6 @@ func startGame(): GLOBAL.MODES.TIME: GLOBAL.setTimeModeTimer() gameTimer.start(1) - tickerTimer.start(blockSpeed) - getNewPatterns() - PlacePattern() - -func spawnBlock() -> void: - var block = nextBlocks[0] - GLOBAL.currentBlock = block - spawnpoint.add_child(block) - nextBlocks.pop_at(0) - if nextBlocks.size() < 2: - fillNextBlocks() - - - -func _physics_process(delta: float) -> void: - var blockGroups = getBlockGroupsList() - #if Input.is_action_pressed("down"): - - if Input.is_action_pressed("down") and not stopped and not Input.is_action_just_released("down"): - if not tickerTimer.is_stopped(): - blockSpeed = GLOBAL.maxSpeed - else: - if not tickerTimer.is_stopped(): - blockSpeed = GLOBAL.minSpeed - if Input.is_action_just_pressed("rotate_right") and not stopped: - if blockGroups.has(GLOBAL.currentUID): - for i in blockGroups[GLOBAL.currentUID]: - if i.turningPoint: - if currentPattern != null: - if not stopped: - currentPattern.turn(GLOBAL.Direction.RIGHT,i.position-spawnpoint.position + Vector2(GLOBAL.GRID/2, GLOBAL.GRID/2)) - #turnBlocks() - if turnTickTimer.is_stopped(): - turnTickTimer.start(9*delta) - - if Input.is_action_just_pressed("rotate_left") and not stopped: - if blockGroups.has(GLOBAL.currentUID): - for i in blockGroups[GLOBAL.currentUID]: - if i.turningPoint: - if currentPattern != null: - if not stopped: - currentPattern.turn(GLOBAL.Direction.LEFT,i.position-spawnpoint.position + Vector2(GLOBAL.GRID/2, GLOBAL.GRID/2)) - #turnBlocks() - if turnTickTimer.is_stopped(): - turnTickTimer.start(9*delta) - - if Input.is_action_just_pressed("left"): - moveUidGroup(GLOBAL.Direction.LEFT, GLOBAL.currentUID) - if Input.is_action_just_pressed("right"): - moveUidGroup(GLOBAL.Direction.RIGHT, GLOBAL.currentUID) - - -func fillNextBlocks(): - var newBlocks = [] - for i in GLOBAL.BLOCKS: - var block = load(GLOBAL.BLOCKS[i]).instantiate() - block.setId(GLOBAL.getNewId()) - block.setType(GLOBAL.BLOCKTYPES.LIGHT) - newBlocks.append(block) - newBlocks.shuffle() - newBlocks[0].setType(GLOBAL.BLOCKTYPES.HEAVY) - newBlocks.shuffle() - nextBlocks.append_array(newBlocks) - -## returns a Dictionary with the UIDs as the Key and a List of the Blocks as the content -func getBlockGroupsList(): - var blockLists : Dictionary = {} - for i in blocks.get_children(): - if not blockLists.has(i.UID): - blockLists[i.UID] = [] - blockLists[i.UID].append(i) - return blockLists - - -func getBlockedDirection(direction : GLOBAL.Direction, uid : int) -> bool: - #var blockslist = getBlockGroupsList() - var isBlocked = false - if getBlockGroupsList().has(uid): - for i in getBlockGroupsList()[uid]: - if i.getCollider(direction) != null: - if i.getCollider(direction).is_in_group("Block"): - if i.getCollider(direction).UID != i.UID: - isBlocked = true - else: - isBlocked = true - return isBlocked - return true - -func splitOphansUID(uid): - var compareList = {} - var group = [] - for i in getBlockGroupsList()[uid]: - compareList[i] = i.getNeighboursUID(uid) - if i.getNeighboursUID(uid) == []: - i.UID = GLOBAL.getNewUID() - - for i in compareList: - group.insert(0, compareList[i]) - group[0].append(i) - for j in group[0]: - if compareList[i].has(j) and not group[0].has(j): - group[0].append(j) - - for i in group: - var newUID = GLOBAL.getNewUID() - for j in i: - j.UID = newUID - -func moveUidGroup(direction, uid): - if getBlockGroupsList().has(uid): - match direction: - GLOBAL.Direction.BOTTOM: - for i in getBlockGroupsList()[uid]: - if not getBlockedDirection(GLOBAL.Direction.BOTTOM, i.UID): - i.moveDown() - GLOBAL.Direction.LEFT: - for i in getBlockGroupsList()[uid]: - if not getBlockedDirection(GLOBAL.Direction.LEFT, i.UID): - i.moveLeft() - GLOBAL.Direction.RIGHT: - for i in getBlockGroupsList()[uid]: - if not getBlockedDirection(GLOBAL.Direction.RIGHT, i.UID): - i.moveRight() - -func PlacePattern(): - patternsArray.pop_at(0) - for child in patterns.get_children(): - child.queue_free() - if patternsArray.size() <= 2: - getNewPatterns() - currentPattern = patternsArray[0] - patterns.add_child(currentPattern) - var newUID = GLOBAL.getNewUID() - GLOBAL.currentUID = newUID - var newColor = Color.from_hsv((randi() % 12) / 12.0, 1, 1) - for i in patterns.get_children(): - i.reset(Vector2()) - if currentPattern != null: - for i in currentPattern.getPositions(): - var block = load("res://scenes/Blocks/block.tscn").instantiate() - block.UID = newUID - block.modulate = newColor - block.position = spawnpoint.position + i.position - block.type = currentPattern.type - block.expand = currentPattern.expand - if i.turningPoint: - block.turningPoint = true - blocks.add_child(block) - block.setlook() - - -func getNewPatterns(): - var newPatterns = [] - for i in GLOBAL.BLOCKSPATTERS: - newPatterns.append(load(GLOBAL.BLOCKSPATTERS[i]).instantiate()) - newPatterns.shuffle() - newPatterns[0].type = GLOBAL.BLOCKTYPES.HEAVY - newPatterns.shuffle() - newPatterns[0].expand = true - #for i in newPatterns: - #i.expand = true - newPatterns.shuffle() - patternsArray.append_array(newPatterns) - -func turnBlocks(): - var turningPointBlock - for g in currentPattern.getPositions().size(): - if not getBlockGroupsList()[GLOBAL.currentUID][g].turningPoint: - getBlockGroupsList()[GLOBAL.currentUID][g].global_position = currentPattern.getPositions()[g].global_position- Vector2(32,32) - else: - turningPointBlock = getBlockGroupsList()[GLOBAL.currentUID][g] - for g in currentPattern.getPositions(): - if g.turningPoint: - turningPointBlock.global_position = g.global_position- Vector2(32,32) - -func _on_turn_tick_timeout() -> void: - turnBlocks() - -func _on_ticker_timeout() -> void: - - if getBlockedDirection(GLOBAL.Direction.BOTTOM, GLOBAL.currentUID): - - stopped = true - test() - - - for i in getBlockGroupsList(): - moveUidGroup(GLOBAL.Direction.BOTTOM, i) - - if not stopped: - tickerTimer.start(blockSpeed) - stopped = false - elif stopped: - if loseArea.get_overlapping_areas() != []: - GLOBAL.lose() - tickerTimer.start(GLOBAL.minSpeed) - stopped = false - - func _on_game_timer_timeout() -> void: match GLOBAL.currentMode: @@ -239,65 +58,31 @@ func _on_game_timer_timeout() -> void: gameTimer.start(1) - -func test(): - for i in $RowTests.get_children(): - for j in getBlockGroupsList(): - if j != GLOBAL.currentUID: - moveUidGroup(GLOBAL.Direction.BOTTOM, i) - stopped = true - var previousPosition = currentPattern.position - if currentPattern.expand: - if currentPattern.get_scale() != Vector2(2,2): - - #currentPattern.position.y -= 64 - for i in getBlockGroupsList()[GLOBAL.currentUID]: - if i.turningPoint: - currentPattern.set_scale(Vector2(2,2)) - currentPattern.moveToPosition(i.global_position-spawnpoint.position) - - - for j in await currentPattern.getCollidingBorder(): - if j.is_in_group("Floor"): - currentPattern.position.y -= GLOBAL.GRID - if await currentPattern.getCollidingBorder() == []: - break - if j.is_in_group("LeftBorder"): - for s in range(1,7): - currentPattern.position.x += GLOBAL.GRID - if await currentPattern.getCollidingBorder() == []: - break - elif j.is_in_group("RightBorder"): - for s in range(1,7): - currentPattern.position.x -= GLOBAL.GRID - if await currentPattern.getCollidingBorder() == []: - break - - if await currentPattern.getCollidingBorder() == []: - for i in getBlockGroupsList()[GLOBAL.currentUID].size(): - getBlockGroupsList()[GLOBAL.currentUID][i].global_position = currentPattern.getPositions()[i].global_position - Vector2(GLOBAL.GRID, GLOBAL.GRID) - getBlockGroupsList()[GLOBAL.currentUID][i].set_scale(Vector2(2,2)) - for i in await currentPattern.getCollidingBlocks(): - i.queue_free() - - testRows() - PlacePattern() - -func testRows(): - for i in $RowTests.get_children(): - if i.isCompleted(): - for j in i.getRow(): - splitOphansUID(j.UID) - if j.expand: - GLOBAL.points += j.type * 2 - GLOBAL.time += j.type - elif not j.expand: - GLOBAL.points += j.type - GLOBAL.time += j.type - j.queue_free() - for j in getBlockGroupsList(): - if j != GLOBAL.currentUID: - moveUidGroup(GLOBAL.Direction.BOTTOM, j) - func toggleButton(): $Camera2D/CanvasLayer/Control.toggleButton() + +func fillNextBlocks(): + var newBlocks = [] + for i in GLOBAL.BLOCKS: + newBlocks.append(load(GLOBAL.BLOCKS[i]).instantiate()) + + newBlocks.shuffle() + newBlocks[0].expand = true + newBlocks.shuffle() + newBlocks[0].type = GLOBAL.BLOCKTYPES.HEAVY + newBlocks.shuffle() + nextBlocks.append_array(newBlocks) + +func spawnBlock(): + GLOBAL.speedUp() + var newBlock = nextBlocks[0] + nextBlocks.pop_at(0) + if nextBlocks == []: + fillNextBlocks() + blockContainer.add_child(newBlock) + newBlock.init(spawnpoint.global_position) + newBlock.setNewID() + + +func _on_test_timer_timeout() -> void: + GLOBAL.rowRemoved = false diff --git a/scenes/Grid/grid.tscn b/scenes/Grid/grid.tscn index ee04933..b48e4b3 100644 --- a/scenes/Grid/grid.tscn +++ b/scenes/Grid/grid.tscn @@ -1,11 +1,8 @@ -[gd_scene load_steps=21 format=3 uid="uid://dwl4lotl1d3ij"] +[gd_scene load_steps=15 format=3 uid="uid://dwl4lotl1d3ij"] [ext_resource type="Script" path="res://scenes/Grid/grid.gd" id="1_vie5m"] [ext_resource type="Texture2D" uid="uid://cj6fsj1ac11a1" path="res://assets/background.png" id="2_vakrw"] [ext_resource type="PackedScene" uid="uid://bm7rshwf6pjb" path="res://scenes/Grid/border.tscn" id="4_3j08q"] -[ext_resource type="PackedScene" uid="uid://duubii5uu3lgq" path="res://scenes/Grid/row_test.tscn" id="4_si3v6"] -[ext_resource type="PackedScene" uid="uid://dvrotjxom4u6d" path="res://scenes/Grid/bottom.tscn" id="5_14njh"] -[ext_resource type="PackedScene" uid="uid://d2m5xvw4ucwfw" path="res://scenes/Grid/lose_area.tscn" id="5_u5wlg"] [ext_resource type="Script" path="res://scenes/Grid/camera_2d.gd" id="6_mbeib"] [ext_resource type="Theme" uid="uid://1nebbd65iyce" path="res://Theme/main.tres" id="7_38u5s"] [ext_resource type="Script" path="res://scenes/Main/control.gd" id="8_4bfjb"] @@ -15,28 +12,12 @@ [ext_resource type="Texture2D" uid="uid://ct4dkk00pyv6v" path="res://assets/Buttons/RotationLeft.png" id="12_qk3ju"] [ext_resource type="Texture2D" uid="uid://5gbnb7gtwww3" path="res://assets/Buttons/RotationRight.png" id="13_kls78"] [ext_resource type="Texture2D" uid="uid://cevua7g7nsrfj" path="res://assets/Buttons/DownArrow.png" id="14_i1yud"] +[ext_resource type="PackedScene" uid="uid://ibyhtfpc52vc" path="res://scenes/Grid/row_test.tscn" id="14_ogg0j"] [ext_resource type="AudioStream" uid="uid://tf3d2uu84gf1" path="res://assets/Audio/Background.wav" id="16_ng6e7"] -[sub_resource type="QuadMesh" id="QuadMesh_qfjsc"] - -[sub_resource type="RectangleShape2D" id="RectangleShape2D_flipi"] -size = Vector2(128, 1536) - -[sub_resource type="RectangleShape2D" id="RectangleShape2D_rxd0s"] -size = Vector2(896, 128) - -[sub_resource type="RectangleShape2D" id="RectangleShape2D_m21a1"] -size = Vector2(640, 256) - [node name="Grid" type="Node2D"] script = ExtResource("1_vie5m") -[node name="MeshInstance2D" type="MeshInstance2D" parent="."] -modulate = Color(0.359096, 0.426588, 0.599397, 1) -position = Vector2(320, 640) -scale = Vector2(640, 1280) -mesh = SubResource("QuadMesh_qfjsc") - [node name="TextureRect" type="TextureRect" parent="."] offset_right = 640.0 offset_bottom = 1280.0 @@ -46,106 +27,7 @@ stretch_mode = 1 [node name="Blocks" type="Node2D" parent="."] [node name="Spawnpoint" type="Marker2D" parent="."] -position = Vector2(256, -128) - -[node name="RowTests" type="Node2D" parent="."] - -[node name="rowTest" parent="RowTests" instance=ExtResource("4_si3v6")] -position = Vector2(0, 1248) - -[node name="rowTest2" parent="RowTests" instance=ExtResource("4_si3v6")] -position = Vector2(0, 1184) - -[node name="rowTest3" parent="RowTests" instance=ExtResource("4_si3v6")] -position = Vector2(0, 1120) - -[node name="rowTest4" parent="RowTests" instance=ExtResource("4_si3v6")] -position = Vector2(0, 1056) - -[node name="rowTest5" parent="RowTests" instance=ExtResource("4_si3v6")] -position = Vector2(0, 992) - -[node name="rowTest6" parent="RowTests" instance=ExtResource("4_si3v6")] -position = Vector2(0, 928) - -[node name="rowTest7" parent="RowTests" instance=ExtResource("4_si3v6")] -position = Vector2(0, 864) - -[node name="rowTest8" parent="RowTests" instance=ExtResource("4_si3v6")] -position = Vector2(0, 800) - -[node name="rowTest9" parent="RowTests" instance=ExtResource("4_si3v6")] -position = Vector2(0, 736) - -[node name="rowTest10" parent="RowTests" instance=ExtResource("4_si3v6")] -position = Vector2(0, 672) - -[node name="rowTest11" parent="RowTests" instance=ExtResource("4_si3v6")] -position = Vector2(0, 608) - -[node name="rowTest12" parent="RowTests" instance=ExtResource("4_si3v6")] -position = Vector2(0, 544) - -[node name="rowTest13" parent="RowTests" instance=ExtResource("4_si3v6")] -position = Vector2(0, 480) - -[node name="rowTest14" parent="RowTests" instance=ExtResource("4_si3v6")] -position = Vector2(0, 416) - -[node name="rowTest15" parent="RowTests" instance=ExtResource("4_si3v6")] -position = Vector2(0, 352) - -[node name="rowTest16" parent="RowTests" instance=ExtResource("4_si3v6")] -position = Vector2(0, 288) - -[node name="rowTest17" parent="RowTests" instance=ExtResource("4_si3v6")] -position = Vector2(0, 224) - -[node name="rowTest18" parent="RowTests" instance=ExtResource("4_si3v6")] -position = Vector2(0, 160) - -[node name="rowTest19" parent="RowTests" instance=ExtResource("4_si3v6")] -position = Vector2(0, 96) - -[node name="rowTest20" parent="RowTests" instance=ExtResource("4_si3v6")] -position = Vector2(0, 32) - -[node name="Ticker" type="Timer" parent="."] - -[node name="Patterns" type="Node2D" parent="."] -position = Vector2(256, -128) - -[node name="TurnTick" type="Timer" parent="."] -wait_time = 0.1 -one_shot = true - -[node name="Borders" type="Node2D" parent="."] - -[node name="Border" parent="Borders" groups=["LeftBorder"] instance=ExtResource("4_3j08q")] - -[node name="CollisionShape2D" parent="Borders/Border" index="0" groups=["LeftBorder"]] -position = Vector2(-64, 512) -shape = SubResource("RectangleShape2D_flipi") - -[node name="Border2" parent="Borders" groups=["RightBorder"] instance=ExtResource("4_3j08q")] - -[node name="CollisionShape2D" parent="Borders/Border2" index="0" groups=["RightBorder"]] -position = Vector2(704, 512) -shape = SubResource("RectangleShape2D_flipi") - -[node name="Bottom" parent="." groups=["Floor"] instance=ExtResource("5_14njh")] -position = Vector2(320, 1312) -collision_mask = 2 - -[node name="CollisionShape2D" parent="Bottom" index="0"] -position = Vector2(0, 32) -shape = SubResource("RectangleShape2D_rxd0s") - -[node name="LoseArea" parent="." instance=ExtResource("5_u5wlg")] - -[node name="CollisionShape2D" type="CollisionShape2D" parent="LoseArea"] -position = Vector2(320, -128) -shape = SubResource("RectangleShape2D_m21a1") +position = Vector2(288, -96) [node name="GameTimer" type="Timer" parent="."] @@ -282,17 +164,87 @@ action_mode = 0 icon = ExtResource("14_i1yud") icon_alignment = 1 -[node name="Background" type="Sprite2D" parent="."] -position = Vector2(320, 640) -scale = Vector2(10, 20) - [node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."] stream = ExtResource("16_ng6e7") volume_db = 3.0 -autoplay = true -[connection signal="timeout" from="Ticker" to="." method="_on_ticker_timeout"] -[connection signal="timeout" from="TurnTick" to="." method="_on_turn_tick_timeout"] +[node name="Borders" type="Node2D" parent="."] + +[node name="Border" parent="Borders" instance=ExtResource("4_3j08q")] + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Borders/Border"] +polygon = PackedVector2Array(0, -64, 0, 1280, 640, 1280, 640, -64, 1088, -64, 1088, 1536, -448, 1536, -448, -64) + +[node name="RayCast2D" type="RayCast2D" parent="Borders"] +position = Vector2(32, -32) +target_position = Vector2(576, 0) +collision_mask = 2 +hit_from_inside = true + +[node name="Rows" type="Node2D" parent="."] + +[node name="RowTest" parent="Rows" instance=ExtResource("14_ogg0j")] +position = Vector2(0, 1216) + +[node name="RowTest2" parent="Rows" instance=ExtResource("14_ogg0j")] +position = Vector2(0, 1152) + +[node name="RowTest3" parent="Rows" instance=ExtResource("14_ogg0j")] +position = Vector2(0, 1088) + +[node name="RowTest4" parent="Rows" instance=ExtResource("14_ogg0j")] +position = Vector2(0, 1024) + +[node name="RowTest5" parent="Rows" instance=ExtResource("14_ogg0j")] +position = Vector2(0, 960) + +[node name="RowTest6" parent="Rows" instance=ExtResource("14_ogg0j")] +position = Vector2(0, 896) + +[node name="RowTest7" parent="Rows" instance=ExtResource("14_ogg0j")] +position = Vector2(0, 832) + +[node name="RowTest8" parent="Rows" instance=ExtResource("14_ogg0j")] +position = Vector2(0, 768) + +[node name="RowTest9" parent="Rows" instance=ExtResource("14_ogg0j")] +position = Vector2(0, 704) + +[node name="RowTest10" parent="Rows" instance=ExtResource("14_ogg0j")] +position = Vector2(0, 640) + +[node name="RowTest11" parent="Rows" instance=ExtResource("14_ogg0j")] +position = Vector2(0, 576) + +[node name="RowTest12" parent="Rows" instance=ExtResource("14_ogg0j")] +position = Vector2(0, 512) + +[node name="RowTest13" parent="Rows" instance=ExtResource("14_ogg0j")] +position = Vector2(0, 448) + +[node name="RowTest14" parent="Rows" instance=ExtResource("14_ogg0j")] +position = Vector2(0, 384) + +[node name="RowTest15" parent="Rows" instance=ExtResource("14_ogg0j")] +position = Vector2(0, 320) + +[node name="RowTest16" parent="Rows" instance=ExtResource("14_ogg0j")] +position = Vector2(0, 256) + +[node name="RowTest17" parent="Rows" instance=ExtResource("14_ogg0j")] +position = Vector2(0, 192) + +[node name="RowTest18" parent="Rows" instance=ExtResource("14_ogg0j")] +position = Vector2(0, 128) + +[node name="RowTest19" parent="Rows" instance=ExtResource("14_ogg0j")] +position = Vector2(0, 64) + +[node name="RowTest20" parent="Rows" instance=ExtResource("14_ogg0j")] + +[node name="TestTimer" type="Timer" parent="."] +one_shot = true + [connection signal="timeout" from="GameTimer" to="." method="_on_game_timer_timeout"] [connection signal="pressed" from="Camera2D/CanvasLayer/Control/HBoxContainer3/left_Button" to="Camera2D/CanvasLayer/Control" method="_on_left_button_pressed"] [connection signal="pressed" from="Camera2D/CanvasLayer/Control/HBoxContainer3/right_Button" to="Camera2D/CanvasLayer/Control" method="_on_right_button_pressed"] @@ -300,7 +252,4 @@ autoplay = true [connection signal="pressed" from="Camera2D/CanvasLayer/Control/HBoxContainer4/rotate_right_Button" to="Camera2D/CanvasLayer/Control" method="_on_rotate_right_button_pressed"] [connection signal="button_down" from="Camera2D/CanvasLayer/Control/HBoxContainer5/down_Button" to="Camera2D/CanvasLayer/Control" method="_on_down_button_button_down"] [connection signal="button_up" from="Camera2D/CanvasLayer/Control/HBoxContainer5/down_Button" to="Camera2D/CanvasLayer/Control" method="_on_down_button_button_up"] - -[editable path="Borders/Border"] -[editable path="Borders/Border2"] -[editable path="Bottom"] +[connection signal="timeout" from="TestTimer" to="." method="_on_test_timer_timeout"] diff --git a/scenes/Grid/lose_area.tscn b/scenes/Grid/lose_area.tscn deleted file mode 100644 index c249bd4..0000000 --- a/scenes/Grid/lose_area.tscn +++ /dev/null @@ -1,5 +0,0 @@ -[gd_scene format=3 uid="uid://d2m5xvw4ucwfw"] - -[node name="LoseArea" type="Area2D"] -collision_layer = 64 -collision_mask = 2 diff --git a/scenes/Grid/row_test.gd b/scenes/Grid/row_test.gd index e6806ac..c1f1199 100644 --- a/scenes/Grid/row_test.gd +++ b/scenes/Grid/row_test.gd @@ -1,22 +1,33 @@ -extends Area2D +extends Node2D -#func _physics_process(delta: float) -> void: - #if get_overlapping_areas().size() == 10: - #for i in get_overlapping_areas(): - #GLOBAL.points += i.points - #i.queue_free()#get_parent().get_parent().split() +static var rowRemoved = false -func getRow(): - return get_overlapping_areas() +func isFull(): + var full = true + for i in get_children(): + i.force_raycast_update() + #print(i.get_collider()) + if not i.is_colliding(): + full = false + return full -func isCompleted(): - var amount = 0 - for i in get_overlapping_areas(): - if i.get_scale() == Vector2(2,2): - amount += 2 - else: - amount += 1 - if amount >= 10: - return true - else: - return false +func check(): + if not GLOBAL.rowRemoved: + rowRemoved = false + if isFull(): + GLOBAL.rowRemoved = true + var blocksSplit = [] + var removeBlock = [] + for i in get_children(): + i.force_raycast_update() + if i.get_collider() != null: + blocksSplit.append(i.get_collider().get_parent().get_parent()) + if GLOBAL.currentMode == GLOBAL.MODES.TIME: + GLOBAL.time += i.get_collider().get_parent().get_parent().type + if i.get_collider().get_parent().get_parent().expand: + GLOBAL.points += i.get_collider().get_parent().get_parent().type * 2 + else: + GLOBAL.points += i.get_collider().get_parent().get_parent().type + i.get_collider().free() + for j in blocksSplit: + j.splitParts() diff --git a/scenes/Grid/row_test.tscn b/scenes/Grid/row_test.tscn index 4bd7a13..598270f 100644 --- a/scenes/Grid/row_test.tscn +++ b/scenes/Grid/row_test.tscn @@ -1,15 +1,66 @@ -[gd_scene load_steps=3 format=3 uid="uid://duubii5uu3lgq"] +[gd_scene load_steps=2 format=3 uid="uid://ibyhtfpc52vc"] -[ext_resource type="Script" path="res://scenes/Grid/row_test.gd" id="1_a8m2k"] +[ext_resource type="Script" path="res://scenes/Grid/row_test.gd" id="1_2nxxe"] -[sub_resource type="RectangleShape2D" id="RectangleShape2D_rkqoc"] -size = Vector2(640, 20) +[node name="RowTest" type="Node2D"] +script = ExtResource("1_2nxxe") -[node name="rowTest" type="Area2D"] -collision_layer = 4 -collision_mask = 2 -script = ExtResource("1_a8m2k") +[node name="RayCast2D" type="RayCast2D" parent="."] +position = Vector2(32, 24) +target_position = Vector2(0, 16) +collision_mask = 24 +hit_from_inside = true -[node name="CollisionShape2D" type="CollisionShape2D" parent="."] -position = Vector2(320, 0) -shape = SubResource("RectangleShape2D_rkqoc") +[node name="RayCast2D2" type="RayCast2D" parent="."] +position = Vector2(96, 24) +target_position = Vector2(0, 16) +collision_mask = 24 +hit_from_inside = true + +[node name="RayCast2D3" type="RayCast2D" parent="."] +position = Vector2(160, 24) +target_position = Vector2(0, 16) +collision_mask = 24 +hit_from_inside = true + +[node name="RayCast2D4" type="RayCast2D" parent="."] +position = Vector2(224, 24) +target_position = Vector2(0, 16) +collision_mask = 24 +hit_from_inside = true + +[node name="RayCast2D5" type="RayCast2D" parent="."] +position = Vector2(288, 24) +target_position = Vector2(0, 16) +collision_mask = 24 +hit_from_inside = true + +[node name="RayCast2D6" type="RayCast2D" parent="."] +position = Vector2(352, 24) +target_position = Vector2(0, 16) +collision_mask = 24 +hit_from_inside = true + +[node name="RayCast2D7" type="RayCast2D" parent="."] +position = Vector2(416, 24) +target_position = Vector2(0, 16) +collision_mask = 24 +hit_from_inside = true + +[node name="RayCast2D8" type="RayCast2D" parent="."] +position = Vector2(480, 24) +target_position = Vector2(0, 16) +collision_mask = 24 +hit_from_inside = true + +[node name="RayCast2D9" type="RayCast2D" parent="."] +position = Vector2(544, 24) +target_position = Vector2(0, 16) +collision_mask = 24 +hit_from_inside = true + +[node name="RayCast2D10" type="RayCast2D" parent="."] +position = Vector2(608, 24) +target_position = Vector2(0, 16) +collision_mask = 24 +hit_from_inside = true diff --git a/scenes/Grid/speed_scale.gd b/scenes/Grid/speed_scale.gd deleted file mode 100644 index 0c80ced..0000000 --- a/scenes/Grid/speed_scale.gd +++ /dev/null @@ -1,9 +0,0 @@ -extends Node2D - -@onready var slider = $Path2D/Slider - -func _physics_process(delta: float) -> void: - if not GLOBAL.hasSelectedSpeed: - if Input.is_action_just_pressed("stop"): - GLOBAL.hasSelectedSpeed = true - GLOBAL.currentSpeed = GLOBAL.SPEED.MAX diff --git a/scenes/Main/main.gd b/scenes/Main/main.gd index b7bfa88..8a4e2cf 100644 --- a/scenes/Main/main.gd +++ b/scenes/Main/main.gd @@ -20,27 +20,22 @@ func _physics_process(delta: float) -> void: fullscreen = false if scenes.get_children() != []: if GLOBAL.lost and scenes.get_child(0).name == "Grid": - scoreOverview() + loadScoreOverview() + GLOBAL.lost = false func loadGrid(): - if $scenes/ScoreOverview != null: - $scenes/ScoreOverview.queue_free() - if $scenes/StartMenu != null: - $scenes/StartMenu.queue_free() + for i in scenes.get_children(): + i.queue_free() scenes.add_child(load("res://scenes/Grid/grid.tscn").instantiate()) $scenes/Grid.toggleButton() $scenes/Grid.startGame() -func scoreOverview(): - if $scenes/Grid != null: - $scenes/Grid.queue_free() - if $scenes/StartMenu != null: - $scenes/StartMenu.queue_free() +func loadScoreOverview(): + for i in scenes.get_children(): + i.queue_free() scenes.add_child(load("res://scenes/ScoreOverview/score_overview.tscn").instantiate()) func loadStartMenu(): - if $scenes/ScoreOverview != null: - $scenes/ScoreOverview.queue_free() - if $scenes/Grid != null: - $scenes/Grid.queue_free() + for i in scenes.get_children(): + i.queue_free() scenes.add_child(load("res://scenes/Menu/start_menu.tscn").instantiate()) diff --git a/scenes/Main/main.tscn b/scenes/Main/main.tscn index 9706a19..ab12ee8 100644 --- a/scenes/Main/main.tscn +++ b/scenes/Main/main.tscn @@ -26,7 +26,7 @@ position = Vector2(3195.96, 14.0137) scale = Vector2(0.501878, 0.054741) amount = 50 lifetime = 5.0 -preprocess = 5.0 +preprocess = 20.0 speed_scale = 0.5 local_coords = true texture = ExtResource("2_5ae6b") @@ -47,7 +47,7 @@ position = Vector2(3195.96, 14.0137) scale = Vector2(0.501878, 0.054741) amount = 50 lifetime = 5.0 -preprocess = 5.0 +preprocess = 20.0 speed_scale = 0.5 local_coords = true texture = ExtResource("2_5ae6b") @@ -68,7 +68,7 @@ position = Vector2(3195.96, 14.0137) scale = Vector2(0.501878, 0.054741) amount = 50 lifetime = 5.0 -preprocess = 5.0 +preprocess = 20.0 speed_scale = 0.5 local_coords = true texture = ExtResource("2_5ae6b") @@ -89,7 +89,7 @@ position = Vector2(3195.96, 14.0137) scale = Vector2(0.501878, 0.054741) amount = 50 lifetime = 5.0 -preprocess = 5.0 +preprocess = 20.0 speed_scale = 0.5 local_coords = true texture = ExtResource("2_5ae6b") diff --git a/scenes/NewBlocks/1x1/1x1.tscn b/scenes/NewBlocks/1x1/1x1.tscn new file mode 100644 index 0000000..856e4ad --- /dev/null +++ b/scenes/NewBlocks/1x1/1x1.tscn @@ -0,0 +1,24 @@ +[gd_scene load_steps=2 format=3 uid="uid://bq06tih243hte"] + +[ext_resource type="PackedScene" uid="uid://cbjkurbgojqac" path="res://scenes/NewBlocks/block.tscn" id="1_wcbl2"] + +[node name="1x1" instance=ExtResource("1_wcbl2")] +modulate = Color(0.690196, 0, 1, 1) + +[node name="CollisionPolygon2D" parent="." index="0"] +position = Vector2(-8, -8) +polygon = PackedVector2Array(40, -24, 40, 40, -24, 40, -24, -24) + +[node name="Marker2D" type="Marker2D" parent="PartPoints" index="0"] + +[node name="CollisionRayContainer#RayCast2D" type="RayCast2D" parent="." index="4"] +position = Vector2(-16, -24) +target_position = Vector2(0, 48) +collision_mask = 3 +hit_from_inside = true + +[node name="CollisionRayContainer#RayCast2D2" type="RayCast2D" parent="." index="5"] +position = Vector2(16, -24) +target_position = Vector2(0, 48) +collision_mask = 3 +hit_from_inside = true diff --git a/scenes/NewBlocks/1x3/1x3.tscn b/scenes/NewBlocks/1x3/1x3.tscn new file mode 100644 index 0000000..9827559 --- /dev/null +++ b/scenes/NewBlocks/1x3/1x3.tscn @@ -0,0 +1,47 @@ +[gd_scene load_steps=2 format=3 uid="uid://def2bs6whjhkc"] + +[ext_resource type="PackedScene" uid="uid://cbjkurbgojqac" path="res://scenes/NewBlocks/block.tscn" id="1_r8yrj"] + +[node name="1x3" instance=ExtResource("1_r8yrj")] +modulate = Color(1, 1, 0, 1) + +[node name="CollisionPolygon2D" parent="." index="0"] +polygon = PackedVector2Array(-95, -31, -95, 31, 95, 31, 95, -31) + +[node name="Marker2D" type="Marker2D" parent="PartPoints" index="0"] +position = Vector2(-64, 0) + +[node name="Marker2D2" type="Marker2D" parent="PartPoints" index="1"] + +[node name="Marker2D3" type="Marker2D" parent="PartPoints" index="2"] +position = Vector2(64, 0) + +[node name="RayCast2D" type="RayCast2D" parent="." index="4"] +position = Vector2(-80, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D2" type="RayCast2D" parent="." index="5"] +position = Vector2(-48, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D3" type="RayCast2D" parent="." index="6"] +position = Vector2(-16, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D4" type="RayCast2D" parent="." index="7"] +position = Vector2(16, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D5" type="RayCast2D" parent="." index="8"] +position = Vector2(48, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D6" type="RayCast2D" parent="." index="9"] +position = Vector2(80, -24) +collision_mask = 3 +hit_from_inside = true diff --git a/scenes/NewBlocks/1x4/1x4.tscn b/scenes/NewBlocks/1x4/1x4.tscn new file mode 100644 index 0000000..065777d --- /dev/null +++ b/scenes/NewBlocks/1x4/1x4.tscn @@ -0,0 +1,62 @@ +[gd_scene load_steps=2 format=3 uid="uid://bev38s1mpx8ej"] + +[ext_resource type="PackedScene" uid="uid://cbjkurbgojqac" path="res://scenes/NewBlocks/block.tscn" id="1_sbl0g"] + +[node name="1x4" instance=ExtResource("1_sbl0g")] +modulate = Color(1, 0, 0, 1) +metadata/_edit_vertical_guides_ = [-168.0] + +[node name="CollisionPolygon2D" parent="." index="0"] +position = Vector2(32, 0) +polygon = PackedVector2Array(-127, -31, -127, 31, 127, 31, 127, -31) + +[node name="Marker2D" type="Marker2D" parent="PartPoints" index="0"] +position = Vector2(-64, 0) + +[node name="Marker2D2" type="Marker2D" parent="PartPoints" index="1"] + +[node name="Marker2D3" type="Marker2D" parent="PartPoints" index="2"] +position = Vector2(64, 0) + +[node name="Marker2D4" type="Marker2D" parent="PartPoints" index="3"] +position = Vector2(128, 0) + +[node name="RayCast2D" type="RayCast2D" parent="." index="4"] +position = Vector2(-80, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D3" type="RayCast2D" parent="." index="5"] +position = Vector2(-48, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D2" type="RayCast2D" parent="." index="6"] +position = Vector2(-16, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D4" type="RayCast2D" parent="." index="7"] +position = Vector2(16, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D5" type="RayCast2D" parent="." index="8"] +position = Vector2(48, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D6" type="RayCast2D" parent="." index="9"] +position = Vector2(80, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D7" type="RayCast2D" parent="." index="10"] +position = Vector2(112, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D8" type="RayCast2D" parent="." index="11"] +position = Vector2(144, -24) +collision_mask = 3 +hit_from_inside = true diff --git a/scenes/NewBlocks/2x2/2x2.tscn b/scenes/NewBlocks/2x2/2x2.tscn new file mode 100644 index 0000000..464ad70 --- /dev/null +++ b/scenes/NewBlocks/2x2/2x2.tscn @@ -0,0 +1,62 @@ +[gd_scene load_steps=2 format=3 uid="uid://c203pse4172mc"] + +[ext_resource type="PackedScene" uid="uid://cbjkurbgojqac" path="res://scenes/NewBlocks/block.tscn" id="1_wdx08"] + +[node name="2x2" instance=ExtResource("1_wdx08")] +modulate = Color(1, 0.627451, 0, 1) +offset = true + +[node name="CollisionPolygon2D" parent="." index="0"] +polygon = PackedVector2Array(63, 63, 63, -63, -63, -63, -63, 63) + +[node name="Marker2D" type="Marker2D" parent="PartPoints" index="0"] +position = Vector2(-32, -32) + +[node name="Marker2D2" type="Marker2D" parent="PartPoints" index="1"] +position = Vector2(32, -32) + +[node name="Marker2D3" type="Marker2D" parent="PartPoints" index="2"] +position = Vector2(-32, 32) + +[node name="Marker2D4" type="Marker2D" parent="PartPoints" index="3"] +position = Vector2(32, 32) + +[node name="RayCast2D" type="RayCast2D" parent="." index="4"] +position = Vector2(-48, -56) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D2" type="RayCast2D" parent="." index="5"] +position = Vector2(-16, -56) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D3" type="RayCast2D" parent="." index="6"] +position = Vector2(16, -56) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D4" type="RayCast2D" parent="." index="7"] +position = Vector2(48, -56) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D5" type="RayCast2D" parent="." index="8"] +position = Vector2(-48, 8) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D6" type="RayCast2D" parent="." index="9"] +position = Vector2(-16, 8) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D7" type="RayCast2D" parent="." index="10"] +position = Vector2(16, 8) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D8" type="RayCast2D" parent="." index="11"] +position = Vector2(48, 8) +collision_mask = 3 +hit_from_inside = true diff --git a/scenes/NewBlocks/L/L.tscn b/scenes/NewBlocks/L/L.tscn new file mode 100644 index 0000000..9320f6c --- /dev/null +++ b/scenes/NewBlocks/L/L.tscn @@ -0,0 +1,60 @@ +[gd_scene load_steps=2 format=3 uid="uid://d2orqrqnsxuec"] + +[ext_resource type="PackedScene" uid="uid://cbjkurbgojqac" path="res://scenes/NewBlocks/block.tscn" id="1_5vf0h"] + +[node name="L" instance=ExtResource("1_5vf0h")] +modulate = Color(0, 0, 1, 1) + +[node name="CollisionPolygon2D" parent="." index="0"] +polygon = PackedVector2Array(-95, -31, -95, 31, 95, 31, 95, -95, 33, -95, 33, -31) + +[node name="Marker2D" type="Marker2D" parent="PartPoints" index="0"] +position = Vector2(-64, 0) + +[node name="Marker2D2" type="Marker2D" parent="PartPoints" index="1"] + +[node name="Marker2D3" type="Marker2D" parent="PartPoints" index="2"] +position = Vector2(64, 0) + +[node name="Marker2D4" type="Marker2D" parent="PartPoints" index="3"] +position = Vector2(64, -64) + +[node name="RayCast2D" type="RayCast2D" parent="." index="6"] +position = Vector2(-80, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D2" type="RayCast2D" parent="." index="7"] +position = Vector2(-48, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D3" type="RayCast2D" parent="." index="8"] +position = Vector2(-16, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D4" type="RayCast2D" parent="." index="9"] +position = Vector2(16, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D5" type="RayCast2D" parent="." index="10"] +position = Vector2(48, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D6" type="RayCast2D" parent="." index="11"] +position = Vector2(80, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D7" type="RayCast2D" parent="." index="12"] +position = Vector2(48, -88) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D8" type="RayCast2D" parent="." index="13"] +position = Vector2(80, -88) +collision_mask = 3 +hit_from_inside = true diff --git a/scenes/NewBlocks/L_Reverse/L_Reverse.tscn b/scenes/NewBlocks/L_Reverse/L_Reverse.tscn new file mode 100644 index 0000000..d98d186 --- /dev/null +++ b/scenes/NewBlocks/L_Reverse/L_Reverse.tscn @@ -0,0 +1,60 @@ +[gd_scene load_steps=2 format=3 uid="uid://rcxcslbfovej"] + +[ext_resource type="PackedScene" uid="uid://cbjkurbgojqac" path="res://scenes/NewBlocks/block.tscn" id="1_05evo"] + +[node name="L_Reverse" instance=ExtResource("1_05evo")] +modulate = Color(0, 1, 0, 1) + +[node name="CollisionPolygon2D" parent="." index="0"] +polygon = PackedVector2Array(-95, -95, -95, 31, 95, 31, 95, -31, -33, -31, -33, -95) + +[node name="Marker2D" type="Marker2D" parent="PartPoints" index="0"] +position = Vector2(-64, -64) + +[node name="Marker2D2" type="Marker2D" parent="PartPoints" index="1"] +position = Vector2(-64, 0) + +[node name="Marker2D3" type="Marker2D" parent="PartPoints" index="2"] + +[node name="Marker2D4" type="Marker2D" parent="PartPoints" index="3"] +position = Vector2(64, 0) + +[node name="RayCast2D" type="RayCast2D" parent="." index="6"] +position = Vector2(-80, -88) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D2" type="RayCast2D" parent="." index="7"] +position = Vector2(-48, -88) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D3" type="RayCast2D" parent="." index="8"] +position = Vector2(-80, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D4" type="RayCast2D" parent="." index="9"] +position = Vector2(-48, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D5" type="RayCast2D" parent="." index="10"] +position = Vector2(-16, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D6" type="RayCast2D" parent="." index="11"] +position = Vector2(16, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D7" type="RayCast2D" parent="." index="12"] +position = Vector2(48, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D8" type="RayCast2D" parent="." index="13"] +position = Vector2(80, -24) +collision_mask = 3 +hit_from_inside = true diff --git a/scenes/NewBlocks/Z/Z.tscn b/scenes/NewBlocks/Z/Z.tscn new file mode 100644 index 0000000..a368e24 --- /dev/null +++ b/scenes/NewBlocks/Z/Z.tscn @@ -0,0 +1,60 @@ +[gd_scene load_steps=2 format=3 uid="uid://xpcbf85u5d65"] + +[ext_resource type="PackedScene" uid="uid://cbjkurbgojqac" path="res://scenes/NewBlocks/block.tscn" id="1_yvspj"] + +[node name="Z" instance=ExtResource("1_yvspj")] +modulate = Color(1, 0, 1, 1) + +[node name="CollisionPolygon2D" parent="." index="0"] +polygon = PackedVector2Array(-95, 31, 31, 31, 31, -33, 95, -33, 95, -95, -31, -95, -31, -31, -95, -31) + +[node name="Marker2D" type="Marker2D" parent="PartPoints" index="0"] +position = Vector2(-64, 0) + +[node name="Marker2D2" type="Marker2D" parent="PartPoints" index="1"] + +[node name="Marker2D3" type="Marker2D" parent="PartPoints" index="2"] +position = Vector2(0, -64) + +[node name="Marker2D4" type="Marker2D" parent="PartPoints" index="3"] +position = Vector2(64, -64) + +[node name="RayCast2D" type="RayCast2D" parent="." index="6"] +position = Vector2(-80, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D2" type="RayCast2D" parent="." index="7"] +position = Vector2(-48, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D3" type="RayCast2D" parent="." index="8"] +position = Vector2(-16, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D4" type="RayCast2D" parent="." index="9"] +position = Vector2(16, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D5" type="RayCast2D" parent="." index="10"] +position = Vector2(-16, -88) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D6" type="RayCast2D" parent="." index="11"] +position = Vector2(16, -88) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D7" type="RayCast2D" parent="." index="12"] +position = Vector2(48, -88) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D8" type="RayCast2D" parent="." index="13"] +position = Vector2(80, -88) +collision_mask = 3 +hit_from_inside = true diff --git a/scenes/NewBlocks/Z_Reverse/Z_Reverse.tscn b/scenes/NewBlocks/Z_Reverse/Z_Reverse.tscn new file mode 100644 index 0000000..a03cc99 --- /dev/null +++ b/scenes/NewBlocks/Z_Reverse/Z_Reverse.tscn @@ -0,0 +1,60 @@ +[gd_scene load_steps=2 format=3 uid="uid://bbf3thu7apoov"] + +[ext_resource type="PackedScene" uid="uid://cbjkurbgojqac" path="res://scenes/NewBlocks/block.tscn" id="1_bjj8c"] + +[node name="Z_Reverse" instance=ExtResource("1_bjj8c")] +modulate = Color(0, 1, 1, 1) + +[node name="CollisionPolygon2D" parent="." index="0"] +polygon = PackedVector2Array(-95, -95, -95, -33, -31, -33, -31, 31, 95, 31, 95, -31, 31, -31, 31, -95) + +[node name="Marker2D" type="Marker2D" parent="PartPoints" index="0"] +position = Vector2(-64, -64) + +[node name="Marker2D2" type="Marker2D" parent="PartPoints" index="1"] +position = Vector2(0, -64) + +[node name="Marker2D3" type="Marker2D" parent="PartPoints" index="2"] + +[node name="Marker2D4" type="Marker2D" parent="PartPoints" index="3"] +position = Vector2(64, 0) + +[node name="RayCast2D" type="RayCast2D" parent="." index="6"] +position = Vector2(-80, -88) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D2" type="RayCast2D" parent="." index="7"] +position = Vector2(-48, -88) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D3" type="RayCast2D" parent="." index="8"] +position = Vector2(-16, -88) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D4" type="RayCast2D" parent="." index="9"] +position = Vector2(16, -88) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D5" type="RayCast2D" parent="." index="10"] +position = Vector2(-16, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D6" type="RayCast2D" parent="." index="11"] +position = Vector2(16, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D7" type="RayCast2D" parent="." index="12"] +position = Vector2(48, -24) +collision_mask = 3 +hit_from_inside = true + +[node name="RayCast2D8" type="RayCast2D" parent="." index="13"] +position = Vector2(80, -24) +collision_mask = 3 +hit_from_inside = true diff --git a/scenes/NewBlocks/block.gd b/scenes/NewBlocks/block.gd new file mode 100644 index 0000000..5e5979d --- /dev/null +++ b/scenes/NewBlocks/block.gd @@ -0,0 +1,238 @@ +extends CharacterBody2D + +@onready var partPoints = $PartPoints +@onready var partsContainer = $PartsContainer +@onready var coyoteTimer = $CoyoteTimer + + +var part = "res://scenes/NewBlocks/part.tscn" +var block1x1 = "res://scenes/NewBlocks/1x1/1x1.tscn" + + +var coyoteTime = 0.5 + +var type = GLOBAL.BLOCKTYPES.LIGHT +var expand = false + +@export var id = 0 + +var expanding = false + +var stopped = false + +@export var offset = false + +func _physics_process(delta: float) -> void: + if isCurrent() and not GLOBAL.blockStopped and not stopped: + if isBottomColliding(): + if coyoteTimer.is_stopped(): + coyoteTimer.start(coyoteTime) + if Input.is_action_just_pressed("rotate_left"): + rotateBlock(1) + elif Input.is_action_just_pressed("rotate_right"): + rotateBlock(2) + if Input.is_action_just_pressed("left"): + + if not isLeftColliding(): + global_position.x -= GLOBAL.GRID + elif Input.is_action_just_pressed("right"): + if not isRightColliding(): + global_position.x += GLOBAL.GRID + if Input.is_action_pressed("down"): + velocity = get_gravity() * delta * GLOBAL.SPEED.MAX + else: + velocity = get_gravity() * delta * GLOBAL.currentSpeed + + + if is_on_floor(): + position = position.snapped(Vector2(32,32)) + + if isCurrent() and not expanding and not GLOBAL.blockStopped: + move_and_slide() + else: + velocity = Vector2.ZERO + +func expandBlocks(): + expanding = true + scale = Vector2(2,2) + position -= Vector2(32,32) + snapPosition() + for i in range(0,5): + if isCollidingBorder(): + if isCollidingBorder(): + position.x += GLOBAL.GRID + if isCollidingBorder(): + position.x += GLOBAL.GRID + if isCollidingBorder(): + position.x -= GLOBAL.GRID + if isCollidingBorder(): + position.x -= GLOBAL.GRID + if isCollidingBorder(): + position.x -= GLOBAL.GRID + if isCollidingBorder(): + position.x -= GLOBAL.GRID + if isCollidingBorder(): + position.x += GLOBAL.GRID + if isCollidingBorder(): + position.x += GLOBAL.GRID + if isCollidingBorder(): + position.y -= GLOBAL.GRID + + for i in partsContainer.get_children(): + if i != null: + i.removeOverlapp() + #splitParts() + +func addParts(): + for i in partPoints.get_children(): + var newPart = load(part).instantiate() + partsContainer.add_child(newPart) + var look = 0 + if not expand and type == GLOBAL.BLOCKTYPES.HEAVY: + look = 1 + elif expand and not type == GLOBAL.BLOCKTYPES.HEAVY: + look = 2 + elif expand and type == GLOBAL.BLOCKTYPES.HEAVY: + look = 3 + newPart.init(i.position,look) + +func splitParts(): + for i in $PartsContainer.get_children(): + var newBlock = load(block1x1).instantiate() + get_parent().add_child(newBlock) + newBlock.init(i.global_position, expand) + newBlock.setColor(modulate) + queue_free() + +func setColor(color): + modulate = color + +func init(pos, scaler=null): + + if scaler != null: + if scaler: + expand = scaler + #$AnimationPlayer.play("Expand") + scale = Vector2(2,2) + addParts() + id = GLOBAL.getNewID() + GLOBAL.currentID = id + snapPosition() + global_position = pos + if offset: + snapPosition() + +func setNewID(): + id = GLOBAL.getNewID() + +func isCurrent(): + return GLOBAL.currentID == id + +func snapPosition(): #x :bool, y: bool + position = position.snapped(Vector2(64,64)) + +func rotateBlock(direction): + match direction: + 1: + rotation_degrees -= 90 + for i in partsContainer.get_children(): + i.rotation_degrees += 90 + for j in range(0,3): + if isColliding(): + global_position.x -= GLOBAL.GRID + if isColliding(): + global_position.x += GLOBAL.GRID*2 + if isColliding(): + global_position.x -= GLOBAL.GRID + for s in range(0,3): + rotation_degrees -= 90 + for i in partsContainer.get_children(): + i.rotation_degrees += 90 + else: + break + else: + break + else: + break + 2: + rotation_degrees += 90 + for i in partsContainer.get_children(): + i.rotation_degrees -= 90 + for j in range(0,3): + if isColliding(): + global_position.x -= GLOBAL.GRID + if isColliding(): + global_position.x += GLOBAL.GRID*2 + if isColliding(): + global_position.x -= GLOBAL.GRID + for s in range(0,3): + rotation_degrees += 90 + for i in partsContainer.get_children(): + i.rotation_degrees -= 90 + else: + break + else: + break + else: + break + +func isLeftColliding(): + var colliding = false + for i in partsContainer.get_children(): + if i.isLeftColliding(): + colliding = true + return colliding + +func isRightColliding(): + var colliding = false + for i in partsContainer.get_children(): + if i.isRightColliding(): + colliding = true + return colliding + +func isBottomColliding(): + var colliding = false + for i in partsContainer.get_children(): + if i.isBottomColliding(): + colliding = true + return colliding + +func isColliding() -> bool: + var collided = false + for i in get_children(): + if is_instance_of(i,RayCast2D): + i.force_raycast_update() + var collider = i.get_collider() + if collider != null: + if collider.is_in_group("Block"): + if collider.id != GLOBAL.currentID: + collided = true + elif collider.is_in_group("Border"): + collided = true + return collided + + +func isCollidingBorder() -> bool: + var collided = false + for i in get_children(): + if is_instance_of(i,RayCast2D): + i.force_raycast_update() + var collider = i.get_collider() + if collider != null: + if collider.is_in_group("Border"): + collided = true + return collided + +func _on_animation_player_animation_finished(anim_name: StringName) -> void: + if anim_name == "Expand": + snapPosition() + #position -= Vector2(32,32) + splitParts() + + +func _on_coyote_timer_timeout() -> void: + if isBottomColliding(): + stopped = true + GLOBAL.blockStopped = true + if expand: + expandBlocks() diff --git a/scenes/NewBlocks/block.tscn b/scenes/NewBlocks/block.tscn new file mode 100644 index 0000000..8810040 --- /dev/null +++ b/scenes/NewBlocks/block.tscn @@ -0,0 +1,64 @@ +[gd_scene load_steps=5 format=3 uid="uid://cbjkurbgojqac"] + +[ext_resource type="Script" path="res://scenes/NewBlocks/block.gd" id="1_booro"] + +[sub_resource type="Animation" id="Animation_1j0va"] +resource_name = "Expand" +length = 0.5 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:scale") +tracks/0/interp = 2 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(2, 2)] +} + +[sub_resource type="Animation" id="Animation_8wn5l"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:scale") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_u3jpa"] +_data = { +"Expand": SubResource("Animation_1j0va"), +"RESET": SubResource("Animation_8wn5l") +} + +[node name="Block" type="CharacterBody2D" groups=["Block"]] +collision_layer = 2 +collision_mask = 3 +script = ExtResource("1_booro") + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."] + +[node name="PartPoints" type="Node2D" parent="."] + +[node name="RotationPoint" type="Marker2D" parent="."] + +[node name="PartsContainer" type="Node2D" parent="."] + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_u3jpa") +} + +[node name="CoyoteTimer" type="Timer" parent="."] +one_shot = true + +[connection signal="animation_finished" from="AnimationPlayer" to="." method="_on_animation_player_animation_finished"] +[connection signal="timeout" from="CoyoteTimer" to="." method="_on_coyote_timer_timeout"] diff --git a/scenes/NewBlocks/part.gd b/scenes/NewBlocks/part.gd new file mode 100644 index 0000000..44191b7 --- /dev/null +++ b/scenes/NewBlocks/part.gd @@ -0,0 +1,108 @@ +extends Node2D + +@onready var spriteBlock = $Sprites/Block +@onready var spriteSpecialBlock = $Sprites/SpecialBlock +@onready var spriteExpandBlock = $Sprites/ExpandBlock +@onready var spriteSpecialExpandedBlock = $Sprites/SpecialExpandedBlock + +@onready var rayTop = $Raycasts/RayTop +@onready var rayRight = $Raycasts/RayRight +@onready var rayBottom = $Raycasts/RayBottom +@onready var rayLeft = $Raycasts/RayLeft + +#func _physics_process(delta: float) -> void: + ##if GLOBAL.blockStopped and not GLOBAL.rowRemoved: + #if GLOBAL.currentID != get_parent().get_parent().id: + #removeOverlapp() + +func isOverlapping() -> bool: + var collided = false + for i in get_children(): + if is_instance_of(i,RayCast2D): + i.force_raycast_update() + var collider = i.get_collider() + if collider != null: + collided = true + return collided + +func removeOverlapp(): + var blocksSplit = [] + for i in get_children(): + if is_instance_of(i,RayCast2D): + i.force_raycast_update() + var collider = i.get_collider() + if collider != null and collider.get_parent().get_parent().id != GLOBAL.currentID: + blocksSplit.append(i.get_collider().get_parent().get_parent()) + collider.free() + for j in blocksSplit: + j.splitParts() + +func init(pos, look=0): + position = pos + match look: + 0: + spriteBlock.show() + 1: + spriteSpecialBlock.show() + 2: + spriteExpandBlock.show() + 3: + spriteSpecialExpandedBlock.show() + + +func isTopColliding(): + rayTop.force_raycast_update() + if rayTop.get_collider() == null: + return false + + elif rayTop.get_collider().is_in_group("Block"): + if rayTop.get_collider().id == GLOBAL.currentID: + return false + else: + return true + else: + return true + +func isRightColliding(): + rayRight.force_raycast_update() + #print(rayRight.get_collider()) + if rayRight.get_collider() == null: + return false + elif rayRight.get_collider().is_in_group("Block"): + #print(rayRight.get_collider().id) + + if rayRight.get_collider().id == GLOBAL.currentID: + return false + else: + return true + else: + return true + +func isBottomColliding(): + rayBottom.force_raycast_update() + if rayBottom.get_collider() == null: + return false + + elif rayBottom.get_collider().is_in_group("Block"): + if rayBottom.get_collider().id == GLOBAL.currentID: + return false + else: + return true + else: + return true + +func isLeftColliding(): + + rayLeft.force_raycast_update() + #print(rayLeft.get_collider()) + if rayLeft.get_collider() == null: + return false + + elif rayLeft.get_collider().is_in_group("Block"): + #print(rayLeft.get_collider().id) + if rayLeft.get_collider().id == GLOBAL.currentID: + return false + else: + return true + else: + return true diff --git a/scenes/NewBlocks/part.tscn b/scenes/NewBlocks/part.tscn new file mode 100644 index 0000000..8c38e46 --- /dev/null +++ b/scenes/NewBlocks/part.tscn @@ -0,0 +1,86 @@ +[gd_scene load_steps=7 format=3 uid="uid://dj8heengghud2"] + +[ext_resource type="Script" path="res://scenes/NewBlocks/part.gd" id="1_hlmu7"] +[ext_resource type="Texture2D" uid="uid://cbuxv7iwn0qm7" path="res://assets/Blocks/Block.png" id="1_m2ybm"] +[ext_resource type="Texture2D" uid="uid://dni2qahrw2p0k" path="res://assets/Blocks/SpecialBlock.png" id="2_jv3te"] +[ext_resource type="Texture2D" uid="uid://jmobplsqdy6o" path="res://assets/Blocks/ExpandBlock.png" id="3_yu63x"] +[ext_resource type="Texture2D" uid="uid://13wfksnp806p" path="res://assets/Blocks/SpecialExpandedBlock.png" id="4_yg0r6"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_ix7xn"] +size = Vector2(48, 48) + +[node name="Part" type="StaticBody2D"] +collision_layer = 24 +collision_mask = 24 +script = ExtResource("1_hlmu7") + +[node name="Overlap Test" type="RayCast2D" parent="."] +position = Vector2(-16, -16) +target_position = Vector2(8, 0) +collision_mask = 24 +hit_from_inside = true + +[node name="Overlap Test2" type="RayCast2D" parent="."] +position = Vector2(-16, 16) +target_position = Vector2(8, 0) +collision_mask = 24 +hit_from_inside = true + +[node name="Overlap Test3" type="RayCast2D" parent="."] +position = Vector2(16, -16) +target_position = Vector2(-8, 0) +collision_mask = 24 +hit_from_inside = true + +[node name="Overlap Test4" type="RayCast2D" parent="."] +position = Vector2(16, 16) +target_position = Vector2(-8, 0) +collision_mask = 24 +hit_from_inside = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("RectangleShape2D_ix7xn") + +[node name="Sprites" type="Node2D" parent="."] + +[node name="Block" type="Sprite2D" parent="Sprites"] +visible = false +texture = ExtResource("1_m2ybm") + +[node name="SpecialBlock" type="Sprite2D" parent="Sprites"] +visible = false +texture = ExtResource("2_jv3te") + +[node name="ExpandBlock" type="Sprite2D" parent="Sprites"] +visible = false +texture = ExtResource("3_yu63x") + +[node name="SpecialExpandedBlock" type="Sprite2D" parent="Sprites"] +visible = false +texture = ExtResource("4_yg0r6") + +[node name="Raycasts" type="Node2D" parent="."] + +[node name="RayTop" type="RayCast2D" parent="Raycasts"] +position = Vector2(0, -32) +target_position = Vector2(0, -16) +collision_mask = 3 +hit_from_inside = true + +[node name="RayRight" type="RayCast2D" parent="Raycasts"] +position = Vector2(32, 0) +target_position = Vector2(16, 0) +collision_mask = 3 +hit_from_inside = true + +[node name="RayBottom" type="RayCast2D" parent="Raycasts"] +position = Vector2(0, 32) +target_position = Vector2(0, 16) +collision_mask = 3 +hit_from_inside = true + +[node name="RayLeft" type="RayCast2D" parent="Raycasts"] +position = Vector2(-32, 0) +target_position = Vector2(-16, 0) +collision_mask = 3 +hit_from_inside = true diff --git a/scenes/ScoreOverview/score_overview.gd b/scenes/ScoreOverview/score_overview.gd index f69caaa..4745ea0 100644 --- a/scenes/ScoreOverview/score_overview.gd +++ b/scenes/ScoreOverview/score_overview.gd @@ -1,12 +1,20 @@ extends Control @onready var score = $VBoxContainer3/VBoxContainer2/ScoreValue -@onready var time = $VBoxContainer3/VBoxContainer/TimeValue +@onready var time = $VBoxContainer3/VBoxContainer/Time +@onready var timeValue = $VBoxContainer3/VBoxContainer/TimeValue +@onready var mode = $VBoxContainer3/VBoxContainer3/ModeValue # Called when the node enters the scene tree for the first time. func _ready() -> void: score.text = str(GLOBAL.points) - time.text = str(GLOBAL.time) + timeValue.text = str(GLOBAL.convertIntToTime(GLOBAL.time)) + if GLOBAL.currentMode == GLOBAL.MODES.INFINITE: + time.text = "Time Played" + mode.text = "Infinite" + elif GLOBAL.currentMode == GLOBAL.MODES.TIME: + time.text = "Time Left" + mode.text = "Time" GLOBAL.resetGame() func _on_play_again_button_pressed() -> void: diff --git a/scenes/ScoreOverview/score_overview.tscn b/scenes/ScoreOverview/score_overview.tscn index 59c7512..819c025 100644 --- a/scenes/ScoreOverview/score_overview.tscn +++ b/scenes/ScoreOverview/score_overview.tscn @@ -32,6 +32,22 @@ offset_bottom = 182.0 grow_horizontal = 2 grow_vertical = 2 +[node name="VBoxContainer3" type="VBoxContainer" parent="VBoxContainer3"] +layout_mode = 2 +alignment = 1 + +[node name="Mode" type="Label" parent="VBoxContainer3/VBoxContainer3"] +layout_mode = 2 +text = "Mode +" +label_settings = ExtResource("2_4dys4") +horizontal_alignment = 1 + +[node name="ModeValue" type="Label" parent="VBoxContainer3/VBoxContainer3"] +layout_mode = 2 +label_settings = ExtResource("4_dfemu") +horizontal_alignment = 1 + [node name="VBoxContainer2" type="VBoxContainer" parent="VBoxContainer3"] layout_mode = 2 alignment = 1 From 85669af4dcd5dfd3fbb1c14323385ce1540b87e7 Mon Sep 17 00:00:00 2001 From: Exobyt Date: Tue, 27 Aug 2024 23:57:29 +0200 Subject: [PATCH 08/10] Fixed Speed not resetting --- scenes/Globals/global.gd | 1 + scenes/NewBlocks/part.tscn | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/scenes/Globals/global.gd b/scenes/Globals/global.gd index 4e0f121..455a9cc 100644 --- a/scenes/Globals/global.gd +++ b/scenes/Globals/global.gd @@ -52,6 +52,7 @@ func getNewID() -> int: return currentID func resetGame(): + currentSpeed = SPEED.MIN rowRemoved = false blockStopped = false testingPhase = false diff --git a/scenes/NewBlocks/part.tscn b/scenes/NewBlocks/part.tscn index 8c38e46..8928829 100644 --- a/scenes/NewBlocks/part.tscn +++ b/scenes/NewBlocks/part.tscn @@ -63,24 +63,24 @@ texture = ExtResource("4_yg0r6") [node name="RayTop" type="RayCast2D" parent="Raycasts"] position = Vector2(0, -32) -target_position = Vector2(0, -16) +target_position = Vector2(0, 0) collision_mask = 3 hit_from_inside = true [node name="RayRight" type="RayCast2D" parent="Raycasts"] position = Vector2(32, 0) -target_position = Vector2(16, 0) +target_position = Vector2(0, 0) collision_mask = 3 hit_from_inside = true [node name="RayBottom" type="RayCast2D" parent="Raycasts"] position = Vector2(0, 32) -target_position = Vector2(0, 16) +target_position = Vector2(0, 0) collision_mask = 3 hit_from_inside = true [node name="RayLeft" type="RayCast2D" parent="Raycasts"] position = Vector2(-32, 0) -target_position = Vector2(-16, 0) +target_position = Vector2(0, 0) collision_mask = 3 hit_from_inside = true From 5643fee9d3d03533e44dee24fc820ba1718be0c4 Mon Sep 17 00:00:00 2001 From: Exobyt Date: Wed, 28 Aug 2024 00:00:15 +0200 Subject: [PATCH 09/10] Slowed Down Blocks --- scenes/Globals/global.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scenes/Globals/global.gd b/scenes/Globals/global.gd index 455a9cc..62f0804 100644 --- a/scenes/Globals/global.gd +++ b/scenes/Globals/global.gd @@ -2,7 +2,7 @@ extends Node var points = 0 -enum SPEED {MIN=30, MAX=100} +enum SPEED {MIN=20, MAX=80} var currentSpeed := SPEED.MIN From 99d5016ac2bd0dcde73aad86d627b070732da1ed Mon Sep 17 00:00:00 2001 From: Exobyt Date: Fri, 20 Sep 2024 22:46:27 +0200 Subject: [PATCH 10/10] Test --- icon.png | Bin 0 -> 1852 bytes icon.png.import | 2 +- project.godot | 10 +++- scenes/Globals/global.gd | 4 +- scenes/Grid/row_test.gd | 51 +++++++++++------ scenes/Grid/row_test.tscn | 72 ++++-------------------- scenes/NewBlocks/block.gd | 111 ++++++++++++++++++++++++++----------- scenes/NewBlocks/part.gd | 33 ++++++++--- scenes/NewBlocks/part.tscn | 37 ++++--------- 9 files changed, 171 insertions(+), 149 deletions(-) create mode 100644 icon.png diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a84bf2b6688ece99f224e45e068db444905d0fc0 GIT binary patch literal 1852 zcmb7FX*ipS7XFe(ltE0@S~Ely;})%`rIFaHR8etJF+$bWK~kZX5kiY;Embwd)Y2)s z8C8wgC5S3TRke1a!o(U&5~QfnyFB+#f6V=Hmgk&5@B6&xIqywpM_Wm8C2;@%B<;>x zyX;r;mpBOB&rGy$_kIy0oV`c{04e5|0KLLLzPvwFjIi;Dz~BQSqI|>sfvBh`-QcjF zhYB(a{H(uvo%YLt`ZcsxXddHo& zxzuOx_DfZD`4!e?{Xk>jCJMPyLJf@CINM?JD*myn_Q*3G(hzYYommKc56T2nw@;G~ z$)BInSjAtjKSWt=w({NeqIn87snnP(;1!*;-U;V4gPNpr&TyY)Ln05XT&qC-yu0vH zu=in=4pv5PSfVj=O}+)flg_`CG(6LwyVbYQMBV{9uv?ZlkqPYv9IjJ)7Z>T4eM)Gb6iGLxVUB+tRI~ z-mKo>wShB+?n=rcx1wozI=ZGZ8E!e~y zQ$NM%X^sFUV}ENHgAJ5Fz8Yi@fYNK#{lV_ivUz9*_PIGL-AUzBX&#)WbA^^%0zPOf zBAqF&sw``6tW74k0v{g(Z5Kc{zP_;Q-Nq3!&gTxfb47+!$7CY~If7i2R6sBIHROoX~aPTQ4;i1gpw|wM73PuwP-} z0w*JK)mi|Nk3`$QN5eOLJ49aYHFmX#)n1e~d& z-@}=+FGpKEuNIk^ZL4L_{<&VIC#6Gmx%j{kDSs}r)GiqyxF-=carqHO4>Mi8z&Y0u zHQ)NYTjZ5-%(VRe)2Sp^@gx5=QxQ;(BIX6ccf8we9uNxuQ{24J7L}`}@V7+x3a@|5 zrkDoY^)A*!?P;aYYW=sfA=_2<fKqRVIDpxC9x#$ zOW(O<`{P3=Qch74&RC7bBfnhai$^sbUR8-=thA0ehK++BOi&tn1 zSaMM$9@NOTQs6(vPeS>gS4K7)m^3%4Vck6b8FKT@ z8&S3z<}+I}SA~kwB_ow4m{i5}GLvfk}TvhoJVutCF^#Kz^JSz>%K zV6`1{PE&Hjsikdda*)><5SZUJyA}dnjG>&Yz_?4L5aGVk(hyY5t|6VJ{K;Ubg#-Tx zL+@S|xZvWP0rIP2G%ZU^h@x=Viw)VT<%WFkAF+)DKLYb@<%*zOeyDMIyxVvZ9v*ey z;k)xE@Qq=@WZ##m+v&gsZYK24^HY)LnxFxTUY|)x{ep@7W!7y`@#j`$E?pa5LRt2j zl`;#oZxSGC$)>wvB9tIAE^o|(iLUeo?80<$^rq(GLI${lKmAbi@Yuc$0)U;3qxCaO HpQOJ4eU)nn literal 0 HcmV?d00001 diff --git a/icon.png.import b/icon.png.import index bd87d5f..7f73e7f 100644 --- a/icon.png.import +++ b/icon.png.import @@ -16,9 +16,9 @@ dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.cte [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 -compress/bptc_ldr=0 compress/normal_map=0 compress/channel_pack=0 mipmaps/generate=false diff --git a/project.godot b/project.godot index d1e2035..8a068f5 100644 --- a/project.godot +++ b/project.godot @@ -12,7 +12,7 @@ config_version=5 config/name="Texpand" config/description="Tetris with special Blocks that expands" -config/version="2.0.0" +config/version="2.0.1" config/tags=PackedStringArray("game_jam") run/main_scene="res://scenes/Main/main.tscn" config/features=PackedStringArray("4.3", "GL Compatibility") @@ -24,8 +24,8 @@ boot_splash/minimum_display_time=1 [autoload] -DebugMenu="*res://addons/debug_menu/debug_menu.tscn" GLOBAL="*res://scenes/Globals/global.gd" +DebugMenu="*res://addons/debug_menu/debug_menu.tscn" [display] @@ -44,11 +44,17 @@ version_control/autoload_on_startup=true enabled=PackedStringArray("res://addons/debug_menu/plugin.cfg") +[github_to_itch] + +config/itch_username="Exobyt" +config/itch_project_name="" + [global_group] Block="Block" ExpandBlock="" Border="" +Part="" [input] diff --git a/scenes/Globals/global.gd b/scenes/Globals/global.gd index 62f0804..1e0ef62 100644 --- a/scenes/Globals/global.gd +++ b/scenes/Globals/global.gd @@ -4,7 +4,7 @@ var points = 0 enum SPEED {MIN=20, MAX=80} -var currentSpeed := SPEED.MIN +var currentSpeed = SPEED.MIN var hasSelectedSpeed = false @@ -85,6 +85,6 @@ func convertIntToTime(value) -> String: func speedUp(): if currentSpeed + 1 <= SPEED.MAX: - currentSpeed += 1 + currentSpeed += 0.5 else: currentSpeed = SPEED.MAX diff --git a/scenes/Grid/row_test.gd b/scenes/Grid/row_test.gd index c1f1199..cd87452 100644 --- a/scenes/Grid/row_test.gd +++ b/scenes/Grid/row_test.gd @@ -1,15 +1,19 @@ -extends Node2D +extends Area2D static var rowRemoved = false func isFull(): - var full = true - for i in get_children(): - i.force_raycast_update() - #print(i.get_collider()) - if not i.is_colliding(): - full = false - return full + var amount = 0 + for i in get_overlapping_areas(): + if i.is_in_group("Part"): + if i.get_parent().get_parent().expand: + amount += 2 + else: + amount += 1 + if amount >= 10: + return true + else: + return false func check(): if not GLOBAL.rowRemoved: @@ -18,16 +22,29 @@ func check(): GLOBAL.rowRemoved = true var blocksSplit = [] var removeBlock = [] - for i in get_children(): - i.force_raycast_update() - if i.get_collider() != null: - blocksSplit.append(i.get_collider().get_parent().get_parent()) + for i in get_overlapping_areas(): + if i.is_in_group("Part"): + var block = i.get_parent().get_parent() + blocksSplit.append(block) + i.free() if GLOBAL.currentMode == GLOBAL.MODES.TIME: - GLOBAL.time += i.get_collider().get_parent().get_parent().type - if i.get_collider().get_parent().get_parent().expand: - GLOBAL.points += i.get_collider().get_parent().get_parent().type * 2 + GLOBAL.time += block.type + if block.expand: + GLOBAL.points += block.type * 2 else: - GLOBAL.points += i.get_collider().get_parent().get_parent().type - i.get_collider().free() + GLOBAL.points += block.type for j in blocksSplit: j.splitParts() + #for i in get_children(): + #i.force_raycast_update() + #if i.get_collider() != null: + #blocksSplit.append(i.get_collider().get_parent().get_parent()) + #if GLOBAL.currentMode == GLOBAL.MODES.TIME: + #GLOBAL.time += i.get_collider().get_parent().get_parent().type + #if i.get_collider().get_parent().get_parent().expand: + #GLOBAL.points += i.get_collider().get_parent().get_parent().type * 2 + #else: + #GLOBAL.points += i.get_collider().get_parent().get_parent().type + #i.get_collider().free() + #for j in blocksSplit: + #j.splitParts() diff --git a/scenes/Grid/row_test.tscn b/scenes/Grid/row_test.tscn index 598270f..aab5caa 100644 --- a/scenes/Grid/row_test.tscn +++ b/scenes/Grid/row_test.tscn @@ -1,66 +1,16 @@ -[gd_scene load_steps=2 format=3 uid="uid://ibyhtfpc52vc"] +[gd_scene load_steps=3 format=3 uid="uid://ibyhtfpc52vc"] [ext_resource type="Script" path="res://scenes/Grid/row_test.gd" id="1_2nxxe"] -[node name="RowTest" type="Node2D"] +[sub_resource type="RectangleShape2D" id="RectangleShape2D_t04sr"] +size = Vector2(624, 48) + +[node name="RowTest" type="Area2D"] +collision_layer = 16 +collision_mask = 8 +input_pickable = false script = ExtResource("1_2nxxe") -[node name="RayCast2D" type="RayCast2D" parent="."] -position = Vector2(32, 24) -target_position = Vector2(0, 16) -collision_mask = 24 -hit_from_inside = true - -[node name="RayCast2D2" type="RayCast2D" parent="."] -position = Vector2(96, 24) -target_position = Vector2(0, 16) -collision_mask = 24 -hit_from_inside = true - -[node name="RayCast2D3" type="RayCast2D" parent="."] -position = Vector2(160, 24) -target_position = Vector2(0, 16) -collision_mask = 24 -hit_from_inside = true - -[node name="RayCast2D4" type="RayCast2D" parent="."] -position = Vector2(224, 24) -target_position = Vector2(0, 16) -collision_mask = 24 -hit_from_inside = true - -[node name="RayCast2D5" type="RayCast2D" parent="."] -position = Vector2(288, 24) -target_position = Vector2(0, 16) -collision_mask = 24 -hit_from_inside = true - -[node name="RayCast2D6" type="RayCast2D" parent="."] -position = Vector2(352, 24) -target_position = Vector2(0, 16) -collision_mask = 24 -hit_from_inside = true - -[node name="RayCast2D7" type="RayCast2D" parent="."] -position = Vector2(416, 24) -target_position = Vector2(0, 16) -collision_mask = 24 -hit_from_inside = true - -[node name="RayCast2D8" type="RayCast2D" parent="."] -position = Vector2(480, 24) -target_position = Vector2(0, 16) -collision_mask = 24 -hit_from_inside = true - -[node name="RayCast2D9" type="RayCast2D" parent="."] -position = Vector2(544, 24) -target_position = Vector2(0, 16) -collision_mask = 24 -hit_from_inside = true - -[node name="RayCast2D10" type="RayCast2D" parent="."] -position = Vector2(608, 24) -target_position = Vector2(0, 16) -collision_mask = 24 -hit_from_inside = true +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2(320, 32) +shape = SubResource("RectangleShape2D_t04sr") diff --git a/scenes/NewBlocks/block.gd b/scenes/NewBlocks/block.gd index 5e5979d..e0084d0 100644 --- a/scenes/NewBlocks/block.gd +++ b/scenes/NewBlocks/block.gd @@ -38,18 +38,49 @@ func _physics_process(delta: float) -> void: elif Input.is_action_just_pressed("right"): if not isRightColliding(): global_position.x += GLOBAL.GRID - if Input.is_action_pressed("down"): - velocity = get_gravity() * delta * GLOBAL.SPEED.MAX - else: - velocity = get_gravity() * delta * GLOBAL.currentSpeed + else: + if stopped and not isBottomColliding(): + position.y += GLOBAL.GRID + snapPosition() + if Input.is_action_pressed("down") and isCurrent(): + velocity = get_gravity() * delta * GLOBAL.SPEED.MAX + else: + velocity = get_gravity() * delta * GLOBAL.currentSpeed + #if isBottomColliding(): + #print(global_position) + #print(global_position.snapped(Vector2(64,64))) + #print(global_position.snapped(Vector2(64,64)) - Vector2(32,32)) + #print(int((global_position.snapped(Vector2(64,64)) - Vector2(32,32)).y)) + #print(int((global_position.snapped(Vector2(64,64)) - Vector2(32,32)).x)) + #print(int(global_position.x-32) % GLOBAL.GRID) + #print(int(global_position.y-32) % GLOBAL.GRID) + #print(name + ": " + str(not isBottomColliding() and not isCurrent())) + #print(global_position) + #print(int(global_position.x-32) % GLOBAL.GRID) + #print(int(global_position.y-32) % GLOBAL.GRID) + #if isBottomColliding(): + # + #if not int(global_position.x-32) % GLOBAL.GRID == 0: + #global_position.x = global_position.snapped(Vector2(64,64)).x -32 + #if not int(global_position.y-32) % GLOBAL.GRID == 0: + #global_position.y = global_position.snapped(Vector2(64,64)).y -32 + #global_position = global_position.snapped(Vector2(64,64)) + + #position.y += GLOBAL.GRID - if is_on_floor(): - position = position.snapped(Vector2(32,32)) + #if is_on_floor(): + #position = position.snapped(Vector2(32,32)) + #if not is_on_floor() and not isCurrent() and not isBottomColliding(): + #position += Vector2(0,64) + #print(not isBottomColliding()) + #if stopped and not isBottomColliding(): + #position += Vector2(0,64) if isCurrent() and not expanding and not GLOBAL.blockStopped: move_and_slide() else: + velocity = Vector2.ZERO func expandBlocks(): @@ -77,10 +108,10 @@ func expandBlocks(): position.x += GLOBAL.GRID if isCollidingBorder(): position.y -= GLOBAL.GRID - + for i in partsContainer.get_children(): - if i != null: - i.removeOverlapp() + #print(i) + i.removeOverlapp() #splitParts() func addParts(): @@ -96,31 +127,11 @@ func addParts(): look = 3 newPart.init(i.position,look) -func splitParts(): - for i in $PartsContainer.get_children(): - var newBlock = load(block1x1).instantiate() - get_parent().add_child(newBlock) - newBlock.init(i.global_position, expand) - newBlock.setColor(modulate) - queue_free() + func setColor(color): modulate = color -func init(pos, scaler=null): - - if scaler != null: - if scaler: - expand = scaler - #$AnimationPlayer.play("Expand") - scale = Vector2(2,2) - addParts() - id = GLOBAL.getNewID() - GLOBAL.currentID = id - snapPosition() - global_position = pos - if offset: - snapPosition() func setNewID(): id = GLOBAL.getNewID() @@ -129,7 +140,11 @@ func isCurrent(): return GLOBAL.currentID == id func snapPosition(): #x :bool, y: bool - position = position.snapped(Vector2(64,64)) + if not offset and not expand: + global_position = global_position.snapped(Vector2(64,64)) - Vector2(32,32) + else: + global_position = global_position.snapped(Vector2(64,64)) + #position = position.snapped(Vector2(64,64)) func rotateBlock(direction): match direction: @@ -232,7 +247,41 @@ func _on_animation_player_animation_finished(anim_name: StringName) -> void: func _on_coyote_timer_timeout() -> void: if isBottomColliding(): + snapPosition() stopped = true GLOBAL.blockStopped = true if expand: expandBlocks() + +func init(pos): + if expand and stopped: + #$AnimationPlayer.play("Expand") + scale = Vector2(2,2) + addParts() + id = GLOBAL.getNewID() + GLOBAL.currentID = id + snapPosition() + global_position = pos + if offset: + snapPosition() + + +func splitParts(): + for i in $PartsContainer.get_children(): + var newBlock = load(block1x1).instantiate() + get_parent().add_child(newBlock) + newBlock.clone(expand, type, stopped) + newBlock.init(i.global_position) + newBlock.setColor(modulate) + queue_free() + +func clone(newExpand=false, newType=GLOBAL.BLOCKTYPES.LIGHT, newStopped=false): + expand = newExpand + stopped = newStopped + type = newType + #if not expand and type == GLOBAL.BLOCKTYPES.HEAVY: + #look = 1 + #elif expand and not type == GLOBAL.BLOCKTYPES.HEAVY: + #look = 2 + #elif expand and type == GLOBAL.BLOCKTYPES.HEAVY: + #look = 3 diff --git a/scenes/NewBlocks/part.gd b/scenes/NewBlocks/part.gd index 44191b7..cceeab4 100644 --- a/scenes/NewBlocks/part.gd +++ b/scenes/NewBlocks/part.gd @@ -1,4 +1,4 @@ -extends Node2D +extends Area2D @onready var spriteBlock = $Sprites/Block @onready var spriteSpecialBlock = $Sprites/SpecialBlock @@ -27,15 +27,32 @@ func isOverlapping() -> bool: func removeOverlapp(): var blocksSplit = [] - for i in get_children(): - if is_instance_of(i,RayCast2D): - i.force_raycast_update() - var collider = i.get_collider() - if collider != null and collider.get_parent().get_parent().id != GLOBAL.currentID: - blocksSplit.append(i.get_collider().get_parent().get_parent()) - collider.free() + var removeBlock = [] + for i in $Area2D.get_overlapping_areas(): + + + if i.is_in_group("Part") and i.get_parent().get_parent().id != GLOBAL.currentID: + print(i) + var block = i.get_parent().get_parent() + blocksSplit.append(block) + i.free() + #if GLOBAL.currentMode == GLOBAL.MODES.TIME: + #GLOBAL.time += block.type + #if block.expand: + #GLOBAL.points += block.type * 2 + #else: + #GLOBAL.points += block.type for j in blocksSplit: j.splitParts() + #for i in get_children(): + #if is_instance_of(i,RayCast2D): + #i.force_raycast_update() + #var collider = i.get_collider() + #if collider != null and collider.get_parent().get_parent().id != GLOBAL.currentID: + #blocksSplit.append(i.get_collider().get_parent().get_parent()) + #collider.free() + #for j in blocksSplit: + #j.splitParts() func init(pos, look=0): position = pos diff --git a/scenes/NewBlocks/part.tscn b/scenes/NewBlocks/part.tscn index 8928829..dc33cda 100644 --- a/scenes/NewBlocks/part.tscn +++ b/scenes/NewBlocks/part.tscn @@ -9,35 +9,11 @@ [sub_resource type="RectangleShape2D" id="RectangleShape2D_ix7xn"] size = Vector2(48, 48) -[node name="Part" type="StaticBody2D"] -collision_layer = 24 -collision_mask = 24 +[node name="Part" type="Area2D" groups=["Part"]] +collision_layer = 8 +collision_mask = 16 script = ExtResource("1_hlmu7") -[node name="Overlap Test" type="RayCast2D" parent="."] -position = Vector2(-16, -16) -target_position = Vector2(8, 0) -collision_mask = 24 -hit_from_inside = true - -[node name="Overlap Test2" type="RayCast2D" parent="."] -position = Vector2(-16, 16) -target_position = Vector2(8, 0) -collision_mask = 24 -hit_from_inside = true - -[node name="Overlap Test3" type="RayCast2D" parent="."] -position = Vector2(16, -16) -target_position = Vector2(-8, 0) -collision_mask = 24 -hit_from_inside = true - -[node name="Overlap Test4" type="RayCast2D" parent="."] -position = Vector2(16, 16) -target_position = Vector2(-8, 0) -collision_mask = 24 -hit_from_inside = true - [node name="CollisionShape2D" type="CollisionShape2D" parent="."] shape = SubResource("RectangleShape2D_ix7xn") @@ -84,3 +60,10 @@ position = Vector2(-32, 0) target_position = Vector2(0, 0) collision_mask = 3 hit_from_inside = true + +[node name="Area2D" type="Area2D" parent="."] +collision_layer = 16 +collision_mask = 8 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"] +shape = SubResource("RectangleShape2D_ix7xn")