From c6b572a78b4a90fa85802d2a0254fbaa5197706e Mon Sep 17 00:00:00 2001 From: Evian Date: Wed, 30 Apr 2025 22:43:03 +0200 Subject: [PATCH 01/27] Create new TriumphConfig entity --- .../api_platform/resources/game_config.yaml | 2 +- .../resources/triumph_config.yaml | 2 +- .../serialization/triumph_config.yaml | 18 +- .../validation/triumph_config.yaml | 22 +- Api/config/packages/doctrine.yaml | 6 + Api/config/routes/annotations.yaml | 4 - Api/config/services.yaml | 1 + Api/migrations/Version20250501091856.php | 59 + Api/src/Daedalus/Factory/DaedalusFactory.php | 8 +- Api/src/Game/ConfigData/GameConfigData.php | 1507 ++++++++--------- .../Game/ConfigData/GameConfigDataLoader.php | 8 +- Api/src/Game/ConfigData/TriumphConfigData.php | 59 - .../ConfigData/TriumphConfigDataLoader.php | 39 - .../DataFixtures/TriumphConfigFixtures.php | 376 ---- Api/src/Game/Entity/GameConfig.php | 3 +- Api/src/Game/Entity/TriumphConfig.php | 98 -- Api/src/Game/Enum/TriumphEnum.php | 140 -- .../Game/Service/ConfigDataLoaderService.php | 2 +- Api/src/Player/Service/PlayerService.php | 4 +- .../Triumph/ConfigData/TriumphConfigData.php | 42 + .../ConfigData/TriumphConfigDataLoader.php | 28 + .../DataFixtures/TriumphConfigFixtures.php | 35 + Api/src/Triumph/Dto/TriumphConfigDto.php | 26 + Api/src/Triumph/Entity/TriumphConfig.php | 115 ++ .../Entity}/TriumphConfigCollection.php | 30 +- Api/src/Triumph/Enum/TriumphEnum.php | 17 + Api/src/Triumph/Enum/TriumphScope.php | 13 + Api/src/Triumph/Enum/TriumphTeam.php | 13 + Api/src/Triumph/Enum/TriumphVisibility.php | 17 + .../Repository/TriumphConfigRepository.php | 8 +- Api/src/Triumph/config/services.yaml | 12 + 31 files changed, 1186 insertions(+), 1528 deletions(-) create mode 100644 Api/migrations/Version20250501091856.php delete mode 100644 Api/src/Game/ConfigData/TriumphConfigData.php delete mode 100644 Api/src/Game/ConfigData/TriumphConfigDataLoader.php delete mode 100644 Api/src/Game/DataFixtures/TriumphConfigFixtures.php delete mode 100644 Api/src/Game/Entity/TriumphConfig.php delete mode 100644 Api/src/Game/Enum/TriumphEnum.php create mode 100644 Api/src/Triumph/ConfigData/TriumphConfigData.php create mode 100644 Api/src/Triumph/ConfigData/TriumphConfigDataLoader.php create mode 100644 Api/src/Triumph/DataFixtures/TriumphConfigFixtures.php create mode 100644 Api/src/Triumph/Dto/TriumphConfigDto.php create mode 100644 Api/src/Triumph/Entity/TriumphConfig.php rename Api/src/{Game/Entity/Collection => Triumph/Entity}/TriumphConfigCollection.php (60%) create mode 100644 Api/src/Triumph/Enum/TriumphEnum.php create mode 100644 Api/src/Triumph/Enum/TriumphScope.php create mode 100644 Api/src/Triumph/Enum/TriumphTeam.php create mode 100644 Api/src/Triumph/Enum/TriumphVisibility.php rename Api/src/{Game => Triumph}/Repository/TriumphConfigRepository.php (66%) create mode 100644 Api/src/Triumph/config/services.yaml 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..40e48698e3 100644 --- a/Api/config/api_platform/serialization/triumph_config.yaml +++ b/Api/config/api_platform/serialization/triumph_config.yaml @@ -1,4 +1,4 @@ -Mush\Game\Entity\TriumphConfig: +Mush\Triumph\Entity\TriumphConfig: attributes: id: groups: [ 'triumph_config_read' ] @@ -6,7 +6,19 @@ Mush\Game\Entity\TriumphConfig: groups: [ 'triumph_config_read', 'triumph_config_write' ] triumph: groups: [ 'triumph_config_read', 'triumph_config_write' ] - isAllCrew: + isIndividual: groups: [ 'triumph_config_read', 'triumph_config_write' ] team: - groups: [ 'triumph_config_read', 'triumph_config_write' ] \ No newline at end of file + 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' ] + regressiveFactor: + groups: [ 'triumph_config_read', 'triumph_config_write' ] + computeStrategy: + groups: [ 'triumph_config_read', 'triumph_config_write' ] + applicationStrategies: + groups: [ 'triumph_config_read', 'triumph_config_write' ] diff --git a/Api/config/api_platform/validation/triumph_config.yaml b/Api/config/api_platform/validation/triumph_config.yaml index 04d24f54fc..a6920fe677 100644 --- a/Api/config/api_platform/validation/triumph_config.yaml +++ b/Api/config/api_platform/validation/triumph_config.yaml @@ -1,14 +1,26 @@ -Mush\Game\Entity\TriumphConfig: +Mush\Triumph\Entity\TriumphConfig: properties: name: - NotBlank: ~ - Type: string - triumph: + scope: + - NotBlank: ~ + - Type: string + target: + - NotBlank: ~ + - Type: string + quantity: + - NotBlank: ~ + - Type: integer + visibility: + - NotBlank: ~ + - Type: string + regressiveFactor: - NotBlank: ~ - Type: integer - isAllCrew: + hasComputeStrategy: - NotBlank: ~ - Type: boolean - team: + applicationStrategies: - NotBlank: ~ - - Type: string \ No newline at end of file + - Type: array 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/Version20250501091856.php b/Api/migrations/Version20250501091856.php new file mode 100644 index 0000000000..a3c5183817 --- /dev/null +++ b/Api/migrations/Version20250501091856.php @@ -0,0 +1,59 @@ +addSql('DROP INDEX uniq_a53fc4e45e237e06'); + $this->addSql('ALTER TABLE triumph_config ADD key VARCHAR(255) DEFAULT \'\' NOT NULL'); + $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 target VARCHAR(255) DEFAULT \'\' NOT NULL'); + $this->addSql('ALTER TABLE triumph_config ADD quantity INT DEFAULT 0 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 ADD has_compute_strategy BOOLEAN DEFAULT false NOT NULL'); + $this->addSql('ALTER TABLE triumph_config ADD application_strategies TEXT DEFAULT \'a:0:{}\' NOT NULL'); + $this->addSql('ALTER TABLE triumph_config DROP triumph'); + $this->addSql('ALTER TABLE triumph_config DROP is_all_crew'); + $this->addSql('ALTER TABLE triumph_config DROP team'); + $this->addSql('ALTER TABLE triumph_config ALTER name SET DEFAULT \'\''); + $this->addSql('COMMENT ON COLUMN triumph_config.application_strategies IS \'(DC2Type:array)\''); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('ALTER TABLE triumph_config ADD triumph INT NOT NULL DEFAULT 0'); + $this->addSql('ALTER TABLE triumph_config ADD is_all_crew BOOLEAN NOT NULL DEFAULT false'); + $this->addSql('ALTER TABLE triumph_config ADD team VARCHAR(255) NOT NULL DEFAULT \'\''); + $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 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 DROP has_compute_strategy'); + $this->addSql('ALTER TABLE triumph_config DROP application_strategies'); + $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/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..63b7ded64e 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', - ], - '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', + 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' => [ - '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, + '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, + ], ], - ], - ]; + ]; + } } 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/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 @@ -getTriumphConfig()->getByNameOrThrow(TriumphEnum::CYCLE_HUMAN); $mushTriumph = $gameConfig->getTriumphConfig()->getByNameOrThrow(TriumphEnum::CYCLE_MUSH); - $triumphChange = $player->isMush() ? $mushTriumph->getTriumph() : $humanTriumph->getTriumph(); + $triumphChange = $player->isMush() ? $mushTriumph->getQuantity() : $humanTriumph->getQuantity(); $player->addTriumph($triumphChange); diff --git a/Api/src/Triumph/ConfigData/TriumphConfigData.php b/Api/src/Triumph/ConfigData/TriumphConfigData.php new file mode 100644 index 0000000000..2df61b0a91 --- /dev/null +++ b/Api/src/Triumph/ConfigData/TriumphConfigData.php @@ -0,0 +1,42 @@ + + */ + 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::HUMAN_TARGET, + quantity: 1, + ), + new TriumphConfigDto( + key: TriumphEnum::CYCLE_MUSH->toConfigKey('default'), + name: TriumphEnum::CYCLE_MUSH, + targetedEvent: PlayerCycleEvent::PLAYER_NEW_CYCLE, + scope: TriumphScope::MUSH_TARGET, + quantity: -2, + ), + ]; + } + + public static function getByName(string $name): TriumphConfigDto + { + return array_filter(self::getAll(), static fn (TriumphConfigDto $config) => $config->name === $name)[0]; + } +} 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..3e98cbfdc2 --- /dev/null +++ b/Api/src/Triumph/DataFixtures/TriumphConfigFixtures.php @@ -0,0 +1,35 @@ +getReference(GameConfigFixtures::DEFAULT_GAME_CONFIG); + + foreach (TriumphConfigData::getAll() as $triumphConfigDto) { + $triumphConfig = TriumphConfig::fromDto($triumphConfigDto); + $manager->persist($triumphConfig); + $this->addReference($triumphConfigDto->name->value, $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..40160418ba --- /dev/null +++ b/Api/src/Triumph/Dto/TriumphConfigDto.php @@ -0,0 +1,26 @@ + ''])] + private string $key; + + #[ORM\Column(type: 'string', nullable: false, enumType: TriumphEnum::class, options: ['default' => TriumphEnum::NULL])] + private TriumphEnum $name; + + #[ORM\Column(type: 'string', nullable: false, enumType: TriumphScope::class, options: ['default' => TriumphScope::NULL])] + private TriumphScope $scope; + + #[ORM\Column(type: 'string', nullable: false, options: ['default' => ''])] + private string $targetedEvent; + + #[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::NULL])] + private TriumphVisibility $visibility; + + #[ORM\Column(type: 'integer', nullable: false, options: ['default' => 0])] + private int $regressiveFactor; + + #[ORM\Column(type: 'boolean', nullable: false, options: ['default' => false])] + private bool $hasComputeStrategy; + + #[ORM\Column(type: 'array', nullable: false, options: ['default' => 'a:0:{}'])] + private array $applicationStrategies; + + private function __construct( + string $key, + TriumphEnum $name, + TriumphScope $scope, + string $targetedEvent, + string $target, + int $quantity, + TriumphVisibility $visibility, + int $regressiveFactor, + bool $hasComputeStrategy, + array $applicationStrategies, + ) { + $this->key = $key; + $this->name = $name; + $this->scope = $scope; + $this->targetedEvent = $targetedEvent; + $this->target = $target; + $this->quantity = $quantity; + $this->visibility = $visibility; + $this->regressiveFactor = $regressiveFactor; + $this->hasComputeStrategy = $hasComputeStrategy; + $this->applicationStrategies = $applicationStrategies; + } + + public function getName(): TriumphEnum + { + return $this->name; + } + + public function getQuantity(): int + { + return $this->quantity; + } + + public static function fromDto(TriumphConfigDto $triumphConfigDto): self + { + return new self( + $triumphConfigDto->key, + $triumphConfigDto->name, + $triumphConfigDto->scope, + $triumphConfigDto->targetedEvent, + $triumphConfigDto->target, + $triumphConfigDto->quantity, + $triumphConfigDto->visibility, + $triumphConfigDto->regressiveFactor, + $triumphConfigDto->hasComputeStrategy, + $triumphConfigDto->applicationStrategies, + ); + } + + public function updateFromDto(TriumphConfigDto $triumphConfigDto): void + { + $this->key = $triumphConfigDto->key; + $this->name = $triumphConfigDto->name; + $this->scope = $triumphConfigDto->scope; + $this->targetedEvent = $triumphConfigDto->targetedEvent; + $this->target = $triumphConfigDto->target; + $this->quantity = $triumphConfigDto->quantity; + $this->visibility = $triumphConfigDto->visibility; + $this->regressiveFactor = $triumphConfigDto->regressiveFactor; + $this->hasComputeStrategy = $triumphConfigDto->hasComputeStrategy; + $this->applicationStrategies = $triumphConfigDto->applicationStrategies; + } +} diff --git a/Api/src/Game/Entity/Collection/TriumphConfigCollection.php b/Api/src/Triumph/Entity/TriumphConfigCollection.php similarity index 60% rename from Api/src/Game/Entity/Collection/TriumphConfigCollection.php rename to Api/src/Triumph/Entity/TriumphConfigCollection.php index 385fe36023..cc7a2568ee 100644 --- a/Api/src/Game/Entity/Collection/TriumphConfigCollection.php +++ b/Api/src/Triumph/Entity/TriumphConfigCollection.php @@ -1,27 +1,20 @@ */ -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"); @@ -29,4 +22,13 @@ public function getByNameOrThrow(string $name): TriumphConfig 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..556890dfb8 --- /dev/null +++ b/Api/src/Triumph/Enum/TriumphEnum.php @@ -0,0 +1,17 @@ +value . '_' . $configKey; + } +} diff --git a/Api/src/Triumph/Enum/TriumphScope.php b/Api/src/Triumph/Enum/TriumphScope.php new file mode 100644 index 0000000000..a6055baa57 --- /dev/null +++ b/Api/src/Triumph/Enum/TriumphScope.php @@ -0,0 +1,13 @@ +value; + } +} diff --git a/Api/src/Game/Repository/TriumphConfigRepository.php b/Api/src/Triumph/Repository/TriumphConfigRepository.php similarity index 66% rename from Api/src/Game/Repository/TriumphConfigRepository.php rename to Api/src/Triumph/Repository/TriumphConfigRepository.php index 84bb6462f3..b80817d894 100644 --- a/Api/src/Game/Repository/TriumphConfigRepository.php +++ b/Api/src/Triumph/Repository/TriumphConfigRepository.php @@ -1,15 +1,17 @@ */ -class TriumphConfigRepository extends ServiceEntityRepository +final class TriumphConfigRepository extends ServiceEntityRepository { public function __construct(ManagerRegistry $registry) { 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 From c08839495e6f85023b75556ee7a248705728f0d3 Mon Sep 17 00:00:00 2001 From: Evian Date: Thu, 1 May 2025 12:25:17 +0200 Subject: [PATCH 02/27] First version of the service computing the triumph when listening to PlayerNewCycle event. It currently handles triumph for individual human and mush targets, and personal ones. Next step is listing all triumph given at cycle change, and cover different scopes, then let's do that for all events. --- ...01091856.php => Version20250501102308.php} | 22 ++- .../Entity/Collection/PlayerCollection.php | 5 + Api/src/Player/Event/PlayerCycleEvent.php | 21 ++- .../Triumph/ConfigData/TriumphConfigData.php | 24 +++- Api/src/Triumph/Dto/TriumphConfigDto.php | 1 + Api/src/Triumph/Entity/TriumphConfig.php | 27 ++++ Api/src/Triumph/Enum/TriumphEnum.php | 1 + Api/src/Triumph/Enum/TriumphScope.php | 1 + .../Event/TriumphSourceEventInterface.php | 17 +++ .../Repository/TriumphConfigRepository.php | 8 +- .../TriumphConfigRepositoryInterface.php | 16 +++ .../Service/ChangeTriumphFromEventService.php | 31 ++++ .../ChangeTriumphFromEventServiceTest.php | 133 ++++++++++++++++++ .../InMemoryTriumphConfigRepository.php | 36 +++++ 14 files changed, 324 insertions(+), 19 deletions(-) rename Api/migrations/{Version20250501091856.php => Version20250501102308.php} (73%) create mode 100644 Api/src/Triumph/Event/TriumphSourceEventInterface.php create mode 100644 Api/src/Triumph/Repository/TriumphConfigRepositoryInterface.php create mode 100644 Api/src/Triumph/Service/ChangeTriumphFromEventService.php create mode 100644 Api/tests/unit/Triumph/Service/ChangeTriumphFromEventServiceTest.php create mode 100644 Api/tests/unit/Triumph/TestDoubles/Repository/InMemoryTriumphConfigRepository.php diff --git a/Api/migrations/Version20250501091856.php b/Api/migrations/Version20250501102308.php similarity index 73% rename from Api/migrations/Version20250501091856.php rename to Api/migrations/Version20250501102308.php index a3c5183817..19abbbbadd 100644 --- a/Api/migrations/Version20250501091856.php +++ b/Api/migrations/Version20250501102308.php @@ -10,7 +10,7 @@ /** * Auto-generated Migration: Please modify to your needs! */ -final class Version20250501091856 extends AbstractMigration +final class Version20250501102308 extends AbstractMigration { public function getDescription(): string { @@ -21,39 +21,37 @@ public function up(Schema $schema): void { // this up() migration is auto-generated, please modify it to your needs $this->addSql('DROP INDEX uniq_a53fc4e45e237e06'); - $this->addSql('ALTER TABLE triumph_config ADD key VARCHAR(255) DEFAULT \'\' NOT NULL'); $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 quantity INT DEFAULT 0 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 ADD has_compute_strategy BOOLEAN DEFAULT false NOT NULL'); $this->addSql('ALTER TABLE triumph_config ADD application_strategies TEXT DEFAULT \'a:0:{}\' NOT NULL'); - $this->addSql('ALTER TABLE triumph_config DROP triumph'); - $this->addSql('ALTER TABLE triumph_config DROP is_all_crew'); - $this->addSql('ALTER TABLE triumph_config DROP team'); $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('ALTER TABLE triumph_config RENAME COLUMN is_all_crew TO has_compute_strategy'); + $this->addSql('COMMENT ON COLUMN triumph_config.targeted_event_expected_tags IS \'(DC2Type:array)\''); $this->addSql('COMMENT ON COLUMN triumph_config.application_strategies IS \'(DC2Type:array)\''); } public function down(Schema $schema): void { // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE SCHEMA public'); - $this->addSql('ALTER TABLE triumph_config ADD triumph INT NOT NULL DEFAULT 0'); - $this->addSql('ALTER TABLE triumph_config ADD is_all_crew BOOLEAN NOT NULL DEFAULT false'); - $this->addSql('ALTER TABLE triumph_config ADD team VARCHAR(255) NOT NULL DEFAULT \'\''); + $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 DROP has_compute_strategy'); $this->addSql('ALTER TABLE triumph_config DROP application_strategies'); $this->addSql('ALTER TABLE triumph_config ALTER name DROP DEFAULT'); + $this->addSql('ALTER TABLE triumph_config RENAME COLUMN has_compute_strategy TO is_all_crew'); $this->addSql('CREATE UNIQUE INDEX uniq_a53fc4e45e237e06 ON triumph_config (name)'); } } diff --git a/Api/src/Player/Entity/Collection/PlayerCollection.php b/Api/src/Player/Entity/Collection/PlayerCollection.php index 51c540f0b5..a909508cc5 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)); diff --git a/Api/src/Player/Event/PlayerCycleEvent.php b/Api/src/Player/Event/PlayerCycleEvent.php index 01268326bc..b030ca8e9b 100644 --- a/Api/src/Player/Event/PlayerCycleEvent.php +++ b/Api/src/Player/Event/PlayerCycleEvent.php @@ -4,9 +4,13 @@ use Mush\Game\Event\AbstractGameEvent; use Mush\Modifier\Entity\Collection\ModifierCollection; +use Mush\Player\Entity\Collection\PlayerCollection; use Mush\Player\Entity\Player; +use Mush\Triumph\Entity\TriumphConfig; +use Mush\Triumph\Enum\TriumphScope; +use Mush\Triumph\Event\TriumphSourceEventInterface; -class PlayerCycleEvent extends AbstractGameEvent +class PlayerCycleEvent extends AbstractGameEvent implements TriumphSourceEventInterface { public const string PLAYER_NEW_CYCLE = 'player.new.cycle'; @@ -43,4 +47,19 @@ public function getModifiersByPriorities(array $priorities): ModifierCollection return $modifiers; } + + public function getTargetsForTriumph(TriumphConfig $triumphConfig): PlayerCollection + { + return match ($triumphConfig->getScope()) { + TriumphScope::HUMAN_TARGET => $this->player->getDaedalus()->getAlivePlayers()->getHumanPlayer(), + TriumphScope::MUSH_TARGET => $this->player->getDaedalus()->getAlivePlayers()->getMushPlayer(), + TriumphScope::PERSONAL => $this->player->getDaedalus()->getAlivePlayers()->getAllByName($triumphConfig->getTarget()), + default => throw new \LogicException("Unsupported triumph scope: {$triumphConfig->getScope()->value}"), + }; + } + + public function hasExpectedTags(TriumphConfig $triumphConfig): bool + { + return $this->hasAllTags($triumphConfig->getTargetedEventExpectedTags()); + } } diff --git a/Api/src/Triumph/ConfigData/TriumphConfigData.php b/Api/src/Triumph/ConfigData/TriumphConfigData.php index 2df61b0a91..ee43c45058 100644 --- a/Api/src/Triumph/ConfigData/TriumphConfigData.php +++ b/Api/src/Triumph/ConfigData/TriumphConfigData.php @@ -4,7 +4,8 @@ namespace Mush\Triumph\ConfigData; -use Mush\Daedalus\Event\DaedalusCycleEvent; +use Mush\Game\Enum\CharacterEnum; +use Mush\Game\Enum\EventEnum; use Mush\Player\Event\PlayerCycleEvent; use Mush\Triumph\Dto\TriumphConfigDto; use Mush\Triumph\Enum\TriumphEnum; @@ -13,7 +14,7 @@ abstract class TriumphConfigData { /** - * @var array + * @return array */ public static function getAll(): array { @@ -21,7 +22,7 @@ public static function getAll(): array new TriumphConfigDto( key: TriumphEnum::CYCLE_HUMAN->toConfigKey('default'), name: TriumphEnum::CYCLE_HUMAN, - targetedEvent: DaedalusCycleEvent::DAEDALUS_NEW_CYCLE, + targetedEvent: PlayerCycleEvent::PLAYER_NEW_CYCLE, scope: TriumphScope::HUMAN_TARGET, quantity: 1, ), @@ -32,11 +33,24 @@ public static function getAll(): array scope: TriumphScope::MUSH_TARGET, quantity: -2, ), + new TriumphConfigDto( + key: TriumphEnum::CHUN_LIVES->toConfigKey('default'), + name: TriumphEnum::CHUN_LIVES, + targetedEvent: PlayerCycleEvent::PLAYER_NEW_CYCLE, + targetedEventExpectedTags: [ + EventEnum::NEW_DAY, + ], + scope: TriumphScope::PERSONAL, + target: CharacterEnum::CHUN, + quantity: 1, + ), ]; } - public static function getByName(string $name): TriumphConfigDto + public static function getByName(TriumphEnum $name): TriumphConfigDto { - return array_filter(self::getAll(), static fn (TriumphConfigDto $config) => $config->name === $name)[0]; + return current( + array_filter(self::getAll(), static fn (TriumphConfigDto $dto) => $dto->name === $name) + ); } } diff --git a/Api/src/Triumph/Dto/TriumphConfigDto.php b/Api/src/Triumph/Dto/TriumphConfigDto.php index 40160418ba..88f05ed3ee 100644 --- a/Api/src/Triumph/Dto/TriumphConfigDto.php +++ b/Api/src/Triumph/Dto/TriumphConfigDto.php @@ -17,6 +17,7 @@ public function __construct( public string $targetedEvent, public int $quantity, public bool $hasComputeStrategy = false, + public array $targetedEventExpectedTags = [], public TriumphVisibility $visibility = TriumphVisibility::PRIVATE, public string $target = '', public int $regressiveFactor = 0, diff --git a/Api/src/Triumph/Entity/TriumphConfig.php b/Api/src/Triumph/Entity/TriumphConfig.php index 5effed56c4..2e7c7538ab 100644 --- a/Api/src/Triumph/Entity/TriumphConfig.php +++ b/Api/src/Triumph/Entity/TriumphConfig.php @@ -31,6 +31,9 @@ class TriumphConfig #[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; @@ -54,6 +57,7 @@ private function __construct( TriumphEnum $name, TriumphScope $scope, string $targetedEvent, + array $targetedEventExpectedTags, string $target, int $quantity, TriumphVisibility $visibility, @@ -65,6 +69,7 @@ private function __construct( $this->name = $name; $this->scope = $scope; $this->targetedEvent = $targetedEvent; + $this->targetedEventExpectedTags = $targetedEventExpectedTags; $this->target = $target; $this->quantity = $quantity; $this->visibility = $visibility; @@ -83,6 +88,26 @@ 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 static function fromDto(TriumphConfigDto $triumphConfigDto): self { return new self( @@ -90,6 +115,7 @@ public static function fromDto(TriumphConfigDto $triumphConfigDto): self $triumphConfigDto->name, $triumphConfigDto->scope, $triumphConfigDto->targetedEvent, + $triumphConfigDto->targetedEventExpectedTags, $triumphConfigDto->target, $triumphConfigDto->quantity, $triumphConfigDto->visibility, @@ -105,6 +131,7 @@ public function updateFromDto(TriumphConfigDto $triumphConfigDto): void $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; diff --git a/Api/src/Triumph/Enum/TriumphEnum.php b/Api/src/Triumph/Enum/TriumphEnum.php index 556890dfb8..7c01632834 100644 --- a/Api/src/Triumph/Enum/TriumphEnum.php +++ b/Api/src/Triumph/Enum/TriumphEnum.php @@ -8,6 +8,7 @@ enum TriumphEnum: string { case CYCLE_HUMAN = 'cycle_human'; case CYCLE_MUSH = 'cycle_mush'; + case CHUN_LIVES = 'chun_lives'; case NULL = ''; public function toConfigKey(string $configKey): string diff --git a/Api/src/Triumph/Enum/TriumphScope.php b/Api/src/Triumph/Enum/TriumphScope.php index a6055baa57..dc0f5542d6 100644 --- a/Api/src/Triumph/Enum/TriumphScope.php +++ b/Api/src/Triumph/Enum/TriumphScope.php @@ -8,6 +8,7 @@ enum TriumphScope: string { case HUMAN_TARGET = 'human_target'; case MUSH_TARGET = 'mush_target'; + case PERSONAL = 'personal'; case NULL = ''; } diff --git a/Api/src/Triumph/Event/TriumphSourceEventInterface.php b/Api/src/Triumph/Event/TriumphSourceEventInterface.php new file mode 100644 index 0000000000..0f454f361a --- /dev/null +++ b/Api/src/Triumph/Event/TriumphSourceEventInterface.php @@ -0,0 +1,17 @@ + */ -final class TriumphConfigRepository extends ServiceEntityRepository +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..6584eec7f0 --- /dev/null +++ b/Api/src/Triumph/Service/ChangeTriumphFromEventService.php @@ -0,0 +1,31 @@ +triumphConfigRepository->findAllByTargetedEvent($event); + + foreach ($triumphConfigs as $triumphConfig) { + if (!$event->hasExpectedTags($triumphConfig)) { + continue; + } + + $event->getTargetsForTriumph($triumphConfig)->map( + static fn (Player $player) => $player->addTriumph($triumphConfig->getQuantity()) + ); + } + } +} diff --git a/Api/tests/unit/Triumph/Service/ChangeTriumphFromEventServiceTest.php b/Api/tests/unit/Triumph/Service/ChangeTriumphFromEventServiceTest.php new file mode 100644 index 0000000000..e0b32d09b4 --- /dev/null +++ b/Api/tests/unit/Triumph/Service/ChangeTriumphFromEventServiceTest.php @@ -0,0 +1,133 @@ +triumphConfigRepository = new InMemoryTriumphConfigRepository(); + $this->service = new ChangeTriumphFromEventService($this->triumphConfigRepository); + $this->daedalus = DaedalusFactory::createDaedalus(); + } + + public function testShouldGiveHumanTargetTriumphToHumanPlayer(): void + { + $this->triumphConfigRepository->save( + TriumphConfig::fromDto( + TriumphConfigData::getByName(TriumphEnum::CYCLE_HUMAN) + ) + ); + + $player = PlayerFactory::createPlayerWithDaedalus($this->daedalus); + $event = new PlayerCycleEvent($player, [], new \DateTime()); + $event->setEventName(PlayerCycleEvent::PLAYER_NEW_CYCLE); + + $this->service->execute($event); + + self::assertEquals(1, $player->getTriumph(), 'Player should have 1 triumph'); + } + + public function testShouldGiveMushTargetTriumphToMushPlayer(): void + { + $this->triumphConfigRepository->save( + TriumphConfig::fromDto( + TriumphConfigData::getByName(TriumphEnum::CYCLE_MUSH) + ) + ); + + $player = PlayerFactory::createPlayerWithDaedalus($this->daedalus); + StatusFactory::createChargeStatusFromStatusName( + name: PlayerStatusEnum::MUSH, + holder: $player, + ); + $player->setTriumph(120); + + $event = new PlayerCycleEvent($player, [], new \DateTime()); + $event->setEventName(PlayerCycleEvent::PLAYER_NEW_CYCLE); + + $this->service->execute($event); + + self::assertEquals(118, $player->getTriumph(), 'Player should have 118 triumphs'); + } + + public function testShouldGivePersonalTriumphToTargetedCharacter(): void + { + $this->triumphConfigRepository->save( + TriumphConfig::fromDto( + TriumphConfigData::getByName(TriumphEnum::CHUN_LIVES) + ) + ); + + $player = PlayerFactory::createPlayerByNameAndDaedalus(CharacterEnum::CHUN, $this->daedalus); + $event = new PlayerCycleEvent($player, [EventEnum::NEW_DAY], new \DateTime()); + $event->setEventName(PlayerCycleEvent::PLAYER_NEW_CYCLE); + + $this->service->execute($event); + + self::assertEquals(1, $player->getTriumph(), 'Player should have 1 triumph'); + } + + public function testShouldNotGivePersonalTriumphToOtherPlayer(): void + { + $this->triumphConfigRepository->save( + TriumphConfig::fromDto( + TriumphConfigData::getByName(TriumphEnum::CHUN_LIVES) + ) + ); + + $player = PlayerFactory::createPlayerWithDaedalus($this->daedalus); + $event = new PlayerCycleEvent($player, [EventEnum::NEW_DAY], new \DateTime()); + $event->setEventName(PlayerCycleEvent::PLAYER_NEW_CYCLE); + + $this->service->execute($event); + + self::assertEquals(0, $player->getTriumph(), 'Player should have 0 triumph'); + } + + public function testShouldNotGiveTriumphIfEventDoesNotHaveExpectedTags(): void + { + // Chun lives expected "NEW_DAY" tag + $this->triumphConfigRepository->save( + TriumphConfig::fromDto( + TriumphConfigData::getByName(TriumphEnum::CHUN_LIVES) + ) + ); + + $player = PlayerFactory::createPlayerByNameAndDaedalus(CharacterEnum::CHUN, $this->daedalus); + $event = new PlayerCycleEvent($player, [], new \DateTime()); + $event->setEventName(PlayerCycleEvent::PLAYER_NEW_CYCLE); + + $this->service->execute($event); + + self::assertEquals(0, $player->getTriumph(), 'Player should have 0 triumph'); + } +} 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..34d8f27952 --- /dev/null +++ b/Api/tests/unit/Triumph/TestDoubles/Repository/InMemoryTriumphConfigRepository.php @@ -0,0 +1,36 @@ +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 = []; + } +} From 65c71954a7fdaf103ce6015b58bdebdb6a666f18 Mon Sep 17 00:00:00 2001 From: Evian Date: Thu, 1 May 2025 18:37:07 +0200 Subject: [PATCH 03/27] Example of giving triumph targeting Daedalus Finished event --- Api/src/Daedalus/Event/DaedalusCycleEvent.php | 19 ++++- .../Triumph/ConfigData/TriumphConfigData.php | 12 +++ Api/src/Triumph/Enum/TriumphEnum.php | 1 + Api/src/Triumph/Enum/TriumphScope.php | 1 + .../Triumph/Event/FinishDaedalusEventTest.php | 81 +++++++++++++++++++ 5 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 Api/tests/unit/Triumph/Event/FinishDaedalusEventTest.php diff --git a/Api/src/Daedalus/Event/DaedalusCycleEvent.php b/Api/src/Daedalus/Event/DaedalusCycleEvent.php index 76d3ba819d..86af214762 100644 --- a/Api/src/Daedalus/Event/DaedalusCycleEvent.php +++ b/Api/src/Daedalus/Event/DaedalusCycleEvent.php @@ -5,8 +5,12 @@ 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; -class DaedalusCycleEvent extends AbstractGameEvent +class DaedalusCycleEvent extends AbstractGameEvent implements TriumphSourceEventInterface { public const string DAEDALUS_NEW_CYCLE = 'daedalus.new.cycle'; @@ -44,4 +48,17 @@ public function getLinkWithSolCycleKillChance(): int { return $this->daedalus->getGameConfig()->getDifficultyConfig()->getLinkWithSolCycleFailureRate(); } + + public function getTargetsForTriumph(TriumphConfig $triumphConfig): PlayerCollection + { + return match ($triumphConfig->getScope()) { + TriumphScope::ALL_HUMAN => $this->daedalus->getAlivePlayers(), + default => throw new \LogicException('Unsupported triumph scope: ' . $triumphConfig->getScope()), + }; + } + + public function hasExpectedTags(TriumphConfig $triumphConfig): bool + { + return $this->hasAllTags($triumphConfig->getTargetedEventExpectedTags()); + } } diff --git a/Api/src/Triumph/ConfigData/TriumphConfigData.php b/Api/src/Triumph/ConfigData/TriumphConfigData.php index ee43c45058..bd411a5d5b 100644 --- a/Api/src/Triumph/ConfigData/TriumphConfigData.php +++ b/Api/src/Triumph/ConfigData/TriumphConfigData.php @@ -4,6 +4,8 @@ namespace Mush\Triumph\ConfigData; +use Mush\Action\Enum\ActionEnum; +use Mush\Daedalus\Event\DaedalusEvent; use Mush\Game\Enum\CharacterEnum; use Mush\Game\Enum\EventEnum; use Mush\Player\Event\PlayerCycleEvent; @@ -44,6 +46,16 @@ public static function getAll(): array 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_HUMAN, + quantity: 20, + ), ]; } diff --git a/Api/src/Triumph/Enum/TriumphEnum.php b/Api/src/Triumph/Enum/TriumphEnum.php index 7c01632834..d0456e496f 100644 --- a/Api/src/Triumph/Enum/TriumphEnum.php +++ b/Api/src/Triumph/Enum/TriumphEnum.php @@ -9,6 +9,7 @@ enum TriumphEnum: string case CYCLE_HUMAN = 'cycle_human'; case CYCLE_MUSH = 'cycle_mush'; case CHUN_LIVES = 'chun_lives'; + case RETURN_TO_SOL = 'return_to_sol'; case NULL = ''; public function toConfigKey(string $configKey): string diff --git a/Api/src/Triumph/Enum/TriumphScope.php b/Api/src/Triumph/Enum/TriumphScope.php index dc0f5542d6..2fea0614bc 100644 --- a/Api/src/Triumph/Enum/TriumphScope.php +++ b/Api/src/Triumph/Enum/TriumphScope.php @@ -6,6 +6,7 @@ enum TriumphScope: string { + case ALL_HUMAN = 'all_human'; case HUMAN_TARGET = 'human_target'; case MUSH_TARGET = 'mush_target'; case PERSONAL = 'personal'; diff --git a/Api/tests/unit/Triumph/Event/FinishDaedalusEventTest.php b/Api/tests/unit/Triumph/Event/FinishDaedalusEventTest.php new file mode 100644 index 0000000000..a7c62fbc16 --- /dev/null +++ b/Api/tests/unit/Triumph/Event/FinishDaedalusEventTest.php @@ -0,0 +1,81 @@ +triumphConfigRepository = new InMemoryTriumphConfigRepository(); + $this->changeTriumphFromEventService = new ChangeTriumphFromEventService($this->triumphConfigRepository); + + $this->daedalus = DaedalusFactory::createDaedalus(); + $this->player = PlayerFactory::createPlayerWithDaedalus($this->daedalus); + $this->player2 = PlayerFactory::createPlayerWithDaedalus($this->daedalus); + } + + public function testShouldGiveReturnToSolTriumphToAllHumanWhenReturningToSol(): void + { + $this->triumphConfigRepository->save( + TriumphConfig::fromDto(TriumphConfigData::getByName(TriumphEnum::RETURN_TO_SOL)) + ); + + $event = new DaedalusEvent( + daedalus: $this->daedalus, + tags: [ActionEnum::RETURN_TO_SOL->toString()], + time: new \DateTime(), + ); + $event->setEventName(DaedalusEvent::FINISH_DAEDALUS); + + $this->changeTriumphFromEventService->execute($event); + + foreach ($this->daedalus->getAlivePlayers() as $player) { + self::assertEquals(20, $player->getTriumph()); + } + } + + public function testShouldNotGiveReturnToSolTriumphToAllHumanWhenNotReturningToSol(): void + { + $this->triumphConfigRepository->save( + TriumphConfig::fromDto(TriumphConfigData::getByName(TriumphEnum::RETURN_TO_SOL)) + ); + + $event = new DaedalusEvent( + daedalus: $this->daedalus, + tags: [], + time: new \DateTime(), + ); + $event->setEventName(DaedalusEvent::FINISH_DAEDALUS); + + $this->changeTriumphFromEventService->execute($event); + + foreach ($this->daedalus->getAlivePlayers() as $player) { + self::assertEquals(0, $player->getTriumph()); + } + } +} From 850b733917955c81aef241015a1fd2b6127a18e7 Mon Sep 17 00:00:00 2001 From: Evian Date: Thu, 1 May 2025 19:21:26 +0200 Subject: [PATCH 04/27] Earning triumph now prints a custom log --- Api/composer.json | 4 + .../Listener/TriumphEventSubscriber.php | 40 ++++ .../DataFixtures/TriumphConfigFixtures.php | 2 +- Api/src/Triumph/Entity/TriumphConfig.php | 5 + Api/src/Triumph/Enum/TriumphEnum.php | 5 + Api/src/Triumph/Event/TriumphChangedEvent.php | 47 +++++ .../Service/ChangeTriumphFromEventService.php | 16 +- .../ChangeTriumphFromEventServiceCest.php | 51 +++++ .../Triumph/Event/FinishDaedalusEventTest.php | 67 +++++-- .../ChangeTriumphFromEventServiceTest.php | 178 ++++++++++++------ Api/translations/fr/triumph+intl-icu.fr.xlf | 11 ++ 11 files changed, 358 insertions(+), 68 deletions(-) create mode 100644 Api/src/RoomLog/Listener/TriumphEventSubscriber.php create mode 100644 Api/src/Triumph/Event/TriumphChangedEvent.php create mode 100644 Api/tests/functional/Triumph/Service/ChangeTriumphFromEventServiceCest.php create mode 100644 Api/translations/fr/triumph+intl-icu.fr.xlf 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/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/DataFixtures/TriumphConfigFixtures.php b/Api/src/Triumph/DataFixtures/TriumphConfigFixtures.php index 3e98cbfdc2..9e63d187d1 100644 --- a/Api/src/Triumph/DataFixtures/TriumphConfigFixtures.php +++ b/Api/src/Triumph/DataFixtures/TriumphConfigFixtures.php @@ -19,7 +19,7 @@ public function load(ObjectManager $manager): void foreach (TriumphConfigData::getAll() as $triumphConfigDto) { $triumphConfig = TriumphConfig::fromDto($triumphConfigDto); $manager->persist($triumphConfig); - $this->addReference($triumphConfigDto->name->value, $triumphConfig); + $this->addReference('triumph_config_' . $triumphConfigDto->name->toString(), $triumphConfig); $gameConfig->addTriumphConfig($triumphConfig); } diff --git a/Api/src/Triumph/Entity/TriumphConfig.php b/Api/src/Triumph/Entity/TriumphConfig.php index 2e7c7538ab..045fdce9a1 100644 --- a/Api/src/Triumph/Entity/TriumphConfig.php +++ b/Api/src/Triumph/Entity/TriumphConfig.php @@ -108,6 +108,11 @@ public function getTargetedEventExpectedTags(): array return $this->targetedEventExpectedTags; } + public function getVisibility(): TriumphVisibility + { + return $this->visibility; + } + public static function fromDto(TriumphConfigDto $triumphConfigDto): self { return new self( diff --git a/Api/src/Triumph/Enum/TriumphEnum.php b/Api/src/Triumph/Enum/TriumphEnum.php index d0456e496f..8cdfc6365c 100644 --- a/Api/src/Triumph/Enum/TriumphEnum.php +++ b/Api/src/Triumph/Enum/TriumphEnum.php @@ -16,4 +16,9 @@ public function toConfigKey(string $configKey): string { return $this->value . '_' . $configKey; } + + public function toString(): string + { + return $this->value; + } } diff --git a/Api/src/Triumph/Event/TriumphChangedEvent.php b/Api/src/Triumph/Event/TriumphChangedEvent.php new file mode 100644 index 0000000000..ff3f2710f5 --- /dev/null +++ b/Api/src/Triumph/Event/TriumphChangedEvent.php @@ -0,0 +1,47 @@ +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 $this->triumphConfig->getQuantity(); + } +} diff --git a/Api/src/Triumph/Service/ChangeTriumphFromEventService.php b/Api/src/Triumph/Service/ChangeTriumphFromEventService.php index 6584eec7f0..62c8ced46a 100644 --- a/Api/src/Triumph/Service/ChangeTriumphFromEventService.php +++ b/Api/src/Triumph/Service/ChangeTriumphFromEventService.php @@ -4,13 +4,17 @@ namespace Mush\Triumph\Service; +use Mush\Game\Service\EventServiceInterface; use Mush\Player\Entity\Player; +use Mush\Triumph\Entity\TriumphConfig; +use Mush\Triumph\Event\TriumphChangedEvent; use Mush\Triumph\Event\TriumphSourceEventInterface; use Mush\Triumph\Repository\TriumphConfigRepositoryInterface; final class ChangeTriumphFromEventService { public function __construct( + private EventServiceInterface $eventService, private TriumphConfigRepositoryInterface $triumphConfigRepository, ) {} @@ -24,8 +28,18 @@ public function execute(TriumphSourceEventInterface $event): void } $event->getTargetsForTriumph($triumphConfig)->map( - static fn (Player $player) => $player->addTriumph($triumphConfig->getQuantity()) + fn (Player $player) => $this->addTriumphToPlayer($triumphConfig, $player) ); } } + + private function addTriumphToPlayer(TriumphConfig $triumphConfig, Player $player): void + { + $player->addTriumph($triumphConfig->getQuantity()); + + $this->eventService->callEvent( + new TriumphChangedEvent($player, $triumphConfig), + TriumphChangedEvent::class, + ); + } } diff --git a/Api/tests/functional/Triumph/Service/ChangeTriumphFromEventServiceCest.php b/Api/tests/functional/Triumph/Service/ChangeTriumphFromEventServiceCest.php new file mode 100644 index 0000000000..4a7cce17ab --- /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 PlayerCycleEvent( + player: $this->player, + tags: [], + time: new \DateTime(), + ); + $event->setEventName(PlayerCycleEvent::PLAYER_NEW_CYCLE); + + $this->changeTriumphFromEventService->execute($event); + + $this->ISeeTranslatedRoomLogInRepository( + expectedRoomLog: 'Vous avez gagné 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/Triumph/Event/FinishDaedalusEventTest.php b/Api/tests/unit/Triumph/Event/FinishDaedalusEventTest.php index a7c62fbc16..a6b3fa2df7 100644 --- a/Api/tests/unit/Triumph/Event/FinishDaedalusEventTest.php +++ b/Api/tests/unit/Triumph/Event/FinishDaedalusEventTest.php @@ -8,6 +8,7 @@ use Mush\Daedalus\Entity\Daedalus; use Mush\Daedalus\Event\DaedalusEvent; use Mush\Daedalus\Factory\DaedalusFactory; +use Mush\Game\Service\EventServiceInterface; use Mush\Player\Entity\Player; use Mush\Player\Factory\PlayerFactory; use Mush\Tests\unit\Triumph\TestDoubles\Repository\InMemoryTriumphConfigRepository; @@ -24,27 +25,74 @@ final class FinishDaedalusEventTest extends TestCase { private ChangeTriumphFromEventService $changeTriumphFromEventService; private InMemoryTriumphConfigRepository $triumphConfigRepository; + private EventServiceInterface $eventService; private Daedalus $daedalus; private Player $player; private Player $player2; protected function setUp(): void + { + $this->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); + } + + private function givenATriumphConfigRepository(): void { $this->triumphConfigRepository = new InMemoryTriumphConfigRepository(); - $this->changeTriumphFromEventService = new ChangeTriumphFromEventService($this->triumphConfigRepository); + } + + 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); } - public function testShouldGiveReturnToSolTriumphToAllHumanWhenReturningToSol(): void + private function givenAReturnToSolTriumphConfig(): void { $this->triumphConfigRepository->save( TriumphConfig::fromDto(TriumphConfigData::getByName(TriumphEnum::RETURN_TO_SOL)) ); + } + private function whenDaedalusFinishesWithReturnToSol(): void + { $event = new DaedalusEvent( daedalus: $this->daedalus, tags: [ActionEnum::RETURN_TO_SOL->toString()], @@ -53,18 +101,10 @@ public function testShouldGiveReturnToSolTriumphToAllHumanWhenReturningToSol(): $event->setEventName(DaedalusEvent::FINISH_DAEDALUS); $this->changeTriumphFromEventService->execute($event); - - foreach ($this->daedalus->getAlivePlayers() as $player) { - self::assertEquals(20, $player->getTriumph()); - } } - public function testShouldNotGiveReturnToSolTriumphToAllHumanWhenNotReturningToSol(): void + private function whenDaedalusFinishesWithoutReturnToSol(): void { - $this->triumphConfigRepository->save( - TriumphConfig::fromDto(TriumphConfigData::getByName(TriumphEnum::RETURN_TO_SOL)) - ); - $event = new DaedalusEvent( daedalus: $this->daedalus, tags: [], @@ -73,9 +113,12 @@ public function testShouldNotGiveReturnToSolTriumphToAllHumanWhenNotReturningToS $event->setEventName(DaedalusEvent::FINISH_DAEDALUS); $this->changeTriumphFromEventService->execute($event); + } + private function thenAllPlayersHaveTriumphPoints(int $expectedPoints): void + { foreach ($this->daedalus->getAlivePlayers() as $player) { - self::assertEquals(0, $player->getTriumph()); + self::assertEquals($expectedPoints, $player->getTriumph()); } } } diff --git a/Api/tests/unit/Triumph/Service/ChangeTriumphFromEventServiceTest.php b/Api/tests/unit/Triumph/Service/ChangeTriumphFromEventServiceTest.php index e0b32d09b4..75a7ef50ae 100644 --- a/Api/tests/unit/Triumph/Service/ChangeTriumphFromEventServiceTest.php +++ b/Api/tests/unit/Triumph/Service/ChangeTriumphFromEventServiceTest.php @@ -8,6 +8,8 @@ use Mush\Daedalus\Factory\DaedalusFactory; use Mush\Game\Enum\CharacterEnum; use Mush\Game\Enum\EventEnum; +use Mush\Game\Service\EventServiceInterface; +use Mush\Player\Entity\Player; use Mush\Player\Event\PlayerCycleEvent; use Mush\Player\Factory\PlayerFactory; use Mush\Status\Enum\PlayerStatusEnum; @@ -25,8 +27,9 @@ final class ChangeTriumphFromEventServiceTest extends TestCase { private ChangeTriumphFromEventService $service; - private InMemoryTriumphConfigRepository $triumphConfigRepository; + private EventServiceInterface $eventService; + private InMemoryTriumphConfigRepository $triumphConfigRepository; private Daedalus $daedalus; /** @@ -34,100 +37,167 @@ final class ChangeTriumphFromEventServiceTest extends TestCase */ protected function setUp(): void { + $this->eventService = \Mockery::spy(EventServiceInterface::class); $this->triumphConfigRepository = new InMemoryTriumphConfigRepository(); - $this->service = new ChangeTriumphFromEventService($this->triumphConfigRepository); + $this->service = new ChangeTriumphFromEventService( + eventService: $this->eventService, + triumphConfigRepository: $this->triumphConfigRepository, + ); $this->daedalus = DaedalusFactory::createDaedalus(); } public function testShouldGiveHumanTargetTriumphToHumanPlayer(): void { - $this->triumphConfigRepository->save( - TriumphConfig::fromDto( - TriumphConfigData::getByName(TriumphEnum::CYCLE_HUMAN) - ) - ); + // Given + $player = $this->givenAHumanPlayer(); + $this->givenTriumphConfigExists(TriumphEnum::CYCLE_HUMAN); + $event = $this->givenANewCycleEvent($player); - $player = PlayerFactory::createPlayerWithDaedalus($this->daedalus); - $event = new PlayerCycleEvent($player, [], new \DateTime()); - $event->setEventName(PlayerCycleEvent::PLAYER_NEW_CYCLE); + // When + $this->whenChangingTriumphForEvent($event); - $this->service->execute($event); - - self::assertEquals(1, $player->getTriumph(), 'Player should have 1 triumph'); + // Then + $this->thenPlayerShouldHaveTriumph($player, 1); } public function testShouldGiveMushTargetTriumphToMushPlayer(): void { - $this->triumphConfigRepository->save( - TriumphConfig::fromDto( - TriumphConfigData::getByName(TriumphEnum::CYCLE_MUSH) - ) - ); + // Given + $player = $this->givenAMushPlayer(); + $this->givenTriumphConfigExists(TriumphEnum::CYCLE_MUSH); + $this->givenPlayerHasTriumph($player, 120); + $event = $this->givenANewCycleEvent($player); - $player = PlayerFactory::createPlayerWithDaedalus($this->daedalus); - StatusFactory::createChargeStatusFromStatusName( - name: PlayerStatusEnum::MUSH, - holder: $player, - ); - $player->setTriumph(120); + // When + $this->whenChangingTriumphForEvent($event); - $event = new PlayerCycleEvent($player, [], new \DateTime()); - $event->setEventName(PlayerCycleEvent::PLAYER_NEW_CYCLE); + // Then + $this->thenPlayerShouldHaveTriumph($player, 118); + } - $this->service->execute($event); + public function testShouldGivePersonalTriumphToTargetedCharacter(): void + { + // Given + $player = $this->givenAPlayerWithCharacter(CharacterEnum::CHUN); + $this->givenTriumphConfigExists(TriumphEnum::CHUN_LIVES); + $event = $this->givenANewCycleEventWithTags($player, [EventEnum::NEW_DAY]); + + // When + $this->whenChangingTriumphForEvent($event); - self::assertEquals(118, $player->getTriumph(), 'Player should have 118 triumphs'); + // Then + $this->thenPlayerShouldHaveTriumph($player, 1); } - public function testShouldGivePersonalTriumphToTargetedCharacter(): void + public function testShouldNotGivePersonalTriumphToOtherPlayer(): void { - $this->triumphConfigRepository->save( - TriumphConfig::fromDto( - TriumphConfigData::getByName(TriumphEnum::CHUN_LIVES) - ) - ); + // Given + $player = $this->givenAHumanPlayer(); + $this->givenTriumphConfigExists(TriumphEnum::CHUN_LIVES); + $event = $this->givenANewCycleEventWithTags($player, [EventEnum::NEW_DAY]); - $player = PlayerFactory::createPlayerByNameAndDaedalus(CharacterEnum::CHUN, $this->daedalus); - $event = new PlayerCycleEvent($player, [EventEnum::NEW_DAY], new \DateTime()); - $event->setEventName(PlayerCycleEvent::PLAYER_NEW_CYCLE); + // When + $this->whenChangingTriumphForEvent($event); - $this->service->execute($event); + // Then + $this->thenPlayerShouldHaveTriumph($player, 0); + } + + public function testShouldNotGiveTriumphIfEventDoesNotHaveExpectedTags(): void + { + // Given + $player = $this->givenAPlayerWithCharacter(CharacterEnum::CHUN); + $this->givenTriumphConfigExists(TriumphEnum::CHUN_LIVES); + $event = $this->givenANewCycleEvent($player); + + // When + $this->whenChangingTriumphForEvent($event); - self::assertEquals(1, $player->getTriumph(), 'Player should have 1 triumph'); + // Then + $this->thenPlayerShouldHaveTriumph($player, 0); } - public function testShouldNotGivePersonalTriumphToOtherPlayer(): void + public function testShouldDispatchTriumphChangedEvent(): void { - $this->triumphConfigRepository->save( - TriumphConfig::fromDto( - TriumphConfigData::getByName(TriumphEnum::CHUN_LIVES) - ) - ); + // Given + $player = $this->givenAHumanPlayer(); + $this->givenTriumphConfigExists(TriumphEnum::CYCLE_HUMAN); + $event = $this->givenANewCycleEvent($player); + + // When + $this->whenChangingTriumphForEvent($event); + + // Then + $this->thenTriumphChangedEventShouldBeDispatched(); + } + + private function givenAHumanPlayer(): Player + { + return PlayerFactory::createPlayerWithDaedalus($this->daedalus); + } + private function givenAMushPlayer(): Player + { $player = PlayerFactory::createPlayerWithDaedalus($this->daedalus); - $event = new PlayerCycleEvent($player, [EventEnum::NEW_DAY], new \DateTime()); - $event->setEventName(PlayerCycleEvent::PLAYER_NEW_CYCLE); + StatusFactory::createChargeStatusFromStatusName( + name: PlayerStatusEnum::MUSH, + holder: $player, + ); - $this->service->execute($event); + return $player; + } - self::assertEquals(0, $player->getTriumph(), 'Player should have 0 triumph'); + private function givenAPlayerWithCharacter(string $character): Player + { + return PlayerFactory::createPlayerByNameAndDaedalus($character, $this->daedalus); } - public function testShouldNotGiveTriumphIfEventDoesNotHaveExpectedTags(): void + private function givenTriumphConfigExists(TriumphEnum $triumphName): void { - // Chun lives expected "NEW_DAY" tag $this->triumphConfigRepository->save( TriumphConfig::fromDto( - TriumphConfigData::getByName(TriumphEnum::CHUN_LIVES) + TriumphConfigData::getByName($triumphName) ) ); + } + + private function givenPlayerHasTriumph(Player $player, int $triumph): void + { + $player->setTriumph($triumph); + } - $player = PlayerFactory::createPlayerByNameAndDaedalus(CharacterEnum::CHUN, $this->daedalus); + private function givenANewCycleEvent(Player $player): PlayerCycleEvent + { $event = new PlayerCycleEvent($player, [], new \DateTime()); $event->setEventName(PlayerCycleEvent::PLAYER_NEW_CYCLE); + return $event; + } + + private function givenANewCycleEventWithTags(Player $player, array $tags): PlayerCycleEvent + { + $event = new PlayerCycleEvent($player, $tags, new \DateTime()); + $event->setEventName(PlayerCycleEvent::PLAYER_NEW_CYCLE); + + return $event; + } + + private function whenChangingTriumphForEvent(PlayerCycleEvent $event): void + { $this->service->execute($event); + } - self::assertEquals(0, $player->getTriumph(), 'Player should have 0 triumph'); + 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/translations/fr/triumph+intl-icu.fr.xlf b/Api/translations/fr/triumph+intl-icu.fr.xlf new file mode 100644 index 0000000000..82ddd48c4c --- /dev/null +++ b/Api/translations/fr/triumph+intl-icu.fr.xlf @@ -0,0 +1,11 @@ + + + + + + cycle_human + Vous avez gagné {quantity} :triumph: car vous avez survécu un cycle de plus. + + + + From e3ea491c2529b53a0769ddee8ad94c75e8d36d6a Mon Sep 17 00:00:00 2001 From: Evian Date: Thu, 1 May 2025 19:57:17 +0200 Subject: [PATCH 05/27] fix: Target daedalus new cycle event for cyclic triumph gain to avoid giving too much --- Api/src/Daedalus/Event/DaedalusCycleEvent.php | 14 +++---- Api/src/Game/Enum/EventPriorityEnum.php | 1 + .../Entity/Collection/PlayerCollection.php | 5 +++ Api/src/Player/Event/PlayerCycleEvent.php | 21 +--------- Api/src/Player/Service/PlayerService.php | 4 -- .../Triumph/ConfigData/TriumphConfigData.php | 12 +++--- Api/src/Triumph/Enum/TriumphScope.php | 3 +- .../Triumph/Event/TriumphSourceEventTrait.php | 15 +++++++ .../Listener/DaedalusCycleEventSubscriber.php | 29 ++++++++++++++ .../Triumph/Event/DaedalusCycleEventCest.php | 39 +++++++++++++++++++ .../ChangeTriumphFromEventServiceCest.php | 8 ++-- .../ChangeTriumphFromEventServiceTest.php | 36 ++++++++++------- 12 files changed, 129 insertions(+), 58 deletions(-) create mode 100644 Api/src/Triumph/Event/TriumphSourceEventTrait.php create mode 100644 Api/src/Triumph/Listener/DaedalusCycleEventSubscriber.php create mode 100644 Api/tests/functional/Triumph/Event/DaedalusCycleEventCest.php diff --git a/Api/src/Daedalus/Event/DaedalusCycleEvent.php b/Api/src/Daedalus/Event/DaedalusCycleEvent.php index 86af214762..a593e4ec9a 100644 --- a/Api/src/Daedalus/Event/DaedalusCycleEvent.php +++ b/Api/src/Daedalus/Event/DaedalusCycleEvent.php @@ -9,9 +9,12 @@ use Mush\Triumph\Entity\TriumphConfig; use Mush\Triumph\Enum\TriumphScope; use Mush\Triumph\Event\TriumphSourceEventInterface; +use Mush\Triumph\Event\TriumphSourceEventTrait; class DaedalusCycleEvent extends AbstractGameEvent implements TriumphSourceEventInterface { + use TriumphSourceEventTrait; + public const string DAEDALUS_NEW_CYCLE = 'daedalus.new.cycle'; protected Daedalus $daedalus; @@ -52,13 +55,10 @@ public function getLinkWithSolCycleKillChance(): int public function getTargetsForTriumph(TriumphConfig $triumphConfig): PlayerCollection { return match ($triumphConfig->getScope()) { - TriumphScope::ALL_HUMAN => $this->daedalus->getAlivePlayers(), - default => throw new \LogicException('Unsupported triumph scope: ' . $triumphConfig->getScope()), + TriumphScope::ALL_HUMAN => $this->daedalus->getAlivePlayers()->getHumanPlayer(), + TriumphScope::ALL_MUSH => $this->daedalus->getAlivePlayers()->getMushPlayer(), + TriumphScope::PERSONAL => $this->daedalus->getAlivePlayers()->getAllByName($triumphConfig->getTarget()), + default => throw new \LogicException('Unsupported triumph scope: ' . $triumphConfig->getScope()->value), }; } - - public function hasExpectedTags(TriumphConfig $triumphConfig): bool - { - return $this->hasAllTags($triumphConfig->getTargetedEventExpectedTags()); - } } 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/Player/Entity/Collection/PlayerCollection.php b/Api/src/Player/Entity/Collection/PlayerCollection.php index a909508cc5..7cac4628b5 100644 --- a/Api/src/Player/Entity/Collection/PlayerCollection.php +++ b/Api/src/Player/Entity/Collection/PlayerCollection.php @@ -187,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/Event/PlayerCycleEvent.php b/Api/src/Player/Event/PlayerCycleEvent.php index b030ca8e9b..01268326bc 100644 --- a/Api/src/Player/Event/PlayerCycleEvent.php +++ b/Api/src/Player/Event/PlayerCycleEvent.php @@ -4,13 +4,9 @@ use Mush\Game\Event\AbstractGameEvent; use Mush\Modifier\Entity\Collection\ModifierCollection; -use Mush\Player\Entity\Collection\PlayerCollection; use Mush\Player\Entity\Player; -use Mush\Triumph\Entity\TriumphConfig; -use Mush\Triumph\Enum\TriumphScope; -use Mush\Triumph\Event\TriumphSourceEventInterface; -class PlayerCycleEvent extends AbstractGameEvent implements TriumphSourceEventInterface +class PlayerCycleEvent extends AbstractGameEvent { public const string PLAYER_NEW_CYCLE = 'player.new.cycle'; @@ -47,19 +43,4 @@ public function getModifiersByPriorities(array $priorities): ModifierCollection return $modifiers; } - - public function getTargetsForTriumph(TriumphConfig $triumphConfig): PlayerCollection - { - return match ($triumphConfig->getScope()) { - TriumphScope::HUMAN_TARGET => $this->player->getDaedalus()->getAlivePlayers()->getHumanPlayer(), - TriumphScope::MUSH_TARGET => $this->player->getDaedalus()->getAlivePlayers()->getMushPlayer(), - TriumphScope::PERSONAL => $this->player->getDaedalus()->getAlivePlayers()->getAllByName($triumphConfig->getTarget()), - default => throw new \LogicException("Unsupported triumph scope: {$triumphConfig->getScope()->value}"), - }; - } - - public function hasExpectedTags(TriumphConfig $triumphConfig): bool - { - return $this->hasAllTags($triumphConfig->getTargetedEventExpectedTags()); - } } diff --git a/Api/src/Player/Service/PlayerService.php b/Api/src/Player/Service/PlayerService.php index 9646e70042..b79d20c37a 100644 --- a/Api/src/Player/Service/PlayerService.php +++ b/Api/src/Player/Service/PlayerService.php @@ -206,10 +206,6 @@ public function handleNewCycle(Player $player, \DateTime $date): Player $this->applyCycleChangesPointsGain($player, $date); - if ($player->isActive()) { - $this->handleTriumphChange($player, $date); - } - return $this->persist($player); } diff --git a/Api/src/Triumph/ConfigData/TriumphConfigData.php b/Api/src/Triumph/ConfigData/TriumphConfigData.php index bd411a5d5b..28861208c9 100644 --- a/Api/src/Triumph/ConfigData/TriumphConfigData.php +++ b/Api/src/Triumph/ConfigData/TriumphConfigData.php @@ -5,10 +5,10 @@ namespace Mush\Triumph\ConfigData; use Mush\Action\Enum\ActionEnum; +use Mush\Daedalus\Event\DaedalusCycleEvent; use Mush\Daedalus\Event\DaedalusEvent; use Mush\Game\Enum\CharacterEnum; use Mush\Game\Enum\EventEnum; -use Mush\Player\Event\PlayerCycleEvent; use Mush\Triumph\Dto\TriumphConfigDto; use Mush\Triumph\Enum\TriumphEnum; use Mush\Triumph\Enum\TriumphScope; @@ -24,21 +24,21 @@ public static function getAll(): array new TriumphConfigDto( key: TriumphEnum::CYCLE_HUMAN->toConfigKey('default'), name: TriumphEnum::CYCLE_HUMAN, - targetedEvent: PlayerCycleEvent::PLAYER_NEW_CYCLE, - scope: TriumphScope::HUMAN_TARGET, + targetedEvent: DaedalusCycleEvent::DAEDALUS_NEW_CYCLE, + scope: TriumphScope::ALL_HUMAN, quantity: 1, ), new TriumphConfigDto( key: TriumphEnum::CYCLE_MUSH->toConfigKey('default'), name: TriumphEnum::CYCLE_MUSH, - targetedEvent: PlayerCycleEvent::PLAYER_NEW_CYCLE, - scope: TriumphScope::MUSH_TARGET, + targetedEvent: DaedalusCycleEvent::DAEDALUS_NEW_CYCLE, + scope: TriumphScope::ALL_MUSH, quantity: -2, ), new TriumphConfigDto( key: TriumphEnum::CHUN_LIVES->toConfigKey('default'), name: TriumphEnum::CHUN_LIVES, - targetedEvent: PlayerCycleEvent::PLAYER_NEW_CYCLE, + targetedEvent: DaedalusCycleEvent::DAEDALUS_NEW_CYCLE, targetedEventExpectedTags: [ EventEnum::NEW_DAY, ], diff --git a/Api/src/Triumph/Enum/TriumphScope.php b/Api/src/Triumph/Enum/TriumphScope.php index 2fea0614bc..a0a31f7f71 100644 --- a/Api/src/Triumph/Enum/TriumphScope.php +++ b/Api/src/Triumph/Enum/TriumphScope.php @@ -7,8 +7,7 @@ enum TriumphScope: string { case ALL_HUMAN = 'all_human'; - case HUMAN_TARGET = 'human_target'; - case MUSH_TARGET = 'mush_target'; + case ALL_MUSH = 'all_mush'; case PERSONAL = 'personal'; case NULL = ''; diff --git a/Api/src/Triumph/Event/TriumphSourceEventTrait.php b/Api/src/Triumph/Event/TriumphSourceEventTrait.php new file mode 100644 index 0000000000..6c553e6ebc --- /dev/null +++ b/Api/src/Triumph/Event/TriumphSourceEventTrait.php @@ -0,0 +1,15 @@ +hasAllTags($triumphConfig->getTargetedEventExpectedTags()); + } +} diff --git a/Api/src/Triumph/Listener/DaedalusCycleEventSubscriber.php b/Api/src/Triumph/Listener/DaedalusCycleEventSubscriber.php new file mode 100644 index 0000000000..9c94cbd0b6 --- /dev/null +++ b/Api/src/Triumph/Listener/DaedalusCycleEventSubscriber.php @@ -0,0 +1,29 @@ + ['onNewCycle', EventPriorityEnum::PLAYER_TRIUMPH], + ]; + } + + public function onNewCycle(DaedalusCycleEvent $event): void + { + $this->changeTriumphFromEventService->execute($event); + } +} diff --git a/Api/tests/functional/Triumph/Event/DaedalusCycleEventCest.php b/Api/tests/functional/Triumph/Event/DaedalusCycleEventCest.php new file mode 100644 index 0000000000..7d09559be7 --- /dev/null +++ b/Api/tests/functional/Triumph/Event/DaedalusCycleEventCest.php @@ -0,0 +1,39 @@ +eventService = $I->grabService(EventServiceInterface::class); + } + + public function shouldGiveCycleHumanTriumphToHumans(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); + + $I->assertEquals(1, $this->player->getTriumph()); + } +} diff --git a/Api/tests/functional/Triumph/Service/ChangeTriumphFromEventServiceCest.php b/Api/tests/functional/Triumph/Service/ChangeTriumphFromEventServiceCest.php index 4a7cce17ab..83c53fb910 100644 --- a/Api/tests/functional/Triumph/Service/ChangeTriumphFromEventServiceCest.php +++ b/Api/tests/functional/Triumph/Service/ChangeTriumphFromEventServiceCest.php @@ -4,8 +4,8 @@ namespace Mush\Tests\functional\Triumph\Service; +use Mush\Daedalus\Event\DaedalusCycleEvent; use Mush\Game\Enum\VisibilityEnum; -use Mush\Player\Event\PlayerCycleEvent; use Mush\Tests\AbstractFunctionalTest; use Mush\Tests\FunctionalTester; use Mush\Tests\RoomLogDto; @@ -28,12 +28,12 @@ public function _before(FunctionalTester $I): void public function shouldPrintLogWhenTriumphIsChanged(FunctionalTester $I): void { - $event = new PlayerCycleEvent( - player: $this->player, + $event = new DaedalusCycleEvent( + daedalus: $this->daedalus, tags: [], time: new \DateTime(), ); - $event->setEventName(PlayerCycleEvent::PLAYER_NEW_CYCLE); + $event->setEventName(DaedalusCycleEvent::DAEDALUS_NEW_CYCLE); $this->changeTriumphFromEventService->execute($event); diff --git a/Api/tests/unit/Triumph/Service/ChangeTriumphFromEventServiceTest.php b/Api/tests/unit/Triumph/Service/ChangeTriumphFromEventServiceTest.php index 75a7ef50ae..62fff7d787 100644 --- a/Api/tests/unit/Triumph/Service/ChangeTriumphFromEventServiceTest.php +++ b/Api/tests/unit/Triumph/Service/ChangeTriumphFromEventServiceTest.php @@ -5,12 +5,12 @@ namespace Mush\tests\unit\Triumph\Service; use Mush\Daedalus\Entity\Daedalus; +use Mush\Daedalus\Event\DaedalusCycleEvent; use Mush\Daedalus\Factory\DaedalusFactory; use Mush\Game\Enum\CharacterEnum; use Mush\Game\Enum\EventEnum; use Mush\Game\Service\EventServiceInterface; use Mush\Player\Entity\Player; -use Mush\Player\Event\PlayerCycleEvent; use Mush\Player\Factory\PlayerFactory; use Mush\Status\Enum\PlayerStatusEnum; use Mush\Status\Factory\StatusFactory; @@ -18,6 +18,7 @@ use Mush\Triumph\ConfigData\TriumphConfigData; use Mush\Triumph\Entity\TriumphConfig; use Mush\Triumph\Enum\TriumphEnum; +use Mush\Triumph\Event\TriumphSourceEventInterface; use Mush\Triumph\Service\ChangeTriumphFromEventService; use PHPUnit\Framework\TestCase; @@ -46,33 +47,38 @@ protected function setUp(): void $this->daedalus = DaedalusFactory::createDaedalus(); } - public function testShouldGiveHumanTargetTriumphToHumanPlayer(): void + public function testShouldGiveAllHumanTriumphToAllHumanPlayers(): void { // Given $player = $this->givenAHumanPlayer(); + $player2 = $this->givenAHumanPlayer(); $this->givenTriumphConfigExists(TriumphEnum::CYCLE_HUMAN); - $event = $this->givenANewCycleEvent($player); + $event = $this->givenANewDaedalusCycleEvent($this->daedalus); // When $this->whenChangingTriumphForEvent($event); // Then $this->thenPlayerShouldHaveTriumph($player, 1); + $this->thenPlayerShouldHaveTriumph($player2, 1); } public function testShouldGiveMushTargetTriumphToMushPlayer(): void { // Given $player = $this->givenAMushPlayer(); + $player2 = $this->givenAMushPlayer(); $this->givenTriumphConfigExists(TriumphEnum::CYCLE_MUSH); $this->givenPlayerHasTriumph($player, 120); - $event = $this->givenANewCycleEvent($player); + $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 @@ -80,7 +86,7 @@ public function testShouldGivePersonalTriumphToTargetedCharacter(): void // Given $player = $this->givenAPlayerWithCharacter(CharacterEnum::CHUN); $this->givenTriumphConfigExists(TriumphEnum::CHUN_LIVES); - $event = $this->givenANewCycleEventWithTags($player, [EventEnum::NEW_DAY]); + $event = $this->givenANewCycleEventWithTags($this->daedalus, [EventEnum::NEW_DAY]); // When $this->whenChangingTriumphForEvent($event); @@ -94,7 +100,7 @@ public function testShouldNotGivePersonalTriumphToOtherPlayer(): void // Given $player = $this->givenAHumanPlayer(); $this->givenTriumphConfigExists(TriumphEnum::CHUN_LIVES); - $event = $this->givenANewCycleEventWithTags($player, [EventEnum::NEW_DAY]); + $event = $this->givenANewCycleEventWithTags($this->daedalus, [EventEnum::NEW_DAY]); // When $this->whenChangingTriumphForEvent($event); @@ -108,7 +114,7 @@ public function testShouldNotGiveTriumphIfEventDoesNotHaveExpectedTags(): void // Given $player = $this->givenAPlayerWithCharacter(CharacterEnum::CHUN); $this->givenTriumphConfigExists(TriumphEnum::CHUN_LIVES); - $event = $this->givenANewCycleEvent($player); + $event = $this->givenANewDaedalusCycleEvent($this->daedalus); // When $this->whenChangingTriumphForEvent($event); @@ -122,7 +128,7 @@ public function testShouldDispatchTriumphChangedEvent(): void // Given $player = $this->givenAHumanPlayer(); $this->givenTriumphConfigExists(TriumphEnum::CYCLE_HUMAN); - $event = $this->givenANewCycleEvent($player); + $event = $this->givenANewDaedalusCycleEvent($this->daedalus); // When $this->whenChangingTriumphForEvent($event); @@ -166,23 +172,23 @@ private function givenPlayerHasTriumph(Player $player, int $triumph): void $player->setTriumph($triumph); } - private function givenANewCycleEvent(Player $player): PlayerCycleEvent + private function givenANewDaedalusCycleEvent(Daedalus $daedalus): DaedalusCycleEvent { - $event = new PlayerCycleEvent($player, [], new \DateTime()); - $event->setEventName(PlayerCycleEvent::PLAYER_NEW_CYCLE); + $event = new DaedalusCycleEvent($daedalus, [], new \DateTime()); + $event->setEventName(DaedalusCycleEvent::DAEDALUS_NEW_CYCLE); return $event; } - private function givenANewCycleEventWithTags(Player $player, array $tags): PlayerCycleEvent + private function givenANewCycleEventWithTags(Daedalus $daedalus, array $tags): DaedalusCycleEvent { - $event = new PlayerCycleEvent($player, $tags, new \DateTime()); - $event->setEventName(PlayerCycleEvent::PLAYER_NEW_CYCLE); + $event = new DaedalusCycleEvent($daedalus, $tags, new \DateTime()); + $event->setEventName(DaedalusCycleEvent::DAEDALUS_NEW_CYCLE); return $event; } - private function whenChangingTriumphForEvent(PlayerCycleEvent $event): void + private function whenChangingTriumphForEvent(TriumphSourceEventInterface $event): void { $this->service->execute($event); } From 4a60b7c7c7ceb1c3af3b0b4df060ea66da5de2fe Mon Sep 17 00:00:00 2001 From: Evian Date: Thu, 1 May 2025 20:04:00 +0200 Subject: [PATCH 06/27] Do not give cyclic triumph to inactive players. add a test to check dead players do not get triumph --- Api/src/Daedalus/Entity/Daedalus.php | 10 +++++ Api/src/Daedalus/Event/DaedalusCycleEvent.php | 1 + .../Triumph/ConfigData/TriumphConfigData.php | 2 +- Api/src/Triumph/Enum/TriumphScope.php | 1 + .../Event/TriumphSourceEventInterface.php | 2 +- .../Triumph/Event/TriumphSourceEventTrait.php | 2 +- .../Service/ChangeTriumphFromEventService.php | 2 +- .../ChangeTriumphFromEventServiceTest.php | 45 ++++++++++++++++++- 8 files changed, 60 insertions(+), 5 deletions(-) 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 a593e4ec9a..b909a1da9e 100644 --- a/Api/src/Daedalus/Event/DaedalusCycleEvent.php +++ b/Api/src/Daedalus/Event/DaedalusCycleEvent.php @@ -55,6 +55,7 @@ public function getLinkWithSolCycleKillChance(): int public function getTargetsForTriumph(TriumphConfig $triumphConfig): PlayerCollection { return match ($triumphConfig->getScope()) { + TriumphScope::ALL_ACTIVE_HUMAN => $this->daedalus->getHumanPlayers()->getActivePlayers(), TriumphScope::ALL_HUMAN => $this->daedalus->getAlivePlayers()->getHumanPlayer(), TriumphScope::ALL_MUSH => $this->daedalus->getAlivePlayers()->getMushPlayer(), TriumphScope::PERSONAL => $this->daedalus->getAlivePlayers()->getAllByName($triumphConfig->getTarget()), diff --git a/Api/src/Triumph/ConfigData/TriumphConfigData.php b/Api/src/Triumph/ConfigData/TriumphConfigData.php index 28861208c9..a284fac8c3 100644 --- a/Api/src/Triumph/ConfigData/TriumphConfigData.php +++ b/Api/src/Triumph/ConfigData/TriumphConfigData.php @@ -25,7 +25,7 @@ public static function getAll(): array key: TriumphEnum::CYCLE_HUMAN->toConfigKey('default'), name: TriumphEnum::CYCLE_HUMAN, targetedEvent: DaedalusCycleEvent::DAEDALUS_NEW_CYCLE, - scope: TriumphScope::ALL_HUMAN, + scope: TriumphScope::ALL_ACTIVE_HUMAN, quantity: 1, ), new TriumphConfigDto( diff --git a/Api/src/Triumph/Enum/TriumphScope.php b/Api/src/Triumph/Enum/TriumphScope.php index a0a31f7f71..8baae1c616 100644 --- a/Api/src/Triumph/Enum/TriumphScope.php +++ b/Api/src/Triumph/Enum/TriumphScope.php @@ -6,6 +6,7 @@ enum TriumphScope: string { + case ALL_ACTIVE_HUMAN = 'all_active_human'; case ALL_HUMAN = 'all_human'; case ALL_MUSH = 'all_mush'; case PERSONAL = 'personal'; diff --git a/Api/src/Triumph/Event/TriumphSourceEventInterface.php b/Api/src/Triumph/Event/TriumphSourceEventInterface.php index 0f454f361a..81268e6ca5 100644 --- a/Api/src/Triumph/Event/TriumphSourceEventInterface.php +++ b/Api/src/Triumph/Event/TriumphSourceEventInterface.php @@ -13,5 +13,5 @@ public function getEventName(): string; public function getTargetsForTriumph(TriumphConfig $triumphConfig): PlayerCollection; - public function hasExpectedTags(TriumphConfig $triumphConfig): bool; + public function hasExpectedTagsFor(TriumphConfig $triumphConfig): bool; } diff --git a/Api/src/Triumph/Event/TriumphSourceEventTrait.php b/Api/src/Triumph/Event/TriumphSourceEventTrait.php index 6c553e6ebc..d9ac77d348 100644 --- a/Api/src/Triumph/Event/TriumphSourceEventTrait.php +++ b/Api/src/Triumph/Event/TriumphSourceEventTrait.php @@ -8,7 +8,7 @@ trait TriumphSourceEventTrait { - public function hasExpectedTags(TriumphConfig $triumphConfig): bool + public function hasExpectedTagsFor(TriumphConfig $triumphConfig): bool { return $this->hasAllTags($triumphConfig->getTargetedEventExpectedTags()); } diff --git a/Api/src/Triumph/Service/ChangeTriumphFromEventService.php b/Api/src/Triumph/Service/ChangeTriumphFromEventService.php index 62c8ced46a..52ad649265 100644 --- a/Api/src/Triumph/Service/ChangeTriumphFromEventService.php +++ b/Api/src/Triumph/Service/ChangeTriumphFromEventService.php @@ -23,7 +23,7 @@ public function execute(TriumphSourceEventInterface $event): void $triumphConfigs = $this->triumphConfigRepository->findAllByTargetedEvent($event); foreach ($triumphConfigs as $triumphConfig) { - if (!$event->hasExpectedTags($triumphConfig)) { + if (!$event->hasExpectedTagsFor($triumphConfig)) { continue; } diff --git a/Api/tests/unit/Triumph/Service/ChangeTriumphFromEventServiceTest.php b/Api/tests/unit/Triumph/Service/ChangeTriumphFromEventServiceTest.php index 62fff7d787..787a9d888a 100644 --- a/Api/tests/unit/Triumph/Service/ChangeTriumphFromEventServiceTest.php +++ b/Api/tests/unit/Triumph/Service/ChangeTriumphFromEventServiceTest.php @@ -47,7 +47,7 @@ protected function setUp(): void $this->daedalus = DaedalusFactory::createDaedalus(); } - public function testShouldGiveAllHumanTriumphToAllHumanPlayers(): void + public function testShouldGiveAllActiveHumanTriumphToAllHumanPlayers(): void { // Given $player = $this->givenAHumanPlayer(); @@ -63,6 +63,21 @@ public function testShouldGiveAllHumanTriumphToAllHumanPlayers(): void $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 @@ -137,6 +152,21 @@ public function testShouldDispatchTriumphChangedEvent(): void $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); @@ -188,6 +218,19 @@ private function givenANewCycleEventWithTags(Daedalus $daedalus, array $tags): D 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); From bc750a41231c71ebeb0253d0d7ef39467613e322 Mon Sep 17 00:00:00 2001 From: Evian Date: Thu, 1 May 2025 20:29:47 +0200 Subject: [PATCH 07/27] fix: Ensure quantity returned from TriumphConfig logging is always positive --- Api/src/Triumph/Event/TriumphChangedEvent.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Api/src/Triumph/Event/TriumphChangedEvent.php b/Api/src/Triumph/Event/TriumphChangedEvent.php index ff3f2710f5..7547dfb06c 100644 --- a/Api/src/Triumph/Event/TriumphChangedEvent.php +++ b/Api/src/Triumph/Event/TriumphChangedEvent.php @@ -42,6 +42,6 @@ public function getVisibility(): string public function getQuantity(): int { - return $this->triumphConfig->getQuantity(); + return abs($this->triumphConfig->getQuantity()); } } From eb16c7177d61237719ea68a27968dd359be39820 Mon Sep 17 00:00:00 2001 From: Evian Date: Thu, 1 May 2025 20:29:53 +0200 Subject: [PATCH 08/27] feat: Add new French translations for triumph events and update existing ones --- Api/translations/fr/triumph+intl-icu.fr.xlf | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/Api/translations/fr/triumph+intl-icu.fr.xlf b/Api/translations/fr/triumph+intl-icu.fr.xlf index 82ddd48c4c..b144e7a038 100644 --- a/Api/translations/fr/triumph+intl-icu.fr.xlf +++ b/Api/translations/fr/triumph+intl-icu.fr.xlf @@ -4,7 +4,25 @@ cycle_human - Vous avez gagné {quantity} :triumph: car vous avez survécu un cycle de plus. + 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. From e9290e5e2f47e9ecfbe80f6bea492fca67830f51 Mon Sep 17 00:00:00 2001 From: Evian Date: Fri, 2 May 2025 11:31:22 +0200 Subject: [PATCH 09/27] feat: Introduce SOL_MUSH_INTRUDER triumph configuration and update related logic for player triumph calculation --- ...01102308.php => Version20250501184525.php} | 10 +++--- .../Triumph/ConfigData/TriumphConfigData.php | 10 ++++++ Api/src/Triumph/Dto/TriumphConfigDto.php | 3 -- Api/src/Triumph/Entity/TriumphConfig.php | 14 -------- Api/src/Triumph/Enum/TriumphEnum.php | 1 + .../Service/ChangeTriumphFromEventService.php | 13 ++++++- .../ChangeTriumphFromEventServiceCest.php | 2 +- .../Triumph/Event/FinishDaedalusEventTest.php | 35 +++++++++++++++++++ 8 files changed, 63 insertions(+), 25 deletions(-) rename Api/migrations/{Version20250501102308.php => Version20250501184525.php} (81%) diff --git a/Api/migrations/Version20250501102308.php b/Api/migrations/Version20250501184525.php similarity index 81% rename from Api/migrations/Version20250501102308.php rename to Api/migrations/Version20250501184525.php index 19abbbbadd..0a63e12762 100644 --- a/Api/migrations/Version20250501102308.php +++ b/Api/migrations/Version20250501184525.php @@ -10,7 +10,7 @@ /** * Auto-generated Migration: Please modify to your needs! */ -final class Version20250501102308 extends AbstractMigration +final class Version20250501184525 extends AbstractMigration { public function getDescription(): string { @@ -27,18 +27,18 @@ public function up(Schema $schema): void $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 ADD application_strategies TEXT DEFAULT \'a: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('ALTER TABLE triumph_config RENAME COLUMN is_all_crew TO has_compute_strategy'); $this->addSql('COMMENT ON COLUMN triumph_config.targeted_event_expected_tags IS \'(DC2Type:array)\''); - $this->addSql('COMMENT ON COLUMN triumph_config.application_strategies IS \'(DC2Type:array)\''); } public function down(Schema $schema): void { // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $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'); @@ -49,9 +49,7 @@ public function down(Schema $schema): void $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 DROP application_strategies'); $this->addSql('ALTER TABLE triumph_config ALTER name DROP DEFAULT'); - $this->addSql('ALTER TABLE triumph_config RENAME COLUMN has_compute_strategy TO is_all_crew'); $this->addSql('CREATE UNIQUE INDEX uniq_a53fc4e45e237e06 ON triumph_config (name)'); } } diff --git a/Api/src/Triumph/ConfigData/TriumphConfigData.php b/Api/src/Triumph/ConfigData/TriumphConfigData.php index a284fac8c3..ed6fde3500 100644 --- a/Api/src/Triumph/ConfigData/TriumphConfigData.php +++ b/Api/src/Triumph/ConfigData/TriumphConfigData.php @@ -56,6 +56,16 @@ public static function getAll(): array scope: TriumphScope::ALL_HUMAN, 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_HUMAN, + quantity: -10, + ), ]; } diff --git a/Api/src/Triumph/Dto/TriumphConfigDto.php b/Api/src/Triumph/Dto/TriumphConfigDto.php index 88f05ed3ee..609f92e6c6 100644 --- a/Api/src/Triumph/Dto/TriumphConfigDto.php +++ b/Api/src/Triumph/Dto/TriumphConfigDto.php @@ -16,12 +16,9 @@ public function __construct( public TriumphScope $scope, public string $targetedEvent, public int $quantity, - public bool $hasComputeStrategy = false, public array $targetedEventExpectedTags = [], public TriumphVisibility $visibility = TriumphVisibility::PRIVATE, public string $target = '', public int $regressiveFactor = 0, - public string $computeStrategy = '', - public array $applicationStrategies = [], ) {} } diff --git a/Api/src/Triumph/Entity/TriumphConfig.php b/Api/src/Triumph/Entity/TriumphConfig.php index 045fdce9a1..acf00d0be3 100644 --- a/Api/src/Triumph/Entity/TriumphConfig.php +++ b/Api/src/Triumph/Entity/TriumphConfig.php @@ -46,12 +46,6 @@ class TriumphConfig #[ORM\Column(type: 'integer', nullable: false, options: ['default' => 0])] private int $regressiveFactor; - #[ORM\Column(type: 'boolean', nullable: false, options: ['default' => false])] - private bool $hasComputeStrategy; - - #[ORM\Column(type: 'array', nullable: false, options: ['default' => 'a:0:{}'])] - private array $applicationStrategies; - private function __construct( string $key, TriumphEnum $name, @@ -62,8 +56,6 @@ private function __construct( int $quantity, TriumphVisibility $visibility, int $regressiveFactor, - bool $hasComputeStrategy, - array $applicationStrategies, ) { $this->key = $key; $this->name = $name; @@ -74,8 +66,6 @@ private function __construct( $this->quantity = $quantity; $this->visibility = $visibility; $this->regressiveFactor = $regressiveFactor; - $this->hasComputeStrategy = $hasComputeStrategy; - $this->applicationStrategies = $applicationStrategies; } public function getName(): TriumphEnum @@ -125,8 +115,6 @@ public static function fromDto(TriumphConfigDto $triumphConfigDto): self $triumphConfigDto->quantity, $triumphConfigDto->visibility, $triumphConfigDto->regressiveFactor, - $triumphConfigDto->hasComputeStrategy, - $triumphConfigDto->applicationStrategies, ); } @@ -141,7 +129,5 @@ public function updateFromDto(TriumphConfigDto $triumphConfigDto): void $this->quantity = $triumphConfigDto->quantity; $this->visibility = $triumphConfigDto->visibility; $this->regressiveFactor = $triumphConfigDto->regressiveFactor; - $this->hasComputeStrategy = $triumphConfigDto->hasComputeStrategy; - $this->applicationStrategies = $triumphConfigDto->applicationStrategies; } } diff --git a/Api/src/Triumph/Enum/TriumphEnum.php b/Api/src/Triumph/Enum/TriumphEnum.php index 8cdfc6365c..1e06fb7fd6 100644 --- a/Api/src/Triumph/Enum/TriumphEnum.php +++ b/Api/src/Triumph/Enum/TriumphEnum.php @@ -10,6 +10,7 @@ enum TriumphEnum: string case CYCLE_MUSH = 'cycle_mush'; case CHUN_LIVES = 'chun_lives'; case RETURN_TO_SOL = 'return_to_sol'; + case SOL_MUSH_INTRUDER = 'sol_mush_intruder'; case NULL = ''; public function toConfigKey(string $configKey): string diff --git a/Api/src/Triumph/Service/ChangeTriumphFromEventService.php b/Api/src/Triumph/Service/ChangeTriumphFromEventService.php index 52ad649265..36b2be37b7 100644 --- a/Api/src/Triumph/Service/ChangeTriumphFromEventService.php +++ b/Api/src/Triumph/Service/ChangeTriumphFromEventService.php @@ -7,6 +7,7 @@ use Mush\Game\Service\EventServiceInterface; use Mush\Player\Entity\Player; use Mush\Triumph\Entity\TriumphConfig; +use Mush\Triumph\Enum\TriumphEnum; use Mush\Triumph\Event\TriumphChangedEvent; use Mush\Triumph\Event\TriumphSourceEventInterface; use Mush\Triumph\Repository\TriumphConfigRepositoryInterface; @@ -35,11 +36,21 @@ public function execute(TriumphSourceEventInterface $event): void private function addTriumphToPlayer(TriumphConfig $triumphConfig, Player $player): void { - $player->addTriumph($triumphConfig->getQuantity()); + $quantity = $this->computeTriumphForPlayer($triumphConfig, $player); + + $player->addTriumph($quantity); $this->eventService->callEvent( new TriumphChangedEvent($player, $triumphConfig), 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/tests/functional/Triumph/Service/ChangeTriumphFromEventServiceCest.php b/Api/tests/functional/Triumph/Service/ChangeTriumphFromEventServiceCest.php index 83c53fb910..1a907cce22 100644 --- a/Api/tests/functional/Triumph/Service/ChangeTriumphFromEventServiceCest.php +++ b/Api/tests/functional/Triumph/Service/ChangeTriumphFromEventServiceCest.php @@ -38,7 +38,7 @@ public function shouldPrintLogWhenTriumphIsChanged(FunctionalTester $I): void $this->changeTriumphFromEventService->execute($event); $this->ISeeTranslatedRoomLogInRepository( - expectedRoomLog: 'Vous avez gagné 1 :triumph: car vous avez survécu un cycle de plus.', + 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(), diff --git a/Api/tests/unit/Triumph/Event/FinishDaedalusEventTest.php b/Api/tests/unit/Triumph/Event/FinishDaedalusEventTest.php index a6b3fa2df7..ccaf99b9d4 100644 --- a/Api/tests/unit/Triumph/Event/FinishDaedalusEventTest.php +++ b/Api/tests/unit/Triumph/Event/FinishDaedalusEventTest.php @@ -11,6 +11,8 @@ use Mush\Game\Service\EventServiceInterface; use Mush\Player\Entity\Player; use Mush\Player\Factory\PlayerFactory; +use Mush\Status\Enum\PlayerStatusEnum; +use Mush\Status\Factory\StatusFactory; use Mush\Tests\unit\Triumph\TestDoubles\Repository\InMemoryTriumphConfigRepository; use Mush\Triumph\ConfigData\TriumphConfigData; use Mush\Triumph\Entity\TriumphConfig; @@ -57,6 +59,19 @@ public function testShouldNotGiveReturnToSolTriumphToAllHumanWhenNotReturningToS $this->thenAllPlayersHaveTriumphPoints(0); } + public function testShouldGiveSolMushIntruderTriumphToAllHumansGivenNumberOfMushPlayers(): void + { + $this->givenASolMushIntruderTriumphConfig(); + + $this->givenPlayerIsMush($this->player2); + $player3 = PlayerFactory::createPlayerWithDaedalus($this->daedalus); + $this->givenPlayerIsMush($player3); + + $this->whenDaedalusFinishesWithReturnToSol(); + + $this->thenPlayerShouldHaveTriumphPoints($this->player, -20); + } + private function givenATriumphConfigRepository(): void { $this->triumphConfigRepository = new InMemoryTriumphConfigRepository(); @@ -91,6 +106,21 @@ private function givenAReturnToSolTriumphConfig(): void ); } + 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( @@ -121,4 +151,9 @@ private function thenAllPlayersHaveTriumphPoints(int $expectedPoints): void self::assertEquals($expectedPoints, $player->getTriumph()); } } + + private function thenPlayerShouldHaveTriumphPoints(Player $player, int $expectedPoints): void + { + self::assertEquals($expectedPoints, $player->getTriumph()); + } } From 01e767730789a5510b843e5fa2d0b523a1016cde Mon Sep 17 00:00:00 2001 From: Evian Date: Sat, 3 May 2025 17:34:47 +0200 Subject: [PATCH 10/27] Handle triumph given by Daedalus finished event --- Api/src/Triumph/Event/TriumphChangedEvent.php | 3 +- ...r.php => TriumphSourceEventSubscriber.php} | 13 ++++-- .../Service/ChangeTriumphFromEventService.php | 2 +- .../Triumph/Event/DaedalusEventCest.php | 40 +++++++++++++++++++ Api/translations/fr/triumph+intl-icu.fr.xlf | 8 +++- 5 files changed, 60 insertions(+), 6 deletions(-) rename Api/src/Triumph/Listener/{DaedalusCycleEventSubscriber.php => TriumphSourceEventSubscriber.php} (52%) create mode 100644 Api/tests/functional/Triumph/Event/DaedalusEventCest.php diff --git a/Api/src/Triumph/Event/TriumphChangedEvent.php b/Api/src/Triumph/Event/TriumphChangedEvent.php index 7547dfb06c..f9de74d900 100644 --- a/Api/src/Triumph/Event/TriumphChangedEvent.php +++ b/Api/src/Triumph/Event/TriumphChangedEvent.php @@ -14,6 +14,7 @@ final class TriumphChangedEvent extends AbstractGameEvent public function __construct( private Player $player, private TriumphConfig $triumphConfig, + private int $quantity, protected array $tags = [], protected \DateTime $time = new \DateTime(), ) { @@ -42,6 +43,6 @@ public function getVisibility(): string public function getQuantity(): int { - return abs($this->triumphConfig->getQuantity()); + return abs($this->quantity); } } diff --git a/Api/src/Triumph/Listener/DaedalusCycleEventSubscriber.php b/Api/src/Triumph/Listener/TriumphSourceEventSubscriber.php similarity index 52% rename from Api/src/Triumph/Listener/DaedalusCycleEventSubscriber.php rename to Api/src/Triumph/Listener/TriumphSourceEventSubscriber.php index 9c94cbd0b6..77bc6721eb 100644 --- a/Api/src/Triumph/Listener/DaedalusCycleEventSubscriber.php +++ b/Api/src/Triumph/Listener/TriumphSourceEventSubscriber.php @@ -5,11 +5,12 @@ namespace Mush\Triumph\Listener; use Mush\Daedalus\Event\DaedalusCycleEvent; +use Mush\Daedalus\Event\DaedalusEvent; use Mush\Game\Enum\EventPriorityEnum; use Mush\Triumph\Service\ChangeTriumphFromEventService; use Symfony\Component\EventDispatcher\EventSubscriberInterface; -final class DaedalusCycleEventSubscriber implements EventSubscriberInterface +final class TriumphSourceEventSubscriber implements EventSubscriberInterface { public function __construct( private ChangeTriumphFromEventService $changeTriumphFromEventService, @@ -18,11 +19,17 @@ public function __construct( public static function getSubscribedEvents(): array { return [ - DaedalusCycleEvent::DAEDALUS_NEW_CYCLE => ['onNewCycle', EventPriorityEnum::PLAYER_TRIUMPH], + DaedalusCycleEvent::DAEDALUS_NEW_CYCLE => ['onDaedalusNewCycle', EventPriorityEnum::PLAYER_TRIUMPH], + DaedalusEvent::FINISH_DAEDALUS => ['onDaedalusFinish', EventPriorityEnum::HIGH], ]; } - public function onNewCycle(DaedalusCycleEvent $event): void + public function onDaedalusNewCycle(DaedalusCycleEvent $event): void + { + $this->changeTriumphFromEventService->execute($event); + } + + public function onDaedalusFinish(DaedalusEvent $event): void { $this->changeTriumphFromEventService->execute($event); } diff --git a/Api/src/Triumph/Service/ChangeTriumphFromEventService.php b/Api/src/Triumph/Service/ChangeTriumphFromEventService.php index 36b2be37b7..7c5a8ca786 100644 --- a/Api/src/Triumph/Service/ChangeTriumphFromEventService.php +++ b/Api/src/Triumph/Service/ChangeTriumphFromEventService.php @@ -41,7 +41,7 @@ private function addTriumphToPlayer(TriumphConfig $triumphConfig, Player $player $player->addTriumph($quantity); $this->eventService->callEvent( - new TriumphChangedEvent($player, $triumphConfig), + new TriumphChangedEvent($player, $triumphConfig, $quantity), TriumphChangedEvent::class, ); } diff --git a/Api/tests/functional/Triumph/Event/DaedalusEventCest.php b/Api/tests/functional/Triumph/Event/DaedalusEventCest.php new file mode 100644 index 0000000000..43fc733f21 --- /dev/null +++ b/Api/tests/functional/Triumph/Event/DaedalusEventCest.php @@ -0,0 +1,40 @@ +eventService = $I->grabService(EventServiceInterface::class); + } + + public function shouldGiveTriumphOnDaedalusEvent(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); + + $I->assertEquals(20, $this->player->getTriumph()); + } +} diff --git a/Api/translations/fr/triumph+intl-icu.fr.xlf b/Api/translations/fr/triumph+intl-icu.fr.xlf index b144e7a038..005f6be954 100644 --- a/Api/translations/fr/triumph+intl-icu.fr.xlf +++ b/Api/translations/fr/triumph+intl-icu.fr.xlf @@ -22,7 +22,13 @@ return_to_sol - Vous gagnez {quantity} :triumph: car vous êtes rentré sur 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... From f85dc9b3186562ce88dddb0723b0cd4f51484567 Mon Sep 17 00:00:00 2001 From: Evian Date: Sat, 3 May 2025 21:44:03 +0200 Subject: [PATCH 11/27] style: apply linter fixes --- Api/src/Triumph/DataFixtures/TriumphConfigFixtures.php | 1 + Api/src/Triumph/Entity/TriumphConfigCollection.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Api/src/Triumph/DataFixtures/TriumphConfigFixtures.php b/Api/src/Triumph/DataFixtures/TriumphConfigFixtures.php index 9e63d187d1..19e2581ed5 100644 --- a/Api/src/Triumph/DataFixtures/TriumphConfigFixtures.php +++ b/Api/src/Triumph/DataFixtures/TriumphConfigFixtures.php @@ -6,6 +6,7 @@ use Doctrine\Common\DataFixtures\DependentFixtureInterface; use Doctrine\Persistence\ObjectManager; use Mush\Game\DataFixtures\GameConfigFixtures; +use Mush\Game\Entity\GameConfig; use Mush\Triumph\ConfigData\TriumphConfigData; use Mush\Triumph\Entity\TriumphConfig; diff --git a/Api/src/Triumph/Entity/TriumphConfigCollection.php b/Api/src/Triumph/Entity/TriumphConfigCollection.php index cc7a2568ee..ad33111161 100644 --- a/Api/src/Triumph/Entity/TriumphConfigCollection.php +++ b/Api/src/Triumph/Entity/TriumphConfigCollection.php @@ -17,7 +17,7 @@ public function getByNameOrThrow(TriumphEnum $name): TriumphConfig $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; From a5a9cc164c4cd6fc41ff05bde965a478d969fa93 Mon Sep 17 00:00:00 2001 From: Evian Date: Sat, 3 May 2025 21:54:23 +0200 Subject: [PATCH 12/27] style: apply linter fixes --- Api/src/Game/ConfigData/GameConfigData.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Api/src/Game/ConfigData/GameConfigData.php b/Api/src/Game/ConfigData/GameConfigData.php index 63b7ded64e..52162a669f 100644 --- a/Api/src/Game/ConfigData/GameConfigData.php +++ b/Api/src/Game/ConfigData/GameConfigData.php @@ -524,11 +524,11 @@ public static function getAll(): array 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', - ], + 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', From 75b6649f95a49747882c7b7bb1acd97444011d1b Mon Sep 17 00:00:00 2001 From: Evian Date: Wed, 14 May 2025 22:34:35 +0200 Subject: [PATCH 13/27] Apply 1 suggestion(s) to 1 file(s) --- Api/migrations/Version20250501184525.php | 1 - 1 file changed, 1 deletion(-) diff --git a/Api/migrations/Version20250501184525.php b/Api/migrations/Version20250501184525.php index 0a63e12762..fc780164bf 100644 --- a/Api/migrations/Version20250501184525.php +++ b/Api/migrations/Version20250501184525.php @@ -37,7 +37,6 @@ public function up(Schema $schema): void public function down(Schema $schema): void { // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE SCHEMA public'); $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'); From a322f984ae15a5ce0d6418788fdfabc0ade64bb1 Mon Sep 17 00:00:00 2001 From: Evian Date: Sat, 17 May 2025 01:24:23 +0200 Subject: [PATCH 14/27] fix: update triumph scope names so there are more accurate --- Api/src/Daedalus/Event/DaedalusCycleEvent.php | 6 +++--- Api/src/Triumph/ConfigData/TriumphConfigData.php | 8 ++++---- Api/src/Triumph/Enum/TriumphScope.php | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Api/src/Daedalus/Event/DaedalusCycleEvent.php b/Api/src/Daedalus/Event/DaedalusCycleEvent.php index b909a1da9e..3155e24326 100644 --- a/Api/src/Daedalus/Event/DaedalusCycleEvent.php +++ b/Api/src/Daedalus/Event/DaedalusCycleEvent.php @@ -55,9 +55,9 @@ public function getLinkWithSolCycleKillChance(): int public function getTargetsForTriumph(TriumphConfig $triumphConfig): PlayerCollection { return match ($triumphConfig->getScope()) { - TriumphScope::ALL_ACTIVE_HUMAN => $this->daedalus->getHumanPlayers()->getActivePlayers(), - TriumphScope::ALL_HUMAN => $this->daedalus->getAlivePlayers()->getHumanPlayer(), - TriumphScope::ALL_MUSH => $this->daedalus->getAlivePlayers()->getMushPlayer(), + TriumphScope::ALL_ACTIVE_HUMANS => $this->daedalus->getAlivePlayers()->getHumanPlayer()->getActivePlayers(), + TriumphScope::ALL_ALIVE_HUMANS => $this->daedalus->getAlivePlayers()->getHumanPlayer(), + 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/Triumph/ConfigData/TriumphConfigData.php b/Api/src/Triumph/ConfigData/TriumphConfigData.php index ed6fde3500..78ed6b2e25 100644 --- a/Api/src/Triumph/ConfigData/TriumphConfigData.php +++ b/Api/src/Triumph/ConfigData/TriumphConfigData.php @@ -25,14 +25,14 @@ public static function getAll(): array key: TriumphEnum::CYCLE_HUMAN->toConfigKey('default'), name: TriumphEnum::CYCLE_HUMAN, targetedEvent: DaedalusCycleEvent::DAEDALUS_NEW_CYCLE, - scope: TriumphScope::ALL_ACTIVE_HUMAN, + 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_MUSH, + scope: TriumphScope::ALL_MUSHS, quantity: -2, ), new TriumphConfigDto( @@ -53,7 +53,7 @@ public static function getAll(): array targetedEventExpectedTags: [ ActionEnum::RETURN_TO_SOL->toString(), ], - scope: TriumphScope::ALL_HUMAN, + scope: TriumphScope::ALL_ALIVE_HUMANS, quantity: 20, ), new TriumphConfigDto( @@ -63,7 +63,7 @@ public static function getAll(): array targetedEventExpectedTags: [ ActionEnum::RETURN_TO_SOL->toString(), ], - scope: TriumphScope::ALL_HUMAN, + scope: TriumphScope::ALL_ALIVE_HUMANS, quantity: -10, ), ]; diff --git a/Api/src/Triumph/Enum/TriumphScope.php b/Api/src/Triumph/Enum/TriumphScope.php index 8baae1c616..db1945f739 100644 --- a/Api/src/Triumph/Enum/TriumphScope.php +++ b/Api/src/Triumph/Enum/TriumphScope.php @@ -6,9 +6,9 @@ enum TriumphScope: string { - case ALL_ACTIVE_HUMAN = 'all_active_human'; - case ALL_HUMAN = 'all_human'; - case ALL_MUSH = 'all_mush'; + case ALL_ACTIVE_HUMANS = 'all_active_humans'; + case ALL_ALIVE_HUMANS = 'all_alive_humans'; + case ALL_MUSHS = 'all_mushs'; case PERSONAL = 'personal'; case NULL = ''; From c3017e67bfa2490a0aed6734e95b4ac291bda02c Mon Sep 17 00:00:00 2001 From: Evian Date: Sat, 24 May 2025 11:38:00 +0200 Subject: [PATCH 15/27] style: apply linter fixes --- .../TestDoubles/Repository/InMemoryTriumphConfigRepository.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Api/tests/unit/Triumph/TestDoubles/Repository/InMemoryTriumphConfigRepository.php b/Api/tests/unit/Triumph/TestDoubles/Repository/InMemoryTriumphConfigRepository.php index 34d8f27952..c91f25dd8a 100644 --- a/Api/tests/unit/Triumph/TestDoubles/Repository/InMemoryTriumphConfigRepository.php +++ b/Api/tests/unit/Triumph/TestDoubles/Repository/InMemoryTriumphConfigRepository.php @@ -15,6 +15,8 @@ final class InMemoryTriumphConfigRepository implements TriumphConfigRepositoryIn public function findAllByTargetedEvent(TriumphSourceEventInterface $targetedEvent): array { + $triumphConfigs = []; + foreach ($this->triumphConfigs as $triumphConfig) { if ($triumphConfig->getTargetedEvent() === $targetedEvent->getEventName()) { $triumphConfigs[] = $triumphConfig; From 0b1eea3981624f6fc0a07d1c45f88a0fc589d5a5 Mon Sep 17 00:00:00 2001 From: Evian Date: Mon, 26 May 2025 20:45:38 +0200 Subject: [PATCH 16/27] refactor: a single integration test file for all triumph source events --- .../Triumph/Event/DaedalusCycleEventCest.php | 39 ------------------- ...entCest.php => TriumphSourceEventCest.php} | 21 +++++++++- 2 files changed, 19 insertions(+), 41 deletions(-) delete mode 100644 Api/tests/functional/Triumph/Event/DaedalusCycleEventCest.php rename Api/tests/functional/Triumph/Event/{DaedalusEventCest.php => TriumphSourceEventCest.php} (57%) diff --git a/Api/tests/functional/Triumph/Event/DaedalusCycleEventCest.php b/Api/tests/functional/Triumph/Event/DaedalusCycleEventCest.php deleted file mode 100644 index 7d09559be7..0000000000 --- a/Api/tests/functional/Triumph/Event/DaedalusCycleEventCest.php +++ /dev/null @@ -1,39 +0,0 @@ -eventService = $I->grabService(EventServiceInterface::class); - } - - public function shouldGiveCycleHumanTriumphToHumans(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); - - $I->assertEquals(1, $this->player->getTriumph()); - } -} diff --git a/Api/tests/functional/Triumph/Event/DaedalusEventCest.php b/Api/tests/functional/Triumph/Event/TriumphSourceEventCest.php similarity index 57% rename from Api/tests/functional/Triumph/Event/DaedalusEventCest.php rename to Api/tests/functional/Triumph/Event/TriumphSourceEventCest.php index 43fc733f21..bcf75ec601 100644 --- a/Api/tests/functional/Triumph/Event/DaedalusEventCest.php +++ b/Api/tests/functional/Triumph/Event/TriumphSourceEventCest.php @@ -5,6 +5,7 @@ namespace Mush\Tests\functional\Triumph\Event; use Mush\Action\Enum\ActionEnum; +use Mush\Daedalus\Event\DaedalusCycleEvent; use Mush\Daedalus\Event\DaedalusEvent; use Mush\Game\Service\EventServiceInterface; use Mush\Tests\AbstractFunctionalTest; @@ -13,17 +14,32 @@ /** * @internal */ -final class DaedalusEventCest extends AbstractFunctionalTest +final class TriumphSourceEventCest extends AbstractFunctionalTest { private EventServiceInterface $eventService; - public function _before(FunctionalTester $I) + public function _before(FunctionalTester $I): void { parent::_before($I); $this->eventService = $I->grabService(EventServiceInterface::class); } + public function shouldGiveTriumphOnDaedalusNewCycleEvent(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 shouldGiveTriumphOnDaedalusEvent(FunctionalTester $I): void { $this->player->setTriumph(0); @@ -35,6 +51,7 @@ public function shouldGiveTriumphOnDaedalusEvent(FunctionalTester $I): void ); $this->eventService->callEvent($event, DaedalusEvent::FINISH_DAEDALUS); + // return to sol human triumph $I->assertEquals(20, $this->player->getTriumph()); } } From 1649d6c59e2203f9a5f225d4f32cb910d2d9cb1a Mon Sep 17 00:00:00 2001 From: Evian Date: Mon, 26 May 2025 22:29:44 +0200 Subject: [PATCH 17/27] docs: Add documentation on how to add a new triumph --- Api/src/Triumph/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 Api/src/Triumph/README.md diff --git a/Api/src/Triumph/README.md b/Api/src/Triumph/README.md new file mode 100644 index 0000000000..eca82e379d --- /dev/null +++ b/Api/src/Triumph/README.md @@ -0,0 +1,10 @@ +# Triumph + +# How to add a new triumph ? + +- Add the triumph config to [TriumphConfigData](./ConfigData/TriumphConfigData.php) +- If the triumph listens to a new event, it should : + - implement [TriumphSourceEventInterface](./Event/TriumphSourceEventInterface.php) + - be added to [TriumphSourceEventSubscriber](./Listener/TriumphSourceEventSubscriber.php) +- Add the triumph log in [triumph+intl-icu.fr.xlf](./translations/fr/triumph+intl-icu.fr.xlf) + From ad14ca097cb24333c45b49ef42f676f0cb8165b1 Mon Sep 17 00:00:00 2001 From: Evian Date: Mon, 26 May 2025 22:30:01 +0200 Subject: [PATCH 18/27] feat: Change triumph icon for Mush players --- App/src/components/Game/BannerPanel.vue | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 }} + + +