示例#1
0
        private static EventAction <GameEntityModel> .ExecutionDelegate BuildGetHurt(Storage.GenericParameter parameter)
        {
            int    hittersSubjectId      = parameter.SafeInt(1);
            int    numeratorSubjectId    = parameter.SafeInt(2);
            string numeratorVariableName = parameter.SafeString(0);
            int    defaultPercentage     = parameter.SafeInt(3);
            int    facingOptions         = parameter.SafeInt(4);

            return(delegate(GameEntityModel model, List <GameEntityModel>[] subjectModels){
                List <GameEntityModel> hitterSubjects = ConditionUtils <GameEntityModel> .GetNonEmptySubjectOrNil(subjectModels, hittersSubjectId);

                if (hitterSubjects == null || hitterSubjects.Count == 0)
                {
                    return;
                }
                FixedFloat percentage = GetNumeratorValue(model, numeratorSubjectId, numeratorVariableName, defaultPercentage, subjectModels);
                percentage /= 100;

                switch (facingOptions)
                {
                case -1:
                    // Use hit data
                    GameEntityController.HurtBasedOnHitData(model, percentage, hitterSubjects);
                    break;

                default:
                    // Use given facing options
                    GameEntityController.HurtBasedOnFacingOptions(model, (HitData.HitFacing)facingOptions, percentage, hitterSubjects);
                    break;
                }
            });
        }
        // Frame
        private static EventCondition <GameEntityModel> .EvaluationDelegate BuildFrame(Storage.GenericParameter parameter, out int keyFrame, Storage.CharacterAnimation animation)
        {
            keyFrame = InvalidKeyframe;
            // Read subject, operator, numerator subject, numerator variable, frame number
            int subjectId = parameter.SafeInt(0);

            ConditionUtils <GameEntityModel> .ComparisonOperation comparisonOperator = (ConditionUtils <GameEntityModel> .ComparisonOperation)parameter.SafeInt(1);
            int    numeratorSubjectId      = parameter.SafeInt(2);
            string numeratorSubjectVarName = parameter.SafeString(0);
            int    staticComparisonFrame   = parameter.SafeInt(3);

            // If it's equal to a static frame, no delegate required, return frame directly
            if (subjectId == (int)CharacterSubjectsBuilder.PredefinedSubjects.self &&
                comparisonOperator == ConditionUtils <GameEntityModel> .ComparisonOperation.equal &&
                numeratorSubjectId - 2 == (int)CharacterSubjectsBuilder.PredefinedSubjects.none
                )
            {
                keyFrame = staticComparisonFrame;
                if (keyFrame < 0)
                {
                    keyFrame = animation.numFrames - 1;
                }
                return(null);
            }

            // Else return delegate
            return(delegate(GameEntityModel mainModel, List <GameEntityModel>[] subjectModels){
                AnimationModel animModel = StateManager.state.GetModel(mainModel.animationModelId) as AnimationModel;
                if (animModel == null)
                {
                    return false;
                }
                return CompareWithNumerator(mainModel, numeratorSubjectId, numeratorSubjectVarName, (int)animModel.currentFrame, staticComparisonFrame, comparisonOperator, subjectModels);
            });
        }
        // CompareWithNumerator, FixedFloat version
        private static bool CompareWithNumerator(
            GameEntityModel mainModel,
            int numeratorSubjectId,
            string numeratorSubjectVarName,
            FixedFloat comparisonValue,
            FixedFloat staticComparisonValue,
            ConditionUtils <GameEntityModel> .ComparisonOperation comparisonOperator,
            List <GameEntityModel>[] subjectModels
            )
        {
            // no subject
            if (numeratorSubjectId == 0)
            {
                return(ConditionUtils <GameEntityModel> .Compare(comparisonOperator, comparisonValue, staticComparisonValue));
            }
            // global variable
            if (numeratorSubjectId == 1)
            {
                // Global variable may have references to a team ID, character name, player number, etc
                numeratorSubjectVarName = ParseVariableValuesInGlobalName(mainModel, numeratorSubjectVarName);

                int        globalVariableValue = 0;
                WorldModel worldModel          = StateManager.state.MainModel as WorldModel;
                worldModel.globalVariables.TryGetValue(numeratorSubjectVarName, out globalVariableValue);
                return(ConditionUtils <GameEntityModel> .Compare(comparisonOperator, comparisonValue, (FixedFloat)globalVariableValue));
            }
            // subject variable
            numeratorSubjectId -= 2;
            List <GameEntityModel> comparisonSubject = ConditionUtils <GameEntityModel> .GetNonEmptySubjectOrNil(subjectModels, numeratorSubjectId);

            if (comparisonSubject == null || comparisonSubject.Count == 0)
            {
                return(false);
            }
            // compare each model's velocity with each comparison subject variable, return true if all pass
            int variableValue;

            foreach (GameEntityModel comparisonModel in comparisonSubject)
            {
                if (!comparisonModel.customVariables.TryGetValue(numeratorSubjectVarName, out variableValue))
                {
                    return(false);
                }
                if (!ConditionUtils <GameEntityModel> .Compare(comparisonOperator, comparisonValue, (FixedFloat)variableValue))
                {
                    return(false);
                }
            }
            return(true);
        }
