Merge branch 'черешня' into livingEntitiesVlad

This commit is contained in:
N4K 2023-08-18 19:46:49 +03:00
commit da4768d920
28 changed files with 977 additions and 210 deletions

View file

@ -21,18 +21,6 @@
/processorParam:TextureFormat=Compressed /processorParam:TextureFormat=Compressed
/build:ButtonFont.spritefont /build:ButtonFont.spritefont
#begin checkboxs_off.png
/importer:TextureImporter
/processor:TextureProcessor
/processorParam:ColorKeyColor=255,0,255,255
/processorParam:ColorKeyEnabled=True
/processorParam:GenerateMipmaps=False
/processorParam:PremultiplyAlpha=True
/processorParam:ResizeToPowerOfTwo=False
/processorParam:MakeSquare=False
/processorParam:TextureFormat=Color
/build:checkboxs_off.png
#begin checkboxs_off-on.png #begin checkboxs_off-on.png
/importer:TextureImporter /importer:TextureImporter
/processor:TextureProcessor /processor:TextureProcessor
@ -45,6 +33,18 @@
/processorParam:TextureFormat=Color /processorParam:TextureFormat=Color
/build:checkboxs_off-on.png /build:checkboxs_off-on.png
#begin checkboxs_off.png
/importer:TextureImporter
/processor:TextureProcessor
/processorParam:ColorKeyColor=255,0,255,255
/processorParam:ColorKeyEnabled=True
/processorParam:GenerateMipmaps=False
/processorParam:PremultiplyAlpha=True
/processorParam:ResizeToPowerOfTwo=False
/processorParam:MakeSquare=False
/processorParam:TextureFormat=Color
/build:checkboxs_off.png
#begin checkboxs_on.png #begin checkboxs_on.png
/importer:TextureImporter /importer:TextureImporter
/processor:TextureProcessor /processor:TextureProcessor
@ -81,14 +81,7 @@
/processorParam:TextureFormat=Color /processorParam:TextureFormat=Color
/build:deathBackground.jpg /build:deathBackground.jpg
#begin door.png
#begin DoomTestSong.mp3
/importer:Mp3Importer
/processor:SoundEffectProcessor
/processorParam:Quality=Best
/build:sounds/DoomTestSong.mp3
#begin doors.png
/importer:TextureImporter /importer:TextureImporter
/processor:TextureProcessor /processor:TextureProcessor
/processorParam:ColorKeyColor=255,0,255,255 /processorParam:ColorKeyColor=255,0,255,255
@ -98,7 +91,7 @@
/processorParam:ResizeToPowerOfTwo=False /processorParam:ResizeToPowerOfTwo=False
/processorParam:MakeSquare=False /processorParam:MakeSquare=False
/processorParam:TextureFormat=Color /processorParam:TextureFormat=Color
/build:doors.png /build:door.png
#begin Font_12.spritefont #begin Font_12.spritefont
/importer:FontDescriptionImporter /importer:FontDescriptionImporter
@ -140,7 +133,7 @@
/processorParam:TextureFormat=Color /processorParam:TextureFormat=Color
/build:menuFon.jpg /build:menuFon.jpg
#begin MenuFon2.jpg #begin menuFon2.jpg
/importer:TextureImporter /importer:TextureImporter
/processor:TextureProcessor /processor:TextureProcessor
/processorParam:ColorKeyColor=255,0,255,255 /processorParam:ColorKeyColor=255,0,255,255
@ -150,7 +143,7 @@
/processorParam:ResizeToPowerOfTwo=False /processorParam:ResizeToPowerOfTwo=False
/processorParam:MakeSquare=False /processorParam:MakeSquare=False
/processorParam:TextureFormat=Color /processorParam:TextureFormat=Color
/build:MenuFon2.jpg /build:menuFon2.jpg
#begin menuFon3.jpg #begin menuFon3.jpg
/importer:TextureImporter /importer:TextureImporter
@ -243,6 +236,19 @@
/processorParam:TextureFormat=Color /processorParam:TextureFormat=Color
/build:sliderBackground.png /build:sliderBackground.png
#begin smokeAnimation2.png
/importer:TextureImporter
/processor:TextureProcessor
/processorParam:ColorKeyColor=255,0,255,255
/processorParam:ColorKeyEnabled=True
/processorParam:GenerateMipmaps=False
/processorParam:PremultiplyAlpha=True
/processorParam:ResizeToPowerOfTwo=False
/processorParam:MakeSquare=False
/processorParam:TextureFormat=Color
/build:smokeAnimation2.png
#begin sounds/DoomTestSong.mp3 #begin sounds/DoomTestSong.mp3
/importer:Mp3Importer /importer:Mp3Importer
/processor:SoundEffectProcessor /processor:SoundEffectProcessor
@ -255,18 +261,6 @@
/processorParam:Quality=Best /processorParam:Quality=Best
/build:sounds/shotgun_shot.mp3 /build:sounds/shotgun_shot.mp3
#begin SmokeAnimation2.png
/importer:TextureImporter
/processor:TextureProcessor
/processorParam:ColorKeyColor=255,0,255,255
/processorParam:ColorKeyEnabled=True
/processorParam:GenerateMipmaps=False
/processorParam:PremultiplyAlpha=True
/processorParam:ResizeToPowerOfTwo=False
/processorParam:MakeSquare=False
/processorParam:TextureFormat=Color
/build:SmokeAnimation2.png
#begin textboxbackground1-1.png #begin textboxbackground1-1.png
/importer:TextureImporter /importer:TextureImporter
/processor:TextureProcessor /processor:TextureProcessor
@ -279,18 +273,6 @@
/processorParam:TextureFormat=Color /processorParam:TextureFormat=Color
/build:textboxbackground1-1.png /build:textboxbackground1-1.png
#begin textboxbackground2,5-1.png
/importer:TextureImporter
/processor:TextureProcessor
/processorParam:ColorKeyColor=255,0,255,255
/processorParam:ColorKeyEnabled=True
/processorParam:GenerateMipmaps=False
/processorParam:PremultiplyAlpha=True
/processorParam:ResizeToPowerOfTwo=False
/processorParam:MakeSquare=False
/processorParam:TextureFormat=Color
/build:textboxbackground2,5-1.png
#begin textboxbackground2-1.png #begin textboxbackground2-1.png
/importer:TextureImporter /importer:TextureImporter
/processor:TextureProcessor /processor:TextureProcessor
@ -303,6 +285,18 @@
/processorParam:TextureFormat=Color /processorParam:TextureFormat=Color
/build:textboxbackground2-1.png /build:textboxbackground2-1.png
#begin textboxbackground2,5-1.png
/importer:TextureImporter
/processor:TextureProcessor
/processorParam:ColorKeyColor=255,0,255,255
/processorParam:ColorKeyEnabled=True
/processorParam:GenerateMipmaps=False
/processorParam:PremultiplyAlpha=True
/processorParam:ResizeToPowerOfTwo=False
/processorParam:MakeSquare=False
/processorParam:TextureFormat=Color
/build:textboxbackground2,5-1.png
#begin textboxbackground6-1.png #begin textboxbackground6-1.png
/importer:TextureImporter /importer:TextureImporter
/processor:TextureProcessor /processor:TextureProcessor

