├── README.md ├── client ├── AGENCYB.TTF ├── assets │ ├── AGENCYB.TTF │ ├── back.png │ ├── back.png.import │ ├── laserGreen08.png │ ├── laserGreen08.png.import │ ├── laserRed04.png │ ├── laserRed04.png.import │ ├── progress.png │ ├── progress.png.import │ ├── simpleSpace_tilesheet@2.png │ ├── simpleSpace_tilesheet@2.png.import │ ├── spritesheet_characters.png │ ├── spritesheet_characters.png.import │ ├── star_tiny.png │ ├── star_tiny.png.import │ ├── tiles.png │ ├── tiles.png.import │ ├── tilesheet_complete.png │ └── tilesheet_complete.png.import ├── classes │ └── bullets.gd ├── default_env.tres ├── export_presets.cfg ├── global.gd ├── icon.png ├── icon.png.import ├── nodes.gd ├── objects │ ├── coin.gd │ ├── coin.tscn │ ├── otherplayer.gd │ ├── otherplayer.tscn │ ├── otherplayerbullet.gd │ ├── otherplayerbullet.tscn │ ├── otherplayers.gd │ ├── otherplayers.tscn │ ├── player.gd │ ├── player.tscn │ ├── playerbullet.gd │ └── playerbullet.tscn ├── project.godot ├── scenes │ ├── Lobby.gd │ ├── Lobby.tscn │ ├── lobby.gd │ ├── lobby.tscn │ ├── map.gd │ ├── map.tscn │ └── map1.tscn ├── server.gd └── singletons │ ├── global.gd │ ├── persistent_nodes.gd │ └── server.gd └── server ├── Server.gd ├── Server.tscn ├── default_env.tres ├── export_presets.cfg ├── icon.png ├── icon.png.import ├── project.godot ├── server.gd └── server.tscn /README.md: -------------------------------------------------------------------------------- 1 |

Godot dedicated multiplayer

