public override void DoAfterDead(ObjectBase killer, ObjectDeadType deadType) { if ((DeadType & deadType) != deadType) { return; } if (SharkPower > 0) { Scene.EffectObjects.Add(new EffectShark(Scene.Sec(0.2F), SharkPower)); } int explosionSize = (int)(RangeMultiple * (Owner.Layout.RectWidth + Owner.Layout.RectHeight) / 2) + RangeConstant; ObjectSmoke explosionObject = new ObjectSmoke(Owner.Layout.CenterX, Owner.Layout.CenterY, explosionSize, explosionSize, Scene.Sec(0.6F), 0.9F, 0, Color, MoveNull.Value); Owner.Container.Add(explosionObject); for (int i = 0; i < Owner.Container.Count; i++) { ObjectBase objectBase = Owner.Container[i]; if (objectBase.Status != ObjectStatus.Alive || Function.IsFriendly(objectBase.League, CollisionLeague)) { continue; } // 特殊狀態判定 具碰撞 非鬼魂 if ((objectBase.Propertys.Affix & SpecialStatus.Collision) != SpecialStatus.Collision || (objectBase.Propertys.Affix & SpecialStatus.Ghost) == SpecialStatus.Ghost) { continue; } // 碰撞判定 if (!Function.IsCollison(objectBase.Layout, explosionObject.Layout)) { continue; } // 檢查目標有無碰撞特性 int colliderPower = -1; for (int j = 0; j < objectBase.Propertys.Count; j++) { PropertyCollision checkCollision = objectBase.Propertys[j] as PropertyCollision; if (checkCollision != null && checkCollision.Status == PropertyStatus.Enabled) { colliderPower = Math.Max(colliderPower, checkCollision.CollisionPower); } } if (colliderPower < 0) { continue; } if (colliderPower <= CollisionPower) { objectBase.Kill(Owner, ObjectDeadType.Collision); } } base.DoAfterDead(killer, deadType); }
public override void DoActionMoving() { if (Owner.Status == ObjectStatus.Alive && Status == PropertyStatus.Enabled) { for (int i = 0; i < Owner.Container.Count; i++) { ObjectBase objectActive = Owner.Container[i]; if (objectActive.Status != ObjectStatus.Alive || Function.IsFriendly(objectActive.League, Owner.League)) { continue; } // 限定目標 if (Target.TargetType == TargetType.GameObejct) { if (objectActive == Target.Object) { i = Owner.Container.Count; } else { continue; } } // 特殊狀態判定 具碰撞 非鬼魂 if ((objectActive.Propertys.Affix & SpecialStatus.Collision) != SpecialStatus.Collision || (objectActive.Propertys.Affix & SpecialStatus.Ghost) == SpecialStatus.Ghost) { continue; } // 碰撞判定 if (!Function.IsCollison(Owner.Layout, objectActive.Layout)) { continue; } int colliderPower = -1; for (int j = 0; j < objectActive.Propertys.Count; j++) { PropertyCollision checkCollision = objectActive.Propertys[j] as PropertyCollision; if (checkCollision != null && checkCollision.Status == PropertyStatus.Enabled) { if (checkCollision.Target.TargetType != TargetType.GameObejct || checkCollision.Target.Object == Owner) { colliderPower = Math.Max(colliderPower, checkCollision.CollisionPower); } } } if (colliderPower < 0) { continue; } if (colliderPower >= CollisionPower) { Owner.Kill(objectActive, ObjectDeadType.Collision); } if (CollisionPower >= colliderPower) { objectActive.Kill(Owner, ObjectDeadType.Collision); } } } base.DoActionMoving(); }