Beispiel #1
0
        public static void SaveEffectExtras(
            ICLIFlags flags, string path, SaveContext info,
            EffectParser.EffectInfo effectInfo, out Dictionary <ulong, HashSet <FindLogic.Combo.VoiceLineInstanceInfo> > svceLines)
        {
            string soundDirectory = Path.Combine(path, "Sounds");

            svceLines = GetSVCELines(effectInfo, info.m_info);

            HashSet <ulong> done = new HashSet <ulong>();

            foreach (EffectParser.OSCEInfo osceInfo in effectInfo.OSCEs)
            {
                if (osceInfo.Sound == 0 || done.Contains(osceInfo.Sound))
                {
                    continue;
                }
                SaveSound(flags, soundDirectory, info, osceInfo.Sound);
                done.Add(osceInfo.Sound);
            }

            foreach (KeyValuePair <ulong, HashSet <FindLogic.Combo.VoiceLineInstanceInfo> > svceLine in svceLines)
            {
                SaveVoiceStimuli(flags, soundDirectory, info, svceLine.Value, true);
            }
        }
Beispiel #2
0
        private static Dictionary <ulong, HashSet <FindLogic.Combo.VoiceLineInstanceInfo> > GetSVCELines(EffectParser.EffectInfo effectInfo, FindLogic.Combo.ComboInfo info)
        {
            Dictionary <ulong, HashSet <FindLogic.Combo.VoiceLineInstanceInfo> > output = new Dictionary <ulong, HashSet <FindLogic.Combo.VoiceLineInstanceInfo> >();

            if (effectInfo.SVCEs.Count == 0 || effectInfo.VoiceSet == 0)
            {
                return(output);
            }

            foreach (EffectParser.SVCEInfo svceInfo in effectInfo.SVCEs)
            {
                Dictionary <ulong, HashSet <FindLogic.Combo.VoiceLineInstanceInfo> > instances = info.VoiceSets[effectInfo.VoiceSet].VoiceLineInstances;
                if (instances.ContainsKey(svceInfo.VoiceStimulus))
                {
                    output[svceInfo.VoiceStimulus] = instances[svceInfo.VoiceStimulus];
                }
            }

            return(output);
        }
