Example #1
0
        private static void AddActionModelHelper(
            GameObject go,
            Dictionary <int, ActionLink> actionLinkDict,
            DFBlock.RdbObject rdbObj,
            ref DFBlock blockData,
            bool serialize)
        {
            DFBlock.RdbModelResource obj = rdbObj.Resources.ModelResource;
            string description           = blockData.RdbBlock.ModelReferenceList[obj.ModelIndex].Description;
            int    soundID_Index         = obj.SoundIndex;
            float  duration  = obj.ActionResource.Duration;
            float  magnitude = obj.ActionResource.Magnitude;
            int    axis      = obj.ActionResource.Axis;

            DFBlock.RdbTriggerFlags triggerFlag = DFBlock.RdbTriggerFlags.None;
            DFBlock.RdbActionFlags  actionFlag  = DFBlock.RdbActionFlags.None;

            if (actionLinkDict != null)
            {
                // Set action flag if valid / known
                if (Enum.IsDefined(typeof(DFBlock.RdbActionFlags), (DFBlock.RdbActionFlags)obj.ActionResource.Flags))
                {
                    actionFlag = (DFBlock.RdbActionFlags)obj.ActionResource.Flags;
                }

                // Set trigger flag if valid / known
                if (Enum.IsDefined(typeof(DFBlock.RdbTriggerFlags), (DFBlock.RdbTriggerFlags)obj.TriggerFlag_StartingLock))
                {
                    triggerFlag = (DFBlock.RdbTriggerFlags)obj.TriggerFlag_StartingLock;
                }

                // Add action node to actionLink dictionary
                if (!actionLinkDict.ContainsKey(rdbObj.This))
                {
                    ActionLink link;
                    link.nextKey    = obj.ActionResource.NextObjectOffset;
                    link.prevKey    = obj.ActionResource.PreviousObjectOffset;
                    link.gameObject = go;
                    actionLinkDict.Add(rdbObj.This, link);
                }
            }

            // Create unique LoadID for save sytem
            long loadID = 0;

            if (serialize)
            {
                loadID = (blockData.Index << 24) + rdbObj.This;
            }

            AddAction(go, description, soundID_Index, duration, magnitude, axis, triggerFlag, actionFlag, loadID);
        }
Example #2
0
        private static void AddActionFlatHelper(
            GameObject go,
            Dictionary <int, ActionLink> actionLinkDict,
            ref DFBlock blockData,
            DFBlock.RdbObject rdbObj,
            bool serialize = true)
        {
            DFBlock.RdbFlatResource obj = rdbObj.Resources.FlatResource;
            string description          = "FLT";
            int    soundID_Index        = obj.Sound_index;
            float  duration             = 0.0f;
            float  magnitude            = obj.Magnitude;
            int    axis = obj.Magnitude;

            DFBlock.RdbTriggerFlags triggerFlag = DFBlock.RdbTriggerFlags.None;
            DFBlock.RdbActionFlags  actionFlag  = DFBlock.RdbActionFlags.None;

            //set action flag if valid / known
            if (Enum.IsDefined(typeof(DFBlock.RdbActionFlags), (DFBlock.RdbActionFlags)obj.Action))
            {
                actionFlag = (DFBlock.RdbActionFlags)obj.Action;
            }

            //set trigger flag if valid / known
            if (Enum.IsDefined(typeof(DFBlock.RdbTriggerFlags), (DFBlock.RdbTriggerFlags)obj.TriggerFlag))
            {
                triggerFlag = (DFBlock.RdbTriggerFlags)obj.TriggerFlag;
            }

            //add action node to actionLink dictionary
            if (!actionLinkDict.ContainsKey(rdbObj.This))
            {
                ActionLink link;
                link.nextKey    = obj.NextObjectOffset;
                link.prevKey    = -1;
                link.gameObject = go;
                actionLinkDict.Add(rdbObj.This, link);
            }

            // Create unique LoadID for save sytem
            long loadID = 0;

            if (serialize)
            {
                loadID = (blockData.Index << 24) + rdbObj.This;
            }

            AddAction(go, description, soundID_Index, duration, magnitude, axis, triggerFlag, actionFlag, loadID);
        }
