diff --git a/README.md b/README.md index e4a57f5..bb59e47 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ The synthetizer matrix can be edited using [HexoSynth](https://github.com/WeirdC ## License -GNU AGPL v3, CopyLeft 2022 Pascal Engélibert +GNU AGPL v3, CopyLeft 2022 Pascal Engélibert, Nixon Cheng This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, version 3 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. diff --git a/assets/init.hxy b/assets/init.hxy index 8ba0f92..3700a2f 100644 --- a/assets/init.hxy +++ b/assets/init.hxy @@ -1 +1 @@ -{"VERSION":2,"atoms":[["tseq",0,"cmode",["i",0]],["sfilter",0,"ftype",["i",8]],["delay",0,"mode",["i",0]],["delay",1,"mode",["i",0]],["out",0,"mono",["i",0]],["ad",0,"mult",["i",0]],["amp",0,"neg_att",["i",1]],["amp",1,"neg_att",["i",1]],["bosc",0,"wtype",["i",3]]],"cells":[["sin",1,1,2,[-1,-1,-1],[-1,"sig",-1]],["sin",0,1,3,[-1,-1,-1],["sig",-1,-1]],["sin",2,2,2,[-1,-1,-1],[-1,-1,"sig"]],["mix3",0,2,3,["ch3","ch2","ch1"],[-1,"sig",-1]],["ad",0,3,3,[-1,"inp",-1],[-1,"sig","sig"]],["amp",0,3,4,["inp",-1,-1],[-1,"sig",-1]],["amp",1,4,4,[-1,"inp",-1],[-1,-1,"sig"]],["out",0,4,5,["ch2","ch1",-1],[-1,-1,-1]]],"params":[["ad",0,"ashp",0.8149999976158142],["ad",0,"atk",15.0],["amp",0,"att",1.0],["amp",1,"att",1.0],["mix3",0,"ch1",0.0],["out",0,"ch1",0.0],["mix3",0,"ch2",0.0],["out",0,"ch2",0.0],["mix3",0,"ch3",0.0],["tseq",0,"clock",0.0],["ad",0,"dcy",1000.0],["sin",0,"det",0.0],["sin",1,"det",4.0],["sin",2,"det",7.0],["bosc",0,"det",0.0],["ad",0,"dshp",0.19500002264976501],["delay",0,"fb",0.6499999761581421],["delay",1,"fb",0.5999999642372131],["sin",0,"freq",440.0,0.0],["sin",1,"freq",440.0],["sin",2,"freq",440.0],["bosc",0,"freq",440.0],["sfilter",0,"freq",1900.0001220703125],["amp",0,"gain",0.9999999403953552],["amp",1,"gain",0.9999999403953552],["out",0,"gain",0.08999998867511749],["mix3",0,"gain1",0.9999999403953552],["mix3",0,"gain2",0.9999999403953552],["mix3",0,"gain3",0.9999999403953552],["amp",0,"inp",0.0],["amp",1,"inp",0.0],["ad",0,"inp",1.0],["delay",0,"inp",0.0],["delay",1,"inp",0.0],["sfilter",0,"inp",0.0],["delay",0,"mix",0.5],["delay",1,"mix",0.5],["mix3",0,"ogain",0.9999999403953552],["bosc",0,"pw",0.5,-0.25999999046325684],["sfilter",0,"res",0.5],["tslfo",0,"rev",0.5],["tslfo",1,"rev",0.5],["tslfo",2,"rev",0.5],["tslfo",3,"rev",0.5],["tslfo",0,"time",1699.99951171875],["tslfo",1,"time",22999.99609375],["tslfo",2,"time",19999.994140625],["tslfo",3,"time",499.99993896484375],["delay",0,"time",256.70001220703125,0.009999999776482582],["delay",1,"time",249.99998474121094,-0.007999999448657036],["tseq",0,"trig",0.0],["ad",0,"trig",0.0],["tslfo",0,"trig",0.0],["tslfo",1,"trig",0.0],["tslfo",2,"trig",0.0],["tslfo",3,"trig",0.0],["delay",0,"trig",0.0],["delay",1,"trig",0.0]],"patterns":[{"col_types":[1,3,0,0,0,0],"cursor_col":2,"cursor_row":2,"data":[[60,4071,-1,-1,-1,-1],[64,4071,-1,-1,-1,-1],[69,4071,-1,-1,-1,-1],[-1,4071,-1,-1,-1,-1],[72,4071,-1,-1,-1,-1],[76,4071,-1,-1,-1,-1],[84,4071,-1,-1,-1,-1],[-1,4071,-1,-1,-1,-1],[60,4071,-1,-1,-1,-1],[64,4071,-1,-1,-1,-1],[79,4071,-1,-1,-1,-1],[-1,4071,-1,-1,-1,-1],[72,4071,-1,-1,-1,-1],[76,4071,-1,-1,-1,-1],[65,4071,-1,-1,-1,-1],[-1,4071,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1]],"edit_step":4,"rows":16},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"props":[]} +{"VERSION":2,"atoms":[["tseq",0,"cmode",["i",0]],["sfilter",0,"ftype",["i",13]],["sfilter",1,"ftype",["i",6]],["sfilter",2,"ftype",["i",7]],["quant",0,"keys",["i",0]],["delay",0,"mode",["i",0]],["delay",1,"mode",["i",0]],["comb",0,"mode",["i",0]],["noise",0,"mode",["i",0]],["out",0,"mono",["i",0]],["ad",0,"mult",["i",0]],["ad",1,"mult",["i",1]],["ad",2,"mult",["i",0]],["ad",3,"mult",["i",0]],["amp",0,"neg_att",["i",1]],["amp",1,"neg_att",["i",1]],["amp",2,"neg_att",["i",1]],["amp",3,"neg_att",["i",1]],["bosc",0,"wtype",["i",3]]],"cells":[["ad",2,3,5,["trig",-1,-1],[-1,"sig","sig"]],["sin",1,4,3,[-1,-1,-1],[-1,"sig",-1]],["sin",0,4,4,[-1,-1,-1],["sig",-1,-1]],["ad",3,4,5,[-1,"trig",-1],["sig",-1,-1]],["amp",3,4,6,[-1,"inp","gain"],["sig",-1,-1]],["sin",2,5,2,[-1,-1,-1],[-1,-1,"sig"]],["mix3",0,5,3,["ch3","ch2","ch1"],["sig","sig","sig"]],["mix3",1,5,4,["ch1",-1,"gain1"],[-1,"sig",-1]],["mix3",5,5,5,[-1,-1,"ch1"],["sig",-1,-1]],["noise",0,6,2,[-1,-1,-1],[-1,-1,"sig"]],["sfilter",0,6,3,["freq",-1,"inp"],[-1,"sig",-1]],["ad",0,6,4,[-1,"inp",-1],[-1,"sig",-1]],["sfilter",1,6,5,[-1,"inp","freq"],[-1,"sig",-1]],["ad",1,7,3,[-1,"inp",-1],[-1,-1,"sig"]],["mix3",2,7,4,["ch2","ch1",-1],[-1,-1,"sig"]],["mix3",4,7,5,["ch1","ch2",-1],[-1,"sig","sig"]],["amp",0,7,6,["inp",-1,-1],[-1,"sig",-1]],["amp",1,8,6,[-1,"inp",-1],[-1,-1,"sig"]],["out",0,8,7,["ch2","ch1",-1],[-1,-1,-1]]],"params":[["ad",0,"ashp",0.8149999976158142],["ad",1,"ashp",0.41499999165534973],["ad",2,"ashp",0.36000004410743713],["ad",3,"ashp",1.0],["ad",0,"atk",15.0],["ad",1,"atk",8.0],["ad",2,"atk",1000.0],["ad",3,"atk",775.0],["amp",0,"att",1.0],["amp",1,"att",1.0],["amp",2,"att",0.390625],["amp",3,"att",1.0],["noise",0,"atv",0.1300000101327896],["mix3",0,"ch1",0.0],["mix3",1,"ch1",0.0],["mix3",2,"ch1",0.0],["mix3",3,"ch1",0.0],["mix3",4,"ch1",0.0],["mix3",5,"ch1",0.0],["out",0,"ch1",0.0],["mix3",0,"ch2",0.0],["mix3",1,"ch2",0.0],["mix3",2,"ch2",0.0],["mix3",3,"ch2",0.0],["mix3",4,"ch2",0.0],["mix3",5,"ch2",0.0],["out",0,"ch2",0.0],["mix3",0,"ch3",0.0],["mix3",1,"ch3",0.0],["mix3",2,"ch3",0.0],["mix3",3,"ch3",0.0],["mix3",4,"ch3",0.0],["mix3",5,"ch3",0.0],["tseq",0,"clock",0.0],["ad",0,"dcy",1000.0],["ad",1,"dcy",347.9999694824219],["ad",2,"dcy",488.9999694824219],["ad",3,"dcy",18.999998092651367],["sin",0,"det",0.0],["sin",1,"det",4.0],["sin",2,"det",7.0],["sin",3,"det",-0.0],["bosc",0,"det",0.0],["ad",0,"dshp",0.19500002264976501],["ad",1,"dshp",0.14000003039836884],["ad",2,"dshp",0.875],["ad",3,"dshp",0.2849999964237213],["delay",0,"fb",0.6499999761581421],["delay",1,"fb",0.5999999642372131],["quant",0,"freq",577.044189453125],["sin",0,"freq",440.0,0.0],["sin",1,"freq",440.0],["sin",2,"freq",440.0],["sin",3,"freq",0.4296875],["bosc",0,"freq",440.0],["sfilter",0,"freq",1900.0001220703125],["sfilter",1,"freq",440.0],["sfilter",2,"freq",880.0],["comb",0,"g",0.699999988079071],["amp",0,"gain",0.9999999403953552],["amp",1,"gain",0.9999999403953552],["amp",2,"gain",0.9999999403953552],["amp",3,"gain",0.42320001125335693],["out",0,"gain",0.08999998867511749],["mix3",0,"gain1",0.9999999403953552],["mix3",1,"gain1",0.9999999403953552],["mix3",2,"gain1",0.9999999403953552],["mix3",3,"gain1",0.7616416215896606],["mix3",4,"gain1",0.9999999403953552],["mix3",5,"gain1",0.9999999403953552],["mix3",0,"gain2",0.9999999403953552],["mix3",1,"gain2",0.9999999403953552],["mix3",2,"gain2",0.9999999403953552],["mix3",3,"gain2",0.9999999403953552],["mix3",4,"gain2",2.0],["mix3",5,"gain2",0.9999999403953552],["mix3",0,"gain3",0.9999999403953552],["mix3",1,"gain3",0.9999999403953552],["mix3",2,"gain3",0.9999999403953552],["mix3",3,"gain3",0.9999999403953552],["mix3",4,"gain3",0.9999999403953552],["mix3",5,"gain3",0.9999999403953552],["amp",0,"inp",0.0],["amp",1,"inp",0.0],["amp",2,"inp",0.0],["amp",3,"inp",0.0],["ad",0,"inp",1.0],["ad",1,"inp",1.0],["ad",2,"inp",1.0],["ad",3,"inp",1.0],["delay",0,"inp",0.0],["delay",1,"inp",0.0],["comb",0,"inp",0.0],["sfilter",0,"inp",0.0],["sfilter",1,"inp",0.0],["sfilter",2,"inp",0.0],["delay",0,"mix",0.5],["delay",1,"mix",0.5],["quant",0,"oct",0.0],["noise",0,"offs",0.0],["mix3",0,"ogain",0.9999999403953552],["mix3",1,"ogain",0.10315494984388351],["mix3",2,"ogain",0.9999999403953552],["mix3",3,"ogain",0.9999999403953552],["mix3",4,"ogain",0.9999999403953552],["mix3",5,"ogain",0.9999999403953552],["bosc",0,"pw",0.5,-0.25999999046325684],["sfilter",0,"res",0.5],["sfilter",1,"res",0.9099999666213989],["sfilter",2,"res",0.0],["tslfo",0,"rev",0.5],["tslfo",1,"rev",0.5],["tslfo",2,"rev",0.5],["tslfo",3,"rev",0.5],["tslfo",0,"time",1699.99951171875],["tslfo",1,"time",22999.99609375],["tslfo",2,"time",19999.994140625],["tslfo",3,"time",499.99993896484375],["delay",0,"time",256.70001220703125,0.009999999776482582],["delay",1,"time",249.99998474121094,-0.007999999448657036],["comb",0,"time",24.999996185302734],["tseq",0,"trig",0.0],["ad",0,"trig",0.0],["ad",1,"trig",0.0],["ad",2,"trig",0.0],["ad",3,"trig",0.0],["tslfo",0,"trig",0.0],["tslfo",1,"trig",0.0],["tslfo",2,"trig",0.0],["tslfo",3,"trig",0.0],["delay",0,"trig",0.0],["delay",1,"trig",0.0]],"patterns":[{"col_types":[1,3,0,0,0,0],"cursor_col":2,"cursor_row":2,"data":[[60,4071,-1,-1,-1,-1],[64,4071,-1,-1,-1,-1],[69,4071,-1,-1,-1,-1],[-1,4071,-1,-1,-1,-1],[72,4071,-1,-1,-1,-1],[76,4071,-1,-1,-1,-1],[84,4071,-1,-1,-1,-1],[-1,4071,-1,-1,-1,-1],[60,4071,-1,-1,-1,-1],[64,4071,-1,-1,-1,-1],[79,4071,-1,-1,-1,-1],[-1,4071,-1,-1,-1,-1],[72,4071,-1,-1,-1,-1],[76,4071,-1,-1,-1,-1],[65,4071,-1,-1,-1,-1],[-1,4071,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1]],"edit_step":4,"rows":16},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"props":[]} diff --git a/src/audio.rs b/src/audio.rs index f8400f6..767b309 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -33,9 +33,18 @@ pub fn setup(event_channel: Receiver) { let color_mix_b_gain = color_mix.inp_param("gain3").unwrap(); let jump_ad = NodeId::Ad(0); let jump_ad_trig = jump_ad.inp_param("trig").unwrap(); + let switch_ad = NodeId::Ad(1); + let switch_ad_trig = switch_ad.inp_param("trig").unwrap(); + let fusion_ad = NodeId::Ad(2); + let fusion_ad_trig = fusion_ad.inp_param("trig").unwrap(); + let fusion_ad2 = NodeId::Ad(3); + let fusion_ad2_trig = fusion_ad2.inp_param("trig").unwrap(); - for (_tick, _now) in Clock::framerate(10.0).iter() { + for (_tick, _now) in Clock::framerate(20.0).iter() { matrix.set_param(jump_ad_trig, (0.0).into()); + matrix.set_param(switch_ad_trig, (0.0).into()); + matrix.set_param(fusion_ad_trig, (0.0).into()); + matrix.set_param(fusion_ad2_trig, (0.0).into()); if let Ok(msg) = event_channel.try_recv() { match msg { @@ -44,7 +53,12 @@ pub fn setup(event_channel: Receiver) { matrix.set_param(color_mix_g_gain, g.into()); matrix.set_param(color_mix_b_gain, b.into()); } + AudioMsg::Fusion => { + matrix.set_param(fusion_ad_trig, (1.0).into()); + matrix.set_param(fusion_ad2_trig, (1.0).into()); + } AudioMsg::Jump => matrix.set_param(jump_ad_trig, (1.0).into()), + AudioMsg::Switch => matrix.set_param(switch_ad_trig, (1.0).into()), } } } diff --git a/src/filters.rs b/src/filters.rs new file mode 100644 index 0000000..a4439c4 --- /dev/null +++ b/src/filters.rs @@ -0,0 +1,20 @@ +use bevy::prelude::*; +use bevy_rapier2d::prelude::*; + +#[derive(Component, Default)] +pub struct FilterColor(pub Color); + +#[derive(Component)] +pub enum PassThroughFilter { + Absorbing, +} + +#[derive(Bundle)] +pub struct AbsorbingFilter { + pub color: FilterColor, + #[bundle] + pub mesh: ColorMesh2dBundle, + pub collider: Collider, + pub sensor: Sensor, + pub filter_type: PassThroughFilter, +} diff --git a/src/game.rs b/src/game.rs index ef051cb..a265f88 100644 --- a/src/game.rs +++ b/src/game.rs @@ -1,19 +1,23 @@ #![allow(clippy::precedence)] #![allow(clippy::too_many_arguments)] +pub use crate::filters::*; + use crate::AppState; use bevy::{ + ecs::system::EntityCommands, input::{keyboard::KeyCode, Input}, prelude::{shape::Quad, *}, sprite::Mesh2dHandle, }; use bevy_rapier2d::prelude::*; -use std::collections::BTreeSet; pub enum AudioMsg { Color([f32; 3]), + Fusion, Jump, + Switch, } #[derive(Clone, Copy, Eq, Hash, PartialEq)] @@ -34,13 +38,14 @@ impl Plugin for GamePlugin { .add_system_set( SystemSet::on_update(AppState::Game) .with_system(crate::levels::post_setup_level) - .with_system(keyboard_input_system) + .with_system(change_character_system) + .with_system(player_movement_system) .with_system(move_camera) .with_system(character_particle_effect_system), ) .add_system_set( SystemSet::on_update(AppState::Win) - .with_system(keyboard_input_system) + .with_system(player_movement_system) .with_system(move_camera) .with_system(character_particle_effect_system), ) @@ -79,18 +84,12 @@ impl FromWorld for CharacterMeshes { #[derive(Component)] pub struct Level; -#[derive(Clone, Component, Copy, Eq, Hash, Ord, PartialEq, PartialOrd)] -pub struct CharacterId(pub u32); - -#[derive(Clone, Component, Copy, Eq, Hash, PartialEq)] -pub struct SelectedCharacterId(pub Option); - -#[derive(Component)] -pub struct CharacterIdList(pub BTreeSet); - #[derive(Clone, Component, PartialEq)] pub struct CharacterColor(pub Color); +#[derive(Component)] +pub struct Player; + // Systems fn setup( @@ -109,36 +108,49 @@ fn setup( ); } +pub fn spawn_characters>( + commands: &mut Commands, + character_meshes: &Res, + materials: &mut ResMut>, + audio: &Res>, + + characters: I, +) { + for (i, (transform, color)) in characters.into_iter().enumerate() { + spawn_character( + commands, + character_meshes, + materials, + audio, + transform, + color, + i == 0, + ); + } +} + pub fn spawn_character( commands: &mut Commands, character_meshes: &Res, materials: &mut ResMut>, - selected_character_id: &mut Mut, - character_id_list: &mut Mut, audio: &Res>, mut transform: Transform, color: Color, + is_player: bool, ) { transform.translation.z = transform.translation.z.max(1.0); - let character_id = CharacterId( - character_id_list - .0 - .iter() - .last() - .map_or(0, |last_character_id| last_character_id.0 + 1), - ); - character_id_list.0.insert(character_id); + let color_mesh_2d_bundle: ColorMesh2dBundle = ColorMesh2dBundle { + mesh: character_meshes.square.clone(), + material: materials.add(ColorMaterial::from(color)), + transform, + ..default() + }; - commands - .spawn_bundle(ColorMesh2dBundle { - mesh: character_meshes.square.clone(), - material: materials.add(ColorMaterial::from(color)), - transform, - ..default() - }) + let mut entity_commands: EntityCommands = commands.spawn_bundle(color_mesh_2d_bundle); + + entity_commands .insert(Level) - .insert(character_id) .insert(CharacterColor(color)) .insert(RigidBody::Dynamic) .insert(Collider::cuboid(32., 32.)) @@ -154,9 +166,8 @@ pub fn spawn_character( .insert(ExternalImpulse::default()) .insert(ActiveEvents::COLLISION_EVENTS); - // If no character is selected, then select this one - if selected_character_id.0.is_none() { - selected_character_id.0 = Some(character_id); + if is_player { + entity_commands.insert(Player); audio .send(AudioMsg::Color([color.r(), color.g(), color.b()])) .ok(); @@ -168,24 +179,18 @@ fn collision_event_system( character_meshes: Res, mut materials: ResMut>, mut collision_events: EventReader, - character_query: Query<(&CharacterId, &CharacterColor, &Transform)>, - mut level_query: Query<(&mut SelectedCharacterId, &mut CharacterIdList)>, + character_query: Query<(&CharacterColor, &Transform, Option<&Player>)>, mut app_state: ResMut>, audio: Res>, ) { for collision_event in collision_events.iter() { if let CollisionEvent::Started(e1, e2, flags) = collision_event { if flags.is_empty() { - if let (Ok((c1_id, c1_color, c1_transform)), Ok((c2_id, c2_color, _c2_transform))) = - (character_query.get(*e1), character_query.get(*e2)) + if let ( + Ok((c1_color, c1_transform, c1_player)), + Ok((c2_color, c2_transform, c2_player)), + ) = (character_query.get(*e1), character_query.get(*e2)) { - let (mut selected_character_id, mut character_id_list) = - level_query.single_mut(); - character_id_list.0.remove(c1_id); - character_id_list.0.remove(c2_id); - selected_character_id.0 = None; - - // TODO completely remove particles commands.entity(*e1).despawn_recursive(); commands.entity(*e2).despawn_recursive(); @@ -199,70 +204,93 @@ fn collision_event_system( app_state.replace(AppState::Win).ok(); } + // position character based on current player location spawn_character( &mut commands, &character_meshes, &mut materials, - &mut selected_character_id, - &mut character_id_list, &audio, - *c1_transform, + if c1_player.is_some() { + *c1_transform + } else if c2_player.is_some() { + *c2_transform + } else { + Transform::identity().with_translation( + (c1_transform.translation + c2_transform.translation) / 2., + ) + }, new_color.into(), + c1_player.is_some() || c2_player.is_some(), ); + + audio.send(AudioMsg::Fusion).ok(); } } } } } -fn keyboard_input_system( +fn change_character_system( + mut commands: Commands, + keyboard_input: Res>, - mut characters: Query<(&CharacterId, &mut Velocity, &CharacterColor)>, - mut level_query: Query<(&mut SelectedCharacterId, &CharacterIdList)>, + characters: Query<(Entity, &CharacterColor, Option<&Player>)>, + audio: Res>, +) { + if !keyboard_input.just_pressed(KeyCode::Tab) { + return; + } + + let mut player_idx: usize = 0; + let mut player_count: usize = 0; + + // find player idx + for (_entity, _color, player) in characters.iter() { + if player.is_some() { + player_idx = player_count; + } + player_count += 1; + } + + // calculate next player index + let next_player_idx = (player_idx + 1) % player_count; + player_count = 0; + + // exchange `Player` component from old `player_idx` to new `next_player_idx` + for (entity, color, _player) in characters.iter() { + if player_count == player_idx { + commands.entity(entity).remove::(); + } + + if player_count == next_player_idx { + commands.entity(entity).insert(Player); + audio + .send(AudioMsg::Color([color.0.r(), color.0.g(), color.0.b()])) + .ok(); + audio.send(AudioMsg::Switch).ok(); + } + + player_count += 1; + } +} + +fn player_movement_system( + keyboard_input: Res>, + mut characters: Query<&mut Velocity, With>, mut app_state: ResMut>, audio: Res>, ) { - if let Ok((mut selected_character_id, character_id_list)) = level_query.get_single_mut() { - if keyboard_input.just_pressed(KeyCode::Tab) { - let selected = if let Some(selected_character_id) = &mut selected_character_id.0 { - *selected_character_id = *character_id_list - .0 - .range(*selected_character_id..) - .nth(1) - .unwrap_or_else(|| character_id_list.0.iter().next().unwrap()); - *selected_character_id - } else { - selected_character_id.0 = Some(CharacterId(0)); - CharacterId(0) - }; + let right_pressed: bool = + keyboard_input.pressed(KeyCode::Right) || keyboard_input.pressed(KeyCode::D); + let left_pressed: bool = + keyboard_input.pressed(KeyCode::Left) || keyboard_input.pressed(KeyCode::A); - if let Some((_character_id, _velocity, color)) = characters - .iter_mut() - .find(|(character_id, _velocity, _color)| **character_id == selected) - { - audio - .send(AudioMsg::Color([color.0.r(), color.0.g(), color.0.b()])) - .ok(); - } - } + for mut velocity in characters.iter_mut() { + velocity.linvel.x = 200. * (right_pressed as i8 - left_pressed as i8) as f32; - let right_pressed: bool = - keyboard_input.pressed(KeyCode::Right) || keyboard_input.pressed(KeyCode::D); - let left_pressed: bool = - keyboard_input.pressed(KeyCode::Left) || keyboard_input.pressed(KeyCode::A); - - if let Some(selected_character_id) = &selected_character_id.0 { - if let Some((_character_id, mut velocity, _color)) = characters - .iter_mut() - .find(|(character_id, _velocity, _color)| *character_id == selected_character_id) - { - velocity.linvel.x = 200. * (right_pressed as i8 - left_pressed as i8) as f32; - - if keyboard_input.just_pressed(KeyCode::Space) { - audio.send(AudioMsg::Jump).ok(); - velocity.linvel.y = 500.; - } - } + if keyboard_input.just_pressed(KeyCode::Space) { + audio.send(AudioMsg::Jump).ok(); + velocity.linvel.y = 500.; } } @@ -272,20 +300,12 @@ fn keyboard_input_system( } fn character_particle_effect_system( - mut characters: Query<(&CharacterId, &Transform, &CharacterColor)>, + characters: Query<(&Transform, &CharacterColor), With>, mut particle_effect: ResMut, - mut level_query: Query<&SelectedCharacterId>, ) { - if let Ok(selected_character_id) = level_query.get_single_mut() { - if let Some(selected_character_id) = &selected_character_id.0 { - if let Some((_character_id, transform, color)) = characters - .iter_mut() - .find(|(character_id, _transform, _color)| *character_id == selected_character_id) - { - particle_effect.translation = transform.translation; - particle_effect.color = color.0; - } - } + for (transform, color) in characters.iter() { + particle_effect.translation = transform.translation; + particle_effect.color = color.0; } } @@ -309,29 +329,25 @@ fn win_setup(mut commands: Commands, asset_server: Res) { fn move_camera( mut camera_query: Query<(&Camera, &mut Transform)>, - characters: Query<(&CharacterId, &Transform), Without>, - level_query: Query<&SelectedCharacterId>, + characters: Query<&Transform, (Without, With)>, time: Res