protected bool TryGenerateEffects(List <IDAndChanges> idAndChangesList, out Dictionary <int, Effect> effectsByID, out List <int> failedIndices) { // create a dummy EffectHandler to register possible global Effects var globalsEH = new BaseEffectHandler("TempGlobalsEffectHandler", null, null); effectsByID = new Dictionary <int, Effect>(); failedIndices = null; int lastRemainingCount = int.MaxValue; List <int> remainingIndices = null; do { remainingIndices = GenerateEffects(effectsByID, idAndChangesList, globalsEH, remainingIndices); }while ((remainingIndices.Count > 0) && (remainingIndices.Count < lastRemainingCount)); // the still remaining indices failed to be resolved if (remainingIndices.Count > 0) { failedIndices = remainingIndices; return(false); } return(true); }
partial void pCTC_Material(BaseEffectHandler eh, TotalChange tc) { try { ChangeInitInfo info; if (!ValidateChangeInit(ChangeType.Item_Material_Set, out info)) { return; } ItemMaterials material; if (tc.Components.Count < 1) { material = Default_Material; } else { // last entry counts material = (ItemMaterials)tc.Components[0].GetParameters()[0]; } var finalChange = Change.Create(info, new List <object>() { material }); tc.SetTotal(finalChange); } catch (Exception ex) { MakeLogError("Error while caclulating TotalChange via pCTC_Material: " + ex); } }
partial void pCTC_CDStatic(BaseEffectHandler eh, TotalChange tc) { try { ChangeInitInfo info; if (!ValidateChangeInit(ChangeType.Vob_CDStatic_Set, out info)) { return; } // use default or value from last Change bool val = Default_CDStatic; if (tc.Components.Count > 0) { val = (bool)tc.Components.Last().GetParameters()[0]; } var finalChange = Change.Create(info, new List <object>() { val }); tc.SetTotal(finalChange); } catch (Exception ex) { MakeLogError("Error while caclulating TotalChange via pCTC_CDStatic: " + ex); } }
partial void pCTC_VobType(BaseEffectHandler eh, TotalChange tc) { try { // stop here when there are no Changes to process if (tc.Components.Count < 1) { return; } ChangeInitInfo info; if (!ValidateChangeInit(ChangeType.Vob_VobType_Set, out info)) { return; } // TO DO: only change VobType if the linked object is actually able to !!! // last entry counts var finalChange = Change.Create(info, new List <object>() { tc.Components[tc.Components.Count - 1] }); tc.SetTotal(finalChange); } catch (Exception ex) { MakeLogError("Error while caclulating TotalChange via pCTC_VobType: " + ex); } }
public static bool TryGetTotalChange(BaseEffectHandler effectHandler, ChangeDestination changeDest, out TotalChange totalChange) { totalChange = null; if (effectHandler.TryGetTotalChange(changeDest, out totalChange)) { return(true); } return(false); }
partial void pATC_Name(BaseEffectHandler eh, TotalChange tc) { // assuming that the EffectName is only set --> set it in the respective effect of each change try { List <Change> components = tc.Components; for (int c = 0; c < components.Count; c++) { components[c].GetEffect().SetEffectName((string)components[c].GetParameters()[0]); } } catch (Exception ex) { MakeLogError("Error while applying TotalChange via ATC_Name: " + ex); } }
partial void pATC_CDStatic(BaseEffectHandler eh, TotalChange tc) { try { var linkedObj = eh.Host; if (linkedObj is VobDef) { var vobDef = linkedObj as VobDef; vobDef.CDStatic = (bool)tc.GetTotal().GetParameters()[0]; } else if (linkedObj is VobInst) { // TO DO: add similar code as for VobDef when VobSystem supports it } } catch (Exception ex) { MakeLogError("Error while applying TotalChange via pATC_CDStatic: " + ex); } }
partial void pATC_Material(BaseEffectHandler eh, TotalChange tc) { try { var linkedObj = eh.Host; if (linkedObj is ItemDef) { var vobDef = linkedObj as ItemDef; vobDef.Material = (ItemMaterials)tc.GetTotal().GetParameters()[0]; } else if (linkedObj is ItemInst) { var vobInst = linkedObj as ItemInst; // TO DO when there is the possiblity to change the name in VobSystem } } catch (Exception ex) { MakeLogError("Error while applying TotalChange via pATC_Material: " + ex); } }
partial void pATC_CodeName(BaseEffectHandler eh, TotalChange tc) { try { var linkedObj = eh.Host; if (linkedObj is VobDef) { var vobDef = linkedObj as VobDef; vobDef.CodeName = (string)tc.GetTotal().GetParameters()[0]; } else if (linkedObj is VobInst) { var vobInst = linkedObj as VobInst; // ??? TO DO if codeName should be changable for a VobInst } } catch (Exception ex) { MakeLogError("Error while applying TotalChange via ATC_CodeName: " + ex); } }
partial void pATC_GlobalID(BaseEffectHandler eh, TotalChange tc) { try { Effect effect; string globalID; var components = tc.Components; int i; for (i = 0; i < components.Count; i++) { effect = components[i].GetEffect(); globalID = (string)components[i].GetParameters()[0]; if (globalID != null) { Effect.AddGlobalEffect(globalID, effect); } } } catch (Exception ex) { MakeLogError("Error while applying TotalChange via pATC_GlobalID: " + ex); } }
// create and add effects to effectsByID using idAndChangesList // returns List of unfinished / postponed / failed indices in idAndChangesList protected List <int> GenerateEffects(Dictionary <int, Effect> effectsByID, List <IDAndChanges> idAndChangesList, BaseEffectHandler globalsEH, List <int> targetIndices = null) { var failedIndices = new List <int>(); if (targetIndices != null) { // use specified indices to iterate over int index; for (int i = 0; i < targetIndices.Count; i++) { index = targetIndices[i]; if ((index < 0) || (index > (idAndChangesList.Count - 1))) { MakeLogWarning("Out of bounds index " + index + " in GenerateEffects!"); failedIndices.Add(index); continue; } if (!TryGenerateEffect(effectsByID, idAndChangesList[index], globalsEH)) { failedIndices.Add(index); } } } else { // whole List will be iterated without any target indices specified for (int i = 0; i < idAndChangesList.Count; i++) { if (!TryGenerateEffect(effectsByID, idAndChangesList[i], globalsEH)) { failedIndices.Add(i); } } } return(failedIndices); }
partial void pATC_Parent(BaseEffectHandler eh, TotalChange tc) { try { Effect effect; Effect parent; string parentGlobalID; List <Change> components = tc.Components; for (int c = 0; c < components.Count; c++) { effect = components[c].GetEffect(); parentGlobalID = (string)components[c].GetParameters()[0]; if (!Effect.TryGetGlobalEffect(parentGlobalID, out parent)) { MakeLogWarning("Did not find effect behind globalID " + parentGlobalID + " to add as parent effect in ATC_Parent"); } effect.AddParent(parent); } } catch (Exception ex) { MakeLogError("Error while applying TotalChange via pATC_Parent: " + ex); } }
protected bool TryGenerateEffect(Dictionary <int, Effect> effectsByID, IDAndChanges ec, BaseEffectHandler globalsEH) { var effect = new Effect(); globalsEH = globalsEH ?? new BaseEffectHandler("globalsEH", null, null); var dependencies = FindDependencies(ec); if (ContainsUnresolvedDependencies(dependencies)) { return(false); } effect = new Effect(); effect.AddChanges(ec.Changes); effectsByID.Add(ec.ID, effect); if (DetectIsGlobal(ec)) { globalsEH.AddEffect(effect); } return(true); }
partial void pCTC_Parent(BaseEffectHandler eh, TotalChange tc) { // because multiple effects can be registered on one effectHandler, // there is no need to actually calculate a TotalChange // (see ApplyTotalChange for the individual treatment of each Change in TotalChange.components) }
partial void pATC_Material(BaseEffectHandler eh, TotalChange tc);
partial void pATC_Clock_Time(BaseEffectHandler eh, TotalChange tc);
partial void pATC_GlobalID(BaseEffectHandler eh, TotalChange tc);
public void CTC_Clock_Time(BaseEffectHandler eh, TotalChange tc) { pCTC_Clock_Time(eh, tc); }
public void ATC_Clock_Rate(BaseEffectHandler eh, TotalChange tc) { pATC_Clock_Rate(eh, tc); }
partial void pATC_Parent(BaseEffectHandler eh, TotalChange tc);
partial void pATC_Name(BaseEffectHandler eh, TotalChange tc);
partial void pATC_PermanentFlag(BaseEffectHandler eh, TotalChange tc);
public void ATC_GlobalID(BaseEffectHandler eh, TotalChange tc) { pATC_GlobalID(eh, tc); }
public void ATC_Material(BaseEffectHandler eh, TotalChange tc) { pATC_Material(eh, tc); }
public void ATC_Parent(BaseEffectHandler eh, TotalChange tc) { pATC_Parent(eh, tc); }
partial void pATC_Clock_IsRunning(BaseEffectHandler eh, TotalChange tc);
public void ATC_PermanentFlag(BaseEffectHandler eh, TotalChange tc) { pATC_PermanentFlag(eh, tc); }
public void ATC_Clock_IsRunning(BaseEffectHandler eh, TotalChange tc) { pATC_Clock_IsRunning(eh, tc); }
public void ATC_Name(BaseEffectHandler eh, TotalChange tc) { pATC_Name(eh, tc); }
partial void pCTC_Clock_Rate(BaseEffectHandler eh, TotalChange tc);