Example #3
0
        private static void AddAction(
            GameObject go,
            string description,
            int soundID_and_index,
            float duration,
            float magnitude,
            int axis_raw,
            DFBlock.RdbTriggerFlags triggerFlag,
            DFBlock.RdbActionFlags actionFlag,
            long loadID = 0
            )
        {
            DaggerfallAction action = go.AddComponent <DaggerfallAction>();

            action.ModelDescription = description;
            action.ActionDuration   = duration;
            action.Magnitude        = magnitude;
            action.Index            = soundID_and_index;
            action.TriggerFlag      = triggerFlag;
            action.ActionFlag       = actionFlag;
            action.LoadID           = loadID;

            // If SaveLoadManager present in game then attach SerializableActionObject
            if (SaveLoadManager.Instance != null)
            {
                go.AddComponent <SerializableActionObject>();
            }

            //if a collision type action or action flat, add DaggerFallActionCollision component
            if (action.TriggerFlag == DFBlock.RdbTriggerFlags.Collision01 || action.TriggerFlag == DFBlock.RdbTriggerFlags.Collision03 ||
                action.TriggerFlag == DFBlock.RdbTriggerFlags.DualTrigger || action.TriggerFlag == DFBlock.RdbTriggerFlags.Collision09)
            {
                DaggerfallActionCollision collision = go.AddComponent <DaggerfallActionCollision>();
                collision.isFlat = false;
            }
            else if (description == "FLT")
            {
                DaggerfallActionCollision collision = go.AddComponent <DaggerfallActionCollision>();
                collision.isFlat = true;
            }


            switch (action.ActionFlag)
            {
            case DFBlock.RdbActionFlags.Translation:
            {
                action.Magnitude = magnitude;
                GetTranslationActionVector(ref action, (DFBlock.RdbActionAxes)axis_raw);
            }
            break;

            case DFBlock.RdbActionFlags.Rotation:
            {
                action.Magnitude = magnitude;
                GetRotationActionVector(ref action, (DFBlock.RdbActionAxes)axis_raw);
            }
            break;

            case DFBlock.RdbActionFlags.PositiveX:
            {
                action.ActionDuration = 50;
                action.Magnitude      = axis_raw * 8;
                GetTranslationActionVector(ref action, DFBlock.RdbActionAxes.PositiveX);
            }
            break;

            case DFBlock.RdbActionFlags.NegativeX:
            {
                action.ActionDuration = 50;
                action.Magnitude      = axis_raw * 8;
                GetTranslationActionVector(ref action, DFBlock.RdbActionAxes.NegativeX);
            }
            break;

            case DFBlock.RdbActionFlags.PositiveY:
            {
                action.ActionDuration = 50;
                action.Magnitude      = axis_raw * 8;
                GetTranslationActionVector(ref action, DFBlock.RdbActionAxes.PositiveY);
            }
            break;

            case DFBlock.RdbActionFlags.NegativeY:
            {
                action.ActionDuration = 50;
                action.Magnitude      = axis_raw * 8;
                GetTranslationActionVector(ref action, DFBlock.RdbActionAxes.NegativeY);
            }
            break;

            case DFBlock.RdbActionFlags.PositiveZ:
            {
                action.ActionDuration = 50;
                action.Magnitude      = axis_raw * 8;
                GetTranslationActionVector(ref action, DFBlock.RdbActionAxes.PositiveZ);
            }
            break;

            case DFBlock.RdbActionFlags.NegativeZ:
            {
                action.ActionDuration = 50;
                action.Magnitude      = axis_raw * 8;
                GetTranslationActionVector(ref action, DFBlock.RdbActionAxes.NegativeZ);
            }
            break;

            default:
            {
                //Dmg actions use axis value to modifiy tot. dmg.
                action.Magnitude = axis_raw;
            }
            break;
            }

            // A quick hack to fix special-case rotation issues.
            // Currently unknown if there is data indicating different rotation behaviour or if something else is happening.
            switch (description)
            {
            case "LID":
                action.ActionRotation = new Vector3(0, 0, -90f);           // Coffin lids (e.g. Scourg barrow)
                break;

            case "WHE":
                action.ActionRotation = new Vector3(0, -360f, 0);          // Wheels (e.g. Direnni Tower)
                break;
            }

            //Add audio
            AddActionAudioSource(go, (uint)action.Index);
        }