diff --git a/core/assets/Card/Spell/1.png b/core/assets/Card/Spell/1.png new file mode 100644 index 0000000..2d723aa Binary files /dev/null and b/core/assets/Card/Spell/1.png differ diff --git a/core/assets/Card/Spell/10.png b/core/assets/Card/Spell/10.png new file mode 100644 index 0000000..702d301 Binary files /dev/null and b/core/assets/Card/Spell/10.png differ diff --git a/core/assets/Card/Spell/11.png b/core/assets/Card/Spell/11.png new file mode 100644 index 0000000..c2ff392 Binary files /dev/null and b/core/assets/Card/Spell/11.png differ diff --git a/core/assets/Card/Spell/12.png b/core/assets/Card/Spell/12.png new file mode 100644 index 0000000..ecdc0ee Binary files /dev/null and b/core/assets/Card/Spell/12.png differ diff --git a/core/assets/Card/Spell/13.png b/core/assets/Card/Spell/13.png new file mode 100644 index 0000000..de9007e Binary files /dev/null and b/core/assets/Card/Spell/13.png differ diff --git a/core/assets/Card/Spell/14.png b/core/assets/Card/Spell/14.png new file mode 100644 index 0000000..c9827d3 Binary files /dev/null and b/core/assets/Card/Spell/14.png differ diff --git a/core/assets/Card/Spell/15.png b/core/assets/Card/Spell/15.png new file mode 100644 index 0000000..f8adeef Binary files /dev/null and b/core/assets/Card/Spell/15.png differ diff --git a/core/assets/Card/Spell/16.png b/core/assets/Card/Spell/16.png new file mode 100644 index 0000000..6cacd19 Binary files /dev/null and b/core/assets/Card/Spell/16.png differ diff --git a/core/assets/Card/Spell/17.png b/core/assets/Card/Spell/17.png new file mode 100644 index 0000000..11ee3db Binary files /dev/null and b/core/assets/Card/Spell/17.png differ diff --git a/core/assets/Card/Spell/18.png b/core/assets/Card/Spell/18.png new file mode 100644 index 0000000..57579ed Binary files /dev/null and b/core/assets/Card/Spell/18.png differ diff --git a/core/assets/Card/Spell/19.png b/core/assets/Card/Spell/19.png new file mode 100644 index 0000000..2efbe09 Binary files /dev/null and b/core/assets/Card/Spell/19.png differ diff --git a/core/assets/Card/Spell/2.png b/core/assets/Card/Spell/2.png new file mode 100644 index 0000000..88b555d Binary files /dev/null and b/core/assets/Card/Spell/2.png differ diff --git a/core/assets/Card/Spell/20.png b/core/assets/Card/Spell/20.png new file mode 100644 index 0000000..812b108 Binary files /dev/null and b/core/assets/Card/Spell/20.png differ diff --git a/core/assets/Card/Spell/21.png b/core/assets/Card/Spell/21.png new file mode 100644 index 0000000..812b108 Binary files /dev/null and b/core/assets/Card/Spell/21.png differ diff --git a/core/assets/Card/Spell/3.png b/core/assets/Card/Spell/3.png new file mode 100644 index 0000000..5be84ff Binary files /dev/null and b/core/assets/Card/Spell/3.png differ diff --git a/core/assets/Card/Spell/4.png b/core/assets/Card/Spell/4.png new file mode 100644 index 0000000..1647c2b Binary files /dev/null and b/core/assets/Card/Spell/4.png differ diff --git a/core/assets/Card/Spell/5.png b/core/assets/Card/Spell/5.png new file mode 100644 index 0000000..fefe99a Binary files /dev/null and b/core/assets/Card/Spell/5.png differ diff --git a/core/assets/Card/Spell/6.png b/core/assets/Card/Spell/6.png new file mode 100644 index 0000000..daf14c9 Binary files /dev/null and b/core/assets/Card/Spell/6.png differ diff --git a/core/assets/Card/Spell/7.png b/core/assets/Card/Spell/7.png new file mode 100644 index 0000000..6162393 Binary files /dev/null and b/core/assets/Card/Spell/7.png differ diff --git a/core/assets/Card/Spell/8.png b/core/assets/Card/Spell/8.png new file mode 100644 index 0000000..bda8e39 Binary files /dev/null and b/core/assets/Card/Spell/8.png differ diff --git a/core/assets/Card/Spell/9.png b/core/assets/Card/Spell/9.png new file mode 100644 index 0000000..965b3c7 Binary files /dev/null and b/core/assets/Card/Spell/9.png differ diff --git a/core/assets/Files/Data/Accounts.json b/core/assets/Files/Data/Accounts.json index 002e6fe..bb43f12 100644 --- a/core/assets/Files/Data/Accounts.json +++ b/core/assets/Files/Data/Accounts.json @@ -1 +1 @@ -[{"username":"sadra","password":"s","collection":["Simorgh","AllAttack","Iraj","Bahman","PersianSpearman","TuranianArcher","WisdomCrown"],"allDecks":{"1":["Simorgh","Bahman","Bahman","Bahman","Bahman","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","WisdomCrown"],"222":["Iraj","Bahman"],"ssss":[],"1000":["Simorgh","AllAttack","AllAttack","AllAttack","AllAttack","AllAttack","Bahman","Bahman","Bahman","Bahman","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","WisdomCrown"]},"matchHistory":[],"mainDeck":"1","daric":4250},{"username":"alireza","password":"a","collection":["Rostam","Zahack","WhiteDemon","Iraj","Eagle","TuranianPrince","PoisonousSnake","Siavash","WisdomCrown"],"allDecks":{},"matchHistory":[],"mainDeck":"","daric":999999},{"username":"sinaa","password":"1","collection":["WhiteDemon","Eagle","WisdomCrown"],"allDecks":{},"matchHistory":[],"daric":6500},{"username":"firstLevelPlayer","password":"1234","collection":["WhiteDemon","WhiteDemon","WhiteDemon","TotalDisarm","LightingBolt","AllDisarm","AllPoison","Dispel","Sacrifice","Shock","TotalDisarm","LightingBolt","AllDisarm","AllPoison","Dispel","Sacrifice","Shock","TotalDisarm","LightingBolt","AllDisarm","AllPoison","Dispel","Sacrifice","Shock","PersianArcher","TuranianSpearman","TuranianMaceman","BlackDemon","OneEyedGiant","PoisonousSnake","HugeSnake","WhiteWolf","GrandWitch","NaneSarma","Siavash","ArzhangDiv","ali","PersianArcher","TuranianSpearman","TuranianMaceman","BlackDemon","OneEyedGiant","PoisonousSnake","HugeSnake","WhiteWolf","GrandWitch","NaneSarma","Siavash","ArzhangDiv","ali","PersianArcher","TuranianSpearman","TuranianMaceman","BlackDemon","OneEyedGiant","PoisonousSnake","HugeSnake","WhiteWolf","GrandWitch","NaneSarma","Siavash","ArzhangDiv","ali","WisdomCrown","WisdomCrown","WisdomCrown"],"allDecks":{"Story 1":["WhiteDemon","TotalDisarm","LightingBolt","AllDisarm","AllPoison","Dispel","Sacrifice","Shock","PersianArcher","TuranianSpearman","TuranianMaceman","BlackDemon","OneEyedGiant","PoisonousSnake","HugeSnake","WhiteWolf","GrandWitch","NaneSarma","Siavash","ArzhangDiv","ali","WisdomCrown"]},"matchHistory":[],"mainDeck":"Story 1","daric":15000},{"username":"secondLevelPlayer","password":"1234","collection":["Zahack","Zahack","Zahack","AreaDispel","Empower","GodStrength","PoisonLake","Madness","HealthWithProfit","KingsGuard","AreaDispel","Empower","GodStrength","PoisonLake","Madness","HealthWithProfit","KingsGuard","AreaDispel","Empower","GodStrength","PoisonLake","Madness","HealthWithProfit","KingsGuard","PersianSwordsman","PersianSpearman","PersianPahlevan","TuranianRockhookman","TuranianPrince","Eagle","FirethrowingDragon","Panter","Goblin","Giv","Iraj","GiantKing","PersianSwordsman","PersianSpearman","PersianPahlevan","TuranianRockhookman","TuranianPrince","Eagle","FirethrowingDragon","Panter","Goblin","Giv","Iraj","GiantKing","PersianSwordsman","PersianSpearman","PersianPahlevan","TuranianRockhookman","TuranianPrince","Eagle","FirethrowingDragon","Panter","Goblin","Giv","Iraj","GiantKing","SoulEater","SoulEater","SoulEater"],"allDecks":{"Story 2":["Zahack","AreaDispel","Empower","GodStrength","PoisonLake","Madness","HealthWithProfit","KingsGuard","PersianSwordsman","PersianSpearman","PersianPahlevan","TuranianRockhookman","TuranianPrince","Eagle","FirethrowingDragon","Panter","Goblin","Giv","Iraj","GiantKing","SoulEater"]},"matchHistory":[],"mainDeck":"Story 2","daric":15000},{"username":"thirdLevelPlayer","password":"1234","collection":["Arash","Arash","Arash","HellFire","AllDisarm","Dispel","PowerUp","AllPower","AllAttack","Weakening","HellFire","AllDisarm","Dispel","PowerUp","AllPower","AllAttack","Weakening","HellFire","AllDisarm","Dispel","PowerUp","AllPower","AllAttack","Weakening","PersianSepahsalar","TuranianArcher","TuranianSpy","RockthrowingGiant","HogriderDemon","PredatorLion","Wolf","Witch","WildHog","Piran","Bahman","HugeGiant","PersianSepahsalar","TuranianArcher","TuranianSpy","RockthrowingGiant","HogriderDemon","PredatorLion","Wolf","Witch","WildHog","Piran","Bahman","HugeGiant","PersianSepahsalar","TuranianArcher","TuranianSpy","RockthrowingGiant","HogriderDemon","PredatorLion","Wolf","Witch","WildHog","Piran","Bahman","HugeGiant","TerrorHood","TerrorHood","TerrorHood"],"allDecks":{"Story 3":["Arash","HellFire","AllDisarm","Dispel","PowerUp","AllPower","AllAttack","Weakening","PersianSepahsalar","TuranianArcher","TuranianSpy","RockthrowingGiant","HogriderDemon","PredatorLion","Wolf","Witch","WildHog","Piran","Bahman","HugeGiant","TerrorHood"]},"matchHistory":[],"mainDeck":"Story 3","daric":15000}] \ No newline at end of file +[{"username":"sadra","password":"s","collection":["Simorgh","AllAttack","Iraj","Bahman","PersianSpearman","TuranianArcher","WisdomCrown"],"allDecks":{"1":["Simorgh","Bahman","Bahman","Bahman","Bahman","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","WisdomCrown"],"222":["Iraj","Bahman"],"ssss":[],"1000":["Simorgh","AllAttack","AllAttack","AllAttack","AllAttack","AllAttack","Bahman","Bahman","Bahman","Bahman","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","Iraj","WisdomCrown"]},"matchHistory":[],"mainDeck":"1","daric":4750},{"username":"alireza","password":"a","collection":["Rostam","Zahack","WhiteDemon","Iraj","Eagle","TuranianPrince","PoisonousSnake","Siavash","WisdomCrown"],"allDecks":{},"matchHistory":[],"mainDeck":"","daric":999999},{"username":"sinaa","password":"1","collection":["WhiteDemon","Eagle","WisdomCrown"],"allDecks":{},"matchHistory":[],"daric":6500},{"username":"firstLevelPlayer","password":"1234","collection":["WhiteDemon","WhiteDemon","WhiteDemon","WhiteDemon","WhiteDemon","WhiteDemon","WhiteDemon","WhiteDemon","WhiteDemon","WhiteDemon","WhiteDemon","WhiteDemon","TotalDisarm","LightingBolt","AllDisarm","AllPoison","Dispel","Sacrifice","Shock","TotalDisarm","LightingBolt","AllDisarm","AllPoison","Dispel","Sacrifice","Shock","TotalDisarm","LightingBolt","AllDisarm","AllPoison","Dispel","Sacrifice","Shock","TotalDisarm","LightingBolt","AllDisarm","AllPoison","Dispel","Sacrifice","Shock","TotalDisarm","LightingBolt","AllDisarm","AllPoison","Dispel","Sacrifice","Shock","TotalDisarm","LightingBolt","AllDisarm","AllPoison","Dispel","Sacrifice","Shock","TotalDisarm","LightingBolt","AllDisarm","AllPoison","Dispel","Sacrifice","Shock","TotalDisarm","LightingBolt","AllDisarm","AllPoison","Dispel","Sacrifice","Shock","TotalDisarm","LightingBolt","AllDisarm","AllPoison","Dispel","Sacrifice","Shock","TotalDisarm","LightingBolt","AllDisarm","AllPoison","Dispel","Sacrifice","Shock","TotalDisarm","LightingBolt","AllDisarm","AllPoison","Dispel","Sacrifice","Shock","TotalDisarm","LightingBolt","AllDisarm","AllPoison","Dispel","Sacrifice","Shock","PersianArcher","TuranianSpearman","TuranianMaceman","BlackDemon","OneEyedGiant","PoisonousSnake","HugeSnake","WhiteWolf","GrandWitch","NaneSarma","Siavash","ArzhangDiv","ali","PersianArcher","TuranianSpearman","TuranianMaceman","BlackDemon","OneEyedGiant","PoisonousSnake","HugeSnake","WhiteWolf","GrandWitch","NaneSarma","Siavash","ArzhangDiv","ali","PersianArcher","TuranianSpearman","TuranianMaceman","BlackDemon","OneEyedGiant","PoisonousSnake","HugeSnake","WhiteWolf","GrandWitch","NaneSarma","Siavash","ArzhangDiv","ali","PersianArcher","TuranianSpearman","TuranianMaceman","BlackDemon","OneEyedGiant","PoisonousSnake","HugeSnake","WhiteWolf","GrandWitch","NaneSarma","Siavash","ArzhangDiv","ali","PersianArcher","TuranianSpearman","TuranianMaceman","BlackDemon","OneEyedGiant","PoisonousSnake","HugeSnake","WhiteWolf","GrandWitch","NaneSarma","Siavash","ArzhangDiv","ali","PersianArcher","TuranianSpearman","TuranianMaceman","BlackDemon","OneEyedGiant","PoisonousSnake","HugeSnake","WhiteWolf","GrandWitch","NaneSarma","Siavash","ArzhangDiv","ali","PersianArcher","TuranianSpearman","TuranianMaceman","BlackDemon","OneEyedGiant","PoisonousSnake","HugeSnake","WhiteWolf","GrandWitch","NaneSarma","Siavash","ArzhangDiv","ali","PersianArcher","TuranianSpearman","TuranianMaceman","BlackDemon","OneEyedGiant","PoisonousSnake","HugeSnake","WhiteWolf","GrandWitch","NaneSarma","Siavash","ArzhangDiv","ali","PersianArcher","TuranianSpearman","TuranianMaceman","BlackDemon","OneEyedGiant","PoisonousSnake","HugeSnake","WhiteWolf","GrandWitch","NaneSarma","Siavash","ArzhangDiv","ali","PersianArcher","TuranianSpearman","TuranianMaceman","BlackDemon","OneEyedGiant","PoisonousSnake","HugeSnake","WhiteWolf","GrandWitch","NaneSarma","Siavash","ArzhangDiv","ali","PersianArcher","TuranianSpearman","TuranianMaceman","BlackDemon","OneEyedGiant","PoisonousSnake","HugeSnake","WhiteWolf","GrandWitch","NaneSarma","Siavash","ArzhangDiv","ali","PersianArcher","TuranianSpearman","TuranianMaceman","BlackDemon","OneEyedGiant","PoisonousSnake","HugeSnake","WhiteWolf","GrandWitch","NaneSarma","Siavash","ArzhangDiv","ali","WisdomCrown","WisdomCrown","WisdomCrown","WisdomCrown","WisdomCrown","WisdomCrown","WisdomCrown","WisdomCrown","WisdomCrown","WisdomCrown","WisdomCrown","WisdomCrown"],"allDecks":{"Story 1":["WhiteDemon","TotalDisarm","LightingBolt","AllDisarm","AllPoison","Dispel","Sacrifice","Shock","PersianArcher","TuranianSpearman","TuranianMaceman","BlackDemon","OneEyedGiant","PoisonousSnake","HugeSnake","WhiteWolf","GrandWitch","NaneSarma","Siavash","ArzhangDiv","ali","WisdomCrown"]},"matchHistory":[],"mainDeck":"Story 1","daric":15000},{"username":"secondLevelPlayer","password":"1234","collection":["Zahack","Zahack","Zahack","Zahack","Zahack","Zahack","Zahack","Zahack","Zahack","Zahack","Zahack","Zahack","AreaDispel","Empower","GodStrength","PoisonLake","Madness","HealthWithProfit","KingsGuard","AreaDispel","Empower","GodStrength","PoisonLake","Madness","HealthWithProfit","KingsGuard","AreaDispel","Empower","GodStrength","PoisonLake","Madness","HealthWithProfit","KingsGuard","AreaDispel","Empower","GodStrength","PoisonLake","Madness","HealthWithProfit","KingsGuard","AreaDispel","Empower","GodStrength","PoisonLake","Madness","HealthWithProfit","KingsGuard","AreaDispel","Empower","GodStrength","PoisonLake","Madness","HealthWithProfit","KingsGuard","AreaDispel","Empower","GodStrength","PoisonLake","Madness","HealthWithProfit","KingsGuard","AreaDispel","Empower","GodStrength","PoisonLake","Madness","HealthWithProfit","KingsGuard","AreaDispel","Empower","GodStrength","PoisonLake","Madness","HealthWithProfit","KingsGuard","AreaDispel","Empower","GodStrength","PoisonLake","Madness","HealthWithProfit","KingsGuard","AreaDispel","Empower","GodStrength","PoisonLake","Madness","HealthWithProfit","KingsGuard","AreaDispel","Empower","GodStrength","PoisonLake","Madness","HealthWithProfit","KingsGuard","PersianSwordsman","PersianSpearman","PersianPahlevan","TuranianRockhookman","TuranianPrince","Eagle","FirethrowingDragon","Panter","Goblin","Giv","Iraj","GiantKing","PersianSwordsman","PersianSpearman","PersianPahlevan","TuranianRockhookman","TuranianPrince","Eagle","FirethrowingDragon","Panter","Goblin","Giv","Iraj","GiantKing","PersianSwordsman","PersianSpearman","PersianPahlevan","TuranianRockhookman","TuranianPrince","Eagle","FirethrowingDragon","Panter","Goblin","Giv","Iraj","GiantKing","PersianSwordsman","PersianSpearman","PersianPahlevan","TuranianRockhookman","TuranianPrince","Eagle","FirethrowingDragon","Panter","Goblin","Giv","Iraj","GiantKing","PersianSwordsman","PersianSpearman","PersianPahlevan","TuranianRockhookman","TuranianPrince","Eagle","FirethrowingDragon","Panter","Goblin","Giv","Iraj","GiantKing","PersianSwordsman","PersianSpearman","PersianPahlevan","TuranianRockhookman","TuranianPrince","Eagle","FirethrowingDragon","Panter","Goblin","Giv","Iraj","GiantKing","PersianSwordsman","PersianSpearman","PersianPahlevan","TuranianRockhookman","TuranianPrince","Eagle","FirethrowingDragon","Panter","Goblin","Giv","Iraj","GiantKing","PersianSwordsman","PersianSpearman","PersianPahlevan","TuranianRockhookman","TuranianPrince","Eagle","FirethrowingDragon","Panter","Goblin","Giv","Iraj","GiantKing","PersianSwordsman","PersianSpearman","PersianPahlevan","TuranianRockhookman","TuranianPrince","Eagle","FirethrowingDragon","Panter","Goblin","Giv","Iraj","GiantKing","PersianSwordsman","PersianSpearman","PersianPahlevan","TuranianRockhookman","TuranianPrince","Eagle","FirethrowingDragon","Panter","Goblin","Giv","Iraj","GiantKing","PersianSwordsman","PersianSpearman","PersianPahlevan","TuranianRockhookman","TuranianPrince","Eagle","FirethrowingDragon","Panter","Goblin","Giv","Iraj","GiantKing","PersianSwordsman","PersianSpearman","PersianPahlevan","TuranianRockhookman","TuranianPrince","Eagle","FirethrowingDragon","Panter","Goblin","Giv","Iraj","GiantKing","SoulEater","SoulEater","SoulEater","SoulEater","SoulEater","SoulEater","SoulEater","SoulEater","SoulEater","SoulEater","SoulEater","SoulEater"],"allDecks":{"Story 2":["Zahack","AreaDispel","Empower","GodStrength","PoisonLake","Madness","HealthWithProfit","KingsGuard","PersianSwordsman","PersianSpearman","PersianPahlevan","TuranianRockhookman","TuranianPrince","Eagle","FirethrowingDragon","Panter","Goblin","Giv","Iraj","GiantKing","SoulEater"]},"matchHistory":[],"mainDeck":"Story 2","daric":15000},{"username":"thirdLevelPlayer","password":"1234","collection":["Arash","Arash","Arash","Arash","Arash","Arash","Arash","Arash","Arash","Arash","Arash","Arash","HellFire","AllDisarm","Dispel","PowerUp","AllPower","AllAttack","Weakening","HellFire","AllDisarm","Dispel","PowerUp","AllPower","AllAttack","Weakening","HellFire","AllDisarm","Dispel","PowerUp","AllPower","AllAttack","Weakening","HellFire","AllDisarm","Dispel","PowerUp","AllPower","AllAttack","Weakening","HellFire","AllDisarm","Dispel","PowerUp","AllPower","AllAttack","Weakening","HellFire","AllDisarm","Dispel","PowerUp","AllPower","AllAttack","Weakening","HellFire","AllDisarm","Dispel","PowerUp","AllPower","AllAttack","Weakening","HellFire","AllDisarm","Dispel","PowerUp","AllPower","AllAttack","Weakening","HellFire","AllDisarm","Dispel","PowerUp","AllPower","AllAttack","Weakening","HellFire","AllDisarm","Dispel","PowerUp","AllPower","AllAttack","Weakening","HellFire","AllDisarm","Dispel","PowerUp","AllPower","AllAttack","Weakening","HellFire","AllDisarm","Dispel","PowerUp","AllPower","AllAttack","Weakening","PersianSepahsalar","TuranianArcher","TuranianSpy","RockthrowingGiant","HogriderDemon","PredatorLion","Wolf","Witch","WildHog","Piran","Bahman","HugeGiant","PersianSepahsalar","TuranianArcher","TuranianSpy","RockthrowingGiant","HogriderDemon","PredatorLion","Wolf","Witch","WildHog","Piran","Bahman","HugeGiant","PersianSepahsalar","TuranianArcher","TuranianSpy","RockthrowingGiant","HogriderDemon","PredatorLion","Wolf","Witch","WildHog","Piran","Bahman","HugeGiant","PersianSepahsalar","TuranianArcher","TuranianSpy","RockthrowingGiant","HogriderDemon","PredatorLion","Wolf","Witch","WildHog","Piran","Bahman","HugeGiant","PersianSepahsalar","TuranianArcher","TuranianSpy","RockthrowingGiant","HogriderDemon","PredatorLion","Wolf","Witch","WildHog","Piran","Bahman","HugeGiant","PersianSepahsalar","TuranianArcher","TuranianSpy","RockthrowingGiant","HogriderDemon","PredatorLion","Wolf","Witch","WildHog","Piran","Bahman","HugeGiant","PersianSepahsalar","TuranianArcher","TuranianSpy","RockthrowingGiant","HogriderDemon","PredatorLion","Wolf","Witch","WildHog","Piran","Bahman","HugeGiant","PersianSepahsalar","TuranianArcher","TuranianSpy","RockthrowingGiant","HogriderDemon","PredatorLion","Wolf","Witch","WildHog","Piran","Bahman","HugeGiant","PersianSepahsalar","TuranianArcher","TuranianSpy","RockthrowingGiant","HogriderDemon","PredatorLion","Wolf","Witch","WildHog","Piran","Bahman","HugeGiant","PersianSepahsalar","TuranianArcher","TuranianSpy","RockthrowingGiant","HogriderDemon","PredatorLion","Wolf","Witch","WildHog","Piran","Bahman","HugeGiant","PersianSepahsalar","TuranianArcher","TuranianSpy","RockthrowingGiant","HogriderDemon","PredatorLion","Wolf","Witch","WildHog","Piran","Bahman","HugeGiant","PersianSepahsalar","TuranianArcher","TuranianSpy","RockthrowingGiant","HogriderDemon","PredatorLion","Wolf","Witch","WildHog","Piran","Bahman","HugeGiant","TerrorHood","TerrorHood","TerrorHood","TerrorHood","TerrorHood","TerrorHood","TerrorHood","TerrorHood","TerrorHood","TerrorHood","TerrorHood","TerrorHood"],"allDecks":{"Story 3":["Arash","HellFire","AllDisarm","Dispel","PowerUp","AllPower","AllAttack","Weakening","PersianSepahsalar","TuranianArcher","TuranianSpy","RockthrowingGiant","HogriderDemon","PredatorLion","Wolf","Witch","WildHog","Piran","Bahman","HugeGiant","TerrorHood"]},"matchHistory":[],"mainDeck":"Story 3","daric":15000},{"username":"customplayer","password":"1234","collection":[],"allDecks":{},"matchHistory":[],"mainDeck":"","daric":15000}] \ No newline at end of file diff --git a/core/assets/button/button_confirm.png b/core/assets/button/button_confirm.png new file mode 100644 index 0000000..c70c27c Binary files /dev/null and b/core/assets/button/button_confirm.png differ diff --git a/core/assets/button/button_confirm@2x.png b/core/assets/button/button_confirm@2x.png new file mode 100644 index 0000000..638074c Binary files /dev/null and b/core/assets/button/button_confirm@2x.png differ diff --git a/core/assets/button/decreaseButton.png b/core/assets/button/decreaseButton.png new file mode 100644 index 0000000..1f29751 Binary files /dev/null and b/core/assets/button/decreaseButton.png differ diff --git a/core/assets/button/increaseButton.png b/core/assets/button/increaseButton.png new file mode 100644 index 0000000..c66cafd Binary files /dev/null and b/core/assets/button/increaseButton.png differ diff --git a/core/assets/button/secondCustom1-1.png b/core/assets/button/secondCustom1-1.png new file mode 100644 index 0000000..a49f80c Binary files /dev/null and b/core/assets/button/secondCustom1-1.png differ diff --git a/core/assets/button/secondCustom1.png b/core/assets/button/secondCustom1.png new file mode 100644 index 0000000..844d0d6 Binary files /dev/null and b/core/assets/button/secondCustom1.png differ diff --git a/core/assets/button/yellow glow.png b/core/assets/button/yellow glow.png index 2110291..ab22c4e 100644 Binary files a/core/assets/button/yellow glow.png and b/core/assets/button/yellow glow.png differ diff --git a/core/assets/sfx/end game.mp3 b/core/assets/sfx/end game.mp3 new file mode 100644 index 0000000..840d5a0 Binary files /dev/null and b/core/assets/sfx/end game.mp3 differ diff --git a/core/src/graphic/main/AssetHandler.java b/core/src/graphic/main/AssetHandler.java index 7a6b0c9..9a0c7c5 100644 --- a/core/src/graphic/main/AssetHandler.java +++ b/core/src/graphic/main/AssetHandler.java @@ -138,6 +138,12 @@ public static synchronized void load() { assetManager.load("button/card in deck.png", Texture.class); assetManager.load("button/card in deck1.png", Texture.class); assetManager.load("button/deckName.png", Texture.class); + assetManager.load("button/secondCustom1.png", Texture.class); + assetManager.load("button/secondCustom1-1.png", Texture.class); + assetManager.load("button/increaseButton.png", Texture.class); + assetManager.load("button/decreaseButton.png", Texture.class); + assetManager.load("button/multiplayer1.png", Texture.class); + assetManager.load("button/multiplayer1-1.png", Texture.class); for(int i = 1; i <= 11; i++) diff --git a/core/src/graphic/screen/BattleScreen.java b/core/src/graphic/screen/BattleScreen.java index a517a0d..f742e3b 100644 --- a/core/src/graphic/screen/BattleScreen.java +++ b/core/src/graphic/screen/BattleScreen.java @@ -21,6 +21,8 @@ import model.game.CellEffect; import model.game.Game; import model.game.Player; +import network.Client; +import network.MouseState; import java.awt.*; import java.util.ArrayList; @@ -149,7 +151,6 @@ public void create() { manaStart2 = new Vector2(1330 - mana.getWidth(), 730); mousePos = new Vector2(); - hero1Icon = AssetHandler.getData().get(player1.getHero().getIconId()); hero2Icon = AssetHandler.getData().get(player2.getHero().getIconId()); @@ -283,87 +284,13 @@ public boolean keyTyped(char character) { @Override public boolean touchDown(int screenX, int screenY, int pointer, int button) { - if(game.isGameEnded()){ - ScreenManager.setScreen(new MenuScreen()); - } - if(endTurnButton.isActive()){ - endTurn(); - } else if(endGameButton.isActive()){ - game.exitFromGame(); - endGame(); - } else if(graveyardButton.isActive()){ - showingGraveyard = !showingGraveyard; - } else if(fastForwardButton.isActive()){ - setFastForward(); - } - else if(checkHeroSp()){ - if(game.getWhoIsHisTurn().canUseHeroSp()) - heroSpSelected = true; - } else if(getMouseCell() != null){ - if(getMouseCell().getInsideArmy() != null && game.getWhoIsHisTurn().isFriend(getMouseCell().getInsideArmy())) { - selectedCell = getMouseCell(); - selectedCellHand = null; - heroSpSelected = false; - selectedArmy = selectedCell.getInsideArmy(); - setCommand("select " + selectedArmy.getID().getValue()); - synchronized (game){ - game.notify(); - } - } else if(selectedArmy != null && getMouseCell().getInsideArmy() == null) { - Cell cell = getMouseCell(); - if (!game.getWhoIsHisTurn().canMove(selectedCell, cell)){ - setPopUp("Invalid Cell"); - return false; - } - runSound.play(); - game.getWhoIsHisTurn().moveArmy(selectedCell, cell); - selectedCell = null; - selectedArmy = null; - } else if(selectedCellHand != null && getMouseCell().getInsideArmy() == null) { -// Cell cell = getMouseCell(); -// if(game.getWhoIsHisTurn().moveFromHandToCell(handCards.get(selectedCellHand), cell)); -// handCards.put(selectedCellHand, null); -// selectedCellHand = null; - } else if(selectedArmy != null && getMouseCell().getInsideArmy() != null) { - Cell cell = getMouseCell(); - Army target = cell.getInsideArmy(); - if(game.getWhoIsHisTurn().isInRange(selectedCell, cell)) { - attackSound.play(); - animations.get(selectedArmy).attack(); - if (game.getWhoIsHisTurn().isInRange(cell, selectedCell)) - animations.get(target).attack(); - } - game.getWhoIsHisTurn().attack(selectedCell, cell); - if(selectedCell.getInsideArmy().getHp() <= 0){ - animations.get(selectedArmy).death(); - game.setupCardDeaf(selectedCell); - } - if(cell.getInsideArmy().getHp() <= 0){ - animations.get(target).death(); - game.setupCardDeaf(cell); - } - selectedCell = null; - selectedArmy = null; - } else if(heroSpSelected){ - game.getWhoIsHisTurn().useSpecialPower(getMouseCell()); - } - } else if(getMouseHandCell() != null){ - selectedCellHand = getMouseHandCell(); - selectedCell = null; - selectedArmy = null; - heroSpSelected = false; - } + mouseTouchDown(); return false; } @Override public boolean touchUp(int screenX, int screenY, int pointer, int button) { - if(selectedCellHand != null && getMouseCell()!= null && getMouseCell().getInsideArmy() == null){ - Cell cell = getMouseCell(); - if(game.getWhoIsHisTurn().moveFromHandToCell(handCards.get(selectedCellHand), cell)); - handCards.put(selectedCellHand, null); - selectedCellHand = null; - } + mouseTouchUp(); return false; } @@ -383,7 +310,122 @@ public boolean scrolled(int amount) { } }); } + public void updateByServer() { + camera.update(); + shapeRenderer.setProjectionMatrix(camera.combined); + game = Game.getCurrentGame(); + player1 = game.getFirstPlayer(); + player2 = game.getSecondPlayer(); + + if(game.isGameEnded()){ + endGame(); + } + + checkTurnTime(); + + updateHandCells(); + + setAnimations(); + Client.setMousePos(); + mousePos.set(Client.getMousePos()); + //mousePos.set(Gdx.input.getX(), Gdx.input.getY()); + mousePos = viewport.unproject(mousePos); + + endTurnButton.setActive(endTurnButton.contains(mousePos)); + endGameButton.setActive(endGameButton.contains(mousePos)); + graveyardButton.setActive(graveyardButton.contains(mousePos)); + fastForwardButton.setActive(fastForwardButton.contains(mousePos)); + + updateGraveyard(); + if(Client.getMouseState() == MouseState.TOUCH_DOWN) { + mouseTouchDown(); + } + else if(Client.getMouseState() == MouseState.TOUCH_UP) { + mouseTouchUp(); + } + } + public void mouseTouchUp() { + if(selectedCellHand != null && getMouseCell()!= null && getMouseCell().getInsideArmy() == null){ + Cell cell = getMouseCell(); + if(game.getWhoIsHisTurn().moveFromHandToCell(handCards.get(selectedCellHand), cell)); + handCards.put(selectedCellHand, null); + selectedCellHand = null; + } + return; + } + public void mouseTouchDown() { + if (game.isGameEnded()) { + ScreenManager.setScreen(new MenuScreen()); + } + if (endTurnButton.isActive()) { + endTurn(); + } else if (endGameButton.isActive()) { + game.exitFromGame(); + endGame(); + } else if (graveyardButton.isActive()) { + showingGraveyard = !showingGraveyard; + } else if (fastForwardButton.isActive()) { + setFastForward(); + } else if (checkHeroSp()) { + if (game.getWhoIsHisTurn().canUseHeroSp()) + heroSpSelected = true; + } else if (getMouseCell() != null) { + if (getMouseCell().getInsideArmy() != null && game.getWhoIsHisTurn().isFriend(getMouseCell().getInsideArmy())) { + selectedCell = getMouseCell(); + selectedCellHand = null; + heroSpSelected = false; + selectedArmy = selectedCell.getInsideArmy(); + setCommand("select " + selectedArmy.getID().getValue()); + synchronized (game) { + game.notify(); + } + } else if (selectedArmy != null && getMouseCell().getInsideArmy() == null) { + Cell cell = getMouseCell(); + if (!game.getWhoIsHisTurn().canMove(selectedCell, cell)) { + setPopUp("Invalid Cell"); + return; + } + runSound.play(); + game.getWhoIsHisTurn().moveArmy(selectedCell, cell); + selectedCell = null; + selectedArmy = null; + } else if (selectedCellHand != null && getMouseCell().getInsideArmy() == null) { +// Cell cell = getMouseCell(); +// if(game.getWhoIsHisTurn().moveFromHandToCell(handCards.get(selectedCellHand), cell)); +// handCards.put(selectedCellHand, null); +// selectedCellHand = null; + } else if (selectedArmy != null && getMouseCell().getInsideArmy() != null) { + Cell cell = getMouseCell(); + Army target = cell.getInsideArmy(); + if (game.getWhoIsHisTurn().isInRange(selectedCell, cell)) { + attackSound.play(); + animations.get(selectedArmy).attack(); + if (game.getWhoIsHisTurn().isInRange(cell, selectedCell)) + animations.get(target).attack(); + } + game.getWhoIsHisTurn().attack(selectedCell, cell); + if (selectedCell.getInsideArmy().getHp() <= 0) { + animations.get(selectedArmy).death(); + game.setupCardDeaf(selectedCell); + } + if (cell.getInsideArmy().getHp() <= 0) { + animations.get(target).death(); + game.setupCardDeaf(cell); + } + selectedCell = null; + selectedArmy = null; + } else if (heroSpSelected) { + game.getWhoIsHisTurn().useSpecialPower(getMouseCell()); + } + } else if (getMouseHandCell() != null) { + selectedCellHand = getMouseHandCell(); + selectedCell = null; + selectedArmy = null; + heroSpSelected = false; + } + return; + } public void endTurn() { selectedCell = null; selectedArmy = null; diff --git a/core/src/graphic/screen/LoadingScreen.java b/core/src/graphic/screen/LoadingScreen.java index 2b66103..b10b029 100644 --- a/core/src/graphic/screen/LoadingScreen.java +++ b/core/src/graphic/screen/LoadingScreen.java @@ -8,6 +8,7 @@ import graphic.main.AssetHandler; import graphic.main.Gif; import graphic.main.Main; +import graphic.screen.gameMenuScreens.WaitingScreen; import java.awt.*; diff --git a/core/src/graphic/screen/LoginScreen.java b/core/src/graphic/screen/LoginScreen.java index 3413e1e..b99998d 100644 --- a/core/src/graphic/screen/LoginScreen.java +++ b/core/src/graphic/screen/LoginScreen.java @@ -5,8 +5,9 @@ import com.badlogic.gdx.InputProcessor; import com.badlogic.gdx.audio.Music; import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.*; -import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.GlyphLayout; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.math.Vector2; import graphic.Others.SlotType; @@ -14,6 +15,7 @@ import graphic.main.Button; import graphic.main.Main; import model.other.Account; +import network.Client; import java.awt.*; @@ -119,7 +121,7 @@ else if (currentSlot.equals(SlotType.PASSWORD) && signUpButton.isActive()) } } if (loginButton.isActive() && Account.doesAccountExist(userName)) { - if (Account.checkIfPasswordIsCorrect(userName,password)) { + if (Client.logIn(userName, password).equals("correct login")) { Account.setCurrentAccount(Account.findAccount(userName)); ScreenManager.setScreen(new MenuScreen()); } diff --git a/core/src/graphic/screen/gameMenuScreens/ChooseNumberOfPlayersMenuScreen.java b/core/src/graphic/screen/gameMenuScreens/ChooseNumberOfPlayersMenuScreen.java index d09969b..271c96c 100644 --- a/core/src/graphic/screen/gameMenuScreens/ChooseNumberOfPlayersMenuScreen.java +++ b/core/src/graphic/screen/gameMenuScreens/ChooseNumberOfPlayersMenuScreen.java @@ -85,7 +85,7 @@ public boolean touchDown(int screenX, int screenY, int pointer, int button) { if (button != Input.Buttons.LEFT) return false; if (multiPlayerButton.isActive()) - ScreenManager.setScreen(new MultiPlayerMenuScreen()); + ScreenManager.setScreen(new MultiPlayerScreen()); if (storyButton.isActive()) ScreenManager.setScreen(new StoryMenuScreen()); if (customButton.isActive()) diff --git a/core/src/graphic/screen/gameMenuScreens/Datas.java b/core/src/graphic/screen/gameMenuScreens/Datas.java index 9f516d7..916dfc2 100644 --- a/core/src/graphic/screen/gameMenuScreens/Datas.java +++ b/core/src/graphic/screen/gameMenuScreens/Datas.java @@ -193,6 +193,7 @@ public Deck setDeck(Deck deck) { } return copyDeck; } + public void makeKillHeroCustom(int deckNumber) { type = GameType.KILL_HERO; Account account; @@ -245,4 +246,37 @@ public void run() { }).start(); } + public void makeKillHeroCustom(final Account account) { + type = GameType.KILL_HERO; + secondAccount = account; + new Thread(new Runnable() { + @Override + public void run() { + playGame(0); + } + }).start(); + } + + public void makeCaptureTheFlagCustom(Account account) { + type = GameType.CAPTURE_THE_FLAG; + secondAccount = account; + new Thread(new Runnable() { + @Override + public void run() { + playGame(1); + } + }).start(); + } + + public void makeRollUpFlagCustom(Account account, final int numberOfFlags) { + type = GameType.ROLLUP_FLAGS; + secondAccount = account; + new Thread(new Runnable() { + @Override + public void run() { + playGame(numberOfFlags); + } + }).start(); + } + } diff --git a/core/src/graphic/screen/gameMenuScreens/MultiPlayerScreen.java b/core/src/graphic/screen/gameMenuScreens/MultiPlayerScreen.java new file mode 100644 index 0000000..8f3b378 --- /dev/null +++ b/core/src/graphic/screen/gameMenuScreens/MultiPlayerScreen.java @@ -0,0 +1,229 @@ + +package graphic.screen.gameMenuScreens; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; +import com.badlogic.gdx.InputProcessor; +import com.badlogic.gdx.audio.Music; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.glutils.ShapeRenderer; +import com.badlogic.gdx.math.Vector2; +import graphic.main.AssetHandler; +import graphic.main.Button; +import graphic.main.Main; +import graphic.screen.BattleScreen; +import graphic.screen.Screen; +import graphic.screen.ScreenManager; +import model.game.GameType; +import network.Client; + +import java.util.ArrayList; + +public class MultiPlayerScreen extends Screen { + + private ShapeRenderer shapeRenderer; + private Music music; + private Texture backGroundPic; + private Button exitButton; + private Vector2 mousePos; + private Button[] onlinePlayersButtons; + private Button killHeroButton; + private Button captureTheFlagButton; + private Button rollUpFlagsButton; + private Button increaseNumberOfFlagsButton; + private Button decreaseNumberOfFlagsButton; + private BitmapFont font; + private GameType gameType = GameType.KILL_HERO; + private ArrayList accounts = new ArrayList<>(); + private int numberOfFlags = 1; + @Override + public void create() { + String font = "fonts/Arial 36.fnt"; + this.font = AssetHandler.getData().get(font); + addOnlineAccounts(); + setCameraAndViewport(); + shapeRenderer = new ShapeRenderer(); + onlinePlayersButtons = new Button[accounts.size() + 1]; + backGroundPic = AssetHandler.getData().get("backGround/secondCustomMenu.jpg"); + mousePos = new Vector2(); + killHeroButton = new Button("button/secondCustom1.png", "button/secondCustom1-1.png", "sfx/click.mp3", 100, 700, "kill hero", font); + captureTheFlagButton = new Button("button/secondCustom1.png", "button/secondCustom1-1.png", "sfx/click.mp3", 500, 700, "capture the flag", font); + rollUpFlagsButton = new Button("button/secondCustom1.png", "button/secondCustom1-1.png", "sfx/click.mp3", 900, 700, "rollup flags", font); + increaseNumberOfFlagsButton = new Button("button/increaseButton.png", "button/increaseButton.png", "sfx/click.mp3", 800, 450); + decreaseNumberOfFlagsButton = new Button("button/decreaseButton.png", "button/decreaseButton.png", "sfx/click.mp3", 400, 450); + killHeroButton.setActive(true); + captureTheFlagButton.setActive(false); + rollUpFlagsButton.setActive(false); + createAccounts(); + exitButton = new Button("button/exit.png", Main.WIDTH - 200, Main.HEIGHT - 200); + createBackGroundMusic(); mousePos = new Vector2(); + + } + + @Override + public void update() { + camera.update(); + mousePos.set(Gdx.input.getX(), Gdx.input.getY()); + mousePos = viewport.unproject(mousePos); + increaseNumberOfFlagsButton.setActive(increaseNumberOfFlagsButton.contains(mousePos)); + decreaseNumberOfFlagsButton.setActive(decreaseNumberOfFlagsButton.contains(mousePos)); + + + exitButton.setActive(exitButton.contains(mousePos)); + //updateAccounts(); + Gdx.input.setInputProcessor(new InputProcessor() { + @Override + public boolean keyDown(int keycode) { + return false; + } + + @Override + public boolean keyUp(int keycode) { + return false; + } + + @Override + public boolean keyTyped(char character) { + return false; + } + + @Override + public boolean touchDown(int screenX, int screenY, int pointer, int button) { + if (button != Input.Buttons.LEFT) + return false; + for(int i = 0; i < accounts.size(); i++) { + if (onlinePlayersButtons[i].contains(mousePos)) { + String applyingCondition = Client.getApplyCondition(accounts.get(i)); + String type = ""; + if(gameType == GameType.KILL_HERO) type = "kill hero"; + else if(gameType == GameType.CAPTURE_THE_FLAG) type = "capture the flag"; + else if(gameType == GameType.ROLLUP_FLAGS) type = "rollup flags"; + if(applyingCondition.equals("nothing")) { + Client.applyPlayMultiPlayerGame(accounts.get(i), type, numberOfFlags); + ScreenManager.setScreen(new WaitingScreen(accounts.get(i))); + } + else if(applyingCondition.equals("wait for me")) { + Client.acceptApplying(accounts.get(i)); + if(gameType == GameType.KILL_HERO) + Datas.getDatas().makeKillHeroCustom(Client.getAccount(accounts.get(i))); + else if(gameType == GameType.CAPTURE_THE_FLAG) + Datas.getDatas().makeCaptureTheFlagCustom(Client.getAccount(accounts.get(i))); + else if(gameType == GameType.ROLLUP_FLAGS) + Datas.getDatas().makeRollUpFlagCustom(Client.getAccount(accounts.get(i)), numberOfFlags); + ScreenManager.setScreen(new BattleScreen()); + } + } + } + if(killHeroButton.contains(mousePos)) { + killHeroButton.setActive(true); + captureTheFlagButton.setActive(false); + rollUpFlagsButton.setActive(false); + gameType = GameType.KILL_HERO; + } + else if(captureTheFlagButton.contains(mousePos)) { + killHeroButton.setActive(false); + captureTheFlagButton.setActive(true); + rollUpFlagsButton.setActive(false); + gameType = GameType.CAPTURE_THE_FLAG; + } + else if(rollUpFlagsButton.contains(mousePos)) { + killHeroButton.setActive(false); + captureTheFlagButton.setActive(false); + rollUpFlagsButton.setActive(true); + gameType = GameType.ROLLUP_FLAGS; + } + else if(gameType == GameType.ROLLUP_FLAGS && increaseNumberOfFlagsButton.isActive()) { + if(numberOfFlags< 7) numberOfFlags++; + } + else if(gameType == GameType.ROLLUP_FLAGS && decreaseNumberOfFlagsButton.isActive()) { + if(numberOfFlags > 1) numberOfFlags--; + } + return false; + } + + @Override + public boolean touchUp(int screenX, int screenY, int pointer, int button) { + return false; + } + + @Override + public boolean touchDragged(int screenX, int screenY, int pointer) { + return false; + } + + @Override + public boolean mouseMoved(int screenX, int screenY) { + return false; + } + + @Override + public boolean scrolled(int amount) { + return false; + } + }); + } + + @Override + public void render(SpriteBatch batch) { + batch.setProjectionMatrix(camera.combined); + shapeRenderer.setProjectionMatrix(camera.combined); + + drawBackGround(batch); + exitButton.draw(batch); + killHeroButton.draw(batch); + captureTheFlagButton.draw(batch); + rollUpFlagsButton.draw(batch); + if(gameType == GameType.ROLLUP_FLAGS){ + increaseNumberOfFlagsButton.draw(batch); + decreaseNumberOfFlagsButton.draw(batch); + batch.begin(); + font.draw(batch, Integer.toString(numberOfFlags), 630, 500); + batch.end(); + } + drawAccounts(batch); + } + + + @Override + public void dispose() { + music.dispose(); + } + private void createBackGroundMusic() { + music = AssetHandler.getData().get("music/login.mp3"); + music.setLooping(true); + music.setVolume(0.05f); + music.play(); + } + + + private void drawBackGround(SpriteBatch batch) { + batch.begin(); + batch.draw(backGroundPic, 0, 0); + batch.end(); + } + private void createAccounts() { + for(int i = 0; i < accounts.size(); i++) { + float x = 1200*i/accounts.size(); + float y = 250; + onlinePlayersButtons[i] = new Button("button/multiplayer1.png","button/multiplayer1-1.png" , x, y, accounts.get(i)); + onlinePlayersButtons[i].setActive(Client.getApplyCondition(accounts.get(i)).equals("wait for me")); + + } + } + private void drawAccounts(SpriteBatch batch) { + for(int i = 0; i < accounts.size(); i++) + onlinePlayersButtons[i].draw(batch); + } + private void updateAccounts() { + for(int i = 0; i < accounts.size(); i++) { + if(Client.getApplyCondition(accounts.get(i)) == "waiting for me") + onlinePlayersButtons[i].setActive(true); + } + } + private void addOnlineAccounts() { + Client.setOnlineAccounts(); + accounts.addAll(Client.getOnlineAccounts()); + } +} diff --git a/core/src/graphic/screen/gameMenuScreens/SecondCustomMenuScreen.java b/core/src/graphic/screen/gameMenuScreens/SecondCustomMenuScreen.java index c41ae95..4a0b029 100644 --- a/core/src/graphic/screen/gameMenuScreens/SecondCustomMenuScreen.java +++ b/core/src/graphic/screen/gameMenuScreens/SecondCustomMenuScreen.java @@ -6,6 +6,7 @@ import com.badlogic.gdx.InputProcessor; import com.badlogic.gdx.audio.Music; import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.math.Vector2; @@ -16,6 +17,7 @@ import graphic.screen.Screen; import graphic.screen.ScreenManager; import model.game.Deck; +import model.game.GameType; import java.util.ArrayList; @@ -27,19 +29,34 @@ public class SecondCustomMenuScreen extends Screen { private Button exitButton; private Vector2 mousePos; private Button[] decksButtons; + private Button killHeroButton; + private Button captureTheFlagButton; + private Button rollUpFlagsButton; + private Button increaseNumberOfFlagsButton; + private Button decreaseNumberOfFlagsButton; + private BitmapFont font; + private GameType gameType = GameType.KILL_HERO; private ArrayList decks = new ArrayList(); private int numberOFDecks = 3; + private int numberOfFlags = 1; @Override public void create() { + String font = "fonts/Arial 36.fnt"; + this.font = AssetHandler.getData().get(font); addDecks(); setCameraAndViewport(); shapeRenderer = new ShapeRenderer(); decksButtons = new Button[numberOFDecks + 1]; backGroundPic = AssetHandler.getData().get("backGround/secondCustomMenu.jpg"); mousePos = new Vector2(); - - - String font = "fonts/Arial 36.fnt"; + killHeroButton = new Button("button/secondCustom1.png", "button/secondCustom1-1.png", "sfx/click.mp3", 100, 700, "kill hero", font); + captureTheFlagButton = new Button("button/secondCustom1.png", "button/secondCustom1-1.png", "sfx/click.mp3", 500, 700, "capture the flag", font); + rollUpFlagsButton = new Button("button/secondCustom1.png", "button/secondCustom1-1.png", "sfx/click.mp3", 900, 700, "rollup flags", font); + increaseNumberOfFlagsButton = new Button("button/increaseButton.png", "button/increaseButton.png", "sfx/click.mp3", 800, 450); + decreaseNumberOfFlagsButton = new Button("button/decreaseButton.png", "button/decreaseButton.png", "sfx/click.mp3", 400, 450); + killHeroButton.setActive(true); + captureTheFlagButton.setActive(false); + rollUpFlagsButton.setActive(false); createDecks(); exitButton = new Button("button/exit.png", Main.WIDTH - 200, Main.HEIGHT - 200); createBackGroundMusic(); mousePos = new Vector2(); @@ -51,7 +68,8 @@ public void update() { camera.update(); mousePos.set(Gdx.input.getX(), Gdx.input.getY()); mousePos = viewport.unproject(mousePos); - + increaseNumberOfFlagsButton.setActive(increaseNumberOfFlagsButton.contains(mousePos)); + decreaseNumberOfFlagsButton.setActive(decreaseNumberOfFlagsButton.contains(mousePos)); exitButton.setActive(exitButton.contains(mousePos)); @@ -78,11 +96,41 @@ public boolean touchDown(int screenX, int screenY, int pointer, int button) { return false; for(int i = 0; i < numberOFDecks; i++) { if (decksButtons[i].isActive()) { - Datas.getDatas().makeKillHeroCustom(i); + if(gameType == GameType.KILL_HERO) + Datas.getDatas().makeKillHeroCustom(i); + else if(gameType == GameType.CAPTURE_THE_FLAG) + Datas.getDatas().makeCaptureTheFlagCustom(i); + else if(gameType == GameType.ROLLUP_FLAGS) + Datas.getDatas().makeRollUpFlagCustom(i, numberOfFlags); + ScreenManager.setScreen(new BattleScreen()); } } + if(killHeroButton.contains(mousePos)) { + killHeroButton.setActive(true); + captureTheFlagButton.setActive(false); + rollUpFlagsButton.setActive(false); + gameType = GameType.KILL_HERO; + } + else if(captureTheFlagButton.contains(mousePos)) { + killHeroButton.setActive(false); + captureTheFlagButton.setActive(true); + rollUpFlagsButton.setActive(false); + gameType = GameType.CAPTURE_THE_FLAG; + } + else if(rollUpFlagsButton.contains(mousePos)) { + killHeroButton.setActive(false); + captureTheFlagButton.setActive(false); + rollUpFlagsButton.setActive(true); + gameType = GameType.ROLLUP_FLAGS; + } + else if(gameType == GameType.ROLLUP_FLAGS && increaseNumberOfFlagsButton.isActive()) { + if(numberOfFlags< 7) numberOfFlags++; + } + else if(gameType == GameType.ROLLUP_FLAGS && decreaseNumberOfFlagsButton.isActive()) { + if(numberOfFlags > 1) numberOfFlags--; + } return false; } @@ -115,6 +163,16 @@ public void render(SpriteBatch batch) { drawBackGround(batch); exitButton.draw(batch); + killHeroButton.draw(batch); + captureTheFlagButton.draw(batch); + rollUpFlagsButton.draw(batch); + if(gameType == GameType.ROLLUP_FLAGS){ + increaseNumberOfFlagsButton.draw(batch); + decreaseNumberOfFlagsButton.draw(batch); + batch.begin(); + font.draw(batch, Integer.toString(numberOfFlags), 630, 500); + batch.end(); + } drawDecks(batch); } @@ -159,4 +217,3 @@ private void addDecks() { decks.addAll(Datas.getDatas().getCustomDecks()); } } - diff --git a/core/src/graphic/screen/gameMenuScreens/MultiPlayerMenuScreen.java b/core/src/graphic/screen/gameMenuScreens/SecondCustomMenuScreen2.java similarity index 56% rename from core/src/graphic/screen/gameMenuScreens/MultiPlayerMenuScreen.java rename to core/src/graphic/screen/gameMenuScreens/SecondCustomMenuScreen2.java index 322d218..1c6effa 100644 --- a/core/src/graphic/screen/gameMenuScreens/MultiPlayerMenuScreen.java +++ b/core/src/graphic/screen/gameMenuScreens/SecondCustomMenuScreen2.java @@ -1,3 +1,4 @@ + package graphic.screen.gameMenuScreens; import com.badlogic.gdx.Gdx; @@ -8,42 +9,41 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.math.Vector2; -import graphic.Others.MoveAnimation; -import graphic.Others.MoveType; import graphic.main.AssetHandler; import graphic.main.Button; import graphic.main.Main; import graphic.screen.BattleScreen; +import graphic.screen.Screen; import graphic.screen.ScreenManager; +import model.game.Deck; import java.util.ArrayList; -public class MultiPlayerMenuScreen extends graphic.screen.Screen { +public class SecondCustomMenuScreen2 extends Screen { private ShapeRenderer shapeRenderer; private Music music; private Texture backGroundPic; - private Button multiPlayerButton; - private Button storyButton; - private Button customButton; private Button exitButton; private Vector2 mousePos; - private ArrayList lanternAnimation; - + private Button[] decksButtons; + private ArrayList decks = new ArrayList(); + private int numberOFDecks = 3; @Override public void create() { + addDecks(); setCameraAndViewport(); - createLanternsAnimation(); shapeRenderer = new ShapeRenderer(); - backGroundPic = AssetHandler.getData().get("backGround/background_ChooseNumberOfPlayersMenu.jpg"); + decksButtons = new Button[numberOFDecks + 1]; + backGroundPic = AssetHandler.getData().get("backGround/secondCustomMenu.jpg"); + mousePos = new Vector2(); + - String font = "fonts/Arial 24.fnt"; - multiPlayerButton = new Button("button/big_circle.png", "button/big_circle_action.png", 500, 320, "Multi Player", font); - storyButton = new Button("button/big_circle.png", "button/big_circle_action.png",900, 320, "Story", font); - customButton = new Button("button/big_circle.png","button/big_circle_action.png", 1300, 320, "Custom", font); + String font = "fonts/Arial 36.fnt"; + createDecks(); exitButton = new Button("button/exit.png", Main.WIDTH - 200, Main.HEIGHT - 200); - mousePos = new Vector2(); - createBackGroundMusic(); + createBackGroundMusic(); mousePos = new Vector2(); + } @Override @@ -52,12 +52,10 @@ public void update() { mousePos.set(Gdx.input.getX(), Gdx.input.getY()); mousePos = viewport.unproject(mousePos); - customButton.setActive(customButton.contains(mousePos)); - storyButton.setActive(storyButton.contains(mousePos)); - multiPlayerButton.setActive(multiPlayerButton.contains(mousePos)); - exitButton.setActive(exitButton.contains(mousePos)); + exitButton.setActive(exitButton.contains(mousePos)); + updateDecks(); Gdx.input.setInputProcessor(new InputProcessor() { @Override public boolean keyDown(int keycode) { @@ -78,8 +76,13 @@ public boolean keyTyped(char character) { public boolean touchDown(int screenX, int screenY, int pointer, int button) { if (button != Input.Buttons.LEFT) return false; - if (multiPlayerButton.isActive()) - ScreenManager.setScreen(new BattleScreen()); + for(int i = 0; i < numberOFDecks; i++) { + if (decksButtons[i].isActive()) { + Datas.getDatas().makeKillHeroCustom(i); + ScreenManager.setScreen(new BattleScreen()); + + } + } return false; } @@ -110,55 +113,50 @@ public void render(SpriteBatch batch) { batch.setProjectionMatrix(camera.combined); shapeRenderer.setProjectionMatrix(camera.combined); - drawBackGround(batch); - showLanternAnimation(batch); - multiPlayerButton.draw(batch); - storyButton.draw(batch); - customButton.draw(batch); exitButton.draw(batch); + drawDecks(batch); } - private void showLanternAnimation(SpriteBatch batch) { - for (MoveAnimation animation: lanternAnimation) { - animation.draw(batch); - } - } @Override public void dispose() { music.dispose(); } - - private void createLanternsAnimation() { - lanternAnimation = new ArrayList(); - for (int i = 0; i < 40; ++i) { - float xStart = 100 + (int) (900 * Math.random()); - float yStart = (750 - xStart/6f) + (int) (100 * Math.random()); - float xEnd = 900 + (float)(Math.random() * 700), yEnd = 900; - int fireType = (int) (5 * Math.random() + 1); - if (fireType < 3) - fireType = 1; - else if (fireType < 5) - fireType = 2; - else - fireType = 3; - fireType = 1;/////////////////////// - lanternAnimation.add(new MoveAnimation("simpleIcons/fire" + fireType + ".png", xStart, yStart, xEnd, yEnd, MoveType.SIMPLE, true)); - lanternAnimation.get(i).setSpeed((float)( 1 + (Math.random() + 0.5f) - fireType / 2)); - } - } - private void createBackGroundMusic() { - music = AssetHandler.getData().get("music/menu.mp3"); + music = AssetHandler.getData().get("music/login.mp3"); music.setLooping(true); music.setVolume(0.05f); music.play(); } + private void drawBackGround(SpriteBatch batch) { batch.begin(); batch.draw(backGroundPic, 0, 0); batch.end(); } + private void createDecks() { + for(int i = 0; i < numberOFDecks; i++) { + float x = i*400; + float y = 250; + decksButtons[i] = new Button("button/decks/deActiveDeck.png","button/decks/activeDeck.png" , x, y, decks.get(i).getName()); + decksButtons[i].setActive(decksButtons[i].contains(mousePos)); + + } + } + private void drawDecks(SpriteBatch batch) { + for(int i = 0; i < numberOFDecks; i++) + decksButtons[i].draw(batch); + } + private void updateDecks() { + for(int i = 0; i < numberOFDecks; i++) { + decksButtons[i].setActive(decksButtons[i].contains(mousePos)); + } + } + private void addDecks() { + Datas.getDatas().setCustomDecks(); + decks.addAll(Datas.getDatas().getCustomDecks()); + } } + diff --git a/core/src/graphic/screen/gameMenuScreens/WaitingScreen.java b/core/src/graphic/screen/gameMenuScreens/WaitingScreen.java new file mode 100644 index 0000000..34ff7f4 --- /dev/null +++ b/core/src/graphic/screen/gameMenuScreens/WaitingScreen.java @@ -0,0 +1,127 @@ +package graphic.screen.gameMenuScreens; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.InputProcessor; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.GlyphLayout; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.math.Vector2; +import graphic.main.Button; +import graphic.main.Gif; +import graphic.main.Main; +import graphic.screen.BattleScreen; +import graphic.screen.Screen; +import graphic.screen.ScreenManager; +import model.game.GameType; +import network.Client; + + +public class WaitingScreen extends Screen { + + private Gif loadingGif; + private BitmapFont font; + private GlyphLayout glyphLayout; + private String username = ""; + private String condition = "wait for another"; + private Button cancelButton; + private Vector2 mousePos; + private GameType gameType = GameType.KILL_HERO; + private int numberOfFlags = 0; + public WaitingScreen(String username) { + this.username = username; + } + + @Override + public void create() { + setCameraAndViewport(); + loadingGif = new Gif("loading.gif"); + font = new BitmapFont(Gdx.files.internal("fonts/Arial 48B.fnt")); + glyphLayout = new GlyphLayout(); + cancelButton = new Button("button/red.png", "button/red glow.png", "sfx/click.mp3", 700, 100, "cancel", font); + mousePos = new Vector2(); + + } + + @Override + public void update() { + camera.update(); + mousePos.set(Gdx.input.getX(), Gdx.input.getY()); + mousePos = viewport.unproject(mousePos); + + String condition = Client.getApplyCondition(this.username); + this.condition = condition; + if(this.condition.equals("accepted")) { + if(gameType == GameType.KILL_HERO) + Datas.getDatas().makeKillHeroCustom(Client.getAccount(username)); + else if(gameType == GameType.CAPTURE_THE_FLAG) + Datas.getDatas().makeCaptureTheFlagCustom(Client.getAccount(username)); + else if(gameType == GameType.ROLLUP_FLAGS) + Datas.getDatas().makeRollUpFlagCustom(Client.getAccount(username), numberOfFlags); + ScreenManager.setScreen(new BattleScreen()); + + } + cancelButton.setActive(cancelButton.contains(mousePos)); + Gdx.input.setInputProcessor(new InputProcessor() { + @Override + public boolean keyDown(int keycode) { + return false; + } + + @Override + public boolean keyUp(int keycode) { + return false; + } + + @Override + public boolean keyTyped(char character) { + return false; + } + + @Override + public boolean touchDown(int screenX, int screenY, int pointer, int button) { + if(cancelButton.isActive()) { + Client.cancelApplying(username); + ScreenManager.setScreen(new MultiPlayerScreen()); + } + return false; + } + + @Override + public boolean touchUp(int screenX, int screenY, int pointer, int button) { + return false; + } + + @Override + public boolean touchDragged(int screenX, int screenY, int pointer) { + return false; + } + + @Override + public boolean mouseMoved(int screenX, int screenY) { + return false; + } + + @Override + public boolean scrolled(int amount) { + return false; + } + }); + + } + + @Override + public void render(SpriteBatch batch) { + batch.setProjectionMatrix(camera.combined); + batch.begin(); + glyphLayout.setText(font, condition); + font.draw(batch, condition, (Main.WIDTH - glyphLayout.width) / 2 - 100, Main.HEIGHT - (Main.HEIGHT - glyphLayout.height) / 2 + 150); + batch.end(); + loadingGif.draw(batch, Main.WIDTH/2, Main.HEIGHT/2 - 20 + 50); + cancelButton.draw(batch); + } + + @Override + public void dispose() { + + } +} diff --git a/core/src/model/game/Game.java b/core/src/model/game/Game.java index ade4452..964f7ab 100644 --- a/core/src/model/game/Game.java +++ b/core/src/model/game/Game.java @@ -338,6 +338,12 @@ public void setTurnStartTime(long turnStartTime) { this.turnStartTime = turnStartTime; } + public static GameType getGameTypeByString(String type) { + if(type.equals("kill hero")) return KILL_HERO; + else if(type.equals("capture the flag")) return CAPTURE_THE_FLAG; + else if(type.equals("rollup flags")) return ROLLUP_FLAGS; + else return KILL_HERO; + } public ArrayList getItems() { return items; } diff --git a/core/src/network/ApplyCondition.java b/core/src/network/ApplyCondition.java new file mode 100644 index 0000000..5847fa3 --- /dev/null +++ b/core/src/network/ApplyCondition.java @@ -0,0 +1,8 @@ +package network; + +public enum ApplyCondition { + WAITING_FOR_FIRST, + WAITING_FOR_SECOND, + ACCEPTED, + NOTHING +} diff --git a/core/src/network/Client.java b/core/src/network/Client.java new file mode 100644 index 0000000..76c4edd --- /dev/null +++ b/core/src/network/Client.java @@ -0,0 +1,157 @@ +package network; + +import com.badlogic.gdx.math.Vector2; +import model.other.Account; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.Socket; +import java.net.UnknownHostException; +import java.util.ArrayList; + +public class Client +{ + // initialize socket and input output streams + private static Socket socket = null; + private static DataInputStream input = null; + private static DataOutputStream out = null; + + private static Vector2 mousePos = new Vector2(); + private static MouseState mouseState = MouseState.NOTHING; + private static Account account = null; + private static ArrayList onlineAccounts = new ArrayList<>(); + // constructor to put ip address and port + public Client(String address, int port) + { + // establish a connection + try + { + socket = new Socket(address, port); + System.out.println("Connected"); + + // takes input from terminal + input = new DataInputStream(socket.getInputStream()); + // sends output to the socket + out = new DataOutputStream(socket.getOutputStream()); + } + catch(UnknownHostException u) + { + System.out.println(u); + } + catch(IOException i) + { + System.out.println(i); + } + + // close the connection + + } + public static void setMousePos() { + + } + + public static MouseState getMouseState() { + return mouseState; + } + + public static Vector2 getMousePos() { + return mousePos; + } + + public void closeClient() { + try { + input.close(); + out.close(); + socket.close(); + } + catch(IOException i) { + System.out.println(i); + } + } + public static String logIn(String account, String password) { + try { + out.writeUTF("login"); + out.writeUTF(account); + out.writeUTF(password); + String line = input.readUTF(); + return line; + } catch (IOException e) { + e.printStackTrace(); + return "cant connect"; + } + } + public static void setOnlineAccounts() { + try { + out.writeUTF("get online accounts"); + } catch (IOException e) { + e.printStackTrace(); + } + int numberOfOnlineAccounts = 0; + try { + numberOfOnlineAccounts = Integer.parseInt(input.readUTF()); + } catch (IOException e) { + e.printStackTrace(); + } + for(int i = 0 ; i < numberOfOnlineAccounts ; i++) { + try { + onlineAccounts.add(input.readUTF()); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public static Account getAccount(String userName) { + try { + out.writeUTF("get account"); + } catch (IOException e) { + e.printStackTrace(); + } + //////// + return Account.findAccount(userName); + } + public static void applyPlayMultiPlayerGame(String username, String gameType, int numberOfFlags) { + try { + out.writeUTF("apply play multiplayer game"); + out.writeUTF(username); + out.writeUTF(gameType); + out.writeUTF(Integer.toString(numberOfFlags)); + } catch (IOException e) { + e.printStackTrace(); + } + } + public static String getApplyCondition(String username){ + try { + out.writeUTF("get applying condition"); + out.writeUTF(username); + } catch (IOException e) { + e.printStackTrace(); + } + try { + return input.readUTF(); + } catch (IOException e) { + e.printStackTrace(); + } + return "nothing"; + } + public static void cancelApplying(String username) { + try { + out.writeUTF("cancel applying"); + out.writeUTF(username); + } catch (IOException e) { + e.printStackTrace(); + } + } + public static void acceptApplying(String username) { + try { + out.writeUTF("accept applying"); + out.writeUTF(username); + } catch (IOException e) { + e.printStackTrace(); + } + } + public static ArrayList getOnlineAccounts() { + return onlineAccounts; + } +} diff --git a/core/src/network/ContentsBetweenTwoPlayers.java b/core/src/network/ContentsBetweenTwoPlayers.java new file mode 100644 index 0000000..73a525e --- /dev/null +++ b/core/src/network/ContentsBetweenTwoPlayers.java @@ -0,0 +1,54 @@ +package network; + +import model.game.GameType; + +import static network.ApplyCondition.*; + +public class ContentsBetweenTwoPlayers { + private String firstAccount; + private String secondAccount; + private ApplyCondition applyCondition = ApplyCondition.NOTHING; + private GameType gameType = GameType.KILL_HERO; + private int numberOfFlags = 0; + + public ContentsBetweenTwoPlayers(String firstAccount, String secondAccount) { + this.firstAccount = firstAccount; + this.secondAccount = secondAccount; + } + public String getAnotherAccount(String username) { + if(firstAccount.equals(username)) return secondAccount; + return firstAccount; + } + + public ApplyCondition getApplyCondition() { + return applyCondition; + } + + public void applyCondition(String username,GameType gameType, int numberOfFlags) { + if(username.equals(firstAccount)) { + applyCondition = ApplyCondition.WAITING_FOR_SECOND; + } + else { + applyCondition = ApplyCondition.WAITING_FOR_FIRST; + } + this.gameType = gameType; + this.numberOfFlags = numberOfFlags; + } + public void acceptCondition() { + applyCondition = ACCEPTED; + } + public void cancelApplying() { + applyCondition = ApplyCondition.NOTHING; + } + public boolean check(String firstAccount, String secondAccount) { + return (this.firstAccount.equals(firstAccount) && this.secondAccount.equals(secondAccount)) || + (this.secondAccount.equals(firstAccount) && this.firstAccount.equals(secondAccount)); + } + public String getApplyingCondition(String username) { + if(applyCondition == NOTHING) return "nothing"; + else if(applyCondition == ACCEPTED) return "accepted"; + if( (applyCondition == WAITING_FOR_FIRST && secondAccount.equals(username)) || + (applyCondition == WAITING_FOR_SECOND && firstAccount.equals(username)) ) return "wait for another"; + return "wait for me"; + } +} diff --git a/core/src/network/MouseState.java b/core/src/network/MouseState.java new file mode 100644 index 0000000..112de06 --- /dev/null +++ b/core/src/network/MouseState.java @@ -0,0 +1,7 @@ +package network; + +public enum MouseState { + TOUCH_DOWN, + TOUCH_UP, + NOTHING +} diff --git a/core/src/network/Server.java b/core/src/network/Server.java new file mode 100644 index 0000000..1792e44 --- /dev/null +++ b/core/src/network/Server.java @@ -0,0 +1,233 @@ +package network; + +import model.game.Game; +import model.game.GameType; +import model.other.Account; + +import java.io.BufferedInputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.SocketException; +import java.util.ArrayList; +import java.util.HashMap; + +public class Server { + static final int PORT = 5000; + static HashMap clients = new HashMap<>(); + static ArrayList contentsBetweenClients = new ArrayList<>(); + public static void main(String args[]) { + ServerSocket serverSocket = null; + Socket socket = null; + try { + serverSocket = new ServerSocket(PORT); + } catch (IOException e) { + e.printStackTrace(); + + } + while (true) { + try { + socket = serverSocket.accept(); + } catch (IOException e) { + System.out.println("I/O error: " + e); + } + // new thread for a client + + new EchoThread(socket).start(); + } + } + public static ContentsBetweenTwoPlayers findOrCreateContent(String firstUsername, String secondUsername){ + if(clients.get(firstUsername) == null || clients.get(secondUsername) == null) return null; + for(ContentsBetweenTwoPlayers content : contentsBetweenClients) { + if(content.check(firstUsername, secondUsername)){ + return content; + } + } + ContentsBetweenTwoPlayers content = new ContentsBetweenTwoPlayers(firstUsername, secondUsername); + contentsBetweenClients.add(content); + return content; + } +} + +class EchoThread extends Thread { + protected Socket socket; + private Game game = null; + private Account account = null; + public EchoThread(Socket clientSocket) { + this.socket = clientSocket; + } + private DataInputStream input = null; + private DataOutputStream out = null; + + public void run() { + try { + input = new DataInputStream( + new BufferedInputStream(socket.getInputStream())); + + out = new DataOutputStream(socket.getOutputStream()); + + } catch (IOException e) { + e.printStackTrace(); + } + String line = ""; + + + while (true) { + try { + line = input.readUTF(); + } catch (SocketException e) { + e.printStackTrace(); + Server.clients.remove(account); + return; + } catch (IOException e) { + e.printStackTrace(); + Server.clients.remove(account); + return; + } + switch (line) { + case "play game orders": + handlePlayGame(); + break; + case "login": + handleLogin(); + break; + case "get online accounts": + handleGetOnlineAccounts(); + break; + case "get account" : + handleGetAccount(); + break; + case "apply play multiplayer game": + handleApplyPlayMultiplayerGame(); + break; + case "accept applying": + handleAcceptApplying(); + break; + case "cancel applying" : + handleCancelApply(); + break; + case "get applying condition" : + handleGetApplyingCondition(); + break; + case "another order": + break; + } + } + } + public void handlePlayGame() { + String line = null; + try { + line = input.readUTF(); + } catch (IOException e) { + e.printStackTrace(); + } + switch (line) { + case "get mousePos": + game.getAnotherAccount(account); + break; + case "set mousePos": + break; + } + } + public void handleGetOnlineAccounts() { + try { + out.writeUTF(Integer.toString(Server.clients.keySet().size())); + } catch (IOException e) { + e.printStackTrace(); + } + for(String username : Server.clients.keySet()) { + try { + out.writeUTF(username); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + public void handleLogin(){ + String password = ""; + String outCommand = ""; + try { + String AccountName = input.readUTF(); + account = Account.findAccount(AccountName); + password = input.readUTF(); + } catch (IOException e) { + e.printStackTrace(); + } + if(account == null) { + outCommand = "account is null"; + } + else if(!account.getPassword().equals(password)){ + outCommand = "wrong password"; + } + else { + outCommand = "correct login"; + Server.clients.put(account.getUsername(), this); + } + try { + out.writeUTF(outCommand); + } catch (IOException e) { + System.out.println("cant send login answer"); + } + } + public void handleGetAccount(){ + try { + String userName = input.readUTF(); + } catch (IOException e) { + e.printStackTrace(); + } + //// + } + public void handleApplyPlayMultiplayerGame() { + String username = ""; + GameType type = GameType.KILL_HERO; + int numberOfFlags = 0; + try { + username = input.readUTF(); + type = Game.getGameTypeByString(input.readUTF()); + numberOfFlags = Integer.parseInt(input.readUTF()); + } catch (IOException e) { + e.printStackTrace(); + } + ContentsBetweenTwoPlayers content = Server.findOrCreateContent(account.getUsername(), username); + if(content != null) + content.applyCondition(account.getUsername(), type, numberOfFlags); + } + + + public void handleAcceptApplying() { + String username = ""; + try { + username = input.readUTF(); + } catch (IOException e) { + e.printStackTrace(); + } + ContentsBetweenTwoPlayers content = Server.findOrCreateContent(account.getUsername(), username); + content.acceptCondition();; + } + public void handleCancelApply() { + String username = ""; + try { + username = input.readUTF(); + } catch (IOException e) { + e.printStackTrace(); + } + ContentsBetweenTwoPlayers content = Server.findOrCreateContent(account.getUsername(), username); + content.cancelApplying();; + } + public void handleGetApplyingCondition() { + String username = ""; + try { + username = input.readUTF(); + } catch (IOException e) { + e.printStackTrace(); + } + ContentsBetweenTwoPlayers content = Server.findOrCreateContent(account.getUsername(), username); + try { + out.writeUTF(content.getApplyingCondition(account.getUsername())); + } catch (IOException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/desktop/src/graphic/main/desktop/DesktopLauncher.java b/desktop/src/graphic/main/desktop/DesktopLauncher.java index 73d7c1e..f38063e 100644 --- a/desktop/src/graphic/main/desktop/DesktopLauncher.java +++ b/desktop/src/graphic/main/desktop/DesktopLauncher.java @@ -4,9 +4,21 @@ import com.badlogic.gdx.backends.lwjgl.LwjglApplication; import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration; import graphic.main.Main; +import model.cards.Card; +import model.other.Account; +import network.Client; +import network.Server; + +import java.io.IOException; +import java.net.Socket; public class DesktopLauncher { + public static Client client = null; public static void main (String[] arg) { + setup(arg); + } + + public static void mainClient(String[] arg) { LwjglApplicationConfiguration config = new LwjglApplicationConfiguration(); config.x = 0; config.y = 0; @@ -19,4 +31,27 @@ public static void main (String[] arg) { config.addIcon("icon.png", Files.FileType.Internal); new LwjglApplication(new Main(), config); } + + public static void setup(String[] args) { + if(!isServerCreated()) { + Server server = new Server(); + Card.scanAllCards(); + Account.readAccountDetails(); + server.main(args); + } + else { + client = new Client("127.0.0.1", 5000); + mainClient(args); + } + } + public static boolean isServerCreated() { + try (Socket s = new Socket("127.0.0.1", 5000)) { + return true; + } catch (IOException ex) { + /* ignore */ + } + return false; + } + + }