diff --git a/Api/composer.json b/Api/composer.json index 630642ee3a..2015740af6 100644 --- a/Api/composer.json +++ b/Api/composer.json @@ -235,6 +235,10 @@ "php vendor/bin/codecept run tests/unit/Status", "php vendor/bin/codecept run tests/functional/Status" ], + "test:triumph": [ + "php vendor/bin/codecept run tests/unit/Triumph", + "php vendor/bin/codecept run tests/functional/Triumph" + ], "test:unit": [ "php vendor/bin/codecept run tests/unit" ], diff --git a/Api/config/api_platform/resources/game_config.yaml b/Api/config/api_platform/resources/game_config.yaml index f852628974..54ce204b6f 100644 --- a/Api/config/api_platform/resources/game_config.yaml +++ b/Api/config/api_platform/resources/game_config.yaml @@ -37,7 +37,7 @@ Mush\Game\Entity\GameConfig: collection: true triumphConfig: subresource: - resourceClass: 'Mush\Game\Entity\TriumphConfig' + resourceClass: 'Mush\Triumph\Entity\TriumphConfig' collection: true diseaseCauseConfig: subresource: diff --git a/Api/config/api_platform/resources/triumph_config.yaml b/Api/config/api_platform/resources/triumph_config.yaml index 3dcc5b6b92..e3bd0f043c 100644 --- a/Api/config/api_platform/resources/triumph_config.yaml +++ b/Api/config/api_platform/resources/triumph_config.yaml @@ -1,4 +1,4 @@ -Mush\Game\Entity\TriumphConfig: +Mush\Triumph\Entity\TriumphConfig: shortName: 'TriumphConfig' description: 'eMush Triumph Config' attributes: diff --git a/Api/config/api_platform/serialization/triumph_config.yaml b/Api/config/api_platform/serialization/triumph_config.yaml index 10727e0218..1af20c90e0 100644 --- a/Api/config/api_platform/serialization/triumph_config.yaml +++ b/Api/config/api_platform/serialization/triumph_config.yaml @@ -1,12 +1,22 @@ -Mush\Game\Entity\TriumphConfig: +Mush\Triumph\Entity\TriumphConfig: attributes: id: groups: [ 'triumph_config_read' ] + key: + groups: [ 'triumph_config_read', 'triumph_config_write' ] name: groups: [ 'triumph_config_read', 'triumph_config_write' ] - triumph: + scope: + groups: [ 'triumph_config_read', 'triumph_config_write' ] + targetedEvent: + groups: [ 'triumph_config_read', 'triumph_config_write' ] + targetedEventExpectedTags: + groups: [ 'triumph_config_read', 'triumph_config_write' ] + target: + groups: [ 'triumph_config_read', 'triumph_config_write' ] + quantity: + groups: [ 'triumph_config_read', 'triumph_config_write' ] + visibility: groups: [ 'triumph_config_read', 'triumph_config_write' ] - isAllCrew: + regressiveFactor: groups: [ 'triumph_config_read', 'triumph_config_write' ] - team: - groups: [ 'triumph_config_read', 'triumph_config_write' ] \ No newline at end of file diff --git a/Api/config/api_platform/validation/triumph_config.yaml b/Api/config/api_platform/validation/triumph_config.yaml index 04d24f54fc..ff4f0c5453 100644 --- a/Api/config/api_platform/validation/triumph_config.yaml +++ b/Api/config/api_platform/validation/triumph_config.yaml @@ -1,14 +1,29 @@ -Mush\Game\Entity\TriumphConfig: +Mush\Triumph\Entity\TriumphConfig: properties: + key: + - NotBlank: ~ + - Type: string name: + - NotBlank: ~ + - Type: Mush\Triumph\Enum\TriumphEnum + scope: + - NotBlank: ~ + - Type: Mush\Triumph\Enum\TriumphScope + targetedEvent: - NotBlank: ~ - Type: string - triumph: + targetedEventExpectedTags: + - NotBlank: ~ + - Type: array + target: + - NotBlank: ~ + - Type: string + quantity: - NotBlank: ~ - Type: integer - isAllCrew: + visibility: - NotBlank: ~ - - Type: boolean - team: + - Type: Mush\Triumph\Enum\TriumphVisibility + regressiveFactor: - NotBlank: ~ - - Type: string \ No newline at end of file + - Type: integer diff --git a/Api/config/packages/doctrine.yaml b/Api/config/packages/doctrine.yaml index 03e3a2780d..39b23230f7 100644 --- a/Api/config/packages/doctrine.yaml +++ b/Api/config/packages/doctrine.yaml @@ -124,4 +124,10 @@ doctrine: dir: '%kernel.project_dir%/src/Communications/Entity' prefix: 'Mush\Communications\Entity' alias: Communications + Triumph: + is_bundle: false + type: attribute + dir: '%kernel.project_dir%/src/Triumph/Entity' + prefix: 'Mush\Triumph\Entity' + alias: Triumph diff --git a/Api/config/routes/annotations.yaml b/Api/config/routes/annotations.yaml index 613d0b04ef..dbd4aee939 100644 --- a/Api/config/routes/annotations.yaml +++ b/Api/config/routes/annotations.yaml @@ -26,10 +26,6 @@ communication: resource: ../../src/Chat/Controller/ type: annotation prefix: /api/v1 -#game: -# resource: ../../src/Game/Controller/ -# type: annotation -# prefix: /api/v1 alert: resource: ../../src/Alert/Controller/ type: annotation diff --git a/Api/config/services.yaml b/Api/config/services.yaml index d9b83ebfa5..56d1c3592b 100644 --- a/Api/config/services.yaml +++ b/Api/config/services.yaml @@ -28,6 +28,7 @@ imports: - { resource: ../src/Project/config/services.yaml } - { resource: ../src/Skill/config/services.yaml } - { resource: ../src/Communications/config/services.yaml } + - { resource: ../src/Triumph/config/services.yaml } services: diff --git a/Api/migrations/Version20250501184525.php b/Api/migrations/Version20250501184525.php new file mode 100644 index 0000000000..fc780164bf --- /dev/null +++ b/Api/migrations/Version20250501184525.php @@ -0,0 +1,54 @@ +addSql('DROP INDEX uniq_a53fc4e45e237e06'); + $this->addSql('ALTER TABLE triumph_config ADD scope VARCHAR(255) DEFAULT \'\' NOT NULL'); + $this->addSql('ALTER TABLE triumph_config ADD targeted_event VARCHAR(255) DEFAULT \'\' NOT NULL'); + $this->addSql('ALTER TABLE triumph_config ADD targeted_event_expected_tags TEXT DEFAULT \'a:0:{}\' NOT NULL'); + $this->addSql('ALTER TABLE triumph_config ADD target VARCHAR(255) DEFAULT \'\' NOT NULL'); + $this->addSql('ALTER TABLE triumph_config ADD visibility VARCHAR(255) DEFAULT \'\' NOT NULL'); + $this->addSql('ALTER TABLE triumph_config ADD regressive_factor INT DEFAULT 0 NOT NULL'); + $this->addSql('ALTER TABLE triumph_config DROP is_all_crew'); + $this->addSql('ALTER TABLE triumph_config ALTER name SET DEFAULT \'\''); + $this->addSql('ALTER TABLE triumph_config RENAME COLUMN team TO key'); + $this->addSql('ALTER TABLE triumph_config RENAME COLUMN triumph TO quantity'); + $this->addSql('COMMENT ON COLUMN triumph_config.targeted_event_expected_tags IS \'(DC2Type:array)\''); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE triumph_config ADD is_all_crew BOOLEAN NOT NULL DEFAULT FALSE'); + $this->addSql('ALTER TABLE triumph_config ADD triumph INT DEFAULT 0 NOT NULL'); + $this->addSql('ALTER TABLE triumph_config ADD team VARCHAR(255) DEFAULT \'\' NOT NULL'); + $this->addSql('ALTER TABLE triumph_config DROP key'); + $this->addSql('ALTER TABLE triumph_config DROP scope'); + $this->addSql('ALTER TABLE triumph_config DROP targeted_event'); + $this->addSql('ALTER TABLE triumph_config DROP targeted_event_expected_tags'); + $this->addSql('ALTER TABLE triumph_config DROP target'); + $this->addSql('ALTER TABLE triumph_config DROP quantity'); + $this->addSql('ALTER TABLE triumph_config DROP visibility'); + $this->addSql('ALTER TABLE triumph_config DROP regressive_factor'); + $this->addSql('ALTER TABLE triumph_config ALTER name DROP DEFAULT'); + $this->addSql('CREATE UNIQUE INDEX uniq_a53fc4e45e237e06 ON triumph_config (name)'); + } +} diff --git a/Api/src/Daedalus/Entity/Daedalus.php b/Api/src/Daedalus/Entity/Daedalus.php index aaa87a7f31..a4e92f5000 100644 --- a/Api/src/Daedalus/Entity/Daedalus.php +++ b/Api/src/Daedalus/Entity/Daedalus.php @@ -206,6 +206,16 @@ public function getAlivePlayerByNameOrThrow(string $name): Player return $player; } + public function getHumanPlayers(): PlayerCollection + { + return $this->getPlayers()->getHumanPlayer(); + } + + public function getMushPlayers(): PlayerCollection + { + return $this->getPlayers()->getMushPlayer(); + } + public function getVisibleResearchProjectsForPlayer(Player $player): ProjectCollection { return $this diff --git a/Api/src/Daedalus/Event/DaedalusCycleEvent.php b/Api/src/Daedalus/Event/DaedalusCycleEvent.php index 76d3ba819d..ea04fadfe0 100644 --- a/Api/src/Daedalus/Event/DaedalusCycleEvent.php +++ b/Api/src/Daedalus/Event/DaedalusCycleEvent.php @@ -5,9 +5,16 @@ use Mush\Daedalus\Entity\Daedalus; use Mush\Game\Event\AbstractGameEvent; use Mush\Modifier\Entity\Collection\ModifierCollection; +use Mush\Player\Entity\Collection\PlayerCollection; +use Mush\Triumph\Entity\TriumphConfig; +use Mush\Triumph\Enum\TriumphScope; +use Mush\Triumph\Event\TriumphSourceEventInterface; +use Mush\Triumph\Event\TriumphSourceEventTrait; -class DaedalusCycleEvent extends AbstractGameEvent +class DaedalusCycleEvent extends AbstractGameEvent implements TriumphSourceEventInterface { + use TriumphSourceEventTrait; + public const string DAEDALUS_NEW_CYCLE = 'daedalus.new.cycle'; protected Daedalus $daedalus; @@ -44,4 +51,16 @@ public function getLinkWithSolCycleKillChance(): int { return $this->daedalus->getGameConfig()->getDifficultyConfig()->getLinkWithSolCycleFailureRate(); } + + public function getTargetsForTriumph(TriumphConfig $triumphConfig): PlayerCollection + { + return match ($triumphConfig->getScope()) { + TriumphScope::ALL_ACTIVE_HUMANS => $this->daedalus->getAlivePlayers()->getHumanPlayer()->getActivePlayers(), + TriumphScope::ALL_ALIVE_HUMANS => $this->daedalus->getAlivePlayers()->getHumanPlayer(), + TriumphScope::ALL_ALIVE_MUSHS => $this->daedalus->getAlivePlayers()->getMushPlayer(), + TriumphScope::ALL_MUSHS => $this->daedalus->getMushPlayers(), + TriumphScope::PERSONAL => $this->daedalus->getAlivePlayers()->getAllByName($triumphConfig->getTarget()), + default => throw new \LogicException('Unsupported triumph scope: ' . $triumphConfig->getScope()->value), + }; + } } diff --git a/Api/src/Daedalus/Factory/DaedalusFactory.php b/Api/src/Daedalus/Factory/DaedalusFactory.php index 65e7fa81f8..70db126770 100644 --- a/Api/src/Daedalus/Factory/DaedalusFactory.php +++ b/Api/src/Daedalus/Factory/DaedalusFactory.php @@ -21,11 +21,9 @@ use Mush\Equipment\Enum\EquipmentEnum; use Mush\Equipment\Factory\GameEquipmentFactory; use Mush\Game\ConfigData\DifficultyConfigData; -use Mush\Game\ConfigData\TriumphConfigData; use Mush\Game\Entity\DifficultyConfig; use Mush\Game\Entity\GameConfig; use Mush\Game\Entity\LocalizationConfig; -use Mush\Game\Entity\TriumphConfig; use Mush\Game\Enum\LanguageEnum; use Mush\Hunter\ConfigData\HunterConfigData; use Mush\Hunter\Entity\HunterConfig; @@ -36,6 +34,8 @@ use Mush\Player\Entity\Config\CharacterConfig; use Mush\Skill\ConfigData\SkillConfigData; use Mush\Skill\Entity\SkillConfig; +use Mush\Triumph\ConfigData\TriumphConfigData; +use Mush\Triumph\Entity\TriumphConfig; use Symfony\Component\Uid\Uuid; final class DaedalusFactory @@ -207,8 +207,8 @@ private static function getTriumphConfigs(): ArrayCollection { /** @var ArrayCollection $triumpthConfigs */ $triumpthConfigs = new ArrayCollection(); - foreach (TriumphConfigData::$dataArray as $triumpthConfigData) { - $triumpthConfigs->add(TriumphConfig::fromConfigData($triumpthConfigData)); + foreach (TriumphConfigData::getAll() as $triumpthConfigData) { + $triumpthConfigs->add(TriumphConfig::fromDto($triumpthConfigData)); } return $triumpthConfigs; diff --git a/Api/src/Game/ConfigData/GameConfigData.php b/Api/src/Game/ConfigData/GameConfigData.php index 536b48120a..52162a669f 100644 --- a/Api/src/Game/ConfigData/GameConfigData.php +++ b/Api/src/Game/ConfigData/GameConfigData.php @@ -19,787 +19,748 @@ use Mush\Status\Enum\PlaceStatusEnum; use Mush\Status\Enum\PlayerStatusEnum; use Mush\Status\Enum\SkillPointsEnum; +use Mush\Triumph\ConfigData\TriumphConfigData; +use Mush\Triumph\Dto\TriumphConfigDto; /** @codeCoverageIgnore */ class GameConfigData { - public static array $dataArray = [ - [ - 'daedalusConfig' => 'default', - 'difficultyConfig' => 'default', - 'name' => 'default', - 'characterConfigs' => [ - 'andie', - 'chun', - 'chao', - 'derek', - 'eleesha', - 'finola', - 'frieda', - 'gioele', - 'hua', - 'ian', - 'janice', - 'jin_su', - 'kuan_ti', - 'paola', - 'raluca', - 'roland', - 'stephen', - 'terrence', + public static function getAll(): array + { + return [ + [ + 'daedalusConfig' => 'default', + 'difficultyConfig' => 'default', + 'name' => 'default', + 'characterConfigs' => [ + 'andie', + 'chun', + 'chao', + 'derek', + 'eleesha', + 'finola', + 'frieda', + 'gioele', + 'hua', + 'ian', + 'janice', + 'jin_su', + 'kuan_ti', + 'paola', + 'raluca', + 'roland', + 'stephen', + 'terrence', + ], + 'consumableDiseaseConfigs' => [ + 'creepnut_default', + 'meztine_default', + 'guntiflop_default', + 'ploshmina_default', + 'precati_default', + 'bottine_default', + 'fragilane_default', + 'anemole_default', + 'peniraft_default', + 'kubinus_default', + 'caleboot_default', + 'filandra_default', + 'jumpkin_default', + 'alien_steak_default', + 'supervitamin_bar_default', + 'bacta_default', + 'betapropyl_default', + 'eufurylate_default', + 'newke_default', + 'phuxx_default', + 'pinq_default', + 'pymp_default', + 'rosebud_default', + 'soma_default', + 'spyce_default', + 'twinoid_default', + 'xenox_default', + ], + 'diseaseCauseConfigs' => [ + 'alien_fruit_default', + 'perished_food_default', + 'cat_allergy_default', + 'cycle_default', + 'cycle_low_morale_default', + 'make_sick_default', + 'fake_disease_default', + 'surgery_default', + 'infection_default', + 'sex_default', + 'trauma_default', + 'contact_default', + 'critical_fail_knife_default', + 'critical_success_knife_default', + 'critical_fail_blaster_default', + 'critical_success_blaster_default', + 'exploration_default', + 'alien_fight_default', + DiseaseCauseEnum::RANDOM_INJURY . '_default', + ], + 'diseaseConfigs' => [ + 'food_poisoning_default', + 'vitamin_deficiency_default', + 'tapeworm_default', + 'syphilis_default', + 'space_rabies_default', + 'smallpox_default', + 'slight_nausea_default', + 'skin_inflammation_default', + 'sinus_storm_default', + 'sepsis_default', + 'rubella_default', + 'rejuvenation_default', + 'quincks_oedema_default', + 'mush_allergy_default', + 'migraine_default', + 'junkbumpkinitis_default', + 'gastroenteritis_default', + 'fungic_infection_default', + 'flu_default', + 'extreme_tinnitus_default', + 'cold_default', + 'cat_allergy_default', + 'black_bite_default', + 'acid_reflux_default', + 'broken_finger_default', + 'broken_foot_default', + 'broken_leg_default', + 'broken_ribs_default', + 'bruised_shoulder_default', + 'burns_50_of_body_default', + 'burns_90_of_body_default', + 'burnt_arms_default', + 'burnt_hand_default', + 'burst_nose_default', + 'busted_arm_joint_default', + 'busted_shoulder_default', + 'critical_haemorrhage_default', + 'haemorrhage_default', + 'minor_haemorrhage_default', + 'damaged_ears_default', + 'destroyed_ears_default', + 'dysfunctional_liver_default', + 'head_trauma_default', + 'implanted_bullet_default', + 'inner_ear_damaged_default', + 'mashed_foot_default', + 'mashed_hand_default', + 'missing_finger_default', + 'open_air_brain_default', + 'punctured_lung_default', + 'mashed_arms_default', + 'mashed_legs_default', + 'torn_tongue_default', + 'broken_shoulder_default', + 'agoraphobia_default', + 'ailurophobia_default', + 'chronic_migraine_default', + 'chronic_vertigo_default', + 'coprolalia_default', + 'crabism_default', + 'depression_default', + 'paranoia_default', + 'psychotic_episodes_default', + 'spleen_default', + 'vertigo_default', + 'weapon_phobia_default', + ], + 'equipmentConfigs' => [ + 'quadrimetric_compass_default', + 'rope_default', + 'drill_default', + 'babel_module_default', + 'echolocator_default', + 'thermosensor_default', + 'white_flag_default', + 'apprentron_astrophysicist_default', + 'apprentron_biologist_default', + 'apprentron_botanist_default', + 'apprentron_diplomat_default', + 'apprentron_firefighter_default', + 'apprentron_chef_default', + 'apprentron_it_expert_default', + 'apprentron_logistics_expert_default', + 'apprentron_medic_default', + 'apprentron_pilot_default', + 'apprentron_radio_expert_default', + 'apprentron_robotics_expert_default', + 'apprentron_shooter_default', + 'apprentron_shrink_default', + 'apprentron_sprinter_default', + 'apprentron_technician_default', + 'document_default', + 'mush_research_review_default', + 'commanders_manual_default', + 'post_it_default', + 'bacta_default', + 'betapropyl_default', + 'eufurylate_default', + 'newke_default', + 'phuxx_default', + 'pinq_default', + 'pymp_default', + 'rosebud_default', + 'soma_default', + 'spyce_default', + 'twinoid_default', + 'xenox_default', + 'banana_default', + 'banana_tree_default', + 'creepnut_default', + 'creepist_default', + 'meztine_default', + 'cactax_default', + 'guntiflop_default', + 'bifflon_default', + 'ploshmina_default', + 'pulminagro_default', + 'precati_default', + 'precatus_default', + 'bottine_default', + 'buttalien_default', + 'fragilane_default', + 'platacia_default', + 'anemole_default', + 'tubiliscus_default', + 'peniraft_default', + 'graapshoot_default', + 'kubinus_default', + 'fiboniccus_default', + 'caleboot_default', + 'mycopia_default', + 'filandra_default', + 'asperagunk_default', + 'jumpkin_default', + 'bumpjumpkin_default', + 'standard_ration_default', + 'cooked_ration_default', + 'coffee_default', + 'anabolic_default', + 'alien_steak_default', + 'space_potato_default', + 'proactive_puffed_rice_default', + 'lombrick_bar_default', + 'supervitamin_bar_default', + 'organic_waste_default', + 'hacker_kit_default', + 'block_of_post_it_default', + 'camera_item_default', + 'extinguisher_default', + 'duct_tape_default', + 'mad_kube_default', + 'microwave_default', + 'superfreezer_default', + 'alien_holographic_tv_default', + 'medikit_default', + 'spore_sucker_default', + 'jar_of_alien_oil_default', + 'bandage_default', + 'retro_fungal_serum_default', + 'space_capsule_default', + 'adjustable_wrench_default', + 'plastenite_armor_default', + 'stainproof_apron_default', + 'protective_gloves_default', + 'soap_default', + 'alien_bottle_opener_default', + 'antigrav_scooter_default', + 'sniper_helmet_default', + 'ncc_lenses_default', + 'rolling_boulder_default', + 'oscilloscope_default', + 'spacesuit_default', + 'super_soaper_default', + 'printed_circuit_jelly_default', + 'invertebrate_shell_default', + 'magellan_liquid_map_default', + 'blaster_default', + 'knife_default', + 'lizaro_jungle_default', + 'grenade_default', + 'old_faithful_default', + 'rocket_launcher_default', + 'natamy_rifle_default', + 'bare_hands_default', + 'icarus_default', + 'door_default', + 'communication_center_default', + 'neron_core_default', + 'auxiliary_core_default', + 'astro_terminal_default', + 'research_laboratory_default', + 'pilgred_default', + 'calculator_default', + 'bios_terminal_default', + 'command_terminal_default', + 'planet_scanner_default', + 'quantum_sensors_planet_scanner_default', + 'jukebox_default', + 'emergency_reactor_default', + 'reactor_lateral_default', + 'reactor_lateral_alpha_default', + 'reactor_lateral_bravo_default', + 'antenna_default', + 'radar_trans_void_antenna_default', + 'gravity_simulator_default', + 'thalasso_default', + 'patrol_ship_alpha_longane_default', + 'patrol_ship_alpha_jujube_default', + 'patrol_ship_alpha_tamarin_default', + 'patrol_ship_bravo_socrate_default', + 'patrol_ship_bravo_epicure_default', + 'patrol_ship_bravo_planton_default', + 'patrol_ship_alpha_2_wallis_default', + 'pasiphae_default', + 'camera_equipment_default', + 'combustion_chamber_default', + 'kitchen_default', + 'snc_kitchen_default', + 'narcotic_distiller_default', + 'shower_default', + 'dynarcade_default', + 'bed_default', + 'sofa_default', + 'coffee_machine_default', + 'cryo_module_default', + 'mycoscan_default', + 'turret_command_default', + 'surgery_plot_default', + 'fuel_tank_default', + 'oxygen_tank_default', + 'itrackie_default', + 'tracker_default', + 'walkie_talkie_default', + 'tabulatrix_default', + 'myco_alarm_default', + 'plastic_scraps_default', + 'metal_scraps_default', + 'old_t_shirt_default', + 'thick_tube_default', + 'mush_sample_default', + 'mush_genome_disk_default', + 'starmap_fragment_default', + 'water_stick_default', + 'hydropot_default', + 'oxygen_capsule_default', + 'fuel_capsule_default', + 'echolocator_blueprint_default', + 'white_flag_blueprint_default', + 'babel_module_blueprint_default', + 'thermosensor_blueprint_default', + 'grenade_blueprint_default', + 'old_faithful_blueprint_default', + 'lizaro_jungle_blueprint_default', + 'rocket_launcher_blueprint_default', + 'extinguisher_blueprint_default', + 'oscilloscope_blueprint_default', + 'sniper_helmet_blueprint_default', + 'swedish_sofa_blueprint_default', + ItemEnum::SUPPORT_DRONE . '_default', + EquipmentEnum::HYDROPONIC_INCUBATOR . '_default', + 'jukebox_blueprint_default', + 'support_drone_blueprint_default', + ItemEnum::SCHRODINGER . '_default', + ItemEnum::ANNIVERSARY_GIFT . '_default', + ItemEnum::COFFEE_THERMOS . '_default', + 'apprentron_optimist_default', + 'apprentron_apprentice_default', + 'apprentron_sneak_default', + 'apprentron_politician_default', + 'apprentron_creative_default', + 'apprentron_determined_default', + 'apprentron_ocd_default', + 'apprentron_motivator_default', + 'apprentron_caffeine_junkie_default', + 'apprentron_genius_default', + 'apprentron_opportunist_default', + 'apprentron_rebel_default', + 'apprentron_self_sacrifice_default', + ItemEnum::PAVLOV . '_default', + 'lunchbox_default', + ], + 'statusConfigs' => [ + 'alien_artefact_default', + 'heavy_default', + 'module_access_default', + 'hidden_default', + 'broken_default', + 'unstable_default', + 'hazardous_default', + 'decomposing_default', + 'frozen_default', + 'plant_thirsty_default', + 'plant_dry_default', + 'plant_diseased_default', + 'document_content_default', + 'reinforced_default', + 'antisocial_default', + 'berzerk_default', + 'brainsync_default', + 'burdened_default', + 'demoralized_default', + 'dirty_default', + 'disabled_default', + 'focused_default', + 'full_stomach_default', + 'gagged_default', + 'germaphobe_default', + 'guardian_default', + 'highly_inactive_default', + 'hyperactive_default', + 'immunized_default', + 'inactive_default', + 'lost_default', + 'lying_down_default', + 'multi_teamster_default', + 'outcast_default', + 'pacifist_default', + 'pregnant_default', + 'starving_default', + 'starving_warning_default', + 'stuck_in_the_ship_default', + 'suicidal_default', + 'WATCHED_PUBLIC_BROADCAST_default', + 'attempt_default', + 'electric_charges_antigrav_scooter_default', + 'electric_charges_old_faithful_default', + 'electric_charges_rocket_launcher_default', + 'electric_charges_turret_command_default', + 'electric_charges_microwave_default', + 'electric_charges_coffee_machine_default', + 'electric_charges_narcotic_distiller_default', + 'electric_charges_blaster_default', + 'sink_charge_default', + 'fire_default', + 'plant_young_default', + 'eureka_moment_default', + 'first_time_default', + 'mush_default', + 'contaminated_default', + 'drug_eaten_default', + 'did_the_thing_default', + 'did_boring_speech_default', + 'updating_default', + 'already_washed_in_the_sink_default', + 'talkie_screwed_default', + HunterStatusEnum::ASTEROID_TRUCE_CYCLES . '_default', + HunterStatusEnum::TRUCE_CYCLES . '_default', + PlayerStatusEnum::HAS_REJUVENATED . '_default', + EquipmentStatusEnum::PATROL_SHIP_ARMOR . '_default', + EquipmentStatusEnum::PATROL_SHIP_ARMOR . '_pasiphae_default', + 'electric_charges_patrol_ship_default', + 'traveling_default', + 'no_gravity_default', + 'no_gravity_repaired_default', + 'in_orbit_default', + 'exploration_oxygen_default', + 'exploration_fuel_default', + 'following_hunters_default', + 'astronavigation_neron_cpu_priority_default', + 'changed_cpu_priority_default', + 'electric_charges_support_drone_default', + DaedalusStatusEnum::AUTO_WATERING_KILLED_FIRES . '_default', + PlaceStatusEnum::MUSH_TRAPPED->value . '_default', + EquipmentStatusEnum::JUKEBOX_SONG . '_default', + SkillPointsEnum::CONCEPTOR_POINTS->value, + SkillPointsEnum::SHOOTER_POINTS->value, + SkillPointsEnum::TECHNICIAN_POINTS->value, + SkillPointsEnum::IT_EXPERT_POINTS->value, + PlayerStatusEnum::HAS_CHITCHATTED . '_default', + SkillPointsEnum::BOTANIST_POINTS->value, + SkillPointsEnum::PILGRED_POINTS->value, + SkillPointsEnum::NURSE_POINTS->value, + PlayerStatusEnum::HAS_LEARNED_SKILL . '_default', + PlayerStatusEnum::GENIUS_IDEA . '_default', + PlayerStatusEnum::HAS_USED_GENIUS . '_default', + SkillPointsEnum::SPORE_POINTS->value, + PlaceStatusEnum::CEASEFIRE->value . '_default', + PlayerStatusEnum::HAS_CEASEFIRED . '_default', + PlayerStatusEnum::PREVIOUS_ROOM . '_default', + PlayerStatusEnum::HAS_EXCHANGED_BODY . '_default', + PlayerStatusEnum::HAS_ISSUED_MISSION . '_default', + DaedalusStatusEnum::ZE_LIST_HAS_BEEN_PRINTED . '_default', + SkillPointsEnum::CHEF_POINTS->value, + PlaceStatusEnum::DELOGGED->value . '_default', + PlayerStatusEnum::HAS_USED_DELOG . '_default', + PlayerStatusEnum::HAS_USED_PUTSCH . '_default', + PlayerStatusEnum::PARIAH . '_default', + PlayerStatusEnum::SLIME_TRAP . '_default', + EquipmentStatusEnum::SLIMED . '_default', + PlayerStatusEnum::HAS_USED_MASS_GGEDON . '_default', + PlayerStatusEnum::HAS_READ_MAGE_BOOK . '_default', + PlayerStatusEnum::HAS_USED_OPPORTUNIST_AS_COMMANDER . '_default', + PlayerStatusEnum::HAS_USED_OPPORTUNIST_AS_NERON_MANAGER . '_default', + PlayerStatusEnum::HAS_USED_OPPORTUNIST_AS_COM_MANAGER . '_default', + EquipmentStatusEnum::TURBO_DRONE_UPGRADE . '_default', + EquipmentStatusEnum::FIREFIGHTER_DRONE_UPGRADE . '_default', + EquipmentStatusEnum::DRONE_REPAIR_FAILED_ATTEMPTS . '_default', + EquipmentStatusEnum::DRONE_EXTINGUISH_FAILED_ATTEMPTS . '_default', + EquipmentStatusEnum::PILOT_DRONE_UPGRADE . '_default', + EquipmentStatusEnum::SENSOR_DRONE_UPGRADE . '_default', + EquipmentStatusEnum::DRONE_SHOOT_HUNTER_FAILED_ATTEMPTS . '_default', + PlayerStatusEnum::CAT_OWNER . '_default', + PlayerStatusEnum::HAS_PETTED_CAT . '_default', + EquipmentStatusEnum::CAT_INFECTED . '_default', + PlayerStatusEnum::ANTIQUE_PERFUME_IMMUNIZED . '_default', + PlayerStatusEnum::HAS_DAUNTED . '_default', + PlayerStatusEnum::HAS_GEN_METAL . '_default', + PlayerStatusEnum::HAS_SABOTAGED_DOOR . '_default', + PlayerStatusEnum::FITFUL_SLEEP . '_default', + DaedalusStatusEnum::NERON_DEPRESSION . '_default', + DaedalusStatusEnum::EDEN_COMPUTED . '_default', + 'electric_charges_coffee_thermos_default', + PlayerStatusEnum::CONTACTED_SOL_TODAY . '_default', + DaedalusStatusEnum::LINK_WITH_SOL_ESTABLISHED_ONCE . '_default', + DaedalusStatusEnum::REBEL_BASE_CONTACT_DURATION . '_default', + DaedalusStatusEnum::GHOST_SAMPLE . '_default', + DaedalusStatusEnum::GHOST_CHUN . '_default', + HunterStatusEnum::AGGROED . '_default', + PlayerStatusEnum::BEGINNER . '_default', + 'electric_charges_lunchbox_default', + PlayerStatusEnum::SELECTED_FOR_STEEL_PLATE . '_default', + PlayerStatusEnum::SELECTED_FOR_ANXIETY_ATTACK . '_default', + PlaceStatusEnum::SELECTED_FOR_JOLT->value . '_default', + PlaceStatusEnum::SELECTED_FOR_ELECTROCUTION->value . '_default', + PlayerStatusEnum::SELECTED_FOR_BOARD_DISEASE . '_default', + ], + 'triumphConfigs' => array_map(static fn (TriumphConfigDto $triumphConfig) => $triumphConfig->name->toConfigKey('default'), TriumphConfigData::getAll()), + 'hunterConfigs' => [ + HunterEnum::ASTEROID . '_default', + HunterEnum::DICE . '_default', + HunterEnum::HUNTER . '_default', + HunterEnum::SPIDER . '_default', + HunterEnum::TRAX . '_default', + HunterEnum::TRANSPORT . '_default', + ], + 'planetSectorConfigs' => [ + PlanetSectorEnum::LANDING . '_default', + PlanetSectorEnum::FOREST . '_default', + PlanetSectorEnum::MOUNTAIN . '_default', + PlanetSectorEnum::SWAMP . '_default', + PlanetSectorEnum::DESERT . '_default', + PlanetSectorEnum::OCEAN . '_default', + PlanetSectorEnum::CAVE . '_default', + PlanetSectorEnum::RUMINANT . '_default', + PlanetSectorEnum::PREDATOR . '_default', + PlanetSectorEnum::INTELLIGENT . '_default', + PlanetSectorEnum::INSECT . '_default', + PlanetSectorEnum::MANKAROG . '_default', + PlanetSectorEnum::HYDROCARBON . '_default', + PlanetSectorEnum::OXYGEN . '_default', + PlanetSectorEnum::COLD . '_default', + PlanetSectorEnum::HOT . '_default', + PlanetSectorEnum::STRONG_WIND . '_default', + PlanetSectorEnum::SEISMIC_ACTIVITY . '_default', + PlanetSectorEnum::VOLCANIC_ACTIVITY . '_default', + PlanetSectorEnum::RUINS . '_default', + PlanetSectorEnum::WRECK . '_default', + PlanetSectorEnum::FRUIT_TREES . '_default', + PlanetSectorEnum::LOST . '_default', + PlanetSectorEnum::CRISTAL_FIELD . '_default', + ], + 'titleConfigs' => [ + TitleEnum::COMMANDER, + TitleEnum::NERON_MANAGER, + TitleEnum::COM_MANAGER, + ], + 'projectConfigs' => [ + ProjectName::AUTO_WATERING, + ProjectName::AUXILIARY_TERMINAL, + ProjectName::BRIC_BROC, + ProjectName::CHIPSET_ACCELERATION, + ProjectName::DISMANTLING, + ProjectName::DOOR_SENSOR, + ProjectName::EQUIPMENT_SENSOR, + ProjectName::EXTRA_HYDROPONPOTS, + ProjectName::FIRE_SENSOR, + ProjectName::HEAT_LAMP, + ProjectName::PILGRED, + ProjectName::PLASMA_SHIELD, + ProjectName::THALASSO, + ProjectName::TRAIL_REDUCER, + ProjectName::MAGNETIC_NET, + ProjectName::ICARUS_ANTIGRAV_PROPELLER, + ProjectName::FISSION_COFFEE_ROASTER, + ProjectName::ARMOUR_CORRIDOR, + ProjectName::CALL_OF_DIRTY, + ProjectName::EXTRA_DRONE, + ProjectName::PATROLSHIP_BLASTER_GUN, + ProjectName::BAY_DOOR_XXL, + ProjectName::TRASH_LOAD, + ProjectName::FOOD_RETAILER, + ProjectName::AUTO_RETURN_ICARUS, + ProjectName::RADAR_TRANS_VOID, + ProjectName::NERON_TARGETING_ASSIST, + ProjectName::WHOS_WHO, + ProjectName::HYDROPONIC_INCUBATOR, + ProjectName::ICARUS_LAVATORY, + ProjectName::ICARUS_LARGER_BAY, + ProjectName::PATROL_SHIP_LAUNCHER, + ProjectName::NERON_PROJECT_THREAD, + ProjectName::TURRET_EXTRA_FIRE_RATE, + ProjectName::QUANTUM_SENSORS, + ProjectName::PATROLSHIP_EXTRA_AMMO, + ProjectName::NOISE_REDUCER, + ProjectName::APERO_KITCHEN, + ProjectName::FLOOR_HEATING, + ProjectName::PARASITE_ELIM, + ProjectName::OXY_MORE, + ProjectName::BEAT_BOX, + ProjectName::ANABOLICS, + ProjectName::ANTISPORE_GAS, + ProjectName::CONSTIPASPORE_SERUM, + ProjectName::CREATE_MYCOSCAN, + ProjectName::GUARANA_CAPPUCCINO, + ProjectName::MERIDON_SCRAMBLER, + ProjectName::MUSH_HUNTER_ZC16H, + ProjectName::MUSH_LANGUAGE, + ProjectName::MUSH_RACES, + ProjectName::MUSH_REPRODUCTIVE_SYSTEM, + ProjectName::MUSHICIDE_SOAP, + ProjectName::MUSHOVORE_BACTERIA, + ProjectName::MYCOALARM, + ProjectName::NARCOTICS_DISTILLER, + ProjectName::NATAMY_RIFLE, + ProjectName::NCC_CONTACT_LENSES, + ProjectName::PATULINE_SCRAMBLER, + ProjectName::PERPETUAL_HYDRATION, + ProjectName::PHEROMODEM, + ProjectName::RETRO_FUNGAL_SERUM, + ProjectName::SPORE_SUCKER, + ProjectName::SUPER_CALCULATOR, + ProjectName::TESLA_SUP2X, + ProjectName::ULTRA_HEALING_POMADE, + ], + 'skillConfigs' => [ + SkillEnum::ANONYMUSH, + SkillEnum::ANTIQUE_PERFUME, + SkillEnum::APPRENTICE, + SkillEnum::ASTROPHYSICIST, + SkillEnum::BACTEROPHILIAC, + SkillEnum::BIOLOGIST, + SkillEnum::BOTANIST, + SkillEnum::BYPASS, + SkillEnum::CAFFEINE_JUNKIE, + SkillEnum::CHEF, + SkillEnum::COLD_BLOODED, + SkillEnum::CONCEPTOR, + SkillEnum::CONFIDENT, + SkillEnum::CRAZY_EYE, + SkillEnum::CREATIVE, + SkillEnum::DEFACER, + SkillEnum::DETACHED_CREWMEMBER, + SkillEnum::DETERMINED, + SkillEnum::DEVOTION, + SkillEnum::DOORMAN, + SkillEnum::DIPLOMAT, + SkillEnum::DISHEARTENING_CONTACT, + SkillEnum::EXPERT, + SkillEnum::FERTILE, + SkillEnum::FIREFIGHTER, + SkillEnum::FRUGIVORE, + SkillEnum::FUNGAL_KITCHEN, + SkillEnum::GENIUS, + SkillEnum::GREEN_JELLY, + SkillEnum::GREEN_THUMB, + SkillEnum::GUNNER, + SkillEnum::HARD_BOILED, + SkillEnum::HYGIENIST, + SkillEnum::INFECTOR, + SkillEnum::INTIMIDATING, + SkillEnum::IT_EXPERT, + SkillEnum::LEADER, + SkillEnum::LETHARGY, + SkillEnum::LOGISTICS_EXPERT, + SkillEnum::MANKIND_ONLY_HOPE, + SkillEnum::MASSIVE_MUSHIFICATION, + SkillEnum::MEDIC, + SkillEnum::METALWORKER, + SkillEnum::MOTIVATOR, + SkillEnum::MYCELIUM_SPIRIT, + SkillEnum::MYCOLOGIST, + SkillEnum::NERON_DEPRESSION, + SkillEnum::NERON_ONLY_FRIEND, + SkillEnum::NIMBLE_FINGERS, + SkillEnum::NIGHTMARISH, + SkillEnum::NINJA, + SkillEnum::NURSE, + SkillEnum::OBSERVANT, + SkillEnum::OCD, + SkillEnum::OPPORTUNIST, + SkillEnum::OPTIMIST, + SkillEnum::PANIC, + SkillEnum::PARANOID, + SkillEnum::PHAGOCYTE, + SkillEnum::PHYSICIST, + SkillEnum::PILOT, + SkillEnum::POLITICIAN, + SkillEnum::POLYMATH, + SkillEnum::POLYVALENT, + SkillEnum::PRESENTIMENT, + SkillEnum::PYROMANIAC, + SkillEnum::RADIO_EXPERT, + SkillEnum::RADIO_PIRACY, + SkillEnum::REBEL, + SkillEnum::ROBOTICS_EXPERT, + SkillEnum::SABOTEUR, + SkillEnum::SELF_SACRIFICE, + SkillEnum::SHOOTER, + SkillEnum::SHRINK, + SkillEnum::SLIMETRAP, + SkillEnum::SNEAK, + SkillEnum::SOLID, + SkillEnum::SPLASHPROOF, + SkillEnum::SPRINTER, + SkillEnum::STRATEGURU, + SkillEnum::SURVIVALIST, + SkillEnum::TECHNICIAN, + SkillEnum::TORTURER, + SkillEnum::TRACKER, + SkillEnum::TRAITOR, + SkillEnum::TRANSFER, + SkillEnum::TRAPPER, + SkillEnum::U_TURN, + SkillEnum::VICTIMIZER, + SkillEnum::WRESTLER, + ], + 'rebelBaseConfigs' => [ + RebelBaseEnum::WOLF, + RebelBaseEnum::SIRIUS, + RebelBaseEnum::CENTAURI, + RebelBaseEnum::KALADAAN, + RebelBaseEnum::LUYTEN_CETI, + RebelBaseEnum::CYGNI, + ], + 'xylophConfigs' => [ + XylophEnum::BLUEPRINTS, + XylophEnum::COOK, + XylophEnum::DISK, + XylophEnum::KIVANC, + XylophEnum::GHOST_CHUN, + XylophEnum::GHOST_SAMPLE, + XylophEnum::LIST, + XylophEnum::MAGE_BOOKS, + XylophEnum::MAGNETITE, + XylophEnum::NOTHING, + XylophEnum::SNOW, + XylophEnum::VERSION, + ], + 'tradeConfigs' => [ + TradeEnum::FOREST_DEAL, + TradeEnum::PILGREDISSIM, + TradeEnum::GOOD_PROJECTIONS, + TradeEnum::TECHNO_REWRITE, + TradeEnum::HUMAN_VS_FUEL, + TradeEnum::HUMAN_VS_OXY, + TradeEnum::HUMAN_VS_TREE, + ], ], - 'consumableDiseaseConfigs' => [ - 'creepnut_default', - 'meztine_default', - 'guntiflop_default', - 'ploshmina_default', - 'precati_default', - 'bottine_default', - 'fragilane_default', - 'anemole_default', - 'peniraft_default', - 'kubinus_default', - 'caleboot_default', - 'filandra_default', - 'jumpkin_default', - 'alien_steak_default', - 'supervitamin_bar_default', - 'bacta_default', - 'betapropyl_default', - 'eufurylate_default', - 'newke_default', - 'phuxx_default', - 'pinq_default', - 'pymp_default', - 'rosebud_default', - 'soma_default', - 'spyce_default', - 'twinoid_default', - 'xenox_default', - ], - 'diseaseCauseConfigs' => [ - 'alien_fruit_default', - 'perished_food_default', - 'cat_allergy_default', - 'cycle_default', - 'cycle_low_morale_default', - 'make_sick_default', - 'fake_disease_default', - 'surgery_default', - 'infection_default', - 'sex_default', - 'trauma_default', - 'contact_default', - 'critical_fail_knife_default', - 'critical_success_knife_default', - 'critical_fail_blaster_default', - 'critical_success_blaster_default', - 'exploration_default', - 'alien_fight_default', - DiseaseCauseEnum::RANDOM_INJURY . '_default', - ], - 'diseaseConfigs' => [ - 'food_poisoning_default', - 'vitamin_deficiency_default', - 'tapeworm_default', - 'syphilis_default', - 'space_rabies_default', - 'smallpox_default', - 'slight_nausea_default', - 'skin_inflammation_default', - 'sinus_storm_default', - 'sepsis_default', - 'rubella_default', - 'rejuvenation_default', - 'quincks_oedema_default', - 'mush_allergy_default', - 'migraine_default', - 'junkbumpkinitis_default', - 'gastroenteritis_default', - 'fungic_infection_default', - 'flu_default', - 'extreme_tinnitus_default', - 'cold_default', - 'cat_allergy_default', - 'black_bite_default', - 'acid_reflux_default', - 'broken_finger_default', - 'broken_foot_default', - 'broken_leg_default', - 'broken_ribs_default', - 'bruised_shoulder_default', - 'burns_50_of_body_default', - 'burns_90_of_body_default', - 'burnt_arms_default', - 'burnt_hand_default', - 'burst_nose_default', - 'busted_arm_joint_default', - 'busted_shoulder_default', - 'critical_haemorrhage_default', - 'haemorrhage_default', - 'minor_haemorrhage_default', - 'damaged_ears_default', - 'destroyed_ears_default', - 'dysfunctional_liver_default', - 'head_trauma_default', - 'implanted_bullet_default', - 'inner_ear_damaged_default', - 'mashed_foot_default', - 'mashed_hand_default', - 'missing_finger_default', - 'open_air_brain_default', - 'punctured_lung_default', - 'mashed_arms_default', - 'mashed_legs_default', - 'torn_tongue_default', - 'broken_shoulder_default', - 'agoraphobia_default', - 'ailurophobia_default', - 'chronic_migraine_default', - 'chronic_vertigo_default', - 'coprolalia_default', - 'crabism_default', - 'depression_default', - 'paranoia_default', - 'psychotic_episodes_default', - 'spleen_default', - 'vertigo_default', - 'weapon_phobia_default', - ], - 'equipmentConfigs' => [ - 'quadrimetric_compass_default', - 'rope_default', - 'drill_default', - 'babel_module_default', - 'echolocator_default', - 'thermosensor_default', - 'white_flag_default', - 'apprentron_astrophysicist_default', - 'apprentron_biologist_default', - 'apprentron_botanist_default', - 'apprentron_diplomat_default', - 'apprentron_firefighter_default', - 'apprentron_chef_default', - 'apprentron_it_expert_default', - 'apprentron_logistics_expert_default', - 'apprentron_medic_default', - 'apprentron_pilot_default', - 'apprentron_radio_expert_default', - 'apprentron_robotics_expert_default', - 'apprentron_shooter_default', - 'apprentron_shrink_default', - 'apprentron_sprinter_default', - 'apprentron_technician_default', - 'document_default', - 'mush_research_review_default', - 'commanders_manual_default', - 'post_it_default', - 'bacta_default', - 'betapropyl_default', - 'eufurylate_default', - 'newke_default', - 'phuxx_default', - 'pinq_default', - 'pymp_default', - 'rosebud_default', - 'soma_default', - 'spyce_default', - 'twinoid_default', - 'xenox_default', - 'banana_default', - 'banana_tree_default', - 'creepnut_default', - 'creepist_default', - 'meztine_default', - 'cactax_default', - 'guntiflop_default', - 'bifflon_default', - 'ploshmina_default', - 'pulminagro_default', - 'precati_default', - 'precatus_default', - 'bottine_default', - 'buttalien_default', - 'fragilane_default', - 'platacia_default', - 'anemole_default', - 'tubiliscus_default', - 'peniraft_default', - 'graapshoot_default', - 'kubinus_default', - 'fiboniccus_default', - 'caleboot_default', - 'mycopia_default', - 'filandra_default', - 'asperagunk_default', - 'jumpkin_default', - 'bumpjumpkin_default', - 'standard_ration_default', - 'cooked_ration_default', - 'coffee_default', - 'anabolic_default', - 'alien_steak_default', - 'space_potato_default', - 'proactive_puffed_rice_default', - 'lombrick_bar_default', - 'supervitamin_bar_default', - 'organic_waste_default', - 'hacker_kit_default', - 'block_of_post_it_default', - 'camera_item_default', - 'extinguisher_default', - 'duct_tape_default', - 'mad_kube_default', - 'microwave_default', - 'superfreezer_default', - 'alien_holographic_tv_default', - 'medikit_default', - 'spore_sucker_default', - 'jar_of_alien_oil_default', - 'bandage_default', - 'retro_fungal_serum_default', - 'space_capsule_default', - 'adjustable_wrench_default', - 'plastenite_armor_default', - 'stainproof_apron_default', - 'protective_gloves_default', - 'soap_default', - 'alien_bottle_opener_default', - 'antigrav_scooter_default', - 'sniper_helmet_default', - 'ncc_lenses_default', - 'rolling_boulder_default', - 'oscilloscope_default', - 'spacesuit_default', - 'super_soaper_default', - 'printed_circuit_jelly_default', - 'invertebrate_shell_default', - 'magellan_liquid_map_default', - 'blaster_default', - 'knife_default', - 'lizaro_jungle_default', - 'grenade_default', - 'old_faithful_default', - 'rocket_launcher_default', - 'natamy_rifle_default', - 'bare_hands_default', - 'icarus_default', - 'door_default', - 'communication_center_default', - 'neron_core_default', - 'auxiliary_core_default', - 'astro_terminal_default', - 'research_laboratory_default', - 'pilgred_default', - 'calculator_default', - 'bios_terminal_default', - 'command_terminal_default', - 'planet_scanner_default', - 'quantum_sensors_planet_scanner_default', - 'jukebox_default', - 'emergency_reactor_default', - 'reactor_lateral_default', - 'reactor_lateral_alpha_default', - 'reactor_lateral_bravo_default', - 'antenna_default', - 'radar_trans_void_antenna_default', - 'gravity_simulator_default', - 'thalasso_default', - 'patrol_ship_alpha_longane_default', - 'patrol_ship_alpha_jujube_default', - 'patrol_ship_alpha_tamarin_default', - 'patrol_ship_bravo_socrate_default', - 'patrol_ship_bravo_epicure_default', - 'patrol_ship_bravo_planton_default', - 'patrol_ship_alpha_2_wallis_default', - 'pasiphae_default', - 'camera_equipment_default', - 'combustion_chamber_default', - 'kitchen_default', - 'snc_kitchen_default', - 'narcotic_distiller_default', - 'shower_default', - 'dynarcade_default', - 'bed_default', - 'sofa_default', - 'coffee_machine_default', - 'cryo_module_default', - 'mycoscan_default', - 'turret_command_default', - 'surgery_plot_default', - 'fuel_tank_default', - 'oxygen_tank_default', - 'itrackie_default', - 'tracker_default', - 'walkie_talkie_default', - 'tabulatrix_default', - 'myco_alarm_default', - 'plastic_scraps_default', - 'metal_scraps_default', - 'old_t_shirt_default', - 'thick_tube_default', - 'mush_sample_default', - 'mush_genome_disk_default', - 'starmap_fragment_default', - 'water_stick_default', - 'hydropot_default', - 'oxygen_capsule_default', - 'fuel_capsule_default', - 'echolocator_blueprint_default', - 'white_flag_blueprint_default', - 'babel_module_blueprint_default', - 'thermosensor_blueprint_default', - 'grenade_blueprint_default', - 'old_faithful_blueprint_default', - 'lizaro_jungle_blueprint_default', - 'rocket_launcher_blueprint_default', - 'extinguisher_blueprint_default', - 'oscilloscope_blueprint_default', - 'sniper_helmet_blueprint_default', - 'swedish_sofa_blueprint_default', - ItemEnum::SUPPORT_DRONE . '_default', - EquipmentEnum::HYDROPONIC_INCUBATOR . '_default', - 'jukebox_blueprint_default', - 'support_drone_blueprint_default', - ItemEnum::SCHRODINGER . '_default', - ItemEnum::ANNIVERSARY_GIFT . '_default', - ItemEnum::COFFEE_THERMOS . '_default', - 'apprentron_optimist_default', - 'apprentron_apprentice_default', - 'apprentron_sneak_default', - 'apprentron_politician_default', - 'apprentron_creative_default', - 'apprentron_determined_default', - 'apprentron_ocd_default', - 'apprentron_motivator_default', - 'apprentron_caffeine_junkie_default', - 'apprentron_genius_default', - 'apprentron_opportunist_default', - 'apprentron_rebel_default', - 'apprentron_self_sacrifice_default', - ItemEnum::PAVLOV . '_default', - 'lunchbox_default', - ], - 'statusConfigs' => [ - 'alien_artefact_default', - 'heavy_default', - 'module_access_default', - 'hidden_default', - 'broken_default', - 'unstable_default', - 'hazardous_default', - 'decomposing_default', - 'frozen_default', - 'plant_thirsty_default', - 'plant_dry_default', - 'plant_diseased_default', - 'document_content_default', - 'reinforced_default', - 'antisocial_default', - 'berzerk_default', - 'brainsync_default', - 'burdened_default', - 'demoralized_default', - 'dirty_default', - 'disabled_default', - 'focused_default', - 'full_stomach_default', - 'gagged_default', - 'germaphobe_default', - 'guardian_default', - 'highly_inactive_default', - 'hyperactive_default', - 'immunized_default', - 'inactive_default', - 'lost_default', - 'lying_down_default', - 'multi_teamster_default', - 'outcast_default', - 'pacifist_default', - 'pregnant_default', - 'starving_default', - 'starving_warning_default', - 'stuck_in_the_ship_default', - 'suicidal_default', - 'WATCHED_PUBLIC_BROADCAST_default', - 'attempt_default', - 'electric_charges_antigrav_scooter_default', - 'electric_charges_old_faithful_default', - 'electric_charges_rocket_launcher_default', - 'electric_charges_turret_command_default', - 'electric_charges_microwave_default', - 'electric_charges_coffee_machine_default', - 'electric_charges_narcotic_distiller_default', - 'electric_charges_blaster_default', - 'sink_charge_default', - 'fire_default', - 'plant_young_default', - 'eureka_moment_default', - 'first_time_default', - 'mush_default', - 'contaminated_default', - 'drug_eaten_default', - 'did_the_thing_default', - 'did_boring_speech_default', - 'updating_default', - 'already_washed_in_the_sink_default', - 'talkie_screwed_default', - HunterStatusEnum::ASTEROID_TRUCE_CYCLES . '_default', - HunterStatusEnum::TRUCE_CYCLES . '_default', - PlayerStatusEnum::HAS_REJUVENATED . '_default', - EquipmentStatusEnum::PATROL_SHIP_ARMOR . '_default', - EquipmentStatusEnum::PATROL_SHIP_ARMOR . '_pasiphae_default', - 'electric_charges_patrol_ship_default', - 'traveling_default', - 'no_gravity_default', - 'no_gravity_repaired_default', - 'in_orbit_default', - 'exploration_oxygen_default', - 'exploration_fuel_default', - 'following_hunters_default', - 'astronavigation_neron_cpu_priority_default', - 'changed_cpu_priority_default', - 'electric_charges_support_drone_default', - DaedalusStatusEnum::AUTO_WATERING_KILLED_FIRES . '_default', - PlaceStatusEnum::MUSH_TRAPPED->value . '_default', - EquipmentStatusEnum::JUKEBOX_SONG . '_default', - SkillPointsEnum::CONCEPTOR_POINTS->value, - SkillPointsEnum::SHOOTER_POINTS->value, - SkillPointsEnum::TECHNICIAN_POINTS->value, - SkillPointsEnum::IT_EXPERT_POINTS->value, - PlayerStatusEnum::HAS_CHITCHATTED . '_default', - SkillPointsEnum::BOTANIST_POINTS->value, - SkillPointsEnum::PILGRED_POINTS->value, - SkillPointsEnum::NURSE_POINTS->value, - PlayerStatusEnum::HAS_LEARNED_SKILL . '_default', - PlayerStatusEnum::GENIUS_IDEA . '_default', - PlayerStatusEnum::HAS_USED_GENIUS . '_default', - SkillPointsEnum::SPORE_POINTS->value, - PlaceStatusEnum::CEASEFIRE->value . '_default', - PlayerStatusEnum::HAS_CEASEFIRED . '_default', - PlayerStatusEnum::PREVIOUS_ROOM . '_default', - PlayerStatusEnum::HAS_EXCHANGED_BODY . '_default', - PlayerStatusEnum::HAS_ISSUED_MISSION . '_default', - DaedalusStatusEnum::ZE_LIST_HAS_BEEN_PRINTED . '_default', - SkillPointsEnum::CHEF_POINTS->value, - PlaceStatusEnum::DELOGGED->value . '_default', - PlayerStatusEnum::HAS_USED_DELOG . '_default', - PlayerStatusEnum::HAS_USED_PUTSCH . '_default', - PlayerStatusEnum::PARIAH . '_default', - PlayerStatusEnum::SLIME_TRAP . '_default', - EquipmentStatusEnum::SLIMED . '_default', - PlayerStatusEnum::HAS_USED_MASS_GGEDON . '_default', - PlayerStatusEnum::HAS_READ_MAGE_BOOK . '_default', - PlayerStatusEnum::HAS_USED_OPPORTUNIST_AS_COMMANDER . '_default', - PlayerStatusEnum::HAS_USED_OPPORTUNIST_AS_NERON_MANAGER . '_default', - PlayerStatusEnum::HAS_USED_OPPORTUNIST_AS_COM_MANAGER . '_default', - EquipmentStatusEnum::TURBO_DRONE_UPGRADE . '_default', - EquipmentStatusEnum::FIREFIGHTER_DRONE_UPGRADE . '_default', - EquipmentStatusEnum::DRONE_REPAIR_FAILED_ATTEMPTS . '_default', - EquipmentStatusEnum::DRONE_EXTINGUISH_FAILED_ATTEMPTS . '_default', - EquipmentStatusEnum::PILOT_DRONE_UPGRADE . '_default', - EquipmentStatusEnum::SENSOR_DRONE_UPGRADE . '_default', - EquipmentStatusEnum::DRONE_SHOOT_HUNTER_FAILED_ATTEMPTS . '_default', - PlayerStatusEnum::CAT_OWNER . '_default', - PlayerStatusEnum::HAS_PETTED_CAT . '_default', - EquipmentStatusEnum::CAT_INFECTED . '_default', - PlayerStatusEnum::ANTIQUE_PERFUME_IMMUNIZED . '_default', - PlayerStatusEnum::HAS_DAUNTED . '_default', - PlayerStatusEnum::HAS_GEN_METAL . '_default', - PlayerStatusEnum::HAS_SABOTAGED_DOOR . '_default', - PlayerStatusEnum::FITFUL_SLEEP . '_default', - DaedalusStatusEnum::NERON_DEPRESSION . '_default', - DaedalusStatusEnum::EDEN_COMPUTED . '_default', - 'electric_charges_coffee_thermos_default', - PlayerStatusEnum::CONTACTED_SOL_TODAY . '_default', - DaedalusStatusEnum::LINK_WITH_SOL_ESTABLISHED_ONCE . '_default', - DaedalusStatusEnum::REBEL_BASE_CONTACT_DURATION . '_default', - DaedalusStatusEnum::GHOST_SAMPLE . '_default', - DaedalusStatusEnum::GHOST_CHUN . '_default', - HunterStatusEnum::AGGROED . '_default', - PlayerStatusEnum::BEGINNER . '_default', - 'electric_charges_lunchbox_default', - PlayerStatusEnum::SELECTED_FOR_STEEL_PLATE . '_default', - PlayerStatusEnum::SELECTED_FOR_ANXIETY_ATTACK . '_default', - PlaceStatusEnum::SELECTED_FOR_JOLT->value . '_default', - PlaceStatusEnum::SELECTED_FOR_ELECTROCUTION->value . '_default', - PlayerStatusEnum::SELECTED_FOR_BOARD_DISEASE . '_default', - ], - 'triumphConfigs' => [ - 'alien_science', - 'expedition', - 'super_nova', - 'first_starmap', - 'next_starmap', - 'cycle_mush', - 'starting_mush', - 'cycle_mush_late', - 'conversion', - 'infection', - 'humanocide', - 'chun_dead', - 'sol_return_mush', - 'eden_mush', - 'cycle_human', - 'cycle_inactive', - 'new_planet_orbit', - 'sol_contact', - 'small_research', - 'standard_research', - 'brilliant_research', - 'sol_return', - 'sol_mush_intruder', - 'hunter_killed', - 'mushicide', - 'rebel_wolf', - 'nice_surgery', - 'eden_crew_alive', - 'eden_alien_plant', - 'eden_gender', - 'eden', - 'eden_cat', - 'eden_cat_dead', - 'eden_cat_mush', - 'eden_disease', - 'eden_engineers', - 'eden_biologist', - 'eden_mush_intruder', - 'eden_by_pregnant', - 'eden_computed', - 'anathema', - 'pregnancy', - 'all_pregnant', - ], - 'hunterConfigs' => [ - HunterEnum::ASTEROID . '_default', - HunterEnum::DICE . '_default', - HunterEnum::HUNTER . '_default', - HunterEnum::SPIDER . '_default', - HunterEnum::TRAX . '_default', - HunterEnum::TRANSPORT . '_default', - ], - 'planetSectorConfigs' => [ - PlanetSectorEnum::LANDING . '_default', - PlanetSectorEnum::FOREST . '_default', - PlanetSectorEnum::MOUNTAIN . '_default', - PlanetSectorEnum::SWAMP . '_default', - PlanetSectorEnum::DESERT . '_default', - PlanetSectorEnum::OCEAN . '_default', - PlanetSectorEnum::CAVE . '_default', - PlanetSectorEnum::RUMINANT . '_default', - PlanetSectorEnum::PREDATOR . '_default', - PlanetSectorEnum::INTELLIGENT . '_default', - PlanetSectorEnum::INSECT . '_default', - PlanetSectorEnum::MANKAROG . '_default', - PlanetSectorEnum::HYDROCARBON . '_default', - PlanetSectorEnum::OXYGEN . '_default', - PlanetSectorEnum::COLD . '_default', - PlanetSectorEnum::HOT . '_default', - PlanetSectorEnum::STRONG_WIND . '_default', - PlanetSectorEnum::SEISMIC_ACTIVITY . '_default', - PlanetSectorEnum::VOLCANIC_ACTIVITY . '_default', - PlanetSectorEnum::RUINS . '_default', - PlanetSectorEnum::WRECK . '_default', - PlanetSectorEnum::FRUIT_TREES . '_default', - PlanetSectorEnum::LOST . '_default', - PlanetSectorEnum::CRISTAL_FIELD . '_default', - ], - 'titleConfigs' => [ - TitleEnum::COMMANDER, - TitleEnum::NERON_MANAGER, - TitleEnum::COM_MANAGER, - ], - 'projectConfigs' => [ - ProjectName::AUTO_WATERING, - ProjectName::AUXILIARY_TERMINAL, - ProjectName::BRIC_BROC, - ProjectName::CHIPSET_ACCELERATION, - ProjectName::DISMANTLING, - ProjectName::DOOR_SENSOR, - ProjectName::EQUIPMENT_SENSOR, - ProjectName::EXTRA_HYDROPONPOTS, - ProjectName::FIRE_SENSOR, - ProjectName::HEAT_LAMP, - ProjectName::PILGRED, - ProjectName::PLASMA_SHIELD, - ProjectName::THALASSO, - ProjectName::TRAIL_REDUCER, - ProjectName::MAGNETIC_NET, - ProjectName::ICARUS_ANTIGRAV_PROPELLER, - ProjectName::FISSION_COFFEE_ROASTER, - ProjectName::ARMOUR_CORRIDOR, - ProjectName::CALL_OF_DIRTY, - ProjectName::EXTRA_DRONE, - ProjectName::PATROLSHIP_BLASTER_GUN, - ProjectName::BAY_DOOR_XXL, - ProjectName::TRASH_LOAD, - ProjectName::FOOD_RETAILER, - ProjectName::AUTO_RETURN_ICARUS, - ProjectName::RADAR_TRANS_VOID, - ProjectName::NERON_TARGETING_ASSIST, - ProjectName::WHOS_WHO, - ProjectName::HYDROPONIC_INCUBATOR, - ProjectName::ICARUS_LAVATORY, - ProjectName::ICARUS_LARGER_BAY, - ProjectName::PATROL_SHIP_LAUNCHER, - ProjectName::NERON_PROJECT_THREAD, - ProjectName::TURRET_EXTRA_FIRE_RATE, - ProjectName::QUANTUM_SENSORS, - ProjectName::PATROLSHIP_EXTRA_AMMO, - ProjectName::NOISE_REDUCER, - ProjectName::APERO_KITCHEN, - ProjectName::FLOOR_HEATING, - ProjectName::PARASITE_ELIM, - ProjectName::OXY_MORE, - ProjectName::BEAT_BOX, - ProjectName::ANABOLICS, - ProjectName::ANTISPORE_GAS, - ProjectName::CONSTIPASPORE_SERUM, - ProjectName::CREATE_MYCOSCAN, - ProjectName::GUARANA_CAPPUCCINO, - ProjectName::MERIDON_SCRAMBLER, - ProjectName::MUSH_HUNTER_ZC16H, - ProjectName::MUSH_LANGUAGE, - ProjectName::MUSH_RACES, - ProjectName::MUSH_REPRODUCTIVE_SYSTEM, - ProjectName::MUSHICIDE_SOAP, - ProjectName::MUSHOVORE_BACTERIA, - ProjectName::MYCOALARM, - ProjectName::NARCOTICS_DISTILLER, - ProjectName::NATAMY_RIFLE, - ProjectName::NCC_CONTACT_LENSES, - ProjectName::PATULINE_SCRAMBLER, - ProjectName::PERPETUAL_HYDRATION, - ProjectName::PHEROMODEM, - ProjectName::RETRO_FUNGAL_SERUM, - ProjectName::SPORE_SUCKER, - ProjectName::SUPER_CALCULATOR, - ProjectName::TESLA_SUP2X, - ProjectName::ULTRA_HEALING_POMADE, - ], - 'skillConfigs' => [ - SkillEnum::ANONYMUSH, - SkillEnum::ANTIQUE_PERFUME, - SkillEnum::APPRENTICE, - SkillEnum::ASTROPHYSICIST, - SkillEnum::BACTEROPHILIAC, - SkillEnum::BIOLOGIST, - SkillEnum::BOTANIST, - SkillEnum::BYPASS, - SkillEnum::CAFFEINE_JUNKIE, - SkillEnum::CHEF, - SkillEnum::COLD_BLOODED, - SkillEnum::CONCEPTOR, - SkillEnum::CONFIDENT, - SkillEnum::CRAZY_EYE, - SkillEnum::CREATIVE, - SkillEnum::DEFACER, - SkillEnum::DETACHED_CREWMEMBER, - SkillEnum::DETERMINED, - SkillEnum::DEVOTION, - SkillEnum::DOORMAN, - SkillEnum::DIPLOMAT, - SkillEnum::DISHEARTENING_CONTACT, - SkillEnum::EXPERT, - SkillEnum::FERTILE, - SkillEnum::FIREFIGHTER, - SkillEnum::FRUGIVORE, - SkillEnum::FUNGAL_KITCHEN, - SkillEnum::GENIUS, - SkillEnum::GREEN_JELLY, - SkillEnum::GREEN_THUMB, - SkillEnum::GUNNER, - SkillEnum::HARD_BOILED, - SkillEnum::HYGIENIST, - SkillEnum::INFECTOR, - SkillEnum::INTIMIDATING, - SkillEnum::IT_EXPERT, - SkillEnum::LEADER, - SkillEnum::LETHARGY, - SkillEnum::LOGISTICS_EXPERT, - SkillEnum::MANKIND_ONLY_HOPE, - SkillEnum::MASSIVE_MUSHIFICATION, - SkillEnum::MEDIC, - SkillEnum::METALWORKER, - SkillEnum::MOTIVATOR, - SkillEnum::MYCELIUM_SPIRIT, - SkillEnum::MYCOLOGIST, - SkillEnum::NERON_DEPRESSION, - SkillEnum::NERON_ONLY_FRIEND, - SkillEnum::NIMBLE_FINGERS, - SkillEnum::NIGHTMARISH, - SkillEnum::NINJA, - SkillEnum::NURSE, - SkillEnum::OBSERVANT, - SkillEnum::OCD, - SkillEnum::OPPORTUNIST, - SkillEnum::OPTIMIST, - SkillEnum::PANIC, - SkillEnum::PARANOID, - SkillEnum::PHAGOCYTE, - SkillEnum::PHYSICIST, - SkillEnum::PILOT, - SkillEnum::POLITICIAN, - SkillEnum::POLYMATH, - SkillEnum::POLYVALENT, - SkillEnum::PRESENTIMENT, - SkillEnum::PYROMANIAC, - SkillEnum::RADIO_EXPERT, - SkillEnum::RADIO_PIRACY, - SkillEnum::REBEL, - SkillEnum::ROBOTICS_EXPERT, - SkillEnum::SABOTEUR, - SkillEnum::SELF_SACRIFICE, - SkillEnum::SHOOTER, - SkillEnum::SHRINK, - SkillEnum::SLIMETRAP, - SkillEnum::SNEAK, - SkillEnum::SOLID, - SkillEnum::SPLASHPROOF, - SkillEnum::SPRINTER, - SkillEnum::STRATEGURU, - SkillEnum::SURVIVALIST, - SkillEnum::TECHNICIAN, - SkillEnum::TORTURER, - SkillEnum::TRACKER, - SkillEnum::TRAITOR, - SkillEnum::TRANSFER, - SkillEnum::TRAPPER, - SkillEnum::U_TURN, - SkillEnum::VICTIMIZER, - SkillEnum::WRESTLER, - ], - 'rebelBaseConfigs' => [ - RebelBaseEnum::WOLF, - RebelBaseEnum::SIRIUS, - RebelBaseEnum::CENTAURI, - RebelBaseEnum::KALADAAN, - RebelBaseEnum::LUYTEN_CETI, - RebelBaseEnum::CYGNI, - ], - 'xylophConfigs' => [ - XylophEnum::BLUEPRINTS, - XylophEnum::COOK, - XylophEnum::DISK, - XylophEnum::KIVANC, - XylophEnum::GHOST_CHUN, - XylophEnum::GHOST_SAMPLE, - XylophEnum::LIST, - XylophEnum::MAGE_BOOKS, - XylophEnum::MAGNETITE, - XylophEnum::NOTHING, - XylophEnum::SNOW, - XylophEnum::VERSION, - ], - 'tradeConfigs' => [ - TradeEnum::FOREST_DEAL, - TradeEnum::PILGREDISSIM, - TradeEnum::GOOD_PROJECTIONS, - TradeEnum::TECHNO_REWRITE, - TradeEnum::HUMAN_VS_FUEL, - TradeEnum::HUMAN_VS_OXY, - TradeEnum::HUMAN_VS_TREE, - ], - ], - ]; + ]; + } } diff --git a/Api/src/Game/ConfigData/GameConfigDataLoader.php b/Api/src/Game/ConfigData/GameConfigDataLoader.php index e0455618db..50f0353617 100644 --- a/Api/src/Game/ConfigData/GameConfigDataLoader.php +++ b/Api/src/Game/ConfigData/GameConfigDataLoader.php @@ -16,12 +16,12 @@ use Mush\Game\Entity\DifficultyConfig; use Mush\Game\Entity\GameConfig; use Mush\Game\Entity\TitleConfig; -use Mush\Game\Entity\TriumphConfig; use Mush\Hunter\Entity\HunterConfig; use Mush\Player\Entity\Config\CharacterConfig; use Mush\Project\Entity\ProjectConfig; use Mush\Skill\Entity\SkillConfig; use Mush\Status\Entity\Config\StatusConfig; +use Mush\Triumph\Entity\TriumphConfig; class GameConfigDataLoader extends ConfigDataLoader { @@ -33,7 +33,7 @@ public function __construct( public function loadConfigsData(): void { - foreach (GameConfigData::$dataArray as $gameConfigData) { + foreach (GameConfigData::getAll() as $gameConfigData) { $gameConfig = $this->entityManager->getRepository(GameConfig::class)->findOneBy(['name' => $gameConfigData['name']]); if ($gameConfig === null) { @@ -138,10 +138,10 @@ private function setGameConfigTriumphConfigs(GameConfig $gameConfig, array $game { $triumphConfigs = []; foreach ($gameConfigData['triumphConfigs'] as $triumphConfigName) { - $triumphConfig = $this->entityManager->getRepository(TriumphConfig::class)->findOneBy(['name' => $triumphConfigName]); + $triumphConfig = $this->entityManager->getRepository(TriumphConfig::class)->findOneBy(['key' => $triumphConfigName]); if ($triumphConfig === null) { - throw new \Exception("Triumph config {$triumphConfigName} not found"); + throw new \Exception("Triumph config {$triumphConfigName->value} not found"); } $triumphConfigs[] = $triumphConfig; diff --git a/Api/src/Game/ConfigData/TriumphConfigData.php b/Api/src/Game/ConfigData/TriumphConfigData.php deleted file mode 100644 index ec033c7357..0000000000 --- a/Api/src/Game/ConfigData/TriumphConfigData.php +++ /dev/null @@ -1,59 +0,0 @@ - 'alien_science', 'triumph' => 16, 'is_all_crew' => false, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'expedition', 'triumph' => 3, 'is_all_crew' => false, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'super_nova', 'triumph' => 20, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'first_starmap', 'triumph' => 6, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'next_starmap', 'triumph' => 1, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'cycle_mush', 'triumph' => -2, 'is_all_crew' => true, 'team' => VisibilityEnum::MUSH], - ['name' => 'starting_mush', 'triumph' => 120, 'is_all_crew' => false, 'team' => VisibilityEnum::MUSH], - ['name' => 'cycle_mush_late', 'triumph' => -3, 'is_all_crew' => false, 'team' => VisibilityEnum::MUSH], - ['name' => 'conversion', 'triumph' => 8, 'is_all_crew' => false, 'team' => VisibilityEnum::MUSH], - ['name' => 'infection', 'triumph' => 1, 'is_all_crew' => false, 'team' => VisibilityEnum::MUSH], - ['name' => 'humanocide', 'triumph' => 3, 'is_all_crew' => false, 'team' => VisibilityEnum::MUSH], - ['name' => 'chun_dead', 'triumph' => 7, 'is_all_crew' => true, 'team' => VisibilityEnum::MUSH], - ['name' => 'sol_return_mush', 'triumph' => 8, 'is_all_crew' => true, 'team' => VisibilityEnum::MUSH], - ['name' => 'eden_mush', 'triumph' => 32, 'is_all_crew' => true, 'team' => VisibilityEnum::MUSH], - ['name' => 'cycle_human', 'triumph' => 1, 'is_all_crew' => false, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'cycle_inactive', 'triumph' => 0, 'is_all_crew' => false, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'new_planet_orbit', 'triumph' => 5, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'sol_contact', 'triumph' => 8, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'small_research', 'triumph' => 3, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'standard_research', 'triumph' => 6, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'brilliant_research', 'triumph' => 16, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'sol_return', 'triumph' => 20, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'sol_mush_intruder', 'triumph' => -10, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'hunter_killed', 'triumph' => 1, 'is_all_crew' => false, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'mushicide', 'triumph' => 3, 'is_all_crew' => false, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'rebel_wolf', 'triumph' => 8, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'nice_surgery', 'triumph' => 5, 'is_all_crew' => false, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'eden_crew_alive', 'triumph' => 1, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'eden_alien_plant', 'triumph' => 1, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'eden_gender', 'triumph' => 4, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'eden', 'triumph' => 6, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'eden_cat', 'triumph' => 4, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'eden_cat_dead', 'triumph' => -4, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'eden_cat_mush', 'triumph' => -8, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'eden_disease', 'triumph' => -4, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'eden_engineers', 'triumph' => 6, 'is_all_crew' => false, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'eden_biologist', 'triumph' => 3, 'is_all_crew' => false, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'eden_mush_intruder', 'triumph' => -16, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'eden_by_pregnant', 'triumph' => 8, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'eden_computed', 'triumph' => 4, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'anathema', 'triumph' => 8, 'is_all_crew' => false, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'pregnancy', 'triumph' => 8, 'is_all_crew' => false, 'team' => VisibilityEnum::PUBLIC], - ['name' => 'all_pregnant', 'triumph' => 2, 'is_all_crew' => true, 'team' => VisibilityEnum::PUBLIC], - ]; - - public static function getByName(string $name): array - { - return array_filter(self::$dataArray, static fn (array $config) => $config['name'] === $name)[0]; - } -} diff --git a/Api/src/Game/ConfigData/TriumphConfigDataLoader.php b/Api/src/Game/ConfigData/TriumphConfigDataLoader.php deleted file mode 100644 index bfe3b36c34..0000000000 --- a/Api/src/Game/ConfigData/TriumphConfigDataLoader.php +++ /dev/null @@ -1,39 +0,0 @@ -triumphConfigRepository = $triumphConfigRepository; - } - - public function loadConfigsData(): void - { - foreach (TriumphConfigData::$dataArray as $triumphConfigData) { - $triumphConfig = $this->triumphConfigRepository->findOneBy(['name' => $triumphConfigData['name']]); - - if ($triumphConfig === null) { - $triumphConfig = new TriumphConfig(); - } - $triumphConfig - ->setName($triumphConfigData['name']) - ->setTriumph($triumphConfigData['triumph']) - ->setIsAllCrew($triumphConfigData['is_all_crew']) - ->setTeam($triumphConfigData['team']); - - $this->entityManager->persist($triumphConfig); - } - $this->entityManager->flush(); - } -} diff --git a/Api/src/Game/DataFixtures/TriumphConfigFixtures.php b/Api/src/Game/DataFixtures/TriumphConfigFixtures.php deleted file mode 100644 index 451bd105dc..0000000000 --- a/Api/src/Game/DataFixtures/TriumphConfigFixtures.php +++ /dev/null @@ -1,376 +0,0 @@ -getReference(GameConfigFixtures::DEFAULT_GAME_CONFIG); - - $alienScience = new TriumphConfig(); - $alienScience - ->setName(TriumphEnum::ALIEN_SCIENCE) - ->setTriumph(16) - ->setTeam(VisibilityEnum::PUBLIC); - $manager->persist($alienScience); - - $expedition = new TriumphConfig(); - $expedition - ->setName(TriumphEnum::EXPEDITION) - ->setTriumph(3) - ->setTeam(VisibilityEnum::PUBLIC); - $manager->persist($expedition); - - $superNova = new TriumphConfig(); - $superNova - ->setName(TriumphEnum::SUPER_NOVA) - ->setTriumph(20) - ->setTeam(VisibilityEnum::PUBLIC) - ->setIsAllCrew(true); - $manager->persist($superNova); - - $firstStarmap = new TriumphConfig(); - $firstStarmap - ->setName(TriumphEnum::FIRST_STARMAP) - ->setTriumph(6) - ->setTeam(VisibilityEnum::PUBLIC) - ->setIsAllCrew(true); - $manager->persist($firstStarmap); - - $nextStarmap = new TriumphConfig(); - $nextStarmap - ->setName(TriumphEnum::NEXT_STARMAP) - ->setTriumph(1) - ->setTeam(VisibilityEnum::PUBLIC) - ->setIsAllCrew(true); - $manager->persist($nextStarmap); - - $cycleMush = new TriumphConfig(); - $cycleMush - ->setName(TriumphEnum::CYCLE_MUSH) - ->setTriumph(-2) - ->setTeam(VisibilityEnum::MUSH) - ->setIsAllCrew(true); - $manager->persist($cycleMush); - - $startingMush = new TriumphConfig(); - $startingMush - ->setName(TriumphEnum::STARTING_MUSH) - ->setTriumph(120) - ->setTeam(VisibilityEnum::MUSH); - $manager->persist($startingMush); - - $cycleMushLate = new TriumphConfig(); - $cycleMushLate - ->setName(TriumphEnum::CYCLE_MUSH_LATE) - ->setTriumph(-3) - ->setTeam(VisibilityEnum::MUSH); - $manager->persist($cycleMushLate); - - $conversionMush = new TriumphConfig(); - $conversionMush - ->setName(TriumphEnum::CONVERSION) - ->setTriumph(8) - ->setTeam(VisibilityEnum::MUSH); - $manager->persist($conversionMush); - - $infectionMush = new TriumphConfig(); - $infectionMush - ->setName(TriumphEnum::INFECTION) - ->setTriumph(1) - ->setTeam(VisibilityEnum::MUSH); - $manager->persist($infectionMush); - - $humanocideMush = new TriumphConfig(); - $humanocideMush - ->setName(TriumphEnum::HUMANOCIDE) - ->setTriumph(3) - ->setTeam(VisibilityEnum::MUSH); - $manager->persist($humanocideMush); - - $chunDead = new TriumphConfig(); - $chunDead - ->setName(TriumphEnum::CHUN_DEAD) - ->setTriumph(7) - ->setTeam(VisibilityEnum::MUSH) - ->setIsAllCrew(true); - $manager->persist($chunDead); - - $returnSolMush = new TriumphConfig(); - $returnSolMush - ->setName(TriumphEnum::SOL_RETURN_MUSH) - ->setTriumph(8) - ->setTeam(VisibilityEnum::MUSH) - ->setIsAllCrew(true); - $manager->persist($returnSolMush); - - $edenMush = new TriumphConfig(); - $edenMush - ->setName(TriumphEnum::EDEN_MUSH) - ->setTriumph(32) - ->setTeam(VisibilityEnum::MUSH) - ->setIsAllCrew(true); - $manager->persist($edenMush); - - $cycleHuman = new TriumphConfig(); - $cycleHuman - ->setName(TriumphEnum::CYCLE_HUMAN) - ->setTriumph(1) - ->setTeam(VisibilityEnum::HUMAN); - $manager->persist($cycleHuman); - - $cycleInactive = new TriumphConfig(); - $cycleInactive - ->setName(TriumphEnum::CYCLE_INACTIVE) - ->setTriumph(0) - ->setTeam(VisibilityEnum::HUMAN); - $manager->persist($cycleInactive); - - $newPlanetOrbit = new TriumphConfig(); - $newPlanetOrbit - ->setName(TriumphEnum::NEW_PLANET_ORBIT) - ->setTriumph(5) - ->setTeam(VisibilityEnum::HUMAN) - ->setIsAllCrew(true); - $manager->persist($newPlanetOrbit); - - $solContact = new TriumphConfig(); - $solContact - ->setName(TriumphEnum::SOL_CONTACT) - ->setTriumph(8) - ->setTeam(VisibilityEnum::HUMAN) - ->setIsAllCrew(true); - $manager->persist($solContact); - - $smallResearch = new TriumphConfig(); - $smallResearch - ->setName(TriumphEnum::SMALL_RESEARCH) - ->setTriumph(3) - ->setTeam(VisibilityEnum::HUMAN) - ->setIsAllCrew(true); - $manager->persist($smallResearch); - - $standardResearch = new TriumphConfig(); - $standardResearch - ->setName(TriumphEnum::STANDARD_RESEARCH) - ->setTriumph(6) - ->setTeam(VisibilityEnum::HUMAN) - ->setIsAllCrew(true); - $manager->persist($standardResearch); - - $brilliantResearch = new TriumphConfig(); - $brilliantResearch - ->setName(TriumphEnum::BRILLIANT_RESEARCH) - ->setTriumph(16) - ->setTeam(VisibilityEnum::HUMAN) - ->setIsAllCrew(true); - $manager->persist($brilliantResearch); - - $solReturn = new TriumphConfig(); - $solReturn - ->setName(TriumphEnum::SOL_RETURN) - ->setTriumph(20) - ->setTeam(VisibilityEnum::HUMAN) - ->setIsAllCrew(true); - $manager->persist($solReturn); - - $solMushIntruder = new TriumphConfig(); - $solMushIntruder - ->setName(TriumphEnum::SOL_MUSH_INTRUDER) - ->setTriumph(-10) - ->setTeam(VisibilityEnum::HUMAN) - ->setIsAllCrew(true); - $manager->persist($solMushIntruder); - - $hunterKilled = new TriumphConfig(); - $hunterKilled - ->setName(TriumphEnum::HUNTER_KILLED) - ->setTriumph(1) - ->setTeam(VisibilityEnum::HUMAN); - $manager->persist($hunterKilled); - - $mushicide = new TriumphConfig(); - $mushicide - ->setName(TriumphEnum::MUSHICIDE) - ->setTriumph(3) - ->setTeam(VisibilityEnum::HUMAN); - $manager->persist($mushicide); - - $rebelWolf = new TriumphConfig(); - $rebelWolf - ->setName(TriumphEnum::REBEL_WOLF) - ->setTriumph(8) - ->setTeam(VisibilityEnum::HUMAN) - ->setIsAllCrew(true); - $manager->persist($rebelWolf); - - $niceSurgery = new TriumphConfig(); - $niceSurgery - ->setName(TriumphEnum::NICE_SURGERY) - ->setTriumph(5) - ->setTeam(VisibilityEnum::HUMAN); - $manager->persist($niceSurgery); - - $edenByCrewAlive = new TriumphConfig(); - $edenByCrewAlive - ->setName(TriumphEnum::EDEN_CREW_ALIVE) - ->setTriumph(1) - ->setTeam(VisibilityEnum::HUMAN) - ->setIsAllCrew(true); - $manager->persist($edenByCrewAlive); - - $edenByAlienPlant = new TriumphConfig(); - $edenByAlienPlant - ->setName(TriumphEnum::EDEN_ALIEN_PLANT) - ->setTriumph(1) - ->setTeam(VisibilityEnum::HUMAN) - ->setIsAllCrew(true); - $manager->persist($edenByAlienPlant); - - $edenGender = new TriumphConfig(); - $edenGender - ->setName(TriumphEnum::EDEN_GENDER) - ->setTriumph(4) - ->setTeam(VisibilityEnum::HUMAN) - ->setIsAllCrew(true); - $manager->persist($edenGender); - - $eden = new TriumphConfig(); - $eden - ->setName(TriumphEnum::EDEN) - ->setTriumph(6) - ->setTeam(VisibilityEnum::HUMAN) - ->setIsAllCrew(true); - $manager->persist($eden); - - $edenCat = new TriumphConfig(); - $edenCat - ->setName(TriumphEnum::EDEN_CAT) - ->setTriumph(4) - ->setTeam(VisibilityEnum::HUMAN) - ->setIsAllCrew(true); - $manager->persist($edenCat); - - $edenCatDead = new TriumphConfig(); - $edenCatDead - ->setName(TriumphEnum::EDEN_CAT_DEAD) - ->setTriumph(-4) - ->setTeam(VisibilityEnum::HUMAN) - ->setIsAllCrew(true); - $manager->persist($edenCatDead); - - $edenCatMush = new TriumphConfig(); - $edenCatMush - ->setName(TriumphEnum::EDEN_CAT_MUSH) - ->setTriumph(-8) - ->setTeam(VisibilityEnum::HUMAN) - ->setIsAllCrew(true); - $manager->persist($edenCatMush); - - $edenDisease = new TriumphConfig(); - $edenDisease - ->setName(TriumphEnum::EDEN_DISEASE) - ->setTriumph(-4) - ->setTeam(VisibilityEnum::HUMAN) - ->setIsAllCrew(true); - $manager->persist($edenDisease); - - $edenEngineers = new TriumphConfig(); - $edenEngineers - ->setName(TriumphEnum::EDEN_ENGINEERS) - ->setTriumph(6) - ->setTeam(VisibilityEnum::HUMAN); - $manager->persist($edenEngineers); - - $edenBiologist = new TriumphConfig(); - $edenBiologist - ->setName(TriumphEnum::EDEN_BIOLOGIST) - ->setTriumph(3) - ->setTeam(VisibilityEnum::HUMAN); - $manager->persist($edenBiologist); - - $edenMushIntruder = new TriumphConfig(); - $edenMushIntruder - ->setName(TriumphEnum::EDEN_MUSH_INTRUDER) - ->setTriumph(-16) - ->setTeam(VisibilityEnum::HUMAN) - ->setIsAllCrew(true); - $manager->persist($edenMushIntruder); - - $edenByPregnant = new TriumphConfig(); - $edenByPregnant - ->setName(TriumphEnum::EDEN_BY_PREGNANT) - ->setTriumph(8) - ->setTeam(VisibilityEnum::HUMAN) - ->setIsAllCrew(true); - $manager->persist($edenByPregnant); - - $edenComputed = new TriumphConfig(); - $edenComputed - ->setName(TriumphEnum::EDEN_COMPUTED) - ->setTriumph(4) - ->setTeam(VisibilityEnum::HUMAN) - ->setIsAllCrew(true); - $manager->persist($edenComputed); - - $anathema = new TriumphConfig(); - $anathema - ->setName(TriumphEnum::ANATHEMA) - ->setTriumph(8) - ->setTeam(VisibilityEnum::HUMAN); - $manager->persist($anathema); - - $pregnancy = new TriumphConfig(); - $pregnancy - ->setName(TriumphEnum::PREGNANCY) - ->setTriumph(8) - ->setTeam(VisibilityEnum::HUMAN); - $manager->persist($pregnancy); - - $allPregnant = new TriumphConfig(); - $allPregnant - ->setName(TriumphEnum::ALL_PREGNANT) - ->setTriumph(2) - ->setTeam(VisibilityEnum::HUMAN) - ->setIsAllCrew(true); - $manager->persist($allPregnant); - - /** @var ArrayCollection $triumphConfigs */ - $triumphConfigs = new ArrayCollection([ - $alienScience, $expedition, $superNova, - $firstStarmap, $nextStarmap, - $cycleMush, $startingMush, $cycleMushLate, $conversionMush, $infectionMush, - $humanocideMush, $chunDead, $returnSolMush, $edenMush, - $cycleHuman, $cycleInactive, - $newPlanetOrbit, $solContact, - $smallResearch, $standardResearch, $brilliantResearch, - $solReturn, $solMushIntruder, $hunterKilled, $mushicide, - $rebelWolf, $niceSurgery, - $edenByCrewAlive, $edenByAlienPlant, $edenGender, $eden, $edenCat, $edenCatDead, - $edenCatMush, $edenDisease, $edenEngineers, $edenBiologist, $edenMushIntruder, $edenByPregnant, $edenComputed, - $anathema, $pregnancy, $allPregnant, - ]); - $gameConfig->setTriumphConfig($triumphConfigs); - - $manager->flush(); - } - - public function getDependencies(): array - { - return [ - DaedalusConfigFixtures::class, - ]; - } -} diff --git a/Api/src/Game/Entity/GameConfig.php b/Api/src/Game/Entity/GameConfig.php index 4b4967ebdd..21f1255a54 100644 --- a/Api/src/Game/Entity/GameConfig.php +++ b/Api/src/Game/Entity/GameConfig.php @@ -17,7 +17,6 @@ use Mush\Exploration\Entity\Collection\PlanetSectorConfigCollection; use Mush\Exploration\Entity\PlanetSectorConfig; use Mush\Game\Entity\Collection\TitleConfigCollection; -use Mush\Game\Entity\Collection\TriumphConfigCollection; use Mush\Game\Repository\GameConfigRepository; use Mush\Hunter\Entity\HunterConfig; use Mush\Hunter\Entity\HunterConfigCollection; @@ -27,6 +26,8 @@ use Mush\Skill\Entity\SkillConfig; use Mush\Skill\Entity\SkillConfigCollection; use Mush\Status\Entity\Config\StatusConfig; +use Mush\Triumph\Entity\TriumphConfig; +use Mush\Triumph\Entity\TriumphConfigCollection; #[ORM\Entity(repositoryClass: GameConfigRepository::class)] #[ORM\Table(name: 'config_game')] diff --git a/Api/src/Game/Entity/TriumphConfig.php b/Api/src/Game/Entity/TriumphConfig.php deleted file mode 100644 index 5f6adf36d2..0000000000 --- a/Api/src/Game/Entity/TriumphConfig.php +++ /dev/null @@ -1,98 +0,0 @@ -setName($configData['name']) - ->setTriumph($configData['triumph']) - ->setIsAllCrew($configData['is_all_crew']) - ->setTeam($configData['team']); - - return $triumphConfig; - } - - public function getId(): int - { - return $this->id; - } - - public function getName(): string - { - return $this->name; - } - - public function setName(string $name): self - { - $this->name = $name; - - return $this; - } - - public function getTriumph(): int - { - return $this->triumph; - } - - public function setTriumph(int $triumph): self - { - $this->triumph = $triumph; - - return $this; - } - - // Getter for API Platform serialization - public function getIsAllCrew(): bool - { - return $this->isAllCrew; - } - - public function isAllCrew(): bool - { - return $this->isAllCrew; - } - - public function setIsAllCrew(bool $isAllCrew): self - { - $this->isAllCrew = $isAllCrew; - - return $this; - } - - public function getTeam(): string - { - return $this->team; - } - - public function setTeam(string $team): self - { - $this->team = $team; - - return $this; - } -} diff --git a/Api/src/Game/Enum/EventPriorityEnum.php b/Api/src/Game/Enum/EventPriorityEnum.php index 8f010f659f..4feb3f65df 100644 --- a/Api/src/Game/Enum/EventPriorityEnum.php +++ b/Api/src/Game/Enum/EventPriorityEnum.php @@ -18,6 +18,7 @@ abstract class EventPriorityEnum public const int NERON_PROJECT_THREAD = 14; // NERON makes projects progress before oxygen consumption public const int DAEDALUS_VARIABLES = 12; // oxygen consumption public const int PLAYERS = 10; // New points for players // effect of player statuses + public const int PLAYER_TRIUMPH = 9; // New triumphs for players public const int EQUIPMENTS = 8; // recharge, effect of statuses public const int DAEDALUS_INCIDENTS = 6; // trigger incident in the daedalus (falling ceiling electric arcs...) public const int ROOMS = 4; // fires diff --git a/Api/src/Game/Enum/TriumphEnum.php b/Api/src/Game/Enum/TriumphEnum.php deleted file mode 100644 index 146d91a859..0000000000 --- a/Api/src/Game/Enum/TriumphEnum.php +++ /dev/null @@ -1,140 +0,0 @@ - - */ -class TriumphConfigRepository extends ServiceEntityRepository -{ - public function __construct(ManagerRegistry $registry) - { - parent::__construct($registry, TriumphConfig::class); - } -} diff --git a/Api/src/Game/Service/ConfigDataLoaderService.php b/Api/src/Game/Service/ConfigDataLoaderService.php index 3c07bb7ac3..e282d29ae3 100644 --- a/Api/src/Game/Service/ConfigDataLoaderService.php +++ b/Api/src/Game/Service/ConfigDataLoaderService.php @@ -42,7 +42,6 @@ use Mush\Game\ConfigData\GameConfigDataLoader; use Mush\Game\ConfigData\LocalizationConfigDataLoader; use Mush\Game\ConfigData\TitleConfigDataLoader; -use Mush\Game\ConfigData\TriumphConfigDataLoader; use Mush\Game\ConfigData\VariableEventConfigDataLoader; use Mush\Hunter\ConfigData\HunterConfigDataLoader; use Mush\Modifier\ConfigData\DirectModifierConfigDataLoader; @@ -58,6 +57,7 @@ use Mush\Status\ConfigData\ChargeStatusConfigDataLoader; use Mush\Status\ConfigData\ContentStatusConfigDataLoader; use Mush\Status\ConfigData\StatusConfigDataLoader; +use Mush\Triumph\ConfigData\TriumphConfigDataLoader; /** * @SuppressWarnings(PHPMD) diff --git a/Api/src/Player/Entity/Collection/PlayerCollection.php b/Api/src/Player/Entity/Collection/PlayerCollection.php index 51c540f0b5..7cac4628b5 100644 --- a/Api/src/Player/Entity/Collection/PlayerCollection.php +++ b/Api/src/Player/Entity/Collection/PlayerCollection.php @@ -53,6 +53,11 @@ public function getByNameOrThrow(string $name): Player return $this->getPlayerByName($name) ?? throw new \RuntimeException("Player with name {$name} not found"); } + public function getAllByName(string $name): self + { + return $this->filter(static fn (Player $player) => $player->getName() === $name); + } + public function getPlayersWithSkill(SkillEnum $skill): self { return $this->filter(static fn (Player $player) => $player->hasSkill($skill)); @@ -182,6 +187,11 @@ public function isThereAMushUnlockingProjects(): bool )->count() > 0; } + public function getAllActive(): self + { + return $this->filter(static fn (Player $player) => $player->isActive()); + } + private function getPlayerWithStatus(string $status): ?Player { return $this->filter(static fn (Player $player) => $player->hasStatus($status))->first() ?: null; diff --git a/Api/src/Player/Entity/PlayerVariables.php b/Api/src/Player/Entity/PlayerVariables.php index 481b20d547..d9df93cef5 100644 --- a/Api/src/Player/Entity/PlayerVariables.php +++ b/Api/src/Player/Entity/PlayerVariables.php @@ -75,7 +75,7 @@ public function __construct(CharacterConfig $characterConfig) variableCollection: $this, name: PlayerVariableEnum::TRIUMPH, initValue: 0, - minValue: null, + minValue: 0, ); parent::__construct([ diff --git a/Api/src/Player/Service/PlayerService.php b/Api/src/Player/Service/PlayerService.php index 62b750115e..e5620312b8 100644 --- a/Api/src/Player/Service/PlayerService.php +++ b/Api/src/Player/Service/PlayerService.php @@ -7,7 +7,6 @@ use Mush\Daedalus\Repository\DaedalusRepositoryInterface; use Mush\Game\Enum\EventEnum; use Mush\Game\Enum\GameStatusEnum; -use Mush\Game\Enum\TriumphEnum; use Mush\Game\Enum\VisibilityEnum; use Mush\Game\Event\VariableEventInterface; use Mush\Game\Service\EventServiceInterface; @@ -25,7 +24,6 @@ use Mush\Player\Repository\ClosedPlayerRepositoryInterface; use Mush\Player\Repository\PlayerInfoRepositoryInterface; use Mush\Player\Repository\PlayerRepositoryInterface; -use Mush\RoomLog\Enum\PlayerModifierLogEnum; use Mush\RoomLog\Service\RoomLogServiceInterface; use Mush\Skill\Enum\SkillEnum; use Mush\User\Entity\User; @@ -206,10 +204,6 @@ public function handleNewCycle(Player $player, \DateTime $date): Player $this->applyCycleChangesPointsGain($player, $date); - if ($player->isActive()) { - $this->handleTriumphChange($player, $date); - } - return $this->persist($player); } @@ -316,27 +310,6 @@ private function applyCycleChangesPointsGain(Player $player, \DateTime $date): v } } - private function handleTriumphChange(Player $player, \DateTime $date): void - { - $gameConfig = $player->getDaedalus()->getGameConfig(); - - $humanTriumph = $gameConfig->getTriumphConfig()->getByNameOrThrow(TriumphEnum::CYCLE_HUMAN); - $mushTriumph = $gameConfig->getTriumphConfig()->getByNameOrThrow(TriumphEnum::CYCLE_MUSH); - $triumphChange = $player->isMush() ? $mushTriumph->getTriumph() : $humanTriumph->getTriumph(); - - $player->addTriumph($triumphChange); - - $this->roomLogService->createLog( - PlayerModifierLogEnum::GAIN_TRIUMPH, - $player->getPlace(), - VisibilityEnum::PRIVATE, - 'event_log', - $player, - ['quantity' => $triumphChange], - $date - ); - } - private function markPlayerAsDead(Player $player, string $endCause, \DateTime $date): void { $playerInfo = $player->getPlayerInfo(); diff --git a/Api/src/RoomLog/Listener/TriumphEventSubscriber.php b/Api/src/RoomLog/Listener/TriumphEventSubscriber.php new file mode 100644 index 0000000000..dc651d4a0f --- /dev/null +++ b/Api/src/RoomLog/Listener/TriumphEventSubscriber.php @@ -0,0 +1,40 @@ + 'onTriumphChanged', + ]; + } + + public function onTriumphChanged(TriumphChangedEvent $event): void + { + $this->roomLogService->createLog( + logKey: $event->getLogKey(), + place: $event->getPlace(), + visibility: $event->getVisibility(), + type: 'triumph', + player: $event->getPlayer(), + dateTime: $event->getTime(), + parameters: [ + 'quantity' => $event->getQuantity(), + ], + ); + } +} diff --git a/Api/src/Triumph/ConfigData/TriumphConfigData.php b/Api/src/Triumph/ConfigData/TriumphConfigData.php new file mode 100644 index 0000000000..8978c6d151 --- /dev/null +++ b/Api/src/Triumph/ConfigData/TriumphConfigData.php @@ -0,0 +1,85 @@ + + */ + public static function getAll(): array + { + return [ + new TriumphConfigDto( + key: TriumphEnum::CYCLE_HUMAN->toConfigKey('default'), + name: TriumphEnum::CYCLE_HUMAN, + targetedEvent: DaedalusCycleEvent::DAEDALUS_NEW_CYCLE, + scope: TriumphScope::ALL_ACTIVE_HUMANS, + quantity: 1, + ), + new TriumphConfigDto( + key: TriumphEnum::CYCLE_MUSH->toConfigKey('default'), + name: TriumphEnum::CYCLE_MUSH, + targetedEvent: DaedalusCycleEvent::DAEDALUS_NEW_CYCLE, + scope: TriumphScope::ALL_MUSHS, + quantity: -2, + ), + new TriumphConfigDto( + key: TriumphEnum::CHUN_LIVES->toConfigKey('default'), + name: TriumphEnum::CHUN_LIVES, + targetedEvent: DaedalusCycleEvent::DAEDALUS_NEW_CYCLE, + targetedEventExpectedTags: [ + EventEnum::NEW_DAY, + ], + scope: TriumphScope::PERSONAL, + target: CharacterEnum::CHUN, + quantity: 1, + ), + new TriumphConfigDto( + key: TriumphEnum::RETURN_TO_SOL->toConfigKey('default'), + name: TriumphEnum::RETURN_TO_SOL, + targetedEvent: DaedalusEvent::FINISH_DAEDALUS, + targetedEventExpectedTags: [ + ActionEnum::RETURN_TO_SOL->toString(), + ], + scope: TriumphScope::ALL_ALIVE_HUMANS, + quantity: 20, + ), + new TriumphConfigDto( + key: TriumphEnum::SOL_MUSH_INTRUDER->toConfigKey('default'), + name: TriumphEnum::SOL_MUSH_INTRUDER, + targetedEvent: DaedalusEvent::FINISH_DAEDALUS, + targetedEventExpectedTags: [ + ActionEnum::RETURN_TO_SOL->toString(), + ], + scope: TriumphScope::ALL_ALIVE_HUMANS, + quantity: -10, + ), + new TriumphConfigDto( + key: TriumphEnum::MUSH_INITIAL_BONUS->toConfigKey('default'), + name: TriumphEnum::MUSH_INITIAL_BONUS, + targetedEvent: DaedalusEvent::FULL_DAEDALUS, + scope: TriumphScope::ALL_ALIVE_MUSHS, + quantity: 120, + ), + ]; + } + + public static function getByName(TriumphEnum $name): TriumphConfigDto + { + return current( + array_filter(self::getAll(), static fn (TriumphConfigDto $dto) => $dto->name === $name) + ); + } +} diff --git a/Api/src/Triumph/ConfigData/TriumphConfigDataLoader.php b/Api/src/Triumph/ConfigData/TriumphConfigDataLoader.php new file mode 100644 index 0000000000..b0f597614c --- /dev/null +++ b/Api/src/Triumph/ConfigData/TriumphConfigDataLoader.php @@ -0,0 +1,28 @@ +entityManager->getRepository(TriumphConfig::class)->findOneBy(['name' => $triumphConfigDto->name]); + + if (!$triumphConfig) { + $triumphConfig = TriumphConfig::fromDto($triumphConfigDto); + } else { + $triumphConfig->updateFromDto($triumphConfigDto); + } + + $this->entityManager->persist($triumphConfig); + } + $this->entityManager->flush(); + } +} diff --git a/Api/src/Triumph/DataFixtures/TriumphConfigFixtures.php b/Api/src/Triumph/DataFixtures/TriumphConfigFixtures.php new file mode 100644 index 0000000000..19e2581ed5 --- /dev/null +++ b/Api/src/Triumph/DataFixtures/TriumphConfigFixtures.php @@ -0,0 +1,36 @@ +getReference(GameConfigFixtures::DEFAULT_GAME_CONFIG); + + foreach (TriumphConfigData::getAll() as $triumphConfigDto) { + $triumphConfig = TriumphConfig::fromDto($triumphConfigDto); + $manager->persist($triumphConfig); + $this->addReference('triumph_config_' . $triumphConfigDto->name->toString(), $triumphConfig); + + $gameConfig->addTriumphConfig($triumphConfig); + } + + $manager->persist($gameConfig); + $manager->flush(); + } + + public function getDependencies(): array + { + return [GameConfigFixtures::class]; + } +} diff --git a/Api/src/Triumph/Dto/TriumphConfigDto.php b/Api/src/Triumph/Dto/TriumphConfigDto.php new file mode 100644 index 0000000000..96423d50a5 --- /dev/null +++ b/Api/src/Triumph/Dto/TriumphConfigDto.php @@ -0,0 +1,35 @@ + ''])] + private string $key; + + #[ORM\Column(type: 'string', nullable: false, enumType: TriumphEnum::class, options: ['default' => TriumphEnum::NONE])] + private TriumphEnum $name; + + #[ORM\Column(type: 'string', nullable: false, enumType: TriumphScope::class, options: ['default' => TriumphScope::NONE])] + private TriumphScope $scope; + + #[ORM\Column(type: 'string', nullable: false, options: ['default' => ''])] + private string $targetedEvent; + + #[ORM\Column(type: 'array', nullable: false, options: ['default' => 'a:0:{}'])] + private array $targetedEventExpectedTags; + + #[ORM\Column(type: 'string', nullable: false, options: ['default' => ''])] + private string $target; + + #[ORM\Column(type: 'integer', nullable: false, options: ['default' => 0])] + private int $quantity; + + #[ORM\Column(type: 'string', nullable: false, enumType: TriumphVisibility::class, options: ['default' => TriumphVisibility::NONE])] + private TriumphVisibility $visibility; + + #[ORM\Column(type: 'integer', nullable: false, options: ['default' => 0])] + private int $regressiveFactor; + + private function __construct( + string $key, + TriumphEnum $name, + TriumphScope $scope, + string $targetedEvent, + array $targetedEventExpectedTags, + string $target, + int $quantity, + TriumphVisibility $visibility, + int $regressiveFactor, + ) { + $this->key = $key; + $this->name = $name; + $this->scope = $scope; + $this->targetedEvent = $targetedEvent; + $this->targetedEventExpectedTags = $targetedEventExpectedTags; + $this->target = $target; + $this->quantity = $quantity; + $this->visibility = $visibility; + $this->regressiveFactor = $regressiveFactor; + } + + public function getName(): TriumphEnum + { + return $this->name; + } + + public function getQuantity(): int + { + return $this->quantity; + } + + public function getScope(): TriumphScope + { + return $this->scope; + } + + public function getTarget(): string + { + return $this->target; + } + + public function getTargetedEvent(): string + { + return $this->targetedEvent; + } + + public function getTargetedEventExpectedTags(): array + { + return $this->targetedEventExpectedTags; + } + + public function getVisibility(): TriumphVisibility + { + return $this->visibility; + } + + public static function fromDto(TriumphConfigDto $triumphConfigDto): self + { + return new self( + $triumphConfigDto->key, + $triumphConfigDto->name, + $triumphConfigDto->scope, + $triumphConfigDto->targetedEvent, + $triumphConfigDto->targetedEventExpectedTags, + $triumphConfigDto->target, + $triumphConfigDto->quantity, + $triumphConfigDto->visibility, + $triumphConfigDto->regressiveFactor, + ); + } + + public function updateFromDto(TriumphConfigDto $triumphConfigDto): void + { + $this->key = $triumphConfigDto->key; + $this->name = $triumphConfigDto->name; + $this->scope = $triumphConfigDto->scope; + $this->targetedEvent = $triumphConfigDto->targetedEvent; + $this->targetedEventExpectedTags = $triumphConfigDto->targetedEventExpectedTags; + $this->target = $triumphConfigDto->target; + $this->quantity = $triumphConfigDto->quantity; + $this->visibility = $triumphConfigDto->visibility; + $this->regressiveFactor = $triumphConfigDto->regressiveFactor; + } +} diff --git a/Api/src/Game/Entity/Collection/TriumphConfigCollection.php b/Api/src/Triumph/Entity/TriumphConfigCollection.php similarity index 50% rename from Api/src/Game/Entity/Collection/TriumphConfigCollection.php rename to Api/src/Triumph/Entity/TriumphConfigCollection.php index 385fe36023..ad33111161 100644 --- a/Api/src/Game/Entity/Collection/TriumphConfigCollection.php +++ b/Api/src/Triumph/Entity/TriumphConfigCollection.php @@ -1,32 +1,34 @@ */ -class TriumphConfigCollection extends ArrayCollection +final class TriumphConfigCollection extends ArrayCollection { - public function getTriumph(string $name): ?TriumphConfig - { - $triumph = $this - ->filter(static fn (TriumphConfig $triumphConfig) => $triumphConfig->getName() === $name) - ->first(); - - return $triumph === false ? null : $triumph; - } - - public function getByNameOrThrow(string $name): TriumphConfig + public function getByNameOrThrow(TriumphEnum $name): TriumphConfig { - $triumph = $this->getTriumph($name); + $triumph = $this->getByName($name); if ($triumph === null) { - throw new \RuntimeException("Triumph config {$name} not found"); + throw new \RuntimeException("Triumph config {$name->value} not found"); } return $triumph; } + + private function getByName(TriumphEnum $name): ?TriumphConfig + { + $triumph = $this + ->filter(static fn (TriumphConfig $triumphConfig) => $triumphConfig->getName() === $name) + ->first(); + + return $triumph === false ? null : $triumph; + } } diff --git a/Api/src/Triumph/Enum/TriumphEnum.php b/Api/src/Triumph/Enum/TriumphEnum.php new file mode 100644 index 0000000000..5fa150a1e9 --- /dev/null +++ b/Api/src/Triumph/Enum/TriumphEnum.php @@ -0,0 +1,26 @@ +value . '_' . $configKey; + } + + public function toString(): string + { + return $this->value; + } +} diff --git a/Api/src/Triumph/Enum/TriumphScope.php b/Api/src/Triumph/Enum/TriumphScope.php new file mode 100644 index 0000000000..f6d8e0f033 --- /dev/null +++ b/Api/src/Triumph/Enum/TriumphScope.php @@ -0,0 +1,18 @@ +value; + } +} diff --git a/Api/src/Triumph/Event/TriumphChangedEvent.php b/Api/src/Triumph/Event/TriumphChangedEvent.php new file mode 100644 index 0000000000..f9de74d900 --- /dev/null +++ b/Api/src/Triumph/Event/TriumphChangedEvent.php @@ -0,0 +1,48 @@ +player; + } + + public function getPlace(): Place + { + return $this->player->getPlace(); + } + + public function getLogKey(): string + { + return $this->triumphConfig->getName()->toString(); + } + + public function getVisibility(): string + { + return $this->triumphConfig->getVisibility()->toString(); + } + + public function getQuantity(): int + { + return abs($this->quantity); + } +} diff --git a/Api/src/Triumph/Event/TriumphSourceEventInterface.php b/Api/src/Triumph/Event/TriumphSourceEventInterface.php new file mode 100644 index 0000000000..81268e6ca5 --- /dev/null +++ b/Api/src/Triumph/Event/TriumphSourceEventInterface.php @@ -0,0 +1,17 @@ +hasAllTags($triumphConfig->getTargetedEventExpectedTags()); + } +} diff --git a/Api/src/Triumph/Listener/TriumphSourceEventSubscriber.php b/Api/src/Triumph/Listener/TriumphSourceEventSubscriber.php new file mode 100644 index 0000000000..8ec8339fe9 --- /dev/null +++ b/Api/src/Triumph/Listener/TriumphSourceEventSubscriber.php @@ -0,0 +1,42 @@ + ['onDaedalusNewCycle', EventPriorityEnum::PLAYER_TRIUMPH], + DaedalusEvent::FINISH_DAEDALUS => ['onDaedalusFinish', EventPriorityEnum::HIGH], + DaedalusEvent::FULL_DAEDALUS => ['onDaedalusFull', EventPriorityEnum::LOW], + ]; + } + + public function onDaedalusNewCycle(DaedalusCycleEvent $event): void + { + $this->changeTriumphFromEventService->execute($event); + } + + public function onDaedalusFinish(DaedalusEvent $event): void + { + $this->changeTriumphFromEventService->execute($event); + } + + public function onDaedalusFull(DaedalusEvent $event): void + { + $this->changeTriumphFromEventService->execute($event); + } +} diff --git a/Api/src/Triumph/README.md b/Api/src/Triumph/README.md new file mode 100644 index 0000000000..2e4faf7fae --- /dev/null +++ b/Api/src/Triumph/README.md @@ -0,0 +1,64 @@ +# Triumph + +Triumph are points awarded to players based on specific game events. + +They are configured through the [`TriumphConfig`](./Entity/TriumphConfig.php) entity and can be awarded to different scopes of players. + +## Triumph config Attributes + +The [`TriumphConfig`](./Entity/TriumphConfig.php) entity contains the following relevant attributes: + +- `name`: triumph name (from [`TriumphEnum`](./Enum/TriumphEnum.php)) +- `scope`: Determines which players receive the triumph (from [`TriumphScope`](./Enum/TriumphScope.php)) +- `targetedEvent`: The event that triggers this triumph +- `targetedEventExpectedTags`: Additional tags that must be present in the event for the triumph to be awarded (for the moment, all tags must be present for the triumph to apply - TODO) +- `target`: For `PERSONAL` scope, specifies which character receives the triumph +- `quantity`: The amount of triumph points awarded +- `visibility`: Controls the visibility of triumph log + - `PRIVATE`: Only visible to the player who earned it + - `HIDDEN`: Not visible to players +- `regressiveFactor`: Determines after how many gains the gains has 2x less chance to be earned (TODO) + +## Triumph Scopes + +The [`TriumphScope`](./Enum/TriumphScope.php) enum defines which players receive a triumph: + +- `ALL_ACTIVE_HUMANS`: All human players who are currently active in the game +- `ALL_ALIVE_MUSHS`: All Mush players who are still alive +- `ALL_ALIVE_HUMANS`: All human players who are still alive +- `ALL_MUSHS`: All Mush players +- `PERSONAL`: Only applies to a specific character (defined in the `target` attribute) + +You can add new scopes to restrain your triumph targets. + +## How to add a new triumph? + +1. Add the triumph config to [TriumphConfigData](./ConfigData/TriumphConfigData.php) +2. If the triumph listens to a new event, it should: + - implement [TriumphSourceEventInterface](./Event/TriumphSourceEventInterface.php) + - be added to [TriumphSourceEventSubscriber](./Listener/TriumphSourceEventSubscriber.php) +3. Add the triumph log in [triumph+intl-icu.fr.xlf](./translations/fr/triumph+intl-icu.fr.xlf) + +### Concrete Example + +Here is how to implement "Chun lives!" personal Chun's triumph (+1 triumph / day): + +```php +new TriumphConfigDto( + key: TriumphEnum::CHUN_LIVES->toConfigKey('default'), + name: TriumphEnum::CHUN_LIVES, + targetedEvent: DaedalusCycleEvent::DAEDALUS_NEW_CYCLE, + targetedEventExpectedTags: [ + EventEnum::NEW_DAY, + ], + scope: TriumphScope::PERSONAL, + target: CharacterEnum::CHUN, + quantity: 1, +) +``` + +This triumph: +- Is triggered on each new cycle of the Daedalus (event: `DAEDALUS_NEW_CYCLE`) +- Only applies if the event has the tag `NEW_DAY` +- Uses the `PERSONAL` scope and `target` to award it to Chun only + diff --git a/Api/src/Triumph/Repository/TriumphConfigRepository.php b/Api/src/Triumph/Repository/TriumphConfigRepository.php new file mode 100644 index 0000000000..466ef13e56 --- /dev/null +++ b/Api/src/Triumph/Repository/TriumphConfigRepository.php @@ -0,0 +1,26 @@ + + */ +final class TriumphConfigRepository extends ServiceEntityRepository implements TriumphConfigRepositoryInterface +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, TriumphConfig::class); + } + + public function findAllByTargetedEvent(TriumphSourceEventInterface $targetedEvent): array + { + return $this->findBy(['targetedEvent' => $targetedEvent->getEventName()]); + } +} diff --git a/Api/src/Triumph/Repository/TriumphConfigRepositoryInterface.php b/Api/src/Triumph/Repository/TriumphConfigRepositoryInterface.php new file mode 100644 index 0000000000..08036b2889 --- /dev/null +++ b/Api/src/Triumph/Repository/TriumphConfigRepositoryInterface.php @@ -0,0 +1,16 @@ + + */ + public function findAllByTargetedEvent(TriumphSourceEventInterface $targetedEvent): array; +} diff --git a/Api/src/Triumph/Service/ChangeTriumphFromEventService.php b/Api/src/Triumph/Service/ChangeTriumphFromEventService.php new file mode 100644 index 0000000000..7c5a8ca786 --- /dev/null +++ b/Api/src/Triumph/Service/ChangeTriumphFromEventService.php @@ -0,0 +1,56 @@ +triumphConfigRepository->findAllByTargetedEvent($event); + + foreach ($triumphConfigs as $triumphConfig) { + if (!$event->hasExpectedTagsFor($triumphConfig)) { + continue; + } + + $event->getTargetsForTriumph($triumphConfig)->map( + fn (Player $player) => $this->addTriumphToPlayer($triumphConfig, $player) + ); + } + } + + private function addTriumphToPlayer(TriumphConfig $triumphConfig, Player $player): void + { + $quantity = $this->computeTriumphForPlayer($triumphConfig, $player); + + $player->addTriumph($quantity); + + $this->eventService->callEvent( + new TriumphChangedEvent($player, $triumphConfig, $quantity), + TriumphChangedEvent::class, + ); + } + + private function computeTriumphForPlayer(TriumphConfig $triumphConfig, Player $player): int + { + return match ($triumphConfig->getName()) { + TriumphEnum::SOL_MUSH_INTRUDER => $player->getDaedalus()->getMushPlayers()->getPlayerAlive()->count() * $triumphConfig->getQuantity(), + default => $triumphConfig->getQuantity(), + }; + } +} diff --git a/Api/src/Triumph/config/services.yaml b/Api/src/Triumph/config/services.yaml new file mode 100644 index 0000000000..2e93120f45 --- /dev/null +++ b/Api/src/Triumph/config/services.yaml @@ -0,0 +1,12 @@ +services: + _defaults: + autowire: true + autoconfigure: true + + Mush\Triumph\: + resource: '../' + exclude: + - '../DependencyInjection/' + - '../Entity/' + - '../Kernel.php' + - '../Tests/' \ No newline at end of file diff --git a/Api/tests/functional/Player/Event/PlayerCycleEventCest.php b/Api/tests/functional/Player/Event/PlayerCycleEventCest.php index 0e5291fe79..ab540efa8c 100644 --- a/Api/tests/functional/Player/Event/PlayerCycleEventCest.php +++ b/Api/tests/functional/Player/Event/PlayerCycleEventCest.php @@ -703,20 +703,17 @@ public function mankindOnlyHopeDoesNotWorkIfHolderIsDead(FunctionalTester $I): v $I->assertTrue($this->kuanTi->getMoralPoint() === 8 || $this->kuanTi->getMoralPoint() === 8 - $this->getPanicCrisisPlayerDamage()); } - /** - * @covers \Mush\Player\Service\PlayerService::handleTriumphChange - */ public function ensureTriumphIsGivenIfNotInactive(FunctionalTester $I): void { // Given the player has the status inactive. $this->statusService->createStatusFromName( statusName: PlayerStatusEnum::INACTIVE, - holder: $this->player, + holder: $this->player2, tags: [], time: new \DateTime() ); - $initialTriumph = $this->player->getTriumph(); + $initialTriumph = $this->player2->getTriumph(); // when the new day event is triggered $event = new DaedalusCycleEvent( @@ -727,7 +724,7 @@ public function ensureTriumphIsGivenIfNotInactive(FunctionalTester $I): void $this->eventService->callEvent($event, DaedalusCycleEvent::DAEDALUS_NEW_CYCLE); // The player should have the same amount of triumph as before. - $I->assertSame($initialTriumph, $this->player->getTriumph(), 'The triumph count has shifted when it shouldn\'t!'); + $I->assertSame($initialTriumph, $this->player2->getTriumph(), 'The triumph count has shifted when it shouldn\'t!'); } public function hyperactivePreventsLyingDownGainAndGivesMovementPoint(FunctionalTester $I): void diff --git a/Api/tests/functional/Triumph/Event/TriumphSourceEventCest.php b/Api/tests/functional/Triumph/Event/TriumphSourceEventCest.php new file mode 100644 index 0000000000..9991ceec98 --- /dev/null +++ b/Api/tests/functional/Triumph/Event/TriumphSourceEventCest.php @@ -0,0 +1,80 @@ +eventService = $I->grabService(EventServiceInterface::class); + } + + public function shouldGiveTriumphOnDaedalusNewCycle(FunctionalTester $I): void + { + $this->player->setTriumph(0); + + $event = new DaedalusCycleEvent( + daedalus: $this->daedalus, + tags: [], + time: new \DateTime(), + ); + $this->eventService->callEvent($event, DaedalusCycleEvent::DAEDALUS_NEW_CYCLE); + + // human cyclic triumph + $I->assertEquals(1, $this->player->getTriumph()); + } + + public function shouldGiveTriumphOnDaedalusFinished(FunctionalTester $I): void + { + $this->player->setTriumph(0); + + $event = new DaedalusEvent( + daedalus: $this->daedalus, + tags: [ActionEnum::RETURN_TO_SOL->toString()], + time: new \DateTime(), + ); + $this->eventService->callEvent($event, DaedalusEvent::FINISH_DAEDALUS); + + // return to sol human triumph + $I->assertEquals(20, $this->player->getTriumph()); + } + + public function shouldGiveTriumphOnDaedalusFull(FunctionalTester $I): void + { + $this->createExtraPlace(RoomEnum::FRONT_STORAGE, $I, $this->daedalus); + + $this->player->setTriumph(0); + $this->eventService->callEvent( + event: new PlayerEvent($this->player, [], new \DateTime()), + name: PlayerEvent::CONVERSION_PLAYER + ); + + $event = new DaedalusEvent( + daedalus: $this->daedalus, + tags: [], + time: new \DateTime(), + ); + $this->eventService->callEvent($event, DaedalusEvent::FULL_DAEDALUS); + + // Mush initial bonus triumph + $I->assertEquals(120, $this->player->getTriumph()); + } +} diff --git a/Api/tests/functional/Triumph/Service/ChangeTriumphFromEventServiceCest.php b/Api/tests/functional/Triumph/Service/ChangeTriumphFromEventServiceCest.php new file mode 100644 index 0000000000..1a907cce22 --- /dev/null +++ b/Api/tests/functional/Triumph/Service/ChangeTriumphFromEventServiceCest.php @@ -0,0 +1,51 @@ +changeTriumphFromEventService = $I->grabService(ChangeTriumphFromEventService::class); + } + + public function shouldPrintLogWhenTriumphIsChanged(FunctionalTester $I): void + { + $event = new DaedalusCycleEvent( + daedalus: $this->daedalus, + tags: [], + time: new \DateTime(), + ); + $event->setEventName(DaedalusCycleEvent::DAEDALUS_NEW_CYCLE); + + $this->changeTriumphFromEventService->execute($event); + + $this->ISeeTranslatedRoomLogInRepository( + expectedRoomLog: 'Vous gagnez 1 :triumph: car vous avez survécu un cycle de plus.', + actualRoomLogDto: new RoomLogDto( + player: $this->player, + log: TriumphEnum::CYCLE_HUMAN->toString(), + visibility: VisibilityEnum::PRIVATE, + inPlayerRoom: true, + ), + I: $I, + ); + } +} diff --git a/Api/tests/unit/Player/Service/PlayerServiceTest.php b/Api/tests/unit/Player/Service/PlayerServiceTest.php index cc2fdabb97..b826fe3fd9 100644 --- a/Api/tests/unit/Player/Service/PlayerServiceTest.php +++ b/Api/tests/unit/Player/Service/PlayerServiceTest.php @@ -28,8 +28,6 @@ use Mush\Player\Service\PlayerService; use Mush\RoomLog\Service\RoomLogServiceInterface; use Mush\Status\Entity\Config\StatusConfig; -use Mush\Status\Enum\PlayerStatusEnum; -use Mush\Status\Factory\StatusFactory; use Mush\User\Entity\User; use PHPUnit\Framework\TestCase; @@ -219,39 +217,6 @@ public function testShouldKillPlayerAtZeroMoraleAtCycleChange(): void $this->thenPlayerShouldBeDead($savedPlayer); } - public function testTriumphGainForHuman(): void - { - $this->roomLogService->shouldIgnoreMissing(); - - $player = PlayerFactory::createPlayerByNameAndDaedalus(CharacterEnum::ANDIE, DaedalusFactory::createDaedalus()); - $player->setTriumph(0); - $this->playerRepository->save($player); - - $this->whenIHandleNewCycleForPlayer($player); - - $savedPlayer = $this->playerRepository->findOneByName(CharacterEnum::ANDIE); - - self::assertSame(1, $savedPlayer->getTriumph()); - } - - public function testTriumphGainForMush(): void - { - $this->roomLogService->shouldIgnoreMissing(); - - $player = PlayerFactory::createPlayerByNameAndDaedalus(CharacterEnum::ANDIE, DaedalusFactory::createDaedalus()); - $player->setTriumph(120); - $this->playerRepository->save($player); - - // given player is mush - StatusFactory::createChargeStatusFromStatusName(PlayerStatusEnum::MUSH, $player); - - $this->whenIHandleNewCycleForPlayer($player); - - $savedPlayer = $this->playerRepository->findOneByName(CharacterEnum::ANDIE); - - self::assertSame(118, $savedPlayer->getTriumph()); - } - private function givenAndieWithMorale(int $morale): Player { $player = PlayerFactory::createPlayerByNameAndDaedalus(CharacterEnum::ANDIE, DaedalusFactory::createDaedalus()); diff --git a/Api/tests/unit/Triumph/Event/DaedalusFullEventTest.php b/Api/tests/unit/Triumph/Event/DaedalusFullEventTest.php new file mode 100644 index 0000000000..bd458adb89 --- /dev/null +++ b/Api/tests/unit/Triumph/Event/DaedalusFullEventTest.php @@ -0,0 +1,123 @@ +givenATriumphConfigRepository(); + $this->givenAnEventService(); + $this->givenAChangeTriumphFromEventService(); + } + + public function shouldMushPlayersGain120TriumphPointsWhenDaedalusIsFull(): void + { + $daedalus = DaedalusFactory::createDaedalus(); + $mushPlayer1 = $this->givenMushPlayer($daedalus); + $mushPlayer2 = $this->givenMushPlayer($daedalus); + $this->givenPlayersInitialTriumph([$mushPlayer1, $mushPlayer2], 0); + $this->givenATriumphConfig(TriumphEnum::MUSH_INITIAL_BONUS); + + $this->whenDaedalusIsFull($daedalus); + + $this->thenPlayersShouldHaveTriumph([$mushPlayer1, $mushPlayer2], 120); + } + + public function shouldHumanPlayersNotGainTriumphPointsWhenDaedalusIsFull(): void + { + $daedalus = DaedalusFactory::createDaedalus(); + $humanPlayer1 = PlayerFactory::createPlayerWithDaedalus($daedalus); + $humanPlayer2 = PlayerFactory::createPlayerWithDaedalus($daedalus); + $this->givenPlayersInitialTriumph([$humanPlayer1, $humanPlayer2], 0); + $this->givenATriumphConfig(TriumphEnum::MUSH_INITIAL_BONUS); + + $this->whenDaedalusIsFull($daedalus); + + $this->thenPlayersShouldHaveTriumph([$humanPlayer1, $humanPlayer2], 0); + } + + private function givenATriumphConfigRepository(): void + { + $this->triumphConfigRepository = new InMemoryTriumphConfigRepository(); + } + + private function givenAnEventService(): void + { + /** @var EventServiceInterface $eventService */ + $eventService = $this->createStub(EventServiceInterface::class); + $this->eventService = $eventService; + } + + private function givenAChangeTriumphFromEventService(): void + { + $this->changeTriumphFromEventService = new ChangeTriumphFromEventService( + eventService: $this->eventService, + triumphConfigRepository: $this->triumphConfigRepository, + ); + } + + private function givenMushPlayer(Daedalus $daedalus): Player + { + $player = PlayerFactory::createPlayerWithDaedalus($daedalus); + StatusFactory::createChargeStatusFromStatusName(PlayerStatusEnum::MUSH, $player); + + return $player; + } + + private function givenPlayersInitialTriumph(array $players, int $initialTriumph): void + { + foreach ($players as $player) { + $player->setTriumph($initialTriumph); + } + } + + private function givenATriumphConfig(TriumphEnum $triumphName): void + { + $triumphConfig = TriumphConfig::fromDto(TriumphConfigData::getByName($triumphName)); + $this->triumphConfigRepository->save($triumphConfig); + } + + private function whenDaedalusIsFull(Daedalus $daedalus): void + { + $event = new DaedalusEvent( + daedalus: $daedalus, + tags: [], + time: new \DateTime(), + ); + $event->setEventName(DaedalusEvent::FULL_DAEDALUS); + + $this->changeTriumphFromEventService->execute($event); + } + + private function thenPlayersShouldHaveTriumph(array $players, int $expectedTriumph): void + { + foreach ($players as $player) { + self::assertEquals($expectedTriumph, $player->getTriumph()); + } + } +} diff --git a/Api/tests/unit/Triumph/Event/FinishDaedalusEventTest.php b/Api/tests/unit/Triumph/Event/FinishDaedalusEventTest.php new file mode 100644 index 0000000000..3c0aef5ec7 --- /dev/null +++ b/Api/tests/unit/Triumph/Event/FinishDaedalusEventTest.php @@ -0,0 +1,161 @@ +givenATriumphConfigRepository(); + $this->givenAnEventService(); + $this->givenAChangeTriumphFromEventService(); + $this->givenADaedalusWithTwoPlayers(); + } + + public function testShouldGiveReturnToSolTriumphToAllHumanWhenReturningToSol(): void + { + $this->givenAReturnToSolTriumphConfig(); + + $this->whenDaedalusFinishesWithReturnToSol(); + + $this->thenAllPlayersHaveTriumphPoints(20); + } + + public function testShouldNotGiveReturnToSolTriumphToAllHumanWhenNotReturningToSol(): void + { + $this->givenAReturnToSolTriumphConfig(); + + $this->whenDaedalusFinishesWithoutReturnToSol(); + + $this->thenAllPlayersHaveTriumphPoints(0); + } + + public function testShouldGiveSolMushIntruderTriumphToAllHumansGivenNumberOfMushPlayers(): void + { + $this->givenASolMushIntruderTriumphConfig(); + + $this->givenPlayerIsMush($this->player2); + $player3 = PlayerFactory::createPlayerWithDaedalus($this->daedalus); + $this->givenPlayerIsMush($player3); + + $this->player->setTriumph(50); + + $this->whenDaedalusFinishesWithReturnToSol(); + + $this->thenPlayerShouldHaveTriumphPoints($this->player, 30); // 50 + (-10) * 2 + } + + private function givenATriumphConfigRepository(): void + { + $this->triumphConfigRepository = new InMemoryTriumphConfigRepository(); + } + + private function givenAnEventService(): void + { + /** @var EventServiceInterface $eventService */ + $eventService = $this->createStub(EventServiceInterface::class); + $this->eventService = $eventService; + } + + private function givenAChangeTriumphFromEventService(): void + { + $this->changeTriumphFromEventService = new ChangeTriumphFromEventService( + eventService: $this->eventService, + triumphConfigRepository: $this->triumphConfigRepository, + ); + } + + private function givenADaedalusWithTwoPlayers(): void + { + $this->daedalus = DaedalusFactory::createDaedalus(); + $this->player = PlayerFactory::createPlayerWithDaedalus($this->daedalus); + $this->player2 = PlayerFactory::createPlayerWithDaedalus($this->daedalus); + } + + private function givenAReturnToSolTriumphConfig(): void + { + $this->triumphConfigRepository->save( + TriumphConfig::fromDto(TriumphConfigData::getByName(TriumphEnum::RETURN_TO_SOL)) + ); + } + + private function givenASolMushIntruderTriumphConfig(): void + { + $this->triumphConfigRepository->save( + TriumphConfig::fromDto(TriumphConfigData::getByName(TriumphEnum::SOL_MUSH_INTRUDER)) + ); + } + + private function givenPlayerIsMush(Player $player): void + { + StatusFactory::createStatusByNameForHolder( + name: PlayerStatusEnum::MUSH, + holder: $player, + ); + } + + private function whenDaedalusFinishesWithReturnToSol(): void + { + $event = new DaedalusEvent( + daedalus: $this->daedalus, + tags: [ActionEnum::RETURN_TO_SOL->toString()], + time: new \DateTime(), + ); + $event->setEventName(DaedalusEvent::FINISH_DAEDALUS); + + $this->changeTriumphFromEventService->execute($event); + } + + private function whenDaedalusFinishesWithoutReturnToSol(): void + { + $event = new DaedalusEvent( + daedalus: $this->daedalus, + tags: [], + time: new \DateTime(), + ); + $event->setEventName(DaedalusEvent::FINISH_DAEDALUS); + + $this->changeTriumphFromEventService->execute($event); + } + + private function thenAllPlayersHaveTriumphPoints(int $expectedPoints): void + { + foreach ($this->daedalus->getAlivePlayers() as $player) { + self::assertEquals($expectedPoints, $player->getTriumph()); + } + } + + private function thenPlayerShouldHaveTriumphPoints(Player $player, int $expectedPoints): void + { + self::assertEquals($expectedPoints, $player->getTriumph()); + } +} diff --git a/Api/tests/unit/Triumph/Service/ChangeTriumphFromEventServiceTest.php b/Api/tests/unit/Triumph/Service/ChangeTriumphFromEventServiceTest.php new file mode 100644 index 0000000000..787a9d888a --- /dev/null +++ b/Api/tests/unit/Triumph/Service/ChangeTriumphFromEventServiceTest.php @@ -0,0 +1,252 @@ +eventService = \Mockery::spy(EventServiceInterface::class); + $this->triumphConfigRepository = new InMemoryTriumphConfigRepository(); + $this->service = new ChangeTriumphFromEventService( + eventService: $this->eventService, + triumphConfigRepository: $this->triumphConfigRepository, + ); + $this->daedalus = DaedalusFactory::createDaedalus(); + } + + public function testShouldGiveAllActiveHumanTriumphToAllHumanPlayers(): void + { + // Given + $player = $this->givenAHumanPlayer(); + $player2 = $this->givenAHumanPlayer(); + $this->givenTriumphConfigExists(TriumphEnum::CYCLE_HUMAN); + $event = $this->givenANewDaedalusCycleEvent($this->daedalus); + + // When + $this->whenChangingTriumphForEvent($event); + + // Then + $this->thenPlayerShouldHaveTriumph($player, 1); + $this->thenPlayerShouldHaveTriumph($player2, 1); + } + + public function testShouldNotGiveAllActiveHumanTriumphToInactivePlayers(): void + { + // Given + $player = $this->givenAHumanPlayer(); + $this->givenPlayerIsInactive($player); + $this->givenTriumphConfigExists(TriumphEnum::CYCLE_HUMAN); + $event = $this->givenANewDaedalusCycleEvent($this->daedalus); + + // When + $this->whenChangingTriumphForEvent($event); + + // Then + $this->thenPlayerShouldHaveTriumph($player, 0); + } + + public function testShouldGiveMushTargetTriumphToMushPlayer(): void + { + // Given + $player = $this->givenAMushPlayer(); + $player2 = $this->givenAMushPlayer(); + $this->givenTriumphConfigExists(TriumphEnum::CYCLE_MUSH); + $this->givenPlayerHasTriumph($player, 120); + $this->givenPlayerHasTriumph($player2, 120); + $event = $this->givenANewDaedalusCycleEvent($this->daedalus); + + // When + $this->whenChangingTriumphForEvent($event); + + // Then + $this->thenPlayerShouldHaveTriumph($player, 118); + $this->thenPlayerShouldHaveTriumph($player2, 118); + } + + public function testShouldGivePersonalTriumphToTargetedCharacter(): void + { + // Given + $player = $this->givenAPlayerWithCharacter(CharacterEnum::CHUN); + $this->givenTriumphConfigExists(TriumphEnum::CHUN_LIVES); + $event = $this->givenANewCycleEventWithTags($this->daedalus, [EventEnum::NEW_DAY]); + + // When + $this->whenChangingTriumphForEvent($event); + + // Then + $this->thenPlayerShouldHaveTriumph($player, 1); + } + + public function testShouldNotGivePersonalTriumphToOtherPlayer(): void + { + // Given + $player = $this->givenAHumanPlayer(); + $this->givenTriumphConfigExists(TriumphEnum::CHUN_LIVES); + $event = $this->givenANewCycleEventWithTags($this->daedalus, [EventEnum::NEW_DAY]); + + // When + $this->whenChangingTriumphForEvent($event); + + // Then + $this->thenPlayerShouldHaveTriumph($player, 0); + } + + public function testShouldNotGiveTriumphIfEventDoesNotHaveExpectedTags(): void + { + // Given + $player = $this->givenAPlayerWithCharacter(CharacterEnum::CHUN); + $this->givenTriumphConfigExists(TriumphEnum::CHUN_LIVES); + $event = $this->givenANewDaedalusCycleEvent($this->daedalus); + + // When + $this->whenChangingTriumphForEvent($event); + + // Then + $this->thenPlayerShouldHaveTriumph($player, 0); + } + + public function testShouldDispatchTriumphChangedEvent(): void + { + // Given + $player = $this->givenAHumanPlayer(); + $this->givenTriumphConfigExists(TriumphEnum::CYCLE_HUMAN); + $event = $this->givenANewDaedalusCycleEvent($this->daedalus); + + // When + $this->whenChangingTriumphForEvent($event); + + // Then + $this->thenTriumphChangedEventShouldBeDispatched(); + } + + public function testShouldNotGiveTriumphToDeadPlayer(): void + { + // Given + $player = $this->givenAHumanPlayer(); + $this->givenPlayerIsDead($player); + $this->givenTriumphConfigExists(TriumphEnum::CYCLE_HUMAN); + $event = $this->givenANewDaedalusCycleEvent($this->daedalus); + + // When + $this->whenChangingTriumphForEvent($event); + + // Then + $this->thenPlayerShouldHaveTriumph($player, 0); + } + + private function givenAHumanPlayer(): Player + { + return PlayerFactory::createPlayerWithDaedalus($this->daedalus); + } + + private function givenAMushPlayer(): Player + { + $player = PlayerFactory::createPlayerWithDaedalus($this->daedalus); + StatusFactory::createChargeStatusFromStatusName( + name: PlayerStatusEnum::MUSH, + holder: $player, + ); + + return $player; + } + + private function givenAPlayerWithCharacter(string $character): Player + { + return PlayerFactory::createPlayerByNameAndDaedalus($character, $this->daedalus); + } + + private function givenTriumphConfigExists(TriumphEnum $triumphName): void + { + $this->triumphConfigRepository->save( + TriumphConfig::fromDto( + TriumphConfigData::getByName($triumphName) + ) + ); + } + + private function givenPlayerHasTriumph(Player $player, int $triumph): void + { + $player->setTriumph($triumph); + } + + private function givenANewDaedalusCycleEvent(Daedalus $daedalus): DaedalusCycleEvent + { + $event = new DaedalusCycleEvent($daedalus, [], new \DateTime()); + $event->setEventName(DaedalusCycleEvent::DAEDALUS_NEW_CYCLE); + + return $event; + } + + private function givenANewCycleEventWithTags(Daedalus $daedalus, array $tags): DaedalusCycleEvent + { + $event = new DaedalusCycleEvent($daedalus, $tags, new \DateTime()); + $event->setEventName(DaedalusCycleEvent::DAEDALUS_NEW_CYCLE); + + return $event; + } + + private function givenPlayerIsInactive(Player $player): void + { + StatusFactory::createStatusByNameForHolder( + name: PlayerStatusEnum::INACTIVE, + holder: $player, + ); + } + + private function givenPlayerIsDead(Player $player): void + { + $player->kill(); + } + + private function whenChangingTriumphForEvent(TriumphSourceEventInterface $event): void + { + $this->service->execute($event); + } + + private function thenPlayerShouldHaveTriumph(Player $player, int $expectedTriumph): void + { + self::assertEquals( + expected: $expectedTriumph, + actual: $player->getTriumph(), + message: \sprintf('Player should have %d triumph', $expectedTriumph) + ); + } + + private function thenTriumphChangedEventShouldBeDispatched(): void + { + $this->eventService->shouldHaveReceived('callEvent')->once(); + } +} diff --git a/Api/tests/unit/Triumph/TestDoubles/Repository/InMemoryTriumphConfigRepository.php b/Api/tests/unit/Triumph/TestDoubles/Repository/InMemoryTriumphConfigRepository.php new file mode 100644 index 0000000000..c91f25dd8a --- /dev/null +++ b/Api/tests/unit/Triumph/TestDoubles/Repository/InMemoryTriumphConfigRepository.php @@ -0,0 +1,38 @@ +triumphConfigs as $triumphConfig) { + if ($triumphConfig->getTargetedEvent() === $targetedEvent->getEventName()) { + $triumphConfigs[] = $triumphConfig; + } + } + + return $triumphConfigs; + } + + public function save(TriumphConfig $triumphConfig): void + { + $this->triumphConfigs[] = $triumphConfig; + } + + public function clear(): void + { + $this->triumphConfigs = []; + } +} diff --git a/Api/translations/fr/triumph+intl-icu.fr.xlf b/Api/translations/fr/triumph+intl-icu.fr.xlf new file mode 100644 index 0000000000..b66af08da8 --- /dev/null +++ b/Api/translations/fr/triumph+intl-icu.fr.xlf @@ -0,0 +1,41 @@ + + + + + + cycle_human + Vous gagnez {quantity} :triumph: car vous avez survécu un cycle de plus. + + + + + cycle_mush + Vous perdez {quantity} :triumph_mush: car vous avez laissé ces humains survivre un cycle de plus. + + + + + chun_lives + Vous gagnez {quantity} :triumph: car vous avez survécu un jour de plus en tant que Chun ! + + + + + return_to_sol + Vous gagnez {quantity} :triumph: car vous êtes rentré sur Sol ! + + + + + sol_mush_intruder + Vous perdez {quantity} :triumph: car des Mushs vous ont suivis sur Sol... + + + + + mush_initial_bonus + Vous gagnez {quantity} :triumph_mush: car vous faites désormais partie du Mush ! + + + + diff --git a/App/src/components/Game/BannerPanel.vue b/App/src/components/Game/BannerPanel.vue index efdd97ca76..1d9f270fd8 100644 --- a/App/src/components/Game/BannerPanel.vue +++ b/App/src/components/Game/BannerPanel.vue @@ -59,7 +59,11 @@ - {{ player.triumph?.quantity }} + + {{ player.triumph?.quantity }} + + +