View file

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<tileset version="1.10" tiledversion="1.10.2" name="Door" tilewidth="32" tileheight="48" tilecount="2" columns="2"> <tileset version="1.10" tiledversion="1.10.2" name="Door" tilewidth="32" tileheight="48" tilecount="2" columns="2">
<image source="doors.png" width="64" height="48"/> <image source="door.png" width="64" height="48"/>
</tileset> </tileset>

View file

@ -0,0 +1 @@
{"id":"DeathFromGhost","textureName":"deathAnimation","startSpriteRectangle":{"X":1,"Y":246,"Width":48,"Height":48},"frameSecond":[{"Item1":0,"Item2":10}],"textureFrameInterval":1,"framesCount":5,"isCycle":false,"offset":"0, 0"}

View file

@ -0,0 +1 @@
{"id":"DeathFromHunchman","textureName":"deathAnimation","startSpriteRectangle":{"X":1,"Y":1,"Width":48,"Height":48},"frameSecond":[{"Item1":0,"Item2":10}],"textureFrameInterval":1,"framesCount":5,"isCycle":false,"offset":"0, 0"}

View file

@ -0,0 +1 @@
{"id":"DeathFromSilasMaster","textureName":"deathAnimation","startSpriteRectangle":{"X":1,"Y":295,"Width":48,"Height":48},"frameSecond":[{"Item1":0,"Item2":10}],"textureFrameInterval":1,"framesCount":5,"isCycle":false,"offset":"0, 0"}

View file

@ -0,0 +1 @@
{"id":"DeathFromSlime","textureName":"deathAnimation","startSpriteRectangle":{"X":1,"Y":50,"Width":48,"Height":48},"frameSecond":[{"Item1":0,"Item2":10}],"textureFrameInterval":1,"framesCount":5,"isCycle":false,"offset":"0, 0"}

View file

@ -0,0 +1 @@
{"id":"DeathFromSpider","textureName":"deathAnimation","startSpriteRectangle":{"X":1,"Y":148,"Width":48,"Height":48},"frameSecond":[{"Item1":0,"Item2":10}],"textureFrameInterval":1,"framesCount":5,"isCycle":false,"offset":"0, 0"}

View file

@ -0,0 +1 @@
{"id":"DeathFromWerewolf","textureName":"deathAnimation","startSpriteRectangle":{"X":1,"Y":197,"Width":48,"Height":48},"frameSecond":[{"Item1":0,"Item2":10}],"textureFrameInterval":1,"framesCount":5,"isCycle":false,"offset":"0, 0"}

View file

@ -0,0 +1 @@
{"id":"playerShootBoomUpLeft","textureName":"playerAnimation","startSpriteRectangle":{"X":267,"Y":34,"Width":24,"Height":32},"frameSecond":[{"Item1":0,"Item2":12}],"textureFrameInterval":1,"framesCount":2,"isCycle":false,"offset":"0, 0"}

View file

@ -0,0 +1,24 @@
{
"id": "playerShootBoomUpRight",
"textureName": "playerAnimation",
"startSpriteRectangle": {
"X": 267,
"Y": 1,
"Width": 24,
"Height": 32
},
"frameSecond": [
{
"Item1": 0,
"Item2": 3
},
{
"Item1": 1,
"Item2": 20
}
],
"textureFrameInterval": 1,
"framesCount": 2,
"isCycle": false,
"offset": "0, 0"
}

View file

Before

Width:  |  Height:  |  Size: 472 B

After

Width:  |  Height:  |  Size: 472 B

652
DangerousD/Content/lvl2.tmx Normal file
View file

