using System; using System.Collections.Generic; using System.Drawing; using System.Reflection; using Rmake.Model.Casts; using Rmake.Model.Configurations; using Rmake.Model.Enums; using Rmake.Model.Events; using Rmake.Model.Maps; using Rmake.Model.Materials; using Rmake.Model.Processable.Orders; namespace Rmake.Model { /// /// Editor で利用する Class を生成する Factory /// public class EditingModelFactory { private Game game = null; private IDGenerator idGenerator { get{return game.Generator;} } /// /// 現在編集している Game /// public Game CurrentGame { get {return game;} set {game = value;} } /// /// 唯一の Constructor /// /// 編集対象の Game public EditingModelFactory() { } /// /// Game を新規作成する Method。 /// 新規作成された Game は CurrentGame に設定される。 /// /// 新規作成された Game の Instance public Game CreateGame(String gameName) { // Logger.Info("Game の新規作成を行う"); game = new Game(Game.DefaultID); game.Name = gameName; /* // Default Data の Copy String sourceDir = Folders.ApplicationDirectory + @"\Default\"; String destDir = Folders.ApplicationDirectory + @"\" + game.Name + @"\"; if ((!sourceDir.Equals(destDir)) && (FileSystem.DirectoryExists(sourceDir))) { FileSystem.CopyDirectory(sourceDir, destDir, true); } * */ // 素材 Manager の生成と素材の検索 MaterialManager materialManager = new MaterialManager(idGenerator.CreateNewID()); game.Materials = materialManager; MaterialSearcher materialSearcher = new MaterialSearcher(this); materialSearcher.MaterialSearch(game.Materials); //マップチップの初期化 //TODO: 仮の設定(10個限定、0番セットにmapchip.pngを割り当て) for (int i = 0; i < 10; i++) { MapchipSet mapchipSet = CreateMapchipSet(); mapchipSet.Name = String.Format("マップチップ{0:D2}", game.MapchipSets.Count); mapchipSet.ChipImage = game.Materials.GetMaterialByFileName(MaterialTypes.MapchipImage, "mapchip.png"); game.MapchipSets.Add(mapchipSet); // game.MapManagers.MapchipSetList.Add(CreateMapchipSet()); } // 初期パーティの初期化 game.StartParty = CreateParty(); game.StartParty.Member.Add(CreateCharacter()); // 初期 Map の作成 game.StartMap = CreateMap(); game.StartMap.Name = "ゲーム開始マップ"; // 装備箇所の初期設定 // TODO: ゲームデータで記述するべき EquipmentPoint onehand = CreateEquipmentPoint(); onehand.Name = "片手武器"; EquipmentPoint hands = CreateEquipmentPoint(); hands.Name = "両手武器"; EquipmentPoint shield = CreateEquipmentPoint(); shield.Name = "盾"; EquipmentPoint armor = CreateEquipmentPoint(); armor.Name = "鎧"; EquipmentPoint helm = CreateEquipmentPoint(); helm.Name = "兜"; EquipmentPoint special = CreateEquipmentPoint(); special.Name = "特殊"; hands.AddCannotEquipTogether(onehand); hands.AddCannotEquipTogether(shield); return game; } /// /// Party を生成する Method /// /// 生成された Party public Party CreateParty() { Party party = new Party(idGenerator.CreateNewID()); return party; } /// /// Character を生成する Method。 /// /// 生成された Character public Character CreateCharacter() { Status basicStatus = new Status(idGenerator.CreateNewID()); Status upStatus = new Status(idGenerator.CreateNewID()); Character character = new Character(idGenerator.CreateNewID(), basicStatus, upStatus); character.FaceImage = game.Materials.GetMissing(MaterialTypes.FaceImage); character.WalkingImage = game.Materials.GetMissing(MaterialTypes.CharacterWalkingImage); character.BattleImage = game.Materials.GetMissing(MaterialTypes.CharacterBattleImage); game.Characters.Add(character); return character; } public EquipmentPoint CreateEquipmentPoint() { EquipmentPoint equipmentPoint = new EquipmentPoint(idGenerator.CreateNewID()); game.EquipmentPoints.Add(equipmentPoint); return equipmentPoint; } /// /// Item を生成する Method /// /// 生成された Item public Item CreateItem() { Status usedStatus = new Status(idGenerator.CreateNewID()); Status equippedStatus = new Status(idGenerator.CreateNewID()); usedStatus.HP = 0; usedStatus.MP = 0; usedStatus.Strength = 0; usedStatus.Defence = 0; usedStatus.Intellect = 0; usedStatus.Speed = 0; equippedStatus.HP = 0; equippedStatus.MP = 0; equippedStatus.Strength = 0; equippedStatus.Defence = 0; equippedStatus.Intellect = 0; equippedStatus.Speed = 0; Item item = new Item(idGenerator.CreateNewID(), usedStatus, equippedStatus); item.Image = game.Materials.GetMissing(MaterialTypes.ItemImage); item.EffectImage = game.Materials.GetMissing(MaterialTypes.Anime); item.BattleImage = game.Materials.GetMissing(MaterialTypes.Anime); game.Items.Add(item); return item; } /// /// Magic を生成する Method /// /// 生成された Magic public Magic CreateMagic() { Magic magic = new Magic(idGenerator.CreateNewID()); magic.FaceImage = game.Materials.GetMissing(MaterialTypes.MagicImage); magic.EffectImage = game.Materials.GetMissing(MaterialTypes.Anime); magic.BattleImage = game.Materials.GetMissing(MaterialTypes.Anime); game.Magics.Add(magic); return magic; } /// /// Material を生成する Method。 /// Rmake.Editor.MaterialSearcher Class 以外から呼び出さないこと。 /// /// 素材の型 /// File 名 /// 生成された Material public Material CreateMaterial(MaterialTypes materialType, String filename) { Material material = new Material(idGenerator.CreateNewID(), filename, materialType); game.Materials.AddMaterial(materialType, material); return material; } /// /// 32 * 32 の Map を生成する。 /// /// 生成された Map public Map CreateMap() { return CreateMapWithSize(32, 32); } /// /// Map を生成するメソッド /// /// マップの横のサイズ(チップ個数) /// マップの縦のサイズ(チップ個数) /// 生成された Map public Map CreateMapWithSize(int width,int height) { List mapchipSets = new List(); mapchipSets.Add(game.MapchipSets[0]); mapchipSets.Add(game.MapchipSets[1]); mapchipSets.Add(game.MapchipSets[2]); mapchipSets.Add(game.MapchipSets[3]); mapchipSets.Add(game.MapchipSets[4]); Map map = new Map(idGenerator.CreateNewID(), width, height, mapchipSets); Maplayer lower = new Maplayer(idGenerator.CreateNewID(), map, width, height, "地面"); Maplayer middle = new Maplayer(idGenerator.CreateNewID(), map, width, height, "地上"); Maplayer upper = new Maplayer(idGenerator.CreateNewID(), map, width, height, "上空"); map.Layers.Add(lower); map.Layers.Add(middle); map.Layers.Add(upper); game.Maps.Add(map); return map; } /// /// Mapchip を 生成するメソッド /// /// 生成された Mapchip public Mapchip CreateMapchip() { return new Mapchip(idGenerator.CreateNewID()); } /// /// MapchipSet を 生成するメソッド /// /// 生成された MapchipSet public MapchipSet CreateMapchipSet() { Mapchip[,] chips = new Mapchip[8,32]; for (int y=0;y<32;y++) { for (int x=0;x<8;x++) { chips[x,y]=CreateMapchip(); } } return new MapchipSet(idGenerator.CreateNewID(),chips); } public Order CreateOrder(Type orderType) { if (orderType.IsSubclassOf(typeof(Order))) { Type[] parameters = new Type[1]; parameters[0] = typeof(Int64); ConstructorInfo cInfo = orderType.GetConstructor(parameters); Object[] constructorParams = new Object[1]; constructorParams[0] = idGenerator.CreateNewID(); return (Order)cInfo.Invoke(constructorParams); } else { return null; } } public FontParameter CreateFontParameter() { FontParameter font = new FontParameter(idGenerator.CreateNewID()); return font; } public Event CreateEvent(Point position) { Event item = new Event(idGenerator.CreateNewID()); item.Position = position; item.Actions.Add(CreateAction()); return item; } public Action CreateAction() { Action action = new Action(idGenerator.CreateNewID(), CreateOrder(typeof(TopLevelOrder))); Material material = CurrentGame.Materials.GetMissing(MaterialTypes.CharacterWalkingImage); action.WalkingImage = material; return action; } } }