2 | In this tutorial series on youtube, I make a godot multiplayer game and hosted the server on a VPS
3 | Playlist: https://www.youtube.com/playlist?list=PLylNHWOqRhsGCmeOcKOPnbMRKSNqqQycM 4 | -------------------------------------------------------------------------------- /client/AGENCYB.TTF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daviesdevyt/dedicated-server-multiplayer/7fdb502ad58267972e589528df7f1fdab31570f9/client/AGENCYB.TTF -------------------------------------------------------------------------------- /client/assets/AGENCYB.TTF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daviesdevyt/dedicated-server-multiplayer/7fdb502ad58267972e589528df7f1fdab31570f9/client/assets/AGENCYB.TTF -------------------------------------------------------------------------------- /client/assets/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daviesdevyt/dedicated-server-multiplayer/7fdb502ad58267972e589528df7f1fdab31570f9/client/assets/back.png -------------------------------------------------------------------------------- /client/assets/back.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/back.png-515119acda62477b1fef7f62900af1e0.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://assets/back.png" 13 | dest_files=[ "res://.import/back.png-515119acda62477b1fef7f62900af1e0.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /client/assets/laserGreen08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daviesdevyt/dedicated-server-multiplayer/7fdb502ad58267972e589528df7f1fdab31570f9/client/assets/laserGreen08.png -------------------------------------------------------------------------------- /client/assets/laserGreen08.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/laserGreen08.png-d16e9cdc04332c1e97e6190628a14c6b.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://assets/laserGreen08.png" 13 | dest_files=[ "res://.import/laserGreen08.png-d16e9cdc04332c1e97e6190628a14c6b.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /client/assets/laserRed04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daviesdevyt/dedicated-server-multiplayer/7fdb502ad58267972e589528df7f1fdab31570f9/client/assets/laserRed04.png -------------------------------------------------------------------------------- /client/assets/laserRed04.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/laserRed04.png-7e062cc3be9d610b85e7e413c06d5e12.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://assets/laserRed04.png" 13 | dest_files=[ "res://.import/laserRed04.png-7e062cc3be9d610b85e7e413c06d5e12.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /client/assets/progress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daviesdevyt/dedicated-server-multiplayer/7fdb502ad58267972e589528df7f1fdab31570f9/client/assets/progress.png -------------------------------------------------------------------------------- /client/assets/progress.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/progress.png-625864ff854e2f127a2e6733d07128c4.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://assets/progress.png" 13 | dest_files=[ "res://.import/progress.png-625864ff854e2f127a2e6733d07128c4.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /client/assets/simpleSpace_tilesheet@2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daviesdevyt/dedicated-server-multiplayer/7fdb502ad58267972e589528df7f1fdab31570f9/client/assets/simpleSpace_tilesheet@2.png -------------------------------------------------------------------------------- /client/assets/simpleSpace_tilesheet@2.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/simpleSpace_tilesheet@2.png-cf5181ac608a1d621d2afffa082db4dd.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://assets/simpleSpace_tilesheet@2.png" 13 | dest_files=[ "res://.import/simpleSpace_tilesheet@2.png-cf5181ac608a1d621d2afffa082db4dd.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=false 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /client/assets/spritesheet_characters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daviesdevyt/dedicated-server-multiplayer/7fdb502ad58267972e589528df7f1fdab31570f9/client/assets/spritesheet_characters.png -------------------------------------------------------------------------------- /client/assets/spritesheet_characters.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/spritesheet_characters.png-3c0c465fcc2845a959d42c5252927ed4.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://assets/spritesheet_characters.png" 13 | dest_files=[ "res://.import/spritesheet_characters.png-3c0c465fcc2845a959d42c5252927ed4.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /client/assets/star_tiny.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daviesdevyt/dedicated-server-multiplayer/7fdb502ad58267972e589528df7f1fdab31570f9/client/assets/star_tiny.png -------------------------------------------------------------------------------- /client/assets/star_tiny.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/star_tiny.png-501d1c1044178117c13e211c7736e808.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://assets/star_tiny.png" 13 | dest_files=[ "res://.import/star_tiny.png-501d1c1044178117c13e211c7736e808.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /client/assets/tiles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daviesdevyt/dedicated-server-multiplayer/7fdb502ad58267972e589528df7f1fdab31570f9/client/assets/tiles.png -------------------------------------------------------------------------------- /client/assets/tiles.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/tiles.png-0d11a4bcdfb48056f67a66da241684a1.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://assets/tiles.png" 13 | dest_files=[ "res://.import/tiles.png-0d11a4bcdfb48056f67a66da241684a1.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /client/assets/tilesheet_complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daviesdevyt/dedicated-server-multiplayer/7fdb502ad58267972e589528df7f1fdab31570f9/client/assets/tilesheet_complete.png -------------------------------------------------------------------------------- /client/assets/tilesheet_complete.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/tilesheet_complete.png-5f14f2929ff3d9b1c136ce3cca4823a1.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://assets/tilesheet_complete.png" 13 | dest_files=[ "res://.import/tilesheet_complete.png-5f14f2929ff3d9b1c136ce3cca4823a1.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /client/classes/bullets.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | class_name Bullet 3 | 4 | 5 | var velocity = Vector2.RIGHT 6 | var player_rot 7 | 8 | export var speed = 1000 9 | 10 | func _ready(): 11 | visible = false 12 | yield(get_tree(), "idle_frame") 13 | velocity = velocity.rotated(player_rot) 14 | rotation = player_rot 15 | visible = true 16 | 17 | 18 | func _process(delta): 19 | global_position += velocity * speed * delta 20 | -------------------------------------------------------------------------------- /client/default_env.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Environment" load_steps=2 format=2] 2 | 3 | [sub_resource type="ProceduralSky" id=1] 4 | 5 | [resource] 6 | background_mode = 2 7 | background_sky = SubResource( 1 ) 8 | -------------------------------------------------------------------------------- /client/export_presets.cfg: -------------------------------------------------------------------------------- 1 | [preset.0] 2 | 3 | name="Windows Desktop" 4 | platform="Windows Desktop" 5 | runnable=true 6 | custom_features="" 7 | export_filter="all_resources" 8 | include_filter="" 9 | exclude_filter="" 10 | export_path="" 11 | script_export_mode=1 12 | script_encryption_key="" 13 | 14 | [preset.0.options] 15 | 16 | custom_template/debug="" 17 | custom_template/release="" 18 | binary_format/64_bits=true 19 | binary_format/embed_pck=false 20 | texture_format/bptc=false 21 | texture_format/s3tc=true 22 | texture_format/etc=false 23 | texture_format/etc2=false 24 | texture_format/no_bptc_fallbacks=true 25 | codesign/enable=false 26 | codesign/identity_type=0 27 | codesign/identity="" 28 | codesign/password="" 29 | codesign/timestamp=true 30 | codesign/timestamp_server_url="" 31 | codesign/digest_algorithm=1 32 | codesign/description="" 33 | codesign/custom_options=PoolStringArray( ) 34 | application/icon="" 35 | application/file_version="" 36 | application/product_version="" 37 | application/company_name="" 38 | application/product_name="" 39 | application/file_description="" 40 | application/copyright="" 41 | application/trademarks="" 42 | -------------------------------------------------------------------------------- /client/global.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | 4 | 5 | func instance_node(node, parent, location): 6 | var node_instance = node.instance() 7 | node_instance.global_position = location 8 | parent.add_child(node_instance) 9 | return node_instance 10 | -------------------------------------------------------------------------------- /client/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daviesdevyt/dedicated-server-multiplayer/7fdb502ad58267972e589528df7f1fdab31570f9/client/icon.png -------------------------------------------------------------------------------- /client/icon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://icon.png" 13 | dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /client/nodes.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | 4 | # Declare member variables here. Examples: 5 | # var a = 2 6 | # var b = "text" 7 | 8 | 9 | # Called when the node enters the scene tree for the first time. 10 | func _ready(): 11 | pass # Replace with function body. 12 | 13 | 14 | # Called every frame. 'delta' is the elapsed time since the previous frame. 15 | #func _process(delta): 16 | # pass 17 | -------------------------------------------------------------------------------- /client/objects/coin.gd: -------------------------------------------------------------------------------- 1 | extends Area2D 2 | 3 | 4 | func _on_coin_body_entered(body): 5 | if body.is_in_group("players"): 6 | Server.rpc_id(1, "collect_coin", name) 7 | -------------------------------------------------------------------------------- /client/objects/coin.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://assets/star_tiny.png" type="Texture" id=1] 4 | [ext_resource path="res://objects/coin.gd" type="Script" id=2] 5 | 6 | [sub_resource type="CircleShape2D" id=1] 7 | radius = 8.06226 8 | 9 | [node name="coin" type="Area2D"] 10 | script = ExtResource( 2 ) 11 | 12 | [node name="sprite" type="Sprite" parent="."] 13 | scale = Vector2( 0.53125, 0.53125 ) 14 | texture = ExtResource( 1 ) 15 | 16 | [node name="collision_shape_2d" type="CollisionShape2D" parent="."] 17 | shape = SubResource( 1 ) 18 | 19 | [connection signal="body_entered" from="." to="." method="_on_coin_body_entered"] 20 | -------------------------------------------------------------------------------- /client/objects/otherplayer.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody2D 2 | 3 | 4 | onready var tween = $Tween 5 | var speed = 200 6 | var puppet_pos = Vector2() 7 | var puppet_rot = 0 8 | var hp = 100 setget set_health 9 | var puppet_vel = Vector2() 10 | 11 | func set_health(value): 12 | hp = value 13 | 14 | func _physics_process(delta): 15 | rotation_degrees = lerp(rotation_degrees, puppet_rot, 15*delta) 16 | 17 | func update_transform(_puppet_pos, _puppet_rot, _puppet_vel): 18 | new_puppet_pos(_puppet_pos) 19 | puppet_rot = _puppet_rot 20 | puppet_vel = _puppet_vel 21 | 22 | func new_puppet_pos(value): 23 | puppet_pos = value 24 | tween.interpolate_property(self, "global_position", global_position, puppet_pos, 0.05) 25 | tween.start() 26 | -------------------------------------------------------------------------------- /client/objects/otherplayer.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://assets/spritesheet_characters.png" type="Texture" id=1] 4 | [ext_resource path="res://objects/otherplayer.gd" type="Script" id=2] 5 | 6 | [sub_resource type="CircleShape2D" id=1] 7 | radius = 16.0312 8 | 9 | [node name="otherplayer" type="KinematicBody2D" groups=["players"]] 10 | script = ExtResource( 2 ) 11 | 12 | [node name="shape" type="CollisionShape2D" parent="."] 13 | position = Vector2( -10, 0 ) 14 | shape = SubResource( 1 ) 15 | 16 | [node name="Sprite" type="Sprite" parent="."] 17 | texture = ExtResource( 1 ) 18 | region_enabled = true 19 | region_rect = Rect2( -1, 87, 58, 45 ) 20 | 21 | [node name="Tween" type="Tween" parent="."] 22 | -------------------------------------------------------------------------------- /client/objects/otherplayerbullet.gd: -------------------------------------------------------------------------------- 1 | extends Bullet 2 | 3 | 4 | func _on_hitbox_body_entered(body): 5 | if int(body.name) == get_tree().get_network_unique_id(): 6 | body.damage(25, name) 7 | Server.rpc_id(1, "destroy_bullet", name) 8 | 9 | -------------------------------------------------------------------------------- /client/objects/otherplayerbullet.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://assets/laserRed04.png" type="Texture" id=1] 4 | [ext_resource path="res://objects/otherplayerbullet.gd" type="Script" id=2] 5 | 6 | [sub_resource type="CapsuleShape2D" id=1] 7 | radius = 6.0 8 | height = 26.0 9 | 10 | [node name="otherplayerbullet" type="Node2D"] 11 | script = ExtResource( 2 ) 12 | 13 | [node name="hitbox" type="Area2D" parent="."] 14 | 15 | [node name="CollisionShape2D" type="CollisionShape2D" parent="hitbox"] 16 | rotation = 1.5708 17 | shape = SubResource( 1 ) 18 | 19 | [node name="Sprite" type="Sprite" parent="."] 20 | rotation = 1.5708 21 | texture = ExtResource( 1 ) 22 | 23 | [connection signal="body_entered" from="hitbox" to="." method="_on_hitbox_body_entered"] 24 | -------------------------------------------------------------------------------- /client/objects/otherplayers.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody2D 2 | 3 | onready var tween = $tween 4 | var speed = 200 5 | var puppet_pos = Vector2() 6 | var puppet_rot = 0 7 | var puppet_vel = Vector2() 8 | var hp = 100 setget new_hp 9 | 10 | func new_hp(new_value): 11 | hp = new_value 12 | 13 | func update_transform(_puppet_pos, _puppet_rot, _puppet_vel): 14 | new_puppet_pos(_puppet_pos) 15 | puppet_rot = _puppet_rot 16 | puppet_vel = _puppet_vel 17 | 18 | func _physics_process(delta): 19 | rotation_degrees = lerp(rotation_degrees, puppet_rot, 15*delta) 20 | if not tween.is_active(): 21 | move_and_slide(puppet_vel*speed) 22 | 23 | func new_puppet_pos(value): 24 | puppet_pos = value 25 | 26 | tween.interpolate_property(self, "global_position", global_position, puppet_pos, 0.05) 27 | tween.start() 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /client/objects/otherplayers.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://assets/spritesheet_characters.png" type="Texture" id=1] 4 | [ext_resource path="res://objects/otherplayers.gd" type="Script" id=2] 5 | 6 | [sub_resource type="CircleShape2D" id=1] 7 | radius = 19.8678 8 | 9 | [node name="otherplayers" type="KinematicBody2D" groups=["players"]] 10 | script = ExtResource( 2 ) 11 | 12 | [node name="shape" type="CollisionShape2D" parent="."] 13 | position = Vector2( 2.5, -10.7556 ) 14 | shape = SubResource( 1 ) 15 | 16 | [node name="muzzle" type="Position2D" parent="."] 17 | position = Vector2( 49, 0 ) 18 | 19 | [node name="tween" type="Tween" parent="."] 20 | 21 | [node name="Sprite" type="Sprite" parent="."] 22 | position = Vector2( 11, 0 ) 23 | scale = Vector2( 1.01786, 1.14583 ) 24 | texture = ExtResource( 1 ) 25 | offset = Vector2( 0, -10 ) 26 | region_enabled = true 27 | region_rect = Rect2( -2, 87, 59, 45 ) 28 | -------------------------------------------------------------------------------- /client/objects/player.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody2D 2 | 3 | 4 | var velocity = Vector2() 5 | var speed = 200 6 | var can_shoot = true 7 | var hp = 100 setget set_health 8 | 9 | func set_health(value): 10 | hp = value 11 | 12 | func _physics_process(delta): 13 | var x = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left") 14 | var y = Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up") 15 | velocity = Vector2(x, y).normalized() 16 | move_and_slide(velocity * speed) 17 | look_at(get_global_mouse_position()) 18 | 19 | if can_shoot and Input.is_action_pressed("ui_select"): 20 | Server.rpc_id(1, "instance_bullet", rotation, $muzzle.global_position) 21 | can_shoot = false 22 | yield(get_tree().create_timer(0.3), "timeout") 23 | can_shoot = true 24 | 25 | func _on_Timer_timeout(): 26 | Server.rpc_unreliable_id(1, "update_transform", global_position, rotation_degrees, velocity) 27 | 28 | func damage(value, bullet_name): 29 | hp -= value 30 | if hp <= 0: 31 | 32 | var killer = "" 33 | for i in range(len(bullet_name)-6): 34 | if bullet_name[6+i].is_valid_integer(): 35 | killer += bullet_name[6+i] 36 | else: break 37 | Server.rpc_id(1, "player_killed", killer) 38 | else: 39 | Server.rpc_id(1, "player_damaged", hp) 40 | -------------------------------------------------------------------------------- /client/objects/player.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://assets/spritesheet_characters.png" type="Texture" id=1] 4 | [ext_resource path="res://objects/player.gd" type="Script" id=2] 5 | 6 | [sub_resource type="CircleShape2D" id=1] 7 | radius = 16.0312 8 | 9 | [node name="player" type="KinematicBody2D" groups=["players"]] 10 | script = ExtResource( 2 ) 11 | 12 | [node name="shape" type="CollisionShape2D" parent="."] 13 | position = Vector2( -10, 0 ) 14 | shape = SubResource( 1 ) 15 | 16 | [node name="Sprite" type="Sprite" parent="."] 17 | texture = ExtResource( 1 ) 18 | region_enabled = true 19 | region_rect = Rect2( -1.63501, 175, 57, 49 ) 20 | 21 | [node name="Timer" type="Timer" parent="."] 22 | wait_time = 0.03 23 | autostart = true 24 | 25 | [node name="muzzle" type="Position2D" parent="."] 26 | position = Vector2( 27, 7 ) 27 | 28 | [connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"] 29 | -------------------------------------------------------------------------------- /client/objects/playerbullet.gd: -------------------------------------------------------------------------------- 1 | extends Bullet 2 | 3 | 4 | func _on_Timer_timeout(): 5 | Server.rpc_id(1, "destroy_bullet", name) 6 | 7 | 8 | func _on_hitbox_body_entered(body): 9 | _on_Timer_timeout() 10 | -------------------------------------------------------------------------------- /client/objects/playerbullet.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://assets/laserGreen08.png" type="Texture" id=1] 4 | [ext_resource path="res://objects/playerbullet.gd" type="Script" id=2] 5 | 6 | [sub_resource type="CapsuleShape2D" id=1] 7 | radius = 6.0 8 | height = 26.0 9 | 10 | [node name="playerbullet" type="Node2D"] 11 | script = ExtResource( 2 ) 12 | 13 | [node name="hitbox" type="Area2D" parent="."] 14 | 15 | [node name="CollisionShape2D" type="CollisionShape2D" parent="hitbox"] 16 | rotation = 1.5708 17 | shape = SubResource( 1 ) 18 | 19 | [node name="Sprite" type="Sprite" parent="."] 20 | rotation = 1.5708 21 | texture = ExtResource( 1 ) 22 | 23 | [node name="Timer" type="Timer" parent="."] 24 | wait_time = 5.0 25 | autostart = true 26 | 27 | [connection signal="body_entered" from="hitbox" to="." method="_on_hitbox_body_entered"] 28 | [connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"] 29 | -------------------------------------------------------------------------------- /client/project.godot: -------------------------------------------------------------------------------- 1 | ; Engine configuration file. 2 | ; It's best edited using the editor UI and not directly, 3 | ; since the parameters that go here are not all obvious. 4 | ; 5 | ; Format: 6 | ; [section] ; section goes between [] 7 | ; param=value ; assign values to parameters 8 | 9 | config_version=4 10 | 11 | _global_script_classes=[ { 12 | "base": "Node2D", 13 | "class": "Bullet", 14 | "language": "GDScript", 15 | "path": "res://classes/bullets.gd" 16 | } ] 17 | _global_script_class_icons={ 18 | "Bullet": "" 19 | } 20 | 21 | [application] 22 | 23 | config/name="client" 24 | run/main_scene="res://scenes/lobby.tscn" 25 | config/icon="res://icon.png" 26 | 27 | [autoload] 28 | 29 | Server="*res://server.gd" 30 | Global="*res://global.gd" 31 | Nodes="*res://nodes.gd" 32 | 33 | [display] 34 | 35 | window/stretch/mode="2d" 36 | window/stretch/aspect="keep" 37 | 38 | [physics] 39 | 40 | common/enable_pause_aware_picking=true 41 | 42 | [rendering] 43 | 44 | environment/default_environment="res://default_env.tres" 45 | -------------------------------------------------------------------------------- /client/scenes/Lobby.gd: -------------------------------------------------------------------------------- 1 | extends Control 2 | 3 | 4 | func _on_join_pressed(): 5 | hide() 6 | Server.join_server() 7 | 8 | 9 | -------------------------------------------------------------------------------- /client/scenes/Lobby.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=8 format=2] 2 | 3 | [ext_resource path="res://AGENCYB.TTF" type="DynamicFontData" id=1] 4 | [ext_resource path="res://scenes/Lobby.gd" type="Script" id=2] 5 | 6 | [sub_resource type="StyleBoxFlat" id=1] 7 | bg_color = Color( 0.203922, 0.352941, 0.286275, 1 ) 8 | border_width_left = 5 9 | border_width_top = 5 10 | border_width_right = 5 11 | border_width_bottom = 5 12 | corner_radius_top_left = 10 13 | corner_radius_top_right = 10 14 | corner_radius_bottom_right = 10 15 | corner_radius_bottom_left = 10 16 | 17 | [sub_resource type="Theme" id=2] 18 | Button/colors/font_color = Color( 0.88, 0.88, 0.88, 1 ) 19 | Button/colors/font_color_disabled = Color( 0.9, 0.9, 0.9, 0.2 ) 20 | Button/colors/font_color_hover = Color( 0.94, 0.94, 0.94, 1 ) 21 | Button/colors/font_color_pressed = Color( 1, 1, 1, 1 ) 22 | Button/constants/hseparation = 2 23 | Button/fonts/font = null 24 | Button/styles/disabled = null 25 | Button/styles/focus = null 26 | Button/styles/hover = SubResource( 1 ) 27 | Button/styles/normal = SubResource( 1 ) 28 | Button/styles/pressed = SubResource( 1 ) 29 | 30 | [sub_resource type="DynamicFont" id=3] 31 | size = 30 32 | font_data = ExtResource( 1 ) 33 | 34 | [sub_resource type="DynamicFont" id=4] 35 | size = 100 36 | font_data = ExtResource( 1 ) 37 | 38 | [sub_resource type="DynamicFont" id=5] 39 | size = 50 40 | font_data = ExtResource( 1 ) 41 | 42 | [node name="Lobby" type="Control"] 43 | anchor_right = 1.0 44 | anchor_bottom = 1.0 45 | theme = SubResource( 2 ) 46 | script = ExtResource( 2 ) 47 | 48 | [node name="color_rect" type="ColorRect" parent="."] 49 | anchor_right = 1.0 50 | anchor_bottom = 1.0 51 | color = Color( 0.168627, 0.337255, 0.513726, 1 ) 52 | 53 | [node name="join" type="Button" parent="."] 54 | anchor_left = 0.5 55 | anchor_top = 0.5 56 | anchor_right = 0.5 57 | anchor_bottom = 0.5 58 | margin_left = -222.0 59 | margin_top = 33.0 60 | margin_right = 215.0 61 | margin_bottom = 92.0 62 | rect_pivot_offset = Vector2( 59, 30 ) 63 | custom_fonts/font = SubResource( 3 ) 64 | text = "Join game" 65 | 66 | [node name="label" type="Label" parent="."] 67 | anchor_right = 1.0 68 | margin_top = 88.0 69 | margin_bottom = 209.0 70 | rect_pivot_offset = Vector2( 454, 61 ) 71 | custom_fonts/font = SubResource( 4 ) 72 | text = "Multiplayer Game" 73 | align = 1 74 | 75 | [node name="label2" type="Label" parent="."] 76 | anchor_right = 1.0 77 | margin_top = 228.0 78 | margin_bottom = 289.0 79 | rect_pivot_offset = Vector2( 454, 61 ) 80 | custom_fonts/font = SubResource( 5 ) 81 | text = "Dedicated Server Game" 82 | align = 1 83 | [connection signal="pressed" from="join" to="." method="_on_join_pressed"] 84 | -------------------------------------------------------------------------------- /client/scenes/lobby.gd: -------------------------------------------------------------------------------- 1 | extends Control 2 | 3 | 4 | func _on_join_pressed(): 5 | Server.join_server() 6 | $join.disabled = true 7 | -------------------------------------------------------------------------------- /client/scenes/lobby.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://scenes/lobby.gd" type="Script" id=1] 4 | [ext_resource path="res://assets/AGENCYB.TTF" type="DynamicFontData" id=2] 5 | 6 | [sub_resource type="DynamicFont" id=1] 7 | size = 50 8 | font_data = ExtResource( 2 ) 9 | 10 | [node name="lobby" type="Control"] 11 | anchor_right = 1.0 12 | anchor_bottom = 1.0 13 | script = ExtResource( 1 ) 14 | 15 | [node name="ColorRect" type="ColorRect" parent="."] 16 | anchor_right = 1.0 17 | anchor_bottom = 1.0 18 | color = Color( 0, 0.439216, 0.631373, 1 ) 19 | 20 | [node name="join" type="Button" parent="."] 21 | margin_left = 277.0 22 | margin_top = 308.0 23 | margin_right = 776.0 24 | margin_bottom = 399.0 25 | custom_fonts/font = SubResource( 1 ) 26 | text = "Join game" 27 | [connection signal="pressed" from="join" to="." method="_on_join_pressed"] 28 | -------------------------------------------------------------------------------- /client/scenes/map.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | 4 | func update_kills(kills): 5 | $CanvasLayer/kills/count.text = str(kills) 6 | 7 | func update_highest(kills): 8 | $CanvasLayer/highestkills/count.text = str(kills) 9 | -------------------------------------------------------------------------------- /client/scenes/map.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=53 format=2] 2 | 3 | [ext_resource path="res://assets/tilesheet_complete.png" type="Texture" id=1] 4 | [ext_resource path="res://assets/AGENCYB.TTF" type="DynamicFontData" id=2] 5 | [ext_resource path="res://scenes/map.gd" type="Script" id=3] 6 | 7 | [sub_resource type="ConvexPolygonShape2D" id=1] 8 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 9 | 10 | [sub_resource type="ConvexPolygonShape2D" id=2] 11 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 12 | 13 | [sub_resource type="ConvexPolygonShape2D" id=3] 14 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 15 | 16 | [sub_resource type="ConvexPolygonShape2D" id=4] 17 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 18 | 19 | [sub_resource type="ConvexPolygonShape2D" id=5] 20 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 21 | 22 | [sub_resource type="ConvexPolygonShape2D" id=6] 23 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 24 | 25 | [sub_resource type="ConvexPolygonShape2D" id=7] 26 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 27 | 28 | [sub_resource type="ConvexPolygonShape2D" id=8] 29 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 30 | 31 | [sub_resource type="ConvexPolygonShape2D" id=9] 32 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 33 | 34 | [sub_resource type="ConvexPolygonShape2D" id=10] 35 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 36 | 37 | [sub_resource type="ConvexPolygonShape2D" id=11] 38 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 39 | 40 | [sub_resource type="ConvexPolygonShape2D" id=12] 41 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 42 | 43 | [sub_resource type="ConvexPolygonShape2D" id=13] 44 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 45 | 46 | [sub_resource type="ConvexPolygonShape2D" id=14] 47 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 48 | 49 | [sub_resource type="ConvexPolygonShape2D" id=15] 50 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 51 | 52 | [sub_resource type="ConvexPolygonShape2D" id=16] 53 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 54 | 55 | [sub_resource type="ConvexPolygonShape2D" id=17] 56 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 57 | 58 | [sub_resource type="ConvexPolygonShape2D" id=18] 59 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 60 | 61 | [sub_resource type="ConvexPolygonShape2D" id=19] 62 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 63 | 64 | [sub_resource type="ConvexPolygonShape2D" id=20] 65 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 66 | 67 | [sub_resource type="ConvexPolygonShape2D" id=21] 68 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 69 | 70 | [sub_resource type="ConvexPolygonShape2D" id=22] 71 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 72 | 73 | [sub_resource type="ConvexPolygonShape2D" id=23] 74 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 75 | 76 | [sub_resource type="ConvexPolygonShape2D" id=24] 77 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 78 | 79 | [sub_resource type="ConvexPolygonShape2D" id=25] 80 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 81 | 82 | [sub_resource type="ConvexPolygonShape2D" id=26] 83 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 84 | 85 | [sub_resource type="ConvexPolygonShape2D" id=27] 86 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 87 | 88 | [sub_resource type="ConvexPolygonShape2D" id=28] 89 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 90 | 91 | [sub_resource type="ConvexPolygonShape2D" id=29] 92 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 93 | 94 | [sub_resource type="ConvexPolygonShape2D" id=30] 95 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 96 | 97 | [sub_resource type="ConvexPolygonShape2D" id=31] 98 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 99 | 100 | [sub_resource type="ConvexPolygonShape2D" id=32] 101 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 102 | 103 | [sub_resource type="ConvexPolygonShape2D" id=33] 104 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 105 | 106 | [sub_resource type="ConvexPolygonShape2D" id=34] 107 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 108 | 109 | [sub_resource type="ConvexPolygonShape2D" id=35] 110 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 111 | 112 | [sub_resource type="ConvexPolygonShape2D" id=36] 113 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 114 | 115 | [sub_resource type="ConvexPolygonShape2D" id=37] 116 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 117 | 118 | [sub_resource type="ConvexPolygonShape2D" id=38] 119 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 120 | 121 | [sub_resource type="ConvexPolygonShape2D" id=39] 122 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 123 | 124 | [sub_resource type="ConvexPolygonShape2D" id=40] 125 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 126 | 127 | [sub_resource type="ConvexPolygonShape2D" id=41] 128 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 129 | 130 | [sub_resource type="ConvexPolygonShape2D" id=42] 131 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 132 | 133 | [sub_resource type="ConvexPolygonShape2D" id=43] 134 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 135 | 136 | [sub_resource type="ConvexPolygonShape2D" id=44] 137 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 138 | 139 | [sub_resource type="ConvexPolygonShape2D" id=45] 140 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 141 | 142 | [sub_resource type="ConvexPolygonShape2D" id=46] 143 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 144 | 145 | [sub_resource type="ConvexPolygonShape2D" id=47] 146 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 147 | 148 | [sub_resource type="TileSet" id=48] 149 | 0/name = "tilesheet_complete.png 0" 150 | 0/texture = ExtResource( 1 ) 151 | 0/tex_offset = Vector2( 0, 0 ) 152 | 0/modulate = Color( 1, 1, 1, 1 ) 153 | 0/region = Rect2( 0, 256, 576, 384 ) 154 | 0/tile_mode = 1 155 | 0/autotile/bitmask_mode = 1 156 | 0/autotile/bitmask_flags = [ Vector2( 0, 0 ), 176, Vector2( 0, 1 ), 50, Vector2( 0, 2 ), 255, Vector2( 0, 3 ), 507, Vector2( 0, 4 ), 442, Vector2( 0, 5 ), 190, Vector2( 1, 0 ), 152, Vector2( 1, 1 ), 26, Vector2( 1, 2 ), 447, Vector2( 1, 3 ), 510, Vector2( 1, 4 ), 250, Vector2( 1, 5 ), 187, Vector2( 2, 0 ), 56, Vector2( 2, 1 ), 146, Vector2( 2, 2 ), 191, Vector2( 2, 3 ), 251, Vector2( 2, 4 ), 434, Vector2( 2, 5 ), 182, Vector2( 3, 0 ), 184, Vector2( 3, 1 ), 178, Vector2( 3, 2 ), 506, Vector2( 3, 3 ), 446, Vector2( 3, 4 ), 218, Vector2( 3, 5 ), 155, Vector2( 4, 0 ), 58, Vector2( 4, 1 ), 154, Vector2( 4, 2 ), 438, Vector2( 4, 3 ), 504, Vector2( 4, 4 ), 440, Vector2( 4, 5 ), 62, Vector2( 5, 0 ), 24, Vector2( 5, 1 ), 144, Vector2( 5, 2 ), 219, Vector2( 5, 3 ), 63, Vector2( 5, 4 ), 248, Vector2( 5, 5 ), 59, Vector2( 6, 0 ), 18, Vector2( 6, 1 ), 48, Vector2( 6, 3 ), 16, Vector2( 6, 4 ), 443, Vector2( 6, 5 ), 254, Vector2( 7, 0 ), 432, Vector2( 7, 1 ), 54, Vector2( 7, 2 ), 186, Vector2( 8, 0 ), 216, Vector2( 8, 1 ), 27 ] 157 | 0/autotile/icon_coordinate = Vector2( 6, 3 ) 158 | 0/autotile/tile_size = Vector2( 64, 64 ) 159 | 0/autotile/spacing = 0 160 | 0/autotile/occluder_map = [ ] 161 | 0/autotile/navpoly_map = [ ] 162 | 0/autotile/priority_map = [ ] 163 | 0/autotile/z_index_map = [ ] 164 | 0/occluder_offset = Vector2( 0, 0 ) 165 | 0/navigation_offset = Vector2( 0, 0 ) 166 | 0/shape_offset = Vector2( 0, 0 ) 167 | 0/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) 168 | 0/shape = SubResource( 1 ) 169 | 0/shape_one_way = false 170 | 0/shape_one_way_margin = 1.0 171 | 0/shapes = [ { 172 | "autotile_coord": Vector2( 6, 0 ), 173 | "one_way": false, 174 | "one_way_margin": 1.0, 175 | "shape": SubResource( 1 ), 176 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 177 | }, { 178 | "autotile_coord": Vector2( 1, 0 ), 179 | "one_way": false, 180 | "one_way_margin": 1.0, 181 | "shape": SubResource( 2 ), 182 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 183 | }, { 184 | "autotile_coord": Vector2( 0, 0 ), 185 | "one_way": false, 186 | "one_way_margin": 1.0, 187 | "shape": SubResource( 3 ), 188 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 189 | }, { 190 | "autotile_coord": Vector2( 2, 0 ), 191 | "one_way": false, 192 | "one_way_margin": 1.0, 193 | "shape": SubResource( 4 ), 194 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 195 | }, { 196 | "autotile_coord": Vector2( 4, 0 ), 197 | "one_way": false, 198 | "one_way_margin": 1.0, 199 | "shape": SubResource( 5 ), 200 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 201 | }, { 202 | "autotile_coord": Vector2( 3, 0 ), 203 | "one_way": false, 204 | "one_way_margin": 1.0, 205 | "shape": SubResource( 6 ), 206 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 207 | }, { 208 | "autotile_coord": Vector2( 4, 1 ), 209 | "one_way": false, 210 | "one_way_margin": 1.0, 211 | "shape": SubResource( 7 ), 212 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 213 | }, { 214 | "autotile_coord": Vector2( 3, 1 ), 215 | "one_way": false, 216 | "one_way_margin": 1.0, 217 | "shape": SubResource( 8 ), 218 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 219 | }, { 220 | "autotile_coord": Vector2( 3, 2 ), 221 | "one_way": false, 222 | "one_way_margin": 1.0, 223 | "shape": SubResource( 9 ), 224 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 225 | }, { 226 | "autotile_coord": Vector2( 5, 1 ), 227 | "one_way": false, 228 | "one_way_margin": 1.0, 229 | "shape": SubResource( 10 ), 230 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 231 | }, { 232 | "autotile_coord": Vector2( 5, 0 ), 233 | "one_way": false, 234 | "one_way_margin": 1.0, 235 | "shape": SubResource( 11 ), 236 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 237 | }, { 238 | "autotile_coord": Vector2( 5, 2 ), 239 | "one_way": false, 240 | "one_way_margin": 1.0, 241 | "shape": SubResource( 12 ), 242 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 243 | }, { 244 | "autotile_coord": Vector2( 4, 2 ), 245 | "one_way": false, 246 | "one_way_margin": 1.0, 247 | "shape": SubResource( 13 ), 248 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 249 | }, { 250 | "autotile_coord": Vector2( 6, 1 ), 251 | "one_way": false, 252 | "one_way_margin": 1.0, 253 | "shape": SubResource( 14 ), 254 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 255 | }, { 256 | "autotile_coord": Vector2( 7, 0 ), 257 | "one_way": false, 258 | "one_way_margin": 1.0, 259 | "shape": SubResource( 15 ), 260 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 261 | }, { 262 | "autotile_coord": Vector2( 8, 0 ), 263 | "one_way": false, 264 | "one_way_margin": 1.0, 265 | "shape": SubResource( 16 ), 266 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 267 | }, { 268 | "autotile_coord": Vector2( 7, 1 ), 269 | "one_way": false, 270 | "one_way_margin": 1.0, 271 | "shape": SubResource( 17 ), 272 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 273 | }, { 274 | "autotile_coord": Vector2( 8, 1 ), 275 | "one_way": false, 276 | "one_way_margin": 1.0, 277 | "shape": SubResource( 18 ), 278 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 279 | }, { 280 | "autotile_coord": Vector2( 0, 1 ), 281 | "one_way": false, 282 | "one_way_margin": 1.0, 283 | "shape": SubResource( 19 ), 284 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 285 | }, { 286 | "autotile_coord": Vector2( 1, 1 ), 287 | "one_way": false, 288 | "one_way_margin": 1.0, 289 | "shape": SubResource( 20 ), 290 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 291 | }, { 292 | "autotile_coord": Vector2( 2, 1 ), 293 | "one_way": false, 294 | "one_way_margin": 1.0, 295 | "shape": SubResource( 21 ), 296 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 297 | }, { 298 | "autotile_coord": Vector2( 1, 2 ), 299 | "one_way": false, 300 | "one_way_margin": 1.0, 301 | "shape": SubResource( 22 ), 302 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 303 | }, { 304 | "autotile_coord": Vector2( 2, 2 ), 305 | "one_way": false, 306 | "one_way_margin": 1.0, 307 | "shape": SubResource( 23 ), 308 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 309 | }, { 310 | "autotile_coord": Vector2( 0, 2 ), 311 | "one_way": false, 312 | "one_way_margin": 1.0, 313 | "shape": SubResource( 24 ), 314 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 315 | }, { 316 | "autotile_coord": Vector2( 0, 3 ), 317 | "one_way": false, 318 | "one_way_margin": 1.0, 319 | "shape": SubResource( 25 ), 320 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 321 | }, { 322 | "autotile_coord": Vector2( 1, 3 ), 323 | "one_way": false, 324 | "one_way_margin": 1.0, 325 | "shape": SubResource( 26 ), 326 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 327 | }, { 328 | "autotile_coord": Vector2( 2, 3 ), 329 | "one_way": false, 330 | "one_way_margin": 1.0, 331 | "shape": SubResource( 27 ), 332 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 333 | }, { 334 | "autotile_coord": Vector2( 3, 3 ), 335 | "one_way": false, 336 | "one_way_margin": 1.0, 337 | "shape": SubResource( 28 ), 338 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 339 | }, { 340 | "autotile_coord": Vector2( 4, 3 ), 341 | "one_way": false, 342 | "one_way_margin": 1.0, 343 | "shape": SubResource( 29 ), 344 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 345 | }, { 346 | "autotile_coord": Vector2( 5, 3 ), 347 | "one_way": false, 348 | "one_way_margin": 1.0, 349 | "shape": SubResource( 30 ), 350 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 351 | }, { 352 | "autotile_coord": Vector2( 5, 4 ), 353 | "one_way": false, 354 | "one_way_margin": 1.0, 355 | "shape": SubResource( 31 ), 356 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 357 | }, { 358 | "autotile_coord": Vector2( 6, 4 ), 359 | "one_way": false, 360 | "one_way_margin": 1.0, 361 | "shape": SubResource( 32 ), 362 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 363 | }, { 364 | "autotile_coord": Vector2( 7, 2 ), 365 | "one_way": false, 366 | "one_way_margin": 1.0, 367 | "shape": SubResource( 33 ), 368 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 369 | }, { 370 | "autotile_coord": Vector2( 4, 4 ), 371 | "one_way": false, 372 | "one_way_margin": 1.0, 373 | "shape": SubResource( 34 ), 374 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 375 | }, { 376 | "autotile_coord": Vector2( 5, 5 ), 377 | "one_way": false, 378 | "one_way_margin": 1.0, 379 | "shape": SubResource( 35 ), 380 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 381 | }, { 382 | "autotile_coord": Vector2( 5, 5 ), 383 | "one_way": false, 384 | "one_way_margin": 1.0, 385 | "shape": SubResource( 36 ), 386 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 387 | }, { 388 | "autotile_coord": Vector2( 6, 5 ), 389 | "one_way": false, 390 | "one_way_margin": 1.0, 391 | "shape": SubResource( 37 ), 392 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 393 | }, { 394 | "autotile_coord": Vector2( 4, 5 ), 395 | "one_way": false, 396 | "one_way_margin": 1.0, 397 | "shape": SubResource( 38 ), 398 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 399 | }, { 400 | "autotile_coord": Vector2( 3, 5 ), 401 | "one_way": false, 402 | "one_way_margin": 1.0, 403 | "shape": SubResource( 39 ), 404 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 405 | }, { 406 | "autotile_coord": Vector2( 3, 4 ), 407 | "one_way": false, 408 | "one_way_margin": 1.0, 409 | "shape": SubResource( 40 ), 410 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 411 | }, { 412 | "autotile_coord": Vector2( 2, 4 ), 413 | "one_way": false, 414 | "one_way_margin": 1.0, 415 | "shape": SubResource( 41 ), 416 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 417 | }, { 418 | "autotile_coord": Vector2( 2, 5 ), 419 | "one_way": false, 420 | "one_way_margin": 1.0, 421 | "shape": SubResource( 42 ), 422 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 423 | }, { 424 | "autotile_coord": Vector2( 1, 5 ), 425 | "one_way": false, 426 | "one_way_margin": 1.0, 427 | "shape": SubResource( 43 ), 428 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 429 | }, { 430 | "autotile_coord": Vector2( 1, 4 ), 431 | "one_way": false, 432 | "one_way_margin": 1.0, 433 | "shape": SubResource( 44 ), 434 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 435 | }, { 436 | "autotile_coord": Vector2( 0, 4 ), 437 | "one_way": false, 438 | "one_way_margin": 1.0, 439 | "shape": SubResource( 45 ), 440 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 441 | }, { 442 | "autotile_coord": Vector2( 0, 5 ), 443 | "one_way": false, 444 | "one_way_margin": 1.0, 445 | "shape": SubResource( 46 ), 446 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 447 | }, { 448 | "autotile_coord": Vector2( 6, 3 ), 449 | "one_way": false, 450 | "one_way_margin": 1.0, 451 | "shape": SubResource( 47 ), 452 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 453 | } ] 454 | 0/z_index = 0 455 | 456 | [sub_resource type="DynamicFont" id=49] 457 | size = 40 458 | font_data = ExtResource( 2 ) 459 | 460 | [node name="map" type="Node2D"] 461 | script = ExtResource( 3 ) 462 | 463 | [node name="ColorRect" type="ColorRect" parent="."] 464 | margin_right = 1024.0 465 | margin_bottom = 600.0 466 | color = Color( 0.117647, 0.231373, 0.329412, 1 ) 467 | 468 | [node name="TileMap" type="TileMap" parent="."] 469 | tile_set = SubResource( 48 ) 470 | format = 1 471 | tile_data = PoolIntArray( 0, 0, 0, 1, 0, 2, 2, 0, 2, 3, 0, 2, 4, 0, 2, 5, 0, 2, 6, 0, 2, 7, 0, 2, 8, 0, 2, 9, 0, 2, 10, 0, 2, 11, 0, 2, 12, 0, 2, 13, 0, 2, 14, 0, 2, 15, 0, 1, 65536, 0, 65538, 65551, 0, 65538, 131072, 0, 65538, 131074, 0, 196614, 131087, 0, 65538, 196608, 0, 65538, 196615, 0, 0, 196616, 0, 5, 196620, 0, 196614, 196623, 0, 65538, 262144, 0, 65538, 262148, 0, 0, 262149, 0, 2, 262150, 0, 2, 262151, 0, 65537, 262157, 0, 65541, 262159, 0, 65538, 327680, 0, 65538, 327684, 0, 6, 327693, 0, 65538, 327695, 0, 65538, 393216, 0, 65538, 393223, 0, 65541, 393229, 0, 65538, 393231, 0, 65538, 458752, 0, 65538, 458756, 0, 65542, 458757, 0, 2, 458758, 0, 2, 458759, 0, 65537, 458765, 0, 6, 458767, 0, 65538, 524288, 0, 65538, 524303, 0, 65538, 589824, 0, 65536, 589825, 0, 2, 589826, 0, 2, 589827, 0, 2, 589828, 0, 2, 589829, 0, 2, 589830, 0, 2, 589831, 0, 2, 589832, 0, 2, 589833, 0, 2, 589834, 0, 2, 589835, 0, 2, 589836, 0, 2, 589837, 0, 2, 589838, 0, 2, 589839, 0, 65537 ) 472 | 473 | [node name="failed" type="ColorRect" parent="."] 474 | visible = false 475 | margin_right = 1042.0 476 | margin_bottom = 622.0 477 | color = Color( 0, 0, 0, 0.388235 ) 478 | 479 | [node name="Label" type="Label" parent="failed"] 480 | margin_left = 345.0 481 | margin_top = 281.0 482 | margin_right = 659.0 483 | margin_bottom = 338.0 484 | custom_fonts/font = SubResource( 49 ) 485 | text = "Respawn in 3 seconds ....." 486 | 487 | [node name="CanvasLayer" type="CanvasLayer" parent="."] 488 | 489 | [node name="kills" type="Label" parent="CanvasLayer"] 490 | margin_left = 77.0 491 | margin_top = 65.0 492 | margin_right = 141.0 493 | margin_bottom = 122.0 494 | custom_fonts/font = SubResource( 49 ) 495 | text = "Kills:" 496 | 497 | [node name="count" type="Label" parent="CanvasLayer/kills"] 498 | margin_left = 70.0 499 | margin_top = -1.0 500 | margin_right = 134.0 501 | margin_bottom = 56.0 502 | custom_fonts/font = SubResource( 49 ) 503 | text = "0" 504 | 505 | [node name="highestkills" type="Label" parent="CanvasLayer"] 506 | margin_left = 405.0 507 | margin_top = 65.0 508 | margin_right = 514.0 509 | margin_bottom = 122.0 510 | custom_fonts/font = SubResource( 49 ) 511 | text = "Highest:" 512 | 513 | [node name="count" type="Label" parent="CanvasLayer/highestkills"] 514 | margin_left = 116.0 515 | margin_top = -1.0 516 | margin_right = 180.0 517 | margin_bottom = 56.0 518 | custom_fonts/font = SubResource( 49 ) 519 | text = "0" 520 | -------------------------------------------------------------------------------- /client/scenes/map1.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=54 format=2] 2 | 3 | [ext_resource path="res://assets/tilesheet_complete.png" type="Texture" id=1] 4 | [ext_resource path="res://objects/coin.tscn" type="PackedScene" id=2] 5 | [ext_resource path="res://AGENCYB.TTF" type="DynamicFontData" id=3] 6 | 7 | [sub_resource type="ConvexPolygonShape2D" id=1] 8 | points = PoolVector2Array( 0, -128, 64, -128, 64, -128, 0, -128 ) 9 | 10 | [sub_resource type="ConvexPolygonShape2D" id=2] 11 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 12 | 13 | [sub_resource type="ConvexPolygonShape2D" id=3] 14 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 15 | 16 | [sub_resource type="ConvexPolygonShape2D" id=4] 17 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 18 | 19 | [sub_resource type="ConvexPolygonShape2D" id=5] 20 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 21 | 22 | [sub_resource type="ConvexPolygonShape2D" id=6] 23 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 24 | 25 | [sub_resource type="ConvexPolygonShape2D" id=7] 26 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 27 | 28 | [sub_resource type="ConvexPolygonShape2D" id=8] 29 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 30 | 31 | [sub_resource type="ConvexPolygonShape2D" id=9] 32 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 33 | 34 | [sub_resource type="ConvexPolygonShape2D" id=10] 35 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 36 | 37 | [sub_resource type="ConvexPolygonShape2D" id=11] 38 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 39 | 40 | [sub_resource type="ConvexPolygonShape2D" id=12] 41 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 42 | 43 | [sub_resource type="ConvexPolygonShape2D" id=13] 44 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 45 | 46 | [sub_resource type="ConvexPolygonShape2D" id=14] 47 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 48 | 49 | [sub_resource type="ConvexPolygonShape2D" id=15] 50 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 51 | 52 | [sub_resource type="ConvexPolygonShape2D" id=16] 53 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 54 | 55 | [sub_resource type="ConvexPolygonShape2D" id=17] 56 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 57 | 58 | [sub_resource type="ConvexPolygonShape2D" id=18] 59 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 60 | 61 | [sub_resource type="ConvexPolygonShape2D" id=19] 62 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 63 | 64 | [sub_resource type="ConvexPolygonShape2D" id=20] 65 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 66 | 67 | [sub_resource type="ConvexPolygonShape2D" id=21] 68 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 69 | 70 | [sub_resource type="ConvexPolygonShape2D" id=22] 71 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 72 | 73 | [sub_resource type="ConvexPolygonShape2D" id=23] 74 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 75 | 76 | [sub_resource type="ConvexPolygonShape2D" id=24] 77 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 78 | 79 | [sub_resource type="ConvexPolygonShape2D" id=25] 80 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 81 | 82 | [sub_resource type="ConvexPolygonShape2D" id=26] 83 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 84 | 85 | [sub_resource type="ConvexPolygonShape2D" id=27] 86 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 87 | 88 | [sub_resource type="ConvexPolygonShape2D" id=28] 89 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 90 | 91 | [sub_resource type="ConvexPolygonShape2D" id=29] 92 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 93 | 94 | [sub_resource type="ConvexPolygonShape2D" id=30] 95 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 96 | 97 | [sub_resource type="ConvexPolygonShape2D" id=31] 98 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 99 | 100 | [sub_resource type="ConvexPolygonShape2D" id=32] 101 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 102 | 103 | [sub_resource type="ConvexPolygonShape2D" id=33] 104 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 105 | 106 | [sub_resource type="ConvexPolygonShape2D" id=34] 107 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 108 | 109 | [sub_resource type="ConvexPolygonShape2D" id=35] 110 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 111 | 112 | [sub_resource type="ConvexPolygonShape2D" id=36] 113 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 114 | 115 | [sub_resource type="ConvexPolygonShape2D" id=37] 116 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 117 | 118 | [sub_resource type="ConvexPolygonShape2D" id=38] 119 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 120 | 121 | [sub_resource type="ConvexPolygonShape2D" id=39] 122 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 123 | 124 | [sub_resource type="ConvexPolygonShape2D" id=40] 125 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 126 | 127 | [sub_resource type="ConvexPolygonShape2D" id=41] 128 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 129 | 130 | [sub_resource type="ConvexPolygonShape2D" id=42] 131 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 132 | 133 | [sub_resource type="ConvexPolygonShape2D" id=43] 134 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 135 | 136 | [sub_resource type="ConvexPolygonShape2D" id=44] 137 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 138 | 139 | [sub_resource type="ConvexPolygonShape2D" id=45] 140 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 141 | 142 | [sub_resource type="ConvexPolygonShape2D" id=46] 143 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 144 | 145 | [sub_resource type="ConvexPolygonShape2D" id=47] 146 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 147 | 148 | [sub_resource type="ConvexPolygonShape2D" id=48] 149 | points = PoolVector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) 150 | 151 | [sub_resource type="TileSet" id=49] 152 | 0/name = "tilesheet_complete.png 0" 153 | 0/texture = ExtResource( 1 ) 154 | 0/tex_offset = Vector2( 0, 0 ) 155 | 0/modulate = Color( 1, 1, 1, 1 ) 156 | 0/region = Rect2( 0, 256, 576, 384 ) 157 | 0/tile_mode = 1 158 | 0/autotile/bitmask_mode = 1 159 | 0/autotile/bitmask_flags = [ Vector2( 0, 0 ), 176, Vector2( 0, 1 ), 50, Vector2( 0, 2 ), 255, Vector2( 0, 3 ), 507, Vector2( 0, 4 ), 442, Vector2( 0, 5 ), 190, Vector2( 1, 0 ), 152, Vector2( 1, 1 ), 26, Vector2( 1, 2 ), 447, Vector2( 1, 3 ), 510, Vector2( 1, 4 ), 250, Vector2( 1, 5 ), 187, Vector2( 2, 0 ), 56, Vector2( 2, 1 ), 146, Vector2( 2, 2 ), 191, Vector2( 2, 3 ), 251, Vector2( 2, 4 ), 434, Vector2( 2, 5 ), 182, Vector2( 3, 0 ), 184, Vector2( 3, 1 ), 178, Vector2( 3, 2 ), 442, Vector2( 3, 3 ), 446, Vector2( 3, 4 ), 218, Vector2( 3, 5 ), 155, Vector2( 4, 0 ), 58, Vector2( 4, 1 ), 154, Vector2( 4, 2 ), 434, Vector2( 4, 3 ), 504, Vector2( 4, 4 ), 440, Vector2( 4, 5 ), 62, Vector2( 5, 0 ), 24, Vector2( 5, 1 ), 144, Vector2( 5, 2 ), 218, Vector2( 5, 3 ), 63, Vector2( 5, 4 ), 248, Vector2( 5, 5 ), 59, Vector2( 6, 0 ), 18, Vector2( 6, 1 ), 48, Vector2( 6, 2 ), 511, Vector2( 6, 3 ), 16, Vector2( 6, 4 ), 443, Vector2( 6, 5 ), 254, Vector2( 7, 0 ), 432, Vector2( 7, 1 ), 54, Vector2( 7, 2 ), 186, Vector2( 8, 0 ), 216, Vector2( 8, 1 ), 27 ] 160 | 0/autotile/icon_coordinate = Vector2( 6, 3 ) 161 | 0/autotile/tile_size = Vector2( 64, 64 ) 162 | 0/autotile/spacing = 0 163 | 0/autotile/occluder_map = [ ] 164 | 0/autotile/navpoly_map = [ ] 165 | 0/autotile/priority_map = [ ] 166 | 0/autotile/z_index_map = [ ] 167 | 0/occluder_offset = Vector2( 0, 0 ) 168 | 0/navigation_offset = Vector2( 0, 0 ) 169 | 0/shape_offset = Vector2( 0, 0 ) 170 | 0/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) 171 | 0/shape = SubResource( 1 ) 172 | 0/shape_one_way = false 173 | 0/shape_one_way_margin = 1.0 174 | 0/shapes = [ { 175 | "autotile_coord": Vector2( 0, 8 ), 176 | "one_way": false, 177 | "one_way_margin": 1.0, 178 | "shape": SubResource( 1 ), 179 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 180 | }, { 181 | "autotile_coord": Vector2( 0, 0 ), 182 | "one_way": false, 183 | "one_way_margin": 1.0, 184 | "shape": SubResource( 2 ), 185 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 186 | }, { 187 | "autotile_coord": Vector2( 1, 0 ), 188 | "one_way": false, 189 | "one_way_margin": 1.0, 190 | "shape": SubResource( 3 ), 191 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 192 | }, { 193 | "autotile_coord": Vector2( 0, 1 ), 194 | "one_way": false, 195 | "one_way_margin": 1.0, 196 | "shape": SubResource( 4 ), 197 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 198 | }, { 199 | "autotile_coord": Vector2( 1, 1 ), 200 | "one_way": false, 201 | "one_way_margin": 1.0, 202 | "shape": SubResource( 5 ), 203 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 204 | }, { 205 | "autotile_coord": Vector2( 2, 0 ), 206 | "one_way": false, 207 | "one_way_margin": 1.0, 208 | "shape": SubResource( 6 ), 209 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 210 | }, { 211 | "autotile_coord": Vector2( 2, 1 ), 212 | "one_way": false, 213 | "one_way_margin": 1.0, 214 | "shape": SubResource( 7 ), 215 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 216 | }, { 217 | "autotile_coord": Vector2( 3, 0 ), 218 | "one_way": false, 219 | "one_way_margin": 1.0, 220 | "shape": SubResource( 8 ), 221 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 222 | }, { 223 | "autotile_coord": Vector2( 4, 0 ), 224 | "one_way": false, 225 | "one_way_margin": 1.0, 226 | "shape": SubResource( 9 ), 227 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 228 | }, { 229 | "autotile_coord": Vector2( 6, 0 ), 230 | "one_way": false, 231 | "one_way_margin": 1.0, 232 | "shape": SubResource( 10 ), 233 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 234 | }, { 235 | "autotile_coord": Vector2( 5, 0 ), 236 | "one_way": false, 237 | "one_way_margin": 1.0, 238 | "shape": SubResource( 11 ), 239 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 240 | }, { 241 | "autotile_coord": Vector2( 3, 1 ), 242 | "one_way": false, 243 | "one_way_margin": 1.0, 244 | "shape": SubResource( 12 ), 245 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 246 | }, { 247 | "autotile_coord": Vector2( 4, 1 ), 248 | "one_way": false, 249 | "one_way_margin": 1.0, 250 | "shape": SubResource( 13 ), 251 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 252 | }, { 253 | "autotile_coord": Vector2( 5, 1 ), 254 | "one_way": false, 255 | "one_way_margin": 1.0, 256 | "shape": SubResource( 14 ), 257 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 258 | }, { 259 | "autotile_coord": Vector2( 0, 2 ), 260 | "one_way": false, 261 | "one_way_margin": 1.0, 262 | "shape": SubResource( 15 ), 263 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 264 | }, { 265 | "autotile_coord": Vector2( 1, 2 ), 266 | "one_way": false, 267 | "one_way_margin": 1.0, 268 | "shape": SubResource( 16 ), 269 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 270 | }, { 271 | "autotile_coord": Vector2( 0, 3 ), 272 | "one_way": false, 273 | "one_way_margin": 1.0, 274 | "shape": SubResource( 17 ), 275 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 276 | }, { 277 | "autotile_coord": Vector2( 0, 4 ), 278 | "one_way": false, 279 | "one_way_margin": 1.0, 280 | "shape": SubResource( 18 ), 281 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 282 | }, { 283 | "autotile_coord": Vector2( 0, 5 ), 284 | "one_way": false, 285 | "one_way_margin": 1.0, 286 | "shape": SubResource( 19 ), 287 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 288 | }, { 289 | "autotile_coord": Vector2( 2, 2 ), 290 | "one_way": false, 291 | "one_way_margin": 1.0, 292 | "shape": SubResource( 20 ), 293 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 294 | }, { 295 | "autotile_coord": Vector2( 1, 3 ), 296 | "one_way": false, 297 | "one_way_margin": 1.0, 298 | "shape": SubResource( 21 ), 299 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 300 | }, { 301 | "autotile_coord": Vector2( 2, 3 ), 302 | "one_way": false, 303 | "one_way_margin": 1.0, 304 | "shape": SubResource( 22 ), 305 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 306 | }, { 307 | "autotile_coord": Vector2( 1, 4 ), 308 | "one_way": false, 309 | "one_way_margin": 1.0, 310 | "shape": SubResource( 23 ), 311 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 312 | }, { 313 | "autotile_coord": Vector2( 2, 4 ), 314 | "one_way": false, 315 | "one_way_margin": 1.0, 316 | "shape": SubResource( 24 ), 317 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 318 | }, { 319 | "autotile_coord": Vector2( 1, 5 ), 320 | "one_way": false, 321 | "one_way_margin": 1.0, 322 | "shape": SubResource( 25 ), 323 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 324 | }, { 325 | "autotile_coord": Vector2( 3, 2 ), 326 | "one_way": false, 327 | "one_way_margin": 1.0, 328 | "shape": SubResource( 26 ), 329 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 330 | }, { 331 | "autotile_coord": Vector2( 3, 3 ), 332 | "one_way": false, 333 | "one_way_margin": 1.0, 334 | "shape": SubResource( 27 ), 335 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 336 | }, { 337 | "autotile_coord": Vector2( 4, 4 ), 338 | "one_way": false, 339 | "one_way_margin": 1.0, 340 | "shape": SubResource( 28 ), 341 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 342 | }, { 343 | "autotile_coord": Vector2( 3, 4 ), 344 | "one_way": false, 345 | "one_way_margin": 1.0, 346 | "shape": SubResource( 29 ), 347 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 348 | }, { 349 | "autotile_coord": Vector2( 2, 5 ), 350 | "one_way": false, 351 | "one_way_margin": 1.0, 352 | "shape": SubResource( 30 ), 353 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 354 | }, { 355 | "autotile_coord": Vector2( 3, 5 ), 356 | "one_way": false, 357 | "one_way_margin": 1.0, 358 | "shape": SubResource( 31 ), 359 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 360 | }, { 361 | "autotile_coord": Vector2( 5, 5 ), 362 | "one_way": false, 363 | "one_way_margin": 1.0, 364 | "shape": SubResource( 32 ), 365 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 366 | }, { 367 | "autotile_coord": Vector2( 4, 5 ), 368 | "one_way": false, 369 | "one_way_margin": 1.0, 370 | "shape": SubResource( 33 ), 371 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 372 | }, { 373 | "autotile_coord": Vector2( 5, 3 ), 374 | "one_way": false, 375 | "one_way_margin": 1.0, 376 | "shape": SubResource( 34 ), 377 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 378 | }, { 379 | "autotile_coord": Vector2( 5, 4 ), 380 | "one_way": false, 381 | "one_way_margin": 1.0, 382 | "shape": SubResource( 35 ), 383 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 384 | }, { 385 | "autotile_coord": Vector2( 4, 3 ), 386 | "one_way": false, 387 | "one_way_margin": 1.0, 388 | "shape": SubResource( 36 ), 389 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 390 | }, { 391 | "autotile_coord": Vector2( 4, 2 ), 392 | "one_way": false, 393 | "one_way_margin": 1.0, 394 | "shape": SubResource( 37 ), 395 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 396 | }, { 397 | "autotile_coord": Vector2( 5, 2 ), 398 | "one_way": false, 399 | "one_way_margin": 1.0, 400 | "shape": SubResource( 38 ), 401 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 402 | }, { 403 | "autotile_coord": Vector2( 6, 2 ), 404 | "one_way": false, 405 | "one_way_margin": 1.0, 406 | "shape": SubResource( 39 ), 407 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 408 | }, { 409 | "autotile_coord": Vector2( 6, 1 ), 410 | "one_way": false, 411 | "one_way_margin": 1.0, 412 | "shape": SubResource( 40 ), 413 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 414 | }, { 415 | "autotile_coord": Vector2( 7, 0 ), 416 | "one_way": false, 417 | "one_way_margin": 1.0, 418 | "shape": SubResource( 41 ), 419 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 420 | }, { 421 | "autotile_coord": Vector2( 8, 0 ), 422 | "one_way": false, 423 | "one_way_margin": 1.0, 424 | "shape": SubResource( 42 ), 425 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 426 | }, { 427 | "autotile_coord": Vector2( 7, 1 ), 428 | "one_way": false, 429 | "one_way_margin": 1.0, 430 | "shape": SubResource( 43 ), 431 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 432 | }, { 433 | "autotile_coord": Vector2( 8, 1 ), 434 | "one_way": false, 435 | "one_way_margin": 1.0, 436 | "shape": SubResource( 44 ), 437 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 438 | }, { 439 | "autotile_coord": Vector2( 7, 2 ), 440 | "one_way": false, 441 | "one_way_margin": 1.0, 442 | "shape": SubResource( 45 ), 443 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 444 | }, { 445 | "autotile_coord": Vector2( 6, 3 ), 446 | "one_way": false, 447 | "one_way_margin": 1.0, 448 | "shape": SubResource( 46 ), 449 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 450 | }, { 451 | "autotile_coord": Vector2( 6, 4 ), 452 | "one_way": false, 453 | "one_way_margin": 1.0, 454 | "shape": SubResource( 47 ), 455 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 456 | }, { 457 | "autotile_coord": Vector2( 6, 5 ), 458 | "one_way": false, 459 | "one_way_margin": 1.0, 460 | "shape": SubResource( 48 ), 461 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 462 | } ] 463 | 0/z_index = 0 464 | 465 | [sub_resource type="DynamicFont" id=50] 466 | size = 50 467 | font_data = ExtResource( 3 ) 468 | 469 | [node name="Game" type="Node2D"] 470 | 471 | [node name="color_rect" type="ColorRect" parent="."] 472 | margin_right = 1018.0 473 | margin_bottom = 632.0 474 | color = Color( 0.207843, 0.239216, 0.34902, 1 ) 475 | __meta__ = { 476 | "_edit_use_anchors_": false 477 | } 478 | 479 | [node name="tile_map" type="TileMap" parent="."] 480 | tile_set = SubResource( 49 ) 481 | format = 1 482 | tile_data = PoolIntArray( 0, 0, 0, 1, 0, 2, 2, 0, 2, 3, 0, 2, 4, 0, 2, 5, 0, 2, 6, 0, 2, 7, 0, 2, 8, 0, 2, 9, 0, 2, 10, 0, 2, 11, 0, 2, 12, 0, 2, 13, 0, 2, 14, 0, 2, 15, 0, 1, 65536, 0, 65538, 65551, 0, 65538, 131072, 0, 65538, 131078, 0, 65542, 131079, 0, 2, 131080, 0, 1, 131085, 0, 65541, 131087, 0, 65538, 196608, 0, 65538, 196610, 0, 65542, 196611, 0, 5, 196616, 0, 6, 196621, 0, 65538, 196623, 0, 65538, 262144, 0, 65538, 262156, 0, 0, 262157, 0, 65537, 262159, 0, 65538, 327680, 0, 65538, 327692, 0, 65538, 327695, 0, 65538, 393216, 0, 65538, 393219, 0, 65542, 393220, 0, 2, 393221, 0, 1, 393227, 0, 65542, 393228, 0, 65537, 393231, 0, 65538, 458752, 0, 65538, 458757, 0, 65536, 458758, 0, 2, 458759, 0, 5, 458767, 0, 65538, 524288, 0, 65538, 524303, 0, 65538, 589824, 0, 65536, 589825, 0, 2, 589826, 0, 2, 589827, 0, 2, 589828, 0, 2, 589829, 0, 2, 589830, 0, 2, 589831, 0, 2, 589832, 0, 2, 589833, 0, 2, 589834, 0, 2, 589835, 0, 2, 589836, 0, 2, 589837, 0, 2, 589838, 0, 2, 589839, 0, 65537 ) 483 | 484 | [node name="coins" type="Node2D" parent="."] 485 | 486 | [node name="coin" parent="coins" instance=ExtResource( 2 )] 487 | position = Vector2( 191, 157 ) 488 | 489 | [node name="coin2" parent="coins" instance=ExtResource( 2 )] 490 | position = Vector2( 230, 159 ) 491 | 492 | [node name="coin3" parent="coins" instance=ExtResource( 2 )] 493 | position = Vector2( 207, 130 ) 494 | 495 | [node name="coin4" parent="coins" instance=ExtResource( 2 )] 496 | position = Vector2( 240, 127 ) 497 | 498 | [node name="coin5" parent="coins" instance=ExtResource( 2 )] 499 | position = Vector2( 453, 280 ) 500 | 501 | [node name="coin6" parent="coins" instance=ExtResource( 2 )] 502 | position = Vector2( 419, 278 ) 503 | 504 | [node name="coin7" parent="coins" instance=ExtResource( 2 )] 505 | position = Vector2( 415, 306 ) 506 | 507 | [node name="coin8" parent="coins" instance=ExtResource( 2 )] 508 | position = Vector2( 450, 308 ) 509 | 510 | [node name="coin9" parent="coins" instance=ExtResource( 2 )] 511 | position = Vector2( 706, 536 ) 512 | 513 | [node name="coin10" parent="coins" instance=ExtResource( 2 )] 514 | position = Vector2( 645, 504 ) 515 | 516 | [node name="coin11" parent="coins" instance=ExtResource( 2 )] 517 | position = Vector2( 706, 483 ) 518 | 519 | [node name="coin12" parent="coins" instance=ExtResource( 2 )] 520 | position = Vector2( 671, 483 ) 521 | 522 | [node name="coin13" parent="coins" instance=ExtResource( 2 )] 523 | position = Vector2( 671, 525 ) 524 | 525 | [node name="coin14" parent="coins" instance=ExtResource( 2 )] 526 | position = Vector2( 275, 537 ) 527 | 528 | [node name="coin15" parent="coins" instance=ExtResource( 2 )] 529 | position = Vector2( 261, 509 ) 530 | 531 | [node name="coin16" parent="coins" instance=ExtResource( 2 )] 532 | position = Vector2( 233, 531 ) 533 | 534 | [node name="coin17" parent="coins" instance=ExtResource( 2 )] 535 | position = Vector2( 232, 498 ) 536 | 537 | [node name="coin18" parent="coins" instance=ExtResource( 2 )] 538 | position = Vector2( 210, 527 ) 539 | 540 | [node name="coin19" parent="coins" instance=ExtResource( 2 )] 541 | position = Vector2( 714, 189 ) 542 | 543 | [node name="coin20" parent="coins" instance=ExtResource( 2 )] 544 | position = Vector2( 701, 211 ) 545 | 546 | [node name="coin21" parent="coins" instance=ExtResource( 2 )] 547 | position = Vector2( 663, 206 ) 548 | 549 | [node name="coin22" parent="coins" instance=ExtResource( 2 )] 550 | position = Vector2( 645, 174 ) 551 | 552 | [node name="coin23" parent="coins" instance=ExtResource( 2 )] 553 | position = Vector2( 683, 239 ) 554 | 555 | [node name="failed" type="ColorRect" parent="."] 556 | visible = false 557 | margin_right = 1018.0 558 | margin_bottom = 632.0 559 | color = Color( 0, 0, 0, 0.454902 ) 560 | __meta__ = { 561 | "_edit_use_anchors_": false 562 | } 563 | 564 | [node name="label" type="Label" parent="failed"] 565 | margin_left = 284.0 566 | margin_top = 301.0 567 | margin_right = 741.0 568 | margin_bottom = 362.0 569 | custom_fonts/font = SubResource( 50 ) 570 | text = "Respawning in 3 seconds ..." 571 | -------------------------------------------------------------------------------- /client/server.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | var player = preload("res://objects/player.tscn") 4 | var otherplayer = preload("res://objects/otherplayer.tscn") 5 | var map = preload("res://scenes/map.tscn") 6 | 7 | var enemy_bullet = preload("res://objects/otherplayerbullet.tscn") 8 | var bullet = preload("res://objects/playerbullet.tscn") 9 | 10 | func _ready(): 11 | get_tree().connect("connected_to_server", self, "_connected_to_server") 12 | get_tree().connect("server_disconnected", self, '_server_disconnected') 13 | get_tree().connect("connection_failed", self, "connection_failed") 14 | 15 | func join_server(): 16 | var client = NetworkedMultiplayerENet.new() 17 | var err = client.create_client("159.223.209.73", 4242) 18 | if err != OK: 19 | print("unable_to_connect") 20 | return 21 | get_tree().network_peer = client 22 | 23 | func connection_failed(): 24 | get_node("/root/lobby/join").disabled = false 25 | print("Connection failed") 26 | 27 | func _server_disconnected(): 28 | get_node("/root/lobby").show() 29 | print("server disconnected") 30 | 31 | func _connected_to_server(): 32 | get_node("/root/lobby").hide() 33 | print("Connected to server") 34 | var scene = map.instance() 35 | scene.name = "Map" 36 | get_tree().root.add_child_below_node(Global, scene) 37 | 38 | remote func instance_player(id, location): 39 | var p = player if get_tree().get_network_unique_id() == id else otherplayer 40 | var player_instance = Global.instance_node(p , Nodes, location) 41 | player_instance.name = str(id) 42 | if get_tree().get_network_unique_id() == id: 43 | for i in get_tree().get_network_connected_peers(): 44 | if i != 1: 45 | instance_player(i, location) 46 | 47 | remote func instance_new_bullet(id, bullet_name, rot, pos): 48 | var b = bullet if get_tree().get_network_unique_id() == id else enemy_bullet 49 | var bullet_instance = Global.instance_node(b, Nodes, pos) 50 | bullet_instance.player_rot = rot 51 | bullet_instance.name = bullet_name 52 | 53 | remote func player_damaged(id, hp): 54 | var p = Nodes.get_node(str(id)) 55 | if get_tree().get_network_unique_id() != id: 56 | p.hp = hp 57 | var prev_modulate = p.modulate 58 | p.modulate = Color(5,5,5,1) 59 | yield(get_tree().create_timer(0.1), "timeout") 60 | p.modulate = prev_modulate 61 | 62 | remote func player_killed(id): 63 | var killed_player = Nodes.get_node(str(id)) 64 | killed_player.get_node("shape").disabled = true 65 | killed_player.set_physics_process(false) 66 | killed_player.hide() 67 | if id == get_tree().get_network_unique_id(): 68 | get_node("../Map/failed").show() 69 | yield(get_tree().create_timer(3), "timeout") 70 | get_node("../Map/failed").hide() 71 | rpc_id(1, "respawn_player", get_tree().get_network_unique_id()) 72 | 73 | remote func respawn_player(id, location): 74 | if Nodes.has_node(str(id)): 75 | var player = Nodes.get_node(str(id)) 76 | player.global_position = location 77 | player.get_node("shape").disabled = false 78 | player.set_physics_process(true) 79 | player.hp = 100 80 | player.show() 81 | 82 | remote func update_highest(kills): 83 | get_node("../Map").update_highest(kills) 84 | 85 | remote func update_kills(kills): 86 | get_node("../Map").update_kills(kills) 87 | 88 | remote func update_player_transform(id, position, rotation, velocity): 89 | if get_tree().get_network_unique_id() != id: 90 | Nodes.get_node(str(id)).update_transform(position, rotation, velocity) 91 | 92 | remote func delete_obj(id): 93 | if Nodes.has_node(str(id)): 94 | Nodes.get_node(str(id)).queue_free() 95 | 96 | 97 | -------------------------------------------------------------------------------- /client/singletons/global.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | var coins = 0 4 | 5 | func instance_node_at_position(node:Object, parent:Object, location:Vector2): 6 | var node_instance = instance_node(node, parent) 7 | node_instance.global_position = location 8 | return node_instance 9 | 10 | 11 | func instance_node(node:Object, parent:Object): 12 | var node_instance = node.instance() 13 | parent.add_child(node_instance) 14 | return node_instance 15 | -------------------------------------------------------------------------------- /client/singletons/persistent_nodes.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | 4 | # Declare member variables here. Examples: 5 | # var a = 2 6 | # var b = "text" 7 | 8 | 9 | # Called when the node enters the scene tree for the first time. 10 | func _ready(): 11 | pass # Replace with function body. 12 | 13 | 14 | # Called every frame. 'delta' is the elapsed time since the previous frame. 15 | #func _process(delta): 16 | # pass 17 | -------------------------------------------------------------------------------- /client/singletons/server.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | var client 4 | 5 | var game_name = ProjectSettings.get("application/config/name") 6 | var player = preload("res://objects/player.tscn") 7 | var otherplayer = preload("res://objects/otherplayers.tscn") 8 | var enemy_bullet = preload("res://objects/otherplayerbullet.tscn") 9 | var bullet = preload("res://objects/playerbullet.tscn") 10 | var map = preload("res://scenes/map1.tscn") 11 | 12 | func _ready(): 13 | set_process(false) 14 | get_tree().connect("connected_to_server", self, "_connected_to_server") 15 | get_tree().connect("server_disconnected", self, '_server_disconnected') 16 | get_tree().connect("connection_failed", self, "connection_failed") 17 | 18 | 19 | #func _process(delta): 20 | # client.poll() 21 | 22 | #func join_server(): 23 | # client = WebSocketClient.new() 24 | # set_process(true) 25 | # var err = client.connect_to_url("127.0.0.1:4242", PoolStringArray(), true) 26 | # if err != OK: 27 | # get_node("/root/game/debug").text += "\nUnable to connect" 28 | # print("unable_to_connect") 29 | # set_process(false) 30 | # return 31 | # get_tree().network_peer = client 32 | # return true 33 | 34 | func join_server(): 35 | var client = NetworkedMultiplayerENet.new() 36 | # var err = client.create_client("146.190.26.45", 4242) 37 | var err = client.create_client("127.0.0.1", 4242) 38 | if err != OK: 39 | print("unable_to_connect") 40 | return 41 | get_tree().network_peer = client 42 | return true 43 | 44 | func connection_failed(): 45 | print("Connection failed") 46 | 47 | 48 | func _server_disconnected(): 49 | print("server disconnected") 50 | 51 | func _connected_to_server(): 52 | print("Connected to server") 53 | var scene = map.instance() 54 | scene.name = "Map" 55 | get_tree().root.add_child_below_node(Global, scene) 56 | 57 | remote func instance_player(id, loc): 58 | randomize() 59 | _instance_player(id, loc) 60 | 61 | remote func delete_obj(id): 62 | if PersistentNodes.has_node(str(id)): 63 | PersistentNodes.get_node(str(id)).queue_free() 64 | 65 | remote func collected_coin(coin, collector): 66 | if get_node("../Map/coins").has_node(coin): 67 | get_node("../Map/coins").get_node(coin).queue_free() 68 | if collector == get_tree().get_network_unique_id(): 69 | Global.coins += 1 70 | 71 | 72 | func _instance_player(id, location): 73 | var player_instance = Global.instance_node_at_position(player if get_tree().get_network_unique_id() == id else otherplayer, PersistentNodes, location) 74 | player_instance.name = str(id) 75 | if get_tree().get_network_unique_id() == id: 76 | for i in get_tree().get_network_connected_peers(): 77 | if i != 1: 78 | instance_player(i, location) 79 | 80 | remote func update_player_transform(id, position, rotation, velocity): 81 | if get_tree().get_network_unique_id() != id: 82 | PersistentNodes.get_node(str(id)).update_transform(position, rotation, velocity) 83 | 84 | remote func instance_new_bullet(id, bullet_name, rot, pos): 85 | var bullet_instance = Global.instance_node_at_position(bullet if get_tree().get_network_unique_id() == id else enemy_bullet, 86 | PersistentNodes, 87 | pos) 88 | bullet_instance.player_rot = rot 89 | bullet_instance.name = bullet_name 90 | 91 | remote func player_killed(id): 92 | var killed_player = PersistentNodes.get_node(str(id)) 93 | killed_player.get_node("shape").disabled = true 94 | killed_player.set_physics_process(false) 95 | killed_player.hide() 96 | if id == get_tree().get_network_unique_id(): 97 | get_node("../Map/failed").show() 98 | yield(get_tree().create_timer(3), "timeout") 99 | get_node("../Map/failed").hide() 100 | rpc_id(1, "respawn_player", get_tree().get_network_unique_id()) 101 | 102 | remote func respawn_player(id, location): 103 | if PersistentNodes.has_node(str(id)): 104 | var player = PersistentNodes.get_node(str(id)) 105 | player.global_position = location 106 | player.get_node("shape").disabled = false 107 | player.set_physics_process(true) 108 | player.hp = 100 109 | player.show() 110 | 111 | 112 | remote func player_damaged(id, hp): 113 | var p = PersistentNodes.get_node(str(id)) 114 | if get_tree().get_network_unique_id() != id: 115 | p.hp = hp 116 | var prev_modulate = p.modulate 117 | p.modulate = Color(5,5,5,1) 118 | yield(get_tree().create_timer(0.1), "timeout") 119 | p.modulate = prev_modulate 120 | 121 | 122 | remote func shut_down(): 123 | get_tree().quit() 124 | -------------------------------------------------------------------------------- /server/Server.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | var spawn_points = [Vector2(271, 152), Vector2(133, 501), Vector2(756, 511), Vector2(700, 127)] 4 | var spawn_points_clone = spawn_points.duplicate() 5 | var taken_points = [] 6 | var obj_idx = 0 7 | var kills = {} 8 | var highest = 0 9 | 10 | 11 | func _ready(): 12 | with_multiplayerapi() 13 | 14 | func with_multiplayerapi(): 15 | var server = NetworkedMultiplayerENet.new() 16 | var err = server.create_server(4242) 17 | if err != OK: 18 | print("Unable to start server") 19 | return 20 | get_tree().network_peer = server 21 | get_tree().connect("network_peer_connected", self, "_player_connected") 22 | get_tree().connect("network_peer_disconnected", self, "_player_disconnected") 23 | print("Server created") 24 | 25 | 26 | 27 | func _player_connected(id): 28 | print("Player connected: ", id) 29 | rpc_id(0, "instance_player", id, choose_spawn_location()) 30 | kills[str(id)] = 0 31 | 32 | 33 | func choose_spawn_location(): 34 | randomize() 35 | var point = randi()%spawn_points.size() 36 | var loc = spawn_points[point] 37 | taken_points.append(loc) 38 | spawn_points.remove(point) 39 | if spawn_points.size() <= 0: 40 | spawn_points = spawn_points_clone.duplicate() 41 | taken_points.clear() 42 | return loc 43 | 44 | remote func instance_bullet(player_rot, player_pos): 45 | var player_id = get_tree().get_rpc_sender_id() 46 | rpc("instance_new_bullet", player_id, 'bullet' + str(player_id)+"idx" + str(obj_idx), 47 | player_rot, player_pos) 48 | obj_idx += 1 49 | 50 | func _player_disconnected(id): 51 | print("Player disconnected: ", id) 52 | rpc_id(0, "delete_obj", id) 53 | kills.erase(id) 54 | 55 | remote func player_damaged(hp): 56 | var player_id = get_tree().get_rpc_sender_id() 57 | rpc("player_damaged", player_id, hp) 58 | 59 | remote func player_killed(killer): 60 | var player_id = get_tree().get_rpc_sender_id() 61 | kills[killer] += 1 62 | if kills[killer] > highest: 63 | highest = kills[killer] 64 | rpc("update_highest", highest) 65 | rpc_id(int(killer), "update_kills", kills[killer]) 66 | rpc("player_killed", player_id) 67 | 68 | remote func respawn_player(id): 69 | rpc("respawn_player", id, choose_spawn_location()) 70 | 71 | remote func update_transform(position, rotation, velocity): 72 | var player_id = get_tree().get_rpc_sender_id() 73 | rpc_unreliable("update_player_transform", player_id, position, rotation, velocity) 74 | 75 | remote func destroy_bullet(bullet_name): 76 | rpc("delete_obj", bullet_name) 77 | 78 | 79 | -------------------------------------------------------------------------------- /server/Server.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://Server.gd" type="Script" id=1] 4 | 5 | [node name="Server" type="Node"] 6 | script = ExtResource( 1 ) 7 | -------------------------------------------------------------------------------- /server/default_env.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Environment" load_steps=2 format=2] 2 | 3 | [sub_resource type="ProceduralSky" id=1] 4 | 5 | [resource] 6 | background_mode = 2 7 | background_sky = SubResource( 1 ) 8 | -------------------------------------------------------------------------------- /server/export_presets.cfg: -------------------------------------------------------------------------------- 1 | [preset.0] 2 | 3 | name="Linux/X11" 4 | platform="Linux/X11" 5 | runnable=true 6 | custom_features="" 7 | export_filter="all_resources" 8 | include_filter="" 9 | exclude_filter="" 10 | export_path="../../../Multiplayer game/server.x86_64" 11 | patch_list=PoolStringArray( ) 12 | script_export_mode=1 13 | script_encryption_key="" 14 | 15 | [preset.0.options] 16 | 17 | texture_format/bptc=false 18 | texture_format/s3tc=true 19 | texture_format/etc=false 20 | texture_format/etc2=false 21 | texture_format/no_bptc_fallbacks=true 22 | binary_format/64_bits=true 23 | binary_format/embed_pck=false 24 | custom_template/release="" 25 | custom_template/debug="" 26 | -------------------------------------------------------------------------------- /server/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daviesdevyt/dedicated-server-multiplayer/7fdb502ad58267972e589528df7f1fdab31570f9/server/icon.png -------------------------------------------------------------------------------- /server/icon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://icon.png" 13 | dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /server/project.godot: -------------------------------------------------------------------------------- 1 | ; Engine configuration file. 2 | ; It's best edited using the editor UI and not directly, 3 | ; since the parameters that go here are not all obvious. 4 | ; 5 | ; Format: 6 | ; [section] ; section goes between [] 7 | ; param=value ; assign values to parameters 8 | 9 | config_version=4 10 | 11 | _global_script_classes=[ ] 12 | _global_script_class_icons={ 13 | 14 | } 15 | 16 | [application] 17 | 18 | config/name="server" 19 | run/main_scene="res://Server.tscn" 20 | config/icon="res://icon.png" 21 | 22 | [display] 23 | 24 | window/size/width=100 25 | window/size/height=100 26 | 27 | [physics] 28 | 29 | common/enable_pause_aware_picking=true 30 | 31 | [rendering] 32 | 33 | environment/default_environment="res://default_env.tres" 34 | -------------------------------------------------------------------------------- /server/server.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | var spawn_points = [Vector2(130, 130), Vector2(133, 501), Vector2(840, 511), Vector2(700, 127)] 4 | var spawn_points_clone = spawn_points.duplicate() 5 | var taken_points = [] 6 | var obj_name_idx = 0 7 | var total_kills = 0 8 | 9 | func _ready(): 10 | with_multiplayer_api() 11 | 12 | func with_multiplayer_api(): 13 | var server = NetworkedMultiplayerENet.new() 14 | var err = server.create_server(4242) 15 | if err != OK: 16 | print("Unable to start server") 17 | set_process(false) 18 | return 19 | get_tree().network_peer = server 20 | get_tree().connect("network_peer_connected", self, "_player_connected") 21 | get_tree().connect("network_peer_disconnected", self, "_player_disconnected") 22 | print("Server created") 23 | 24 | func with_websocket(): 25 | var server = WebSocketServer.new() 26 | var err = server.listen(4242, PoolStringArray(), true) 27 | if err != OK: 28 | print("Unable to start server") 29 | set_process(false) 30 | return 31 | get_tree().network_peer = server 32 | get_tree().connect("network_peer_connected", self, "_player_connected") 33 | get_tree().connect("network_peer_disconnected", self, "_player_disconnected") 34 | print("Server created") 35 | 36 | 37 | func _player_connected(id): 38 | randomize() 39 | print("Player connected: ", id) 40 | rpc_id(0, "instance_player", id, choose_spawn_location()) 41 | 42 | func choose_spawn_location(): 43 | var point = randi()%spawn_points.size() 44 | var loc = spawn_points[point] 45 | taken_points.append(loc) 46 | spawn_points.remove(point) 47 | if spawn_points.size() <= 0: 48 | spawn_points = spawn_points_clone.duplicate() 49 | taken_points.clear() 50 | return loc 51 | 52 | remote func respawn_player(id): 53 | rpc("respawn_player", id, choose_spawn_location()) 54 | 55 | func _player_disconnected(id): 56 | print("Player disconnected: ", id) 57 | rpc_id(0, "delete_obj", id) 58 | 59 | remote func update_transform(position, rotation, velocity): 60 | var player_id = get_tree().get_rpc_sender_id() 61 | rpc_unreliable("update_player_transform", player_id, position, rotation, velocity) 62 | 63 | remote func instance_bullet(player_rot, player_pos): 64 | var player_id = get_tree().get_rpc_sender_id() 65 | rpc("instance_new_bullet", player_id, 'bullet' + str(player_id) + str(obj_name_idx), player_rot, player_pos) 66 | obj_name_idx += 1 67 | 68 | remote func destroy_bullet(bullet_name): 69 | rpc("delete_obj", bullet_name) 70 | 71 | remote func player_killed(): 72 | var player_id = get_tree().get_rpc_sender_id() 73 | rpc("player_killed", player_id) 74 | 75 | remote func player_damaged(hp): 76 | var player_id = get_tree().get_rpc_sender_id() 77 | rpc("player_damaged", player_id, hp) 78 | 79 | remote func collect_coin(coin): 80 | rpc("collected_coin", coin, get_tree().get_rpc_sender_id()) 81 | 82 | func _exit_tree(): 83 | rpc("shut_down") 84 | 85 | func _unhandled_key_input(event): 86 | if event.is_action_released("ui_select"): 87 | rpc("shut_down") 88 | 89 | -------------------------------------------------------------------------------- /server/server.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://server.gd" type="Script" id=1] 4 | 5 | [node name="Server" type="Node"] 6 | script = ExtResource( 1 ) 7 | --------------------------------------------------------------------------------