rpgmaker吧 关注:13,337贴子:23,836

【开坑记录】单人制作一款融合战棋玩法的游戏

只看楼主收藏回复

一个凡人在世界毁灭之刻,穿越到被光明诸神所引导的魔法纪元,被命运女武神赋予将光明导入正轨的使命,由此与英灵同伴们展开冒险的故事。


IP属地:北京1楼2021-02-28 08:20回复
    支持多周目,有遵循光明引导和顺从自身意志两种结局。
    一周目没有额外选择,强制进行低难度光明线。
    二周目开始某些剧情点出现选项。


    IP属地:北京2楼2021-02-28 08:32
    回复
      序章·英灵现世与光导纪元
      -主角玩某正版授权俄罗斯方块手游,与同伴对话,提到今天是世界末日
      -陨石撞击地球
      -空间扭曲(特效),穿越到谜之空间,终点是光明,途中有黑暗的引诱(一周目无视)
      -穿越后在地下室醒来,面前站着一位女神,周围还有四名英灵跟一只哥布林
      -英灵想砍了哥布林,命运女武神希拉·瓦尔基里阻止了她们
      -剧情对话,女神向众英灵解释英灵召唤原因,帮助那只哥布林推广七曜轮旋套装
      -哥布林叫铝成,在韭游坊担任中层管理,负责开发七曜轮旋系列装备(七件套,分别对应火冰雷风地光暗七种元素)
      -不知为何,命运女神的眷顾降临到铝成头上,所以英灵们被召唤来帮助它推广七曜轮旋套装
      -希拉离开前,告知主角一行身负将光明引导至正轨的使命(完全看不出跟推广装备之间的联系)
      -因为主角受到女神的特别关注,所以其他英灵们一致推举主角当队长,带领她们完成使命
      -序章结束
      第一章 五十三期版号审批
      -铝成表示有事找它手下,然后就消失了
      -移动到韭游坊工作区,去找剧情NPC-炼铜术士
      -发现七曜轮旋套装的属性极差,连炼铜术士自己都看不起自己在制作的装备
      -对话得知推广套装需要版号,之前申请过版号,但是相关负责人已经离职
      -主线任务更新————去帝都咨询版号受理情况


      IP属地:北京3楼2021-02-28 08:35
      回复
        第二章 流量引导的旅途(流量为王,喧宾夺主)
        第三章 外神觉醒(被供奉在在三洞学园中的外神,三名伴巫女)
        第四章 神罚之雷裁定正邪(电疗戒网瘾)
        第五章 英雄与荣耀的东征(三款moba类游戏)
        第六章 猫变(猫变成猫娘)
        第七章 神之国与光之都(揭开使命的真正目的)
        第八章 我们都有光明的未来(顺应光明的指引,七曜轮旋系列推广大成功)
        终章 光穹破灭,黄昏降临(原因很奇葩)
        尾声 轮回的宿命
        -播放类似序章的剧情,主角在俄罗斯方块手游里氪了月卡跟首冲,感叹自己low
        -被称为毁灭者Destroyer的小行星降临,世界和序章中一样被毁灭
        -一周目结束


        IP属地:北京4楼2021-02-28 08:40
        回复
          多周目前六章名称与一周目一致,第七章开始进入黑暗线。
          第七章 欲望魔神与纪元历史(拉开斗争的序幕)
          第八章 沉沦黑暗之人集结(新的伙伴与佣兵)
          第九章 浩劫寄宿者
          终章 断却无明,重归混沌
          尾声 未知的可能
          -播放类似序章的剧情,主角删掉了俄罗斯方块手游,思考自己真正要做的事情
          -被称为毁灭者Destroyer的小行星与地球插肩而过,预言中的世界末日并没有到来
          -多周目结束


          IP属地:北京5楼2021-02-28 08:43
          回复
            关于剧情的简要描述到此为止,下面介绍下迄今为止的开发过程与计划。


            IP属地:北京6楼2021-02-28 08:44
            回复

              目前只加了一个自定义窗口,还有修改了敌我双方站位以及敌方人数上限。


              IP属地:北京7楼2021-02-28 08:49
              回复
                昨天列出一份需求清单,方便警示自己项目进度。
                比较完善:
                -战斗中敌方队伍在7*7范围内列阵。
                -战斗中我方队伍在7*7范围内列阵。
                初步实现:
                -战斗中显示自定义环境元素充盈度窗口。
                -调整战斗日志窗口位置。
                未实现:
                -战斗背景显示23*9的网格,位置固定(参照战棋类游戏)。
                -在设置中新增阵型选项,可在自定义窗口中修改我方角色列阵。
                -战斗中单位移动。
                -战斗中查看详情功能,用一个全局boolean变量控制,点击对应按键(暂定为Q)后,在下一个回合开始时触发。查看详情时可通过方向键或触屏切换对象,显示当前详细的buff与光环情况(名称、等级、剩余回合数等),己方对象还可修改手动/自动模式与自动技能使用模式。
                -我方出战人数上限提高到10(暂定值)。
                -我方角色细分为主角、伙伴和佣兵。
                -添加图鉴系统,记录机制同steam成就,读档时用当前图鉴解锁度覆盖之前记录。
                -在系统原回合制框架下,为参战者新增待命、招式蓄力、魔法吟唱、道具准备、就绪、冷却、观望等阶段。回合开始时,处于待命与就绪阶段的各单位按出手速度由高到低的顺序依次行动。回合结束时,按出手速度顺序依次刷新各单位的阶段剩余回合数。
                -原有技能类新增准备类型(近战招式/远程招式/辅助招式/攻击魔法/辅助魔法)、效果列表(自定义类型)、射程、范围、TP强化效果、TP奖励、优先度等成员变量,数据采用自定义配表,弃用引擎生成的原生技能配表。
                -自定义技能效果类,记录技能的伤害、治疗、附加状态等效果。战斗中相关接口需要全部重写。
                -自定义技能附带数值类型,与自定义角色属性系统相对应。
                -重写自动战斗逻辑,自动战斗下技能使用逻辑分为顺序与优先度两种模式。
                1)顺序模式下依次选择在技能界面设置的出手列表中技能机进行准备,待准备技能处于冷却状态时,改为武器攻击或不进行技能准备。
                2)优先度模式下根据当前已冷却技能的设置优先度加成与当前战况下的技能优先度之和,选择优先使用的技能进行准备。
                -自定义技能TP强化机制,释放技能时,若技能带有TP强化效果且使用者剩余TP值足够,则消耗TP值发动TP强化效果。
                -自定义角色属性系统,将角色属性细分为基本属性(战斗中不会变化,不影响技能效果)、次级属性(战斗中可变化,影响技能效果)与元素相性(战斗中会变化,影响技能数值,独立于基本属性和次级属性),弃用原有属性机制。
                1)基本属性-力量、体质、敏捷、灵巧、智力、意志。
                2)次级属性-最大HP、最大MP、最大TP、武器伤害、武器元素伤害、近攻、近防、远攻、远防、魔攻、魔防、物理命中、物理强命、物理闪避、物理暴击、穿甲、破势、招架、出手速度、HP恢复、MP恢复、TP恢复。
                3)元素亲和力-火炎、冰霜、闪电、风暴、地脉。
                4)信仰修为-神圣、暗黑。
                -在角色界面新增自定义窗口用于查看角色详细属性。
                -在技能界面新增自定义窗口用于查看技能详情。
                -自定义职业系统,区分天赋职业与通用职业,不同职业有专属技能树,天赋技能随等级解锁,通用技能需消耗技能点学习。职业列举详见职业与技能设定文档。
                1)天赋职业-主角与伙伴的天赋技能固定(主角多周目是否可以拥有双天赋待定),佣兵的天赋技能具有随机性。
                2)通用职业-主角可自由分配职业点数修习通用职业,伙伴的通用职业分布固定,佣兵的通用职业分布具有随机性(参照MH4G挖掘武器评级机制),通用职业是否提供属性加成待定。
                3)升级可解锁天赋技能与通用职业阶级,部分天赋技能与通用技能需要触发特定事件解锁(主线剧情、支线探索等)。
                -修改原有buff/debuff类,buff效果根据buff等级,固定改变目标基础属性一定百分比的buff数值(buff值不受人物属性影响,仅影响次级属性与元素相性,降低数值调控难度与描述文本长度)。


                IP属地:北京8楼2021-02-28 08:50
                回复
                  lz之前当过3年码农,对js跟H5前端有点了解。一年前就开始做这个游戏,但为了追求创新玩法,一直没考虑RM,20年10月得知可以靠插件实现创意玩法后才入了MZ。由于缺乏RM使用经验,干脆直接从看源码入手,目前除了rmmz_sprites.js外都看过一遍,写了自定义阵型跟添加自定义窗口两个插件。


                  IP属地:北京9楼2021-02-28 08:56
                  回复
                    下面开始更新进度,先从已实现的需求说起


                    IP属地:北京10楼2021-02-28 08:57
                    回复
                      需求:
                      -战斗中敌方队伍在7*7范围内列阵。
                      -战斗中我方队伍在7*7范围内列阵。
                      -
                      //=============================================================================
                      // RPG Maker MZ -
                      //=============================================================================
                      /*:
                      * @璐村惂鐢ㄦ埛_00JG6XM馃惥 MZ
                      * @plugindesc 按照阵型设置参战单位所在格
                      * @Author GHS猩猩
                      * @help
                      */
                      $dataTroopsFormation = null;
                      DataManager._databaseFiles = [
                      { name: "$dataActors", src: "Actors.json" },
                      { name: "$dataClasses", src: "Classes.json" },
                      { name: "$dataSkills", src: "Skills.json" },
                      { name: "$dataItems", src: "Items.json" },
                      { name: "$dataWeapons", src: "Weapons.json" },
                      { name: "$dataArmors", src: "Armors.json" },
                      { name: "$dataEnemies", src: "Enemies.json" },
                      { name: "$dataTroops", src: "Troops.json" },
                      { name: "$dataTroopsFormation", src: "TroopsFormation.json" },
                      { name: "$dataStates", src: "States.json" },
                      { name: "$dataAnimations", src: "Animations.json" },
                      { name: "$dataTilesets", src: "Tilesets.json" },
                      { name: "$dataCommonEvents", src: "CommonEvents.json" },
                      { name: "$dataSystem", src: "System.json" },
                      { name: "$dataMapInfos", src: "MapInfos.json" }
                      ];
                      (() => {
                      'use strict';
                      //敌方列阵
                      Game_Troop.prototype.setup = function (troopId) {
                      this.clear();
                      this._troopId = troopId;
                      this._enemies = [];
                      if ($dataTroopsFormation[this._troopId]) {
                      // console.log($dataTroopsFormation[this._troopId]);
                      for (var i = 1; i <= 15; i++) {
                      const enemyInfo = $dataTroopsFormation[this._troopId]["enemy_" + i];
                      const id_x_y = ExtraUtils.getNumArrayFromInfo(enemyInfo);
                      const enemyId = id_x_y[0];
                      if ($dataEnemies[enemyId]) {
                      const x = 300 + 48 * Number(id_x_y[1]);
                      const y = 200 + 48 * Number(id_x_y[2]);
                      const enemy = new Game_Enemy(enemyId, x, y);
                      this._enemies.push(enemy);
                      }
                      }
                      }
                      this.makeUniqueNames();
                      };
                      //我方列阵
                      /** Game_Actor中添加_position属性 */
                      var ga_initMembers = Game_Actor.prototype.initMembers;
                      Game_Actor.prototype.initMembers = function () {
                      ga_initMembers.call(this);
                      this._position = 10 * this._actorId + 7 - this._actorId;
                      };
                      var ga_setup = Game_Actor.prototype.setup;
                      Game_Actor.prototype.setup = function (actorId) {
                      ga_setup.call(this, actorId);
                      const actor = $dataActors[actorId];
                      this._position = actor.position || 10 * this._actorId + 7 - this._actorId;
                      };
                      Game_Actor.prototype.position = function () {
                      return this._position;
                      };
                      Game_Actor.prototype.posX = function () {
                      return Math.floor(this._position / 10);
                      }
                      Game_Actor.prototype.posY = function () {
                      return this._position % 10;
                      }
                      Game_Actor.prototype.changePosition = function (pos) {
                      if (ZZ_GameUtils.checkPos(pos)) {
                      this._position = pos;
                      }
                      }
                      /** 战斗场景中设置我方角色位置 */
                      Sprite_Actor.prototype.setBattler = function (battler) {
                      Sprite_Battler.prototype.setBattler.call(this, battler);
                      if (battler !== this._actor) {
                      this._actor = battler;
                      if (battler) {
                      console.log(battler);
                      // this.setActorHome(battler.index());
                      this.setActorHomeByPos(battler);
                      } else {
                      this._mainSprite.bitmap = null;
                      }
                      this.startEntryMotion();
                      this._stateSprite.setup(battler);
                      }
                      };
                      Sprite_Actor.prototype.setActorHomeByPos = function (actor) {
                      this.setHome(800 + actor.posX() * 48, 300 + actor.posY() * 48);
                      };
                      })();


                      IP属地:北京11楼2021-02-28 08:59
                      收起回复
                        修改我方角色默认站位相对好办,为Game_Actor添加一个_position属性,根据这个值设置角色战斗中位置。


                        IP属地:北京12楼2021-02-28 09:00
                        回复
                          修改敌方站位本身应该也不难,难办的是修改敌人上限。RMMZ引擎中一个敌群最大只能设置8个敌人,源码中也没看到应用的地方。所以直接弃用/data/Troops.json这个文件,自己用excel导出一个类似格式的TroopsFormation.json文件。


                          IP属地:北京13楼2021-02-28 09:04
                          回复
                            {
                            "id": 1,
                            "name": "敌群1",
                            "enemy_1": "1|1|1",
                            "enemy_2": "6|2|2",
                            "enemy_3": "4|5|3",
                            "enemy_4": "6|3|3",
                            "enemy_5": "6|2|3",
                            "enemy_6": "1|1|2",
                            "enemy_7": "6|2|3",
                            "enemy_8": "4|5|4",
                            "enemy_9": "6|3|4",
                            "enemy_10": "6|2|4",
                            "enemy_11": "1|1|3",
                            "enemy_12": "6|2|4",
                            "enemy_13": "4|5|5",
                            "enemy_14": "6|3|5",
                            "enemy_15": "6|2|5"
                            },
                            依次为敌人Id、x坐标跟y坐标,用一个自定义接口把"6|2|2"格式的string类型解析为3个数字类型。
                            ————————
                            /** 将以“|”分割的字符串转换为数字数组 */
                            ExtraUtils.getNumArrayFromInfo = function (info) {
                            let result = [];
                            let _info = info.toString();
                            _info.split("|").forEach(num => {
                            result.push(Number(num));
                            });
                            return result;
                            }
                            —————————


                            IP属地:北京14楼2021-02-28 09:07
                            回复
                              需求:
                              -战斗中显示自定义环境元素充盈度窗口。
                              ————————————
                              这个需求相对简单,看过Window_Base与Scene_Battle的源码后,新建一个自定义类型窗口并绘制图表跟文本即可。


                              IP属地:北京15楼2021-02-28 09:11
                              回复