void EffectAttrConfigurator(Effect effect, int ID, float startX, float startY) { EffectAttr effectAttr = effect.effectAttrs[ID]; if (GUI.Button(new Rect(startX, startY += 18, 70, 14), "Remove")) { effect.effectAttrs.Remove(effectAttr); return; } int type = (int)effectAttr.type; cont = new GUIContent("Type:", "Type of the effect"); contList = new GUIContent[effectTypeLabel.Length]; for (int i = 0; i < contList.Length; i++) { contList[i] = new GUIContent(effectTypeLabel[i], effectTypeTooltip[i]); } EditorGUI.LabelField(new Rect(startX, startY += 18, 200, 20), cont); type = EditorGUI.Popup(new Rect(startX + 40, startY, 80, 16), type, contList); effectAttr.type = (_EffectAttrType)type; if (effectAttr.type == _EffectAttrType.HPDamage || effectAttr.type == _EffectAttrType.HPGain || effectAttr.type == _EffectAttrType.APGain || effectAttr.type == _EffectAttrType.APDamage) { cont = new GUIContent("ValueMin:", "Minimum value for the effect"); EditorGUI.LabelField(new Rect(startX, startY += 18, 200, 20), cont); effectAttr.value = EditorGUI.FloatField(new Rect(startX + 70, startY - 1, 50, 16), effectAttr.value); cont = new GUIContent("ValueMax:", "Maximum value for the effect"); EditorGUI.LabelField(new Rect(startX, startY += 18, 200, 20), cont); effectAttr.valueAlt = EditorGUI.FloatField(new Rect(startX + 70, startY - 1, 50, 16), effectAttr.valueAlt); } else { cont = new GUIContent("ValueMax:", "Value for the effect"); EditorGUI.LabelField(new Rect(startX, startY += 18, 200, 20), cont); effectAttr.value = EditorGUI.FloatField(new Rect(startX + 70, startY - 1, 50, 16), effectAttr.value); } //~ if(type==1){ //~ //cont=new GUIContent("Range:", "Effective range of the ability in term of tile"); //~ //EditorGUI.LabelField(new Rect(startX, startY+=18, 200, 20), "use Default Damage:"); //~ //effect.useDefaultDamageValue=EditorGUI.Toggle(new Rect(startX+120, startY-1, 50, 16), effect.useDefaultDamageValue); //~ } //~ if(type!=2 || !effectAttr.useDefaultDamageValue){ //~ //cont=new GUIContent("Range:", "Effective range of the ability in term of tile"); //~ EditorGUI.LabelField(new Rect(startX, startY+=18, 200, 20), "value:"); //~ effectAttr.value=EditorGUI.FloatField(new Rect(startX+70, startY-1, 50, 16), effectAttr.value); //~ } cont = new GUIContent("Duration:", "Effective duration of the effect in term of round"); EditorGUI.LabelField(new Rect(startX, startY += 18, 200, 20), cont); effectAttr.duration = EditorGUI.IntField(new Rect(startX + 70, startY - 1, 50, 16), effectAttr.duration); }
public EffectAttr Clone() { EffectAttr effectAttr = new EffectAttr(); effectAttr.type = type; effectAttr.useDefaultDamageValue = useDefaultDamageValue; effectAttr.value = value; effectAttr.valueAlt = valueAlt; effectAttr.duration = duration; effectAttr.damageType = damageType; effectAttr.unit = unit; effectAttr.collectible = collectible; return(effectAttr); }
//calculate the active effect on the tile, called in every new round event bool CalulateEffect(UnitAbility ability) { //loop through all the active effect list for (int j = 0; j < ability.effectAttrs.Count; j++) { EffectAttr effectAttr = ability.effectAttrs[j]; effectAttr.duration -= 1; //if the effect duration has reach zero, cancel it by changing the modifier if (effectAttr.duration == 0) { //commented effect are disabled for tile if (effectAttr.type == _EffectAttrType.HPDamage) { HPGainModifier += (int)effectAttr.value; } else if (effectAttr.type == _EffectAttrType.HPGain) { HPGainModifier -= (int)effectAttr.value; } else if (effectAttr.type == _EffectAttrType.APDamage) { APGainModifier += (int)effectAttr.value; } else if (effectAttr.type == _EffectAttrType.APGain) { APGainModifier -= (int)effectAttr.value; } else if (effectAttr.type == _EffectAttrType.Damage) { damageModifier -= (int)effectAttr.value; } //~ else if(effectAttr.type==_EffectAttrType.MovementRange){ //~ movementModifier-=(int)effectAttr.value; //~ } else if (effectAttr.type == _EffectAttrType.AttackRange) { attRangeModifier -= (int)effectAttr.value; } //~ else if(effectAttr.type==_EffectAttrType.Speed){ //~ speedModifier-=(int)effectAttr.value; //~ } else if (effectAttr.type == _EffectAttrType.HitChance) { attackModifier -= effectAttr.value; } else if (effectAttr.type == _EffectAttrType.DodgeChance) { defendModifier -= effectAttr.value; } else if (effectAttr.type == _EffectAttrType.CriticalChance) { criticalModifier -= effectAttr.value; } else if (effectAttr.type == _EffectAttrType.CriticalImmunity) { critDefModifier -= effectAttr.value; } /* * //~ else if(effectAttr.type==_EffectAttrType.ExtraAttack){ * //~ extraAttackModifier-=1; * //~ } * //~ else if(effectAttr.type==_EffectAttrType.ExtraCounterAttack){ * //~ counterAttackModifier-=1; * //~ } * //~ else if(effectAttr.type==_EffectAttrType.Stun){ * //~ stun-=1; * //~ } * //~ else if(effectAttr.type==_EffectAttrType.DisableAttack){ * //~ attackDisabled-=1; * //~ } * //~ else if(effectAttr.type==_EffectAttrType.DisableMovement){ * //~ movementDisabled-=1; * //~ } * //~ else if(effectAttr.type==_EffectAttrType.DisableAbility){ * //~ abilityDisabled-=1; * //~ } */ //remove the effect from the ability ability.effectAttrs.RemoveAt(j); j -= 1; } } //if there's no more effect active for the ability, return false, the ability will be removed if (ability.effectAttrs.Count == 0) { return(false); } return(true); }
//function call to apply effectAttr, apply the effect value and edit the modifier(subject to effectAttr duration) void ApplyAbilityEffect(EffectAttr effect){ if(effect.type==_EffectAttrType.HPDamage){ //first round, any dot after the first round is calculated and applied in CalculateHPDamagePerTurn() float val=Random.Range(effect.value, effect.valueAlt); float modifier=DamageTable.GetModifier(armorType, effect.damageType); ApplyDamage((int)(val*modifier)); } else if(effect.type==_EffectAttrType.HPGain){ HPGainMin+=(int)effect.value; HPGainMax+=(int)effect.valueAlt; ApplyHeal((int)Random.Range(effect.value, effect.valueAlt)); } else if(effect.type==_EffectAttrType.APDamage){ APGainMin-=(int)effect.value; APGainMax-=(int)effect.valueAlt; GainAP(-(int)Random.Range(effect.value, effect.valueAlt)); } else if(effect.type==_EffectAttrType.APGain){ APGainMin+=(int)effect.value; APGainMax+=(int)effect.valueAlt; GainAP((int)Random.Range(effect.value, effect.valueAlt)); } else if(effect.type==_EffectAttrType.Damage){ rangeDamageMin+=(int)effect.value; rangeDamageMax+=(int)effect.value; meleeDamageMin+=(int)effect.value; meleeDamageMax+=(int)effect.value; } else if(effect.type==_EffectAttrType.MovementRange){ movementRange-=(int)effect.value; } else if(effect.type==_EffectAttrType.AttackRange){ attackRangeMax+=(int)effect.value; } else if(effect.type==_EffectAttrType.TurnPriority){ turnPriority+=(int)effect.value; } else if(effect.type==_EffectAttrType.HitChance){ attRange+=effect.value; attMelee+=effect.value; } else if(effect.type==_EffectAttrType.DodgeChance){ defend+=effect.value; } else if(effect.type==_EffectAttrType.CriticalChance){ criticalMelee+=effect.value; criticalRange+=effect.value; } else if(effect.type==_EffectAttrType.CriticalImmunity){ critDef+=effect.value; } else if(effect.type==_EffectAttrType.ExtraAttack){ attackPerTurn+=(int)effect.value; attackRemain+=(int)effect.value; } else if(effect.type==_EffectAttrType.ExtraCounterAttack){ counterPerTurn+=(int)effect.value; counterAttackRemain+=(int)effect.value; } else if(effect.type==_EffectAttrType.Stun){ stun+=1; } else if(effect.type==_EffectAttrType.DisableAttack){ attackDisabled+=1; } else if(effect.type==_EffectAttrType.DisableMovement){ movementDisabled+=1; } else if(effect.type==_EffectAttrType.DisableAbility){ abilityDisabled+=1; } else if(effect.type==_EffectAttrType.ChangeTargetFaction){ if(defaultFactionID<0){ //~ if(Random.Range(0f, 1f)<effect.value){ defaultFactionID=factionID; //factionChangeDuration=effect.duration; UnitControl.ChangeUnitFaction(this, (int)effect.valueAlt); //~ } } } }
//function call to process effectAttr, edit the modifier value and check duration bool CalculateAbilityEffect(EffectAttr effect){ effect.duration-=1; if(effect.duration<=0){ if(effect.type==_EffectAttrType.HPDamage){ //calculation goes directly in CalculateHPDamagePerTurn() } else if(effect.type==_EffectAttrType.HPGain){ HPGainMin+=(int)effect.value; HPGainMax+=(int)effect.valueAlt; } else if(effect.type==_EffectAttrType.APDamage){ APGainMin+=(int)effect.value; APGainMax+=(int)effect.valueAlt; } else if(effect.type==_EffectAttrType.APGain){ APGainMin-=(int)effect.value; APGainMax-=(int)effect.valueAlt; } else if(effect.type==_EffectAttrType.Damage){ rangeDamageMin-=(int)effect.value; rangeDamageMax-=(int)effect.value; meleeDamageMin-=(int)effect.value; meleeDamageMax-=(int)effect.value; } else if(effect.type==_EffectAttrType.MovementRange){ movementRange-=(int)effect.value; } else if(effect.type==_EffectAttrType.AttackRange){ attackRangeMax-=(int)effect.value; } else if(effect.type==_EffectAttrType.TurnPriority){ turnPriority-=(int)effect.value; } else if(effect.type==_EffectAttrType.HitChance){ attRange-=effect.value; attMelee-=effect.value; } else if(effect.type==_EffectAttrType.DodgeChance){ defend-=effect.value; } else if(effect.type==_EffectAttrType.CriticalChance){ criticalRange-=effect.value; criticalMelee-=effect.value; } else if(effect.type==_EffectAttrType.CriticalImmunity){ critDef-=effect.value; } else if(effect.type==_EffectAttrType.ExtraAttack){ attackPerTurn-=(int)effect.value; attackRemain-=(int)effect.value; } else if(effect.type==_EffectAttrType.ExtraCounterAttack){ counterPerTurn-=(int)effect.value; counterAttackRemain-=(int)effect.value; } else if(effect.type==_EffectAttrType.Stun){ stun-=1; } else if(effect.type==_EffectAttrType.DisableAttack){ attackDisabled-=1; } else if(effect.type==_EffectAttrType.DisableMovement){ movementDisabled-=1; } else if(effect.type==_EffectAttrType.DisableAbility){ abilityDisabled-=1; } else if(effect.type==_EffectAttrType.ChangeTargetFaction){ //factionChangeDuration-=1; UnitControl.ChangeUnitFaction(this, defaultFactionID); defaultFactionID=-1; } return true; } return false; }
public EffectAttr Clone() { EffectAttr effectAttr=new EffectAttr(); effectAttr.type=type; effectAttr.useDefaultDamageValue=useDefaultDamageValue; effectAttr.value=value; effectAttr.valueAlt=valueAlt; effectAttr.duration=duration; effectAttr.damageType=damageType; effectAttr.unit=unit; effectAttr.collectible=collectible; return effectAttr; }
void EffectAttrConfigurator(UnitAbility uAB, int ID, int startX, int startY) { EffectAttr effectAttr = uAB.effectAttrs[ID]; if (GUI.Button(new Rect(startX, startY += 18, 70, 14), "Remove")) { uAB.effectAttrs.Remove(effectAttr); return; } int type = (int)effectAttr.type; cont = new GUIContent("Type:", "Type of the effect."); contList = new GUIContent[effectAttrTypeLabel.Length]; for (int i = 0; i < contList.Length; i++) { contList[i] = new GUIContent(effectAttrTypeLabel[i], effectAttrTypeTooltip[i]); } EditorGUI.LabelField(new Rect(startX, startY += 18, 200, 20), cont); type = EditorGUI.Popup(new Rect(startX + 40, startY, 80, 16), type, contList); effectAttr.type = (_EffectAttrType)type; if (effectAttr.type == _EffectAttrType.Teleport) { uAB.targetType = _AbilityTargetType.EmptyTile; uAB.requireTargetSelection = true; uAB.targetArea = _TargetArea.Default; uAB.aoeRange = 0; } else if (effectAttr.type == _EffectAttrType.SpawnUnit || effectAttr.type == _EffectAttrType.SpawnCollectible) { if (effectAttr.type == _EffectAttrType.SpawnUnit) { cont = new GUIContent("Unit To Spawn:", "The unit prefab to be used spawned"); EditorGUI.LabelField(new Rect(startX, startY += 18, 180, 20), cont); effectAttr.unit = (UnitTB)EditorGUI.ObjectField(new Rect(startX, startY += 18, 125, 17), effectAttr.unit, typeof(UnitTB), false); cont = new GUIContent("Duration:", "The effective duration in which the spawned unit will last\nSet to -ve value for the spawn to be permenant"); EditorGUI.LabelField(new Rect(startX, startY += 18, 200, 20), cont); effectAttr.duration = EditorGUI.IntField(new Rect(startX + 70, startY - 1, 50, 16), effectAttr.duration); if (effectAttr.duration == 0) { effectAttr.duration = -1; } } else if (effectAttr.type == _EffectAttrType.SpawnCollectible) { cont = new GUIContent("Collectible To Spawn:", "The collectible prefab to be used spawned"); EditorGUI.LabelField(new Rect(startX, startY += 18, 180, 20), cont); effectAttr.collectible = (CollectibleTB)EditorGUI.ObjectField(new Rect(startX, startY += 18, 125, 17), effectAttr.collectible, typeof(CollectibleTB), false); } uAB.targetType = _AbilityTargetType.EmptyTile; uAB.requireTargetSelection = true; uAB.targetArea = _TargetArea.Default; uAB.aoeRange = 0; } else if (effectAttr.type == _EffectAttrType.ChangeTargetFaction) { cont = new GUIContent("Chance:", "The chance of success. Take value from 0 to 1"); EditorGUI.LabelField(new Rect(startX, startY += 18, 200, 20), cont); effectAttr.value = EditorGUI.FloatField(new Rect(startX + 70, startY - 1, 50, 16), effectAttr.value); //~ cont=new GUIContent("Duration:", "The effective duration of the faction change"); //~ EditorGUI.LabelField(new Rect(startX, startY+=18, 200, 20), cont); //~ effectAttr.duration=EditorGUI.IntField(new Rect(startX+70, startY-1, 50, 16), effectAttr.duration); uAB.targetType = _AbilityTargetType.Hostile; uAB.requireTargetSelection = true; uAB.targetArea = _TargetArea.Default; uAB.aoeRange = 0; } else if (effectAttr.type == _EffectAttrType.HPDamage) { cont = new GUIContent("UseDefaultValue:", "Check to use the unit default attack damage value"); EditorGUI.LabelField(new Rect(startX, startY += 18, 200, 20), cont); effectAttr.useDefaultDamageValue = EditorGUI.Toggle(new Rect(startX + 107, startY - 1, 50, 16), effectAttr.useDefaultDamageValue); if (!effectAttr.useDefaultDamageValue) { cont = new GUIContent("ValueMin:", "Minimum value for the effect"); EditorGUI.LabelField(new Rect(startX, startY += 18, 200, 20), cont); effectAttr.value = EditorGUI.FloatField(new Rect(startX + 70, startY - 1, 50, 16), effectAttr.value); cont = new GUIContent("ValueMax:", "Maximum value for the effect"); EditorGUI.LabelField(new Rect(startX, startY += 18, 200, 20), cont); effectAttr.valueAlt = EditorGUI.FloatField(new Rect(startX + 70, startY - 1, 50, 16), effectAttr.valueAlt); } } else if (effectAttr.type == _EffectAttrType.HPGain || effectAttr.type == _EffectAttrType.APGain || effectAttr.type == _EffectAttrType.APDamage) { cont = new GUIContent("ValueMin:", "Minimum value for the effect"); EditorGUI.LabelField(new Rect(startX, startY += 18, 200, 20), cont); effectAttr.value = EditorGUI.FloatField(new Rect(startX + 70, startY - 1, 50, 16), effectAttr.value); effectAttr.value = Mathf.Min(effectAttr.value, effectAttr.valueAlt); cont = new GUIContent("ValueMax:", "Maximum value for the effect"); EditorGUI.LabelField(new Rect(startX, startY += 18, 200, 20), cont); effectAttr.valueAlt = EditorGUI.FloatField(new Rect(startX + 70, startY - 1, 50, 16), effectAttr.valueAlt); effectAttr.valueAlt = Mathf.Max(effectAttr.value, effectAttr.valueAlt); } else { cont = new GUIContent("Value:", "Value for the effect"); EditorGUI.LabelField(new Rect(startX, startY += 18, 200, 20), cont); effectAttr.value = EditorGUI.FloatField(new Rect(startX + 70, startY - 1, 50, 16), effectAttr.value); } //~ if(type==1){ //~ cont=new GUIContent("Range:", "Effective range of the ability in term of tile"); //~ EditorGUI.LabelField(new Rect(startX, startY+=18, 200, 20), "use Default Damage:"); //~ effect.useDefaultDamageValue=EditorGUI.Toggle(new Rect(startX+120, startY-1, 50, 16), effect.useDefaultDamageValue); //~ } //~ if(type!=2 || !effectAttr.useDefaultDamageValue){ //~ cont=new GUIContent("Range:", "Effective range of the ability in term of tile"); //~ EditorGUI.LabelField(new Rect(startX, startY+=18, 200, 20), "value:"); //~ effectAttr.value=EditorGUI.FloatField(new Rect(startX+70, startY-1, 50, 16), effectAttr.value); //~ } if (uAB.effectType == _EffectType.Debuff || uAB.effectType == _EffectType.Buff) { if (effectAttr.type != _EffectAttrType.SpawnUnit) { cont = new GUIContent("Duration:", "Effective duration of the effect in term of round"); EditorGUI.LabelField(new Rect(startX, startY += 18, 200, 20), cont); effectAttr.duration = EditorGUI.IntField(new Rect(startX + 70, startY - 1, 50, 16), effectAttr.duration); } } //~ int type=(int)effectAttr.type; //~ cont=new GUIContent("Type:", "Type of the effect"); //~ contList=new GUIContent[effectAttrTypeLabel.Length]; //~ for(int i=0; i<contList.Length; i++) contList[i]=new GUIContent(effectAttrTypeLabel[i], effectAttrTypeTooltip[i]); //~ EditorGUI.LabelField(new Rect(startX, startY+=18, 200, 20), cont); //~ type = EditorGUI.Popup(new Rect(startX+40, startY, 80, 16), type, contList); //~ effectAttr.type=(_EffectAttrType)type; if (effectAttr.type == _EffectAttrType.HPDamage) { if (damageList.Length > 0) { contList = new GUIContent[damageTooltipList.Length]; for (int i = 0; i < contList.Length; i++) { contList[i] = new GUIContent(damageList[i], damageTooltipList[i]); } cont = new GUIContent("Type:", "Damage type to be inflicted on target"); EditorGUI.LabelField(new Rect(startX, startY += 18, 200, 20), cont); effectAttr.damageType = EditorGUI.Popup(new Rect(startX + 40, startY, 80, 16), effectAttr.damageType, contList); } else { cont = new GUIContent("Type:", "No damage type has been created, use DamageArmorTableEditor to create one"); EditorGUI.LabelField(new Rect(startX, startY += 18, 200, 20), cont); if (GUI.Button(new Rect(startX + 40, startY, 80, 15), "OpenEditor")) { DamageArmorTableEditor.Init(); } } } }