diff --git a/dist/app/Classes/Character/CharacterItemConfig.php b/dist/app/Classes/Character/CharacterItemConfig.php index 05105e3..7d28431 100644 --- a/dist/app/Classes/Character/CharacterItemConfig.php +++ b/dist/app/Classes/Character/CharacterItemConfig.php @@ -2,8 +2,18 @@ namespace App\Classes\Character; +use Illuminate\Support\Arr; + abstract class CharacterItemConfig { + const RUNNER_EQUIPPED_PERK_COUNT = 2; + + const RUNNER_EQUIPPED_WEAPON_COUNT = 1; + + const HUNTER_EQUIPPED_PERK_COUNT = 2; + + const HUNTER_EQUIPPED_WEAPON_COUNT = 2; + protected static array $defaultEquippedPerks; protected static array $defaultEquippedWeapons; @@ -12,14 +22,16 @@ abstract class CharacterItemConfig protected static array $defaultEquippedBonuses; + protected static array $defaultEquippedPowers = []; + /** * additional perks for Runners and Equipped Powers for Hunters * * @var array */ - protected static array $defaultAdditionalPerks; + protected static array $additionalPerks; - protected static array $defaultAdditionalWeapons; + protected static array $additionalWeapons; public static function getDefaultEquippedPerks(): array { return static::$defaultEquippedPerks; @@ -37,16 +49,16 @@ public static function getDefaultEquippedBonuses(): array { return static::$defaultEquippedBonuses; } - public static function getDefaultAdditionalPerks(): array { - return static::$defaultAdditionalPerks; - } - - public static function getDefaultEqippedPowers() + public static function getDefaultPowers() { - return static::$defaultAdditionalPerks; + return static::$defaultEquippedPowers; } - public static function getDefaultAdditionalWeapons(): array { - return static::$defaultAdditionalWeapons; + public static function getAllowedPerks(): array { + return [...static::$additionalPerks, ...static::$defaultEquippedPerks]; + } + + public static function getAllowedWeapons(): array { + return [...static::$additionalWeapons, ...static::$defaultEquippedWeapons]; } } \ No newline at end of file diff --git a/dist/app/Classes/Character/HunterItemConfig/InquisitorItemConfig.php b/dist/app/Classes/Character/HunterItemConfig/InquisitorItemConfig.php index 072b188..4a42cae 100644 --- a/dist/app/Classes/Character/HunterItemConfig/InquisitorItemConfig.php +++ b/dist/app/Classes/Character/HunterItemConfig/InquisitorItemConfig.php @@ -30,13 +30,20 @@ class InquisitorItemConfig extends CharacterItemConfig 'EDB6D6B742023AE61AD8718CAC073C0E', ]; - protected static array $defaultAdditionalPerks = [ + protected static array $defaultEquippedPowers = [ '7902D836470BBB49DE9B9D97F17C9DB5', '08DC38B6470A7A5B0BA025B96279DAA8', '5159591743CBF0B57EC6FEB3341960D6', ]; - protected static array $defaultAdditionalWeapons = [ + protected static array $additionalPerks = [ + 'C215B81F4E42196103ECE98949892499', + '0C6D2A4648B95C2264312783F977F211', + '4886DDC446B96FEE1255D6A2AB114B0D', + '9281A7AB4EE28B4FB6341886DFD50391', + ]; + + protected static array $additionalWeapons = [ 'B83A141A45FB8D96D48A5185CD607AA3', ]; } \ No newline at end of file diff --git a/dist/app/Classes/Character/HunterItemConfig/PoacherItemConfig.php b/dist/app/Classes/Character/HunterItemConfig/PoacherItemConfig.php index 495b107..00a143f 100644 --- a/dist/app/Classes/Character/HunterItemConfig/PoacherItemConfig.php +++ b/dist/app/Classes/Character/HunterItemConfig/PoacherItemConfig.php @@ -30,13 +30,20 @@ class PoacherItemConfig extends CharacterItemConfig '6BE28177483A89CF00B2FD839726ACE1', ]; - protected static array $defaultAdditionalPerks = [ + protected static array $defaultEquippedPowers = [ 'D14477DA4ED69E001DC36ABCEA0B42BC', '08DC38B6470A7A5B0BA025B96279DAA8', '5159591743CBF0B57EC6FEB3341960D6', ]; - protected static array $defaultAdditionalWeapons = [ + protected static array $additionalPerks = [ + '3D3C4F024308BA7C67306783902EECAB', + '47FCA62C449C01963D2293A422A41CF3', + '7899428947342326CE6B3B83021529E8', + 'BFC78D3E4DEFDB5C6369A7B0EF5260C9', + ]; + + protected static array $additionalWeapons = [ 'F7B0756043C628036D038BBED754E89A', ]; } \ No newline at end of file diff --git a/dist/app/Classes/Character/HunterItemConfig/StalkerItemConfig.php b/dist/app/Classes/Character/HunterItemConfig/StalkerItemConfig.php index 01da190..9d5384f 100644 --- a/dist/app/Classes/Character/HunterItemConfig/StalkerItemConfig.php +++ b/dist/app/Classes/Character/HunterItemConfig/StalkerItemConfig.php @@ -30,13 +30,20 @@ class StalkerItemConfig extends CharacterItemConfig '8A5BF2274640C2F23EF3C996A6F6404D', ]; - protected static array $defaultAdditionalPerks = [ + protected static array $defaultEquippedPowers = [ '10A8C667458016646E2EFA9452E3141A', '08DC38B6470A7A5B0BA025B96279DAA8', '5159591743CBF0B57EC6FEB3341960D6', ]; - protected static array $defaultAdditionalWeapons = [ + protected static array $additionalPerks = [ + '08E1B04246C86826FA5FBE9B8030EB01', + '0FA5CBDA402FB9FCC8B56CAE69202061', + 'B7287C204907B7DDFC7D0EA0B8252E60', + '7037D4804CB9931A4DDF23A35E321775', + ]; + + protected static array $additionalWeapons = [ '1B51D59C47F565A20E743BA187B83642', ]; } \ No newline at end of file diff --git a/dist/app/Classes/Character/HunterItemConfig/VeteranItemConfig.php b/dist/app/Classes/Character/HunterItemConfig/VeteranItemConfig.php index edc3203..723e240 100644 --- a/dist/app/Classes/Character/HunterItemConfig/VeteranItemConfig.php +++ b/dist/app/Classes/Character/HunterItemConfig/VeteranItemConfig.php @@ -30,13 +30,20 @@ class VeteranItemConfig extends CharacterItemConfig '3D377249421D35F0F750578919A7E210', ]; - protected static array $defaultAdditionalPerks = [ + protected static array $defaultEquippedPowers = [ '7A541DCB4F04DAB2E10FAB84395BB967', '08DC38B6470A7A5B0BA025B96279DAA8', '0703E3634B0E4409623E2D8C06B14C79', ]; - protected static array $defaultAdditionalWeapons = [ + protected static array $additionalPerks = [ + '00CE22624386379A86512A9500B41ABC', + 'DE624DB646B9EEAA7CBDFF9A62D96293', + '2046082F4049FFABD5A933A4559B3AE0', + '97D7970A47CDE0451384D098E7E4A681', + ]; + + protected static array $additionalWeapons = [ '48072EAA49C83C6F387236955B3C7B6E', ]; } \ No newline at end of file diff --git a/dist/app/Classes/Character/RunnerItemConfig/DashItemConfig.php b/dist/app/Classes/Character/RunnerItemConfig/DashItemConfig.php index a4be5be..ba4dc11 100644 --- a/dist/app/Classes/Character/RunnerItemConfig/DashItemConfig.php +++ b/dist/app/Classes/Character/RunnerItemConfig/DashItemConfig.php @@ -27,14 +27,18 @@ class DashItemConfig extends CharacterItemConfig 'E13EA0CF46EE94F27F75BFAAD48D29D1', ]; - protected static array $defaultAdditionalPerks = [ + protected static array $additionalPerks = [ '105AE7CE41DBBBE92EEBFBB32FDFEC20', '60542B19472C7AACEABFAA83D8112ACA', 'FD1F569B450C253D3EC750A68A9A177A', '25BF0927456349471A1C77A852342246', ]; - protected static array $defaultAdditionalWeapons = [ + protected static array $additionalWeapons = [ 'F42C5B4148F22D29DA976BA8667964F4', ]; + + protected static array $defaultEquippedPowers = [ + 'C8AF3D534973F82FADBB40BDA96F9DCD' + ]; } \ No newline at end of file diff --git a/dist/app/Classes/Character/RunnerItemConfig/FogItemConfig.php b/dist/app/Classes/Character/RunnerItemConfig/FogItemConfig.php index 00a5fa1..67cec64 100644 --- a/dist/app/Classes/Character/RunnerItemConfig/FogItemConfig.php +++ b/dist/app/Classes/Character/RunnerItemConfig/FogItemConfig.php @@ -27,14 +27,18 @@ class FogItemConfig extends CharacterItemConfig '1F5CD9004224C56746D81991AA40448A', ]; - protected static array $defaultAdditionalPerks = [ + protected static array $additionalPerks = [ '38E5F7F241E2BA1177419BB312FC1ACE', '1A09DB19434DA733AAD3D9B5B1929CD4', '19FB62054E644ECDC831E29FC5B9E501', '320652184E1A719DEF1D3C9395EE7344', ]; - protected static array $defaultAdditionalWeapons = [ + protected static array $additionalWeapons = [ '69055D534DF27180C4B36CAB4B651054', ]; + + protected static array $defaultEquippedPowers = [ + 'C8AF3D534973F82FADBB40BDA96F9DCD' + ]; } \ No newline at end of file diff --git a/dist/app/Classes/Character/RunnerItemConfig/GhostItemConfig.php b/dist/app/Classes/Character/RunnerItemConfig/GhostItemConfig.php index bf5fd8d..b2a66b1 100644 --- a/dist/app/Classes/Character/RunnerItemConfig/GhostItemConfig.php +++ b/dist/app/Classes/Character/RunnerItemConfig/GhostItemConfig.php @@ -27,14 +27,18 @@ class GhostItemConfig extends CharacterItemConfig '8EFCD5CC464EBFE1B7B03A984563710A', ]; - protected static array $defaultAdditionalPerks = [ + protected static array $additionalPerks = [ 'F05493F04CF30636487243B5776882D6', 'CAA84E294F02ECF88B08FB96E481194D', 'A858CAF640A824508A028D89AFC44366', '1258297B4BCBFB39628E22A58C77EA87', ]; - protected static array $defaultAdditionalWeapons = [ + protected static array $additionalWeapons = [ 'C9C6D40A4D6A6A5748D5C0A17763C9C1', ]; + + protected static array $defaultEquippedPowers = [ + 'C8AF3D534973F82FADBB40BDA96F9DCD' + ]; } \ No newline at end of file diff --git a/dist/app/Classes/Character/RunnerItemConfig/InkedItemConfig.php b/dist/app/Classes/Character/RunnerItemConfig/InkedItemConfig.php index b308b59..6031b05 100644 --- a/dist/app/Classes/Character/RunnerItemConfig/InkedItemConfig.php +++ b/dist/app/Classes/Character/RunnerItemConfig/InkedItemConfig.php @@ -27,14 +27,18 @@ class InkedItemConfig extends CharacterItemConfig '92B767F442A89C87CC3C9CB5D279D6EA', ]; - protected static array $defaultAdditionalPerks = [ + protected static array $additionalPerks = [ '78C4B6734B7C9DD1D2488EBA8EB5A7E4', '75A9B5A34CD7815B6D77248506897122', '6340FA564B0C4E692AD174BB743607F5', '5681640F41DF9BEF0659C3A951BFC01B', ]; - protected static array $defaultAdditionalWeapons = [ + protected static array $additionalWeapons = [ '5D230967452FEEE13F1CA780F580E889', ]; + + protected static array $defaultEquippedPowers = [ + 'C8AF3D534973F82FADBB40BDA96F9DCD' + ]; } \ No newline at end of file diff --git a/dist/app/Classes/Character/RunnerItemConfig/SawbonesItemConfig.php b/dist/app/Classes/Character/RunnerItemConfig/SawbonesItemConfig.php index dcba95a..abe0184 100644 --- a/dist/app/Classes/Character/RunnerItemConfig/SawbonesItemConfig.php +++ b/dist/app/Classes/Character/RunnerItemConfig/SawbonesItemConfig.php @@ -27,14 +27,18 @@ class SawbonesItemConfig extends CharacterItemConfig '54B3EF794FCB0643C4644FA15BEF31D5', ]; - protected static array $defaultAdditionalPerks = [ + protected static array $additionalPerks = [ '9FCAAC9143A827E79DC179B762B1E520', '04FC953E40A601200FA1C181A0D3C913', '274EB0B34AB39E468BFA878F7E87465B', 'D495BCB543F2D005B559C888E4BF2B3B', ]; - protected static array $defaultAdditionalWeapons = [ + protected static array $additionalWeapons = [ '5A2DD3F6433AB83A725513B868D240CF', ]; + + protected static array $defaultEquippedPowers = [ + 'C8AF3D534973F82FADBB40BDA96F9DCD' + ]; } \ No newline at end of file diff --git a/dist/app/Classes/Character/RunnerItemConfig/SwitchItemConfig.php b/dist/app/Classes/Character/RunnerItemConfig/SwitchItemConfig.php index 470f595..35a34a9 100644 --- a/dist/app/Classes/Character/RunnerItemConfig/SwitchItemConfig.php +++ b/dist/app/Classes/Character/RunnerItemConfig/SwitchItemConfig.php @@ -27,14 +27,18 @@ class SwitchItemConfig extends CharacterItemConfig 'F91593E346415A85CFD0ED9CEBFBBDEA', ]; - protected static array $defaultAdditionalPerks = [ + protected static array $additionalPerks = [ '5889E8B1404109B1D4623B9DD2057608', 'E30FA007473CD2472AE5798B679DA419', '2F3693A4473188D2787CC899A70DC563', '9B34059A4199ACBEE46BB4B0472E7CC3', ]; - protected static array $defaultAdditionalWeapons = [ + protected static array $additionalWeapons = [ '51E112D1407DC2F33CD6C98B31E1F1BD', ]; + + protected static array $defaultEquippedPowers = [ + 'C8AF3D534973F82FADBB40BDA96F9DCD' + ]; } \ No newline at end of file diff --git a/dist/app/Enums/Game/Characters.php b/dist/app/Enums/Game/Characters.php index 4e44f29..b9b9afa 100644 --- a/dist/app/Enums/Game/Characters.php +++ b/dist/app/Enums/Game/Characters.php @@ -25,6 +25,11 @@ public function getTag(): string return $runner?->getTag() ?? Hunter::tryFrom($this->value)->getTag(); } + public function getCharacter(): Runner|Hunter + { + return Runner::tryFrom($this->value) ?? Hunter::tryFrom($this->value); + } + public function isHunter(): bool { return Hunter::tryFrom($this->value) !== null; diff --git a/dist/app/Helper/Uuid/UuidHelper.php b/dist/app/Helper/Uuid/UuidHelper.php new file mode 100644 index 0000000..edfea8c --- /dev/null +++ b/dist/app/Helper/Uuid/UuidHelper.php @@ -0,0 +1,33 @@ +getHex()->toString()); + else + $new[] = Uuid::fromString($id)->getHex()->toString(); + } + + return collect($new); + } + + public static function convertFromHexToUuidCollecton(Collection|array $collection): Collection { + $new = []; + + foreach ($collection as $id) { + $new[] = Uuid::fromHexadecimal(new Hexadecimal($id)); + } + + return collect($new); + } +} \ No newline at end of file diff --git a/dist/app/Http/Controllers/Api/Player/PlayerController.php b/dist/app/Http/Controllers/Api/Player/PlayerController.php index 7108d0f..eb5895e 100644 --- a/dist/app/Http/Controllers/Api/Player/PlayerController.php +++ b/dist/app/Http/Controllers/Api/Player/PlayerController.php @@ -37,8 +37,15 @@ public function initOrGetGroups(InitOrGetGroupsRequest $request) else $response->addFactionProgression($group, $user); } + + if (!$request->skipMetadataGroups) { + if($group->getCharacter() !== false) + $response->addCharacterMetadataGroup($group->getCharacter(), $user); + } } + $response->addGeneralMetadata($user); + return json_encode($response); } diff --git a/dist/app/Http/Responses/Api/Player/InitOrGetGroupsResponse.php b/dist/app/Http/Responses/Api/Player/InitOrGetGroupsResponse.php index 0e89128..1465ee0 100644 --- a/dist/app/Http/Responses/Api/Player/InitOrGetGroupsResponse.php +++ b/dist/app/Http/Responses/Api/Player/InitOrGetGroupsResponse.php @@ -2,8 +2,10 @@ namespace App\Http\Responses\Api\Player; +use App\Classes\Character\CharacterItemConfig; use App\Enums\Game\Characters; use App\Enums\Game\ItemGroupType; +use App\Helper\Uuid\UuidHelper; use App\Models\Game\CharacterData; use App\Models\User\PlayerData; use App\Models\User\User; @@ -11,19 +13,76 @@ class InitOrGetGroupsResponse { - public array $ProgressionGroups; + public array $progressionGroups; - public array $MetadataGroups; + public array $metadataGroups; public function __construct(array $progressionGroups = [], array $metadataGroups = []) { - $this->ProgressionGroups = $progressionGroups; - $this->MetadataGroups = $metadataGroups; + $this->progressionGroups = $progressionGroups; + $this->metadataGroups = $metadataGroups; + } + + public function addGeneralMetadata(User $user): void { + $playerData = $user->playerData(); + + $this->metadataGroups[] = new GeneralMetadata( + $playerData->readout_version, + 'HunterMetadata' + ); + + $this->metadataGroups[] = new GeneralMetadata( + $playerData->readout_version, + 'RunnerMetadata' + ); + + $profileMetadata = new GeneralMetadata( + $playerData->readout_version, + 'ProfileMetadata' + ); + + $profileMetadata->data['characterCumulativeExperience'] = $playerData->getCumulativeExperience(); + + $this->metadataGroups[] = $profileMetadata; + + $playerMetadata = new GeneralMetadata( + $playerData->readout_version, + 'PlayerMetadata' + ); + + $playerMetadata->data['lastPlayedFaction'] = $playerData->last_faction->value; + $playerMetadata->data['lastPlayedRunnerId'] = [ + 'tagName' => $playerData->last_runner->getTag() + ]; + $playerMetadata->data['lastPlayedHunterId'] = [ + 'tagName' => $playerData->last_hunter->getTag() + ]; + $playerMetadata->data['shouldPlayWithoutContextualHelp'] = $playerData->has_played_tutorial; + $playerMetadata->data['hasPlayedDeathGarden1'] = $playerData->has_played_dg_1; + + $this->metadataGroups[] = $playerMetadata; } public function addCharacterMetadataGroup(Characters $character, User $user): void { + $newGroup = new MetadataGroup(); + /** @var CharacterItemConfig|string $itemConfigClass */ + $itemConfigClass = $character->getCharacter()->getItemConfigClass(); + $characterData = $user->playerData()->characterDataForCharacter($character); + $characterData->validateEquippedItems(); + + $newGroup->equippedPerks = UuidHelper::convertFromUuidToHexCollection($characterData->equippedPerks()->allRelatedIds())->toArray(); + $newGroup->equippedWeapons = UuidHelper::convertFromUuidToHexCollection($characterData->equippedWeapons()->allRelatedIds())->toArray(); + $newGroup->equipment = UuidHelper::convertFromUuidToHexCollection($characterData->equipment()->allRelatedIds())->toArray(); + $newGroup->equippedBonuses = UuidHelper::convertFromUuidToHexCollection($characterData->equippedBonuses()->allRelatedIds())->toArray(); + $newGroup->equippedPowers = $itemConfigClass::getDefaultPowers(); + $newGroup->prestigeLevel = $characterData->prestige_level; + + $newGroup->version = $characterData->readout_version; + $newGroup->objectId = $character->getgroup(); + + $this->metadataGroups[] = $newGroup; } public function addCharacterProgressionGroup(Characters $character, User $user): void @@ -37,7 +96,7 @@ public function addCharacterProgressionGroup(Characters $character, User $user): $group->level = $characterData->level; $group->currentExperience = $characterData->experience; $group->experienceToReach = CharacterData::getExperienceForLevel($group->level); - $this->ProgressionGroups[] = $group; + $this->progressionGroups[] = $group; } public function addFactionProgression(ItemGroupType $groupType, User $user): void { @@ -60,20 +119,57 @@ public function addFactionProgression(ItemGroupType $groupType, User $user): voi default => 0, }; $group->experienceToReach = PlayerData::getRemainingFactionExperience($group->level); - $this->ProgressionGroups[] = $group; + $this->progressionGroups[] = $group; } } -class MetadataGroup +class MetadataGroup implements JsonSerializable { - public float $Version; + public int $version; - public string $ObjectId; + public ItemGroupType $objectId; - public float $SchemaVersion; + public array $equippedPerks; - public object $Data; + public array $equippedWeapons; + public array $equipment; + + public array $equippedBonuses; + + public array $pickedChallenges = []; + + public array $equippedPowers; + + public int $prestigeLevel; + + public function jsonSerialize(): mixed + { + $array = [ + 'version' => $this->version, + 'objectId' => $this->objectId, + 'schemaVersion' => 1, + 'data' => [ + 'equippedPerks' => $this->equippedPerks, + 'equippedWeapons' => $this->equippedWeapons, + 'equipment' => $this->equipment, + 'equippedBonuses' => $this->equippedBonuses, + 'pickedChallenges' => $this->pickedChallenges, + 'equippedPowers' => $this->equippedPowers, + 'characterId' => ['tagName' => $this->objectId->getCharacter()->getTag()], + 'prestigeLevel' => $this->prestigeLevel, + ], + ]; + + // Unused Consumable items that were never developed in Deathgarden, but still present in request. + // Can be hard-coded because they never change. + if($this->objectId->getCharacter()->isHunter()) + $array['data']['equippedConsumables'] = ['1069E6DF40AB4CAEF2AF03B4FD60BB22']; + else + $array['data']['equippedConsumables'] = ['487DEBE247818A01797AF5B3FD04C2B2']; + + return collect($array); + } } class ProgressionGroup implements JsonSerializable @@ -90,7 +186,7 @@ class ProgressionGroup implements JsonSerializable public function jsonSerialize(): mixed { - $response = collect([ + return collect([ 'version' => $this->version, 'objectId' => $this->objectId, 'schemaVersion' => 1, @@ -103,7 +199,19 @@ public function jsonSerialize(): mixed 'metadata' => [], ] ]); + } +} + +class GeneralMetadata { + public array $data = []; + + public int $schemaVersion = 1; + + public function __construct( + public int $version, + public string $objectId, + ) + { - return $response; } } \ No newline at end of file diff --git a/dist/app/Models/Game/CharacterData.php b/dist/app/Models/Game/CharacterData.php index 0f9ed75..48593b0 100644 --- a/dist/app/Models/Game/CharacterData.php +++ b/dist/app/Models/Game/CharacterData.php @@ -2,9 +2,15 @@ namespace App\Models\Game; +use App\Classes\Character\CharacterItemConfig; use App\Enums\Game\Characters; +use App\Helper\Uuid\UuidHelper; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Support\Arr; +use Illuminate\Support\Collection; +use Ramsey\Uuid\Uuid; /** * @mixin IdeHelperCharacterData @@ -26,6 +32,26 @@ class CharacterData extends Model 'readout_version' => 1, ]; + public function equipment(): BelongsToMany + { + return $this->belongsToMany(CatalogItem::class,'character_data_equipment'); + } + + public function equippedBonuses(): BelongsToMany + { + return $this->belongsToMany(CatalogItem::class,'character_data_equipped_bonuses'); + } + + public function equippedPerks(): BelongsToMany + { + return $this->belongsToMany(CatalogItem::class,'character_data_equipped_perks'); + } + + public function equippedWeapons(): BelongsToMany + { + return $this->belongsToMany(CatalogItem::class,'character_data_equipped_weapons'); + } + public static function getExperienceForLevel(int $level): int { --$level; @@ -33,5 +59,74 @@ public static function getExperienceForLevel(int $level): int return 5403 + (5403 * $level) * (0.002 * $level); } - // This class is later extendable if we know more how to send the equipped items, weapons, perks ect. with the InitOrGetGroups endpoint + public function validateEquippedItems(): void + { + /** @var CharacterItemConfig|string $itemConfigClass */ + $itemConfigClass = $this->character->getCharacter()->getItemConfigClass(); + + $equippedPerks = UuidHelper::convertFromUuidToHexCollection($this->equippedPerks()->allRelatedIds()); + + if($equippedPerks->count() > $this->character->isHunter() ? CharacterItemConfig::HUNTER_EQUIPPED_PERK_COUNT : CharacterItemConfig::RUNNER_EQUIPPED_PERK_COUNT) + $this->resetEquippedPerks($itemConfigClass); + else { + $allowedPerks = $itemConfigClass::getAllowedPerks(); + $hasUnAllowedPerks = count(array_diff($equippedPerks->toArray(), $allowedPerks)) > 0; + + if($hasUnAllowedPerks) + $this->resetEquippedPerks($itemConfigClass); + } + + $equippedWeapons = UuidHelper::convertFromUuidToHexCollection($this->equippedWeapons()->allRelatedIds()); + + if($equippedWeapons->count() > $this->character->isHunter() ? CharacterItemConfig::HUNTER_EQUIPPED_WEAPON_COUNT : CharacterItemConfig::RUNNER_EQUIPPED_WEAPON_COUNT) + $this->resetEquippedWeapons($itemConfigClass); + else { + $allowedWeapons = $itemConfigClass::getAllowedWeapons(); + $hasUnAllowedWeapons = count(array_diff($equippedWeapons->toArray(), $allowedWeapons)) > 0; + + if($hasUnAllowedWeapons) + $this->resetEquippedWeapons($itemConfigClass); + } + + $equippedEquipment = $this->equipment()->allRelatedIds(); + if($equippedEquipment->count() === 0) + $this->resetEquipment($itemConfigClass); + + $equippedBonuses = $this->equippedBonuses()->allRelatedIds(); + if($equippedBonuses->count() === 0) + $this->resetEquippedBonuses($itemConfigClass); + } + + protected function resetEquippedPerks(string|CharacterItemConfig $itemConfigClass): void + { + // Remove all equipped Perks and reset to default config + $this->equippedPerks()->detach(); + $defaultPerkIds = UuidHelper::convertFromHexToUuidCollecton($itemConfigClass::getDefaultEquippedPerks()); + $this->equippedPerks()->attach($defaultPerkIds); + } + + protected function resetEquippedWeapons(string|CharacterItemConfig $itemConfigClass): void + { + // Remove all equipped Weapons and reset to default config + $this->equippedWeapons()->detach(); + $defaultWeaponIds = UuidHelper::convertFromHexToUuidCollecton($itemConfigClass::getDefaultEquippedWeapons()); + $this->equippedWeapons()->attach($defaultWeaponIds); + } + + protected function resetEquipment(string|CharacterItemConfig $itemConfigClass): void + { + // Remove all Equipment and reset to default config + $this->equipment()->detach(); + $defaultEquipmentIds = UuidHelper::convertFromHexToUuidCollecton($itemConfigClass::getDefaultEquipment()); + $this->equipment()->attach($defaultEquipmentIds); + } + + protected function resetEquippedBonuses(string|CharacterItemConfig $itemConfigClass): void + { + // Remove all equipped Weapons and reset to default config + $this->equippedBonuses()->detach(); + $defaultBonusIds = UuidHelper::convertFromHexToUuidCollecton($itemConfigClass::getDefaultEquippedBonuses()); + $this->equippedBonuses()->attach($defaultBonusIds); + } + } diff --git a/dist/app/Models/User/PlayerData.php b/dist/app/Models/User/PlayerData.php index e90574b..b8be9f4 100644 --- a/dist/app/Models/User/PlayerData.php +++ b/dist/app/Models/User/PlayerData.php @@ -25,6 +25,11 @@ class PlayerData extends Model 'last_faction' => Faction::Runner, 'last_hunter' => Hunter::Poacher, 'last_runner' => Runner::Smoke, + 'readout_version' => 1, + 'runner_faction_level' => 1, + 'hunter_faction_level' => 1, + 'runner_faction_experience' => 0, + 'hunter_faction_experience' => 0 ]; protected $casts = [ @@ -53,6 +58,10 @@ public function characterData(): HasMany return $this->hasMany(CharacterData::class); } + public function characterDataForCharacter(Characters $character): CharacterData|Model|null { + return $this->characterData()->firstWhere('character', $character->value); + } + public function lastHunterCharacterData(): CharacterData|Model { $attributeValue = ['character' => $this->last_hunter]; return $this->hasMany(CharacterData::class)->firstOrCreate($attributeValue, $attributeValue); @@ -63,6 +72,18 @@ public function lastRunnerCharacterData(): CharacterData|Model { return $this->hasMany(CharacterData::class)->firstOrCreate($attributeValue, $attributeValue); } + public function getCumulativeExperience(): int + { + $characterData = $this->characterData; + $experience = 0; + + foreach ($characterData as $character) { + $experience += $character->experience; + } + + return $experience; + } + public static function getRemainingFactionExperience(int $level): int { if($level <= 26) diff --git a/dist/database/migrations/2024_02_15_013020_create_character_data_table.php b/dist/database/migrations/2024_02_15_013020_create_character_data_table.php index 32f3c13..3783011 100644 --- a/dist/database/migrations/2024_02_15_013020_create_character_data_table.php +++ b/dist/database/migrations/2024_02_15_013020_create_character_data_table.php @@ -12,12 +12,12 @@ public function up(): void { Schema::create('character_data', function (Blueprint $table) { + $table->id(); $table->foreignId('player_data_id')->constrained('player_data')->onDelete('cascade'); $table->enum('character', array_column([...\App\Enums\Game\Hunter::cases(), ...\App\Enums\Game\Runner::cases()], 'value')); $table->timestamps(); - $table->primary(['player_data_id', 'character']); $table->unique(['player_data_id', 'character']); }); } diff --git a/dist/database/migrations/2024_02_24_005423_create_player_equippment_tables.php b/dist/database/migrations/2024_02_24_005423_create_player_equippment_tables.php new file mode 100644 index 0000000..24b9309 --- /dev/null +++ b/dist/database/migrations/2024_02_24_005423_create_player_equippment_tables.php @@ -0,0 +1,40 @@ +tables as $table) + + Schema::create($table, function (Blueprint $table) { + $table->id(); + $table->foreignId('character_data_id')->constrained('character_data')->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignUuid('catalog_item_id')->constrained(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + foreach ($this->tables as $table) { + Schema::dropIfExists($table); + } + } +};