├── 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 |
--------------------------------------------------------------------------------