查看: 15687|回复: 31

[搬运汉化] 一些特別插件

[复制链接]
梦石
0
星屑
22879
在线时间
8598 小时
注册时间
2011-12-31
回帖
3270
发表于 2018-4-26 10:37:53 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 tseyik 于 2018-6-7 17:20 编辑

1樓:各插件説明連接
2樓:
一個將多個地圖連接成一個大地圖的插件。
3樓:
迷宮半自動生成
5樓:
三国人物免費素材
6樓:
LTN任務- 編輯器,示範
7樓:
Ultra Mode 7 v1.1.0

评分

参与人数 2赞 +2 收起 理由
zhangliyue35 + 1 生成迷宫那个好评
枫叶的北方 + 1 卧槽感觉RM变得更以后意思了呢.

查看全部评分

梦石
0
星屑
22879
在线时间
8598 小时
注册时间
2011-12-31
回帖
3270
 楼主| 发表于 2018-4-26 10:43:09 | 显示全部楼层
本帖最后由 tseyik 于 2018-4-26 10:44 编辑

一個將多個地圖連接成一個大地圖的插件。
日文説明:
https://github.com/futokoro/RPGM ... gMapGenerator.ja.md
下載:
https://raw.githubusercontent.co ... tingMapGenerator.js
例
code:
◆プラグインコマンド:CMG_連結マップサイズ 2 2
◆プラグインコマンド:CMG_マップ連結 2 3 4 5
◆場所移動:MAP003 (0,12)
n01_002.jpg
n01_001.jpg

説明:
*-----------------------------------------------------------------------------
* マップを連結する方法
*-----------------------------------------------------------------------------
* まず、縦横に何枚のマップを連結させてマップを生成するか設定します。
*
* 設定方法は以下の2通りです。
* ・プラグインパラメータで縦横の枚数の初期値を設定。
* ・以下のプラグインコマンドを実施し、場所移動ごとに設定。
*
* プラグインコマンド
* ※[]は実際の入力に使用しません
*
* CMG_連結マップサイズ [横のマップ数] [縦のマップ数]
* CMG_CONNECTING_MAP_SIZE [cols] [lines]
*
*    横のマップ数(cols)
*        : 横に連結させるマップの数を変更します。
*
*    縦のマップ数(lines)
*        : 縦に連結させるマップの数を変更します。
*
*
*
* 次に、以下のプラグインコマンドを実行し、連結させるマップIDを指定します。
* なお、この時に、同じマップIDを複数回入力することが可能です。
* ※[]は実際の入力に使用しません
*
*
* CMG_マップ連結 [マップ1] [マップ2] [マップ3] [マップ4] ...
* CMG_CONNECTING_MAP [map1] [map2] [map3] [map4] ...
*
*    マップ1(map1)
*        : 連結後にマップの左上に配置されるマップのIDを指定します。
*          連結後のマップ設定は、マップ1の設定を引き継ぎます。
*
*    マップ*(map*)
*        : 連結させるマップの数だけ、マップIDを指定します。
*        : 縦横2*2の場合は マップ4 まで、縦横3*3の場合は マップ9 まで入力します。
*
  * 入力例) 2*2のマップを連結させる場合の入力
*  CMG_マップ連結 2 3 4 5
*  CMG_CONNECTING_MAP 2 3 4 5
*
*
* 連結した時のマップの配置は、
* マップ1を左上に、そこから右にマップ2、マップ3、...と配置します。
* 横のマップ数上限に達した場合、1段下に下がり、マップを連結し
* 画面右下が一番最後のマップになります。
*
* 簡単なマップ配置イメージ
*
* ・1*2の場合
*    1 2
*
* ・2*2の場合   ・3*2の場合
*    1 2        1 2 3
*    3 4        4 5 6
*
* ・3*3の場合
*    1 2 3
*    4 5 6
*    7 8 9
*
*
* 連結マップのサイズと、連結させるマップIDを設定したら
* 場所移動イベントを実行してください。
*
* 場所移動時のマップIDと座標の設定は、連結させるマップのいずれかを選べば
* 連結後のその位置に移動します。
*
* なお、同じマップIDを複数回連結させている場合は、一番最初に配置した場所の
* マップ上に移動します。
*
*
*-----------------------------------------------------------------------------
* 連結マップから場所移動する場合
*-----------------------------------------------------------------------------
* 場所移動する場合は、必ず以下のコマンドを実行してください。
*
* CMG_マップ連結解除
* CMG_CLEAR_CONNECTING_MAP
*
*
*-----------------------------------------------------------------------------
* マップを連結させるための条件
*-----------------------------------------------------------------------------
* 連結させるマップ同士の幅や高さを合わせる必要があります。
*
* 例えば、2*2のマップを連結させる場合、
*
* 1. マップ1 と マップ2 の 高さ は同じにしてください。
* 2. マップ1 と マップ3 の 幅 は同じにしてください。
* 3. マップ2 と マップ4 の 幅 を同じにしてください。
* 4. マップ3 と マップ4 の 高さ を同じにしてください。
*
* また、タイルセットはすべてのマップで同じものを使用しなくてはいけません。
*
*
*-----------------------------------------------------------------------------
* 連結後のマップ設定
*-----------------------------------------------------------------------------
* 連結後のマップ設定(*1)は、"マップ1"に使用したマップの設定を引き継ぎます。
*
* (*1)引き継ぐマップ設定
* ・スクロールタイプ
* ・マップタイル
* ・敵出現歩数
* ・BGM自動演奏
* ・BGS自動演奏
* ・戦闘背景設定
* ・ダッシュ禁止設定
* ・遠景設定
* ・メモの内容
*
* 例えば、以下のコマンドで連結した場合
*    CMG_マップ連結 2 3 4 5
* 連結後のマップ設定は、マップID2と同じです。
*
*
* 以下の設定については連結連結前後で変わるため注意が必要です。
*
* ・エンカウント
* ・イベントID
*
*
*-----------------------------------------------------------------------------
* 連結後のマップのエンカウント
*-----------------------------------------------------------------------------
* 連結後のマップのエンカウントは、それぞれのマップで設定した
* エンカウントの設定を合成したものになります。
*
* 例えば、連結前のマップで
* ・マップ1の全域に敵グループID1
* ・マップ2の全域に敵グループID2
* を設定していた場合は、連結後は
* ・連結マップ全域に敵グループID1と敵グループID2
* がエンカウントするようになります。
*
*
* また、リージョンによるエンカウント設定の場合も、同様で
* 例えば、連結前のマップで
* ・マップ1のリージョン1に敵グループID1
* ・マップ2のリージョン1に敵グループID2
* ・マップ3のリージョン2に敵グループID3
* を設定していた場合は、連結後は
* ・連結マップのリージョン1に敵グループID1と敵グループID2
* ・連結マップのリージョン2に敵グループID3
* がエンカウントするようになります。
*
* これは、連結前のマップ1でリージョン2に設定していたエリアにも
* 連結後は、敵グループID3が出現するようになる、ということです。
*
*
*-----------------------------------------------------------------------------
* 連結後のマップのイベントID
*-----------------------------------------------------------------------------
* 連結後のマップのイベントIDは、以下のスクリプトで取得できます。
*
* $gameMap.cmgEventId(mapId, eventId)
*    mapId   : そのイベントを作成したマップのID(データベース上のマップです)
*    eventId : そのイベントを作成したマップ上のイベントID
*
* 入力例)
*    $gameMap.cmgEventId(2, 3)
*
*
* ただし、そのイベント内であれば、this._eventId で自分のIDを取得できます。
* これは、連結後も変わりません。
*
*
*-----------------------------------------------------------------------------
* 本プラグインのライセンスについて(License)
*-----------------------------------------------------------------------------
* 本プラグインはMITライセンスのもとで公開しています。
* This plugin is released under the MIT License.
*
* Copyright (c) 2018 Futokoro
* http://opensource.org/licenses/mit-license.php
*
*
* プラグイン公開元
* https://github.com/futokoro/RPGMaker/blob/master/README.md


点评

哇,这个好,可以做无缝衔接的大场景了  发表于 2018-4-26 12:42

评分

参与人数 2赞 +2 收起 理由
HUISIHEXING + 1 塞糖
白嫩白嫩的 + 1 塞糖

查看全部评分

回复 1 0

使用道具 举报

梦石
0
星屑
22879
在线时间
8598 小时
注册时间
2011-12-31
回帖
3270
 楼主| 发表于 2018-4-27 20:22:29 | 显示全部楼层
迷宮半自動生成
BEFORE_AFTER.png
説明/下載/範本(需科學上網)
https://github.com/kurageya0307/SemiAutoDungeon










点评

看样子这个插件和默认功能(生成迷宫)类似咯  发表于 2019-12-3 11:24
回复

使用道具 举报

梦石
0
星屑
372
在线时间
39 小时
注册时间
2017-9-28
回帖
16
发表于 2018-5-5 12:54:46 | 显示全部楼层
tseyik 发表于 2018-4-26 10:43
一個將多個地圖連接成一個大地圖的插件。
日文説明:
https://github.com/futokoro/RPGMaker/blob/master/FT ...

这个太棒了,码一下
回复

使用道具 举报

