第十一章 地图动作与地图事件(Map Action and Map Event)
我们已经有了剧本,而且可以运行剧本,但我们还缺少对地图的操作控制。
我们这一章来完成地图上的操作,地图的操作将全部由MapAction
控制。
文章目录
八 地图事件(Map Event)
地图事件是我们地图中所发生的事情,包括:
-
触发条件;
-
触发结果。
它也比较常见,例如:
条件 | 结果 | FE4中实例 |
---|---|---|
地图开始 | 创建各种地图对象 | 战斗开始时的剧情,然后创建地图对象 |
角色到达某个地点 | 获取物品 | 第一章时斧骑士到达海边获取二回攻击斧 |
某回合开始 | 创建各种地图对象 | 某些剧情需要 |
对应角色对话 | 获取物品、提升属性等 | 某些章节对话 |
等等诸如此类的事件。
这一节,我们挑选一些典型的事件来说明。
1 地图事件类(Class MapEvent)
我们的地图事件必须包含:
-
入口条件(主条件);
-
一些子条件;
-
触发结果。
当然,还有一些帮助类的属性:
-
唯一标识(
id
); -
是否只触发一次;
-
是否触发过。
创建类:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Xml.Serialization;
namespace DR.Book.SRPG_Dev.ScriptManagement
{
[Serializable]
public class MapEvent
{
[XmlAttribute]
public int id;
/// <summary>
/// 是否只能触发一次
/// </summary>
[XmlAttribute]
public bool onlyonce;
/// <summary>
/// 进入事件条件的类型
/// </summary>
[XmlIgnore]
public MapEventConditionType entryConditionType;
/// <summary>
/// 进入事件条件
/// </summary>
[XmlChoiceIdentifier("entryConditionType")]
[XmlElement("NoneCondition", typeof(Condition)),
XmlElement("TurnCondition", typeof(TurnCondition)),
XmlElement("PositionCondition", typeof(PositionCondition)),
XmlElement("RoleCondition", typeof(RoleCondition), IsNullable = true),
XmlElement("RoleDeadCondition", typeof(RoleDeadCondition)),
XmlElement("RoleTalkCondition", typeof(RoleTalkCondition)),
XmlElement("RoleCombatTalkCondition", typeof(RoleCombatTalkCondition)),
XmlElement("PropertyCondition", typeof(PropertyCondition), IsNullable = true),
XmlElement("ItemCondition", typeof(ItemCondition), IsNullable = true)]
public Condition entryCondition;
/// <summary>
/// 额外的事件条件
/// </summary>
[XmlArray]
[XmlArrayItem(typeof(TurnCondition)),
XmlArrayItem(typeof(PositionCondition)),
XmlArrayItem(typeof(RoleCondition)),
XmlArrayItem(typeof(RoleDeadCondition)),
XmlArrayItem(typeof(PropertyCondition)),
XmlArrayItem(typeof(ItemCondition))]
public List<Condition> conditions = new List<Condition>();
/// <summary>
/// 事件结果
/// </summary>
[XmlArray]
[XmlArrayItem(typeof(ScenarioResult)),
XmlArrayItem(typeof(CreateObjectResult)),
XmlArrayItem(typeof(PositionResult)),
XmlArrayItem(typeof(PropertyResult)),
XmlArrayItem(typeof(ItemResult)),
XmlArrayItem(typeof(WinResult)),
XmlArrayItem(typeof(LoseResult))]
public List<Result> triggers = new List<Result>();
/// <summary>
/// 是否已经触发过
/// </summary>
[XmlIgnore]
public bool isTriggered {
get; private