public IdleTask(ParentNode _parent, AIBehaviour _behaviourRoot) { m_parent = _parent; m_parent.AddChild(this); m_behaviourRoot = _behaviourRoot; m_aimodelSelf = m_behaviourRoot.Model; }
public IHandlerBuilder Index() { var model = new AIModel(_AIs); return(ModScriban.Page(Resource.FromAssembly("ai_index.html"), (r, h) => new ViewModel <AIModel>(r, h, model)) .Title("Models")); }
public void NewGeneration() { // sort by fitness brainsList.Sort(KartBrain.CompareFitness); for (int i = elitKeepCount; i < brainsList.Count; i++) { KartBrain parent1 = ChooseParent(); KartBrain parent2 = ChooseParent(); brainsList[i].aiModel = AIModel.Crossover(parent1.aiModel, parent2.aiModel); brainsList[i].MutateModel(mutationRate, mutationStrength); } for (int i = 0; i < brainsList.Count; ++i) { brainsList[i].ResetFitness(); } ++generation; bestFitness = 0; genertionStartTime = Time.time; SpawnKart(); }
public TransitionExport(Perso perso) { AIModel model = perso.brain.mind.AI_model; if (model == null) { return; } Behavior[] normalBehaviors = model.behaviors_normal; // normal/intelligence/rul behaviors Behavior[] reflexBehaviors = model.behaviors_reflex; // reflex behaviors this.normalStates = new List <State>(); this.reflexStates = new List <State>(); if (normalBehaviors != null) { foreach (Behavior b in normalBehaviors) { normalStates.Add(CreateStateFromBehavior(b)); } } if (reflexBehaviors != null) { foreach (Behavior b in reflexBehaviors) { reflexStates.Add(CreateStateFromBehavior(b)); } } stateDiagram = new StateDiagram(); stateDiagram.normalStates = normalStates; stateDiagram.reflexStates = reflexStates; this.json = GetJson(); }
public override void Init() { base.Init(); layer = GameLayer.Fight; playerModel = ModelManager.Get("PlayerModel") as PlayerModel; aiModel = ModelManager.Get("AIModel") as AIModel; }
public override void OnInspectorGUI() { MindComponent c = (MindComponent)target; Intelligence intelligenceNormal = c.mind.intelligenceNormal; Intelligence intelligenceReflex = c.mind.intelligenceReflex; AIModel aiModel = c.mind.AI_model; GUILayout.BeginHorizontal(); if (aiModel.behaviors_normal != null && aiModel.behaviors_normal.Length > 0) { int activeNormalComportIndex = intelligenceNormal.comport != null ? intelligenceNormal.comport.index + 1 : 0; List <string> normalComportStrings = aiModel.behaviors_normal.Select(b => b.ToString()).ToList(); normalComportStrings.Insert(0, "<null>"); GUILayout.Label("Current normal behavior"); int o = activeNormalComportIndex - 1; activeNormalComportIndex = EditorGUILayout.Popup(activeNormalComportIndex, normalComportStrings.ToArray()) - 1; if (activeNormalComportIndex != o) { c.writeNormalComport = true; intelligenceNormal.comport = activeNormalComportIndex >= 0 ? aiModel.behaviors_normal[activeNormalComportIndex] : null; } } else { GUILayout.Label("No normal behaviors"); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (aiModel.behaviors_reflex != null && aiModel.behaviors_reflex.Length > 0) { int activeReflexComportIndex = intelligenceReflex.comport != null ? intelligenceReflex.comport.index + 1 : 0; List <string> reflexComportStrings = aiModel.behaviors_reflex.Select(b => b.ToString()).ToList(); reflexComportStrings.Insert(0, "<null>"); GUILayout.Label("Current reflex behavior"); int o = activeReflexComportIndex - 1; activeReflexComportIndex = EditorGUILayout.Popup(activeReflexComportIndex, reflexComportStrings.ToArray()) - 1; if (activeReflexComportIndex != o) { c.writeReflexComport = true; intelligenceReflex.comport = activeReflexComportIndex >= 0 ? aiModel.behaviors_reflex[activeReflexComportIndex] : null; } } else { GUILayout.Label("No reflex behaviors"); } GUILayout.EndHorizontal(); if (GUILayout.Button("Export transitions")) { MindComponent.print(c.TransitionExport); } }
private void Awake() { kartController = GetComponent <KartController>(); rayCastSensors = GetComponent <RayCastSensors>(); rayCastSensors.RaysNumber = 9; rayCastSensors.rayLength = 20f; int[] layersDim = new int[] { rayCastSensors.RaysNumber, 2 }; aiModel = new AIModel(layersDim); aiFitness = new AIFitness(); }
public EnemyModel(EnemyCharacterType enemyType, int damage, string currentWord, params string[] nextWords) { EnemyType = enemyType; Damage = damage; WordsHolder = new WordsHolder(currentWord, nextWords); WordsHitter = new WordsHitter(WordsHolder, GetCharHitsNeeded()); AIModel = new AIModel(); WordsHolder.WordCycledEvent += OnWordCycledEvent; }
public IHttpActionResult Save(Guid id, AIModel value) { if (string.IsNullOrWhiteSpace(value?.Result)) { return(BadRequest("AI Result is required.")); } var response = _contacts.SetAIResult(id, value.Result); return(Ok(new { success = response })); }
private IEnumerator GenerateAICommands() { if (Model.GamePhase == GamePhase.TeamPicking || Model.GamePhase == GamePhase.MissionVoting) { yield return(new WaitForSeconds(AiWaitSec)); } List <BaseCommand> commands = new List <BaseCommand>(); Model.Players.Where(player => !TakenId.Contains(player.Id)).ToList(). ForEach(player => commands.Add(AIModel.TryGenerateAICommand(Model, player))); commands.RemoveAll(command => command == null); commands.ForEach(command => Model.AddCommand(command)); }
public static AIModelMetaData FromAIModel(AIModel m, string name, string[] initialRule, string[] initialReflex) { Dictionary <PointerInMap, string> offsetToBehaviourNameMap = new Dictionary <PointerInMap, string>(); Dictionary <PointerInMap, PersoNames> offsetToPersoModelNameMap = new Dictionary <PointerInMap, PersoNames>(); string map = MapLoader.Loader.lvlName; foreach (var p in MapLoader.Loader.persos) { offsetToPersoModelNameMap.Add(new PointerInMap(map, p.offset.FileOffset), new PersoNames(p.namePerso, p.nameModel + "__" + p.nameFamily, p.nameFamily)); } if (m.behaviors_normal != null) { foreach (var rule in m.behaviors_normal) { offsetToBehaviourNameMap.Add(new PointerInMap(map, rule.Offset.offset), rule.NameSubstring); } } if (m.behaviors_reflex != null) { foreach (var reflex in m.behaviors_reflex) { offsetToBehaviourNameMap.Add(new PointerInMap(map, reflex.Offset.offset), reflex.NameSubstring); } } if (m.macros != null) { foreach (var macro in m.macros) { offsetToBehaviourNameMap.Add(new PointerInMap(map, macro.Offset.offset), macro.NameSubstring); } } List <DsgVar> dsgVars = new List <DsgVar>(); int iter = 0; if (m.dsgVar?.dsgVarInfos != null) { foreach (var d in m.dsgVar.dsgVarInfos) { dsgVars.Add(new DsgVar(d.type, m.dsgVar.defaultValues[iter].GetUntypedValue())); iter++; } } return(new AIModelMetaData(m.Offset.offset, MapLoader.Loader.lvlName, name, initialRule, initialReflex, dsgVars, offsetToBehaviourNameMap, offsetToPersoModelNameMap)); }
public static AIModel Crossover(AIModel a, AIModel b) { if (!a.layersDim.SequenceEqual(b.layersDim)) { Debug.LogError("Both models must share the same architecture to be mixed."); } AIModel res = new AIModel(a.layersDim); for (int i = 0; i < res.layers.Count; ++i) { res.layers[i] = Layer.Crossover(a.layers[i], b.layers[i]); } return(res); }
public void SpawnMob(Vector3 position, Quaternion rotation, string mobModelName) { AIModel model = AIRepository.GetAIModelByName(mobModelName); if (model == null) { throw new ApplicationException("Could not find a model named " + mobModelName + "."); } MobActuator actuator; GameObject mobObject = (GameObject)Instantiate(MobTemplate, position, rotation); actuator = mobObject.GetComponent <MobActuator>(); actuator.RealizeModel(model); }
public void PrintScripts() { if (loaded && hasStates) { if (perso.brain != null && perso.brain.mind != null && perso.brain.mind.AI_model != null) { AIModel ai = perso.brain.mind.AI_model; if (ai.behaviors_normal != null) { for (int i = 0; i < ai.behaviors_normal.Length; i++) { if (ai.behaviors_normal[i].scripts != null) { for (int j = 0; j < ai.behaviors_normal[i].scripts.Length; j++) { perso.brain.mind.AI_model.behaviors_normal[i].scripts[j].print(perso); } } } } if (ai.behaviors_reflex != null) { for (int i = 0; i < ai.behaviors_reflex.Length; i++) { if (ai.behaviors_reflex[i].scripts != null) { for (int j = 0; j < ai.behaviors_reflex[i].scripts.Length; j++) { perso.brain.mind.AI_model.behaviors_reflex[i].scripts[j].print(perso); } } } } if (ai.macros != null) { for (int i = 0; i < ai.macros.Length; i++) { if (ai.macros[i].script != null) { perso.brain.mind.AI_model.macros[i].script.print(perso); } } } } } }
AIBehaviour m_aibehaviourThis; //The Behaviour to be used for this AI // Use this for initialization void Start() { m_aimodelThis = GetComponent <AIModel>(); //Initialize the model #pragma warning disable 0219 //From here on the Behaviourtree is constructed; For more info on this you can find a graphic of the tree: m_aibehaviourThis = new AIBehaviour(m_aimodelThis); { Selector selectorIdleOrAction = new Selector(m_aibehaviourThis); { Sequence sequenceConditionsOrIdle = new Sequence(selectorIdleOrAction); { //if the player is dead => idle //if the player is not dead and not in range => idle //if the payer is not dead and in range => idle Selector selectorDeadOrNotInRange = new Selector(sequenceConditionsOrIdle); Condition_PlayerDead conditionDead = new Condition_PlayerDead(selectorDeadOrNotInRange, m_aibehaviourThis); Inverter inverterNotInRange = new Inverter(selectorDeadOrNotInRange); Condition_InDetectionRange conditionInRange = new Condition_InDetectionRange(inverterNotInRange, m_aibehaviourThis); IdleTask idleTask = new IdleTask(sequenceConditionsOrIdle, m_aibehaviourThis); } Selector selectorFleeOrFight = new Selector(selectorIdleOrAction); { Sequence sequenceConditionsThenFlee = new Sequence(selectorFleeOrFight); { Selector selectorTimerOrHealth = new Selector(sequenceConditionsThenFlee); { Condition_FleeTimerRunning conditionFleeDelay = new Condition_FleeTimerRunning(selectorTimerOrHealth, m_aibehaviourThis); Condition_HealthLow conditionHealthHighEnough = new Condition_HealthLow(selectorTimerOrHealth, m_aibehaviourThis); } FleeTask fleetask = new FleeTask(sequenceConditionsThenFlee, m_aibehaviourThis); } AttackTask attackTask = new AttackTask(selectorFleeOrFight, m_aibehaviourThis); } } } #pragma warning restore 0219 m_aibehaviourThis.StartBehaviour(); //After constructing the Behaviour, start it InvokeRepeating("UpdateAIBehaviour", m_fTickRate, m_fTickRate); //Start regularly updating the AI after one "tick" //Subscribe to the Model to see if it is Dead in order to stop ticking m_aimodelThis.m_modelstateCurrent .Where(m_modelstateCurrent => m_modelstateCurrent == ModelState.Dead) .Subscribe(m_modelstateCurrent => CancelInvoke()); }
private JSONObject GetBehaviorJSON(Perso perso, BehaviorOrMacro behavior, AIModel model, Behavior.BehaviorType?type, int index, bool includeScriptContents) { JSONObject behaviorJSON = new JSONObject(); string name; if (behavior is Macro) { Macro m = behavior as Macro; name = m.GetShortName(model, index); if (m.script == null) { name += " (null)"; } if (m.script != null) { behaviorJSON["script"] = GetScriptJSON(perso, m.script, includeScriptContents); } behaviorJSON["type"] = "Macro"; } else { Behavior b = behavior as Behavior; name = b.GetShortName(model, type.Value, index); JSONArray scripts = new JSONArray(); foreach (Script script in b.scripts) { if (script != null) { scripts.Add(GetScriptJSON(perso, script, includeScriptContents)); } } behaviorJSON["scripts"] = scripts; behaviorJSON["type"] = b.type.ToString(); if (b.firstScript != null) { behaviorJSON["firstScript"] = GetScriptJSON(perso, b.firstScript, includeScriptContents); } } behaviorJSON["name"] = name; return(behaviorJSON); }
private void ReadBehaviorCopy(Reader reader, Pointer offset, AIModel ai) { Behavior b = Behavior.Read(reader, offset); if (b != null && ai != null && ai.behaviors_normal != null) { foreach (Behavior originalBehavior in ai.behaviors_normal) { if (b.ContentEquals(originalBehavior)) { originalBehavior.copies.Add(b.offset); b = null; break; } } } if (b != null && ai != null && ai.behaviors_reflex != null) { foreach (Behavior originalBehavior in ai.behaviors_reflex) { if (b.ContentEquals(originalBehavior)) { originalBehavior.copies.Add(b.offset); b = null; break; } } } if (b != null && behaviors != null) { foreach (Behavior originalBehavior in behaviors) { if (b.ContentEquals(originalBehavior)) { originalBehavior.copies.Add(b.offset); b = null; break; } } } }
private void ReadLog(Stream logStream) { string logPattern = @"^0x(?<offset>[a-fA-F0-9]+?) : \((?<type>[^\)]+?)\)(?<name>.*?) 0x(?<offset2>[a-fA-F0-9]+?)$"; string comportNamePattern = @"^(?<family>[^\\]+?)\\(?<model>[^\\]+?)\\(?<model2>[^\\]+?)\.(?<type>...?)\^.*$"; DCDAT file = files_array[0] as DCDAT; using (StreamReader sr = new StreamReader(logStream)) { while (sr.Peek() >= 0) { string line = sr.ReadLine().Trim(); Match logMatch = Regex.Match(line, logPattern, RegexOptions.IgnoreCase); if (logMatch.Success) { string offsetStr = logMatch.Groups["offset"].Value; string type = logMatch.Groups["type"].Value; string name = logMatch.Groups["name"].Value; string offset2Str = logMatch.Groups["offset2"].Value; if (offsetStr.Length < 8) { offsetStr = new String('0', offsetStr.Length - 8) + offsetStr; } uint offsetUint = Convert.ToUInt32(offsetStr, 16); Pointer offset = file.GetUnsafePointer(offsetUint); switch (type) { case "eST_Comport": Behavior b = Behavior.FromOffset(offset); if (b == null) { Match comportMatch = Regex.Match(name, comportNamePattern, RegexOptions.IgnoreCase); if (comportMatch.Success) { string modelName = comportMatch.Groups["model"].Value; AIModel aiModel = aiModels.FirstOrDefault(ai => ai.name == modelName); Reader reader = files_array[Mem.Fix].reader; Pointer.DoAt(ref reader, offset, () => { Behavior newB = Behavior.Read(reader, offset); if (aiModel != null && newB != null) { switch (comportMatch.Groups["type"].Value) { case "rul": foreach (Behavior originalBehavior in aiModel.behaviors_normal) { if (newB.ContentEquals(originalBehavior)) { originalBehavior.copies.Add(newB.offset); b = originalBehavior; break; } } break; case "rfx": foreach (Behavior originalBehavior in aiModel.behaviors_reflex) { if (newB.ContentEquals(originalBehavior)) { originalBehavior.copies.Add(newB.offset); b = originalBehavior; break; } } break; } } }); } } if (b != null) { b.name = name; } /*if (name.Contains("piranha\\MIC_PiranhaSauteurVisible\\MIC_PiranhaSauteurVisible")) { * print("Offset: " + offset + " - " + b); * }*/ break; case "eST_State": State state = State.FromOffset(offset); if (state != null) { state.name = name; } break; case "eST_Anim3d": AnimationReference ar = FromOffset <AnimationReference>(offset); if (ar != null) { ar.name = name; } break; case "eST_Graph": Graph g = Graph.FromOffset(offset); if (g != null) { g.name = name; } break; case "eST_Sector": Sector s = Sector.FromOffset(offset); if (s != null) { s.name = name; s.Gao.name = name; } break; } } } } }
public Condition_FleeTimerRunning(ParentNode _parent, AIBehaviour _behaviourRoot) { m_parent = _parent; m_parent.AddChild(this); m_aimodelSelf = _behaviourRoot.Model; }
public ActionResult SaveData(AIModel data) { var response = _contacts.SetAITraining(data.ContactId, data.Training); return(Json(new { success = response }, JsonRequestBehavior.AllowGet)); }
public SaveState(AIModel aiModel) { this.aiModel = aiModel; }
//Standard Constructor public AIBehaviour(AIModel _aimodel) { m_aimodelSelf = _aimodel; m_listtasknodeActive = new List <TaskNode>(); }
public Condition_InDetectionRange(ParentNode _parent, AIBehaviour _behaviourRoot) { m_parent = _parent; m_parent.AddChild(this); m_aimodelSelf = _behaviourRoot.Model; }
public static string AIModelToCSharp_R2(string nameSpace, AIModel ai) { string dsgVars = "";// TODO if (ai.dsgVar != null) { for (int i = 0; i < ai.dsgVar.dsgVarInfos.Length; i++) { dsgVars += "public " + DsgVarUtil.DsgVarEntryToCSharpAssignment(ai.dsgVar, i) + Environment.NewLine; } } List <string> ruleStatesInitializer = new List <string>(); List <string> reflexStatesInitializer = new List <string>(); TranslatedScript.TranslationSettings translationSettings = new TranslatedScript.TranslationSettings() { expandEntryActions = false, expandStrings = false, useStateIndex = true, exportMode = true, useHashIdentifiers = true }; string behaviorsNormal = ""; if (ai.behaviors_normal != null) { for (int i = 0; i < ai.behaviors_normal.Length; i++) { if (ai.behaviors_normal[i].scripts != null) { string combinedScript = "public async Task Rule_" + i + "_" + ai.behaviors_normal[i].name + "() {" + Environment.NewLine; ruleStatesInitializer.Add("Rule_" + i + "_" + ai.behaviors_normal[i].name); for (int j = 0; j < ai.behaviors_normal[i].scripts.Length; j++) { TranslatedScript ts = new TranslatedScript(ai.behaviors_normal[i].scripts[j], null); ts.settings = translationSettings; combinedScript += "// Script " + j + Environment.NewLine + ts.ToCSharpString_R2() + Environment.NewLine; } combinedScript += "}"; behaviorsNormal += combinedScript + Environment.NewLine; } } } string behaviorsReflex = ""; if (ai.behaviors_reflex != null) { for (int i = 0; i < ai.behaviors_reflex.Length; i++) { if (ai.behaviors_reflex[i].scripts != null) { string combinedScript = "public async Task Reflex_" + i + "_" + ai.behaviors_reflex[i].name + "() {" + Environment.NewLine; for (int j = 0; j < ai.behaviors_reflex[i].scripts.Length; j++) { reflexStatesInitializer.Add("Reflex_" + i + "_" + ai.behaviors_reflex[i].name); TranslatedScript ts = new TranslatedScript(ai.behaviors_reflex[i].scripts[j], null); ts.settings = translationSettings; combinedScript += "// Script " + j + Environment.NewLine + ts.ToCSharpString_R2() + Environment.NewLine; } combinedScript += "}"; behaviorsReflex += combinedScript + Environment.NewLine; } } } string macros = ""; if (ai.macros != null) { for (int i = 0; i < ai.macros.Length; i++) { if (ai.macros[i].script != null) { string combinedScript = "private async Task Macro_" + i + "() {" + Environment.NewLine; TranslatedScript ts = new TranslatedScript(ai.macros[i].script, null); ts.settings = translationSettings; combinedScript += ts.ToCSharpString_R2() + Environment.NewLine + "}"; macros += combinedScript + Environment.NewLine; } } } // DONE TODO: replace evalMacro calls by replacing regex "evalMacro\([a-zA-Z0-9_]*\.Macro\[([0-9]+)\]\)" to "yield return Macro_$1()" // TODO: replace Proc_ChangeMyComport\([a-zA-Z0-9_]+\.Rule\[[0-9]+\]\[\"([^"]+)\"\]\) with sm.ChangeActiveRuleState("$1") // TODO: replace Cond_IsValidObject\(([^\)]+)\) with $1 != null string startString = "protected override void Start() {" + Environment.NewLine + "base.Start();" + Environment.NewLine + Environment.NewLine; if (ruleStatesInitializer.Count > 0) { startString += "smRule.SetState(" + ruleStatesInitializer[0] + ");" + Environment.NewLine; } if (reflexStatesInitializer.Count > 0) { startString += "smReflex.SetState(" + reflexStatesInitializer[0] + ");" + Environment.NewLine; } startString += "}"; string[] usingItems = new string[] { "UnityEngine", "System.Threading.Tasks", "System.Collections.Generic", "OpenSpaceImplementation", "OpenSpaceImplementation.AI", "OpenSpaceImplementation.Materials", "OpenSpaceImplementation.Input", "OpenSpaceImplementation.Sound", "OpenSpaceImplementation.Strings", "OpenSpaceImplementation.Waypoints", "OpenSpaceImplementation.Animation" }; string usingBlock = string.Join(Environment.NewLine, usingItems.Select(i => "using " + i + ";")); string[] resultItems = new string[] { usingBlock, "namespace " + nameSpace + " {", "public partial class " + ai.name + " : Perso {", dsgVars, startString, behaviorsNormal, behaviorsReflex, macros, "}", "}" }; return(string.Join(Environment.NewLine, resultItems)); }
private Script GetScriptFromRequest(JSONNode msg) { if (selector.selectedPerso == null || selector.selectedPerso.perso.brain == null || selector.selectedPerso.perso.brain.mind == null || selector.selectedPerso.perso.brain.mind.AI_model == null) { return(null); } AIModel ai = selector.selectedPerso.perso.brain.mind.AI_model; string offset = msg["scriptOffset"]; switch ((string)msg["behaviorType"]) { case "Rule": if (ai.behaviors_normal == null) { return(null); } foreach (Behavior be in ai.behaviors_normal) { if (be.firstScript != null && be.firstScript.offset.ToString() == offset) { return(be.firstScript); } foreach (Script s in be.scripts) { if (s.offset.ToString() == offset) { return(s); } } } break; case "Reflex": if (ai.behaviors_reflex == null) { return(null); } foreach (Behavior be in ai.behaviors_reflex) { if (be.firstScript != null && be.firstScript.offset.ToString() == offset) { return(be.firstScript); } foreach (Script s in be.scripts) { if (s.offset.ToString() == offset) { return(s); } } } break; case "Macro": if (ai.macros == null) { return(null); } foreach (Macro m in ai.macros) { if (m.script != null && m.script.offset.ToString() == offset) { return(m.script); } } break; } return(null); }
public void SetModel(AIModel model) { aiModel = model; rayCastSensors.RaysNumber = aiModel.layersDim[0]; aiFitness.Reset(); }
public Condition_HealthLow(ParentNode _parent, AIBehaviour _behaviourRoot) { m_parent = _parent; m_parent.AddChild(this); m_aimodelSelf = _behaviourRoot.Model; }
public static Perso Read(Reader reader, Pointer offset, SuperObject so) { MapLoader l = MapLoader.Loader; Perso p = new Perso(offset, so); //l.print("Perso " + offset); l.persos.Add(p); p.off_3dData = Pointer.Read(reader); // 0x0 p.off_stdGame = Pointer.Read(reader); // 4 Standard Game info p.off_dynam = Pointer.Read(reader); // 0x8 Dynam if (Settings.s.engineVersion == Settings.EngineVersion.Montreal) { reader.ReadUInt32(); } p.off_brain = Pointer.Read(reader); // 0xC p.off_camera = Pointer.Read(reader); // 0x10 is Camera in Rayman 2 p.off_collSet = Pointer.Read(reader); // 0x14 collset p.off_msWay = Pointer.Read(reader); // 0x18 p.off_msLight = Pointer.Read(reader); // 0x1C - MSLight if (Settings.s.engineVersion <= Settings.EngineVersion.Montreal) { reader.ReadUInt32(); } p.off_sectInfo = Pointer.Read(reader); // 0x20 // Pointer to struct that points to active sector reader.ReadUInt32(); // 0x24 reader.ReadUInt32(); if (Settings.s.game == Settings.Game.RA || Settings.s.game == Settings.Game.RM) { reader.ReadUInt32(); } if (Settings.s.engineVersion < Settings.EngineVersion.R3) { reader.ReadUInt32(); reader.ReadUInt32(); reader.ReadUInt32(); reader.ReadUInt32(); } Pointer.DoAt(ref reader, p.off_3dData, () => { p.p3dData = Perso3dData.Read(reader, p.off_3dData); }); Pointer.DoAt(ref reader, p.off_stdGame, () => { p.stdGame = StandardGame.Read(reader, p.off_stdGame); if (Settings.s.hasObjectTypes) { p.nameFamily = p.stdGame.GetName(0); p.nameModel = p.stdGame.GetName(1); p.namePerso = p.stdGame.GetName(2); } else { p.nameFamily = "Family" + p.stdGame.objectTypes[0]; p.nameModel = "Model" + p.stdGame.objectTypes[1]; p.namePerso = "Instance" + p.stdGame.objectTypes[2]; if (p.p3dData != null && p.p3dData.family != null && p.p3dData.family.name == null) { p.p3dData.family.name = p.nameFamily; p.p3dData.family.family_index = p.stdGame.objectTypes[0]; if (UnitySettings.CreateFamilyGameObjects && p.p3dData.family.Gao != null) { p.p3dData.family.Gao.name = "[Family] " + p.nameFamily; } } } }); l.print("[" + p.nameFamily + "] " + p.nameModel + " | " + p.namePerso + " - offset: " + offset + " superObject offset: " + (so != null?so.offset.ToString():"null")); if (Settings.s.engineVersion > Settings.EngineVersion.Montreal && Settings.s.game != Settings.Game.R2Revolution) { Pointer.DoAt(ref reader, p.off_dynam, () => { p.dynam = Dynam.Read(reader, p.off_dynam); }); } Pointer.DoAt(ref reader, p.off_brain, () => { p.brain = Brain.Read(reader, p.off_brain); if (p.brain != null && p.brain.mind != null && p.brain.mind.AI_model != null && p.nameModel != null) { p.brain.mind.AI_model.name = p.nameModel; } }); /*if (l.mode == MapLoader.Mode.Rayman2PC && off_msWay != null) { * MS_Way is always empty at start, instead check DsgVars for graphs * Pointer off_current = Pointer.Goto(ref reader, off_msWay); * * p.msWay = MSWay.Read(reader, off_msWay); * Pointer.Goto(ref reader, off_current); * * // Graph read? * if (p.msWay.graph != null) { * GameObject go_msWay = new GameObject("MSWay"); * go_msWay.transform.SetParent(p.Gao.transform); * * GameObject go_graph = new GameObject("Graph"); * go_graph.transform.SetParent(go_msWay.transform); * * int nodeNum = 0; * foreach (GraphNode node in p.msWay.graph.nodeList) { * GameObject go_graphNode = new GameObject("GraphNode[" + nodeNum + "].WayPoint"); * go_graphNode.transform.position.Set(node.wayPoint.position.x, node.wayPoint.position.y, node.wayPoint.position.z); * go_graphNode.transform.SetParent(go_graph.transform); * nodeNum++; * } * } * }*/ if (p.p3dData != null && p.p3dData.family != null) { if (p.p3dData.off_objectList != null && p.p3dData.family.GetIndexOfPhysicalList(p.p3dData.off_objectList) == -1) { ObjectList ol = ObjectList.FromOffsetOrRead(p.p3dData.off_objectList, reader); p.p3dData.family.AddNewPhysicalList(ol); /*if (ol != null) { * p.p3dData.family.AddNewPhysicalList(ol); * ol.Gao.transform.SetParent(p.p3dData.family.Gao.transform); * }*/ } if (p.p3dData.off_objectListInitial != null && p.p3dData.family.GetIndexOfPhysicalList(p.p3dData.off_objectListInitial) == -1) { ObjectList ol = ObjectList.FromOffsetOrRead(p.p3dData.off_objectListInitial, reader); p.p3dData.family.AddNewPhysicalList(ol); /*if (ol != null) { * p.p3dData.family.AddNewPhysicalList(ol); * ol.Gao.transform.SetParent(p.p3dData.family.Gao.transform); * }*/ } if (p.brain != null && p.brain.mind != null && p.brain.mind.AI_model != null && !(Settings.s.engineVersion == Settings.EngineVersion.R3 && Settings.s.loadFromMemory)) // Weird bug for R3 memory loading // Add physical objects tables hidden in scripts { AIModel ai = p.brain.mind.AI_model; if (ai.behaviors_normal != null) { for (int i = 0; i < ai.behaviors_normal.Length; i++) { if (ai.behaviors_normal[i].scripts != null) { for (int j = 0; j < ai.behaviors_normal[i].scripts.Length; j++) { List <ScriptNode> nodes = p.brain.mind.AI_model.behaviors_normal[i].scripts[j].scriptNodes; foreach (ScriptNode node in nodes) { if (node.param_ptr != null && node.nodeType == ScriptNode.NodeType.ObjectTableRef) { ObjectList ol = ObjectList.FromOffsetOrRead(node.param_ptr, reader); ol.unknownFamilyName = p.p3dData.family.name; ol.AddToFamilyLists(p); } } } } } } if (ai.behaviors_reflex != null) { for (int i = 0; i < ai.behaviors_reflex.Length; i++) { if (ai.behaviors_reflex[i].scripts != null) { for (int j = 0; j < ai.behaviors_reflex[i].scripts.Length; j++) { List <ScriptNode> nodes = p.brain.mind.AI_model.behaviors_reflex[i].scripts[j].scriptNodes; foreach (ScriptNode node in nodes) { if (node.param_ptr != null && node.nodeType == ScriptNode.NodeType.ObjectTableRef) { ObjectList ol = ObjectList.FromOffsetOrRead(node.param_ptr, reader); ol.unknownFamilyName = p.p3dData.family.name; ol.AddToFamilyLists(p); } } } } } } if (ai.macros != null) { for (int i = 0; i < ai.macros.Length; i++) { if (ai.macros[i].script != null) { List <ScriptNode> nodes = p.brain.mind.AI_model.macros[i].script.scriptNodes; foreach (ScriptNode node in nodes) { if (node.param_ptr != null && node.nodeType == ScriptNode.NodeType.ObjectTableRef) { ObjectList ol = ObjectList.FromOffsetOrRead(node.param_ptr, reader); ol.unknownFamilyName = p.p3dData.family.name; ol.AddToFamilyLists(p); } } } } } } if (p.p3dData.family.GetIndexOfPhysicalList(p.p3dData.off_objectList) != -1) { p.p3dData.objectList = ObjectList.FromOffset(p.p3dData.off_objectList); } } Pointer.DoAt(ref reader, p.off_collSet, () => { p.collset = CollSet.Read(reader, p, p.off_collSet); }); Pointer.DoAt(ref reader, p.off_sectInfo, () => { p.sectInfo = PersoSectorInfo.Read(reader, p.off_sectInfo); }); return(p); }