Beispiel #3
0
            protected void WriteEffect(BinaryWriter writer)
            {
                writer.Write("oweffect");
                writer.Write(EffectVersionMajor);
                writer.Write(EffectVersionMinor);

                EffectParser.EffectInfo effect = EffectInfo.Effect;

                writer.Write(teResourceGUID.Index(effect.GUID));
                writer.Write(effect.EffectLength);

                writer.Write(effect.DMCEs.Count);
                writer.Write(effect.CECEs.Count);
                writer.Write(effect.NECEs.Count);
                writer.Write(effect.RPCEs.Count);
                writer.Write(effect.FECEs.Count);
                writer.Write(effect.OSCEs.Count);
                writer.Write(effect.SVCEs.Count);

                foreach (EffectParser.DMCEInfo dmceInfo in effect.DMCEs)
                {
                    WriteTime(writer, dmceInfo.PlaybackInfo);
                    writer.Write(dmceInfo.Animation);
                    writer.Write(dmceInfo.Material);
                    writer.Write(dmceInfo.Model);
                    FindLogic.Combo.ModelAsset modelInfo = Info.m_models[dmceInfo.Model];
                    writer.Write($"Models\\{modelInfo.GetName()}\\{modelInfo.GetNameIndex()}.owmdl");
                    if (dmceInfo.Animation == 0)
                    {
                        writer.Write("null");
                    }
                    else
                    {
                        FindLogic.Combo.AnimationAsset animationInfo = Info.m_animations[dmceInfo.Animation];
                        writer.Write($"Models\\{modelInfo.GetName()}\\{OverwatchAnimationEffect.AnimationEffectDir}\\{animationInfo.GetNameIndex()}\\{animationInfo.GetNameIndex()}.owanim");
                    }
                }

                foreach (EffectParser.CECEInfo ceceInfo in effect.CECEs)
                {
                    WriteTime(writer, ceceInfo.PlaybackInfo);
                    writer.Write((byte)ceceInfo.Action);
                    writer.Write(ceceInfo.Animation);
                    writer.Write(ceceInfo.Identifier);
                    writer.Write(teResourceGUID.Index(ceceInfo.Identifier));
                    if (ceceInfo.Animation != 0)
                    {
                        FindLogic.Combo.AnimationAsset animationInfo = Info.m_animations[ceceInfo.Animation];
                        writer.Write($"{OverwatchAnimationEffect.AnimationEffectDir}\\{animationInfo.GetNameIndex()}\\{animationInfo.GetNameIndex()}.owanim");
                    }
                    else
                    {
                        writer.Write("null");
                    }
                }

                foreach (EffectParser.NECEInfo neceInfo in effect.NECEs)
                {
                    WriteTime(writer, neceInfo.PlaybackInfo);
                    writer.Write(neceInfo.GUID);
                    writer.Write(teResourceGUID.Index(neceInfo.Identifier));
                    FindLogic.Combo.EntityAsset entityInfo = Info.m_entities[neceInfo.GUID];

                    writer.Write($"Entities\\{entityInfo.GetName()}\\{entityInfo.GetName()}.owentity");
                }

                foreach (EffectParser.RPCEInfo rpceInfo in effect.RPCEs)
                {
                    WriteTime(writer, rpceInfo.PlaybackInfo);
                    writer.Write(rpceInfo.Model);
                    // todo: make the materials work
                    writer.Write(rpceInfo.Material);
                    FindLogic.Combo.ModelAsset modelInfo = Info.m_models[rpceInfo.Model];
                    //writer.Write(rpceInfo.TextureDefiniton);

                    writer.Write($"Models\\{modelInfo.GetName()}\\{modelInfo.GetName()}.owmdl");
                }

                foreach (EffectParser.SVCEInfo svceInfo in effect.SVCEs)
                {
                    WriteTime(writer, svceInfo.PlaybackInfo);
                    writer.Write(teResourceGUID.Index(svceInfo.VoiceStimulus));
                    if (VoiceStimuli.ContainsKey(svceInfo.VoiceStimulus))
                    {
                        HashSet <FindLogic.Combo.VoiceLineInstanceInfo> lines = VoiceStimuli[svceInfo.VoiceStimulus];
                        writer.Write(lines.Count);

                        foreach (FindLogic.Combo.VoiceLineInstanceInfo voiceLineInstance in lines)
                        {
                            writer.Write(voiceLineInstance.SoundFiles.Count);
                            foreach (ulong soundFile in voiceLineInstance.SoundFiles)
                            {
                                FindLogic.Combo.SoundFileAsset soundFileInfo =
                                    Info.m_voiceSoundFiles[soundFile];
                                writer.Write($"Sounds\\{soundFileInfo.GetNameIndex()}.ogg");
                            }
                        }
                    }
                    else
                    {
                        writer.Write(0);
                    }
                }
            }