@ -0,0 +1,652 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.2" orientation="orthogonal" renderorder="right-down" width="30" height="20" tilewidth="16" tileheight="16" infinite="1" nextlayerid="7" nextobjectid="61">
<tileset firstgid="1" name="map" tilewidth="16" tileheight="16" tilecount="871" columns="13">
<image source="tiles.BMP" width="208" height="1072"/>
</tileset>
<tileset firstgid="872" source="map.tsx"/>
<tileset firstgid="1743" source="Door.tsx"/>
<layer id="2" name="Collision" class="StopTile" width="30" height="20">
<data encoding="csv">
<chunk x="-16" y="-32" width="16" height="16">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1157,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1027,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1027,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1027
</chunk>
<chunk x="0" y="-32" width="16" height="16">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</chunk>
<chunk x="16" y="-32" width="16" height="16">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</chunk>
<chunk x="32" y="-32" width="16" height="16">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</chunk>
<chunk x="48" y="-32" width="16" height="16">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</chunk>
<chunk x="-16" y="-16" width="16" height="16">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1027,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1027,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1027,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1157,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,405,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156
</chunk>
<chunk x="0" y="-16" width="16" height="16">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</chunk>
<chunk x="16" y="-16" width="16" height="16">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</chunk>
<chunk x="32" y="-16" width="16" height="16">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</chunk>
<chunk x="48" y="-16" width="16" height="16">
1027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
405,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</chunk>
<chunk x="-16" y="0" width="16" height="16">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,405,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,405,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,405
</chunk>
<chunk x="0" y="0" width="16" height="16">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405
</chunk>
<chunk x="16" y="0" width="16" height="16">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1278,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405
</chunk>
<chunk x="32" y="0" width="16" height="16">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,
0,0,0,0,0,1027,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,1027,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,1027,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,1027,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,1027,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,1027,0,0,0,0,0,0,0,0,0,0,
405,405,405,405,405,405,405,405,405,0,0,405,405,405,405,405,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405
</chunk>
<chunk x="48" y="0" width="16" height="16">
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
405,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
405,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
405,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</chunk>
</data>
</layer>
<layer id="1" name="Background" class="Tile" width="30" height="20">
<data encoding="csv">
<chunk x="0" y="-32" width="16" height="16">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
576,577,578,579,580,581,576,577,578,579,580,581,576,577,578,579,
589,590,591,592,593,594,589,590,591,592,593,594,589,590,591,592,
602,603,604,605,606,607,602,603,604,605,606,607,602,603,1453,1454
</chunk>
<chunk x="16" y="-32" width="16" height="16">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
580,581,576,577,578,579,580,581,576,577,578,579,580,581,576,577,
593,594,589,590,591,592,593,594,589,590,591,592,593,594,589,590,
606,607,602,603,604,605,606,607,602,603,604,605,606,607,602,603
</chunk>
<chunk x="32" y="-32" width="16" height="16">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
578,579,580,581,576,577,578,579,580,581,576,577,578,579,580,581,
591,592,593,594,589,590,591,592,593,594,589,590,591,592,593,594,
604,605,606,607,602,603,604,1453,1454,607,602,603,604,605,606,607
</chunk>
<chunk x="0" y="-16" width="16" height="16">
615,616,617,618,619,620,615,616,950,951,619,620,615,616,1466,1467,
628,629,630,631,632,633,628,629,963,964,632,633,628,629,1479,1480,
641,642,643,1378,645,646,641,642,976,977,645,646,641,642,643,644,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
576,577,578,579,580,581,576,577,578,579,580,581,576,577,578,579,
589,590,591,592,593,594,589,590,591,1333,1334,594,589,590,591,592,
602,603,604,605,606,607,602,603,604,1346,1347,607,602,603,604,605,
615,616,950,951,619,620,615,616,617,1359,1360,620,615,616,950,951,
628,629,963,964,632,633,628,629,630,631,632,633,628,629,963,964,
641,642,976,977,645,646,641,642,643,1378,645,646,641,642,976,977,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
576,577,578,579,580,581,576,577,578,579,580,581,576,577,578,579,
589,590,591,592,593,594,589,590,591,592,593,594,589,590,591,592,
602,603,604,605,606,607,602,603,604,1325,1326,607,602,603,604,605,
615,616,617,618,619,620,615,616,617,1338,1339,620,615,616,79,80,
628,629,630,631,632,633,628,629,630,631,632,633,628,629,92,93
</chunk>
<chunk x="16" y="-16" width="16" height="16">
619,620,615,616,617,618,619,620,615,616,950,951,619,620,615,616,
632,633,628,629,630,631,632,633,628,629,963,964,632,633,628,629,
645,646,641,642,643,644,645,646,641,642,976,977,645,646,641,642,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
580,581,576,577,578,579,580,581,576,577,578,579,1239,581,576,577,
593,594,589,590,591,592,593,594,589,590,591,592,1252,594,589,590,
606,607,602,603,1453,1454,606,607,602,603,604,605,1265,607,602,603,
619,620,615,616,1466,1467,619,620,615,616,617,618,619,620,615,616,
632,633,628,629,1479,1480,632,633,628,629,630,631,632,633,628,629,
645,646,641,642,643,644,645,646,641,642,643,644,645,646,641,642,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
580,581,576,577,578,579,580,581,576,577,578,579,580,581,576,577,
593,594,589,590,591,592,593,594,589,590,591,592,593,594,589,590,
606,607,602,603,604,605,606,607,602,603,604,605,606,607,602,603,
619,620,615,616,617,618,619,620,615,950,951,618,619,620,615,616,
632,633,628,629,630,631,632,633,628,963,964,631,632,633,628,629
</chunk>
<chunk x="32" y="-16" width="16" height="16">
617,618,619,620,615,616,617,1466,1467,620,615,616,950,951,619,620,
1397,631,632,633,628,629,630,1479,1480,633,628,629,963,964,632,633,
1410,644,645,646,641,642,643,644,645,646,641,642,976,977,645,646,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
578,579,580,581,576,577,578,579,580,581,576,577,578,579,580,581,
591,1333,1334,594,589,590,591,592,593,594,589,590,591,592,593,594,
604,1346,1347,607,602,603,604,605,606,607,602,603,604,605,606,607,
617,1359,1360,620,615,1325,1326,618,619,620,615,616,950,951,619,620,
1265,631,632,633,628,1338,1339,631,632,633,628,629,963,964,632,633,
1278,644,645,646,641,642,643,644,1378,646,641,642,976,977,645,646,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
578,579,580,581,576,577,578,579,580,581,576,577,578,579,580,581,
1453,1454,593,594,589,590,591,592,593,594,589,590,591,592,593,594,
1466,1467,606,607,602,603,604,605,606,607,602,603,604,605,606,607,
1479,1480,619,620,615,616,950,951,619,620,615,616,617,618,619,620,
630,631,632,633,628,629,963,964,632,633,628,629,630,631,632,633
</chunk>
<chunk x="0" y="0" width="16" height="16">
641,642,643,644,645,646,641,642,643,644,645,646,641,642,105,106,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
576,577,578,579,580,581,576,577,578,579,580,581,576,577,578,579,
589,590,591,592,593,594,589,590,591,592,593,594,589,590,591,592,
602,603,1453,1454,606,607,602,603,604,605,606,607,602,603,604,605,
615,616,1466,1467,619,620,615,616,950,951,619,620,615,616,617,618,
628,629,1479,1480,632,633,628,629,963,964,632,633,628,629,630,631,
641,642,643,644,645,646,641,642,976,977,645,646,641,642,643,644,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
576,577,578,579,580,581,576,577,578,579,580,581,576,577,578,579,
589,590,591,592,593,594,589,590,591,592,593,594,589,590,591,592,
602,603,604,605,606,607,602,603,604,573,574,607,602,603,604,454,
615,950,951,618,619,620,615,616,617,618,619,620,615,616,617,467,
628,963,964,631,632,633,628,629,630,631,632,633,628,629,630,631,
641,976,977,1378,645,646,641,642,643,644,645,646,641,642,643,644,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</chunk>
<chunk x="16" y="0" width="16" height="16">
645,646,641,642,643,1378,645,646,641,976,977,644,645,646,641,642,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
580,581,576,577,578,579,580,581,576,577,578,579,580,581,576,577,
593,594,589,590,591,592,593,594,589,590,591,592,593,594,589,590,
0,607,602,603,604,605,606,607,602,603,1325,1326,606,607,602,603,
0,620,615,616,617,618,619,620,615,616,1338,1339,619,620,615,616,
0,633,628,0,0,631,632,633,628,629,1397,631,632,633,628,629,
0,646,641,0,0,644,645,646,641,642,1410,644,645,646,641,642,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
580,581,576,577,578,579,580,581,576,577,578,579,580,581,576,577,
593,594,589,590,591,462,463,594,589,590,591,592,593,594,589,590,
455,607,602,603,604,475,476,607,602,603,604,605,606,607,602,603,
468,620,615,616,617,488,489,620,615,616,617,0,0,620,615,616,
632,633,628,629,630,631,632,633,628,629,630,0,0,633,628,629,
645,646,641,642,643,644,645,646,641,642,643,0,0,646,641,642,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</chunk>
<chunk x="32" y="0" width="16" height="16">
643,644,645,646,641,642,976,977,645,646,641,642,1378,644,645,646,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
578,579,580,581,576,0,578,579,580,581,576,577,578,579,580,581,
591,592,593,594,589,0,591,592,593,594,589,590,591,592,593,594,
604,605,606,607,602,0,604,605,606,607,602,603,604,605,606,607,
950,951,619,620,615,0,617,618,619,620,615,616,950,951,619,620,
963,964,632,633,628,0,630,631,632,633,628,629,963,964,632,633,
976,977,645,646,641,0,643,1378,645,646,641,642,976,977,645,646,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
578,579,580,581,576,577,578,579,580,581,576,577,578,579,580,581,
591,592,593,594,589,590,591,592,593,594,589,590,591,592,593,594,
604,605,606,607,602,603,604,605,606,0,0,603,604,605,606,607,
950,951,619,620,615,616,617,618,619,0,0,616,617,618,619,620,
963,964,632,633,628,629,630,631,0,0,0,0,630,631,632,633,
976,977,645,646,641,642,643,644,0,0,0,0,643,644,645,1378,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</chunk>
</data>
</layer>
<layer id="4" name="Boxes" class="Platform" width="30" height="20">
<data encoding="csv">
<chunk x="0" y="-16" width="16" height="16">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,1567,1568,0,0,0,0,0,0,0,0,0,0,0,0
</chunk>
<chunk x="16" y="-16" width="16" height="16">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,1567,1568,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,1580,1581,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</chunk>
<chunk x="0" y="0" width="16" height="16">
0,0,1580,1581,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</chunk>
<chunk x="16" y="0" width="16" height="16">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,1567,1568,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,1580,1581,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,1582,1583,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,1567,1568,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,1580,1581,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</chunk>
<chunk x="32" y="0" width="16" height="16">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1238,1238,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1567,1568,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1580,1581,0,0,0,0,0,
0,0,0,0,0,0,0,0,1567,1568,1567,1568,0,0,0,0,
0,0,0,0,0,0,0,0,1580,1581,1580,1581,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</chunk>
</data>
</layer>
<objectgroup id="6" name="Player" class="LivingEntities.Player">
<object id="60" x="240" y="10.6667">
<point/>
</object>
</objectgroup>
<objectgroup id="3" name="Doors">
<object id="26" type="Entities.TeleportingDoor" gid="873" x="16" y="240.091" width="32" height="48">
<properties>
<property name="destination" type="object" value="27"/>
</properties>
</object>
<object id="27" type="Entities.TeleportingDoor" gid="873" x="128" y="128" width="32" height="48">
<properties>
<property name="destination" type="object" value="26"/>
</properties>
</object>
<object id="28" type="Entities.Door" gid="873" x="224.091" y="16" width="32" height="48"/>
<object id="29" type="Entities.TeleportingDoor" gid="873" x="400" y="16.0625" width="32" height="48">
<properties>
<property name="destination" type="object" value="30"/>
</properties>
</object>
<object id="30" type="Entities.TeleportingDoor" gid="873" x="32" y="-96.0909" width="32" height="48">
<properties>
<property name="destination" type="object" value="29"/>
</properties>
</object>
<object id="31" type="Entities.TeleportingDoor" gid="873" x="127.909" y="-207.909" width="32" height="48">
<properties>
<property name="destination" type="object" value="32"/>
</properties>
</object>
<object id="32" type="Entities.TeleportingDoor" gid="873" x="703.909" y="127.909" width="32" height="48">
<properties>
<property name="destination" type="object" value="31"/>
</properties>
</object>
<object id="33" type="Entities.TeleportingDoor" gid="873" x="512" y="128.182" width="32" height="48">
<properties>
<property name="destination" type="object" value="34"/>
</properties>
</object>
<object id="34" type="Entities.TeleportingDoor" gid="873" x="703.909" y="-96.0909" width="32" height="48">
<properties>
<property name="destination" type="object" value="33"/>
</properties>
</object>
<object id="35" type="Entities.TeleportingDoor" gid="873" x="703.909" y="-208" width="32" height="48">
<properties>
<property name="nextLevel" type="bool" value="true"/>
</properties>
</object>
<object id="36" type="Entities.Door" gid="873" x="512" y="239.938" width="32" height="48"/>
<object id="37" type="Entities.Door" gid="873" x="224" y="-96.0909" width="32" height="48"/>
<object id="38" type="Entities.Door" gid="873" x="416" y="-208" width="32" height="48"/>
<object id="39" type="Entities.Door" gid="873" x="608" y="16" width="32" height="48"/>
</objectgroup>
<objectgroup id="5" name="Monsters">
<object id="42" type="LivingEntities.Monsters.Spider" x="93" y="157">
<point/>
</object>
<object id="43" type="LivingEntities.Monsters.Slime" x="464" y="150">
<point/>
</object>
<object id="44" type="LivingEntities.Monsters.Zombie" x="227" y="220">
<point/>
</object>
<object id="45" type="LivingEntities.Monsters.Ghost" x="751" y="103">
<point/>
</object>
<object id="46" type="LivingEntities.Monsters.Zombie" x="559" y="107">
<point/>
</object>
<object id="47" type="LivingEntities.Monsters.Slime" x="131" y="41">
<point/>
</object>
<object id="48" type="LivingEntities.Monsters.Zombie" x="90" y="113">
<point/>
</object>
<object id="49" type="LivingEntities.Monsters.Zombie" x="85" y="-3">
<point/>
</object>
<object id="51" type="LivingEntities.Monsters.Zombie" x="658" y="-10">
<point/>
</object>
<object id="52" type="LivingEntities.Monsters.Spider" x="465" y="-71">
<point/>
</object>
<object id="53" type="LivingEntities.Monsters.Zombie" x="123" y="-116">
<point/>
</object>
<object id="54" type="LivingEntities.Monsters.Zombie" x="274" y="-113">
<point/>
</object>
<object id="55" type="LivingEntities.Monsters.Zombie" x="660" y="-120">
<point/>
</object>
<object id="56" type="LivingEntities.Monsters.Ghost" x="445" y="-126">
<point/>
</object>
<object id="57" type="LivingEntities.Monsters.Zombie" x="179" y="-228">
<point/>
</object>
<object id="58" type="LivingEntities.Monsters.Zombie" x="268" y="-229">
<point/>
</object>
<object id="59" type="LivingEntities.Monsters.Frank" x="549" y="-229">
<point/>
</object>
</objectgroup>
</map>