示例#4
0
        private static EventAction <GameEntityModel> .ExecutionDelegate BuildGrab(Storage.GenericParameter parameter)
        {
            int subjectId = parameter.SafeInt(1);
            int anchorId  = parameter.SafeInt(2);

            return(delegate(GameEntityModel model, List <GameEntityModel>[] subjectModels){
                List <GameEntityModel> refSubjects = ConditionUtils <GameEntityModel> .GetNonEmptySubjectOrNil(subjectModels, subjectId);

                if (refSubjects == null || refSubjects.Count == 0)
                {
                    return;
                }
                GameEntityModel refModel = refSubjects[StateManager.state.Random.NextInt(0, refSubjects.Count - 1)];
                GameEntityAnchoringOperations.AnchorEntity(model, refModel, anchorId);
            });
        }
示例#5
0
        private static EventAction <GameEntityModel> .ExecutionDelegate BuildReleaseOwnership(Storage.GenericParameter parameter)
        {
            int subjectId = parameter.SafeInt(1);

            return(delegate(GameEntityModel model, List <GameEntityModel>[] subjectModels){
                List <GameEntityModel> subjectToBeReleased = ConditionUtils <GameEntityModel> .GetNonEmptySubjectOrNil(subjectModels, subjectId);

                if (subjectToBeReleased == null || subjectToBeReleased.Count == 0)
                {
                    return;
                }
                foreach (GameEntityModel entityToBeReleased in subjectToBeReleased)
                {
                    GameEntityAnchoringOperations.ReleaseOwnership(entityToBeReleased);
                }
            });
        }
示例#6
0
        private static EventAction <GameEntityModel> .ExecutionDelegate BuildReleaseGrab(Storage.GenericParameter parameter)
        {
            int subjectId = parameter.SafeInt(1);

            return(delegate(GameEntityModel model, List <GameEntityModel>[] subjectModels){
                List <GameEntityModel> refSubjects = ConditionUtils <GameEntityModel> .GetNonEmptySubjectOrNil(subjectModels, subjectId);

                if (refSubjects == null || refSubjects.Count == 0)
                {
                    return;
                }
                foreach (GameEntityModel refSubject in refSubjects)
                {
                    GameEntityAnchoringOperations.ReleaseAnchoredEntity(model, refSubject);
                }
            });
        }
示例#7
0
        // pos(2.1, 4.2, 5.3)
        private static EventAction <GameEntityModel> .ExecutionDelegate BuildSetDeltaPosition(Storage.GenericParameter parameter)
        {
            int          relativeSubjectId = parameter.SafeInt(1);
            FixedVector3 deltaPos          = BuildFixedVector3(parameter, 0);

            return(delegate(GameEntityModel model, List <GameEntityModel>[] subjectModels){
                List <GameEntityModel> refSubjects = ConditionUtils <GameEntityModel> .GetNonEmptySubjectOrNil(subjectModels, relativeSubjectId);

                if (refSubjects == null || refSubjects.Count == 0)
                {
                    return;
                }
                // Select one randomly
                GameEntityModel refModel = refSubjects[StateManager.state.Random.NextInt(0, refSubjects.Count - 1)];
                FixedVector3 realDelta;
                if (!refModel.IsFacingRight())
                {
                    deltaPos.X *= -1;
                }
                PhysicPointModel mainPoint = StateManager.state.GetModel(model.physicsModelId) as PhysicPointModel;
                if (mainPoint == null)
                {
                    return;
                }
                if (refModel != model)
                {
                    PhysicPointModel refPoint = StateManager.state.GetModel(refModel.physicsModelId) as PhysicPointModel;
                    if (refPoint == null)
                    {
                        return;
                    }
                    realDelta = (refPoint.position + deltaPos) - mainPoint.position;
                }
                else
                {
                    realDelta = deltaPos;
                }

                PhysicPointController pointController = mainPoint.Controller() as PhysicPointController;
                if (pointController == null)
                {
                    return;
                }
                pointController.SetVelocityAffector(mainPoint, PhysicPointController.setPositionffectorName, realDelta);
            });
        }