Beispiel #4
0
            // combo
            public void Write(BinaryWriter writer, FindLogic.Combo.EffectInfoCombo effectInfo, FindLogic.Combo.ComboInfo info, Dictionary <ulong, HashSet <FindLogic.Combo.VoiceLineInstanceInfo> > svceLines)
            {
                writer.Write(new string(Identifier));
                writer.Write(VersionMajor);
                writer.Write(VersionMinor);

                EffectParser.EffectInfo effect = effectInfo.Effect;

                writer.Write(GUID.Index(effect.GUID));
                writer.Write(effect.EffectLength);

                writer.Write(effect.DMCEs.Count);
                writer.Write(effect.CECEs.Count);
                writer.Write(effect.NECEs.Count);
                writer.Write(effect.RPCEs.Count);
                writer.Write(effect.FECEs.Count);
                writer.Write(effect.OSCEs.Count);
                writer.Write(effect.SVCEs.Count);

                foreach (EffectParser.DMCEInfo dmceInfo in effect.DMCEs)
                {
                    WriteTime(writer, dmceInfo.PlaybackInfo);
                    writer.Write(dmceInfo.Animation);
                    writer.Write(dmceInfo.Material);
                    writer.Write(dmceInfo.Model);
                    FindLogic.Combo.ModelInfoNew modelInfo = info.Models[dmceInfo.Model];
                    writer.Write($"Models\\{modelInfo.GetName()}\\{modelInfo.GetNameIndex()}.owmdl");
                    if (dmceInfo.Animation == 0)
                    {
                        writer.Write("null");
                    }
                    else
                    {
                        FindLogic.Combo.AnimationInfoNew animationInfo = info.Animations[dmceInfo.Animation];
                        writer.Write($"Models\\{modelInfo.GetName()}\\{Model.AnimationEffectDir}\\{animationInfo.GetNameIndex()}\\{animationInfo.GetNameIndex()}.owanim");
                    }
                }

                foreach (EffectParser.CECEInfo ceceInfo in effect.CECEs)
                {
                    WriteTime(writer, ceceInfo.PlaybackInfo);
                    writer.Write((byte)ceceInfo.Action);
                    writer.Write(ceceInfo.Animation);
                    writer.Write(ceceInfo.EntityVariable);
                    writer.Write(GUID.Index(ceceInfo.EntityVariable));
                    if (ceceInfo.Animation != 0)
                    {
                        FindLogic.Combo.AnimationInfoNew animationInfo = info.Animations[ceceInfo.Animation];
                        writer.Write($"{Model.AnimationEffectDir}\\{animationInfo.GetNameIndex()}\\{animationInfo.GetNameIndex()}.owanim");
                    }
                    else
                    {
                        writer.Write("null");
                    }
                }

                foreach (EffectParser.NECEInfo neceInfo in effect.NECEs)
                {
                    WriteTime(writer, neceInfo.PlaybackInfo);
                    writer.Write(neceInfo.GUID);
                    writer.Write(GUID.Index(neceInfo.Variable));
                    FindLogic.Combo.EntityInfoNew entityInfo = info.Entities[neceInfo.GUID];

                    writer.Write($"Entities\\{entityInfo.GetName()}\\{entityInfo.GetName()}.owentity");
                }

                foreach (EffectParser.RPCEInfo rpceInfo in effect.RPCEs)
                {
                    WriteTime(writer, rpceInfo.PlaybackInfo);
                    writer.Write(rpceInfo.Model);
                    // todo: make the materials work
                    writer.Write(rpceInfo.Material);
                    FindLogic.Combo.ModelInfoNew modelInfo = info.Models[rpceInfo.Model];
                    //writer.Write(rpceInfo.TextureDefiniton);

                    writer.Write($"Models\\{modelInfo.GetName()}\\{modelInfo.GetName()}.owmdl");
                }

                foreach (EffectParser.SVCEInfo svceInfo in effect.SVCEs)
                {
                    WriteTime(writer, svceInfo.PlaybackInfo);
                    writer.Write(GUID.Index(svceInfo.VoiceStimulus));
                    if (svceLines.ContainsKey(svceInfo.VoiceStimulus))
                    {
                        HashSet <FindLogic.Combo.VoiceLineInstanceInfo> lines = svceLines[svceInfo.VoiceStimulus];
                        writer.Write(lines.Count);

                        foreach (FindLogic.Combo.VoiceLineInstanceInfo voiceLineInstance in lines)
                        {
                            writer.Write(voiceLineInstance.SoundFiles.Count);
                            foreach (ulong soundFile in voiceLineInstance.SoundFiles)
                            {
                                FindLogic.Combo.SoundFileInfo soundFileInfo =
                                    info.VoiceSoundFiles[soundFile];
                                writer.Write($"Sounds\\{soundFileInfo.GetNameIndex()}.ogg");
                            }
                        }
                    }
                    else
                    {
                        writer.Write(0);
                    }
                }

                // foreach (EffectParser.FECEInfo feceInfo in effect.FECEs) {
                //     WriteTime(writer, feceInfo.PlaybackInfo);
                //     writer.Write(feceInfo.GUID);
                // }
                //
                // foreach (EffectParser.OSCEInfo osceInfo in effect.OSCEs) {
                //     // this needs preprocessing, get the sounds
                //     WriteTime(writer, osceInfo.PlaybackInfo);
                //     writer.Write(osceInfo.Sound);
                // }
            }
Beispiel #5
0
 public void Write(Stream output, EffectParser.EffectInfo effect, Dictionary <ulong, string> entityNames, Dictionary <ulong, List <STUVoiceLineInstance> > svceLines)
 {
     using (BinaryWriter writer = new BinaryWriter(output)) {
         Write(writer, effect, entityNames, svceLines);
     }
 }
