public override bool GetReq(Character character) { ExplorerTeam team = character.MemberTeam as ExplorerTeam; if (team == null) { return(false); } int count = 0; foreach (Character ally in character.MemberTeam.Players) { if (ally != character) { MonsterData data = DataManager.Instance.GetMonster(ally.BaseForm.Species); if (data.PromoteFrom > -1) { count++; } } } return(count >= Allies); }
public IEnumerator <YieldInstruction> ProcessGiveItem(GroundChar character, int invSlot, int teamSlot) { ExplorerTeam memberTeam = DataManager.Instance.Save.ActiveTeam; Character itemChar = memberTeam.Leader; if (teamSlot > -1) { itemChar = memberTeam.Players[teamSlot]; } //no curse check in ground mode InvItem item = memberTeam.GetInv(invSlot); memberTeam.RemoveFromInv(invSlot); GameManager.Instance.SE(DataManager.Instance.EquipSE); if (itemChar.EquippedItem.ID > -1) { yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.SetDialogue(false, Text.FormatKey("MSG_ITEM_SWAP", itemChar.Name, item.GetName(), itemChar.EquippedItem.GetName())))); //put item in inv memberTeam.AddToInv(new InvItem(itemChar.EquippedItem)); } else { yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.SetDialogue(false, Text.FormatKey("MSG_ITEM_GIVE", itemChar.Name, item.GetName())))); } itemChar.EquipItem(item); }
public void RemoveChar(int charIndex) { ExplorerTeam team = DataManager.Instance.Save.ActiveTeam; team.Players.RemoveAt(charIndex); //update leader if (charIndex < team.LeaderIndex) { team.LeaderIndex--; } }
public IEnumerator <YieldInstruction> ProcessTakeItem(GroundChar character, int teamSlot) { ExplorerTeam memberTeam = DataManager.Instance.Save.ActiveTeam; Character itemChar = memberTeam.Players[teamSlot]; //no curse check in ground mode InvItem item = itemChar.EquippedItem; memberTeam.AddToInv(item); itemChar.DequipItem(); GameManager.Instance.SE(DataManager.Instance.EquipSE); yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.SetDialogue(false, Text.FormatKey("MSG_ITEM_DEQUIP", itemChar.Name, item.GetName())))); }
public GameProgress() { ActiveTeam = new ExplorerTeam(); Dex = new UnlockState[DataManager.Instance.DataIndices[DataManager.DataType.Monster].Count]; DungeonUnlocks = new UnlockState[DataManager.Instance.DataIndices[DataManager.DataType.Zone].Count]; NextDest = ZoneLoc.Invalid; StartLevel = -1; StartDate = ""; UUID = ""; ProfilePics = new ProfilePic[0]; EndDate = ""; Location = ""; Trail = new List <string>(); Outcome = ResultType.Unknown; }
//public IEnumerator<YieldInstruction> ArriveOnTile(Character character) //public IEnumerator<YieldInstruction> ArriveOnTile(Character character, bool checkItem, bool wantItem, bool noTrap) private IEnumerator <YieldInstruction> ProcessTrashItem(GroundChar character, int invSlot, bool held) { InvItem invItem = null; if (held) { Character activeChar = DataManager.Instance.Save.ActiveTeam.Players[invSlot]; //no curse check in ground mode invItem = activeChar.EquippedItem; activeChar.EquippedItem = new InvItem(); } else { ExplorerTeam memberTeam = DataManager.Instance.Save.ActiveTeam; invItem = memberTeam.GetInv(invSlot); memberTeam.RemoveFromInv(invSlot); } yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.SetDialogue(false, String.Format("Threw away the {0}.", invItem.GetName())))); }
public override void OnPromote(Character character) { ExplorerTeam team = character.MemberTeam as ExplorerTeam; if (team == null) { return; } if (character.MemberTeam.Players.Count == team.GetMaxTeam(ZoneManager.Instance.CurrentZone)) { return; } //if character has an open team slot, spawn the new character based on the stats of the current one MonsterID formData = new MonsterID(ShedSpecies, 0, character.BaseForm.Skin, Gender.Genderless); MonsterData dex = DataManager.Instance.GetMonster(formData.Species); CharData newChar = new CharData(); newChar.BaseForm = formData; newChar.Level = character.Level; newChar.MaxHPBonus = character.MaxHPBonus; newChar.AtkBonus = character.AtkBonus; newChar.DefBonus = character.DefBonus; newChar.MAtkBonus = character.MAtkBonus; newChar.MDefBonus = character.MDefBonus; newChar.SpeedBonus = character.SpeedBonus; BaseMonsterForm forme = dex.Forms[formData.Form]; for (int ii = 0; ii < character.BaseSkills.Count; ii++) { newChar.BaseSkills[ii] = new SlotSkill(character.BaseSkills[ii]); } newChar.BaseIntrinsics[0] = forme.RollIntrinsic(DataManager.Instance.Save.Rand, 2); newChar.Discriminator = character.Discriminator; newChar.MetAt = character.MetAt; newChar.MetLoc = character.MetLoc; foreach (BattleEvent effect in character.ActionEvents) { newChar.ActionEvents.Add((BattleEvent)effect.Clone()); } Character player = new Character(newChar, character.MemberTeam); foreach (BackReference <Skill> move in player.Skills) { if (move.Element.SkillNum > -1) { SkillData entry = DataManager.Instance.GetSkill(move.Element.SkillNum); move.Element.Enabled = (entry.Data.Category == BattleData.SkillCategory.Physical || entry.Data.Category == BattleData.SkillCategory.Magical); } } player.Tactic = new AITactic(character.Tactic); character.MemberTeam.Players.Add(player); Loc?endLoc = ZoneManager.Instance.CurrentMap.GetClosestTileForChar(player, character.CharLoc); if (endLoc == null) { endLoc = character.CharLoc; } player.CharLoc = endLoc.Value; ZoneManager.Instance.CurrentMap.UpdateExploration(player); player.RefreshTraits(); DataManager.Instance.Save.RegisterMonster(newChar.BaseForm.Species); DataManager.Instance.Save.RogueUnlockMonster(newChar.BaseForm.Species); }
public override void Apply(T map) { //choose a room to cram all the items in List <int> possibleRooms = new List <int>(); for (int ii = 0; ii < map.RoomPlan.RoomCount; ii++) { FloorRoomPlan testPlan = map.RoomPlan.GetRoomPlan(ii); if (!BaseRoomFilter.PassesAllFilters(testPlan, this.Filters)) { continue; } //also do not choose a room that contains the start or end IViewPlaceableGenContext <MapGenEntrance> entranceMap = map; if (Collision.InBounds(testPlan.RoomGen.Draw, entranceMap.GetLoc(0))) { continue; } IViewPlaceableGenContext <MapGenExit> exitMap = map; if (Collision.InBounds(testPlan.RoomGen.Draw, exitMap.GetLoc(0))) { continue; } possibleRooms.Add(ii); } FloorRoomPlan roomPlan = null; Rect limitRect = Rect.Empty; while (possibleRooms.Count > 0) { int chosenRoom = map.Rand.Next(possibleRooms.Count); roomPlan = map.RoomPlan.GetRoomPlan(possibleRooms[chosenRoom]); bool[][] eligibilityGrid = new bool[roomPlan.RoomGen.Draw.Width][]; for (int xx = 0; xx < roomPlan.RoomGen.Draw.Width; xx++) { eligibilityGrid[xx] = new bool[roomPlan.RoomGen.Draw.Height]; for (int yy = 0; yy < roomPlan.RoomGen.Draw.Height; yy++) { bool eligible = true; Loc testLoc = roomPlan.RoomGen.Draw.Start + new Loc(xx, yy); if (map.Tiles[testLoc.X][testLoc.Y].TileEquivalent(map.RoomTerrain) && !map.HasTileEffect(testLoc) && map.Tiles[testLoc.X][testLoc.Y + 1].TileEquivalent(map.RoomTerrain) && !map.HasTileEffect(new Loc(testLoc.X, testLoc.Y + 1)) && !map.PostProcGrid[testLoc.X][testLoc.Y].Status[(int)PostProcType.Panel] && !map.PostProcGrid[testLoc.X][testLoc.Y].Status[(int)PostProcType.Item]) { foreach (MapItem item in map.Items) { if (item.TileLoc == testLoc) { eligible = false; break; } } } else { eligible = false; } eligibilityGrid[xx][yy] = eligible; } } List <Rect> candRects = Detection.DetectNLargestRects(eligibilityGrid, 1); if (candRects.Count > 0) { limitRect = new Rect(roomPlan.RoomGen.Draw.Start + candRects[0].Start, candRects[0].Size); if (limitRect.Size.X >= MIN_SHOP_SIZE && limitRect.Size.Y >= MIN_SHOP_SIZE) { break; } } possibleRooms.RemoveAt(chosenRoom); } if (limitRect.Size.X < MIN_SHOP_SIZE || limitRect.Size.Y < MIN_SHOP_SIZE) { return; } //randomly roll an actual rectangle within the saferect bounds: between 3x3 and the limit Loc rectSize = new Loc(map.Rand.Next(MIN_SHOP_SIZE, limitRect.Width + 1), map.Rand.Next(MIN_SHOP_SIZE, limitRect.Height + 1)); Loc rectStart = new Loc(limitRect.X + map.Rand.Next(limitRect.Width - rectSize.X + 1), limitRect.Y + map.Rand.Next(limitRect.Height - rectSize.Y + 1)); Rect safeRect = new Rect(rectStart, rectSize); // place the mat of the shop List <Loc> itemTiles = new List <Loc>(); for (int xx = safeRect.X; xx < safeRect.End.X; xx++) { for (int yy = safeRect.Y; yy < safeRect.End.Y; yy++) { Loc matLoc = new Loc(xx, yy); itemTiles.Add(matLoc); EffectTile effect = new EffectTile(45, true, matLoc); ((IPlaceableGenContext <EffectTile>)map).PlaceItem(matLoc, effect); map.PostProcGrid[matLoc.X][matLoc.Y].Status[(int)PostProcType.Panel] = true; map.PostProcGrid[matLoc.X][matLoc.Y].Status[(int)PostProcType.Item] = true; } } // place the map status for checking shop items and spawning security guards { MapStatus status = new MapStatus(SecurityStatus); status.LoadFromData(); ShopSecurityState securityState = new ShopSecurityState(); for (int ii = 0; ii < Mobs.Count; ii++) { securityState.Security.Add(Mobs.GetSpawn(ii).Copy(), Mobs.GetSpawnRate(ii)); } status.StatusStates.Set(securityState); status.StatusStates.Set(new MapIndexState(Personality)); map.Map.Status.Add(SecurityStatus, status); } // place the mob running the shop { ExplorerTeam newTeam = new ExplorerTeam(); newTeam.SetRank(1); Character shopkeeper = StartMob.Spawn(newTeam, map); Loc randLoc = itemTiles[map.Rand.Next(itemTiles.Count)]; ((IGroupPlaceableGenContext <TeamSpawn>)map).PlaceItems(new TeamSpawn(newTeam, true), new Loc[] { randLoc }); } //choose which item theme to work with ItemTheme chosenItemTheme = ItemThemes.Pick(map.Rand); //the item spawn list in this class dictates the items available for spawning //it will be queried for items that match the theme selected List <MapItem> chosenItems = chosenItemTheme.GenerateItems(map, Items); //place the items for (int ii = 0; ii < chosenItems.Count; ii++) { if (itemTiles.Count > 0) { MapItem item = new MapItem(chosenItems[ii]); int randIndex = map.Rand.Next(itemTiles.Count); ((IPlaceableGenContext <MapItem>)map).PlaceItem(itemTiles[randIndex], item); itemTiles.RemoveAt(randIndex); } } //prevent the room from being chosen for anything else roomPlan.Components.Set(new NoEventRoom()); }