wicked-waifus-rs/wicked-waifus-game-server/src/logic/utils/condition_utils.rs
2025-04-04 02:36:52 +07:00

153 lines
No EOL
11 KiB
Rust

use wicked_waifus_data::pb_components::condition::{CheckConditionGroup, CompareEntityState, Condition};
use crate::logic::ecs::component::ComponentContainer;
use crate::logic::player::Player;
use crate::logic::utils::tag_utils;
use crate::query_components;
macro_rules! unimplemented_condition {
($condition:ident) => {
{
tracing::warn!("Condition check not implemented for: {:?}", $condition);
true
}
}
}
pub fn check_condition(player: &Player,
entity_id: i64,
level_entity_data: &wicked_waifus_data::LevelEntityConfigData,
template_config: &wicked_waifus_data::TemplateConfigData,
element: Condition) -> bool {
match element {
Condition::CompareTimePeriod(condition) => unimplemented_condition! { condition },
Condition::CheckChildQuestFinished(condition) => unimplemented_condition! { condition },
Condition::CompareEntityState(condition) => compare_entity_state(player, entity_id, condition),
Condition::CheckEntityState(condition) => unimplemented_condition! { condition },
Condition::CompareVar(condition) => unimplemented_condition! { condition },
Condition::CompareWeather(condition) => unimplemented_condition! { condition },
Condition::CompareQuestState(condition) => unimplemented_condition! { condition },
Condition::CompareEntitySelfState(condition) => unimplemented_condition! { condition },
Condition::CheckPlayerStateRestriction(condition) => unimplemented_condition! { condition },
Condition::HourToHour(condition) => unimplemented_condition! { condition },
Condition::ComparePlayerMotionState(condition) => unimplemented_condition! { condition },
Condition::ComparePlayerMotionState2(condition) => unimplemented_condition! { condition },
Condition::CheckAiState(condition) => unimplemented_condition! { condition },
Condition::PreLevelPlay(condition) => unimplemented_condition! { condition },
Condition::CheckLevelPlay(condition) => unimplemented_condition! { condition },
Condition::CheckLevelPlayState(condition) => unimplemented_condition! { condition },
Condition::CheckLevelPlayCompleteNumber(condition) => unimplemented_condition! { condition },
Condition::CompareLevelPlayRewardState(condition) => unimplemented_condition! { condition },
Condition::CheckItems(condition) => unimplemented_condition! { condition },
Condition::HandInItems(condition) => unimplemented_condition! { condition },
Condition::GetItem(condition) => unimplemented_condition! { condition },
Condition::UseItem(condition) => unimplemented_condition! { condition },
Condition::HasBuff(condition) => unimplemented_condition! { condition },
Condition::CompareLift(condition) => unimplemented_condition! { condition },
Condition::CheckJigsawInfo(condition) => unimplemented_condition! { condition },
Condition::CheckInCombat(condition) => unimplemented_condition! { condition },
Condition::DetectCombatState(condition) => unimplemented_condition! { condition },
Condition::DetectCombatState2(condition) => unimplemented_condition! { condition },
Condition::CheckVehicleCondition(condition) => unimplemented_condition! { condition },
Condition::CheckSystemFunction(condition) => unimplemented_condition! { condition },
Condition::CheckSystemState(condition) => unimplemented_condition! { condition },
Condition::CheckCollectAnimalParts(condition) => unimplemented_condition! { condition },
Condition::CheckCurrentRole(condition) => unimplemented_condition! { condition },
Condition::CompareExploreLevel(condition) => unimplemented_condition! { condition },
Condition::ExploreLevel(condition) => unimplemented_condition! { condition },
Condition::CompareDungeonId(condition) => unimplemented_condition! { condition },
Condition::EnterDungeon(condition) => unimplemented_condition! { condition },
Condition::LeaveDungeon(condition) => unimplemented_condition! { condition },
Condition::FinishDungeon(condition) => unimplemented_condition! { condition },
Condition::CheckDungeonFinish(condition) => unimplemented_condition! { condition },
Condition::CheckDungeonHasSaveConfig(condition) => unimplemented_condition! { condition },
Condition::CompareCalabashLevel(condition) => unimplemented_condition! { condition },
Condition::CheckCalabashDevelopReward(condition) => unimplemented_condition! { condition },
Condition::CheckLordGymFinish(condition) => unimplemented_condition! { condition },
Condition::CompareEntityGroupState(condition) => unimplemented_condition! { condition },
Condition::CheckEntityLocked(condition) => unimplemented_condition! { condition },
Condition::CheckRogueAbilitySelect(condition) => unimplemented_condition! { condition },
Condition::CompareFishingBoatState(condition) => unimplemented_condition! { condition },
Condition::CompleteCertainFishingEntrust(condition) => unimplemented_condition! { condition },
Condition::CompareFishingPrestigeLevel(condition) => unimplemented_condition! { condition },
Condition::CheckCertainFishingItemCount(condition) => unimplemented_condition! { condition },
Condition::CompareFishingTechLevel(condition) => unimplemented_condition! { condition },
Condition::ListenEntitySelfEvent(condition) => unimplemented_condition! { condition },
Condition::CheckHookLockPoint(condition) => unimplemented_condition! { condition },
Condition::CheckEntitesExist(condition) => unimplemented_condition! { condition },
Condition::CheckEntityHasSceneItemAttributeTag(condition) => unimplemented_condition! { condition },
Condition::CheckTargetBattleAttribute(condition) => unimplemented_condition! { condition },
Condition::CheckAlertAreaEnabled(condition) => unimplemented_condition! { condition },
Condition::CompareAlertValue(condition) => unimplemented_condition! { condition },
Condition::ReachArea(condition) => unimplemented_condition! { condition },
Condition::Kill(condition) => unimplemented_condition! { condition },
Condition::DoInteract(condition) => unimplemented_condition! { condition },
Condition::MonsterCreator(condition) => unimplemented_condition! { condition },
Condition::UseSkill(condition) => unimplemented_condition! { condition },
Condition::GetSkill(condition) => unimplemented_condition! { condition },
Condition::Parkour(condition) => unimplemented_condition! { condition },
Condition::Timer(condition) => unimplemented_condition! { condition },
Condition::Guide(condition) => unimplemented_condition! { condition },
Condition::PlayFlow(condition) => unimplemented_condition! { condition },
Condition::InformationViewCheck(condition) => unimplemented_condition! { condition },
Condition::ShowUi(condition) => unimplemented_condition! { condition },
Condition::CheckUiGame(condition) => unimplemented_condition! { condition },
Condition::ScheduleTime(condition) => unimplemented_condition! { condition },
Condition::CheckPlayerSkillReady(condition) => unimplemented_condition! { condition },
Condition::WaitTime(condition) => unimplemented_condition! { condition },
Condition::TakePhoto(condition) => unimplemented_condition! { condition },
Condition::ParallaxAlign(condition) => unimplemented_condition! { condition },
Condition::WaitBattleCondition(condition) => unimplemented_condition! { condition },
Condition::CheckDirection(condition) => unimplemented_condition! { condition },
Condition::CheckConditionGroup(condition) => check_condition_group(player, entity_id, level_entity_data, template_config, condition),
Condition::CheckTreasureBeenClaimed(condition) => unimplemented_condition! { condition },
Condition::RangeSphere(condition) => unimplemented_condition! { condition },
Condition::CheckInRange(condition) => unimplemented_condition! { condition },
Condition::CheckPlayerGender(condition) => unimplemented_condition! { condition },
Condition::CheckPlayerInput(condition) => unimplemented_condition! { condition },
Condition::CheckFormationRoleInfo(condition) => unimplemented_condition! { condition },
Condition::AwakeAndLoadEntity(condition) => unimplemented_condition! { condition },
Condition::CheckChessWinner(condition) => unimplemented_condition! { condition },
Condition::WalkingPattern(condition) => unimplemented_condition! { condition },
Condition::CheckDataLayer(condition) => unimplemented_condition! { condition },
Condition::CheckFinishLoading(condition) => unimplemented_condition! { condition },
Condition::VisionSystem(condition) => unimplemented_condition! { condition },
Condition::ReadMail(condition) => unimplemented_condition! { condition },
Condition::ReceiveTelecom(condition) => unimplemented_condition! { condition },
Condition::CheckActivityState(condition) => unimplemented_condition! { condition },
Condition::CheckSubLevelState(condition) => unimplemented_condition! { condition },
Condition::CheckEntityGravityDirection(condition) => unimplemented_condition! { condition },
Condition::CheckTeleControlState(condition) => unimplemented_condition! { condition },
Condition::CheckEntityReward(condition) => unimplemented_condition! { condition },
}
}
fn compare_entity_state(player: &Player, entity_id: i64, condition: CompareEntityState) -> bool {
let actual = {
let world_ref = player.world.borrow();
let world = world_ref.get_world_entity();
let state_tag = query_components!(world, entity_id, StateTag).0.unwrap();
state_tag.state_tag_id
};
let expected = tag_utils::get_tag_id_by_name(condition.state.as_str());
// In theory, we can only check for equal or not equal
tracing::debug!("CompareEntityState: type {:?}, actual: {actual}, expected: {expected}", condition.compare);
condition.compare.cmp(&expected, &actual)
}
fn check_condition_group(player: &Player,
entity_id: i64,
level_entity_data: &wicked_waifus_data::LevelEntityConfigData,
template_config: &wicked_waifus_data::TemplateConfigData,
condition: CheckConditionGroup) -> bool {
let mut check = true;
// TODO: Investigate if type has a meaning
for element in condition.condition.conditions {
check = check_condition(player, entity_id, level_entity_data, template_config, element);
if !check {
break;
}
}
check
}