View file

Before

Width:  |  Height:  |  Size: 464 KiB

After

Width:  |  Height:  |  Size: 464 KiB

View file

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View file

@ -23,7 +23,7 @@ internal class DeathGUI : AbstractGui
Elements.Add(butMenu); Elements.Add(butMenu);
butMenu.LeftButtonPressed += () => butMenu.LeftButtonPressed += () =>
{ {
AppManager.Instance.ChangeGameState(GameState.Menu); AppManager.Instance.Restart("lvl");
}; };
foreach (var item in Elements) foreach (var item in Elements)
{ {

View file

@ -135,6 +135,7 @@ namespace DangerousD.GameCore.GUI
}; };
Elements.Add(joinByIpButton); Elements.Add(joinByIpButton);
joinByIpButton.LeftButtonPressed += () => { joinByIpButton.LeftButtonPressed += () => {
AppManager.Instance.ChangeGameState(GameState.Game);
AppManager.Instance.NetworkManager.ClientInit(searchBarTextBox.text); AppManager.Instance.NetworkManager.ClientInit(searchBarTextBox.text);
}; };
} }

View file

@ -21,7 +21,7 @@ namespace DangerousD.GameCore.GameObjects.Entities
Height = (int)size.Y; Height = (int)size.Y;
} }
protected override GraphicsComponent GraphicsComponent { get; } = new("doors"); protected override GraphicsComponent GraphicsComponent { get; } = new("door");
public override void Update(GameTime gameTime) public override void Update(GameTime gameTime)
{ {

View file

@ -36,9 +36,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
public abstract void Move(GameTime gameTime); public abstract void Move(GameTime gameTime);
public void TakeDamage(int damage) public virtual void TakeDamage()
{ {
monster_health -= damage; monster_health--;
if (monster_health <= 0) if (monster_health <= 0)
{ {
Death(); Death();

View file

@ -32,6 +32,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters
rightBorder = (int)position.X + 100; rightBorder = (int)position.X + 100;
physicsManager = new PhysicsManager(); physicsManager = new PhysicsManager();
Random random = new Random(); Random random = new Random();
monster_health = 2;
if(random.Next(0, 2) == 0) if(random.Next(0, 2) == 0)
{ {
isGoRight = true; isGoRight = true;
@ -183,10 +184,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters
public override void Attack(GameTime gameTime) public override void Attack(GameTime gameTime)
{} {}
public void TakeDamage() public override void TakeDamage()
{ {
monster_health--; monster_health--;
GraphicsComponent.StartAnimation("ZombieRightAttack");
Particle particle = new Particle(Pos); Particle particle = new Particle(Pos);
if (monster_health <= 0) if (monster_health <= 0)
{ {

View file

@ -25,14 +25,15 @@ namespace DangerousD.GameCore.GameObjects.PlayerDeath
private void PlayDeath(string deathName) private void PlayDeath(string deathName)
{ {
if (GraphicsComponent.GetCurrentAnimation != "DeathFromZombie") //if (GraphicsComponent.GetCurrentAnimation != "DeathFromZombie")
{ //{
GraphicsComponent.StartAnimation("DeathFromZombie"); // GraphicsComponent.StartAnimation("DeathFromZombie");
} //}
if (GraphicsComponent.GetCurrentAnimation != "DeathFromSilasHand") //if (GraphicsComponent.GetCurrentAnimation != "DeathFromSilasHand")
{ //{
GraphicsComponent.StartAnimation("DeathFromSilasHand"); // GraphicsComponent.StartAnimation("DeathFromSilasHand");
} //}
GraphicsComponent.StartAnimation(deathName);
} }
} }

View file

@ -10,6 +10,7 @@ using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Graphics;
using DangerousD.GameCore.GameObjects.LivingEntities.Monsters; using DangerousD.GameCore.GameObjects.LivingEntities.Monsters;
using DangerousD.GameCore.Network; using DangerousD.GameCore.Network;
using DangerousD.GameCore.GameObjects.MapObjects;
namespace DangerousD.GameCore.GameObjects.LivingEntities namespace DangerousD.GameCore.GameObjects.LivingEntities
{ {
@ -65,6 +66,10 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
{ {
bullets++; bullets++;
} }
if(a == "playerShootBoomUpRight" || a == "playerShootBoomUpLeft")
{
isShooting = false;
}
}; };
} }
@ -73,7 +78,8 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
public bool IsAlive { get { return isAlive; } } public bool IsAlive { get { return isAlive; } }
protected override GraphicsComponent GraphicsComponent { get; } = new(new List<string> { "playerMoveLeft", "playerMoveRight", "DeathFromZombie", "playerRightStay", "playerStayLeft", protected override GraphicsComponent GraphicsComponent { get; } = new(new List<string> { "playerMoveLeft", "playerMoveRight", "DeathFromZombie", "playerRightStay", "playerStayLeft",
"playerJumpRight" , "playerJumpLeft", "playerShootLeft", "playerShootRight", "playerReload", "smokeAfterShoot", "playerShootUpRight", "playerShootUpLeft"}, "playerReload"); "playerJumpRight" , "playerJumpLeft", "playerShootLeft", "playerShootRight", "playerReload", "smokeAfterShoot", "playerShootUpRight", "playerShootUpLeft", "playerShootBoomUpRight",
"playerShootBoomUpLeft"}, "playerReload");
public void Attack() public void Attack()
{ {
@ -89,10 +95,10 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
} }
public Rectangle GetShootRectangle(bool isRight) public Rectangle GetShootRectangle(bool isRight)
{ {
if (isRight) if (isRight)
return new Rectangle((int)Pos.X, (int)(Pos.Y) + 10, shootLength + Width, Height / 2); return new Rectangle((int)Pos.X, (int)(Pos.Y) + 10, shootLength + Width, Height / 2);
else else
return new Rectangle((int)Pos.X-shootLength, (int)(Pos.Y) + 10, shootLength, Height / 2); return new Rectangle((int)Pos.X - shootLength, (int)(Pos.Y) + 10, shootLength, Height / 2);
} }
public override void Draw(SpriteBatch spriteBatch) public override void Draw(SpriteBatch spriteBatch)
{ {
@ -118,7 +124,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
return; return;
} }
isAttacked = true; isAttacked = true;
if(monsterName == "Zombie") if (monsterName == "Zombie")
{ {
AnimationRectangle deathRectangle = new AnimationRectangle(Pos, "DeathFrom" + monsterName); AnimationRectangle deathRectangle = new AnimationRectangle(Pos, "DeathFrom" + monsterName);
deathRectangle.Gr.actionOfAnimationEnd += (a) => deathRectangle.Gr.actionOfAnimationEnd += (a) =>
@ -129,7 +135,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
} }
}; };
} }
else if(monsterName == "Spider") else if (monsterName == "Spider")
{ {
AnimationRectangle deathRectangle = new AnimationRectangle(Pos, "DeathFrom" + monsterName); AnimationRectangle deathRectangle = new AnimationRectangle(Pos, "DeathFrom" + monsterName);
deathRectangle.Gr.actionOfAnimationEnd += (a) => deathRectangle.Gr.actionOfAnimationEnd += (a) =>
@ -184,41 +190,37 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
bullets--; bullets--;
if (isRight) if (isRight)
{ {
StartCicycleAnimation("playerShootRight"); if (!isUping)
var targets = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)(Pos.Y - 10f), shootLength + 24, 10), typeof(Zombie)).OrderBy(x => (x.Pos - Pos).LengthSquared());
if (targets.Count() > 0)
{ {
Zombie targetZombie = (Zombie)targets.First(); StartCicycleAnimation("playerShootRight");
targetZombie.TakeDamage(); Bullet bullet = new Bullet(new Vector2(Pos.X + 16, Pos.Y));
bullet.ShootRight();
SmokeAfterShoot smokeAfterShoot = new SmokeAfterShoot(new Vector2(Pos.X + 12, Pos.Y - 8));
} }
targets = AppManager.Instance.GameManager.physicsManager.CheckRectangle(GetShootRectangle(isRight), typeof(SilasHands)).OrderBy(x => (x.Pos - Pos).LengthSquared()); else
if (targets.Count() > 0)
{ {
SilasHands targetHand = (SilasHands)targets.First(); StartCicycleAnimation("playerShootBoomUpRight");
targetHand.TakeDamage(); Bullet bullet = new Bullet(new Vector2(Pos.X + 16, Pos.Y));
bullet.ShootUpRight();
SmokeAfterShoot smokeAfterShoot = new SmokeAfterShoot(new Vector2(Pos.X + 12, Pos.Y - 8));
} }
SmokeAfterShoot smokeAfterShoot = new SmokeAfterShoot(new Vector2(Pos.X + 30, Pos.Y + 7));
} }
else else if(!isRight)
{ {
StartCicycleAnimation("playerShootLeft"); if (!isUping)
var targets = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X - shootLength, (int)(Pos.Y - 10f), shootLength, 10), typeof(Zombie));
if (targets != null)
{ {
foreach (var target in targets) StartCicycleAnimation("playerShootBoomUpLeft");
{ Bullet bullet = new Bullet(new Vector2(Pos.X, Pos.Y));
Zombie targetZombie = (Zombie)target; bullet.ShootLeft();
targetZombie.TakeDamage(); SmokeAfterShoot smokeAfterShoot = new SmokeAfterShoot(new Vector2(Pos.X - 6, Pos.Y - 7));
}
} }
targets = AppManager.Instance.GameManager.physicsManager.CheckRectangle(GetShootRectangle(isRight), typeof(SilasHands)); else
if (targets.Count() > 0)
{ {
SilasHands targetHand = (SilasHands)targets.First(); StartCicycleAnimation("playerShootBoomUpLeft");
targetHand.TakeDamage(); Bullet bullet = new Bullet(new Vector2(Pos.X, Pos.Y));
bullet.ShootUpLeft();
SmokeAfterShoot smokeAfterShoot = new SmokeAfterShoot(new Vector2(Pos.X - 6, Pos.Y - 7));
} }
SmokeAfterShoot smokeAfterShoot = new SmokeAfterShoot(new Vector2(Pos.X - 12, Pos.Y + 7));
} }
} }
} }
@ -239,7 +241,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
FallingThroughPlatform = false; FallingThroughPlatform = false;
} }
GraphicsComponent.SetCameraPosition(Pos); GraphicsComponent.SetCameraPosition(Pos);
if (!isAttacked || AppManager.Instance.InputManager.InvincibilityCheat) if (!isAttacked || AppManager.Instance.InputManager.InvincibilityCheat)
{ {
if (!isShooting) if (!isShooting)
{ {
@ -282,14 +284,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
} }
else if (AppManager.Instance.InputManager.VectorMovementDirection.X == 0)//стоит else if (AppManager.Instance.InputManager.VectorMovementDirection.X == 0)//стоит
{ {
if(bullets < 5) if (isRight)
{
if (GraphicsComponent.GetCurrentAnimation != "playerReload")
{
GraphicsComponent.StartAnimation("playerReload");
}
}
else if (isRight)
{ {
if (isUping) if (isUping)
{ {
@ -298,6 +293,13 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
GraphicsComponent.StartAnimation("playerShootUpRight"); GraphicsComponent.StartAnimation("playerShootUpRight");
} }
} }
else if (bullets < 5)
{
if (GraphicsComponent.GetCurrentAnimation != "playerReload")
{
GraphicsComponent.StartAnimation("playerReload");
}
}
else else
{ {
GraphicsComponent.StartAnimation("playerRightStay"); GraphicsComponent.StartAnimation("playerRightStay");
@ -312,6 +314,13 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
GraphicsComponent.StartAnimation("playerShootUpLeft"); GraphicsComponent.StartAnimation("playerShootUpLeft");
} }
} }
else if (bullets < 5)
{
if (GraphicsComponent.GetCurrentAnimation != "playerReload")
{
GraphicsComponent.StartAnimation("playerReload");
}
}
else else
{ {
GraphicsComponent.StartAnimation("playerStayLeft"); GraphicsComponent.StartAnimation("playerStayLeft");
@ -319,11 +328,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
} }
} }
} }
if (AppManager.Instance.multiPlayerStatus != MultiPlayerStatus.SinglePlayer)
{
NetworkTask task = new NetworkTask(id, Pos);
AppManager.Instance.NetworkTasks.Add(task);
}
} }
public void MoveDown() public void MoveDown()
{ {
@ -331,13 +335,89 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities
isOnGround = false; isOnGround = false;
} }
public class Bullet : GameObjects.LivingEntity public class Bullet : LivingEntity
{ {
public Bullet(Vector2 position) : base(position) public Bullet(Vector2 position) : base(position)
{ {
Height = 5;
Width = 5;
}
protected override GraphicsComponent GraphicsComponent { get; } = new(new List<string> { "playerMoveLeft" }, "playerMoveLeft");
Vector2 direction;
Vector2 maindirection;
public void ShootUpRight()
{
direction = new Vector2(1, -1);
acceleration = Vector2.Zero;
velocity = new Vector2(10, 10) * direction;
maindirection = velocity;
if (AppManager.Instance.multiPlayerStatus == MultiPlayerStatus.Client)
{
NetworkTask task = new NetworkTask(typeof(Bullet), Pos, id, velocity);
AppManager.Instance.NetworkTasks.Add(task);
AppManager.Instance.GameManager.Remove(this);
}
}
public void ShootRight()
{
direction = new Vector2(1, 0);
acceleration = Vector2.Zero;
velocity = new Vector2(10, 10) * direction;
maindirection = velocity;
if (AppManager.Instance.multiPlayerStatus == MultiPlayerStatus.Client)
{
NetworkTask task = new NetworkTask(typeof(Bullet), Pos, id, velocity);
AppManager.Instance.NetworkTasks.Add(task);
AppManager.Instance.GameManager.Remove(this);
}
}
public void ShootLeft()
{
direction = new Vector2(-1, 0);
acceleration = Vector2.Zero;
velocity = new Vector2(10, 10) * direction;
maindirection = velocity;
if (AppManager.Instance.multiPlayerStatus == MultiPlayerStatus.Client)
{
NetworkTask task = new NetworkTask(typeof(Bullet), Pos, id, velocity);
AppManager.Instance.NetworkTasks.Add(task);
AppManager.Instance.GameManager.Remove(this);
}
}
public void ShootUpLeft()
{
direction = new Vector2(-1, -1);
acceleration = Vector2.Zero;
velocity = new Vector2(10, 10) * direction;
maindirection = velocity;
if (AppManager.Instance.multiPlayerStatus == MultiPlayerStatus.Client)
{
NetworkTask task = new NetworkTask(typeof(Bullet), Pos, id, velocity);
AppManager.Instance.NetworkTasks.Add(task);
AppManager.Instance.GameManager.Remove(this);
}
}
public override void OnCollision(GameObject gameObject)
{
if (gameObject is not Player)
{
if (gameObject is CoreEnemy)
{
CoreEnemy enemy = (CoreEnemy)gameObject;
enemy.TakeDamage();
AppManager.Instance.GameManager.Remove(this);
}
base.OnCollision(gameObject);
}
}
public override void Update(GameTime gameTime)
{
if (maindirection != velocity)
{
AppManager.Instance.GameManager.Remove(this);
}
base.Update(gameTime);
} }
protected override GraphicsComponent GraphicsComponent { get; } = new("ZombieMoveLeft");
} }
} }
} }

