From d84a8b712b13cba0cd0d34b297171e388e06c1dd Mon Sep 17 00:00:00 2001 From: Sergei Surovtsev Date: Mon, 10 Jun 2024 17:40:22 +0300 Subject: [PATCH] machete --- assets/levels/example.ldtk | 265 +++++++++++++++++------- assets/raw-pixelart/machete.jpg | Bin 0 -> 49009 bytes src/controls.rs | 154 ++++++++------ src/entities/characters/enemy.rs | 55 +++-- src/entities/characters/psychiatrist.rs | 66 +++++- src/entities/player.rs | 70 +++++-- src/entities/weapons/pill.rs | 8 +- src/gameplay/waves.rs | 16 +- src/main.rs | 6 +- src/ui.rs | 88 +++++++- 10 files changed, 522 insertions(+), 206 deletions(-) create mode 100644 assets/raw-pixelart/machete.jpg diff --git a/assets/levels/example.ldtk b/assets/levels/example.ldtk index e7e2c85..d2ee21f 100644 --- a/assets/levels/example.ldtk +++ b/assets/levels/example.ldtk @@ -11,7 +11,7 @@ "iid": "a3386460-7820-11ed-b6fd-157a63b4d02d", "jsonVersion": "1.5.3", "appBuildId": 475928, - "nextUid": 232, + "nextUid": 234, "identifierStyle": "Capitalize", "toc": [ { @@ -75,19 +75,34 @@ }, "worldX": 543, "worldY": 273, "widPx": 8, "heiPx": 8, "fields" : {} }] }, { - "identifier": "Psychiatrist", + "identifier": "Psychiatrist1", "instances": [{ "worldIid": "c9ef2d10-c640-11ed-ad34-f553e1d803f9", "levelIid": "d53f9950-c640-11ed-8430-4942c04951ff", "layerIid": "d53f9951-c640-11ed-8430-3f3f71a3daf1", - "entityIid": "9c94c930-fec0-11ee-91ea-c39aba4200e5" + "entityIid": "ecaef5c0-fec0-11ee-9504-cdc6542895b5" }], "instancesData": [{ "iids": { "worldIid": "c9ef2d10-c640-11ed-ad34-f553e1d803f9", "levelIid": "d53f9950-c640-11ed-8430-4942c04951ff", "layerIid": "d53f9951-c640-11ed-8430-3f3f71a3daf1", - "entityIid": "9c94c930-fec0-11ee-91ea-c39aba4200e5" - }, "worldX": 376, "worldY": 232, "widPx": 64, "heiPx": 32, "fields" : {} }] + "entityIid": "ecaef5c0-fec0-11ee-9504-cdc6542895b5" + }, "worldX": 360, "worldY": 216, "widPx": 64, "heiPx": 64, "fields" : {} }] + }, + { + "identifier": "Psychiatrist2", + "instances": [{ + "worldIid": "c9ef2d10-c640-11ed-ad34-f553e1d803f9", + "levelIid": "d53f9950-c640-11ed-8430-4942c04951ff", + "layerIid": "d53f9951-c640-11ed-8430-3f3f71a3daf1", + "entityIid": "01544ca0-fec0-11ee-9504-1d176128ecbc" + }], + "instancesData": [{ "iids": { + "worldIid": "c9ef2d10-c640-11ed-ad34-f553e1d803f9", + "levelIid": "d53f9950-c640-11ed-8430-4942c04951ff", + "layerIid": "d53f9951-c640-11ed-8430-3f3f71a3daf1", + "entityIid": "01544ca0-fec0-11ee-9504-1d176128ecbc" + }, "worldX": 360, "worldY": 312, "widPx": 64, "heiPx": 64, "fields" : {} }] } ], "worldLayout": null, @@ -1245,14 +1260,14 @@ "fieldDefs": [] }, { - "identifier": "Psychiatrist", + "identifier": "Psychiatrist1", "uid": 229, "tags": ["actor"], "exportToToc": true, "allowOutOfBounds": false, "doc": null, "width": 64, - "height": 32, + "height": 64, "resizableX": false, "resizableY": false, "minWidth": null, @@ -1319,6 +1334,82 @@ "tilesetUid": null } ] + }, + { + "identifier": "Psychiatrist2", + "uid": 232, + "tags": ["actor"], + "exportToToc": true, + "allowOutOfBounds": false, + "doc": null, + "width": 64, + "height": 64, + "resizableX": false, + "resizableY": false, + "minWidth": null, + "maxWidth": null, + "minHeight": null, + "maxHeight": null, + "keepAspectRatio": false, + "tileOpacity": 1, + "fillOpacity": 0.08, + "lineOpacity": 0, + "hollow": false, + "color": "#03CB7C", + "renderMode": "Tile", + "showName": true, + "tilesetId": 231, + "tileRenderMode": "Stretch", + "tileRect": { "tilesetUid": 231, "x": 0, "y": 0, "w": 32, "h": 32 }, + "uiTileRect": null, + "nineSliceBorders": [], + "maxCount": 0, + "limitScope": "PerLevel", + "limitBehavior": "MoveLastOne", + "pivotX": 0.5, + "pivotY": 0.5, + "fieldDefs": [ + { + "identifier": "is_dummy", + "doc": null, + "__type": "Bool", + "uid": 233, + "type": "F_Bool", + "isArray": false, + "canBeNull": false, + "arrayMinLength": null, + "arrayMaxLength": null, + "editorDisplayMode": "Hidden", + "editorDisplayScale": 1, + "editorDisplayPos": "Above", + "editorLinkStyle": "StraightArrow", + "editorDisplayColor": null, + "editorAlwaysShow": false, + "editorShowInWorld": true, + "editorCutLongValues": true, + "editorTextSuffix": null, + "editorTextPrefix": null, + "useForSmartColor": false, + "exportToToc": false, + "searchable": false, + "min": null, + "max": null, + "regex": null, + "acceptFileTypes": null, + "defaultOverride": { + "id": "V_Bool", + "params": [ true ] + }, + "textLanguageMode": null, + "symmetricalRef": false, + "autoChainRef": true, + "allowOutOfLevelRef": true, + "allowedRefs": "OnlySame", + "allowedRefsEntityUid": null, + "allowedRefTags": [], + "tilesetUid": null + } + ] } ], "tilesets": [ { @@ -1580,14 +1671,14 @@ "cachedPixelData": { "opaqueTiles": "0", "averageColors": "6655" } }, { - "__cWid": 1, - "__cHei": 1, + "__cWid": 4, + "__cHei": 4, "identifier": "Psychiatrist", "uid": 231, "relPath": "../sprites/psychiatrist.png", "embedAtlas": null, - "pxWid": 32, - "pxHei": 32, + "pxWid": 128, + "pxHei": 128, "tileGridSize": 32, "spacing": 0, "padding": 0, @@ -1596,7 +1687,7 @@ "enumTags": [], "customData": [], "savedSelections": [], - "cachedPixelData": { "opaqueTiles": "0", "averageColors": "ba88" } + "cachedPixelData": { "opaqueTiles": "0000000000000000", "averageColors": "0000a532b52200000000ba77ba7700000000bdcbcdcc000000007aaa9bbb0000" } } ], "enums": [{ "identifier": "Item", "uid": 66, "values": [], "iconTilesetUid": 104, "externalRelPath": null, "externalFileChecksum": null, "tags": [] }], "externalEnums": [], "levelFields": [ { @@ -1973,20 +2064,36 @@ "__worldY": 120 }, { - "__identifier": "Psychiatrist", - "__grid": [7,14], + "__identifier": "Psychiatrist1", + "__grid": [6,13], "__pivot": [0.5,0.5], "__tags": ["actor"], "__tile": { "tilesetUid": 231, "x": 0, "y": 0, "w": 32, "h": 32 }, "__smartColor": "#03CB7C", - "iid": "9c94c930-fec0-11ee-91ea-c39aba4200e5", + "iid": "ecaef5c0-fec0-11ee-9504-cdc6542895b5", "width": 64, - "height": 32, + "height": 64, "defUid": 229, - "px": [120,232], + "px": [104,216], "fieldInstances": [{ "__identifier": "is_dummy", "__type": "Bool", "__value": true, "__tile": null, "defUid": 230, "realEditorValues": [] }], - "__worldX": 376, - "__worldY": 232 + "__worldX": 360, + "__worldY": 216 + }, + { + "__identifier": "Psychiatrist2", + "__grid": [6,19], + "__pivot": [0.5,0.5], + "__tags": ["actor"], + "__tile": { "tilesetUid": 231, "x": 0, "y": 0, "w": 32, "h": 32 }, + "__smartColor": "#03CB7C", + "iid": "01544ca0-fec0-11ee-9504-1d176128ecbc", + "width": 64, + "height": 64, + "defUid": 232, + "px": [104,312], + "fieldInstances": [{ "__identifier": "is_dummy", "__type": "Bool", "__value": true, "__tile": null, "defUid": 233, "realEditorValues": [] }], + "__worldX": 360, + "__worldY": 312 } ] }, @@ -2149,66 +2256,66 @@ "gridTiles": [ { "px": [108,180], "src": [0,0], "f": 0, "t": 0, "d": [2598], "a": 1 }, { "px": [108,186], "src": [0,6], "f": 0, "t": 6, "d": [2684], "a": 1 }, - { "px": [378,420], "src": [30,0], "f": 0, "t": 5, "d": [6083], "a": 1 }, - { "px": [384,420], "src": [30,0], "f": 0, "t": 5, "d": [6084], "a": 1 }, - { "px": [144,426], "src": [0,0], "f": 0, "t": 0, "d": [6130], "a": 1 }, - { "px": [150,426], "src": [6,0], "f": 0, "t": 1, "d": [6131], "a": 1 }, - { "px": [156,426], "src": [12,0], "f": 0, "t": 2, "d": [6132], "a": 1 }, - { "px": [162,426], "src": [18,0], "f": 0, "t": 3, "d": [6133], "a": 1 }, - { "px": [168,426], "src": [24,0], "f": 0, "t": 4, "d": [6134], "a": 1 }, - { "px": [174,426], "src": [30,0], "f": 0, "t": 5, "d": [6135], "a": 1 }, - { "px": [378,426], "src": [30,6], "f": 0, "t": 11, "d": [6169], "a": 1 }, - { "px": [384,426], "src": [30,6], "f": 0, "t": 11, "d": [6170], "a": 1 }, - { "px": [144,432], "src": [0,6], "f": 0, "t": 6, "d": [6216], "a": 1 }, - { "px": [150,432], "src": [6,6], "f": 0, "t": 7, "d": [6217], "a": 1 }, - { "px": [156,432], "src": [12,6], "f": 0, "t": 8, "d": [6218], "a": 1 }, - { "px": [162,432], "src": [18,6], "f": 0, "t": 9, "d": [6219], "a": 1 }, - { "px": [168,432], "src": [24,6], "f": 0, "t": 10, "d": [6220], "a": 1 }, - { "px": [174,432], "src": [30,6], "f": 0, "t": 11, "d": [6221], "a": 1 }, - { "px": [144,438], "src": [0,12], "f": 0, "t": 12, "d": [6302], "a": 1 }, - { "px": [150,438], "src": [6,12], "f": 0, "t": 13, "d": [6303], "a": 1 }, - { "px": [156,438], "src": [12,12], "f": 0, "t": 14, "d": [6304], "a": 1 }, - { "px": [162,438], "src": [18,12], "f": 0, "t": 15, "d": [6305], "a": 1 }, - { "px": [168,438], "src": [24,12], "f": 0, "t": 16, "d": [6306], "a": 1 }, - { "px": [174,438], "src": [30,12], "f": 0, "t": 17, "d": [6307], "a": 1 }, - { "px": [144,444], "src": [0,18], "f": 0, "t": 18, "d": [6388], "a": 1 }, - { "px": [150,444], "src": [6,18], "f": 0, "t": 19, "d": [6389], "a": 1 }, - { "px": [156,444], "src": [12,18], "f": 0, "t": 20, "d": [6390], "a": 1 }, - { "px": [162,444], "src": [18,18], "f": 0, "t": 21, "d": [6391], "a": 1 }, - { "px": [168,444], "src": [24,18], "f": 0, "t": 22, "d": [6392], "a": 1 }, - { "px": [174,444], "src": [30,18], "f": 0, "t": 23, "d": [6393], "a": 1 }, - { "px": [144,450], "src": [0,24], "f": 0, "t": 24, "d": [6474], "a": 1 }, - { "px": [150,450], "src": [6,24], "f": 0, "t": 25, "d": [6475], "a": 1 }, - { "px": [156,450], "src": [12,24], "f": 0, "t": 26, "d": [6476], "a": 1 }, - { "px": [162,450], "src": [18,24], "f": 0, "t": 27, "d": [6477], "a": 1 }, - { "px": [168,450], "src": [24,24], "f": 0, "t": 28, "d": [6478], "a": 1 }, - { "px": [174,450], "src": [30,24], "f": 0, "t": 29, "d": [6479], "a": 1 }, - { "px": [144,456], "src": [0,30], "f": 0, "t": 30, "d": [6560], "a": 1 }, - { "px": [150,456], "src": [6,30], "f": 0, "t": 31, "d": [6561], "a": 1 }, - { "px": [156,456], "src": [12,30], "f": 0, "t": 32, "d": [6562], "a": 1 }, - { "px": [162,456], "src": [18,30], "f": 0, "t": 33, "d": [6563], "a": 1 }, - { "px": [168,456], "src": [24,30], "f": 0, "t": 34, "d": [6564], "a": 1 }, - { "px": [174,456], "src": [30,30], "f": 0, "t": 35, "d": [6565], "a": 1 }, - { "px": [348,456], "src": [0,36], "f": 0, "t": 36, "d": [6594], "a": 1 }, - { "px": [366,456], "src": [18,36], "f": 0, "t": 39, "d": [6597], "a": 1 }, - { "px": [144,462], "src": [0,36], "f": 0, "t": 36, "d": [6646], "a": 1 }, - { "px": [150,462], "src": [6,36], "f": 0, "t": 37, "d": [6647], "a": 1 }, - { "px": [156,462], "src": [12,36], "f": 0, "t": 38, "d": [6648], "a": 1 }, - { "px": [162,462], "src": [18,36], "f": 0, "t": 39, "d": [6649], "a": 1 }, - { "px": [168,462], "src": [24,36], "f": 0, "t": 40, "d": [6650], "a": 1 }, - { "px": [174,462], "src": [30,36], "f": 0, "t": 41, "d": [6651], "a": 1 }, - { "px": [144,468], "src": [0,42], "f": 0, "t": 42, "d": [6732], "a": 1 }, - { "px": [150,468], "src": [6,42], "f": 0, "t": 43, "d": [6733], "a": 1 }, - { "px": [156,468], "src": [12,42], "f": 0, "t": 44, "d": [6734], "a": 1 }, - { "px": [162,468], "src": [18,42], "f": 0, "t": 45, "d": [6735], "a": 1 }, - { "px": [168,468], "src": [24,42], "f": 0, "t": 46, "d": [6736], "a": 1 }, - { "px": [174,468], "src": [30,42], "f": 0, "t": 47, "d": [6737], "a": 1 }, - { "px": [144,474], "src": [0,48], "f": 0, "t": 48, "d": [6818], "a": 1 }, - { "px": [150,474], "src": [6,48], "f": 0, "t": 49, "d": [6819], "a": 1 }, - { "px": [156,474], "src": [12,48], "f": 0, "t": 50, "d": [6820], "a": 1 }, - { "px": [162,474], "src": [18,48], "f": 0, "t": 51, "d": [6821], "a": 1 }, - { "px": [168,474], "src": [24,48], "f": 0, "t": 52, "d": [6822], "a": 1 }, - { "px": [174,474], "src": [30,48], "f": 0, "t": 53, "d": [6823], "a": 1 } + { "px": [96,420], "src": [0,0], "f": 0, "t": 0, "d": [6036], "a": 1 }, + { "px": [102,420], "src": [6,0], "f": 0, "t": 1, "d": [6037], "a": 1 }, + { "px": [108,420], "src": [12,0], "f": 0, "t": 2, "d": [6038], "a": 1 }, + { "px": [114,420], "src": [18,0], "f": 0, "t": 3, "d": [6039], "a": 1 }, + { "px": [120,420], "src": [24,0], "f": 0, "t": 4, "d": [6040], "a": 1 }, + { "px": [126,420], "src": [30,0], "f": 0, "t": 5, "d": [6041], "a": 1 }, + { "px": [96,426], "src": [0,6], "f": 0, "t": 6, "d": [6122], "a": 1 }, + { "px": [102,426], "src": [6,6], "f": 0, "t": 7, "d": [6123], "a": 1 }, + { "px": [108,426], "src": [12,6], "f": 0, "t": 8, "d": [6124], "a": 1 }, + { "px": [114,426], "src": [18,6], "f": 0, "t": 9, "d": [6125], "a": 1 }, + { "px": [120,426], "src": [24,6], "f": 0, "t": 10, "d": [6126], "a": 1 }, + { "px": [126,426], "src": [30,6], "f": 0, "t": 11, "d": [6127], "a": 1 }, + { "px": [96,432], "src": [0,12], "f": 0, "t": 12, "d": [6208], "a": 1 }, + { "px": [102,432], "src": [6,12], "f": 0, "t": 13, "d": [6209], "a": 1 }, + { "px": [108,432], "src": [12,12], "f": 0, "t": 14, "d": [6210], "a": 1 }, + { "px": [114,432], "src": [18,12], "f": 0, "t": 15, "d": [6211], "a": 1 }, + { "px": [120,432], "src": [24,12], "f": 0, "t": 16, "d": [6212], "a": 1 }, + { "px": [126,432], "src": [30,12], "f": 0, "t": 17, "d": [6213], "a": 1 }, + { "px": [96,438], "src": [0,18], "f": 0, "t": 18, "d": [6294], "a": 1 }, + { "px": [102,438], "src": [6,18], "f": 0, "t": 19, "d": [6295], "a": 1 }, + { "px": [108,438], "src": [12,18], "f": 0, "t": 20, "d": [6296], "a": 1 }, + { "px": [114,438], "src": [18,18], "f": 0, "t": 21, "d": [6297], "a": 1 }, + { "px": [120,438], "src": [24,18], "f": 0, "t": 22, "d": [6298], "a": 1 }, + { "px": [126,438], "src": [30,18], "f": 0, "t": 23, "d": [6299], "a": 1 }, + { "px": [96,444], "src": [0,24], "f": 0, "t": 24, "d": [6380], "a": 1 }, + { "px": [102,444], "src": [6,24], "f": 0, "t": 25, "d": [6381], "a": 1 }, + { "px": [108,444], "src": [12,24], "f": 0, "t": 26, "d": [6382], "a": 1 }, + { "px": [114,444], "src": [18,24], "f": 0, "t": 27, "d": [6383], "a": 1 }, + { "px": [120,444], "src": [24,24], "f": 0, "t": 28, "d": [6384], "a": 1 }, + { "px": [126,444], "src": [30,24], "f": 0, "t": 29, "d": [6385], "a": 1 }, + { "px": [96,450], "src": [0,30], "f": 0, "t": 30, "d": [6466], "a": 1 }, + { "px": [102,450], "src": [6,30], "f": 0, "t": 31, "d": [6467], "a": 1 }, + { "px": [108,450], "src": [12,30], "f": 0, "t": 32, "d": [6468], "a": 1 }, + { "px": [114,450], "src": [18,30], "f": 0, "t": 33, "d": [6469], "a": 1 }, + { "px": [120,450], "src": [24,30], "f": 0, "t": 34, "d": [6470], "a": 1 }, + { "px": [126,450], "src": [30,30], "f": 0, "t": 35, "d": [6471], "a": 1 }, + { "px": [96,456], "src": [0,36], "f": 0, "t": 36, "d": [6552], "a": 1 }, + { "px": [102,456], "src": [6,36], "f": 0, "t": 37, "d": [6553], "a": 1 }, + { "px": [108,456], "src": [12,36], "f": 0, "t": 38, "d": [6554], "a": 1 }, + { "px": [114,456], "src": [18,36], "f": 0, "t": 39, "d": [6555], "a": 1 }, + { "px": [120,456], "src": [24,36], "f": 0, "t": 40, "d": [6556], "a": 1 }, + { "px": [126,456], "src": [30,36], "f": 0, "t": 41, "d": [6557], "a": 1 }, + { "px": [96,462], "src": [0,42], "f": 0, "t": 42, "d": [6638], "a": 1 }, + { "px": [102,462], "src": [6,42], "f": 0, "t": 43, "d": [6639], "a": 1 }, + { "px": [108,462], "src": [12,42], "f": 0, "t": 44, "d": [6640], "a": 1 }, + { "px": [114,462], "src": [18,42], "f": 0, "t": 45, "d": [6641], "a": 1 }, + { "px": [120,462], "src": [24,42], "f": 0, "t": 46, "d": [6642], "a": 1 }, + { "px": [126,462], "src": [30,42], "f": 0, "t": 47, "d": [6643], "a": 1 }, + { "px": [96,468], "src": [0,48], "f": 0, "t": 48, "d": [6724], "a": 1 }, + { "px": [102,468], "src": [6,48], "f": 0, "t": 49, "d": [6725], "a": 1 }, + { "px": [108,468], "src": [12,48], "f": 0, "t": 50, "d": [6726], "a": 1 }, + { "px": [114,468], "src": [18,48], "f": 0, "t": 51, "d": [6727], "a": 1 }, + { "px": [120,468], "src": [24,48], "f": 0, "t": 52, "d": [6728], "a": 1 }, + { "px": [126,468], "src": [30,48], "f": 0, "t": 53, "d": [6729], "a": 1 }, + { "px": [96,474], "src": [0,54], "f": 0, "t": 54, "d": [6810], "a": 1 }, + { "px": [102,474], "src": [6,54], "f": 0, "t": 55, "d": [6811], "a": 1 }, + { "px": [108,474], "src": [12,54], "f": 0, "t": 56, "d": [6812], "a": 1 }, + { "px": [114,474], "src": [18,54], "f": 0, "t": 57, "d": [6813], "a": 1 }, + { "px": [120,474], "src": [24,54], "f": 0, "t": 58, "d": [6814], "a": 1 }, + { "px": [126,474], "src": [30,54], "f": 0, "t": 59, "d": [6815], "a": 1 } ], "entityInstances": [] }, diff --git a/assets/raw-pixelart/machete.jpg b/assets/raw-pixelart/machete.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6715b5f96f3ee684b1fcbcd7fc333835d06ada02 GIT binary patch literal 49009 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%0Aqm!l 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�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 n*s(}$K|;AOx*ww8@+_)Q+;uiyU-)Q&f< literal 0 HcmV?d00001 diff --git a/src/controls.rs b/src/controls.rs index c25fdff..b3efc7a 100644 --- a/src/controls.rs +++ b/src/controls.rs @@ -8,9 +8,18 @@ use crate::{ sprites::*, }; -pub fn controls( +#[derive(Event, Copy, Clone, Reflect, Debug, PartialEq, Eq, Default)] +pub struct ControlEvent { + pub up: bool, + pub down: bool, + pub left: bool, + pub right: bool, + pub attack: bool, +} + +pub fn control_character( mut commands: Commands, - input: Res>, + mut ev_control: EventReader, mut query: Query< ( Entity, @@ -24,73 +33,92 @@ pub fn controls( >, spritesheets: Res, ) { - for (entity, mut texture_atlas, mut velocity, mut char_animation, mut sprite, _player) in - &mut query - { - // no control during attack phase - if char_animation.animation_type == AnimationType::Attack { - return; - } - - if input.pressed(KeyCode::Space) { - char_animation.animation_type = AnimationType::Attack; - texture_atlas.clone_from(&spritesheets.player_atlas_2); - - let indices = - get_animation_indices(char_animation.animation_type, char_animation.direction); - sprite.index = indices.first; - velocity.linvel = Vec2::ZERO; - - commands - .promise(|| (entity)) - .then(asyn!(state => { - state.asyn().timeout(0.3) - })) - .then( - asyn!(state, mut ev_attack: EventWriter => { - let event = PlayerAttackEvent { entity: state.value }; - ev_attack.send(event); - }), - ); - } else { - let right = if input.pressed(KeyCode::D) { 1. } else { 0. }; - let left = if input.pressed(KeyCode::A) { 1. } else { 0. }; - let up = if input.pressed(KeyCode::W) { 1. } else { 0. }; - let down = if input.pressed(KeyCode::S) { 1. } else { 0. }; - - velocity.linvel.x = right - left; - velocity.linvel.y = up - down; - - velocity.linvel = velocity.linvel.normalize_or_zero() * 100.; - - let linvel_norm = velocity.linvel.distance(Vec2::ZERO); - - // Change animation type if player moved - if char_animation.animation_type == AnimationType::Walk { - if velocity.linvel.x > 0. { - char_animation.direction = AnimationDirection::Right; - } else if velocity.linvel.x < 0. { - char_animation.direction = AnimationDirection::Left; - } else if velocity.linvel.y > 0. { - char_animation.direction = AnimationDirection::Up; - } else if velocity.linvel.y < 0. { - char_animation.direction = AnimationDirection::Down; - } + for control in ev_control.read() { + for (entity, mut texture_atlas, mut velocity, mut char_animation, mut sprite, _player) in + &mut query + { + // no control during attack phase + if char_animation.animation_type == AnimationType::Attack { + return; } - // Don't interrupt attack animation - if char_animation.animation_type != AnimationType::Attack { - // Change spritesheet - if char_animation.animation_type != AnimationType::Walk { - texture_atlas.clone_from(&spritesheets.player_atlas_1); + if control.attack { + char_animation.animation_type = AnimationType::Attack; + texture_atlas.clone_from(&spritesheets.player_atlas_2); + + let indices = + get_animation_indices(char_animation.animation_type, char_animation.direction); + sprite.index = indices.first; + velocity.linvel = Vec2::ZERO; + + commands + .promise(|| (entity)) + .then(asyn!(state => { + state.asyn().timeout(0.3) + })) + .then( + asyn!(state, mut ev_attack: EventWriter => { + let event = PlayerAttackEvent { entity: state.value }; + ev_attack.send(event); + }), + ); + } else { + let right = if control.right { 1. } else { 0. }; + let left = if control.left { 1. } else { 0. }; + let up = if control.up { 1. } else { 0. }; + let down = if control.down { 1. } else { 0. }; + + velocity.linvel.x = right - left; + velocity.linvel.y = up - down; + + velocity.linvel = velocity.linvel.normalize_or_zero() * 100.; + + let linvel_norm = velocity.linvel.distance(Vec2::ZERO); + + // Change animation type if player moved + if char_animation.animation_type == AnimationType::Walk { + if velocity.linvel.x > 0. { + char_animation.direction = AnimationDirection::Right; + } else if velocity.linvel.x < 0. { + char_animation.direction = AnimationDirection::Left; + } else if velocity.linvel.y > 0. { + char_animation.direction = AnimationDirection::Up; + } else if velocity.linvel.y < 0. { + char_animation.direction = AnimationDirection::Down; + } } - if linvel_norm == 0.0 { - char_animation.animation_type = AnimationType::Stand; - } else { - char_animation.animation_type = AnimationType::Walk; + // Don't interrupt attack animation + if char_animation.animation_type != AnimationType::Attack { + // Change spritesheet + if char_animation.animation_type != AnimationType::Walk { + texture_atlas.clone_from(&spritesheets.player_atlas_1); + } + + if linvel_norm == 0.0 { + char_animation.animation_type = AnimationType::Stand; + } else { + char_animation.animation_type = AnimationType::Walk; + } } } } } } + +pub fn keyboard_controls(input: Res>, mut ev_control: EventWriter) { + let mut control = ControlEvent { ..default() }; + + control.right = input.pressed(KeyCode::D); + control.left = input.pressed(KeyCode::A); + control.up = input.pressed(KeyCode::W); + control.down = input.pressed(KeyCode::S); + + // if input.pressed(KeyCode::Space) { + // // control.attack = true; + // } else { + + // } + + ev_control.send(control); +} diff --git a/src/entities/characters/enemy.rs b/src/entities/characters/enemy.rs index 91e8691..f5c224a 100644 --- a/src/entities/characters/enemy.rs +++ b/src/entities/characters/enemy.rs @@ -34,7 +34,8 @@ pub enum EnemyType { #[default] Mierda, Pendejo, - Psychiatrist, + Psychiatrist1, + Psychiatrist2, } #[derive(Clone, PartialEq, Debug, Default, Component, Reflect)] @@ -113,25 +114,30 @@ pub fn create_enemy_bundle( *spritesheet_type, ) } - EnemyType::Psychiatrist => { - let psychiatrist_sprite_sheet = if rand::random::() % 2 == 0 { - PSYCHIATRIST_1_ASSET_SHEET - } else { - PSYCHIATRIST_2_ASSET_SHEET - }; - ( - load_texture_atlas( - psychiatrist_sprite_sheet.to_string(), - asset_server, - 1, - 1, - None, - 128. * Vec2::ONE, - texture_atlasses, - ), - AnimatedCharacterType::NotAnimated, - ) - } + EnemyType::Psychiatrist1 => ( + load_texture_atlas( + PSYCHIATRIST_1_ASSET_SHEET.to_string(), + asset_server, + 1, + 1, + None, + 128. * Vec2::ONE, + texture_atlasses, + ), + AnimatedCharacterType::NotAnimated, + ), + EnemyType::Psychiatrist2 => ( + load_texture_atlas( + PSYCHIATRIST_2_ASSET_SHEET.to_string(), + asset_server, + 1, + 1, + None, + 128. * Vec2::ONE, + texture_atlasses, + ), + AnimatedCharacterType::NotAnimated, + ), }; let sprite_bundle = SpriteSheetBundle { @@ -271,7 +277,8 @@ pub fn handle_spawn_enemy( health: match ev_spawn.enemy_type { EnemyType::Mierda => 50, EnemyType::Pendejo => 100, - EnemyType::Psychiatrist => 5000, + EnemyType::Psychiatrist1 => 5000, + EnemyType::Psychiatrist2 => 5000, }, move_direction: Vec2::ZERO, hit_at: None, @@ -322,7 +329,8 @@ pub fn handle_enemy_hit( let damage = match enemy.enemy_type { EnemyType::Mierda => (1.0 * event.damage as f32) as u16, EnemyType::Pendejo => (0.5 * event.damage as f32) as u16, - EnemyType::Psychiatrist => (1.0 * event.damage as f32) as u16, + EnemyType::Psychiatrist1 => (1.0 * event.damage as f32) as u16, + EnemyType::Psychiatrist2 => (1.0 * event.damage as f32) as u16, }; let timer = Timer::new(std::time::Duration::from_millis(200), TimerMode::Once); @@ -363,7 +371,8 @@ pub fn despawn_dead_enemies( enemy.marked_for_despawn = true; score.score += match enemy.enemy_type { EnemyType::Mierda => 100, - EnemyType::Psychiatrist => 5000, + EnemyType::Psychiatrist1 => 5000, + EnemyType::Psychiatrist2 => 5000, EnemyType::Pendejo => 50, }; diff --git a/src/entities/characters/psychiatrist.rs b/src/entities/characters/psychiatrist.rs index 8d5c9fe..dde79d6 100644 --- a/src/entities/characters/psychiatrist.rs +++ b/src/entities/characters/psychiatrist.rs @@ -17,7 +17,19 @@ use super::enemy::{create_enemy_bundle, DirectionUpdateTime, Enemy, EnemyType}; // -------- #[derive(Default, Bundle, Clone)] -pub struct PsychiatristBundle { +pub struct Psychiatrist1Bundle { + pub spritesheet_bundle: SpriteSheetBundle, + pub character_animation: CharacterAnimation, + pub animation_timer: AnimationTimer, + pub enemy: Enemy, + pub collider_bundle: ColliderBundle, + pub active_events: ActiveEvents, + pub direction_update_time: DirectionUpdateTime, + pub animated_character_sprite: AnimatedCharacterSprite, +} + +#[derive(Default, Bundle, Clone)] +pub struct Psychiatrist2Bundle { pub spritesheet_bundle: SpriteSheetBundle, pub character_animation: CharacterAnimation, pub animation_timer: AnimationTimer, @@ -32,7 +44,40 @@ pub struct PsychiatristBundle { // LDTK // ---- -impl LdtkEntity for PsychiatristBundle { +impl LdtkEntity for Psychiatrist1Bundle { + fn bundle_entity( + entity_instance: &EntityInstance, + _: &LayerInstance, + _: Option<&Handle>, + _: Option<&TilesetDefinition>, + asset_server: &AssetServer, + texture_atlasses: &mut Assets, + ) -> Psychiatrist1Bundle { + let is_dummy = *entity_instance + .get_bool_field("is_dummy") + .expect("expected entity to have non-nullable name string field"); + + let enemy_bundle = create_enemy_bundle( + asset_server, + texture_atlasses, + is_dummy, + EnemyType::Psychiatrist1, + ); + + Psychiatrist1Bundle { + spritesheet_bundle: enemy_bundle.spritesheet_bundle, + character_animation: enemy_bundle.character_animation, + animation_timer: enemy_bundle.animation_timer, + enemy: enemy_bundle.enemy, + collider_bundle: enemy_bundle.collider_bundle, + active_events: enemy_bundle.active_events, + direction_update_time: enemy_bundle.direction_update_time, + animated_character_sprite: enemy_bundle.animated_character_sprite, + } + } +} + +impl LdtkEntity for Psychiatrist2Bundle { fn bundle_entity( entity_instance: &EntityInstance, _: &LayerInstance, @@ -40,7 +85,7 @@ impl LdtkEntity for PsychiatristBundle { _: Option<&TilesetDefinition>, asset_server: &AssetServer, texture_atlasses: &mut Assets, - ) -> PsychiatristBundle { + ) -> Psychiatrist2Bundle { let is_dummy = *entity_instance .get_bool_field("is_dummy") .expect("expected entity to have non-nullable name string field"); @@ -49,10 +94,10 @@ impl LdtkEntity for PsychiatristBundle { asset_server, texture_atlasses, is_dummy, - EnemyType::Psychiatrist, + EnemyType::Psychiatrist2, ); - PsychiatristBundle { + Psychiatrist2Bundle { spritesheet_bundle: enemy_bundle.spritesheet_bundle, character_animation: enemy_bundle.character_animation, animation_timer: enemy_bundle.animation_timer, @@ -76,7 +121,9 @@ pub fn psychiatrist_activity( for (mut v, mut psychiatrist) in q_psychiatrists .iter_mut() .filter(|(_, m)| !m.is_dummy) - .filter(|(_, m)| m.enemy_type == EnemyType::Psychiatrist) + .filter(|(_, m)| { + m.enemy_type == EnemyType::Psychiatrist1 || m.enemy_type == EnemyType::Psychiatrist2 + }) { let rotation_angle = time.elapsed_seconds().cos() * std::f32::consts::FRAC_PI_4; @@ -117,7 +164,9 @@ pub fn update_psychiatrists_move_direction( for (psychiatrist_position, mut direction_update_timer, mut psychiatrist) in los_pendejos .iter_mut() .filter(|(_, _, p)| !p.is_dummy) - .filter(|(_, _, p)| p.enemy_type == EnemyType::Psychiatrist) + .filter(|(_, _, p)| { + p.enemy_type == EnemyType::Psychiatrist1 || p.enemy_type == EnemyType::Psychiatrist2 + }) { direction_update_timer.timer.tick(time.delta()); @@ -140,7 +189,8 @@ pub struct PsychiatristPlugin; impl Plugin for PsychiatristPlugin { fn build(&self, app: &mut App) { - app.register_ldtk_entity::("Psychiatrist") + app.register_ldtk_entity::("Psychiatrist1") + .register_ldtk_entity::("Psychiatrist2") // Event Handlers .add_systems( Update, diff --git a/src/entities/player.rs b/src/entities/player.rs index a0d1e39..7d9d7f5 100644 --- a/src/entities/player.rs +++ b/src/entities/player.rs @@ -1,4 +1,4 @@ -use bevy::prelude::*; +use bevy::{ecs::event, prelude::*, time}; use bevy_ecs_ldtk::prelude::*; use bevy_kira_audio::prelude::*; use bevy_particle_systems::*; @@ -6,8 +6,8 @@ use bevy_particle_systems::*; use bevy_rapier2d::prelude::*; use crate::{ - gameover::GameOverEvent, loading::load_texture_atlas, physics::ColliderBundle, sprites::*, - ui::UIPlayerHealth, AudioAssets, GameState, + controls::ControlEvent, gameover::GameOverEvent, loading::load_texture_atlas, + physics::ColliderBundle, sprites::*, ui::UIPlayerHealth, AudioAssets, GameState, }; use super::characters::enemy::{Enemy, EnemyHitEvent}; @@ -16,6 +16,9 @@ use super::characters::enemy::{Enemy, EnemyHitEvent}; // Entities // -------- +#[derive(Component, Deref, DerefMut, Clone, Default, Reflect)] +pub struct MacheteTimer(pub Timer); + #[derive(Copy, Clone, Eq, PartialEq, Debug, Default, Component, Reflect)] pub struct Player { pub health: u16, @@ -31,6 +34,7 @@ pub struct PlayerBundle { pub collider_bundle: ColliderBundle, pub active_events: ActiveEvents, pub name: Name, + pub machete_timer: MacheteTimer, } // ---- @@ -87,6 +91,7 @@ impl LdtkEntity for PlayerBundle { animated_character_type: AnimatedCharacterType::Player, }, name: Name::new("Player"), + machete_timer: MacheteTimer(Timer::from_seconds(1.0, TimerMode::Repeating)), } } } @@ -105,6 +110,44 @@ pub struct PlayerHitEvent { pub entity: Entity, } +// ----------- +// Auto Attack +// ----------- + +pub fn handle_machete_attack( + time: Res