static public object Rit_CurseRemoval(Thea2.Server.Group target, RitualsTask sourceTask) { if (target != null && target.characters != null) { SkillPack spp = (SkillPack)"SKILL_PACK-CURSE_P"; SkillPack spm = (SkillPack)"SKILL_PACK-CURSE_M"; SkillPack sps = (SkillPack)"SKILL_PACK-CURSE_S"; foreach (var v in target.characters) { var si = v.Get().GetSkillEffectOnCharacterMatchingSkillpack(spp); if (si == null) { si = v.Get().GetSkillEffectOnCharacterMatchingSkillpack(spm); if (si == null) { si = v.Get().GetSkillEffectOnCharacterMatchingSkillpack(sps); } } if (si == null) { continue; } v.Get().LearnSkill(Character.SkillCategory.Effect, si.source, FInt.ONE, true, -1); } } return(null); }
static public object Rit_CreateTrollRock(Thea2.Server.Group target, RitualsTask sourceTask) { if (target != null && target.characters != null) { string sb = "SUBRACE-CRATE_TROLL_ROCK"; Util_AddCharacter(target, sb); } return(null); }
static public object Rit_CreateBogBies(Thea2.Server.Group target, RitualsTask sourceTask) { if (target != null && target.characters != null) { string sb = "SUBRACE-CRATE_BOG_BIES"; Util_AddCharacter(target, sb); } return(null); }
static public object Rit_CreateAlkonost(Thea2.Server.Group target, RitualsTask sourceTask) { if (target != null && target.characters != null) { string sb = "SUBRACE-CRATE_ALKONOST"; Util_AddCharacter(target, sb); } return(null); }
static public object Rit_KnowledgeArmor(Thea2.Server.Group target, RitualsTask sourceTask) { if (target != null && target.characters != null) { Skill skill = (Skill)SKILL.KNOWLEDGE_ARMOR; Util_LearnSkillEffect(target, skill); } return(null); }
static public object Rit_EarthVision(Thea2.Server.Group target, RitualsTask sourceTask) { if (target != null && target.characters != null) { Skill skill = (Skill)SKILL.EARTH_VISION; Util_LearnSkillEffect(target, skill); } return(null); }
static public object Rit_ShouldersPower(Thea2.Server.Group target, RitualsTask sourceTask) { if (target != null && target.characters != null) { Skill skill = (Skill)SKILL.SHOULDERS_POWER; Util_LearnSkillEffect(target, skill); } return(null); }
static public object Rit_FireGift(Thea2.Server.Group target, RitualsTask sourceTask) { if (target != null && target.characters != null) { Skill skill = (Skill)SKILL.FIRE_GIFT; Util_LearnSkillEffect(target, skill); } return(null); }
static public object Rit_BlessSpiritual(Thea2.Server.Group target, RitualsTask sourceTask) { if (target != null && target.characters != null) { Skill skill = (Skill)SKILL.BLESS_S_RIT; Util_LearnSkillEffect(target, skill); } return(null); }
static public object Rit_HigherEducation(Thea2.Server.Group target, RitualsTask sourceTask) { if (target != null && target.characters != null) { FInt extraXp = (FInt)3; FInt charactersInGroups = (FInt)target.characters.Count; FInt bonus = extraXp / charactersInGroups; foreach (var c in target.characters) { c.Get().Xp = c.Get().Xp + bonus; } } return(null); }
static public object Rit_Celebration(Thea2.Server.Group target, RitualsTask sourceTask) { if (target != null && target.characters != null) { FInt newMorale = (FInt)40; foreach (Character c in target.characters) { if (c.attributes.GetFinal(TAG.MORALE) < newMorale) { c.attributes.SetBaseTo(TAG.MORALE, newMorale); } } } return(null); }
static public object Rit_SummonPet(Thea2.Server.Group target, RitualsTask sourceTask) { if (target != null && target.characters != null) { DBClass t = Globals.GetInstanceFromDB("ITEM_CARGO-WEAK_ONE_RANDOM_DOMESTIC_PET"); if (t != null) { Type tp = t.GetType(); if (tp == typeof(ItemCargo)) { CountEntityBase ceb = ItemBase.InstantaiteFrom(t as ItemCargo); target.AddItem(ceb); } } } return(null); }
static public object Rit_HealSHP(Thea2.Server.Group target, RitualsTask sourceTask) { if (target != null && target.characters != null) { Tag shp = (Tag)TAG.HEALTH_SPIRIT; foreach (var v in target.characters) { FInt f = v.Get().attributes.GetBase(shp); FInt max = v.Get().maxSHP; if (max.ToInt() == f.ToInt()) { continue; } int heal = Mathf.Max(1, max.ToInt() / 2); int newHP = Mathf.Min(max.ToInt(), (f + heal).ToInt()); v.Get().attributes.SetBaseTo(shp, FInt.ONE * newHP); } } return(null); }
static public object Rit_RefreshUpgradeIdol(Thea2.Server.Group target, RitualsTask sourceTask) { if (target != null && target.items != null) { BuildingRecipe br = (BuildingRecipe)BUILD_REC.IDOL; var oldIdol = target.items.Find(o => o.GetItem().GetSource() == br); if (oldIdol == null) { return(null); } var oldDemon = oldIdol.GetItem().superConnection; #region Create new idol List <ItemBase> ibs = ItemBase.items.Where(o => o.GetSource() == br && (o as ItemCrafted).recipeIngredientCount[0] == sourceTask.GetMaterial1Count() && (o as ItemCrafted).recipeIngreadients[0].Get() == sourceTask.GetMaterial1()).ToList(); if (ibs.Count != 1) { Debug.LogError("[ERROR]Number of options in upgrade idol is different than 1: " + ibs.Count); return(null); } ItemCrafted ib = ibs[0] as ItemCrafted; ItemBase inst = ib.Clone <ItemBase>(true); Skill skill = null; if (br.skills != null) { if (!SkillInstance.skillPacks.ContainsKey(br.skills)) { Debug.LogError("[ERROR]Missing skillpack " + br.skills); return(null); } List <Skill> si = SkillInstance.skillPacks[br.skills]; HashSet <Tag> essences = new HashSet <Tag>(); Dictionary <Tag, FInt> essenceCounts = new Dictionary <Tag, FInt>(); List <Skill> valid = new List <Skill>(); CountedResource material1 = null; CountedResource material2 = null; if (ib.recipeIngreadients.Length > 0) { material1 = new CountedResource(); material1.resourceName = ib.recipeIngreadients[0].Get(); material1.resourceCount = ib.recipeIngredientCount[0]; } if (ib.recipeIngreadients.Length > 1) { material2 = new CountedResource(); material2.resourceName = ib.recipeIngreadients[1].Get(); material2.resourceCount = ib.recipeIngredientCount[1]; } if (material1 != null) { foreach (var v in material1.resourceName.essences) { FInt count = new FInt(v.amount) * material1.resourceCount; if (count <= 0) { continue; } essences.Add(v.tag); essenceCounts[v.tag] = count; } } if (material2 != null) { foreach (var v in material2.resourceName.essences) { FInt count = new FInt(v.amount) * material2.resourceCount; if (count <= 0) { continue; } if (!essences.Contains(v.tag)) { essences.Add(v.tag); } if (!essenceCounts.ContainsKey(v.tag)) { essenceCounts[v.tag] = count; } else { essenceCounts[v.tag] += count; } } if (essences.Count > 0) { Tag g = (Tag)TAG.ESSENCE_GRAY; essences.Add(g); } } foreach (var v in si) { bool b = true; foreach (var e in v.baseEssence) { if (!essences.Contains(e.tag)) { b = false; break; } } if (!b) { continue; } valid.Add(v); } if (valid.Count < 1) { Debug.LogError("[ERROR]No valid skill during upgrade of the idol in skillpack " + br.skills); return(null); } skill = valid[0]; } if (skill != null) { inst.skill = SkillInstance.Instantiate(skill, inst); } #endregion #region Destroy old idol //destroy old idol var ceb = target.TakeItem(oldIdol.GetItem(), 1); ceb.GetItem().Destroy(); #endregion //Add new idol var cebNewIdol = target.AddItem(inst, 1); //super connect with old demon to keep it alive if one was still there, otherwise it will create new one. if (oldDemon != null && oldDemon.Valid()) { cebNewIdol.GetItem().SuperConnectWith(oldDemon); } } return(null); }
static public object Rit_MoonBridge(Thea2.Server.Group target, RitualsTask sourceTask) { if (target.settlement) { return(null); } List <Thea2.Server.Group> groups = GameInstance.Get().GetValidPlayerGroups(); List <Thea2.Server.Group> visibleGroups = new List <Thea2.Server.Group>(groups); //visibleGroups.AddRange(groups); visibleGroups.AddRange(GameInstance.Get().GetEnemyGroups()); List <Vector3i> groupsPos = new List <Vector3i>(); List <Vector3i> range = new List <Vector3i>(); foreach (var g in groups) { //check if testing group is different than target group and if group owner is equal to target owner if (g != target && g.ownerID == target.ownerID) { groupsPos.Add(g.Position); } } //sort groups positions from nearest to farthest position groupsPos.Sort(delegate(Vector3i a, Vector3i b) { int distA = HexCoordinates.HexDistance(target.Position, a); int distB = HexCoordinates.HexDistance(target.Position, b); return(distA.CompareTo(distB)); }); //find proper group to teleport to foreach (Vector3i v in groupsPos) { //teleport is possible in range up to 5 hexes from available group, check from nearest to farthest hexes //find hexes in range //can't teleport on water //check if hex is occupied by enemy group, settlement or camping for (int i = 0; i <= 5; i++) { range = HexNeighbors.GetRange(v, i); foreach (var hex in range) { if (World.IsLand(hex) && !GameInstance.Get().GetGroupsToTeleport().ContainsValue(hex)) { List <Thea2.Server.Group> obstacles = visibleGroups.FindAll(o => o.Position == hex && (o.ownerID < 0 || o.settlement || o.camping)); if (obstacles.Count > 0) { continue; } GameInstance.Get().AddToTeleport(target.ID, hex); return(null); } } } } return(null); }