View file

@ -10,6 +10,8 @@ public abstract class LivingEntity : Entity
public Vector2 velocity; public Vector2 velocity;
public Vector2 acceleration; public Vector2 acceleration;
public Vector2 Acceleration { get; private set; }
public LivingEntity(Vector2 position) : base(position) public LivingEntity(Vector2 position) : base(position)
{ {
acceleration = new Vector2(0, 30); acceleration = new Vector2(0, 30);

View file

@ -23,7 +23,7 @@ namespace DangerousD.GameCore
public class AppManager : Game public class AppManager : Game
{ {
public static AppManager Instance { get; private set; } public static AppManager Instance { get; private set; }
public string IpAddress { get; private set; } = "127.0.0.1"; public string IpAddress { get; private set; } = "0.0.0.0";
private GraphicsDeviceManager _graphics; private GraphicsDeviceManager _graphics;
private SpriteBatch _spriteBatch; private SpriteBatch _spriteBatch;
public GameState gameState { get; private set; } public GameState gameState { get; private set; }
@ -208,7 +208,7 @@ namespace DangerousD.GameCore
case GameState.Lobby: case GameState.Lobby:
break; break;
case GameState.Game: case GameState.Game:
GameManager.mapManager.LoadLevel("lvl"); GameManager.mapManager.LoadLevel(currentMap);
GameManager.FindBorders(); GameManager.FindBorders();
break; break;
case GameState.Death: case GameState.Death:
@ -220,6 +220,7 @@ namespace DangerousD.GameCore
public void NetworkSync(List<NetworkTask> networkTasks) public void NetworkSync(List<NetworkTask> networkTasks)
{ {
DebugHUD.Log("networksync");
foreach (NetworkTask networkTask in networkTasks) foreach (NetworkTask networkTask in networkTasks)
{ {
switch (networkTask.operation) switch (networkTask.operation)
@ -235,6 +236,12 @@ namespace DangerousD.GameCore
SoundManager.StartSound(networkTask.name, networkTask.position, GameManager.GetPlayer1.Pos); SoundManager.StartSound(networkTask.name, networkTask.position, GameManager.GetPlayer1.Pos);
break; break;
case NetworkTaskOperationEnum.CreateEntity: case NetworkTaskOperationEnum.CreateEntity:
if (networkTask.type == typeof(Player.Bullet))
{
Player.Bullet bullet = new Player.Bullet(networkTask.position);
bullet.id = networkTask.objId;
bullet.velocity = networkTask.velocity;
}
break; break;
case NetworkTaskOperationEnum.SendPosition: case NetworkTaskOperationEnum.SendPosition:
if (networkTask.objId != GameManager.GetPlayer1.id ) if (networkTask.objId != GameManager.GetPlayer1.id )
@ -326,7 +333,9 @@ namespace DangerousD.GameCore
} }
public void Restart(string map) public void Restart(string map)
{ {
GameManager = new();
ChangeGameState(GameState.Menu);
currentMap = map;
} }
} }
} }

View file

@ -30,6 +30,9 @@ namespace DangerousD.GameCore
public List<GameObject> otherObjects = new(); public List<GameObject> otherObjects = new();
public Vector4 CameraBorder; public Vector4 CameraBorder;
public Player GetPlayer1 { get; private set; } public Player GetPlayer1 { get; private set; }
private int _lastUpdate = 0;
private int _currTime = 0;
public GameManager() public GameManager()
{ {
others = new List<GameObject>(); others = new List<GameObject>();
@ -130,10 +133,16 @@ namespace DangerousD.GameCore
public void Update(GameTime gameTime) public void Update(GameTime gameTime)
{ {
_currTime += gameTime.ElapsedGameTime.Milliseconds;
if (AppManager.Instance.NetworkTasks.Count > 0) if (AppManager.Instance.NetworkTasks.Count > 0)
{ {
AppManager.Instance.NetworkManager.SendMsg(AppManager.Instance.NetworkTasks.ToList()); if (_currTime - _lastUpdate > 50)
AppManager.Instance.NetworkTasks.Clear(); {
AppManager.Instance.DebugHUD.Log("sending");
AppManager.Instance.NetworkManager.SendMsg(AppManager.Instance.NetworkTasks.ToList());
AppManager.Instance.NetworkTasks.Clear();
_lastUpdate = _currTime;
}
} }
foreach (var item in BackgroundObjects) foreach (var item in BackgroundObjects)
item.Update(gameTime); item.Update(gameTime);

View file

@ -41,7 +41,7 @@ namespace DangerousD.GameCore.Managers
{ {
InstantiateTiles(layer, tileSize); InstantiateTiles(layer, tileSize);
} }
foreach (XmlNode layer in xml.DocumentElement.SelectNodes("objectgroup")) foreach (XmlNode layer in xml.DocumentElement.SelectNodes("objectgroup"))
{ {
InstantiateEntities(layer); InstantiateEntities(layer);
@ -91,16 +91,20 @@ namespace DangerousD.GameCore.Managers
private void InstantiateEntities(XmlNode group) private void InstantiateEntities(XmlNode group)
{ {
string entityGroup = group.Attributes["class"] is not null ? group.Attributes["class"].Value : ""; string entityGroup = group.Attributes["class"] is not null ? "." + group.Attributes["class"].Value : "";
Debug.Write(entityGroup);
float offsetX = group.Attributes["offsetx"] is not null ? float.Parse(group.Attributes["offsetx"].Value) : 0; float offsetX = group.Attributes["offsetx"] is not null ? float.Parse(group.Attributes["offsetx"].Value) : 0;
float offsetY = group.Attributes["offsety"] is not null ? float.Parse(group.Attributes["offsety"].Value) : 0; float offsetY = group.Attributes["offsety"] is not null ? float.Parse(group.Attributes["offsety"].Value) : 0;
foreach (XmlNode entity in group.ChildNodes) foreach (XmlNode entity in group.ChildNodes)
{ {
string entityType = entity.Attributes["type"] is not null ? "." + entity.Attributes["type"].Value : ""; string entityType = entity.Attributes["type"] is not null ? "." + entity.Attributes["type"].Value : "";
Type type = Type.GetType($"DangerousD.GameCore.GameObjects.{entityGroup}{entityType}"); Type type = Type.GetType($"DangerousD.GameCore.GameObjects{entityGroup}{entityType}");
Vector2 pos = Vector2 pos =
new Vector2(float.Parse(entity.Attributes["x"].Value, CultureInfo.InvariantCulture) + offsetX, new Vector2(float.Parse(entity.Attributes["x"].Value, CultureInfo.InvariantCulture) + offsetX,
float.Parse(entity.Attributes["y"].Value, CultureInfo.InvariantCulture) + offsetY) * _scale; float.Parse(entity.Attributes["y"].Value, CultureInfo.InvariantCulture) + offsetY) * _scale;
Entity inst; Entity inst;
if (type.Equals(typeof(Player))) if (type.Equals(typeof(Player)))
{ {
@ -111,6 +115,30 @@ namespace DangerousD.GameCore.Managers
int gid = entity.Attributes["gid"] is not null ? int.Parse(entity.Attributes["gid"].Value) : 0; int gid = entity.Attributes["gid"] is not null ? int.Parse(entity.Attributes["gid"].Value) : 0;
inst = (Entity)Activator.CreateInstance(type, pos, new Vector2(32, 48), new Rectangle((gid - 872)*32, 0, 32, 48)); inst = (Entity)Activator.CreateInstance(type, pos, new Vector2(32, 48), new Rectangle((gid - 872)*32, 0, 32, 48));
} }
else if (type.Equals(typeof(TeleportingDoor)))
{
int gid = entity.Attributes["gid"] is not null ? int.Parse(entity.Attributes["gid"].Value) : 0;
XmlNode node = entity.SelectSingleNode("properties/property[@name = 'nextLevel']");
bool resetLevel = node is not null ? bool.Parse(node.Attributes["value"].Value) : false;
if (resetLevel)
{
inst = (Entity)Activator.CreateInstance(type, pos, new Vector2(32, 48), new Rectangle((gid - 872) * 32, 0, 32, 48),
new Vector2(0,0),
() => { });
}
else
{
node = entity.SelectSingleNode("properties/property[@name = 'destination']");
string target = node is not null ? node.Attributes["value"].Value : "0";
XmlNode dest = group.SelectSingleNode($"object[@id = '{target}']");
inst = (Entity)Activator.CreateInstance(type, pos, new Vector2(32, 48), new Rectangle((gid - 872) * 32, 0, 32, 48),
new Vector2(float.Parse(dest.Attributes["x"].Value, CultureInfo.InvariantCulture) + offsetX,
float.Parse(dest.Attributes["y"].Value, CultureInfo.InvariantCulture) + offsetY) * _scale,
() => { });
}
}
else else
{ {
inst = (Entity)Activator.CreateInstance(type, pos); inst = (Entity)Activator.CreateInstance(type, pos);

View file

@ -21,27 +21,19 @@ namespace DangerousD.GameCore.Network
private void Init(string IpAddress) private void Init(string IpAddress)
{ {
try socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
{ IPAddress address = IPAddress.Parse(IpAddress);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); int port = 51873;
IPAddress address = IPAddress.Parse(IpAddress); endPoint = new IPEndPoint(address, port);
int port = 51873;
endPoint = new IPEndPoint(address, port);
}
catch { }
} }
private void AcceptSockets() private void AcceptSockets()
{ {
while (true) while (true)
{ {
try Socket clientSocket = socket.Accept();
{ clientSockets.Add(clientSocket);
Socket clientSocket = socket.Accept(); Thread receiveThread = new Thread(BeginHostReceive);
clientSockets.Add(clientSocket); receiveThread.Start(clientSocket);
Thread receiveThread = new Thread(BeginHostReceive);
receiveThread.Start(clientSocket);
}
catch { }
} }
} }
@ -50,46 +42,41 @@ namespace DangerousD.GameCore.Network
Socket clientSocket = clSocket as Socket; Socket clientSocket = clSocket as Socket;
while (clientSocket != null) while (clientSocket != null)
{ {
try byte[] bytesCount = new byte[4];
clientSocket.Receive(bytesCount);
int length = BitConverter.ToInt32(bytesCount);
byte[] Data = new byte[length];
StateObject so = new StateObject(clientSocket, Data);
while (so.UploadedBytesCount < length)
{ {
byte[] bytesCount = new byte[4]; int count = clientSocket.Receive(so.buffer, so.UploadedBytesCount, length - so.UploadedBytesCount, SocketFlags.None);
clientSocket.Receive(bytesCount); so.UploadedBytesCount += count;
byte[] Data = new byte[BitConverter.ToInt32(bytesCount)];
StateObject so = new StateObject(clientSocket, Data);
IAsyncResult count = clientSocket.BeginReceive(so.buffer, 0, so.bufferSize, SocketFlags.None, AsyncReceiveCallback, so);
} }
catch { } List<NetworkTask> tasks = JsonConvert.DeserializeObject<List<NetworkTask>>(Encoding.Unicode.GetString(so.buffer, 0, length));
GetReceivingMessages(tasks);
} }
} }
public void HostInit(string IpAddress) public void HostInit(string IpAddress)
{ {
try Init(IpAddress);
{ socket.Bind(endPoint);
Init(IpAddress); socket.Listen(4);
socket.Bind(endPoint); Thread acceptThread = new Thread(AcceptSockets);
socket.Listen(4); acceptThread.Start();
Thread acceptThread = new Thread(AcceptSockets); state = "Host";
acceptThread.Start(); AppManager.Instance.SetMultiplayerState(MultiPlayerStatus.Host);
state = "Host";
AppManager.Instance.SetMultiplayerState(MultiPlayerStatus.Host);
}
catch { }
} }
public void ClientInit(string IpAddress) public void ClientInit(string IpAddress)
{ {
try Init(IpAddress);
{ socket.Connect(endPoint);
Init(IpAddress); state = "Client";
socket.Connect(endPoint); Thread.Sleep(10);
state = "Client"; Thread ReceivingThread = new Thread(ReceiveMsgFromHost);
Thread.Sleep(10); ReceivingThread.Start();
Thread ReceivingThread = new Thread(ReceiveMsgFromHost); NetworkTask connectionTask = new NetworkTask("Player");
ReceivingThread.Start(); AppManager.Instance.NetworkTasks.Add(connectionTask);
NetworkTask connectionTask = new NetworkTask("Player"); AppManager.Instance.SetMultiplayerState(MultiPlayerStatus.Client);
AppManager.Instance.NetworkTasks.Add(connectionTask);
AppManager.Instance.SetMultiplayerState(MultiPlayerStatus.Client);
}
catch { }
} }
public void SendMsg(List<NetworkTask> networkTask, Socket ignoreSocket = null) public void SendMsg(List<NetworkTask> networkTask, Socket ignoreSocket = null)
{ {
@ -97,65 +84,38 @@ namespace DangerousD.GameCore.Network
int count = Data.Length; int count = Data.Length;
if (state == "Host") if (state == "Host")
{ {
try foreach (Socket socket in clientSockets)
{ {
foreach (Socket socket in clientSockets) if (!(socket == ignoreSocket))
{ {
if (!(socket == ignoreSocket)) socket.Send(BitConverter.GetBytes(count));
{ socket.Send(Data);
socket.Send(BitConverter.GetBytes(count));
socket.Send(Data);
}
} }
} }
catch { }
} }
else else
{ {
try socket.Send(BitConverter.GetBytes(count));
{ socket.Send(Data);
socket.Send(BitConverter.GetBytes(count));
socket.Send(Data);
}
catch { }
} }
} }
private void ReceiveMsgFromHost() private void ReceiveMsgFromHost()
{ {
while (true) while (true)
{ {
try byte[] bytesCount = new byte[4];
socket.Receive(bytesCount);
int length = BitConverter.ToInt32(bytesCount);
byte[] Data = new byte[length];
StateObject so = new StateObject(socket, Data);
while (so.UploadedBytesCount < length)
{ {
byte[] bytesCount = new byte[4]; int count = socket.Receive(so.buffer, so.UploadedBytesCount, length-so.UploadedBytesCount, SocketFlags.None);
socket.Receive(bytesCount); so.UploadedBytesCount += count;
byte[] Data = new byte[BitConverter.ToInt32(bytesCount)];
StateObject so = new StateObject(socket, Data);
IAsyncResult count = socket.BeginReceive(so.buffer, 0, so.bufferSize, SocketFlags.None, AsyncReceiveCallback, so);
} }
catch { } List<NetworkTask> tasks = JsonConvert.DeserializeObject<List<NetworkTask>>(Encoding.Unicode.GetString(so.buffer, 0, length));
GetReceivingMessages(tasks);
} }
} }
private void AsyncReceiveCallback(IAsyncResult ar)
{
try
{
StateObject so = ar.AsyncState as StateObject;
Socket clientSocket = so.workSocket;
int readCount = clientSocket.EndReceive(ar);
so.UploadedBytesCount += readCount;
so.sb.Append(Encoding.Unicode.GetString(so.buffer, 0, readCount));
if (so.UploadedBytesCount < so.bufferSize)
{
clientSocket.BeginReceive(so.buffer, 0, so.bufferSize, SocketFlags.None, new AsyncCallback(AsyncReceiveCallback), so);
}
else
{
List<NetworkTask> tasks = JsonConvert.DeserializeObject<List<NetworkTask>>(so.sb.ToString());
GetReceivingMessages(tasks);
}
}
catch { }
}
} }
} }

View file

@ -38,11 +38,12 @@ namespace DangerousD.GameCore.Network
/// <param name="EntityType"></param> /// <param name="EntityType"></param>
/// <param name="EntityPosition"></param> /// <param name="EntityPosition"></param>
/// <param name="ParentId"></param> /// <param name="ParentId"></param>
public NetworkTask(Type EntityType, Vector2 EntityPosition, int ParentId) public NetworkTask(Type EntityType, Vector2 EntityPosition, int ParentId, Vector2 velocity)
{ {
operation = NetworkTaskOperationEnum.CreateEntity; operation = NetworkTaskOperationEnum.CreateEntity;
type = EntityType; type = EntityType;
position = EntityPosition; position = EntityPosition;
this.velocity = velocity;
objId = ParentId; objId = ParentId;
} }

View file

@ -12,7 +12,6 @@ namespace DangerousD.GameCore.Network
public Socket workSocket; public Socket workSocket;
public int bufferSize; public int bufferSize;
public byte[] buffer; public byte[] buffer;
public StringBuilder sb = new StringBuilder();
public int UploadedBytesCount; public int UploadedBytesCount;
public StateObject(Socket socket, byte[] buffer) public StateObject(Socket socket, byte[] buffer)