public DamageInfo Create(DotItem dot, bool enabling) { DamageInfo info = Create(); info.DamageType = dot.DamageType; info.Tags = WeaponTag.None; info.Character = Character.All; info.ExplosionSphereRadius = 0.0f; info.TargetPosition = Vector3.zero; info.HitFX = ZombieFX.Unknown; info.DieFX = ZombieFX.Unknown; info.Modifier = DamageModifier.None; if (enabling) { info.Damage = InfInt.Zero; info.Dot = dot; } else { info.Damage = dot.DPS; info.Dot = null; } return(info); }
private StringBuilder DescribeItem(DotItem item, StringBuilder output, bool showLookaheads = true) { int start = output.Length; output.Append(grammar.SymbolName(item.Outcome)).Append(" ->"); for (int i = 0; i != item.Size; ++i) { if (item.Position == i) { output.Append(" •"); } output.Append(" ").Append(grammar.SymbolName(item[i])); } if (item.IsReduce) { output.Append(" •"); } int lineLength = output.Length - start; const int AlignTo = 20; if (lineLength < AlignTo) { output.Append(new string(' ', AlignTo - lineLength)); } if (showLookaheads) { output.Append(" |LA = {").Append(string.Join(", ", item.LA.Select(grammar.SymbolName))).Append("}"); } return(output); }
// TODO: Separate Closure from the lookahead closuring to get cached closure item sets private MutableDotItemSet ClosureLr0(MutableDotItemSet itemSet) { var result = new MutableDotItemSet(); result.AddRange(itemSet); bool modified; do { modified = false; // result may grow during iterations for (int i = 0; i != result.Count; ++i) { var item = result[i]; if (!item.IsReduce && !grammar.IsTerminal(item.NextToken)) { int X = item.NextToken; foreach (var childProd in grammar.GetProductions(X)) { var newItem = new DotItem(childProd, 0) { LA = TokenSet.Mutable() }; var index = result.IndexOf(newItem); if (index < 0) { result.Add(newItem); modified = true; } else { var existing = result[index]; existing.LA.AddAll(newItem.LA); } } } } }while (modified); return(result); }
private bool IsValueOnlyEpsilonReduceItem(DotItem item, DotState state, int lookahead) { if (item.Position != 0 || grammar.IsStartProduction(item.ProductionId) || !grammar.IsTailNullable(item) || !item.LA.Contains(lookahead)) { return(false); } int epsilonToken = item.Outcome; foreach (var parentItem in state.Items) { if (parentItem == item) { continue; } if (parentItem.NextToken == epsilonToken) { if (!grammar.IsTailNullable(parentItem)) { // there is at least one rule which needs shift on epsilonToken return(false); } if (grammar.HasFirst(parentItem.CreateNextItem(), lookahead)) { // One of the subseqent non-terms in parentItem can start parsing with current lookahead. // It means that we need tested epsilonToken production for continue parsing on parentItem. return(false); } } } return(true); }
public DamageInfo Create(Character character, int weaponIndex, Vector3 charPosition, InfInt damage, DamageType damageType, Vector3 targetPos, WeaponTag weaponTag, PhysicsType physics = PhysicsType.None, DotItem dot = null, DamageModifier modifier = DamageModifier.None, ZombieFX hitFx = ZombieFX.Unknown, ZombieFX dieFx = ZombieFX.Unknown) { DamageInfo info = Create(); info.Character = character; info.WeaponIndex = weaponIndex; info.CharPosition = charPosition; info.Damage = new InfInt(damage); info.DamageType = damageType; info.TargetPosition = targetPos; info.ExplosionSphereRadius = 0.0f; info.Dot = dot; info.Physics = physics; info.Tags = weaponTag; info.Modifier = modifier; info.HitFX = hitFx; info.DieFX = dieFx; return(info); }
public int IndexOf(DotItem item) { return(items.IndexOf(item)); }
public void Add(DotItem item) { items.Add(item); }
public void DisableDot(DotItem dot) { _model.DisableDot(dot); }
public void EnableDot(DotItem dot) { DamageInfo info = _damageFactory.Create(dot, true); TakeDamage(info); }