示例#8
0
//		private static GenericEvent<GameEntityModel> BuildSpawnEffect(Storage.GenericParameter parameter){
//			FixedVector3 offset = BuildFixedVector3(parameter);
//			string prefabName = parameter.SafeString(0);
//			int locationType = parameter.SafeInt(0);
//			int lifetime = parameter.SafeInt(1);
//			bool localSpace = parameter.SafeBool(0);
//
//			// {"self", "anchor", "hit intersection", "hurt intersection"}
//			PentaEntityAnimationEvent<string, int, FixedVector3, bool, GameEntityView.ConvertGameToViewCoordinates>.EventExecutionDelegate theDelegate = null;
//			switch (locationType) {
//				case 0:
//					// self
//					theDelegate = GameEntityView.SpawnAtSelf;
//					break;
//				case 1:
//					// Anchor, TODO: which anchor?
//					RetroBread.Debug.LogError("Spawn at anchor not supported yet");
//					break;
//				case 2:
//					// hit
//					theDelegate = GameEntityView.SpawnAtHitIntersection;
//					break;
//				case 3:
//					// hurt
//					theDelegate = GameEntityView.SpawnAtHurtIntersection;
//					break;
//			}
//
//			return new PentaEntityAnimationEvent<string, int, FixedVector3, bool, GameEntityView.ConvertGameToViewCoordinates>(
//				null,
//				theDelegate,
//				prefabName,
//				lifetime,
//				offset,
//				localSpace,
//				PhysicPoint2DView.ConvertGameToViewCoordinates // TODO: store this delegate at a setup file, so it's easier to configure
//			);
//
//		}



        #endregion



        #region Auxiliar Functions


        // CompareWithNumerator, int version
        // Comes in duplicate due to conversion FixedFloat to int not working with parameterized types
        // TODO; extract this method to some utils, as it's used by CharacterConditionsBuilder, adapted
        private static int GetNumeratorValue(
            GameEntityModel mainModel,
            int numeratorSubjectId,
            string numeratorSubjectVarName,
            int staticValue,
            List <GameEntityModel>[] subjectModels
            )
        {
            // no subject
            if (numeratorSubjectId == 0)
            {
                return(staticValue);
            }
            // global variable
            if (numeratorSubjectId == 1)
            {
                // Global variable may have references to a team ID, character name, player number, etc
                numeratorSubjectVarName = CharacterConditionsBuilder.ParseVariableValuesInGlobalName(mainModel, numeratorSubjectVarName);

                int        globalVariableValue = 0;
                WorldModel worldModel          = StateManager.state.MainModel as WorldModel;
                worldModel.globalVariables.TryGetValue(numeratorSubjectVarName, out globalVariableValue);
                return(globalVariableValue);
            }
            // subject variable
            numeratorSubjectId -= 2;
            List <GameEntityModel> numeratorSubjects = ConditionUtils <GameEntityModel> .GetNonEmptySubjectOrNil(subjectModels, numeratorSubjectId);

            if (numeratorSubjects == null || numeratorSubjects.Count == 0)
            {
                return(0);
            }
            // need only one value
            int variableValue;

            foreach (GameEntityModel comparisonModel in numeratorSubjects)
            {
                if (CharacterConditionsBuilder.TryGetVariableValue(comparisonModel, numeratorSubjectVarName, out variableValue))
                {
                    return(variableValue);
                }
            }
            return(0);
        }
        // Global Variable
        private static EventCondition <GameEntityModel> .EvaluationDelegate BuildGlobalVariable(Storage.GenericParameter parameter, out int keyFrame, Storage.CharacterAnimation animation)
        {
            keyFrame = InvalidKeyframe;
            // Read var name, operator, numerator subject, numerator var, number, is timer
            string varName = parameter.SafeString(0);

            ConditionUtils <GameEntityModel> .ComparisonOperation comparisonOperator = (ConditionUtils <GameEntityModel> .ComparisonOperation)parameter.SafeInt(1);
            int    numeratorSubjectId      = parameter.SafeInt(2);
            string numeratorSubjectVarName = parameter.SafeString(1);
            int    staticComparisonValue   = parameter.SafeInt(3);

            // return delegate
            return(delegate(GameEntityModel mainModel, List <GameEntityModel>[] subjectModels){
                int varValue = 0;
                WorldModel worldModel = StateManager.state.MainModel as WorldModel;
                worldModel.globalVariables.TryGetValue(varName, out varValue);
                return CompareWithNumerator(mainModel, numeratorSubjectId, numeratorSubjectVarName, varValue, staticComparisonValue, comparisonOperator, subjectModels);
            });
        }
        // Velocity
        private static EventCondition <GameEntityModel> .EvaluationDelegate BuildVelocity(Storage.GenericParameter parameter, out int keyFrame, Storage.CharacterAnimation animation)
        {
            keyFrame = InvalidKeyframe;
            // Read orientation, operator, numerator subject, numerator var, number, module
            Orientation orientation = (Orientation)parameter.SafeInt(1);

            ConditionUtils <GameEntityModel> .ComparisonOperation comparisonOperator = (ConditionUtils <GameEntityModel> .ComparisonOperation)parameter.SafeInt(2);
            int        numeratorSubjectId      = parameter.SafeInt(3);
            string     numeratorSubjectVarName = parameter.SafeString(0);
            FixedFloat staticComparisonValue   = parameter.SafeFloat(0);
            bool       useModule = parameter.SafeBool(1);

            // return delegate
            return(delegate(GameEntityModel mainModel, List <GameEntityModel>[] subjectModels){
                PhysicPointModel pointModel = StateManager.state.GetModel(mainModel.physicsModelId) as PhysicPointModel;
                if (pointModel == null)
                {
                    return false;
                }
                FixedFloat velocityValue = getOrientedAxisValue(pointModel.GetVelocity(), orientation, useModule);
                return CompareWithNumerator(mainModel, numeratorSubjectId, numeratorSubjectVarName, velocityValue, staticComparisonValue, comparisonOperator, subjectModels);
            });
        }