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;
}
}
}