梦石
0
星屑
22879
在线时间
8598 小时
注册时间
2011-12-31
回帖
3270
 楼主| 发表于 2018-5-8 20:02:47 | 显示全部楼层
回复

使用道具 举报

梦石
0
星屑
22879
在线时间
8598 小时
注册时间
2011-12-31
回帖
3270
 楼主| 发表于 2018-5-29 12:57:45 | 显示全部楼层
LTN任務- 記錄,示範
Quest_Editor-win32-ia32
任務編輯器32/64
原網頁己失聯
链接:https://pan.baidu.com/s/19OYaw0DjC3AGqkqwExDd7Q 密码:3527


点评

大神请你在点评这再给我一次,谢谢。  发表于 2018-9-18 12:00
我點你的链接,它顯示頁面不存在。  发表于 2018-9-18 11:44
我点下去還在呀  发表于 2018-9-18 09:24
這個的任務插件可以再給一次嗎,現在這連結已經沒了。  发表于 2018-9-17 11:32
回复

使用道具 举报

梦石
0
星屑
1573
在线时间
374 小时
注册时间
2017-12-26
回帖
291
发表于 2018-5-29 19:50:49 | 显示全部楼层
谢谢分享,
回复

使用道具 举报

梦石
0
星屑
517
在线时间
61 小时
注册时间
2018-1-29
回帖
19
发表于 2018-5-31 15:25:52 | 显示全部楼层
楼主这个任务系统是所有的都要下吗?不会用很难受...

点评

有範例下載  发表于 2018-6-1 09:18
最小要下編輯器和插件  发表于 2018-5-31 17:12
回复

使用道具 举报

梦石
0
星屑
22879
在线时间
8598 小时
注册时间
2011-12-31
回帖
3270
 楼主| 发表于 2018-6-7 17:10:04 | 显示全部楼层
本帖最后由 tseyik 于 2018-6-10 22:46 编辑

Ultra Mode 7 v1.1.0
作者Blizzard​
發佈頁
https://forums.rpgmakerweb.com/i ... ultra-mode-7.94100/




点击展开/收起[pre lang="javascript"]/*:
@plugindesc Renders the tilemap in 3D. Supports various parameters such as yaw rotation,
pitch, field of view, etc.
@author Blizzard

@help Version: 1.1.0

--Introduction--

Ultra Mode 7 simulates the Mode 7 rendering mode from the SNES by using 3D
rendering. Sprites are scaled appropriately and use additional code to
determine whether they are visible, because of cut-off distance. The view
of a Mode 7 map is defined by the following parameters:

- camera distance
- field of view
- pitch rotation angle
- yaw rotation angle
- maximum Z coordinate

--Changelog--

v1.1.0:
- added animation function for parameters
- renamed RENDER_PIXELATED option to TILEMAP_PIXELATED
- added CHARACTERS_PIXELATED option
- fixed issue with floating characters
- fixed issue with normal maps not working anymore
- added some code to prevent compatibility issues with some map scripts

--How to use--

Separate maps can control and even dynamically change most paramaters. In
order to turn a normal map into a Mode 7 map, custom parameters need to be
defined in the "Note" section of the map. To use the default values for a
map, simply add the following entry to the map "note":

<UltraMode7>

If any other parameter is defined, this is not necessary. The following
parameters can be defined:

- UltraMode7_FOV
- UltraMode7_Pitch
- UltraMode7_Yaw
- UltraMode7_CameraDistance

Example:

<UltraMode7_FOV:50>

When multiple parameters are defined, simply add them one after another.
Example:

<UltraMode7_Pitch:50>
<UltraMode7_CameraDistance:400>
<UltraMode7_Yaw:45>

--How to change parameters dynamically--

The 4 parameters that can be defined in the note section of a map can also
be changed at any time during the map. Following script calls are available:

UltraMode7.setFov(DEGREES)
UltraMode7.setPitch(DEGREES)
UltraMode7.setYaw(DEGREES)
UltraMode7.setCamera(Z_DISTANCE)

You can also obtain the current values with these script calls:

UltraMode7.getFov()
UltraMode7.getPitch()
UltraMode7.getYaw()
UltraMode7.getCamera()

You can also change the values in an animated manner:

UltraMode7.animateFov(TARGET_VALUE, FRAMES_DURATION)
UltraMode7.animatePitch(TARGET_VALUE, FRAMES_DURATION)
UltraMode7.animateYaw(TARGET_VALUE, FRAMES_DURATION)
UltraMode7.animateCamera(TARGET_VALUE, FRAMES_DURATION)

--Additional Notes--

- When using parallax backgrounds, due to how rendering is done, it's useful
  to have a custom parallax that fades into white and creates a seamless
  transition into the faded tiles.
- Smaller values of FAR_CLIP_Z will cause characters and the tilemap
  to be cut off earlier. Effectively it moves the cut-off horizon closer.
- If you don't want white fade-out, set both FADE_Z values to a larger value
  than FAR_CLIP_Z.
- When the yaw value is changed, characters are turned around accordingly.
- Consider using the same values for BASE_SCALE_Z and DEFAULT_CAMERA_DISTANCE.

--Technical details, limitations and compatibility--

- Requires WebGL. Does not work with canvas and due to how canvas works, it
  can never support canvas.
- Due to sprite scaling, how character sprite sheets are organized and how
  pixel interpolation is done when scaling is applied, there can be artifacts
  during rendering of characters. Manipulating the FAR_CLIP_Z value can
  help remove these artifacts to some degree.
- The tilemap is rendered in its entirety and the projection matrix is used
  to limit visibility. The hardware should take care of optimizing rendering.
- Character sprite visibility is done by moving the character sprite to the
  coordinates (-10000,-10000) in order to avoid messing with sprite
  visibility and hence compatibility.
- Due to a hard limit of 65536 vertices being rendered at once in WebGL, the
  code has been adjusted to render the tilemap in as many passes as necessary.
  Since some people reported issues even with 65536 vertices, a soft limit of
  65532 is being used.
- Because the tilemap is rendered entirely flat, tile priority isn't used.
- Scaling has been optimized for usage of an FOV of 60°. Using different
  values will cause some weird scales being used for characters.
- Due to yaw rotation requiring turning of characters, 8-directional
  characters sprites might have only limited support.
- Possibly not compatible with scripts that manipulate tilemap data too much
  or too deeply.
- Looping maps are currently not supported.

@param FAR_CLIP_Z
@desc Defines The maximum Z-coordinate for visibility of tiles and characters.
@default 1200

@param FADE_Z_BEGIN
@desc Defines The Z-coordinate at which white fading will start on the tilemap.
@default 500

@param FADE_Z_END
@desc Defines The Z-coordinate at which white fading will be at full on the tilemap.
@default 1150

@param BASE_SCALE_Z
@desc Defines The Z-coordinate at which character scaling is 1.0.
@default 450

@param PARALLAX_SCROLL_X_MULTIPLIER
@desc Defines The multiplier for parallax X-scrolling.
@default 0.5

@param PARALLAX_SCROLL_Y_MULTIPLIER
@desc Defines The multiplier for parallax Y-scrolling.
@default 1.0

@param TILEMAP_PIXELATED
@desc Whether the tilemap should be rendered pixelated.
ON = true, OFF = false
@default true

@param CHARACTERS_PIXELATED
@desc Whether the characters should be rendered pixelated.
ON = true, OFF = false
@default true

@param DEFAULT_FOV
@desc Defines The default value for the field-of-view parameter (in degrees).
@default 60

@param DEFAULT_PITCH
@desc Defines The default value for the pitch rotation angle parameter (in degrees).
@default 45

@param DEFAULT_YAW
@desc Defines The default value for the yaw rotation angle parameter (in degrees).
@default 0

@param DEFAULT_CAMERA_DISTANCE
@desc Defines The default distance of the camera from the tilemap in screen space.
@default 450

*/

//=============================================================================
// Ultra Mode 7
//=============================================================================