Beispiel #6
0
            // old
            public void Write(BinaryWriter writer, EffectParser.EffectInfo effect, Dictionary <ulong, string> entityNames, Dictionary <ulong, List <STUVoiceLineInstance> > svceLines)
            {
                writer.Write(new string(Identifier));
                writer.Write(VersionMajor);
                writer.Write(VersionMinor);

                writer.Write(GUID.Index(effect.GUID));
                writer.Write(effect.EffectLength);

                writer.Write(effect.DMCEs.Count);
                writer.Write(effect.CECEs.Count);
                writer.Write(effect.NECEs.Count);
                writer.Write(effect.RPCEs.Count);
                writer.Write(effect.FECEs.Count);
                writer.Write(effect.OSCEs.Count);
                writer.Write(effect.SVCEs.Count);

                foreach (EffectParser.DMCEInfo dmceInfo in effect.DMCEs)
                {
                    WriteTime(writer, dmceInfo.PlaybackInfo);
                    writer.Write(dmceInfo.Animation);
                    writer.Write(dmceInfo.Material);
                    writer.Write(dmceInfo.Model);
                    writer.Write($"Models\\{GetFileName(dmceInfo.Model)}\\{GUID.LongKey(dmceInfo.Model):X12}.owmdl");
                    if (dmceInfo.Animation == 0)
                    {
                        writer.Write("null");
                    }
                    else
                    {
                        writer.Write($"Models\\{GetFileName(dmceInfo.Model)}\\{Model.AnimationEffectDir}\\{GUID.LongKey(dmceInfo.Animation):X12}\\{GUID.LongKey(dmceInfo.Animation):X12}.owanim");
                    }
                }

                foreach (EffectParser.CECEInfo ceceInfo in effect.CECEs)
                {
                    WriteTime(writer, ceceInfo.PlaybackInfo);
                    writer.Write((byte)ceceInfo.Action);
                    writer.Write(ceceInfo.Animation);
                    writer.Write(ceceInfo.EntityVariable);
                    writer.Write(GUID.Index(ceceInfo.EntityVariable));
                    if (ceceInfo.Animation != 0)
                    {
                        writer.Write($"{Model.AnimationEffectDir}\\{GUID.LongKey(ceceInfo.Animation):X12}\\{GUID.LongKey(ceceInfo.Animation):X12}.owanim");
                    }
                    else
                    {
                        writer.Write("null");
                    }
                }

                foreach (EffectParser.NECEInfo neceInfo in effect.NECEs)
                {
                    WriteTime(writer, neceInfo.PlaybackInfo);
                    writer.Write(neceInfo.GUID);
                    writer.Write(GUID.Index(neceInfo.Variable));
                    string entityName = $"{GetFileName(neceInfo.GUID)}";
                    if (entityNames.ContainsKey(new Common.STUGUID(neceInfo.GUID)))
                    {
                        entityName = GetValidFilename(entityNames[new Common.STUGUID(neceInfo.GUID)]);
                    }

                    writer.Write($"Entities\\{entityName}\\{entityName}.owentity");
                }

                foreach (EffectParser.RPCEInfo rpceInfo in effect.RPCEs)
                {
                    WriteTime(writer, rpceInfo.PlaybackInfo);
                    writer.Write(rpceInfo.Model);
                    // todo: make the materials work
                    writer.Write(rpceInfo.Material);
                    //writer.Write(rpceInfo.TextureDefiniton);

                    writer.Write($"Models\\{GetFileName(rpceInfo.Model)}\\{GUID.LongKey(rpceInfo.Model):X12}.owmdl");
                }

                foreach (EffectParser.SVCEInfo svceInfo in effect.SVCEs)
                {
                    WriteTime(writer, svceInfo.PlaybackInfo);
                    writer.Write(GUID.Index(svceInfo.VoiceStimulus));
                    if (svceLines.ContainsKey(svceInfo.VoiceStimulus))
                    {
                        List <STUVoiceLineInstance> lines = svceLines[svceInfo.VoiceStimulus];
                        writer.Write(lines.Count);

                        foreach (STUVoiceLineInstance voiceLineInstance in lines)
                        {
                            STUSoundWrapper[] sounds =
                            {
                                voiceLineInstance.SoundContainer.Sound1,
                                voiceLineInstance.SoundContainer.Sound2,
                                voiceLineInstance.SoundContainer.Sound3,
                                voiceLineInstance.SoundContainer.Sound4
                            };
                            sounds = sounds.Where(x => x != null).ToArray();
                            writer.Write(sounds.Length);
                            foreach (STUSoundWrapper wrapper in sounds)
                            {
                                writer.Write($"Sounds\\{GUID.LongKey(wrapper.SoundResource):X12}.ogg");
                            }
                        }
                    }
                    else
                    {
                        writer.Write(0);
                    }
                }

                // foreach (EffectParser.FECEInfo feceInfo in effect.FECEs) {
                //     WriteTime(writer, feceInfo.PlaybackInfo);
                //     writer.Write(feceInfo.GUID);
                // }
                //
                // foreach (EffectParser.OSCEInfo osceInfo in effect.OSCEs) {
                //     // this needs preprocessing, get the sounds
                //     WriteTime(writer, osceInfo.PlaybackInfo);
                //     writer.Write(osceInfo.Sound);
                // }
            }