From 8bb4ba71ce972f57eb694cb31c699d441a5e110e Mon Sep 17 00:00:00 2001 From: allfatherhatt Date: Tue, 1 Oct 2024 16:43:34 +0200 Subject: [PATCH] Adding initial turbo-basic stuff --- .gitattributes | 2 + .gitignore | 2 + asteroid.gd | 43 +++++++++ cheese.tscn | 18 ++++ cheeseCollision.gd | 18 ++++ hardpoint.gd | 19 ++++ icon.svg | 1 + icon.svg.import | 37 ++++++++ images/AsteroidBrown.png | Bin 0 -> 1184 bytes images/AsteroidBrown.png.import | 34 +++++++ images/bg_space_seamless.png | Bin 0 -> 8662 bytes images/bg_space_seamless.png.import | 34 +++++++ images/glowcircle.png | Bin 0 -> 8861 bytes images/glowcircle.png.import | 34 +++++++ images/glowing_circle.png | Bin 0 -> 4138 bytes images/glowing_circle.png.import | 34 +++++++ images/laser_turret.png | Bin 0 -> 274 bytes images/laser_turret.png.import | 34 +++++++ images/protocheese.png | Bin 0 -> 506 bytes images/protocheese.png.import | 34 +++++++ images/spaceship-placeholder.png | Bin 0 -> 763 bytes images/spaceship-placeholder.png.import | 34 +++++++ laser.gd | 78 +++++++++++++++ maiE190.tmp | 63 ++++++++++++ main.tscn | 121 ++++++++++++++++++++++++ project.godot | 34 +++++++ spaceship.gd | 57 +++++++++++ weapons_system.gd | 15 +++ 28 files changed, 746 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 asteroid.gd create mode 100644 cheese.tscn create mode 100644 cheeseCollision.gd create mode 100644 hardpoint.gd create mode 100644 icon.svg create mode 100644 icon.svg.import create mode 100644 images/AsteroidBrown.png create mode 100644 images/AsteroidBrown.png.import create mode 100644 images/bg_space_seamless.png create mode 100644 images/bg_space_seamless.png.import create mode 100644 images/glowcircle.png create mode 100644 images/glowcircle.png.import create mode 100644 images/glowing_circle.png create mode 100644 images/glowing_circle.png.import create mode 100644 images/laser_turret.png create mode 100644 images/laser_turret.png.import create mode 100644 images/protocheese.png create mode 100644 images/protocheese.png.import create mode 100644 images/spaceship-placeholder.png create mode 100644 images/spaceship-placeholder.png.import create mode 100644 laser.gd create mode 100644 maiE190.tmp create mode 100644 main.tscn create mode 100644 project.godot create mode 100644 spaceship.gd create mode 100644 weapons_system.gd diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4709183 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Godot 4+ specific ignores +.godot/ diff --git a/asteroid.gd b/asteroid.gd new file mode 100644 index 0000000..3d373af --- /dev/null +++ b/asteroid.gd @@ -0,0 +1,43 @@ +extends StaticBody2D + +@export var max_health: float = 100.0 # Maximum health for the asteroid +var current_health: float +var is_destroyed: bool = false # Track if the asteroid has already been destroyed + +func _ready(): + current_health = max_health + update_health_label() # Update the health display when the game starts + +# Function to handle taking damage +func take_damage(damage: float): + if is_destroyed: # Prevent taking damage if already destroyed + return + + current_health -= damage # Subtract the damage from current health + current_health = max(current_health, 0) # Ensure health doesn't drop below 0 + update_health_label() # Update the label to reflect new health value + + if current_health <= 0.0: + break_apart() + +# Function to handle when the asteroid is destroyed +func break_apart(): + is_destroyed = true # Mark the asteroid as destroyed + queue_free() # Remove the asteroid from the scene + print("Asteroid mined!") + + # Load the Cheese scene + var cheese_scene = load("res://Cheese.tscn") + + # Instance the cheese + var cheese_instance = cheese_scene.instantiate() + + # Set the position where the cheese should spawn (at the asteroid's position) + cheese_instance.global_position = global_position + Vector2(randf() * 50 - 25, randf() * 50 - 25) + + # Add the cheese instance to the scene + get_parent().add_child(cheese_instance) + +# Function to update the health label display +func update_health_label(): + $AsteroidHealthLabel.text = str(round(current_health)) + " / " + str(max_health) diff --git a/cheese.tscn b/cheese.tscn new file mode 100644 index 0000000..ceed080 --- /dev/null +++ b/cheese.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=3 format=3 uid="uid://ukjuwuhb6mq6"] + +[ext_resource type="Script" path="res://cheeseCollision.gd" id="1_k5eo2"] +[ext_resource type="Texture2D" uid="uid://djwn5ruf1wln0" path="res://images/protocheese.png" id="2_xljbq"] + +[node name="cheese" type="Area2D"] +position = Vector2(300, 337) +scale = Vector2(2, 2) +collision_mask = 3 +script = ExtResource("1_k5eo2") + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."] +polygon = PackedVector2Array(3, 17.5, 18.5, 0, 13.5, -20.5, -16.5, -7, -16, 13) + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture = ExtResource("2_xljbq") + +[connection signal="body_entered" from="." to="." method="_on_body_entered"] diff --git a/cheeseCollision.gd b/cheeseCollision.gd new file mode 100644 index 0000000..ebaadf4 --- /dev/null +++ b/cheeseCollision.gd @@ -0,0 +1,18 @@ +extends Area2D + + + +func _ready(): + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + pass + + +func _on_body_entered(body): + if body.name == "spaceship": + queue_free() # This removes the cheese from the scene + print("Cheese collected!") # Replace this with actual game logic + diff --git a/hardpoint.gd b/hardpoint.gd new file mode 100644 index 0000000..228b5b7 --- /dev/null +++ b/hardpoint.gd @@ -0,0 +1,19 @@ +extends Node2D + +@export var hardpoint_id: String = "HardPoint1" # Unique identifier for this hardpoint + +# Optional - can store a reference to the mounted weapon +var mounted_weapon: Node2D = null + +# Method to attach a weapon to the hardpoint +func attach_weapon(weapon: Node2D) -> void: + mounted_weapon = weapon + weapon.global_position = global_position # Set weapon position to the hardpoint position + weapon.rotation = rotation # Align the weapon's rotation to the hardpoint's rotation + +func _draw(): + draw_circle(Vector2.ZERO, 10, Color(1, 0, 0)) # Draw a red circle at the hardpoint + +func _ready(): + add_to_group("hardpoints") # Add the hardpoint to the "hardpoints" group + queue_redraw() # Redraw the visual to ensure it's updated diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..3fe4f4a --- /dev/null +++ b/icon.svg @@ -0,0 +1 @@ + diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..fc09f0e --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b738dyw75cuny" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.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/images/AsteroidBrown.png b/images/AsteroidBrown.png new file mode 100644 index 0000000000000000000000000000000000000000..650badac7e83b54591717d9b51effa5ac0c40fe0 GIT binary patch literal 1184 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I4M=vMPuFE&U`h9MaSW-L^Y-q-K9x`rwg-(9 z6a;LTS)83XxC|s%3EXhikzipH=y7dG6Xua?Jjl?M<6)5UT~a_h-~&Txgx~j_ zvGw2Id_U>sd)?>!{Mo;sUt7Ct7ZcD57} zhE5@eMR}J}c82QJ{eAa3_`h8E`hB14zF(RB<*)ov4v#4eLaGfeoC<-{4LIYX^#1+% zdHhZSWf7t&!-pyeV%LEOu!B*Ql-z+QG^XJaz z*^~GEeDwHQd#U%~BXX%ri-Np1=Rvu8i#_H9t?j zJ-hLp)+xER)w=1yK1j+-yG~}j{m5aIvD`f6SrHcc>RUOxF^S;3lnvkeU+ zzs`6Or(C-GhNY;mvO*x(Dxg>1205vfB)p$x|3cf82j|pkYXe2exK>ixfwwgWxI~P$hdpx zqHgfj`xpPt+ih=cx!!1J?r9|7zZJT)w|AwM%w5ikP>WsK26sFEzY1+QxvwwJa&=g= z*5pMqw2+OCigVJsnzH-%jhpXseXa&?QPUP$?R)BG%Keja*H`STR&D84fX4O}J#EFQ z%xdeT@BWp#Y8rOmDQu?5+;`RPyZryXnl}Gxb;+uBrWj4dInuC{>Gqy;W!Fi+$v3B6 zU2PtFcdzc$yqz!JO}**7y&wcBO>F(s`|@tmrsKJRE7c3$1`4d&zjpVh&A*X8S-!iQdqwd(bw(~0jit5 zY4^F8u`02vx!sYo!|pwXdspvHtlD&QmsS3zz};0Tx#i8Z-!JZteZJ+;#Z(q(&SIIc zVzR%H{KBf!-;SjeSEhcg>v(ss=cKogy1t7|LUO$dH&PUNO`EVTEOO-Bx(p_NyAIFVBC+^;O9josP?Q;Xxz&M;tt=1nG#D@T2!%1cTbEgPkO*BimbIbivp bVfy>{xnI^x{}4`B28nsP`njxgN@xNAI-?T! literal 0 HcmV?d00001 diff --git a/images/AsteroidBrown.png.import b/images/AsteroidBrown.png.import new file mode 100644 index 0000000..23158b8 --- /dev/null +++ b/images/AsteroidBrown.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://buirp1h6onqai" +path="res://.godot/imported/AsteroidBrown.png-5960fa3ab2dd38f3a19e0b952d620e7c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://images/AsteroidBrown.png" +dest_files=["res://.godot/imported/AsteroidBrown.png-5960fa3ab2dd38f3a19e0b952d620e7c.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/images/bg_space_seamless.png b/images/bg_space_seamless.png new file mode 100644 index 0000000000000000000000000000000000000000..505e352797720b8452104f933bf1060fc307a667 GIT binary patch literal 8662 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 literal 0 HcmV?d00001 diff --git a/images/glowing_circle.png.import b/images/glowing_circle.png.import new file mode 100644 index 0000000..0a148fa --- /dev/null +++ b/images/glowing_circle.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://di7nndrreqmtf" +path="res://.godot/imported/glowing_circle.png-4ed2edd49097f5b99b37d1372b8b318b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://images/glowing_circle.png" +dest_files=["res://.godot/imported/glowing_circle.png-4ed2edd49097f5b99b37d1372b8b318b.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/images/laser_turret.png b/images/laser_turret.png new file mode 100644 index 0000000000000000000000000000000000000000..f014e2f0124e0ecb604491f0bc70ae3f19d42db4 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g#!3-o@R>TwmDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheq5(c3uFR|~R#sNMy}gQ0?0;R8ZH`j_$^`9jkOxxiB|(0{|G|Jk%A45@ zD8yOd5n0T@z;_sg8IR|$NC65Kd%8G=Xat|V5Xje{z{7mOXzFkIo9oIhPmrjW?Ogia z+2xE>!JgDYzn+f5?Wa8Y)=jN{$UE_Rq=dAAMeX@#A-l3RZ@ruIL_%z@N`VrT#W literal 0 HcmV?d00001 diff --git a/images/laser_turret.png.import b/images/laser_turret.png.import new file mode 100644 index 0000000..d37d50a --- /dev/null +++ b/images/laser_turret.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bxgw2u7j4b634" +path="res://.godot/imported/laser_turret.png-1df2831a344ffa5282291095b5880ec8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://images/laser_turret.png" +dest_files=["res://.godot/imported/laser_turret.png-1df2831a344ffa5282291095b5880ec8.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/images/protocheese.png b/images/protocheese.png new file mode 100644 index 0000000000000000000000000000000000000000..e2683ce78be4e4ade0d6b258a2e9f0c68c0f96d1 GIT binary patch literal 506 zcmeAS@N?(olHy`uVBq!ia0vp^`XJ1~3?yBCCeH&>jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCikt0(?STf%N~G4FAtC{QuAJKMlxZ*#6yM2asYb3Gxg64+0FE_b=HG6yYrJ zh%9Dc;5!V$jK}j=qyR05_jGX#@$h~+C9>$Sf`E&o)A#*FRgxDJl)ZnJg=^_l-ZgG` zT=d7^{(!i~vVNPJQLnA<>3nT7-xH|+!|(m?e`osLTCRVZ+n@27C!cfIr@plFQ!Ymv zo%wUKw4Xh0v*KslTd~d(TxQp5mNT;VSG<|%AJTKkTK4)5!Q=0`^jDm`m3LS9OWMJS=N}!oPErn-rBjnSy^2+{{!FQ$P>SrT2ED--_3OREZesu?wz^9YRzTge>)~H zhMs8ci2v!)|H-6!Rfp9h^?Oe(J@=S=u(V$=^Z0w=`9Jtl?>$yu|2fLWZB5CA+5g4E zK5YH4tvOtqbN>gsdk-v6KfDkz@x#XptUQ~tZ6$v-S>#t8F|(OVg+vMa_U0-)p u%w|=Sc}MRO(f3*bYc^f`v$w9>zRzChuEMD!Qpch}G2`j#=d#Wzp$Pz1)#T^^ literal 0 HcmV?d00001 diff --git a/images/protocheese.png.import b/images/protocheese.png.import new file mode 100644 index 0000000..4a78eef --- /dev/null +++ b/images/protocheese.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://djwn5ruf1wln0" +path="res://.godot/imported/protocheese.png-9fecc312dcb5c24e7f3a9d4a6b6c2d88.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://images/protocheese.png" +dest_files=["res://.godot/imported/protocheese.png-9fecc312dcb5c24e7f3a9d4a6b6c2d88.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/images/spaceship-placeholder.png b/images/spaceship-placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..ff5d9a699fa98bd6f0ebc45ac033aad994b6ad3e GIT binary patch literal 763 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE|ojJ=)O(IVB7Qrlg(>StnYh#OZWcvNyq%^ z_Ws}gch#a^!&g%>W*xJBxGndqrtSGwCKd;V6UUx%p1Jtx&(9jUlD$D*!Hf+I91MG3 zFnwpd*0O6|_pZp$&{a=-7BC4gFgDa4cz9=j*uDMrHl-m93JgpR3x6}L-CFLD+_Tkh ze{D#h@Sm#9*Z(ej9LyLYpuq6E;o%P37|mjp^Y`C>zjxkWP5AxaB_HqpT=vcoq=4zb z%=gSb9qqfH|G#vzzopvj%4PWvX&qj7>=!U?P+(yIy3K)srGZD}zHr=~HOlV|7Bew0 z3NZXS`SI?B6`L2nEqh)5XXe|VOXvO#09kjy{yamzT8^3Y`u6s3Eq8fVzP4KZ9PE$- zn&}6AU)}n(@#y>QPZr)|R5>p{o7qTFLz!(4zZL^G6N^Tx$X|x{yY9Ju`t$YHJ9eGv zr&qkb`*F$7tEF?lY*$~wpu@qq;6ts$1vkaASov2!SH3q-xG%7!AMDJALq-Q~Z=PDW zUw!*?d28V%&!<?QDBTwY04zt>yQ=J3qm`cW_(u zn{kr*@v1G=|F`Aty>9Mn{Hh|^o?o void: + if is_firing: + _process_laser(true) + + +func _process_laser(active: bool): + var raycast = $LaserBeam2D + raycast.enabled = active + + + if active: + + raycast.force_raycast_update() + + if raycast.is_colliding(): + + var collision_point = raycast.get_collision_point() + $LaserLine2D.set_point_position(0, Vector2.ZERO) + $LaserLine2D.set_point_position(1, to_local(collision_point)) + + + var collider = raycast.get_collider() + if collider.has_method("take_damage"): + collider.take_damage(laser_damage) + else: + + $LaserLine2D.set_point_position(0, Vector2.ZERO) + $LaserLine2D.set_point_position(1, Vector2(0, -laser_range)) + else: + + $LaserLine2D.clear_points() + $LaserLine2D.add_point(Vector2.ZERO) # Re-add the origin point + $LaserLine2D.add_point(Vector2.ZERO) # Reset target point to origin diff --git a/maiE190.tmp b/maiE190.tmp new file mode 100644 index 0000000..5455179 --- /dev/null +++ b/maiE190.tmp @@ -0,0 +1,63 @@ +[gd_scene load_steps=9 format=3 uid="uid://8ocp10j32f62"] + +[ext_resource type="Texture2D" uid="uid://y6phkg4twpdm" path="res://images/bg_space_seamless.png" id="1_rpyi5"] +[ext_resource type="Texture2D" uid="uid://cran7fr1i2qou" path="res://images/spaceship-placeholder.png" id="2_f2x66"] +[ext_resource type="Script" path="res://spaceship.gd" id="3_ttkgl"] +[ext_resource type="Texture2D" uid="uid://djwn5ruf1wln0" path="res://images/protocheese.png" id="4_i7fg5"] +[ext_resource type="Script" path="res://cheeseCollision.gd" id="5_r3xo8"] +[ext_resource type="Script" path="res://asteroid.gd" id="6_n4dsl"] +[ext_resource type="Texture2D" uid="uid://buirp1h6onqai" path="res://images/AsteroidBrown.png" id="7_0tjls"] + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_u4a3y"] +radius = 44.0 +height = 100.0 + +[node name="Main" type="Node2D"] + +[node name="background" type="Sprite2D" parent="."] +position = Vector2(955, 535) +scale = Vector2(2, 2) +texture = ExtResource("1_rpyi5") + +[node name="spaceship" type="CharacterBody2D" parent="."] +position = Vector2(960, 540) +motion_mode = 1 +script = ExtResource("3_ttkgl") + +[node name="Sprite2D" type="Sprite2D" parent="spaceship"] +z_index = 1 +texture = ExtResource("2_f2x66") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="spaceship"] +position = Vector2(0, -1) +shape = SubResource("CapsuleShape2D_u4a3y") + +[node name="RayCast2D" type="RayCast2D" parent="spaceship"] +position = Vector2(0, 3) +target_position = Vector2(0, -177) + +[node name="cheese" type="Area2D" parent="."] +position = Vector2(300, 337) +scale = Vector2(2, 2) +script = ExtResource("5_r3xo8") + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="cheese"] +polygon = PackedVector2Array(3, 17.5, 18.5, 0, 13.5, -20.5, -16.5, -7, -16, 13) + +[node name="Sprite2D" type="Sprite2D" parent="cheese"] +texture = ExtResource("4_i7fg5") + +[node name="asteroid" type="Area2D" parent="."] +position = Vector2(564, 144) +script = ExtResource("6_n4dsl") + +[node name="Sprite2D" type="Sprite2D" parent="asteroid"] +position = Vector2(1.00006, -3.99998) +scale = Vector2(1.2, 1.181) +texture = ExtResource("7_0tjls") + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="asteroid"] +position = Vector2(-519, -164) +polygon = PackedVector2Array(548, 101, 613, 169, 597, 210, 548, 240, 462, 221, 431, 184, 434, 133, 497, 90) + +[connection signal="body_entered" from="cheese" to="cheese" method="_on_body_entered"] diff --git a/main.tscn b/main.tscn new file mode 100644 index 0000000..e2b84ac --- /dev/null +++ b/main.tscn @@ -0,0 +1,121 @@ +[gd_scene load_steps=13 format=3 uid="uid://8ocp10j32f62"] + +[ext_resource type="Texture2D" uid="uid://y6phkg4twpdm" path="res://images/bg_space_seamless.png" id="1_rpyi5"] +[ext_resource type="Texture2D" uid="uid://cran7fr1i2qou" path="res://images/spaceship-placeholder.png" id="2_f2x66"] +[ext_resource type="Script" path="res://spaceship.gd" id="3_ttkgl"] +[ext_resource type="Script" path="res://laser.gd" id="4_uhf7q"] +[ext_resource type="Script" path="res://weapons_system.gd" id="5_gf6oh"] +[ext_resource type="Script" path="res://asteroid.gd" id="6_n4dsl"] +[ext_resource type="Texture2D" uid="uid://bxgw2u7j4b634" path="res://images/laser_turret.png" id="6_qxhyw"] +[ext_resource type="Texture2D" uid="uid://buirp1h6onqai" path="res://images/AsteroidBrown.png" id="7_0tjls"] +[ext_resource type="Script" path="res://hardpoint.gd" id="7_6cr6a"] + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_3vtwu"] +radius = 48.0 +height = 102.0 + +[sub_resource type="Gradient" id="Gradient_sx4rn"] +offsets = PackedFloat32Array(0.961735, 1) +colors = PackedColorArray(1, 1, 0, 1, 1, 1, 1, 0.137255) + +[sub_resource type="CircleShape2D" id="CircleShape2D_w58nc"] +radius = 88.0057 + +[node name="Main" type="Node2D"] + +[node name="background" type="Sprite2D" parent="."] +position = Vector2(955, 537) +scale = Vector2(2, 2) +texture = ExtResource("1_rpyi5") + +[node name="spaceship" type="CharacterBody2D" parent="."] +position = Vector2(908, 835) +collision_layer = 2 +motion_mode = 1 +script = ExtResource("3_ttkgl") + +[node name="Sprite2D" type="Sprite2D" parent="spaceship"] +z_index = 1 +texture = ExtResource("2_f2x66") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="spaceship"] +position = Vector2(0, 6) +rotation = -3.14159 +shape = SubResource("CapsuleShape2D_3vtwu") + +[node name="Laser1" type="Node2D" parent="spaceship"] +light_mask = 2 +position = Vector2(95, -159) +script = ExtResource("4_uhf7q") + +[node name="LaserSprite2D" type="Sprite2D" parent="spaceship/Laser1"] +position = Vector2(0, -5) +texture = ExtResource("6_qxhyw") + +[node name="LaserBeam2D" type="RayCast2D" parent="spaceship/Laser1"] +position = Vector2(0, -17) +target_position = Vector2(0, -800) +collide_with_areas = true + +[node name="LaserLine2D" type="Line2D" parent="spaceship/Laser1"] +points = PackedVector2Array(0, 0, 0, 0) +default_color = Color(1, 1, 0, 0.54902) +gradient = SubResource("Gradient_sx4rn") +texture_mode = 2 +joint_mode = 2 + +[node name="DamageOutputLabel" type="Label" parent="spaceship/Laser1"] +offset_left = 18.0 +offset_top = -71.0 +offset_right = 104.0 +offset_bottom = -20.0 + +[node name="WeaponsSystem" type="Node" parent="spaceship"] +script = ExtResource("5_gf6oh") + +[node name="HardPoint1" type="Node2D" parent="spaceship"] +position = Vector2(0, -46) +script = ExtResource("7_6cr6a") + +[node name="asteroid" type="StaticBody2D" parent="."] +position = Vector2(564, 144) +collision_mask = 2 +script = ExtResource("6_n4dsl") + +[node name="Sprite2D" type="Sprite2D" parent="asteroid"] +position = Vector2(1.00006, -3.99998) +scale = Vector2(1.2, 1.181) +texture = ExtResource("7_0tjls") + +[node name="AsteroidCollisionPolygon2D" type="CollisionPolygon2D" parent="asteroid"] +position = Vector2(-519, -164) +polygon = PackedVector2Array(548, 101, 613, 169, 597, 210, 548, 240, 462, 221, 431, 184, 434, 133, 497, 90) + +[node name="AsteroidHealthLabel" type="Label" parent="asteroid"] +offset_left = 105.0 +offset_top = 38.0 +offset_right = 181.0 +offset_bottom = 80.0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="asteroid"] +position = Vector2(-2, 1) +shape = SubResource("CircleShape2D_w58nc") + +[node name="asteroid2" type="StaticBody2D" parent="."] +position = Vector2(1405, 413) +script = ExtResource("6_n4dsl") + +[node name="Sprite2D" type="Sprite2D" parent="asteroid2"] +position = Vector2(1.00006, -3.99998) +scale = Vector2(1.2, 1.181) +texture = ExtResource("7_0tjls") + +[node name="AsteroidCollisionPolygon2D" type="CollisionPolygon2D" parent="asteroid2"] +position = Vector2(-519, -164) +polygon = PackedVector2Array(548, 101, 613, 169, 597, 210, 548, 240, 462, 221, 431, 184, 434, 133, 497, 90) + +[node name="AsteroidHealthLabel" type="Label" parent="asteroid2"] +offset_left = 105.0 +offset_top = 38.0 +offset_right = 181.0 +offset_bottom = 80.0 diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..a8a4f4b --- /dev/null +++ b/project.godot @@ -0,0 +1,34 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="Star Cheese - The Final Fromage" +run/main_scene="res://main.tscn" +config/features=PackedStringArray("4.2", "Forward Plus") +config/icon="res://icon.svg" + +[display] + +window/size/viewport_width=1920 +window/size/viewport_height=1080 + +[input] + +ui_fire={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"echo":false,"script":null) +] +} + +[layer_names] + +2d_physics/layer_1="Environment" +2d_physics/layer_2="Player" diff --git a/spaceship.gd b/spaceship.gd new file mode 100644 index 0000000..0a67e16 --- /dev/null +++ b/spaceship.gd @@ -0,0 +1,57 @@ +extends CharacterBody2D + +@export var acceleration: float = 400.0 +@export var max_speed: float = 1500.0 +@export var rotation_speed: float = 3.0 +@export var friction: float = 0.99 + +signal fire # Signal to start firing +signal stop_fire # Signal to stop firing + +var weapons_system + +func _ready(): + weapons_system = $WeaponsSystem + +func get_spaceship_orientation_vector() -> Vector2: + return -global_transform.y + +func handle_movement(delta: float) -> void: + var thrust = Vector2.ZERO + + if Input.is_action_pressed("ui_up"): + thrust = Vector2(0, -1).rotated(rotation) * acceleration * delta + velocity += thrust + + if Input.is_action_pressed("ui_down"): + thrust = Vector2(0, 1).rotated(rotation) * acceleration * delta + velocity += thrust + + if Input.is_action_pressed("ui_left"): + rotation -= rotation_speed * delta + + if Input.is_action_pressed("ui_right"): + rotation += rotation_speed * delta + + # Clamp velocity and apply friction + velocity = velocity.clamp(Vector2(-max_speed, -max_speed), Vector2(max_speed, max_speed)) + velocity *= friction + + var collision = move_and_collide(velocity * delta) + + if collision: + print("Collided with: ", collision.get_collider().name) + + var collision_normal = collision.get_normal() + velocity = velocity.slide(collision_normal) + +func handle_weapons_input() -> void: + if Input.is_action_pressed("ui_fire"): + weapons_system.fire_all() + + if Input.is_action_just_released("ui_fire"): + weapons_system.cease_fire_all() + +func _process(delta: float) -> void: + handle_movement(delta) + handle_weapons_input() diff --git a/weapons_system.gd b/weapons_system.gd new file mode 100644 index 0000000..4050259 --- /dev/null +++ b/weapons_system.gd @@ -0,0 +1,15 @@ +extends Node + +var weapons = [] + + +func _ready(): + pass + + +func fire_all(): + get_tree().call_group("weapons", "fire") + + +func cease_fire_all(): + get_tree().call_group("weapons", "cease_fire")