(function() {

if (!Graphics.hasWebGL())
{
        console.error("Ultra Mode 7 requires WebGL support!");
        return;
}

//=============================================================================
// BlizzardUtility
//=============================================================================

if (typeof(BlizzardUtility) === "undefined")
{
        BlizzardUtility = function()
        {
                throw new Error("This is a static class");
        };
       
        BlizzardUtility.degreesToRadians = function(degrees)
        {
                return (degrees * 0.01745329251994329576923690768489);
        };

        BlizzardUtility.radiansToDegrees = function(radians)
        {
                return (radians * 57.295779513082320876798154814105);
        };
       
        BlizzardUtility.Numeric = function(value, defaultValue)
        {
                var result = Number(value);
                if (result || result === 0)
                {
                        return result;
                }
                return defaultValue;
        }

}

//=============================================================================
// UltraMode7
//=============================================================================

UltraMode7 = {};

// constants
// NOTE: Don't change these unless you know what you are doing!

UltraMode7.WEBGL_MAX_VERTICES = 65532; // stay under the WebGL limit of 65536, some have reported bugs
UltraMode7.NEAR_CLIP_Z = 10;
UltraMode7.MIN_FOV = 10;
UltraMode7.MIN_PITCH = 0;
UltraMode7.MAX_PITCH = 90;

// configuration parameters

var _parameters = PluginManager.parameters("UltraMode7");
UltraMode7.FAR_CLIP_Z = Math.max(BlizzardUtility.Numeric(_parameters["FAR_CLIP_Z"], 1200), UltraMode7.NEAR_CLIP_Z + 1);
UltraMode7.FADE_Z_BEGIN = BlizzardUtility.Numeric(_parameters["FADE_Z_BEGIN"], 500);
UltraMode7.FADE_Z_END = BlizzardUtility.Numeric(_parameters["FADE_Z_END"], 1150);
UltraMode7.BASE_SCALE_Z = BlizzardUtility.Numeric(_parameters["BASE_SCALE_Z"], 450);
UltraMode7.PARALLAX_SCROLL_X_MULTIPLIER = BlizzardUtility.Numeric(_parameters["PARALLAX_SCROLL_X_MULTIPLIER"], 0.5);
UltraMode7.PARALLAX_SCROLL_Y_MULTIPLIER = BlizzardUtility.Numeric(_parameters["PARALLAX_SCROLL_Y_MULTIPLIER"], 1.0);
UltraMode7.TILEMAP_PIXELATED = JSON.parse(_parameters["TILEMAP_PIXELATED"]);
UltraMode7.CHARACTERS_PIXELATED = JSON.parse(_parameters["CHARACTERS_PIXELATED"]);
UltraMode7.DEFAULT_FOV = BlizzardUtility.Numeric(_parameters["DEFAULT_FOV"], 60);
UltraMode7.DEFAULT_PITCH = BlizzardUtility.Numeric(_parameters["DEFAULT_PITCH"], 45);
UltraMode7.DEFAULT_YAW = BlizzardUtility.Numeric(_parameters["DEFAULT_YAW"], 0);
UltraMode7.DEFAULT_CAMERA_DISTANCE = BlizzardUtility.Numeric(_parameters["DEFAULT_CAMERA_DISTANCE"], 450);

// interface functions for script calls

UltraMode7.getFov = function()
{
        return $gameMap.ultraMode7Fov;
};

UltraMode7.setFov = function(value)
{
        $gameMap.setUltraMode7Fov(value);
};

UltraMode7.getPitch = function()
{
        return $gameMap.ultraMode7Pitch;
};

UltraMode7.setPitch = function(value)
{
        $gameMap.setUltraMode7Pitch(value);
};

UltraMode7.getYaw = function()
{
        return $gameMap.ultraMode7Yaw;
};

UltraMode7.setYaw = function(value)
{
        $gameMap.setUltraMode7Yaw(value);
};

UltraMode7.getCamera = function()
{
        return $gameMap.ultraMode7CameraDistance;
};

UltraMode7.setCamera = function(value)
{
        $gameMap.setUltraMode7CameraDistance(value);
};

UltraMode7.animateFov = function(target, frameDuration)
{
        $gameMap.animateUltraMode7Fov(target, frameDuration);
};

UltraMode7.animatePitch = function(target, frameDuration)
{
        $gameMap.animateUltraMode7Pitch(target, frameDuration);
};

UltraMode7.animateYaw = function(target, frameDuration)
{
        $gameMap.animateUltraMode7Yaw(target, frameDuration);
};

UltraMode7.animateCamera = function(target, frameDuration)
{
        $gameMap.animateUltraMode7CameraDistance(target, frameDuration);
};

// functions

UltraMode7.screenToMap = function(x, y)
{
        // transform 2 point ray from projection into world
        var projectionMatrix = $gameMap.ultraMode7ProjectionMatrix;
        var halfWidth = Graphics.boxWidth / 2;
        var halfHeight = Graphics.boxHeight / 2;
        var origin = new UltraMode7.Vector3(x - halfWidth, y - halfHeight, -1);
        var target = new UltraMode7.Vector3(x - halfWidth, y - halfHeight, 1);
        if ($gameMap.ultraMode7Fov > 0)
        {
                var scaleZ = projectionMatrix.data[10];
                var offsetZ = projectionMatrix.data[14];
                origin.x = origin.x * (offsetZ - origin.z) / scaleZ / halfWidth;
                origin.y = origin.y * (offsetZ - origin.z) / scaleZ / halfHeight;
                target.x = target.x * (offsetZ - target.z) / scaleZ / halfWidth;
                target.y = target.y * (offsetZ - target.z) / scaleZ / halfHeight;
        }
        else
        {
                target = origin.plused(target);
        }
        projectionMatrix = projectionMatrix.inversed();
        origin = projectionMatrix.multiplied(origin);
        target = projectionMatrix.multiplied(target);
        var mapWidth = $gameMap.width() * $gameMap.tileWidth();
        var mapHeight = $gameMap.height() * $gameMap.tileHeight();
        // first transform 4 points from model into world space
        var modelviewMatrix = $gameMap.ultraMode7ModelviewMatrix;
        var topLeft = modelviewMatrix.multiplied(new UltraMode7.Vector3(0, 0, 0));
        var topRight = modelviewMatrix.multiplied(new UltraMode7.Vector3(mapWidth, 0, 0));
        var bottomLeft = modelviewMatrix.multiplied(new UltraMode7.Vector3(0, mapHeight, 0));
        var bottomRight = modelviewMatrix.multiplied(new UltraMode7.Vector3(mapWidth, mapHeight, 0));
        // solve equation Ax + By + Cz + D = 0
        var equations = [
                [topLeft.x, topLeft.y, topLeft.z, 0],
                [topRight.x, topRight.y, topRight.z, 0],
                [bottomLeft.x, bottomLeft.y, bottomLeft.z, 0],
                [bottomRight.x, bottomRight.y, bottomRight.z, 0]
        ];
        var factors = UltraMode7._solveLinearEquationWithGuassianElimination(equations);
        // create plane equation
        var ray = target.minused(origin);
        var normal = new UltraMode7.Vector3(factors[0], factors[1], factors[2]);
        ray.multiply((factors[3] - normal.dotted(origin)) / normal.dotted(ray));
        var intersection = origin.plused(ray);
        return modelviewMatrix.inversed().multiplied(intersection);
};

UltraMode7._solveLinearEquationWithGuassianElimination = function(M)
{
        var i;
        var j;
        var k;
        var n = M.length;
        for (i = 0; i < n; ++i)
        {
                M.push(1);
        }
        for (i = 0; i < n; ++i)
        {
                // Search for maximum in this column
                var maxEl = Math.abs(M);
                var maxRow = i;
                for (k = i + 1; k < n; ++k)
                {
                        if (Math.abs(M[k]) > maxEl)
                        {
                                maxEl = Math.abs(M[k]);
                                maxRow = k;
                        }
                }
                // Swap maximum row with current row (column by column)
                for (k = i; k < n + 1; ++k)
                {
                        var tmp = M[maxRow][k];
                        M[maxRow][k] = M[k];
                        M[k] = tmp;
                }
                if (M !== 0)
                {
                        // Make all rows below this one 0 in current column
                        for (k = i + 1; k < n; ++k)
                        {
                                var c = -M[k] / M;
                                for (j = i; j < n + 1; ++j)
                                {
                                        if (i === j)
                                        {
                                                M[k][j] = 0;
                                        }
                                        else
                                        {
                                                M[k][j] += c * M[j];
                                        }
                                }
                        }
                }
        }
        // Solve equation Mx=b for the upper triangular matrix M
        result = [];
        for (i = n - 1; i >= 0; --i)
        {
                if (M === 0)
                {
                        result = 1;
                }
                else
                {
                        result = M[n] / M;
                }
                for (k = i - 1; k >= 0; --k)
                {
                        M[k][n] -= M[k] * result;
                }
        }
        return result;
};

UltraMode7.mapToScreen = function(x, y)
{
        var position = new UltraMode7.Vector3(x + $gameMap.displayX() * $gameMap.tileWidth(), y + $gameMap.displayY() * $gameMap.tileHeight(), 0);
        var worldPosition = $gameMap.ultraMode7ModelviewMatrix.multiplied(position);
        var projection = $gameMap.ultraMode7ProjectionMatrix;
        var result = projection.multiplied(worldPosition);
        // W is needed for perspective projection
        var vectorW = projection.data[3] * worldPosition.x + projection.data[7] * worldPosition.y + projection.data[11] * worldPosition.z + projection.data[15];
        // calculate perspective projection and offset to screen coordinates
        result.x = result.x * Graphics.boxWidth / 2 / vectorW + Graphics.boxWidth / 2;
        result.y = result.y * Graphics.boxHeight / 2 / vectorW + Graphics.boxHeight / 2;
        return result;
};

UltraMode7.mapToScreenScale = function(x, y)
{
        return UltraMode7.mapZToScreenScale(UltraMode7.mapToScreen(x, y).z);
};

UltraMode7.mapZToScreenScale = function(z)
{
        return (UltraMode7.BASE_SCALE_Z / Math.abs(z));
};

//=============================================================================
// Vector3
//=============================================================================

UltraMode7.Vector3 = function(x, y, z)
{
        this.x = (x || 0);
        this.y = (y || 0);
        this.z = (z || 0);
};

UltraMode7.Vector3.prototype.set = function(x, y, z)
{
        this.x = x;
        this.y = y;
        this.z = z;
};

UltraMode7.Vector3.prototype.length = function()
{
        return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
};

UltraMode7.Vector3.prototype.normalize = function()
{
        var length = this.length();
        if (length !== 0)
        {
                length = 1 / length;
                this.x *= length;
                this.y *= length;
                this.z *= length;
        }
};

UltraMode7.Vector3.prototype.negative = function()
{
        this.x = -this.x;
        this.y = -this.y;
        this.z = -this.z;
};

UltraMode7.Vector3.prototype.multiply = function(factor)
{
        this.x *= factor;
        this.y *= factor;
        this.z *= factor;
};

UltraMode7.Vector3.prototype.plused = function(other)
{
        return new UltraMode7.Vector3(this.x + other.x, this.y + other.y, this.z + other.z);
};

UltraMode7.Vector3.prototype.minused = function(other)
{
        return new UltraMode7.Vector3(this.x - other.x, this.y - other.y, this.z - other.z);
};

UltraMode7.Vector3.prototype.averaged = function(other)
{
        return new UltraMode7.Vector3((this.x + other.x) / 2, (this.y + other.y) / 2, (this.z + other.z) / 2);
};

UltraMode7.Vector3.prototype.dotted = function(other)
{
        return (this.x * other.x + this.y * other.y + this.z * other.z);
}

UltraMode7.Vector3.prototype.crossed = function(other)
{
        return new UltraMode7.Vector3(this.y * other.z - this.z * other.y, this.z * other.x - this.x * other.z, this.x * other.y - this.y * other.x);
};

//=============================================================================
// Matrix4
//=============================================================================

UltraMode7.Matrix4 = function(data)
{
        if (data)
        {
                this.data = data.slice();
        }
        else
        {
                this.data = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
        }
};

UltraMode7.Matrix4.prototype.setIdentity = function()
{
        this.setZero();
        this.data[0] = this.data[5] = this.data[10] = this.data[15] = 1;
};

UltraMode7.Matrix4.prototype.setZero = function()
{
        for (var i = 0; i < 16; ++i)
        {
                this.data = 0;
        }
};

UltraMode7.Matrix4.prototype.set = function(data)
{
        this.data = data.slice();
};

UltraMode7.Matrix4.prototype.setTranslation = function(vector)
{
        this.setIdentity();
        this.data[12] = vector.x;
        this.data[13] = vector.y;
        this.data[14] = vector.z;
};

UltraMode7.Matrix4.prototype.translate = function(x, y, z)
{
        var matrix = new UltraMode7.Matrix4();
        matrix.setTranslation(new UltraMode7.Vector3(x, y, z));
        this.multiply(matrix);
};

UltraMode7.Matrix4.prototype.rotateX = function(angle)
{
        var matrix = new UltraMode7.Matrix4();
        matrix.setRotationX(angle);
        this.multiply(matrix);
};

UltraMode7.Matrix4.prototype.rotateY = function(angle)
{
        var matrix = new UltraMode7.Matrix4();
        matrix.setRotationY(angle);
        this.multiply(matrix);
};

UltraMode7.Matrix4.prototype.rotateZ = function(angle)
{
        var matrix = new UltraMode7.Matrix4();
        matrix.setRotationZ(angle);
        this.multiply(matrix);
};

UltraMode7.Matrix4.prototype.setRotationX = function(angle)
{
        this.setZero();
        var rad = BlizzardUtility.degreesToRadians(angle);
        this.data[0] = this.data[15] = 1;
        this.data[5] = this.data[10] = Math.cos(rad);
        this.data[6] = Math.sin(rad);
        this.data[9] = -this.data[6];
};

UltraMode7.Matrix4.prototype.setRotationY = function(angle)
{
        this.setZero();
        var rad = BlizzardUtility.degreesToRadians(angle);
        this.data[5] = this.data[15] = 1;
        this.data[0] = this.data[10] = Math.cos(rad);
        this.data[8] = Math.sin(rad);
        this.data[2] = -this.data[8];
};

UltraMode7.Matrix4.prototype.setRotationZ = function(angle)
{
        this.setZero();
        var rad = BlizzardUtility.degreesToRadians(angle);
        this.data[10] = this.data[15] = 1;
        this.data[0] = this.data[5] = Math.cos(rad);
        this.data[1] = Math.sin(rad);
        this.data[4] = -this.data[1];
};

UltraMode7.Matrix4.prototype.multiply = function(other)
{
        this.set([this.data[0] * other.data[0] + this.data[4] * other.data[1] + this.data[8] * other.data[2] + this.data[12] * other.data[3],
                this.data[1] * other.data[0] + this.data[5] * other.data[1] + this.data[9] * other.data[2] + this.data[13] * other.data[3],
                this.data[2] * other.data[0] + this.data[6] * other.data[1] + this.data[10] * other.data[2] + this.data[14] * other.data[3],
                this.data[3] * other.data[0] + this.data[7] * other.data[1] + this.data[11] * other.data[2] + this.data[15] * other.data[3],
                this.data[0] * other.data[4] + this.data[4] * other.data[5] + this.data[8] * other.data[6] + this.data[12] * other.data[7],
                this.data[1] * other.data[4] + this.data[5] * other.data[5] + this.data[9] * other.data[6] + this.data[13] * other.data[7],
                this.data[2] * other.data[4] + this.data[6] * other.data[5] + this.data[10] * other.data[6] + this.data[14] * other.data[7],
                this.data[3] * other.data[4] + this.data[7] * other.data[5] + this.data[11] * other.data[6] + this.data[15] * other.data[7],
                this.data[0] * other.data[8] + this.data[4] * other.data[9] + this.data[8] * other.data[10] + this.data[12] * other.data[11],
                this.data[1] * other.data[8] + this.data[5] * other.data[9] + this.data[9] * other.data[10] + this.data[13] * other.data[11],
                this.data[2] * other.data[8] + this.data[6] * other.data[9] + this.data[10] * other.data[10] + this.data[14] * other.data[11],
                this.data[3] * other.data[8] + this.data[7] * other.data[9] + this.data[11] * other.data[10] + this.data[15] * other.data[11],
                this.data[0] * other.data[12] + this.data[4] * other.data[13] + this.data[8] * other.data[14] + this.data[12] * other.data[15],
                this.data[1] * other.data[12] + this.data[5] * other.data[13] + this.data[9] * other.data[14] + this.data[13] * other.data[15],
                this.data[2] * other.data[12] + this.data[6] * other.data[13] + this.data[10] * other.data[14] + this.data[14] * other.data[15],
                this.data[3] * other.data[12] + this.data[7] * other.data[13] + this.data[11] * other.data[14] + this.data[15] * other.data[15]]);
};

UltraMode7.Matrix4.prototype.multiplied = function(vector)
{
        return new UltraMode7.Vector3(this.data[0] * vector.x + this.data[4] * vector.y + this.data[8] * vector.z + this.data[12],
                this.data[1] * vector.x + this.data[5] * vector.y + this.data[9] * vector.z + this.data[13],
                this.data[2] * vector.x + this.data[6] * vector.y + this.data[10] * vector.z + this.data[14]);
};

UltraMode7.Matrix4.prototype.lookAt = function(eye, target, up)
{
        this.setZero();
        var bz = eye.minused(target);
        bz.normalize();
        var bx = up.crossed(bz);
        bx.normalize();
        var by = bz.crossed(bx);
        by.normalize();
        this.data[0] = bx.x;        this.data[1] = by.x;        this.data[2] = bz.x;
        this.data[4] = bx.y;        this.data[5] = by.y;        this.data[6] = bz.y;
        this.data[8] = bx.z;        this.data[9] = by.z;        this.data[10] = bz.z;        this.data[15] = 1;
        eye.negative();
        var b = new UltraMode7.Matrix4();
        b.setTranslation(eye);
        this.multiply(b);
};

UltraMode7.Matrix4.prototype.setPerspective = function(fov, width, height, nearZ, farZ)
{
        this.setZero();
        var iy = 1 / Math.tan(BlizzardUtility.degreesToRadians(fov * 0.5));
        var zDiff = farZ - nearZ;
        this.data[0] = iy * height / width;
        this.data[5] = iy;
        this.data[10] = -(farZ + nearZ) / zDiff;
        this.data[11] = -1;
        this.data[14] = -2 * farZ * nearZ / zDiff;
};

UltraMode7.Matrix4.prototype.setOrthoProjection = function(x, y, w, h)
{
        this.setZero();
        this.data[0] = 2 / w;
        this.data[5] = 2 / h;
        this.data[12] = x * 2 / w;
        this.data[13] = -y * 2 / h;
        this.data[15] = 1;
};

UltraMode7.Matrix4.prototype.inversed = function()
{
        var invDet = 1 / this.determinant();
        m = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1];
        m[0] = (this.data[5] * this.data[10] - this.data[9] * this.data[6]) * invDet;
        m[1] = -(this.data[1] * this.data[10] - this.data[9] * this.data[2]) * invDet;
        m[2] = (this.data[1] * this.data[6] - this.data[5] * this.data[2]) * invDet;
        m[4] = -(this.data[4] * this.data[10] - this.data[8] * this.data[6]) * invDet;
        m[5] = (this.data[0] * this.data[10] - this.data[8] * this.data[2]) * invDet;
        m[6] = -(this.data[0] * this.data[6] - this.data[4] * this.data[2]) * invDet;
        m[8] = (this.data[4] * this.data[9] - this.data[8] * this.data[5]) * invDet;
        m[9] = -(this.data[0] * this.data[9] - this.data[8] * this.data[1]) * invDet;
        m[10] = (this.data[0] * this.data[5] - this.data[4] * this.data[1]) * invDet;
        m[12] = -(this.data[12] * m[0] + this.data[13] * m[4] + this.data[14] * m[8]);
        m[13] = -(this.data[12] * m[1] + this.data[13] * m[5] + this.data[14] * m[9]);
        m[14] = -(this.data[12] * m[2] + this.data[13] * m[6] + this.data[14] * m[10]);
        return new UltraMode7.Matrix4(m);
};

UltraMode7.Matrix4.prototype.determinant = function()
{
        return (this.data[0] * this.data[5] * this.data[10] +
                this.data[4] * this.data[9] * this.data[2] +
                this.data[8] * this.data[1] * this.data[6] -
                this.data[8] * this.data[5] * this.data[2] -
                this.data[4] * this.data[1] * this.data[10] -
                this.data[0] * this.data[9] * this.data[6]);
};

UltraMode7.Matrix4.prototype.transpose = function()
{
        this.set([this.data[0], this.data[4], this.data[8], this.data[12],
                this.data[1], this.data[5], this.data[9], this.data[13],
                this.data[2], this.data[6], this.data[10], this.data[14],
                this.data[3], this.data[7], this.data[11], this.data[15]]);
};

//=============================================================================
// Shader
//=============================================================================

UltraMode7.Shader = (function(_super)
{
        RECT_SHADER_VERTEX = "\n\
                attribute vec2 aVertexPosition;\n\
                attribute vec2 aTextureCoord;\n\
                attribute vec4 aFrame;\n\
                attribute vec2 aAnim;\n\
                attribute float aTextureId;\n\
                \n\
                uniform mat4 mode7ProjectionMatrix;\n\
                uniform mat4 mode7ModelviewMatrix;\n\
                uniform vec2 animationFrame;\n\
                \n\
                varying vec2 vTextureCoord;\n\
                varying vec4 vFrame;\n\
                varying float vTextureId;\n\
                varying float vFade;\n\
                \n\
                void main(void){\n\
                        vec4 position = mode7ModelviewMatrix * vec4(aVertexPosition, 0.0, 1.0);\n\
                        position = mode7ProjectionMatrix * vec4(position.x, position.y, position.z, position.w);\
                        gl_Position = position;\
                        vec2 anim = aAnim * animationFrame;\n\
                        vTextureCoord = aTextureCoord + anim;\n\
                        vFrame = aFrame + vec4(anim, anim);\n\
                        vTextureId = aTextureId;\n\
                        vFade = clamp((position.z - " + UltraMode7.FADE_Z_BEGIN.toFixed(2) + ") / " + (UltraMode7.FADE_Z_END - UltraMode7.FADE_Z_BEGIN).toFixed(2) + ", 0.0, 1.0);\n\
                }\n";
        RECT_SHADER_FRAGMENT = "\
                varying vec2 vTextureCoord;\n\
                varying vec4 vFrame;\n\
                varying float vTextureId;\n\
                varying float vFade;\n\
                uniform vec4 shadowColor;\n\
                uniform sampler2D uSamplers[%count%];\n\
                uniform vec2 uSamplerSize[%count%];\n\
                \n\
                void main(void){\n\
                        vec2 textureCoord = clamp(vTextureCoord, vFrame.xy, vFrame.zw);\n\
                        float textureId = floor(vTextureId + 0.5);\n\
                        \n\
                        vec4 color;\n\
                        %forloop%\n\
                        if (color.a < 0.01)\n\
                        {\n\
                                discard;\n\
                        }\n\
                        vec3 white = vec3(color.a, color.a, color.a);\n\
                        gl_FragColor = vec4(mix(color.rgb, white, vFade), color.a);\n\
                }";
        __extends(Shader, _super);
        FLOAT_SIZE = 4;
        function Shader(gl, maxTextures)
        {
                var _this = _super.call(this, gl, maxTextures, RECT_SHADER_VERTEX, PIXI.tilemap.shaderGenerator.generateFragmentSrc(maxTextures, RECT_SHADER_FRAGMENT)) || this;
                _this.vertSize = 11;
                _this.vertPerQuad = 4;
                _this.stride = _this.vertSize * FLOAT_SIZE;
                PIXI.tilemap.shaderGenerator.fillSamplers(_this, _this.maxTextures);
                return _this;
        }
        Shader.prototype.createVao = function(renderer, vb)
        {
                var gl = renderer.gl;
                this.uniforms.mode7ProjectionMatrix = $gameMap.ultraMode7ProjectionMatrix.data;
                this.uniforms.mode7ModelviewMatrix = $gameMap.ultraMode7ModelviewMatrix.data;
                return renderer.createVao()
                        .addIndex(this.indexBuffer)
                        .addAttribute(vb, this.attributes.aVertexPosition, gl.FLOAT, false, this.stride, 0)
                        .addAttribute(vb, this.attributes.aTextureCoord, gl.FLOAT, false, this.stride, 2 * FLOAT_SIZE)
                        .addAttribute(vb, this.attributes.aFrame, gl.FLOAT, false, this.stride, 4 * FLOAT_SIZE)
                        .addAttribute(vb, this.attributes.aAnim, gl.FLOAT, false, this.stride, 8 * FLOAT_SIZE)
                        .addAttribute(vb, this.attributes.aTextureId, gl.FLOAT, false, this.stride, 10 * FLOAT_SIZE)
        };
        return Shader;
}(PIXI.tilemap.TilemapShader));

//=============================================================================
// PIXI.tilemap.TileRenderer
//=============================================================================

if (UltraMode7.TILEMAP_PIXELATED)
{
        PIXI.tilemap.TileRenderer.SCALE_MODE = PIXI.SCALE_MODES.NEAREST;
}
else
{
        PIXI.tilemap.TileRenderer.SCALE_MODE = PIXI.SCALE_MODES.LINEAR;
}

var UltraMode7_PIXI_tilemap_TileRenderer_prototype_onContextChange = PIXI.tilemap.TileRenderer.prototype.onContextChange;
PIXI.tilemap.TileRenderer.prototype.onContextChange = function()
{
        UltraMode7_PIXI_tilemap_TileRenderer_prototype_onContextChange.call(this);
        this._ultraMode7Shader = new UltraMode7.Shader(this.renderer.gl, this.maxTextures);
        this._ultraMode7Shader.indexBuffer = this.indexBuffer;
};

var UltraMode7_PIXI_tilemap_TileRenderer_prototype_destroy = PIXI.tilemap.TileRenderer.prototype.destroy;
PIXI.tilemap.TileRenderer.prototype.destroy = function()
{
        UltraMode7_PIXI_tilemap_TileRenderer_prototype_destroy.call(this);
        this._ultraMode7Shader.destroy();
        this._ultraMode7Shader = null;
};

var UltraMode7_PIXI_tilemap_TileRenderer_prototype_getShader = PIXI.tilemap.TileRenderer.prototype.getShader;
PIXI.tilemap.TileRenderer.prototype.getShader = function (useSquare)
{
        if (!$gameMap.useUltraMode7)
        {
                return UltraMode7_PIXI_tilemap_TileRenderer_prototype_getShader.call(this, useSquare);
        }
        return this._ultraMode7Shader;
};

//=============================================================================
// PIXI.tilemap.RectTileLayer
//=============================================================================

var UltraMode7_PIXI_tilemap_RectTileLayer_prototype_renderWebGL = PIXI.tilemap.RectTileLayer.prototype.renderWebGL;
PIXI.tilemap.RectTileLayer.prototype.renderWebGL = function(renderer, useSquare)
{
        if (!$gameMap || !$gameMap.useUltraMode7)
        {
                UltraMode7_PIXI_tilemap_RectTileLayer_prototype_renderWebGL.call(this, renderer, useSquare);
                return;
        }
        var points = this.pointsBuf;
        if (points.length === 0)
        {
                return;
        }
        var tile = renderer.plugins.tilemap;
        var shader = tile.getShader(useSquare);
        var textures = this.textures;
        if (textures.length === 0)
        {
                return;
        }
        var rectsCount = points.length / 9;
        if (rectsCount === 0)
        {
                return;
        }
        var gl = renderer.gl;
        var length = textures.length;
        if (this._tempTexSize < shader.maxTextures)
        {
                this._tempTexSize = shader.maxTextures;
                this._tempSize = new Float32Array(2 * shader.maxTextures);
        }
        var i = 0;
        for (i = 0; i < length; ++i)
        {
                if (!textures || !textures.valid)
                {
                        return;
                }
                var texture = textures.baseTexture;
        }
        if (!this.vbIds)
        {
                this.vbIds = [];
                this.vbBuffers = [];
                this.modificationMarkers = [];
                this.vbArrays = [];
        }
        tile.checkIndexBuffer(rectsCount);
        tile.bindTextures(renderer, shader, textures);
        shader.uniforms.mode7ProjectionMatrix = $gameMap.ultraMode7ProjectionMatrix.data;
        shader.uniforms.mode7ModelviewMatrix = $gameMap.ultraMode7ModelviewMatrix.data;
        var maxRects = UltraMode7.WEBGL_MAX_VERTICES / shader.vertPerQuad;
        var maxLoops = Math.floor((rectsCount + maxRects - 1) / maxRects);
        for (var j = 0; j < maxLoops; ++j)
        {
                if (!this.vbIds[j])
                {
                        this.vbIds[j] = 0;
                        this.vbBuffers[j] = null;
                        this.modificationMarkers[j] = 0;
                        this.vbArrays[j] = null;
                }
                var currentRectsCount = Math.min(maxRects, rectsCount - j * maxRects);
                var vb = tile.getVb(this.vbIds[j]);
                if (!vb)
                {
                        vb = tile.createVb(useSquare);
                        this.vbIds[j] = vb.id;
                        this.vbBuffers[j] = null;
                        this.modificationMarkers[j] = 0;
                        this.vbArrays[j] = null;
                }
                var vao = vb.vao;
                renderer.bindVao(vao);
                var vertexBuf = vb.vb;
                vertexBuf.bind();
                var currentVertices = currentRectsCount * shader.vertPerQuad;
                if (this.modificationMarkers[j] !== currentVertices)
                {
                        this.modificationMarkers[j] = currentVertices;
                        var vs = shader.stride * currentVertices;
                        if (!this.vbBuffers[j] || this.vbBuffers[j].byteLength < vs)
                        {
                                var bk = shader.stride;
                                while (bk < vs)
                                {
                                        bk *= 2;
                                }
                                this.vbBuffers[j] = new ArrayBuffer(bk);
                                this.vbArrays[j] = new Float32Array(this.vbBuffers[j]);
                                vertexBuf.upload(this.vbBuffers[j], 0, true);
                        }
                        var arr = this.vbArrays[j];
                        var sz = 0;
                        var eps = 0.5;
                        for (i = j * maxRects * 9; i < points.length && i < (j + 1) * maxRects * 9; i += 9)
                        {
                                var x = points[i + 2];
                                var y = points[i + 3];
                                var w = points[i + 4];
                                var h = points[i + 5];
                                var u = points + 1024 * (points[i + 8] & 1);
                                var v = points[i + 1] + 1024 * ((points[i + 8] >> 1) & 1);
                                var animX = points[i + 6];
                                var animY = points[i + 7];
                                var textureId = (points[i + 8] >> 2);
                                arr[sz++] = x;
                                arr[sz++] = y;
                                arr[sz++] = u;
                                arr[sz++] = v;
                                arr[sz++] = u + eps;
                                arr[sz++] = v + eps;
                                arr[sz++] = u + w - eps;
                                arr[sz++] = v + h - eps;
                                arr[sz++] = animX;
                                arr[sz++] = animY;
                                arr[sz++] = textureId;
                                arr[sz++] = x + w;
                                arr[sz++] = y;
                                arr[sz++] = u + w;
                                arr[sz++] = v;
                                arr[sz++] = u + eps;
                                arr[sz++] = v + eps;
                                arr[sz++] = u + w - eps;
                                arr[sz++] = v + h - eps;
                                arr[sz++] = animX;
                                arr[sz++] = animY;
                                arr[sz++] = textureId;
                                arr[sz++] = x + w;
                                arr[sz++] = y + h;
                                arr[sz++] = u + w;
                                arr[sz++] = v + h;
                                arr[sz++] = u + eps;
                                arr[sz++] = v + eps;
                                arr[sz++] = u + w - eps;
                                arr[sz++] = v + h - eps;
                                arr[sz++] = animX;
                                arr[sz++] = animY;
                                arr[sz++] = textureId;
                                arr[sz++] = x;
                                arr[sz++] = y + h;
                                arr[sz++] = u;
                                arr[sz++] = v + h;
                                arr[sz++] = u + eps;
                                arr[sz++] = v + eps;
                                arr[sz++] = u + w - eps;
                                arr[sz++] = v + h - eps;
                                arr[sz++] = animX;
                                arr[sz++] = animY;
                                arr[sz++] = textureId;
                        }
                        vertexBuf.upload(arr, 0, true);
                }
                gl.drawElements(gl.TRIANGLES, currentRectsCount * 6, gl.UNSIGNED_SHORT, 0);
        }
};

//=============================================================================
// Tilemap
//=============================================================================

var UltraMode7_Tilemap_prototype_initialize = Tilemap.prototype.initialize;
Tilemap.prototype.initialize = function()
{
        if (!$gameMap.useUltraMode7)
        {
                UltraMode7_Tilemap_prototype_initialize.call(this);
                return;
        }
        PIXI.Container.call(this);
        this._margin = 0;
        this._width = $gameMap.width() * $gameMap.tileWidth();
        this._height = $gameMap.height() * $gameMap.tileHeight();
        this._tileWidth = 48;
        this._tileHeight = 48;
        this._mapWidth = 0;
        this._mapHeight = 0;
        this._mapData = null;
        this._layerWidth = 0;
        this._layerHeight = 0;
        this._lastTiles = [];
        this.bitmaps = [];
        this.origin = new Point();
        this.flags = [];
        this.animationCount = 0;
        this.horizontalWrap = false;
        this.verticalWrap = false;
        this._createLayers();
        this.refresh();
};

//=============================================================================
// ShaderTilemap
//=============================================================================

var UltraMode7_ShaderTilemap_prototype__createLayers = ShaderTilemap.prototype._createLayers;
ShaderTilemap.prototype._createLayers = function()
{
        if (!$gameMap.useUltraMode7)
        {
                UltraMode7_ShaderTilemap_prototype__createLayers.call(this);
                return;
        }
        // width/height forcing is needed, because some scripts manipulate the width and height values of the tilemap
        this._width = $gameMap.width() * $gameMap.tileWidth();
        this._height = $gameMap.height() * $gameMap.tileHeight();
        var width = this._width;
        var height = this._height;
        var margin = this._margin;
        var tileCols = Math.ceil(width / this._tileWidth) + 1;
        var tileRows = Math.ceil(height / this._tileHeight) + 1;
        var layerWidth = this._layerWidth = tileCols * this._tileWidth;
        var layerHeight = this._layerHeight = tileRows * this._tileHeight;
        this._needsRepaint = true;
        if (!this.lowerZLayer)
        {
                this.lowerZLayer = new PIXI.tilemap.ZLayer(this, 0);
                this.upperZLayer = new PIXI.tilemap.ZLayer(this, 0);
                this.addChild(this.lowerZLayer);
                this.addChild(this.upperZLayer);
                var parameters = PluginManager.parameters('ShaderTilemap');
                var useSquareShader = Number(parameters.hasOwnProperty('squareShader') ? parameters['squareShader'] : 0);
                this.lowerLayer = new PIXI.tilemap.CompositeRectTileLayer(0, [], useSquareShader);
                this.lowerLayer.shadowColor = new Float32Array([0.0, 0.0, 0.0, 0.5]);
                this.lowerZLayer.addChild(this.lowerLayer);
                this.upperLayer = new PIXI.tilemap.CompositeRectTileLayer(0, [], useSquareShader);
                this.upperZLayer.addChild(this.upperLayer);
        }
};

var UltraMode7_ShaderTilemap_prototype__updateLayerPositions = ShaderTilemap.prototype._updateLayerPositions;
ShaderTilemap.prototype._updateLayerPositions = function(startX, startY)
{
        if (!$gameMap.useUltraMode7)
        {
                UltraMode7_ShaderTilemap_prototype__updateLayerPositions.call(this, startX, startY);
        }
};

var UltraMode7_ShaderTilemap_prototype__paintAllTiles = ShaderTilemap.prototype._paintAllTiles;
ShaderTilemap.prototype._paintAllTiles = function(startX, startY)
{
        if (!$gameMap.useUltraMode7)
        {
                UltraMode7_ShaderTilemap_prototype__paintAllTiles.call(this, startX, startY);
                return;
        }
        this.lowerZLayer.clear();
        this.upperZLayer.clear();
        var tileCols = Math.ceil(this._width / this._tileWidth) + 1;
        var tileRows = Math.ceil(this._height / this._tileHeight) + 1;
        for (var y = 0; y < tileRows; ++y)
        {
                for (var x = 0; x < tileCols; ++x)
                {
                        this._paintTiles(0, 0, x, y);
                }
        }
};

//=============================================================================
// Game_CharacterBase
//=============================================================================

var UltraMode7_Game_CharacterBase_prototype_screenX = Game_CharacterBase.prototype.screenX;
Game_CharacterBase.prototype.screenX = function()
{
        var x = UltraMode7_Game_CharacterBase_prototype_screenX.call(this);
        if (!$gameMap.useUltraMode7)
        {
                return x;
        }
        var y = UltraMode7_Game_CharacterBase_prototype_screenY.call(this);
        var ultraMode7Position = UltraMode7.mapToScreen(x, y);
        return (this.isUltraMode7Visible(ultraMode7Position.z) ? ultraMode7Position.x : -10000);
};

var UltraMode7_Game_CharacterBase_prototype_screenY = Game_CharacterBase.prototype.screenY;
Game_CharacterBase.prototype.screenY = function()
{
        var y = UltraMode7_Game_CharacterBase_prototype_screenY.call(this);
        if (!$gameMap.useUltraMode7)
        {
                return y;
        }
        var x = UltraMode7_Game_CharacterBase_prototype_screenX.call(this);
        var ultraMode7Position = UltraMode7.mapToScreen(x, y);
        return (this.isUltraMode7Visible(ultraMode7Position.z) ? ultraMode7Position.y : -10000);
};

Game_CharacterBase.prototype.screenScale = function()
{
        if (!$gameMap.useUltraMode7)
        {
                return 1.0;
        }
        var x = UltraMode7_Game_CharacterBase_prototype_screenX.call(this);
        var y = UltraMode7_Game_CharacterBase_prototype_screenY.call(this);
        return UltraMode7.mapToScreenScale(x, y);
};

Game_CharacterBase.prototype.isUltraMode7Visible = function(z)
{
        if (!$gameMap.useUltraMode7)
        {
                return true;
        }
        return (z > UltraMode7.NEAR_CLIP_Z && z < UltraMode7.FAR_CLIP_Z);
};

//=============================================================================
// Game_Map
//=============================================================================

Object.defineProperties(Game_Map.prototype,
{
        useUltraMode7: { get: function() { return this._useUltraMode7; }, configurable: true },
        ultraMode7Fov: { get: function() { return this._ultraMode7Fov; }, configurable: true },
        ultraMode7Pitch: { get: function() { return this._ultraMode7Pitch; }, configurable: true },
        ultraMode7Yaw: { get: function() { return this._ultraMode7Yaw; }, configurable: true },
        ultraMode7CameraDistance: { get: function() { return this._ultraMode7CameraDistance; }, configurable: true },
        ultraMode7ProjectionMatrix: { get: function() { return this._ultraMode7ProjectionMatrix; }, configurable: true },
        ultraMode7ModelviewMatrix: { get: function() { return this._ultraMode7ModelviewMatrix; }, configurable: true }
});

var UltraMode7_Game_Map_prototype_initialize = Game_Map.prototype.initialize;
Game_Map.prototype.initialize = function()
{
        UltraMode7_Game_Map_prototype_initialize.call(this);
        this.initUltraMode7();
};

var UltraMode7_Game_Map_prototype_setup = Game_Map.prototype.setup;
Game_Map.prototype.setup = function(mapId)
{
        UltraMode7_Game_Map_prototype_setup.call(this, mapId);
        this.setupUltraMode7();
};

Game_Map.prototype.initUltraMode7 = function()
{
        this._useUltraMode7 = false;
        this._ultraMode7Pitch = 0;
        this._ultraMode7Yaw = 0;
        this._ultraMode7CameraDistance = Graphics.boxWidth / 2;
        this._ultraMode7ProjectionMatrix = new UltraMode7.Matrix4();
        this._ultraMode7ModelviewMatrix = new UltraMode7.Matrix4();
        var eye = new UltraMode7.Vector3(0, 0, this._ultraMode7CameraDistance);
        var target = new UltraMode7.Vector3(0, 0, 0);
        var up = new UltraMode7.Vector3(0, 1, 0);
        this._ultraMode7ModelviewMatrix.lookAt(eye, target, up);
};

Game_Map.prototype.setupUltraMode7 = function()
{
        this.initUltraMode7();
        if (!$dataMap)
        {
                throw new Error("The map data is not available");
        }
        if ($dataMap.meta.UltraMode7 || $dataMap.meta.UltraMode7_FOV || $dataMap.meta.UltraMode7_Pitch ||
                $dataMap.meta.UltraMode7_Yaw || $dataMap.meta.UltraMode7_CameraDistance)
        {
                this._useUltraMode7 = true;
                this._ultraMode7Fov = Math.max(BlizzardUtility.Numeric($dataMap.meta.UltraMode7_FOV, UltraMode7.DEFAULT_FOV), UltraMode7.MIN_FOV);
                this._ultraMode7Pitch = BlizzardUtility.Numeric($dataMap.meta.UltraMode7_Pitch, UltraMode7.DEFAULT_PITCH).clamp(UltraMode7.MIN_PITCH, UltraMode7.MAX_PITCH);
                this._ultraMode7Yaw = BlizzardUtility.Numeric($dataMap.meta.UltraMode7_Yaw, UltraMode7.DEFAULT_YAW);
                this._ultraMode7CameraDistance = Math.max(BlizzardUtility.Numeric($dataMap.meta.UltraMode7_CameraDistance, UltraMode7.DEFAULT_CAMERA_DISTANCE), 0);
                this.refreshUltraMode7View();
        }
};

Game_Map.prototype.setUltraMode7Fov = function(value)
{
        if (!this._useUltraMode7)
        {
                return;
        }
        this._ultraMode7Fov = Math.max(value, UltraMode7.MIN_FOV); // more or less arbitrary limit, but there are huge issues with smaller values
        this.refreshUltraMode7View();
};

Game_Map.prototype.setUltraMode7Pitch = function(value)
{
        if (!this._useUltraMode7)
        {
                return;
        }
        this._ultraMode7Pitch = value.clamp(UltraMode7.MIN_PITCH, UltraMode7.MAX_PITCH);
        this.refreshUltraMode7View();
};

Game_Map.prototype.setUltraMode7Yaw = function(value)
{
        if (!this._useUltraMode7)
        {
                return;
        }
        this._ultraMode7Yaw = value;
        this.refreshUltraMode7View();
};

Game_Map.prototype.setUltraMode7CameraDistance = function(value)
{
        if (!this._useUltraMode7)
        {
                return;
        }
        this._ultraMode7CameraDistance = Math.max(value, 0);
        this.refreshUltraMode7View();
};

Game_Map.prototype.refreshUltraMode7View = function()
{
        if (!this._useUltraMode7)
        {
                return;
        }
        this._ultraMode7ProjectionMatrix.setPerspective(this._ultraMode7Fov, Graphics.boxWidth, Graphics.boxHeight, UltraMode7.NEAR_CLIP_Z, UltraMode7.FAR_CLIP_Z);
        var eye = new UltraMode7.Vector3(0, 0, this._ultraMode7CameraDistance);
        var target = new UltraMode7.Vector3(0, 0, 0);
        var up = new UltraMode7.Vector3(0, 1, 0);
        this._ultraMode7ModelviewMatrix.lookAt(eye, target, up);
        this._ultraMode7ModelviewMatrix.rotateX($gameMap.ultraMode7Pitch);
        this._ultraMode7ModelviewMatrix.rotateZ($gameMap.ultraMode7Yaw);
        this._ultraMode7ModelviewMatrix.translate(-Graphics.boxWidth / 2 - $gameMap.displayX() * $gameMap.tileWidth(), -Graphics.boxHeight / 2 - $gameMap.displayY() * $gameMap.tileHeight(), 0);
};

var UltraMode7_Game_Map_prototype_parallaxOx = Game_Map.prototype.parallaxOy;
Game_Map.prototype.parallaxOx = function()
{
        if (!this._useUltraMode7)
        {
                return UltraMode7_Game_Map_prototype_parallaxOx.call(this);
        }
        if (this._parallaxZero)
        {
                return (this._parallaxX * UltraMode7.PARALLAX_SCROLL_X_MULTIPLIER * this.tileWidth());
        }
        if (this._parallaxLoopX)
        {
                return (this._parallaxX * UltraMode7.PARALLAX_SCROLL_X_MULTIPLIER * this.tileWidth() / 2);
        }
        return 0;
};

var UltraMode7_Game_Map_prototype_parallaxOy = Game_Map.prototype.parallaxOy;
Game_Map.prototype.parallaxOy = function()
{
        if (!this._useUltraMode7)
        {
                return UltraMode7_Game_Map_prototype_parallaxOy.call(this);
        }
        if (this._parallaxZero)
        {
                return (this._parallaxY * UltraMode7.PARALLAX_SCROLL_Y_MULTIPLIER * this.tileHeight());
        }
        if (this._parallaxLoopY)
        {
                return (this._parallaxY * UltraMode7.PARALLAX_SCROLL_Y_MULTIPLIER * this.tileHeight() / 2);
        }
        return 0;
};

var UltraMode7_Game_Map_prototype_setDisplayPos = Game_Map.prototype.setDisplayPos;
Game_Map.prototype.setDisplayPos = function(x, y)
{
        if (!this._useUltraMode7)
        {
                UltraMode7_Game_Map_prototype_setDisplayPos.call(this, x, y);
                return;
        }
        if (this.isLoopHorizontal())
        {
                this._displayX = x.mod(this.width());
                this._parallaxX = x;
        }
        else
        {
                var screenTileX = this.screenTileX();
                var endX = this.width() - screenTileX;
                this._displayX = x;
                this._parallaxX = this._displayX;
        }
        if (this.isLoopVertical())
        {
                this._displayY = y.mod(this.height());
                this._parallaxY = y;
        }
        else
        {
                var endY = this.height() - this.screenTileY();
                this._displayY = y;
                this._parallaxY = this._displayY;
        }
        this.refreshUltraMode7View();
};

var UltraMode7_Game_Map_prototype_scrollDown = Game_Map.prototype.scrollDown;
Game_Map.prototype.scrollDown = function(distance)
{
        if (!this._useUltraMode7)
        {
                UltraMode7_Game_Map_prototype_scrollDown.call(this, distance);
                return;
        }
        this._displayY += distance;
        if (this.isLoopVertical())
        {
                this._displayY %= $dataMap.height;
                if (this._parallaxLoopY)
                {
                        this._parallaxY += distance;
                }
        }
        else
        {
                this._parallaxY += distance;
        }
        this.refreshUltraMode7View();
};

var UltraMode7_Game_Map_prototype_scrollLeft = Game_Map.prototype.scrollLeft;
Game_Map.prototype.scrollLeft = function(distance)
{
        if (!this._useUltraMode7)
        {
                UltraMode7_Game_Map_prototype_scrollLeft.call(this, distance);
                return;
        }
        if (this.isLoopHorizontal())
        {
                this._displayX += $dataMap.width - distance;
                this._displayX %= $dataMap.width;
                if (this._parallaxLoopX)
                {
                        this._parallaxX -= distance;
                }
        }
        else
        {
                this._displayX -= distance;
                this._parallaxX -= distance;
        }
        this.refreshUltraMode7View();
};

var UltraMode7_Game_Map_prototype_scrollRight = Game_Map.prototype.scrollRight;
Game_Map.prototype.scrollRight = function(distance)
{
        if (!this._useUltraMode7)
        {
                UltraMode7_Game_Map_prototype_scrollRight.call(this, distance);
                return;
        }
        this._displayX += distance;
        if (this.isLoopHorizontal())
        {
                this._displayX %= $dataMap.width;
                if (this._parallaxLoopX)
                {
                        this._parallaxX += distance;
                }
        }
        else
        {
                this._parallaxX += distance;
        }
        this.refreshUltraMode7View();
};

var UltraMode7_Game_Map_prototype_scrollUp = Game_Map.prototype.scrollUp;
Game_Map.prototype.scrollUp = function(distance)
{
        if (!this._useUltraMode7)
        {
                UltraMode7_Game_Map_prototype_scrollUp.call(this, distance);
                return;
        }
        if (this.isLoopVertical())
        {
                this._displayY += $dataMap.height - distance;
                this._displayY %= $dataMap.height;
                if (this._parallaxLoopY)
                {
                        this._parallaxY -= distance;
                }
        }
        else
        {
                this._displayY -= distance;
                this._parallaxY -= distance;
        }
        this.refreshUltraMode7View();
};

var UltraMode7_Game_Map_prototype_update = Game_Map.prototype.update;
Game_Map.prototype.update = function(sceneActive)
{
        UltraMode7_Game_Map_prototype_update.call(this, sceneActive);
        if (this._useUltraMode7)
        {
                this.updateUltraMode7();
        }
};

Game_Map.prototype.updateUltraMode7 = function()
{
        var needRefresh = false;
        if (this._ultraMode7FovDuration > 0)
        {
                var duration = this._ultraMode7FovDuration;
                this._ultraMode7Fov = Math.max((this._ultraMode7Fov * (duration - 1) + this._ultraMode7FovTarget) / duration, UltraMode7.MIN_FOV);
                --this._ultraMode7FovDuration;
                needRefresh = true;
        }
        if (this._ultraMode7PitchDuration > 0)
        {
                var duration = this._ultraMode7PitchDuration;
                this._ultraMode7Pitch = ((this._ultraMode7Pitch * (duration - 1) + this._ultraMode7PitchTarget) / duration).clamp(UltraMode7.MIN_PITCH, UltraMode7.MAX_PITCH);
                --this._ultraMode7PitchDuration;
                needRefresh = true;
        }
        if (this._ultraMode7YawDuration > 0)
        {
                var duration = this._ultraMode7YawDuration;
                this._ultraMode7Yaw = (this._ultraMode7Yaw * (duration - 1) + this._ultraMode7YawTarget) / duration;
                --this._ultraMode7YawDuration;
                needRefresh = true;
        }
        if (this._ultraMode7CameraDistanceDuration > 0)
        {
                var duration = this._ultraMode7CameraDistanceDuration;
                this._ultraMode7CameraDistance = Math.max((this._ultraMode7CameraDistance * (duration - 1) + this._ultraMode7CameraDistanceTarget) / duration, 0);
                --this._ultraMode7CameraDistanceDuration;
                needRefresh = true;
        }
        if (needRefresh)
        {
                this.refreshUltraMode7View();
        }
};

Game_Map.prototype.animateUltraMode7Fov = function(target, frameDuration)
{
        this._ultraMode7FovTarget = target;
        this._ultraMode7FovDuration = frameDuration;
};

Game_Map.prototype.animateUltraMode7Pitch = function(target, frameDuration)
{
        this._ultraMode7PitchTarget = target;
        this._ultraMode7PitchDuration = frameDuration;
};

Game_Map.prototype.animateUltraMode7Yaw = function(target, frameDuration)
{
        this._ultraMode7YawTarget = target;
        this._ultraMode7YawDuration = frameDuration;
};

Game_Map.prototype.animateUltraMode7CameraDistance = function(target, frameDuration)
{
        this._ultraMode7CameraDistanceTarget = target;
        this._ultraMode7CameraDistanceDuration = frameDuration;
};

//=============================================================================
// Sprite_Character
//=============================================================================

var UltraMode7_Sprite_Character_prototype_updateBitmap = Sprite_Character.prototype.updateBitmap;
Sprite_Character.prototype.updateBitmap = function()
{
        var imageChanged = this.isImageChanged();
        UltraMode7_Sprite_Character_prototype_updateBitmap.call(this);
        if ($gameMap.useUltraMode7 && imageChanged && this.bitmap)
        {
                this.bitmap.smooth = !UltraMode7.CHARACTERS_PIXELATED;
        }
};

var UltraMode7_Sprite_Character_prototype_characterPatternY = Sprite_Character.prototype.characterPatternY;
Sprite_Character.prototype.characterPatternY = function()
{
        if (!$gameMap.useUltraMode7)
        {
                return UltraMode7_Sprite_Character_prototype_characterPatternY.call(this);
        }
        var direction = this._character.direction();
        var angle = $gameMap.ultraMode7Yaw;
        if (angle >= 45 && angle <= 135)
        {
                switch (direction)
                {
                case 2:        direction = 4;        break;
                case 4:        direction = 8;        break;
                case 6:        direction = 2;        break;
                case 8:        direction = 6;        break;
                default:                                 break;
                }
        }
        else if (angle > 135 && angle < 225)
        {
                direction = 10 - direction;
        }
        else if (angle >= 225 && angle <= 315)
        {
                switch (direction)
                {
                case 2:        direction = 6;        break;
                case 4:        direction = 2;        break;
                case 6:        direction = 8;        break;
                case 8:        direction = 4;        break;
                default:                                 break;
                }
        }
        return (direction - 2) / 2;
};

var UltraMode7_Sprite_Character_prototype_updatePosition = Sprite_Character.prototype.updatePosition;
Sprite_Character.prototype.updatePosition = function()
{
        UltraMode7_Sprite_Character_prototype_updatePosition.call(this);
        if (!$gameMap.useUltraMode7)
        {
                return;
        }
        var scale = this._character.screenScale();
        this.scale.x = scale;
        this.scale.y = scale;
};

//=============================================================================
// Sprite_Destination
//=============================================================================

var UltraMode7_Sprite_Destination_prototype_updatePosition = Sprite_Destination.prototype.updatePosition;
Sprite_Destination.prototype.updatePosition = function()
{
        UltraMode7_Sprite_Destination_prototype_updatePosition.call(this);
        if (!$gameMap.useUltraMode7)
        {
                return;
        }
        var position = UltraMode7.mapToScreen(this.x, this.y);
        this.x = position.x;
        this.y = position.y;
};

//=============================================================================
// Scene_Map
//=============================================================================

var UltraMode7_Scene_Map_prototype_processMapTouch = Scene_Map.prototype.processMapTouch;
Scene_Map.prototype.processMapTouch = function()
{
        if (!$gameMap.useUltraMode7)
        {
                UltraMode7_Scene_Map_prototype_processMapTouch.call(this);
                return;
        }
        if (TouchInput.isTriggered() || this._touchCount > 0)
        {
                if (TouchInput.isPressed())
                {
                        if (this._touchCount === 0 || this._touchCount >= 15)
                        {
                                var position = UltraMode7.screenToMap(TouchInput.x, TouchInput.y);
                                $gameTemp.setDestination(Math.floor(position.x / $gameMap.tileWidth()), Math.floor(position.y / $gameMap.tileHeight()));
                        }
                        this._touchCount++;
                }
                else
                {
                        this._touchCount = 0;
                }
        }
};

//=============================================================================

})();
[/pre]


範本下載
https://downloads.chaos-project.com/scripts/UltraMode7.zip
百度1k上傳中
链接:https://pan.baidu.com/s/1o3Hjdv33sebMRdDLcDQtHA 密码:nuq0

点评

使用这个脚本之后能否实现像原版那样,角色移动到地图边缘后,镜头不再跟随角色移动,而是固定在地图的边缘,保证镜头不出地图范围呢  发表于 2018-8-24 19:24
回复

使用道具 举报

梦石
0
星屑
587
在线时间
124 小时
注册时间
2016-12-14
回帖
37
发表于 2018-6-16 17:13:52 | 显示全部楼层
tseyik 发表于 2018-4-26 10:43
一個將多個地圖連接成一個大地圖的插件。
日文説明:
https://github.com/futokoro/RPGMaker/blob/master/FT ...

连接的方式看不懂,到底该怎么做呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部