Initial Commit

This commit is contained in:
Dazed 2023-10-25 10:38:46 -05:00
commit 91003ef32d
110 changed files with 432681 additions and 0 deletions

16
.gitignore vendored Normal file
View file

@ -0,0 +1,16 @@
# Ignore all files
*.*
# Except
!*.json
!*.js
!*.zip
!*.7z
!*.csv
!.gitignore
!README.md
!bokukae_sce.dat
!bokukae_sce.dat.bak
!bokukae_define.dat
# Images

49
README.md Normal file
View file

@ -0,0 +1,49 @@
# Apply Patch
1. Click Code
2. Click Download ZIP
3. Extract to game folder and Replace All.
# How To Contribute
TLDR 3 steps.
Fork the repository.
Make the changes.
Submit a pull request to the project owner.
If everything looks good and doesn't break things I'll merge it in.
Longer Version:
Things that are needed:
* [VSCode](https://code.visualstudio.com/) Make sure you check all the boxes for context menus. ![image](https://github.com/DazedMTL/Dungeon-With-Girl/assets/96628874/7a84b624-32fe-4845-a0f6-2b9f39795070)
* The Game
* [Git](https://git-scm.com/downloads) (Use the default for everything. Just keep clicking Next)
* Motivation to learn
Installation:
1. Fork the repo using the fork button at the top. Click Code > HTTPS > Copy URL.
2. Right click on the game folder and click 'Open with VSCode' (Shift+Right_Click if you are on Windows 11)
3. Click on the Source Control Button and click initialize repository.
![image](https://github.com/DazedMTL/Dungeon-With-Girl/assets/96628874/61e818e6-11f9-450d-9d7d-263d109dbf56)
4. At the top click on Terminal > New Terminal. Enter the following: `git clone [URL_YOU_COPIED_ABOVE]`.
5. Copy the contents of the new folder created with git clone into the game folder and replace all.
6. Your source control menu should be good to go and look like this.
![image](https://github.com/DazedMTL/Dungeon-With-Girl/assets/96628874/c19787a0-172d-4a08-a37a-e3b56e70e86a)
Now you are all setup, all you need to do is play the game and look for any changes that need to be made. Stuff like spelling errors, wrong names, inconsistencies, spacing issues, etc.
7. Use the FIND functionality to search for what you are trying to fix. For example if a character's name is wrong, type that into the search menu and start looking, then make the change. Try not to mess with any scripts or variables you might see.
![image](https://github.com/DazedMTL/Dungeon-With-Girl/assets/96628874/589eccaf-7f86-43f7-a917-7e6e477b381a)
8. After you are satisfied with your changes it's time to put in a PR. Go to source control to see all your changes. Add a message and click the `Commit` button to save them all.
![image](https://github.com/DazedMTL/Dungeon-With-Girl/assets/96628874/a9a8973b-bc01-4184-bea9-63a925d961a2)
8. Click Sync to push your changes to your fork. Now all that's left is to put in a pull request.
9. Go to Pull Requests > New Pull Requests. Look at the arrow, your fork should be pointing to the original repo (mine). Add in details on what you fixed and Submit. If everything looks good I'll merge it in and you would have successfully contributed.
Got questions? Just shoot me a message, more than happy to walk you through any of the tools.

193
data/Actors.json Normal file
View file

@ -0,0 +1,193 @@
[
null,
{
"id": 1,
"battlerName": "エスカ3",
"characterIndex": 0,
"characterName": "エスカ",
"classId": 1,
"equips": [
37,
0,
0,
10,
94
],
"faceIndex": 0,
"faceName": "",
"traits": [
{
"code": 41,
"dataId": 1,
"value": 1
}
],
"initialLevel": 5,
"maxLevel": 99,
"name": "エスカ",
"nickname": "",
"note": "<StandPicture:esk>",
"profile": ""
},
{
"id": 2,
"battlerName": "シュウ3",
"characterIndex": 0,
"characterName": "シュウ1",
"classId": 2,
"equips": [
1,
0,
0,
9,
0
],
"faceIndex": 1,
"faceName": "",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "シュウ",
"nickname": "",
"note": "",
"profile": ""
},
{
"id": 3,
"battlerName": "エスカ3",
"characterIndex": 0,
"characterName": "エスカ(子)",
"classId": 5,
"equips": [
0,
0,
65,
0,
0
],
"faceIndex": 2,
"faceName": "",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "赤い髪の少女",
"nickname": "",
"note": "",
"profile": ""
},
{
"id": 4,
"battlerName": "Actor1_4",
"characterIndex": 0,
"characterName": "ミコト(小)",
"classId": 5,
"equips": [
0,
0,
0,
0,
0
],
"faceIndex": 3,
"faceName": "",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "ミコト",
"nickname": "",
"note": "",
"profile": ""
},
{
"id": 5,
"battlerName": "Actor1_5",
"characterIndex": 4,
"characterName": "Actor1",
"classId": 2,
"equips": [
7,
0,
0,
20,
0
],
"faceIndex": 4,
"faceName": "Actor1",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "アルベール",
"nickname": "",
"note": "",
"profile": ""
},
{
"id": 6,
"battlerName": "Actor1_6",
"characterIndex": 5,
"characterName": "Actor1",
"classId": 2,
"equips": [
7,
0,
65,
21,
0
],
"faceIndex": 5,
"faceName": "Actor1",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "ケイシー",
"nickname": "",
"note": "",
"profile": ""
},
{
"id": 7,
"battlerName": "Actor1_7",
"characterIndex": 6,
"characterName": "Actor1",
"classId": 3,
"equips": [
7,
0,
0,
20,
0
],
"faceIndex": 6,
"faceName": "Actor1",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "エリオット",
"nickname": "",
"note": "",
"profile": ""
},
{
"id": 8,
"battlerName": "Actor1_8",
"characterIndex": 7,
"characterName": "Actor1",
"classId": 3,
"equips": [
7,
0,
0,
20,
0
],
"faceIndex": 7,
"faceName": "Actor1",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "ローザ",
"nickname": "",
"note": "",
"profile": ""
}
]

9759
data/Animations.json Normal file

File diff suppressed because it is too large Load diff

2839
data/Armors.json Normal file

File diff suppressed because it is too large Load diff

7320
data/Classes.json Normal file

File diff suppressed because it is too large Load diff

2913
data/CommonEvents.json Normal file

File diff suppressed because it is too large Load diff

1291
data/Enemies.json Normal file

File diff suppressed because it is too large Load diff

989
data/Items.json Normal file
View file

@ -0,0 +1,989 @@
[
null,
{
"id": 1,
"animationId": 0,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "回復アイテムより上位に表示したいアイテム用の枠です。",
"effects": [],
"hitType": 0,
"iconIndex": 0,
"itypeId": 1,
"name": "-----予備",
"note": "",
"occasion": 3,
"price": 0,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 2,
"animationId": 0,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "",
"effects": [],
"hitType": 0,
"iconIndex": 0,
"itypeId": 1,
"name": "",
"note": "",
"occasion": 0,
"price": 0,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 3,
"animationId": 0,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "",
"effects": [],
"hitType": 0,
"iconIndex": 0,
"itypeId": 1,
"name": "",
"note": "",
"occasion": 0,
"price": 0,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 4,
"animationId": 0,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "",
"effects": [],
"hitType": 0,
"iconIndex": 0,
"itypeId": 1,
"name": "",
"note": "",
"occasion": 0,
"price": 0,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 5,
"animationId": 0,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "",
"effects": [],
"hitType": 0,
"iconIndex": 0,
"itypeId": 1,
"name": "",
"note": "",
"occasion": 0,
"price": 0,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 6,
"animationId": 0,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "",
"effects": [],
"hitType": 0,
"iconIndex": 0,
"itypeId": 1,
"name": "-----回復系",
"note": "",
"occasion": 3,
"price": 0,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 7,
"animationId": 41,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "HPを500ポイント回復する。",
"effects": [
{
"code": 11,
"dataId": 0,
"value1": 0,
"value2": 500
}
],
"hitType": 0,
"iconIndex": 242,
"itypeId": 1,
"name": "リペアキット",
"note": "",
"occasion": 0,
"price": 100,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 8,
"animationId": 41,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "HPを1000ポイント回復する。",
"effects": [
{
"code": 11,
"dataId": 0,
"value1": 0,
"value2": 1500
}
],
"hitType": 0,
"iconIndex": 242,
"itypeId": 1,
"name": "リペアキットMk-2",
"note": "",
"occasion": 0,
"price": 250,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 9,
"animationId": 41,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "HPを完全に回復する。",
"effects": [
{
"code": 11,
"dataId": 0,
"value1": 1,
"value2": 0
}
],
"hitType": 0,
"iconIndex": 176,
"itypeId": 1,
"name": "フルポーション",
"note": "",
"occasion": 0,
"price": 550,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 10,
"animationId": 41,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "ENを100ポイント回復する。",
"effects": [
{
"code": 12,
"dataId": 0,
"value1": 0,
"value2": 100
}
],
"hitType": 0,
"iconIndex": 228,
"itypeId": 1,
"name": "電池",
"note": "",
"occasion": 0,
"price": 300,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 11,
"animationId": 49,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "b.mhp / 2",
"type": 0,
"variance": 20
},
"description": "ENを300ポイント回復する。",
"effects": [
{
"code": 12,
"dataId": 0,
"value1": 0,
"value2": 300
}
],
"hitType": 0,
"iconIndex": 228,
"itypeId": 1,
"name": "大容量電池",
"note": "",
"occasion": 0,
"price": 500,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 12,
"animationId": 46,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "戦闘不能以外の状態異常を回復する。",
"effects": [
{
"code": 22,
"dataId": 4,
"value1": 1,
"value2": 0
},
{
"code": 22,
"dataId": 5,
"value1": 1,
"value2": 0
},
{
"code": 22,
"dataId": 6,
"value1": 1,
"value2": 0
},
{
"code": 22,
"dataId": 7,
"value1": 1,
"value2": 0
},
{
"code": 22,
"dataId": 8,
"value1": 1,
"value2": 0
},
{
"code": 22,
"dataId": 9,
"value1": 1,
"value2": 0
},
{
"code": 22,
"dataId": 10,
"value1": 1,
"value2": 0
},
{
"code": 22,
"dataId": 13,
"value1": 1,
"value2": 0
},
{
"code": 22,
"dataId": 12,
"value1": 1,
"value2": 0
}
],
"hitType": 0,
"iconIndex": 176,
"itypeId": 1,
"name": "ディスペルハーブ",
"note": "",
"occasion": 0,
"price": 200,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 13,
"animationId": 45,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "毒、麻痺状態を治療する。",
"effects": [
{
"code": 22,
"dataId": 4,
"value1": 1,
"value2": 0
},
{
"code": 22,
"dataId": 12,
"value1": 1,
"value2": 0
}
],
"hitType": 0,
"iconIndex": 176,
"itypeId": 1,
"name": "アンチドーテ",
"note": "",
"occasion": 0,
"price": 80,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 14,
"animationId": 41,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "HPとMPを半分回復する。",
"effects": [
{
"code": 11,
"dataId": 0,
"value1": 0.5,
"value2": 0
},
{
"code": 12,
"dataId": 0,
"value1": 0.5,
"value2": 0
}
],
"hitType": 0,
"iconIndex": 176,
"itypeId": 1,
"name": "ミラクルドロップ",
"note": "",
"occasion": 0,
"price": 450,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 15,
"animationId": 41,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "HPとMPを完全に回復する。",
"effects": [
{
"code": 11,
"dataId": 0,
"value1": 1,
"value2": 0
},
{
"code": 12,
"dataId": 0,
"value1": 1,
"value2": 0
}
],
"hitType": 0,
"iconIndex": 176,
"itypeId": 1,
"name": "エリクサー",
"note": "",
"occasion": 0,
"price": 1200,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 16,
"animationId": 117,
"consumable": false,
"damage": {
"critical": false,
"elementId": 0,
"formula": "b.mmp*1",
"type": 4,
"variance": 0
},
"description": "ハンバード博士が作ってくれたワイヤレス充電器",
"effects": [
{
"code": 44,
"dataId": 1,
"value1": 1,
"value2": 0
}
],
"hitType": 0,
"iconIndex": 243,
"itypeId": 2,
"name": "ワイヤレス充電器",
"note": "",
"occasion": 1,
"price": 0,
"repeats": 1,
"scope": 1,
"speed": 999,
"successRate": 100,
"tpGain": 0
},
{
"id": 17,
"animationId": 0,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "",
"effects": [],
"hitType": 0,
"iconIndex": 0,
"itypeId": 1,
"name": "-----特殊系",
"note": "",
"occasion": 3,
"price": 0,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 18,
"animationId": 51,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "しばらくの間、敵との遭遇率を半減させる。",
"effects": [
{
"code": 21,
"dataId": 29,
"value1": 1,
"value2": 0
}
],
"hitType": 0,
"iconIndex": 176,
"itypeId": 1,
"name": "エンカウントダウナー",
"note": "",
"occasion": 2,
"price": 100,
"repeats": 1,
"scope": 11,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 19,
"animationId": 51,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "しばらくの間\n戦闘で得られるアイテムや賞金の獲得率を上げる。",
"effects": [
{
"code": 21,
"dataId": 30,
"value1": 1,
"value2": 0
}
],
"hitType": 0,
"iconIndex": 176,
"itypeId": 1,
"name": "ドロップアッパー",
"note": "",
"occasion": 0,
"price": 300,
"repeats": 1,
"scope": 11,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 20,
"animationId": 109,
"consumable": false,
"damage": {
"critical": false,
"elementId": 0,
"formula": "a.mhp*1",
"type": 1,
"variance": 0
},
"description": "レジスタンスの情報漏洩を防ぐための自爆兵器\n使用すると戦いに敗北する",
"effects": [],
"hitType": 0,
"iconIndex": 1,
"itypeId": 1,
"name": "自決用ボム",
"note": "",
"occasion": 1,
"price": 0,
"repeats": 1,
"scope": 12,
"speed": 999,
"successRate": 100,
"tpGain": 0
},
{
"id": 21,
"animationId": 0,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "",
"effects": [],
"hitType": 0,
"iconIndex": 0,
"itypeId": 1,
"name": "",
"note": "",
"occasion": 0,
"price": 0,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 22,
"animationId": 0,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "",
"effects": [],
"hitType": 0,
"iconIndex": 0,
"itypeId": 1,
"name": "-----強化系",
"note": "",
"occasion": 3,
"price": 0,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 23,
"animationId": 51,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "最大HPを50ポイント上げる。",
"effects": [
{
"code": 42,
"dataId": 0,
"value1": 50,
"value2": 0
}
],
"hitType": 0,
"iconIndex": 32,
"itypeId": 1,
"name": "ライフアップ",
"note": "",
"occasion": 2,
"price": 3000,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 24,
"animationId": 51,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "最大MPを10ポイント上げる。",
"effects": [
{
"code": 42,
"dataId": 1,
"value1": 10,
"value2": 0
}
],
"hitType": 0,
"iconIndex": 33,
"itypeId": 1,
"name": "マナアップ",
"note": "",
"occasion": 2,
"price": 3000,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 25,
"animationId": 51,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "攻撃力を3ポイント上げる。",
"effects": [
{
"code": 42,
"dataId": 2,
"value1": 3,
"value2": 0
}
],
"hitType": 0,
"iconIndex": 34,
"itypeId": 1,
"name": "パワーアップ",
"note": "",
"occasion": 2,
"price": 3000,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 26,
"animationId": 51,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "防御力を3ポイント上げる。",
"effects": [
{
"code": 42,
"dataId": 3,
"value1": 3,
"value2": 0
}
],
"hitType": 0,
"iconIndex": 35,
"itypeId": 1,
"name": "ガードアップ",
"note": "",
"occasion": 2,
"price": 3000,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 27,
"animationId": 51,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "魔法力を3ポイント上げる。",
"effects": [
{
"code": 42,
"dataId": 4,
"value1": 3,
"value2": 0
}
],
"hitType": 0,
"iconIndex": 36,
"itypeId": 1,
"name": "マジックアップ",
"note": "",
"occasion": 2,
"price": 3000,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 28,
"animationId": 51,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "魔法防御力を3ポイント上げる。",
"effects": [
{
"code": 42,
"dataId": 5,
"value1": 3,
"value2": 0
}
],
"hitType": 0,
"iconIndex": 37,
"itypeId": 1,
"name": "レジストアップ",
"note": "",
"occasion": 2,
"price": 3000,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 29,
"animationId": 51,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "敏捷性を3ポイント上げる。",
"effects": [
{
"code": 42,
"dataId": 6,
"value1": 3,
"value2": 0
}
],
"hitType": 0,
"iconIndex": 38,
"itypeId": 1,
"name": "スピードアップ",
"note": "",
"occasion": 2,
"price": 3000,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
},
{
"id": 30,
"animationId": 51,
"consumable": true,
"damage": {
"critical": false,
"elementId": 0,
"formula": "0",
"type": 0,
"variance": 20
},
"description": "運を3ポイント上げる。",
"effects": [
{
"code": 42,
"dataId": 7,
"value1": 3,
"value2": 0
}
],
"hitType": 0,
"iconIndex": 39,
"itypeId": 1,
"name": "ラックアップ",
"note": "",
"occasion": 2,
"price": 3000,
"repeats": 1,
"scope": 7,
"speed": 0,
"successRate": 100,
"tpGain": 0
}
]

7174
data/Map001.json Normal file

File diff suppressed because it is too large Load diff

2586
data/Map002.json Normal file

File diff suppressed because it is too large Load diff

22448
data/Map003.json Normal file

File diff suppressed because it is too large Load diff

5000
data/Map004.json Normal file

File diff suppressed because it is too large Load diff

3584
data/Map005.json Normal file

File diff suppressed because it is too large Load diff

4027
data/Map006.json Normal file

File diff suppressed because it is too large Load diff

5299
data/Map007.json Normal file

File diff suppressed because it is too large Load diff

9262
data/Map008.json Normal file

File diff suppressed because it is too large Load diff

2147
data/Map009.json Normal file

File diff suppressed because it is too large Load diff

1268
data/Map010.json Normal file

File diff suppressed because it is too large Load diff

1985
data/Map011.json Normal file

File diff suppressed because it is too large Load diff

1738
data/Map012.json Normal file

File diff suppressed because it is too large Load diff

2998
data/Map013.json Normal file

File diff suppressed because it is too large Load diff

5854
data/Map014.json Normal file

File diff suppressed because it is too large Load diff

8545
data/Map015.json Normal file

File diff suppressed because it is too large Load diff

4265
data/Map016.json Normal file

File diff suppressed because it is too large Load diff

1599
data/Map017.json Normal file

File diff suppressed because it is too large Load diff

1299
data/Map018.json Normal file

File diff suppressed because it is too large Load diff

33780
data/Map019.json Normal file

File diff suppressed because it is too large Load diff

3342
data/Map020.json Normal file

File diff suppressed because it is too large Load diff

2731
data/Map021.json Normal file

File diff suppressed because it is too large Load diff

5315
data/Map022.json Normal file

File diff suppressed because it is too large Load diff

1378
data/Map023.json Normal file

File diff suppressed because it is too large Load diff

7619
data/Map024.json Normal file

File diff suppressed because it is too large Load diff

3506
data/Map025.json Normal file

File diff suppressed because it is too large Load diff

1825
data/Map026.json Normal file

File diff suppressed because it is too large Load diff

2996
data/Map027.json Normal file

File diff suppressed because it is too large Load diff

2859
data/Map028.json Normal file

File diff suppressed because it is too large Load diff

5344
data/Map029.json Normal file

File diff suppressed because it is too large Load diff

6207
data/Map030.json Normal file

File diff suppressed because it is too large Load diff

1719
data/Map031.json Normal file

File diff suppressed because it is too large Load diff

5920
data/Map032.json Normal file

File diff suppressed because it is too large Load diff

5990
data/Map033.json Normal file

File diff suppressed because it is too large Load diff

1852
data/Map034.json Normal file

File diff suppressed because it is too large Load diff

1965
data/Map035.json Normal file

File diff suppressed because it is too large Load diff

1042
data/Map036.json Normal file

File diff suppressed because it is too large Load diff

1138
data/Map037.json Normal file

File diff suppressed because it is too large Load diff

3849
data/Map038.json Normal file

File diff suppressed because it is too large Load diff

2078
data/Map039.json Normal file

File diff suppressed because it is too large Load diff

2248
data/Map040.json Normal file

File diff suppressed because it is too large Load diff

1605
data/Map041.json Normal file

File diff suppressed because it is too large Load diff

4360
data/Map042.json Normal file

File diff suppressed because it is too large Load diff

5734
data/Map043.json Normal file

File diff suppressed because it is too large Load diff

23708
data/Map044.json Normal file

File diff suppressed because it is too large Load diff

399
data/MapInfos.json Normal file
View file

@ -0,0 +1,399 @@
[
null,
{
"id": 1,
"expanded": true,
"name": "拷問施設",
"order": 19,
"parentId": 0,
"scrollX": 842.1818181818182,
"scrollY": 674.7272727272727
},
{
"id": 2,
"expanded": true,
"name": "拠点",
"order": 1,
"parentId": 0,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 3,
"expanded": true,
"name": "A市",
"order": 28,
"parentId": 0,
"scrollX": 850.909090909091,
"scrollY": 1874.7272727272727
},
{
"id": 4,
"expanded": true,
"name": "オークション会場A",
"order": 35,
"parentId": 3,
"scrollX": 842.1818181818182,
"scrollY": 516.5454545454546
},
{
"id": 5,
"expanded": true,
"name": "ブローカーの部屋",
"order": 30,
"parentId": 3,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 6,
"expanded": true,
"name": "路上",
"order": 38,
"parentId": 0,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 7,
"expanded": true,
"name": "脱出路",
"order": 27,
"parentId": 1,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 8,
"expanded": true,
"name": "総統府",
"order": 11,
"parentId": 0,
"scrollX": 842.1818181818182,
"scrollY": 543.8181818181819
},
{
"id": 9,
"expanded": true,
"name": "暗闇",
"order": 44,
"parentId": 0,
"scrollX": 842.1818181818182,
"scrollY": 516.5454545454546
},
{
"id": 10,
"expanded": false,
"name": "ブローカーの部屋B",
"order": 31,
"parentId": 3,
"scrollX": 842.1818181818182,
"scrollY": 516.5454545454546
},
{
"id": 11,
"expanded": true,
"name": "拠点2",
"order": 2,
"parentId": 2,
"scrollX": 842.1818181818182,
"scrollY": 516.5454545454546
},
{
"id": 12,
"expanded": true,
"name": "脱出路後",
"order": 26,
"parentId": 1,
"scrollX": 842.1818181818182,
"scrollY": 516.5454545454546
},
{
"id": 13,
"expanded": true,
"name": "回想",
"order": 37,
"parentId": 0,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 14,
"expanded": true,
"name": "総統府3",
"order": 15,
"parentId": 8,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 15,
"expanded": true,
"name": "総統府2",
"order": 14,
"parentId": 8,
"scrollX": 842.1818181818182,
"scrollY": 534
},
{
"id": 16,
"expanded": false,
"name": "研究室",
"order": 12,
"parentId": 8,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 17,
"expanded": true,
"name": "拠点3",
"order": 3,
"parentId": 2,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 18,
"expanded": true,
"name": "拠点4",
"order": 4,
"parentId": 2,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 19,
"expanded": true,
"name": "記録ルーム",
"order": 10,
"parentId": 2,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 20,
"expanded": true,
"name": "E1",
"order": 41,
"parentId": 6,
"scrollX": 0,
"scrollY": 0
},
{
"id": 21,
"expanded": true,
"name": "E2",
"order": 6,
"parentId": 2,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 22,
"expanded": true,
"name": "E3",
"order": 32,
"parentId": 3,
"scrollX": 842.1818181818182,
"scrollY": 516.5454545454546
},
{
"id": 23,
"expanded": true,
"name": "E4",
"order": 7,
"parentId": 2,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 24,
"expanded": true,
"name": "E5",
"order": 17,
"parentId": 8,
"scrollX": 850.909090909091,
"scrollY": 547.0909090909091
},
{
"id": 25,
"expanded": true,
"name": "E5.5",
"order": 33,
"parentId": 3,
"scrollX": 772,
"scrollY": 481.5
},
{
"id": 26,
"expanded": true,
"name": "E6",
"order": 34,
"parentId": 3,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 27,
"expanded": true,
"name": "E7",
"order": 42,
"parentId": 6,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 28,
"expanded": true,
"name": "E8",
"order": 43,
"parentId": 6,
"scrollX": 842.1818181818182,
"scrollY": 516.5454545454546
},
{
"id": 29,
"expanded": true,
"name": "E10",
"order": 23,
"parentId": 1,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 30,
"expanded": true,
"name": "E9",
"order": 21,
"parentId": 1,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 31,
"expanded": false,
"name": "E9.5",
"order": 22,
"parentId": 1,
"scrollX": 772,
"scrollY": 481.5
},
{
"id": 32,
"expanded": true,
"name": "E11",
"order": 24,
"parentId": 1,
"scrollX": 842.1818181818182,
"scrollY": 590.7272727272727
},
{
"id": 33,
"expanded": true,
"name": "E12",
"order": 25,
"parentId": 1,
"scrollX": 850.909090909091,
"scrollY": 674.7272727272727
},
{
"id": 34,
"expanded": true,
"name": "e13",
"order": 40,
"parentId": 6,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 35,
"expanded": false,
"name": "e14",
"order": 39,
"parentId": 6,
"scrollX": 0,
"scrollY": 0
},
{
"id": 36,
"expanded": true,
"name": "まけイベ",
"order": 16,
"parentId": 14,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 37,
"expanded": false,
"name": "クリア後",
"order": 5,
"parentId": 2,
"scrollX": 772,
"scrollY": 473.5
},
{
"id": 38,
"expanded": false,
"name": "CG15",
"order": 18,
"parentId": 8,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 39,
"expanded": false,
"name": "cg16",
"order": 8,
"parentId": 2,
"scrollX": 772,
"scrollY": 473.5
},
{
"id": 40,
"expanded": false,
"name": "e18",
"order": 13,
"parentId": 8,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 41,
"expanded": false,
"name": "cg19-20",
"order": 9,
"parentId": 2,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 42,
"expanded": true,
"name": "オークション 道中",
"order": 36,
"parentId": 3,
"scrollX": 842.1818181818182,
"scrollY": 525.2727272727273
},
{
"id": 43,
"expanded": true,
"name": "拷問施設 道中",
"order": 20,
"parentId": 1,
"scrollX": 850.909090909091,
"scrollY": 674.7272727272727
},
{
"id": 44,
"expanded": true,
"name": "A市襲撃",
"order": 29,
"parentId": 3,
"scrollX": 842.1818181818182,
"scrollY": 1621.6363636363637
}
]

8025
data/Skills.json Normal file

File diff suppressed because it is too large Load diff

1073
data/States.json Normal file

File diff suppressed because it is too large Load diff

620
data/System.json Normal file
View file

@ -0,0 +1,620 @@
{
"advanced": {
"gameId": 60467654,
"screenWidth": 816,
"screenHeight": 624,
"uiAreaWidth": 816,
"uiAreaHeight": 624,
"numberFontFilename": "mplus-2p-bold-sub.woff",
"fallbackFonts": "Verdana, sans-serif",
"fontSize": 26,
"mainFontFilename": "mplus-1m-regular.woff",
"windowOpacity": 192
},
"airship": {
"bgm": {
"name": "Ship3",
"pan": 0,
"pitch": 100,
"volume": 90
},
"characterIndex": 3,
"characterName": "Vehicle",
"startMapId": 0,
"startX": 0,
"startY": 0
},
"armorTypes": [
"",
"一般防具",
"特殊防具",
"軽装防具",
"重装防具",
"小型盾",
"大型盾"
],
"attackMotions": [
{
"type": 0,
"weaponImageId": 0
},
{
"type": 1,
"weaponImageId": 1
},
{
"type": 1,
"weaponImageId": 2
},
{
"type": 1,
"weaponImageId": 3
},
{
"type": 1,
"weaponImageId": 4
},
{
"type": 1,
"weaponImageId": 5
},
{
"type": 1,
"weaponImageId": 6
},
{
"type": 2,
"weaponImageId": 7
},
{
"type": 2,
"weaponImageId": 8
},
{
"type": 2,
"weaponImageId": 9
},
{
"type": 0,
"weaponImageId": 10
},
{
"type": 0,
"weaponImageId": 11
},
{
"type": 0,
"weaponImageId": 12
}
],
"battleBgm": {
"name": "Battle2",
"pan": 0,
"pitch": 100,
"volume": 30
},
"battleback1Name": "Road1",
"battleback2Name": "Smoke",
"battlerHue": 0,
"battlerName": "Hi_monster",
"battleSystem": 0,
"boat": {
"bgm": {
"name": "Ship1",
"pan": 0,
"pitch": 100,
"volume": 90
},
"characterIndex": 0,
"characterName": "Vehicle",
"startMapId": 0,
"startX": 0,
"startY": 0
},
"currencyUnit": "",
"defeatMe": {
"name": "Horror",
"pan": 0,
"pitch": 100,
"volume": 30
},
"editMapId": 19,
"elements": [
"",
"物理",
"炎",
"氷",
"雷",
"水",
"土",
"風",
"光",
"闇"
],
"equipTypes": [
"",
"武器",
"盾",
"頭",
"身体",
"装飾品"
],
"gameTitle": "正義のサイボーグヒロインリョナ調教",
"gameoverMe": {
"name": "Horror",
"pan": 0,
"pitch": 100,
"volume": 30
},
"itemCategories": [
true,
true,
true,
true
],
"locale": "ja_JP",
"magicSkills": [
1
],
"menuCommands": [
true,
true,
true,
true,
true,
true
],
"optAutosave": false,
"optDisplayTp": false,
"optDrawTitle": false,
"optExtraExp": false,
"optFloorDeath": false,
"optFollowers": true,
"optKeyItemsNumber": false,
"optSideView": false,
"optSlipDeath": false,
"optTransparent": true,
"partyMembers": [
1
],
"ship": {
"bgm": {
"name": "Ship2",
"pan": 0,
"pitch": 100,
"volume": 90
},
"characterIndex": 1,
"characterName": "Vehicle",
"startMapId": 0,
"startX": 0,
"startY": 0
},
"skillTypes": [
"",
"特殊兵装",
"必殺技",
"何もしない"
],
"sounds": [
{
"name": "Cursor3",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Decision2",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Cancel2",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Buzzer1",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Equip1",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Save2",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Load2",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Battle1",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Run",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Attack3",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Damage4",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Collapse1",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Collapse2",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Collapse3",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Damage5",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Collapse4",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Recovery",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Miss",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Evasion1",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Evasion2",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Reflection",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Shop1",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Item3",
"pan": 0,
"pitch": 100,
"volume": 90
},
{
"name": "Item3",
"pan": 0,
"pitch": 100,
"volume": 90
}
],
"startMapId": 9,
"startX": 8,
"startY": 6,
"switches": [
"",
"",
"",
"",
"A市へ出発",
"潜入開始!",
"ブローカーへカチコミ",
"激突改造兵士",
"レジスタンスアタック",
"燃えるビル",
"爆破",
"逃走",
"救出作戦",
"救出中",
"強襲",
"死闘",
"リミッター解除",
"回想",
"総統府へ",
"総統登場",
"ミコト登場1",
"ミコト登場2",
"エスカダウン",
"総統",
"エピローグ",
"回想",
"E2",
"E3",
"E5",
"e5-2",
"ピクチャ非表示",
"開錠",
"e12",
"e17",
"cg20",
"最終戦",
"最終戦敗け",
"最終戦勝ち",
"シュウリトライ",
"汎用:追跡中止",
"汎用:追跡開始",
"孵化",
"",
"",
"",
""
],
"terms": {
"basic": [
"レベル",
"Lv",
"",
"HP",
"",
"EN",
"",
"TP",
"経験値",
"EXP"
],
"commands": [
"戦う",
"逃げる",
"攻撃",
"防御",
"アイテム",
"スキル",
"装備",
"ステータス",
"並び替え",
"セーブ",
"ゲーム終了",
"オプション",
"武器",
"防具",
"大事なもの",
"装備",
"最強装備",
"全て外す",
"ニューゲーム",
"コンティニュー",
null,
"タイトルへ",
"やめる",
null,
"購入する",
"売却する"
],
"params": [
"最大HP",
"最大EN",
"物理攻撃力",
"物理防御力",
"特殊攻撃力",
"特殊防御力",
"敏捷性",
"運",
"命中率",
"回避率"
],
"messages": {
"alwaysDash": "常時ダッシュ",
"commandRemember": "コマンド記憶",
"touchUI": "タッチUI",
"bgmVolume": "BGM 音量",
"bgsVolume": "BGS 音量",
"meVolume": "ME 音量",
"seVolume": "SE 音量",
"possession": "持っている数",
"expTotal": "現在の%1",
"expNext": "次の%1まで",
"saveMessage": "どのファイルにセーブしますか?",
"loadMessage": "どのファイルをロードしますか?",
"file": "ファイル",
"autosave": "オートセーブ",
"partyName": "%1たち",
"emerge": "%1が出現",
"preemptive": "%1は先手を取った",
"surprise": "%1は不意をつかれた",
"escapeStart": "%1は逃げ出した",
"escapeFailure": "しかし逃げることはできなかった!",
"victory": "%1の勝利",
"defeat": "%1は戦いに敗れた。",
"obtainExp": "%1 の%2を獲得",
"obtainGold": "お金を %1\\G 手に入れた!",
"obtainItem": "%1を手に入れた",
"levelUp": "%1は%2 %3 に上がった!",
"obtainSkill": "%1を覚えた",
"useItem": "%1は%2を使った",
"criticalToEnemy": "会心の一撃!!",
"criticalToActor": "痛恨の一撃!!",
"actorDamage": "%1は %2 のダメージを受けた!",
"actorRecovery": "%1の%2が %3 回復した!",
"actorGain": "%1の%2が %3 増えた!",
"actorLoss": "%1の%2が %3 減った!",
"actorDrain": "%1は%2を %3 奪われた!",
"actorNoDamage": "%1はダメージを受けていない",
"actorNoHit": "ミス! %1はダメージを受けていない",
"enemyDamage": "%1に %2 のダメージを与えた!",
"enemyRecovery": "%1の%2が %3 回復した!",
"enemyGain": "%1の%2が %3 増えた!",
"enemyLoss": "%1の%2が %3 減った!",
"enemyDrain": "%1の%2を %3 奪った!",
"enemyNoDamage": "%1にダメージを与えられない",
"enemyNoHit": "ミス! %1にダメージを与えられない",
"evasion": "%1は攻撃をかわした",
"magicEvasion": "%1は魔法を打ち消した",
"magicReflection": "%1は魔法を跳ね返した",
"counterAttack": "%1の反撃",
"substitute": "%1が%2をかばった",
"buffAdd": "%1の%2が上がった",
"debuffAdd": "%1の%2が下がった",
"buffRemove": "%1の%2が元に戻った",
"actionFailure": "%1には効かなかった"
}
},
"testBattlers": [
{
"actorId": 1,
"level": 15,
"equips": [
38,
0,
0,
0,
93
]
},
{
"actorId": 0,
"level": 5,
"equips": [
0,
0,
0,
3,
0
]
},
{
"actorId": 0,
"level": 1,
"equips": [
0,
0,
0,
0,
0
]
},
{
"actorId": 0,
"level": 1,
"equips": [
7,
0,
0,
20,
0
]
}
],
"testTroopId": 16,
"title1Name": "タイトルCG",
"title2Name": "",
"titleBgm": {
"name": "Battle7",
"pan": 0,
"pitch": 100,
"volume": 30
},
"titleCommandWindow": {
"background": 0,
"offsetX": 0,
"offsetY": 0
},
"variables": [
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""
],
"versionId": 83319921,
"victoryMe": {
"name": "Victory2",
"pan": 0,
"pitch": 100,
"volume": 30
},
"weaponTypes": [
"",
"短剣",
"剣",
"フレイル",
"斧",
"ムチ",
"杖",
"弓",
"クロスボウ",
"銃",
"爪",
"グローブ",
"槍"
],
"windowTone": [
0,
0,
0,
0
],
"tileSize": 48,
"hasEncryptedImages": true,
"hasEncryptedAudio": true,
"encryptionKey": "ab22fdc4dbfa64b525593717b145a4b8"
}

65691
data/Tilesets.json Normal file

File diff suppressed because it is too large Load diff

1515
data/Troops.json Normal file

File diff suppressed because it is too large Load diff

1713
data/Weapons.json Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1 @@
{"identity":"CharacterGeneratorSettings","version":"2.0.0","gender":"male","patterns":{"body":"p01","face":"p05","fronthair":"","rearhair":"","beard":"","ears":"p01","eyes":"p01","eyebrows":"p08","nose":"p01","mouth":"p01","facialmark":"p01","beastears":"","tail":"","wing":"","clothing":"p25","cloak":"","acca":"p07","accb":"","glasses":"p05"},"colors":{"#F9C19D":20,"#2C80CB":0,"#FCCB0A":0,"#B892C5":0,"#009296":0,"#D3CEC7":0,"#AE8682":0,"#FE9D1E":0,"#1C76D0":0,"#D9A404":0,"#D8AC00":0,"#A30708":0,"#D3CEC2":0,"#DA346E":0,"#A4C911":0,"#C78407":4,"#C0D3D2":16,"#4155B6":4,"#BA3B45":0,"#999999":1,"#CCBAD2":17,"#607E4B":0,"#E6D6BD":0,"#A7D6D6":0},"offsets":{"face":{"x":0,"y":0},"fronthair":{"x":0,"y":0},"rearhair":{"x":0,"y":0},"beard":{"x":0,"y":0},"ears":{"x":0,"y":0},"eyes":{"x":0,"y":0},"eyebrows":{"x":0,"y":0},"nose":{"x":0,"y":0},"mouth":{"x":0,"y":0},"facialmark":{"x":0,"y":0},"beastears":{"x":0,"y":0},"tail":{"x":0,"y":0},"wing":{"x":0,"y":0},"clothing":{"x":0,"y":0},"cloak":{"x":0,"y":0},"acca":{"x":0,"y":0},"accb":{"x":-1,"y":5},"glasses":{"x":0,"y":0}}}

12
img/package.json Normal file
View file

@ -0,0 +1,12 @@
{
"name": "rmmz-game",
"main": "index.html",
"chromium-args": "--force-color-profile=srgb",
"window": {
"title": "正義のサイボーグヒロインリョナ調教",
"width": 816,
"height": 624,
"position": "center",
"icon": "icon/icon.png"
}
}

View file

@ -0,0 +1,45 @@
[
{
"title": "回想シーン1",
"pictures": ["room1", "room2"],
"common_event_id": 1,
"switch_id": 1,
"thumbnail": "room1_thumbnail"
},
{
"title": "回想シーン2",
"pictures": ["background1_22", "background1_24"],
"common_event_id": 2,
"switch_id": 2
},
{
"title": "回想シーン3",
"pictures": ["background1_29"],
"common_event_id": 3,
"switch_id": 3
},
{
"title": "回想シーン4",
"pictures": ["background1_30"],
"common_event_id": 4,
"switch_id": 4
},
{
"title": "回想シーン5",
"pictures": ["background1_39", "background1_40"],
"common_event_id": 5,
"switch_id": 5
},
{
"title": "回想シーン6",
"pictures": ["background1_41"],
"common_event_id": 6,
"switch_id": 6
},
{
"title": "回想シーン7",
"pictures": ["background1_42"],
"common_event_id": 7,
"switch_id": 7
}
]

1
img/エスカ.json Normal file
View file

@ -0,0 +1 @@
{"identity":"CharacterGeneratorSettings","version":"2.0.0","gender":"female","patterns":{"body":"p01","face":"p01","fronthair":"p80042","rearhair":"p80038","beard":"","ears":"p01","eyes":"p01","eyebrows":"p01","nose":"p01","mouth":"p01","facialmark":"","beastears":"","tail":"","wing":"","clothing":"p80193","cloak":"","acca":"","accb":"","glasses":""},"colors":{"#F9C19D":0,"#2C80CB":0,"#FCCB0A":5,"#B892C5":0,"#009296":0,"#D3CEC7":0,"#AE8682":17,"#FE9D1E":15,"#1C76D0":17,"#D9A404":0,"#D8AC00":0,"#A30708":0,"#D3CEC2":0,"#DA346E":0,"#A4C911":0,"#C78407":0,"#C0D3D2":0,"#4155B6":0,"#BA3B45":0,"#999999":0,"#CCBAD2":0,"#607E4B":0,"#E6D6BD":0,"#A7D6D6":0},"offsets":{"face":{"x":0,"y":0},"fronthair":{"x":0,"y":0},"rearhair":{"x":0,"y":0},"beard":{"x":0,"y":0},"ears":{"x":0,"y":0},"eyes":{"x":0,"y":0},"eyebrows":{"x":0,"y":0},"nose":{"x":0,"y":0},"mouth":{"x":0,"y":0},"facialmark":{"x":0,"y":0},"beastears":{"x":0,"y":0},"tail":{"x":0,"y":0},"wing":{"x":0,"y":0},"clothing":{"x":0,"y":0},"cloak":{"x":0,"y":0},"acca":{"x":0,"y":0},"accb":{"x":0,"y":0},"glasses":{"x":0,"y":0}}}

View file

@ -0,0 +1 @@
{"identity":"CharacterGeneratorSettings","version":"2.0.0","gender":"kid","patterns":{"body":"p01","face":"p01","fronthair":"p18","rearhair":"p02","beard":"","ears":"p01","eyes":"p01","eyebrows":"p01","nose":"p01","mouth":"p01","facialmark":"","beastears":"","tail":"","wing":"","clothing":"p20","cloak":"","acca":"","accb":"","glasses":""},"colors":{"#F9C19D":0,"#2C80CB":0,"#FCCB0A":5,"#B892C5":0,"#009296":0,"#D3CEC7":0,"#AE8682":17,"#FE9D1E":17,"#1C76D0":1,"#D9A404":17,"#D8AC00":0,"#A30708":0,"#D3CEC2":0,"#DA346E":0,"#A4C911":0,"#C78407":0,"#C0D3D2":0,"#4155B6":0,"#BA3B45":0,"#999999":0,"#CCBAD2":0,"#607E4B":0,"#E6D6BD":0,"#A7D6D6":0},"offsets":{"face":{"x":0,"y":0},"fronthair":{"x":0,"y":0},"rearhair":{"x":0,"y":0},"beard":{"x":0,"y":0},"ears":{"x":0,"y":0},"eyes":{"x":0,"y":0},"eyebrows":{"x":0,"y":0},"nose":{"x":0,"y":0},"mouth":{"x":0,"y":0},"facialmark":{"x":0,"y":0},"beastears":{"x":0,"y":0},"tail":{"x":0,"y":0},"wing":{"x":0,"y":0},"clothing":{"x":0,"y":0},"cloak":{"x":0,"y":0},"acca":{"x":0,"y":0},"accb":{"x":0,"y":0},"glasses":{"x":0,"y":0}}}

1
img/シュウ.json Normal file
View file

@ -0,0 +1 @@
{"identity":"CharacterGeneratorSettings","version":"2.0.0","gender":"male","patterns":{"body":"p01","face":"p01","fronthair":"p02","rearhair":"p02","beard":"","ears":"p01","eyes":"p01","eyebrows":"p01","nose":"p01","mouth":"p01","facialmark":"","beastears":"","tail":"","wing":"","clothing":"p25","cloak":"","acca":"","accb":"p07","glasses":"p02"},"colors":{"#F9C19D":0,"#2C80CB":0,"#FCCB0A":23,"#B892C5":0,"#009296":0,"#D3CEC7":0,"#AE8682":17,"#FE9D1E":1,"#1C76D0":0,"#D9A404":0,"#D8AC00":0,"#A30708":0,"#D3CEC2":0,"#DA346E":0,"#A4C911":0,"#C78407":9,"#C0D3D2":1,"#4155B6":0,"#BA3B45":0,"#999999":17,"#CCBAD2":0,"#607E4B":0,"#E6D6BD":0,"#A7D6D6":0},"offsets":{"face":{"x":0,"y":0},"fronthair":{"x":0,"y":0},"rearhair":{"x":0,"y":0},"beard":{"x":0,"y":0},"ears":{"x":0,"y":0},"eyes":{"x":0,"y":0},"eyebrows":{"x":0,"y":0},"nose":{"x":0,"y":0},"mouth":{"x":0,"y":0},"facialmark":{"x":0,"y":0},"beastears":{"x":0,"y":0},"tail":{"x":0,"y":0},"wing":{"x":0,"y":0},"clothing":{"x":0,"y":0},"cloak":{"x":0,"y":0},"acca":{"x":0,"y":0},"accb":{"x":0,"y":0},"glasses":{"x":0,"y":0}}}

1
img/ハンバード.json Normal file
View file

@ -0,0 +1 @@
{"identity":"CharacterGeneratorSettings","version":"2.0.0","gender":"male","patterns":{"body":"p01","face":"p01","fronthair":"","rearhair":"p22","beard":"p03","ears":"p01","eyes":"p25","eyebrows":"p01","nose":"p07","mouth":"p05","facialmark":"","beastears":"","tail":"","wing":"","clothing":"p24","cloak":"","acca":"","accb":"","glasses":""},"colors":{"#F9C19D":16,"#2C80CB":0,"#FCCB0A":6,"#B892C5":0,"#009296":0,"#D3CEC7":0,"#AE8682":15,"#FE9D1E":15,"#1C76D0":15,"#D9A404":14,"#D8AC00":15,"#A30708":0,"#D3CEC2":0,"#DA346E":0,"#A4C911":0,"#C78407":0,"#C0D3D2":0,"#4155B6":0,"#BA3B45":0,"#999999":0,"#CCBAD2":0,"#607E4B":0,"#E6D6BD":0,"#A7D6D6":0},"offsets":{"face":{"x":0,"y":0},"fronthair":{"x":0,"y":0},"rearhair":{"x":0,"y":0},"beard":{"x":0,"y":0},"ears":{"x":0,"y":0},"eyes":{"x":0,"y":0},"eyebrows":{"x":0,"y":0},"nose":{"x":0,"y":0},"mouth":{"x":0,"y":0},"facialmark":{"x":0,"y":0},"beastears":{"x":0,"y":0},"tail":{"x":0,"y":0},"wing":{"x":0,"y":0},"clothing":{"x":0,"y":0},"cloak":{"x":0,"y":0},"acca":{"x":0,"y":0},"accb":{"x":0,"y":0},"glasses":{"x":0,"y":0}}}

1
img/ヒュドラ.json Normal file
View file

@ -0,0 +1 @@
{"identity":"CharacterGeneratorSettings","version":"2.0.0","gender":"male","patterns":{"body":"p01","face":"p01","fronthair":"","rearhair":"","beard":"","ears":"p01","eyes":"p01","eyebrows":"p01","nose":"p01","mouth":"p01","facialmark":"","beastears":"","tail":"","wing":"","clothing":"p24","cloak":"","acca":"","accb":"","glasses":"p05"},"colors":{"#F9C19D":16,"#2C80CB":0,"#FCCB0A":23,"#B892C5":0,"#009296":0,"#D3CEC7":0,"#AE8682":15,"#FE9D1E":3,"#1C76D0":5,"#D9A404":15,"#D8AC00":1,"#A30708":0,"#D3CEC2":0,"#DA346E":0,"#A4C911":0,"#C78407":0,"#C0D3D2":0,"#4155B6":0,"#BA3B45":0,"#999999":12,"#CCBAD2":12,"#607E4B":0,"#E6D6BD":0,"#A7D6D6":0},"offsets":{"face":{"x":0,"y":0},"fronthair":{"x":0,"y":0},"rearhair":{"x":0,"y":0},"beard":{"x":0,"y":0},"ears":{"x":0,"y":0},"eyes":{"x":0,"y":0},"eyebrows":{"x":0,"y":0},"nose":{"x":0,"y":0},"mouth":{"x":0,"y":0},"facialmark":{"x":0,"y":0},"beastears":{"x":0,"y":0},"tail":{"x":0,"y":0},"wing":{"x":0,"y":0},"clothing":{"x":0,"y":0},"cloak":{"x":0,"y":0},"acca":{"x":0,"y":0},"accb":{"x":0,"y":0},"glasses":{"x":0,"y":0}}}

1
img/ミコト.json Normal file
View file

@ -0,0 +1 @@
{"identity":"CharacterGeneratorSettings","version":"2.0.0","gender":"female","patterns":{"body":"p01","face":"p01","fronthair":"p03","rearhair":"p19","beard":"","ears":"p01","eyes":"p01","eyebrows":"p01","nose":"p01","mouth":"p01","facialmark":"p04","beastears":"","tail":"","wing":"","clothing":"p80194","cloak":"","acca":"p06","accb":"","glasses":""},"colors":{"#F9C19D":0,"#2C80CB":0,"#FCCB0A":5,"#B892C5":0,"#009296":0,"#D3CEC7":0,"#AE8682":5,"#FE9D1E":17,"#1C76D0":17,"#D9A404":0,"#D8AC00":0,"#A30708":0,"#D3CEC2":17,"#DA346E":0,"#A4C911":0,"#C78407":0,"#C0D3D2":0,"#4155B6":0,"#BA3B45":0,"#999999":0,"#CCBAD2":0,"#607E4B":0,"#E6D6BD":0,"#A7D6D6":0},"offsets":{"face":{"x":0,"y":0},"fronthair":{"x":0,"y":0},"rearhair":{"x":0,"y":0},"beard":{"x":0,"y":0},"ears":{"x":0,"y":0},"eyes":{"x":0,"y":0},"eyebrows":{"x":0,"y":0},"nose":{"x":0,"y":0},"mouth":{"x":0,"y":0},"facialmark":{"x":0,"y":0},"beastears":{"x":0,"y":0},"tail":{"x":0,"y":0},"wing":{"x":0,"y":0},"clothing":{"x":0,"y":0},"cloak":{"x":0,"y":0},"acca":{"x":0,"y":0},"accb":{"x":0,"y":0},"glasses":{"x":0,"y":0}}}

View file

@ -0,0 +1 @@
{"identity":"CharacterGeneratorSettings","version":"2.0.0","gender":"kid","patterns":{"body":"p01","face":"p01","fronthair":"p07","rearhair":"p10","beard":"","ears":"p01","eyes":"p01","eyebrows":"p01","nose":"p01","mouth":"p01","facialmark":"","beastears":"","tail":"","wing":"","clothing":"p20","cloak":"","acca":"","accb":"","glasses":""},"colors":{"#F9C19D":0,"#2C80CB":0,"#FCCB0A":5,"#B892C5":0,"#009296":0,"#D3CEC7":0,"#AE8682":17,"#FE9D1E":17,"#1C76D0":1,"#D9A404":17,"#D8AC00":0,"#A30708":0,"#D3CEC2":0,"#DA346E":0,"#A4C911":0,"#C78407":0,"#C0D3D2":0,"#4155B6":0,"#BA3B45":0,"#999999":0,"#CCBAD2":0,"#607E4B":0,"#E6D6BD":0,"#A7D6D6":0},"offsets":{"face":{"x":0,"y":0},"fronthair":{"x":0,"y":0},"rearhair":{"x":0,"y":0},"beard":{"x":0,"y":0},"ears":{"x":0,"y":0},"eyes":{"x":0,"y":0},"eyebrows":{"x":0,"y":0},"nose":{"x":0,"y":0},"mouth":{"x":0,"y":0},"facialmark":{"x":0,"y":0},"beastears":{"x":0,"y":0},"tail":{"x":0,"y":0},"wing":{"x":0,"y":0},"clothing":{"x":0,"y":0},"cloak":{"x":0,"y":0},"acca":{"x":0,"y":0},"accb":{"x":0,"y":0},"glasses":{"x":0,"y":0}}}

1
img/帝国兵.json Normal file
View file

@ -0,0 +1 @@
{"identity":"CharacterGeneratorSettings","version":"2.0.0","gender":"male","patterns":{"body":"p01","face":"p05","fronthair":"","rearhair":"","beard":"","ears":"p01","eyes":"p01","eyebrows":"p08","nose":"p01","mouth":"p01","facialmark":"p01","beastears":"","tail":"","wing":"","clothing":"p25","cloak":"","acca":"p07","accb":"","glasses":"p05"},"colors":{"#F9C19D":20,"#2C80CB":0,"#FCCB0A":0,"#B892C5":0,"#009296":0,"#D3CEC7":0,"#AE8682":0,"#FE9D1E":0,"#1C76D0":0,"#D9A404":0,"#D8AC00":0,"#A30708":0,"#D3CEC2":0,"#DA346E":0,"#A4C911":0,"#C78407":4,"#C0D3D2":16,"#4155B6":4,"#BA3B45":0,"#999999":1,"#CCBAD2":17,"#607E4B":0,"#E6D6BD":0,"#A7D6D6":0},"offsets":{"face":{"x":0,"y":0},"fronthair":{"x":0,"y":0},"rearhair":{"x":0,"y":0},"beard":{"x":0,"y":0},"ears":{"x":0,"y":0},"eyes":{"x":0,"y":0},"eyebrows":{"x":0,"y":0},"nose":{"x":0,"y":0},"mouth":{"x":0,"y":0},"facialmark":{"x":0,"y":0},"beastears":{"x":0,"y":0},"tail":{"x":0,"y":0},"wing":{"x":0,"y":0},"clothing":{"x":0,"y":0},"cloak":{"x":0,"y":0},"acca":{"x":0,"y":0},"accb":{"x":-1,"y":5},"glasses":{"x":0,"y":0}}}

1
img/強化帝国兵.json Normal file
View file

@ -0,0 +1 @@
{"identity":"CharacterGeneratorSettings","version":"2.0.0","gender":"female","patterns":{"body":"p01","face":"p01","fronthair":"","rearhair":"","beard":"","ears":"p01","eyes":"p01","eyebrows":"p01","nose":"p01","mouth":"p01","facialmark":"","beastears":"","tail":"","wing":"","clothing":"p80193","cloak":"","acca":"","accb":"","glasses":"p05"},"colors":{"#F9C19D":20,"#2C80CB":0,"#FCCB0A":0,"#B892C5":0,"#009296":0,"#D3CEC7":0,"#AE8682":12,"#FE9D1E":12,"#1C76D0":12,"#D9A404":0,"#D8AC00":0,"#A30708":0,"#D3CEC2":0,"#DA346E":0,"#A4C911":0,"#C78407":0,"#C0D3D2":0,"#4155B6":0,"#BA3B45":0,"#999999":12,"#CCBAD2":12,"#607E4B":0,"#E6D6BD":0,"#A7D6D6":0},"offsets":{"face":{"x":0,"y":0},"fronthair":{"x":0,"y":0},"rearhair":{"x":0,"y":0},"beard":{"x":0,"y":0},"ears":{"x":0,"y":0},"eyes":{"x":0,"y":0},"eyebrows":{"x":0,"y":0},"nose":{"x":0,"y":0},"mouth":{"x":0,"y":0},"facialmark":{"x":0,"y":0},"beastears":{"x":0,"y":0},"tail":{"x":0,"y":0},"wing":{"x":0,"y":0},"clothing":{"x":0,"y":0},"cloak":{"x":0,"y":0},"acca":{"x":0,"y":0},"accb":{"x":0,"y":0},"glasses":{"x":0,"y":0}}}

View file

@ -0,0 +1 @@
{"identity":"CharacterGeneratorSettings","version":"2.0.0","gender":"male","patterns":{"body":"p01","face":"p01","fronthair":"","rearhair":"","beard":"","ears":"p01","eyes":"p01","eyebrows":"p01","nose":"p01","mouth":"p01","facialmark":"","beastears":"","tail":"","wing":"","clothing":"p25","cloak":"","acca":"","accb":"","glasses":"p05"},"colors":{"#F9C19D":19,"#2C80CB":0,"#FCCB0A":0,"#B892C5":0,"#009296":0,"#D3CEC7":0,"#AE8682":17,"#FE9D1E":17,"#1C76D0":17,"#D9A404":17,"#D8AC00":0,"#A30708":0,"#D3CEC2":0,"#DA346E":0,"#A4C911":0,"#C78407":0,"#C0D3D2":0,"#4155B6":0,"#BA3B45":0,"#999999":0,"#CCBAD2":0,"#607E4B":0,"#E6D6BD":0,"#A7D6D6":0},"offsets":{"face":{"x":0,"y":0},"fronthair":{"x":0,"y":0},"rearhair":{"x":0,"y":0},"beard":{"x":0,"y":0},"ears":{"x":0,"y":0},"eyes":{"x":0,"y":0},"eyebrows":{"x":0,"y":0},"nose":{"x":0,"y":0},"mouth":{"x":0,"y":0},"facialmark":{"x":0,"y":0},"beastears":{"x":0,"y":0},"tail":{"x":0,"y":0},"wing":{"x":0,"y":0},"clothing":{"x":0,"y":0},"cloak":{"x":0,"y":0},"acca":{"x":0,"y":0},"accb":{"x":0,"y":0},"glasses":{"x":0,"y":0}}}

View file

@ -0,0 +1 @@
{"identity":"CharacterGeneratorSettings","version":"2.0.0","gender":"kid","patterns":{"body":"p01","face":"p01","fronthair":"p18","rearhair":"p11","beard":"","ears":"p01","eyes":"p01","eyebrows":"p01","nose":"p01","mouth":"p01","facialmark":"","beastears":"","tail":"","wing":"","clothing":"p22","cloak":"","acca":"","accb":"","glasses":""},"colors":{"#F9C19D":0,"#2C80CB":0,"#FCCB0A":22,"#B892C5":0,"#009296":0,"#D3CEC7":0,"#AE8682":17,"#FE9D1E":4,"#1C76D0":4,"#D9A404":4,"#D8AC00":0,"#A30708":0,"#D3CEC2":0,"#DA346E":0,"#A4C911":0,"#C78407":0,"#C0D3D2":0,"#4155B6":0,"#BA3B45":0,"#999999":0,"#CCBAD2":0,"#607E4B":0,"#E6D6BD":0,"#A7D6D6":0},"offsets":{"face":{"x":0,"y":0},"fronthair":{"x":0,"y":0},"rearhair":{"x":0,"y":0},"beard":{"x":0,"y":0},"ears":{"x":0,"y":0},"eyes":{"x":0,"y":0},"eyebrows":{"x":0,"y":0},"nose":{"x":0,"y":0},"mouth":{"x":0,"y":0},"facialmark":{"x":0,"y":0},"beastears":{"x":0,"y":0},"tail":{"x":0,"y":0},"wing":{"x":0,"y":0},"clothing":{"x":0,"y":0},"cloak":{"x":0,"y":0},"acca":{"x":0,"y":0},"accb":{"x":0,"y":0},"glasses":{"x":0,"y":0}}}

253
js/libs/effekseer.min.js vendored Normal file

File diff suppressed because one or more lines are too long

7
js/libs/localforage.min.js vendored Normal file

File diff suppressed because one or more lines are too long

1
js/libs/pako.min.js vendored Normal file

File diff suppressed because one or more lines are too long

42609
js/libs/pixi.js Normal file

File diff suppressed because it is too large Load diff

6
js/libs/vorbisdecoder.js Normal file

File diff suppressed because one or more lines are too long

161
js/main.js Normal file
View file

@ -0,0 +1,161 @@
//=============================================================================
// main.js v1.5.0
//=============================================================================
const scriptUrls = [
"js/libs/pixi.js",
"js/libs/pako.min.js",
"js/libs/localforage.min.js",
"js/libs/effekseer.min.js",
"js/libs/vorbisdecoder.js",
"js/rmmz_core.js",
"js/rmmz_managers.js",
"js/rmmz_objects.js",
"js/rmmz_scenes.js",
"js/rmmz_sprites.js",
"js/rmmz_windows.js",
"js/plugins.js"
];
const effekseerWasmUrl = "js/libs/effekseer.wasm";
class Main {
constructor() {
this.xhrSucceeded = false;
this.loadCount = 0;
this.error = null;
}
run() {
this.showLoadingSpinner();
this.testXhr();
this.hookNwjsClose();
this.loadMainScripts();
}
showLoadingSpinner() {
const loadingSpinner = document.createElement("div");
const loadingSpinnerImage = document.createElement("div");
loadingSpinner.id = "loadingSpinner";
loadingSpinnerImage.id = "loadingSpinnerImage";
loadingSpinner.appendChild(loadingSpinnerImage);
document.body.appendChild(loadingSpinner);
}
eraseLoadingSpinner() {
const loadingSpinner = document.getElementById("loadingSpinner");
if (loadingSpinner) {
document.body.removeChild(loadingSpinner);
}
}
testXhr() {
const xhr = new XMLHttpRequest();
xhr.open("GET", document.currentScript.src);
xhr.onload = () => (this.xhrSucceeded = true);
xhr.send();
}
hookNwjsClose() {
// [Note] When closing the window, the NW.js process sometimes does
// not terminate properly. This code is a workaround for that.
if (typeof nw === "object") {
nw.Window.get().on("close", () => nw.App.quit());
}
}
loadMainScripts() {
for (const url of scriptUrls) {
const script = document.createElement("script");
script.type = "text/javascript";
script.src = url;
script.async = false;
script.defer = true;
script.onload = this.onScriptLoad.bind(this);
script.onerror = this.onScriptError.bind(this);
script._url = url;
document.body.appendChild(script);
}
this.numScripts = scriptUrls.length;
window.addEventListener("load", this.onWindowLoad.bind(this));
window.addEventListener("error", this.onWindowError.bind(this));
}
onScriptLoad() {
if (++this.loadCount === this.numScripts) {
PluginManager.setup($plugins);
}
}
onScriptError(e) {
this.printError("Failed to load", e.target._url);
}
printError(name, message) {
this.eraseLoadingSpinner();
if (!document.getElementById("errorPrinter")) {
const errorPrinter = document.createElement("div");
errorPrinter.id = "errorPrinter";
errorPrinter.innerHTML = this.makeErrorHtml(name, message);
document.body.appendChild(errorPrinter);
}
}
makeErrorHtml(name, message) {
const nameDiv = document.createElement("div");
const messageDiv = document.createElement("div");
nameDiv.id = "errorName";
messageDiv.id = "errorMessage";
nameDiv.innerHTML = name;
messageDiv.innerHTML = message;
return nameDiv.outerHTML + messageDiv.outerHTML;
}
onWindowLoad() {
if (!this.xhrSucceeded) {
const message = "Your browser does not allow to read local files.";
this.printError("Error", message);
} else if (this.isPathRandomized()) {
const message = "Please move the Game.app to a different folder.";
this.printError("Error", message);
} else if (this.error) {
this.printError(this.error.name, this.error.message);
} else {
this.initEffekseerRuntime();
}
}
onWindowError(event) {
if (!this.error) {
this.error = event.error;
}
}
isPathRandomized() {
// [Note] We cannot save the game properly when Gatekeeper Path
// Randomization is in effect.
return (
typeof process === "object" &&
process.mainModule.filename.startsWith("/private/var")
);
}
initEffekseerRuntime() {
const onLoad = this.onEffekseerLoad.bind(this);
const onError = this.onEffekseerError.bind(this);
effekseer.initRuntime(effekseerWasmUrl, onLoad, onError);
}
onEffekseerLoad() {
this.eraseLoadingSpinner();
SceneManager.run(Scene_Boot);
}
onEffekseerError() {
this.printError("Failed to load", effekseerWasmUrl);
}
}
const main = new Main();
main.run();
//-----------------------------------------------------------------------------

13
js/plugins.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

105
js/plugins/AltMenuScreen.js Normal file
View file

@ -0,0 +1,105 @@
//=============================================================================
// RPG Maker MZ - Alternative Menu Screen
//=============================================================================
/*:
* @target MZ
* @plugindesc Alternative menu screen layout.
* @author Yoji Ojima
*
* @help AltMenuScreen.js
*
* This plugin changes the layout of the menu screen.
* It puts the commands on the top and the status on the bottom.
*
* It does not provide plugin commands.
*/
/*:ja
* @target MZ
* @plugindesc メニュー画面のレイアウトを変更します
* @author Yoji Ojima
*
* @help AltMenuScreen.js
*
* このプラグインはメニュー画面のレイアウトを変更します
* コマンドを上側にステータスを下側に配置します
*
* プラグインコマンドはありません
*/
(() => {
Scene_MenuBase.prototype.commandWindowHeight = function () {
return this.calcWindowHeight(2, true);
};
Scene_MenuBase.prototype.goldWindowHeight = function () {
return this.calcWindowHeight(1, true);
};
Scene_Menu.prototype.commandWindowRect = function () {
const ww = Graphics.boxWidth;
const wh = this.commandWindowHeight();
const wx = 0;
const wy = this.mainAreaTop();
return new Rectangle(wx, wy, ww, wh);
};
Scene_Menu.prototype.statusWindowRect = function () {
const h1 = this.commandWindowHeight();
const h2 = this.goldWindowHeight();
const ww = Graphics.boxWidth;
const wh = this.mainAreaHeight() - h1 - h2;
const wx = 0;
const wy = this.mainAreaTop() + this.commandWindowHeight();
return new Rectangle(wx, wy, ww, wh);
};
Scene_ItemBase.prototype.actorWindowRect = function () {
const rect = Scene_Menu.prototype.statusWindowRect();
rect.y = this.mainAreaBottom() - rect.height;
return rect;
};
Window_MenuCommand.prototype.maxCols = function () {
return 4;
};
Window_MenuCommand.prototype.numVisibleRows = function () {
return 2;
};
Window_MenuStatus.prototype.maxCols = function () {
return 4;
};
Window_MenuStatus.prototype.numVisibleRows = function () {
return 1;
};
Window_MenuStatus.prototype.drawItemImage = function (index) {
const actor = this.actor(index);
const rect = this.itemRectWithPadding(index);
const w = Math.min(rect.width, 144);
const h = Math.min(rect.height, 144);
const lineHeight = this.lineHeight();
this.changePaintOpacity(actor.isBattleMember());
this.drawActorFace(actor, rect.x, rect.y + lineHeight * 2, w, h);
this.changePaintOpacity(true);
};
Window_MenuStatus.prototype.drawItemStatus = function (index) {
const actor = this.actor(index);
const rect = this.itemRectWithPadding(index);
const x = rect.x;
const y = rect.y;
const width = rect.width;
const bottom = y + rect.height;
const lineHeight = this.lineHeight();
this.drawActorName(actor, x, y + lineHeight * 0, width);
this.drawActorLevel(actor, x, y + lineHeight * 1, width);
this.drawActorClass(actor, x, bottom - lineHeight * 4, width);
this.placeBasicGauges(actor, x, bottom - lineHeight * 3, width);
this.drawActorIcons(actor, x, bottom - lineHeight * 1, width);
};
})();

126
js/plugins/AltSaveScreen.js Normal file
View file

@ -0,0 +1,126 @@
//=============================================================================
// RPG Maker MZ - Alternative Save Screen
//=============================================================================
/*:
* @target MZ
* @plugindesc Alternative save/load screen layout.
* @author Yoji Ojima
*
* @help AltSaveScreen.js
*
* This plugin changes the layout of the save/load screen.
* It puts the file list on the top and the details on the bottom.
*
* It does not provide plugin commands.
*/
/*:ja
* @target MZ
* @plugindesc セーブロード画面のレイアウトを変更します
* @author Yoji Ojima
*
* @help AltSaveScreen.js
*
* このプラグインはセーブロード画面のレイアウトを変更します
* ファイル一覧を上側に詳細を下側に配置します
*
* プラグインコマンドはありません
*/
(() => {
const _Scene_File_create = Scene_File.prototype.create;
Scene_File.prototype.create = function () {
_Scene_File_create.apply(this, arguments);
this._listWindow.height = this._listWindow.fittingHeight(3);
const x = 0;
const y = this._listWindow.y + this._listWindow.height;
const width = Graphics.boxWidth;
const height = Graphics.boxHeight - y;
const rect = new Rectangle(x, y, width, height);
const statusWindow = new Window_SavefileStatus(rect);
this._listWindow.mzkp_statusWindow = statusWindow;
this.addWindow(statusWindow);
};
const _Scene_File_start = Scene_File.prototype.start;
Scene_File.prototype.start = function () {
_Scene_File_start.apply(this, arguments);
this._listWindow.ensureCursorVisible();
this._listWindow.callUpdateHelp();
};
Window_SavefileList.prototype.windowWidth = function () {
return Graphics.boxWidth;
};
Window_SavefileList.prototype.maxCols = function () {
return 4;
};
Window_SavefileList.prototype.itemHeight = function () {
return this.lineHeight() * 2 + 16;
};
const _Window_SavefileList_callUpdateHelp =
Window_SavefileList.prototype.callUpdateHelp;
Window_SavefileList.prototype.callUpdateHelp = function () {
_Window_SavefileList_callUpdateHelp.apply(this, arguments);
if (this.active && this.mzkp_statusWindow) {
this.mzkp_statusWindow.setSavefileId(this.savefileId());
}
};
function Window_SavefileStatus() {
this.initialize.apply(this, arguments);
}
Window_SavefileStatus.prototype = Object.create(Window_Base.prototype);
Window_SavefileStatus.prototype.constructor = Window_SavefileStatus;
Window_SavefileStatus.prototype.initialize = function (rect) {
Window_Base.prototype.initialize.call(this, rect);
this._savefileId = 1;
};
Window_SavefileStatus.prototype.setSavefileId = function (id) {
this._savefileId = id;
this.refresh();
};
Window_SavefileStatus.prototype.refresh = function () {
const info = DataManager.savefileInfo(this._savefileId);
const rect = this.contents.rect;
this.contents.clear();
this.resetTextColor();
this.drawTitle(this._savefileId, rect.x, rect.y);
if (info) {
this.drawContents(info, rect);
}
};
Window_SavefileStatus.prototype.drawTitle = function (savefileId, x, y) {
if (savefileId === 0) {
this.drawText(TextManager.autosave, x, y, 180);
} else {
this.drawText(TextManager.file + " " + savefileId, x, y, 180);
}
};
Window_SavefileStatus.prototype.drawContents = function (info, rect) {
const bottom = rect.y + rect.height;
const playtimeY = bottom - this.lineHeight();
this.drawText(info.title, rect.x + 192, rect.y, rect.width - 192);
this.drawPartyfaces(info.faces, rect.x, bottom - 144);
this.drawText(info.playtime, rect.x, playtimeY, rect.width, "right");
};
Window_SavefileStatus.prototype.drawPartyfaces = function (faces, x, y) {
if (faces) {
for (let i = 0; i < faces.length; i++) {
const data = faces[i];
this.drawFace(data[0], data[1], x + i * 150, y);
}
}
};
})();

106
js/plugins/ButtonPicture.js Normal file
View file

@ -0,0 +1,106 @@
//=============================================================================
// RPG Maker MZ - Button Picture
//=============================================================================
/*:
* @target MZ
* @plugindesc Makes a picture clickable.
* @author Yoji Ojima
*
* @help ButtonPicture.js
*
* This plugin provides a command to call a common event when a picture is
* clicked.
*
* Use it in the following procedure.
* 1. Execute "Show Picture" to display your button image.
* 2. Call the plugin command "Set Button Picture".
*
* @command set
* @text Set Button Picture
* @desc Makes the specified picture clickable.
*
* @arg pictureId
* @type number
* @min 1
* @max 100
* @default 1
* @text Picture Number
* @desc Control number of the picture.
*
* @arg commonEventId
* @type common_event
* @default 1
* @text Common Event
* @desc Common event to call when the picture is clicked.
*/
/*:ja
* @target MZ
* @plugindesc ピクチャをクリック可能にします
* @author Yoji Ojima
*
* @help ButtonPicture.js
*
* このプラグインはピクチャのクリック時にコモンイベントを呼び出すコマンドを
* 提供します
*
* 次の手順で使用してください
* 1. ピクチャの表示を実行してボタン画像を表示します
* 2. プラグインコマンドボタンピクチャの設定を呼び出します
*
* @command set
* @text ボタンピクチャの設定
* @desc 指定したピクチャをクリック可能にします
*
* @arg pictureId
* @type number
* @min 1
* @max 100
* @default 1
* @text ピクチャ番号
* @desc ピクチャの管理番号です
*
* @arg commonEventId
* @type common_event
* @default 1
* @text コモンイベント
* @desc ピクチャがクリックされた時に呼び出すコモンイベントです
*/
(() => {
const pluginName = "ButtonPicture";
PluginManager.registerCommand(pluginName, "set", args => {
const pictureId = Number(args.pictureId);
const commonEventId = Number(args.commonEventId);
const picture = $gameScreen.picture(pictureId);
if (picture) {
picture.mzkp_commonEventId = commonEventId;
}
});
Sprite_Picture.prototype.isClickEnabled = function () {
const picture = this.picture();
return picture && picture.mzkp_commonEventId && !$gameMessage.isBusy();
};
Sprite_Picture.prototype.onClick = function () {
$gameTemp.reserveCommonEvent(this.picture().mzkp_commonEventId);
};
Spriteset_Base.prototype.mzkp_isAnyPicturePressed = function () {
return this._pictureContainer.children.some(sprite =>
sprite.isPressed()
);
};
const _Scene_Map_isAnyButtonPressed =
Scene_Map.prototype.isAnyButtonPressed;
Scene_Map.prototype.isAnyButtonPressed = function () {
return (
_Scene_Map_isAnyButtonPressed.apply(this, arguments) ||
this._spriteset.mzkp_isAnyPicturePressed()
);
};
})();

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,304 @@
//=============================================================================
// CustomizeConfigDefault.js
// ----------------------------------------------------------------------------
// (C)2015 Triacontane
// This plugin is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.2.2 2021/12/22 1.2.1の修正でローカル実行時にデフォルト値が反映されなくなる問題を修正
// 1.2.1 2021/12/21 アツマール等Webにあげたときにオプションのデフォルト値が反映されない問題を修正
// 1.2.0 2021/03/01 MZで動作するよう修正、リファクタリング
// 1.1.1 2020/09/13 Mano_InputConfig.jsと併用したとき、Option項目を消していると表示不整合が発生する競合を修正
// 1.1.0 2016/08/01 項目自体を非表示にする機能を追加しました。
// 1.0.3 2016/06/22 多言語対応
// 1.0.2 2016/01/17 競合対策
// 1.0.1 2015/11/01 既存コードの再定義方法を修正(内容に変化なし)
// 1.0.0 2015/11/01 初版
// ----------------------------------------------------------------------------
// [Blog] : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================
/*:
* @plugindesc Setting default value for Options
* @target MZ
* @url https://github.com/triacontane/RPGMakerMV/tree/mz_master/CustomizeConfigDefault.js
* @base PluginCommonBase
* @author triacontane
*
* @param AlwaysDash
* @desc Always dash(ON/OFF)
* @default false
* @type boolean
*
* @param CommandRemember
* @desc Command remember(ON/OFF)
* @default false
* @type boolean
*
* @param TouchUi
* @desc Touch UI(ON/OFF)
* @default true
* @type boolean
*
* @param BgmVolume
* @desc BGM Volume(0-100)
* @default 100
* @max 100
* @type number
*
* @param BgsVolume
* @desc BGS Volume(0-100)
* @default 100
* @max 100
* @type number
*
* @param MeVolume
* @desc ME Volume(0-100)
* @default 100
* @max 100
* @type number
*
* @param SeVolume
* @desc SE Volume(0-100)
* @default 100
* @max 100
* @type number
*
* @param EraseAlwaysDash
* @desc Erase AlwaysDash Option(ON/OFF)
* @default false
* @type boolean
*
* @param EraseCommandRemember
* @desc Erase CommandRemember Option(ON/OFF)
* @default false
* @type boolean
*
* @param EraseTouchUi
* @desc Erase TouchUI Option(ON/OFF)
* @default false
* @type boolean
*
* @param EraseBgmVolume
* @desc Erase BgmVolume Option(ON/OFF)
* @default false
* @type boolean
*
* @param EraseBgsVolume
* @desc Erase BgsVolume Option(ON/OFF)
* @default false
* @type boolean
*
* @param EraseMeVolume
* @desc Erase MeVolume Option(ON/OFF)
* @default false
* @type boolean
*
* @param EraseSeVolume
* @desc Erase SeVolume Option(ON/OFF)
* @default false
* @type boolean
*
* @help Setting default value for Options.
*
* This plugin is released under the MIT License.
*/
/*:ja
* @plugindesc オプションデフォルト値設定プラグイン
* @target MZ
* @url https://github.com/triacontane/RPGMakerMV/tree/mz_master/CustomizeConfigDefault.js
* @base PluginCommonBase
* @author トリアコンタン
*
* @param AlwaysDash
* @text 常時ダッシュ
* @desc 常にダッシュするShiftキーを押している場合のみ歩行(ON/OFF)
* @default false
* @type boolean
*
* @param CommandRemember
* @text コマンド記憶
* @desc 選択したコマンドを記憶する(ON/OFF)
* @default false
* @type boolean
*
* @param TouchUi
* @text タッチUi
* @desc タッチ用のボタン等をメニュー画面に表示する(ON/OFF)
* @default true
* @type boolean
*
* @param BgmVolume
* @text BGM音量
* @desc BGMの音量0-100
* @default 100
* @max 100
* @type number
*
* @param BgsVolume
* @text BGS音量
* @desc BGSの音量0-100
* @default 100
* @max 100
* @type number
*
* @param MeVolume
* @text ME音量
* @desc MEの音量0-100
* @default 100
* @max 100
* @type number
*
* @param SeVolume
* @text SE音量
* @desc SEの音量0-100
* @default 100
* @max 100
* @type number
*
* @param EraseAlwaysDash
* @text 常時ダッシュ消去
* @desc 常時ダッシュの項目を非表示にする(ON/OFF)
* @default false
* @type boolean
*
* @param EraseCommandRemember
* @text コマンド記憶消去
* @desc コマンド記憶の項目を非表示にする(ON/OFF)
* @default false
* @type boolean
*
* @param EraseTouchUi
* @text タッチUI消去
* @desc タッチUIの項目を非表示にする(ON/OFF)
* @default false
* @type boolean
*
* @param EraseBgmVolume
* @text BGM音量消去
* @desc BGM音量の項目を非表示にする(ON/OFF)
* @default false
* @type boolean
*
* @param EraseBgsVolume
* @text BGS音量消去
* @desc BGS音量の項目を非表示にする(ON/OFF)
* @default false
* @type boolean
*
* @param EraseMeVolume
* @text ME音量消去
* @desc ME音量の項目を非表示にする(ON/OFF)
* @default false
* @type boolean
*
* @param EraseSeVolume
* @text SE音量消去
* @desc SE音量の項目を非表示にする(ON/OFF)
* @default false
* @type boolean
*
* @help オプション画面で設定可能な項目のデフォルト値を指定した値に変更します
* 例えば初回から常時ダッシュをONにしておけば
* プレイヤーが設定を変更する手間を省くことができます
* この処理はconfig.rpgsaveが未作成の場合にのみ実行されます
*
* また項目そのものを消去することもできます
* 例えば戦闘がないゲームではコマンド記憶等は不要なので消去できます
*
* このプラグインにはプラグインコマンドはありません
*
* 利用規約
* 作者に無断で改変再配布が可能で利用形態商用18禁利用等
* についても制限はありません
* このプラグインはもうあなたのものです
*/
(() => {
'use strict';
const script = document.currentScript;
const param = PluginManagerEx.createParameter(script);
//=============================================================================
// ConfigManager
// それぞれの項目に初期値を与えます。
//=============================================================================
const _ConfigManager_load = ConfigManager.load;
ConfigManager.load = function () {
this.applyDefault(); // For local.
_ConfigManager_load.apply(this, arguments);
}
const _ConfigManager_applyData = ConfigManager.applyData;
ConfigManager.applyData = function (config) {
_ConfigManager_applyData.apply(this, arguments);
if (Object.keys(config).length === 0) {
this.applyDefault(); // For browser.
}
};
ConfigManager.applyDefault = function () {
this.alwaysDash = param.AlwaysDash;
this.commandRemember = param.CommandRemember;
this.touchUI = param.TouchUi;
this.bgmVolume = param.BgmVolume;
this.bgsVolume = param.BgsVolume;
this.meVolume = param.MeVolume;
this.seVolume = param.SeVolume;
}
//=============================================================================
// Scene_Options
// オプションウィンドウの高さを調整します。
//=============================================================================
const _Scene_Options_maxCommands = Scene_Options.prototype.maxCommands;
Scene_Options.prototype.maxCommands = function () {
let count = _Scene_Options_maxCommands.apply(this, arguments);
if (param.EraseAlwaysDash) count--;
if (param.EraseCommandRemember) count--;
if (param.EraseTouchUi) count--;
if (param.EraseBgmVolume) count--;
if (param.EraseBgsVolume) count--;
if (param.EraseMeVolume) count--;
if (param.EraseSeVolume) count--;
return count;
};
//=============================================================================
// Window_Options
// パラメータを空白にした項目を除去します。
//=============================================================================
const _Window_Options_makeCommandList = Window_Options.prototype.makeCommandList;
Window_Options.prototype.makeCommandList = function () {
_Window_Options_makeCommandList.apply(this, arguments);
if (param.EraseAlwaysDash) this.eraseOption('alwaysDash');
if (param.EraseCommandRemember) this.eraseOption('commandRemember');
if (param.EraseTouchUi) this.eraseOption('touchUI')
if (param.EraseBgmVolume) this.eraseOption('bgmVolume');
if (param.EraseBgsVolume) this.eraseOption('bgsVolume');
if (param.EraseMeVolume) this.eraseOption('meVolume');
if (param.EraseSeVolume) this.eraseOption('seVolume');
};
Window_Options.prototype.eraseOption = function (symbol) {
for (let i = 0; i < this._list.length; i++) {
if (this._list[i].symbol === symbol) {
this._list.splice(i, 1);
// for Mano_InputConfig.js
this.adjustIndexManoInputConfig(i);
break;
}
}
};
Window_Options.prototype.adjustIndexManoInputConfig = function (index) {
if (this._gamepadOptionIndex > index) {
this._gamepadOptionIndex -= 1;
}
if (this._keyboardConfigIndex > index) {
this._keyboardConfigIndex -= 1;
}
};
})();

View file

@ -0,0 +1,128 @@
//=============================================================================
// RPGツクールMZ - LL_MessageWindowAdjust.js v1.1.0
//-----------------------------------------------------------------------------
// ルルの教会 (Lulu's Church)
// https://nine-yusha.com/
//
// URL below for license details.
// https://nine-yusha.com/plugin/
//=============================================================================
/*:
* @target MZ
* @plugindesc メッセージウィンドウの幅を調整します
* @author ルルの教会
* @url https://nine-yusha.com/plugin-messagewindowadjust/
*
* @help LL_MessageWindowAdjust.js
*
* メッセージ表示時に顔グラフィックが無しの時でも
* 顔グラフィック有りの時とメッセージ幅を統一します
*
* プラグインコマンドはありません
*
* 利用規約:
* 著作権表記は必要ございません
* 利用するにあたり報告の必要は特にございません
* 商用非商用問いません
* R18作品にも使用制限はありません
* ゲームに合わせて自由に改変していただいて問題ございません
* プラグイン素材としての再配布改変後含むは禁止させていただきます
*
* 作者: ルルの教会
* 作成日: 2021/9/2
*
* @param adjustWindowChoiceList
* @text 選択肢の位置同期
* @desc 選択肢の位置をメッセージ幅と合わせるかの設定です
* @default true
* @type boolean
*
* @param adjustOnBattle
* @text 戦闘中も有効化
* @desc オンにすると戦闘中もメッセージ幅を調整します
* @default false
* @type boolean
*
* @param adjustWindowType
* @text 有効化するウィンドウ背景
* @desc どの背景の時にメッセージ幅を調整するか選択します
* @type select
* @default all
* @option 全て
* @value all
* @option ウィンドウのみ
* @value windowOnly
* @option 暗くするのみ
* @value darkenOnly
* @option 透明のみ
* @value clearOnly
*
* @param adjustOnFace
* @text メッセージ幅調整値 (顔有)
* @desc 顔グラフィック有り時のメッセージ幅を縮少する値です
* 初期値: 0
* @default 0
* @type number
* @min 0
* @max 2000
*
* @param adjustNoFace
* @text メッセージ幅調整値 (顔無)
* @desc 顔グラフィック無し時のメッセージ幅を縮少する値です
* 初期値: 80
* @default 80
* @type number
* @min 0
* @max 2000
*/
(() => {
"use strict";
const pluginName = "LL_MessageWindowAdjust";
const parameters = PluginManager.parameters(pluginName);
const adjustWindowChoiceList = eval(parameters["adjustWindowChoiceList"] || "true");
const adjustOnBattle = eval(parameters["adjustOnBattle"] || "false");
const adjustWindowType = String(parameters["adjustWindowType"] || "all");
const adjustOnFace = Number(parameters["adjustOnFace"] || 0);
const adjustNoFace = Number(parameters["adjustNoFace"] || 80);
const _Window_Message_updatePlacement = Window_Message.prototype.updatePlacement;
Window_Message.prototype.updatePlacement = function () {
_Window_Message_updatePlacement.apply(this, arguments);
// 位置と幅を調整
let adjustValue = 0;
if (!$gameParty.inBattle() || adjustOnBattle) {
if (adjustWindowType === "all"
|| ($gameMessage.background() === 0 && adjustWindowType === "windowOnly")
|| ($gameMessage.background() === 1 && adjustWindowType === "darkenOnly")
|| ($gameMessage.background() === 2 && adjustWindowType === "clearOnly")) {
adjustValue = $gameMessage.faceName() === "" ? adjustNoFace : adjustOnFace;
}
}
this.x = adjustValue;
this.width = Graphics.boxWidth - (adjustValue * 2);
};
const _Window_ChoiceList_updatePlacement = Window_ChoiceList.prototype.updatePlacement;
Window_ChoiceList.prototype.updatePlacement = function () {
_Window_ChoiceList_updatePlacement.apply(this, arguments);
// 位置と幅を調整
let adjustValue = 0;
if ((!$gameParty.inBattle() || adjustOnBattle) && adjustWindowChoiceList) {
if (adjustWindowType === "all"
|| ($gameMessage.background() === 0 && adjustWindowType === "windowOnly")
|| ($gameMessage.background() === 1 && adjustWindowType === "darkenOnly")
|| ($gameMessage.background() === 2 && adjustWindowType === "clearOnly")) {
adjustValue = $gameMessage.faceName() === "" ? adjustNoFace : adjustOnFace;
}
}
const positionType = $gameMessage.choicePositionType();
if (positionType === 2) {
this.x -= adjustValue;
} else if (positionType === 0) {
this.x += adjustValue;
}
};
})();

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,903 @@
//=============================================================================
// NRP_EnemyRoutineKai.js
//=============================================================================
/*:
* @target MV MZ
* @plugindesc v1.081 Improve the enemy's action routine.
* @author Takeshi Sunagawa (http://newrpg.seesaa.net/)
* @url http://newrpg.seesaa.net/article/473218336.html
*
* @help Improve the enemy's action routine as follows.
*
* - Re-select actions not only at the start of the turn
* but also just before the action.
* - Select the target with the least amount of HP & MP recovery.
* - Do not use the MP drain skill on an opponent with 0 MP.
* - Do not overlay already active states.
* - Do not overlay already limited buffs or debuffs.
* - Do not heal, cure, or revive if there is no valid target.
* - If there is only one, the substitution skill is not used.
*
* [Individual Settings]
* You can also make individual settings
* by entering the following in the note of the enemy.
*
* - Re-select just before action? : <RoutineReset:[true or false]>
* - Pointless action or not? : <RoutineTest:[true or false]>
* - Control recovery actions? : <RoutineRecover:[true or false]>
* - Condition for HP recovery : <RoutineIfHp:[condition]>.
* - Condition for MP recovery : <RoutineIfMp:[condition]>.
* - Control MP drain <RoutineMpDrain:[true or false]>
* - Control revival action? : <RoutineForDead:[true or false]>
* - Control the effect for actors? : <RoutineActorEffect:[true or false]>
* - Control the effect for enemys : <RoutineEnemyEffect:[true or false]>
* - Watch for state resistance? : <RoutineWatchResist:[true or false]>
*
* [Notes]
* - Only recovery type skills can be targeted for recovery control.
* - Effects such as state are only determined by "none" type skills.
* - Skills that belong to the HP damage/drain type
* are not controlled regardless of their effect.
* - If a speed compensation skill is selected at the start of a turn,
* the action will not be reselected.
* - Also, when you re-select an action,
* you will not select a speed compensation skill.
* - In the case of "Force Action", if the target is "Random",
* the control will also be performed.
*
* [Terms]
* There are no restrictions.
* Modification, redistribution freedom, commercial availability,
* and rights indication are also optional.
* The author is not responsible,
* but will deal with defects to the extent possible.
*
* @param <Base Setting>
*
* @param resetAction
* @parent <Base Setting>
* @type boolean
* @default false
* @desc If ON, it will make another action decision just before the action.
* The action is determined one at a time, even when there are multiple actions.
*
* @param testApply
* @parent <Base Setting>
* @type boolean
* @default true
* @desc Execute an action judgment.
* If ON, you will no longer use ineffective skills.
*
* @param <Heal>
*
* @param controlRecover
* @parent <Heal>
* @type boolean
* @default true
* @desc If it is on, it controls the recovery skill.
*
* @param ifHpRecover
* @parent <Heal>
* @type text
* @default b.hpRate() < 1.0
* @desc Set the condition for HP recovery.
* When someone's HP drops below 100% with "b.hpRate() < 1.0".
*
* @param ifMpRecover
* @parent <Heal>
* @type text
* @default b.mpRate() < 1.0
* @desc Set the condition for MP recovery.
* When someone's MP drops below 100% with "b.mpRate() < 1.0".
*
* @param controlForDead
* @parent <Heal>
* @type boolean
* @default true
* @desc If it's on, it gives you control over skills that target the dead.
*
* @param <MP Drain>
*
* @param controlMpDrain
* @parent <MP Drain>
* @type boolean
* @default true
* @desc If ON, you control related to MP drain/damage skills.
*
* @param <Effect>
*
* @param controlEnemyEffect
* @parent <Effect>
* @type boolean
* @default true
* @desc If ON, you control the effect skill for the enemy.
* (e.g. support states)
*
* @param controlActorEffect
* @parent <Effect>
* @type boolean
* @default true
* @desc If ON, you control the effect skill for the actor.
* (e.g. abnormal states)
*
* @param watchResist
* @parent <Effect>
* @type boolean
* @default false
* @desc If ON, the target's resistance is checked
* and the invalid state is not used.
*
* @param improveSubstitute
* @parent <Effect>
* @type boolean
* @default true
* @desc If ON, it will not use skills with substitute state with only one.
*/
/*:ja
* @target MV MZ
* @plugindesc v1.081 敵行動ルーチンを改善します
* @author 砂川赳http://newrpg.seesaa.net/
* @url http://newrpg.seesaa.net/article/473218336.html
*
* @help 敵の行動ルーチンを以下の通り改善します
*
* ターン開始時だけでなく行動直前にも行動再選択を行う
* MP回復時に最も減っている対象を選択する
* MPが0の相手にMP吸収スキルを使わない
* 既にかかっているステートを重ねがけしない
* 既に限界となっている能力変化を重ねがけしない
* 有効な対象が存在しない場合回復や治療蘇生を行わない
* 一人しかいない場合身代わりスキルを使用しない
*
* 個別設定
* 敵キャラのメモ欄に以下を記入すれば個別設定も可能です
*
* 行動直前の再設定を行うか <RoutineReset:[true or false]>
* 無意味な行動をしないか <RoutineTest:[true or false]>
* 回復系行動を制御するか <RoutineRecover:[true or false]>
* HP回復を行う条件 <RoutineIfHp:[condition]>
* MP回復を行う条件 <RoutineIfMp:[condition]>
* MP吸収を制御するか <RoutineMpDrain:[true or false]>
* 蘇生系行動を制御するか <RoutineForDead:[true or false]>
* 対アクター使用効果を制御するか<RoutineActorEffect:[true or false]>
* 対エネミー使用効果を制御するか<RoutineEnemyEffect:[true or false]>
* ステート耐性を見るか <RoutineWatchResist:[true or false]>
*
* 注意点
* 回復時の対象制御はタイプが回復系のスキルのみ行います
* ステートなど使用効果の有効判定はタイプがなしのスキルのみ行います
* タイプがHPダメージ吸収に該当するスキルは使用効果に依らず制御しません
* ターン制かつターン開始時に速度補正技が選ばれた場合行動再選択を行いません
* また行動再選択時に速度補正技を選ぶこともありません
* 戦闘行動の強制を使用した場合も対象がランダムだと制御が行われます
*
* 利用規約
* 特に制約はありません
* 改変再配布自由商用可権利表示も任意です
* 作者は責任を負いませんが不具合については可能な範囲で対応します
*
* @param <Base Setting>
* @text 基本設定
* @desc 見出しです
*
* @param resetAction
* @text 行動直前の再設定
* @parent <Base Setting>
* @type boolean
* @default false
* @desc ONならば行動直前にも再度の行動決定を行います
* 複数回行動時も一回毎に行動決定を行います
*
* @param testApply
* @text 行動判定の実行
* @parent <Base Setting>
* @type boolean
* @default true
* @desc ONならば効果の得られないスキルは使用しなくなります
*
* @param <Heal>
* @text 回復関連
* @desc 見出しです
*
* @param controlRecover
* @text 回復系行動の制御
* @parent <Heal>
* @type boolean
* @default true
* @desc ONならば回復系スキルの制御を行います
*
* @param ifHpRecover
* @text HP回復行動の条件
* @parent <Heal>
* @type text
* @default b.hpRate() < 1.0
* @desc 指定した条件でHP回復を行います
* b.hpRate() < 1.0で誰かのHPが100%未満になった時です
*
* @param ifMpRecover
* @text MP回復行動の条件
* @parent <Heal>
* @type text
* @default b.mpRate() < 1.0
* @desc MP回復系行動を行う条件を設定します
* b.mpRate() < 1.0で誰かのMPが100%未満になった時です
*
* @param controlForDead
* @text 蘇生系行動の制御
* @parent <Heal>
* @type boolean
* @default true
* @desc ONならば戦闘不能者を対象にしたスキルの制御を行います
*
* @param <MP Drain>
* @text MP吸収関連
* @desc 見出しです
*
* @param controlMpDrain
* @text MP吸収の制御
* @parent <MP Drain>
* @type boolean
* @default true
* @desc ONならばMP吸収ダメージスキルに関する制御を行います
*
* @param <Effect>
* @text 使用効果関連
* @desc 見出しです
*
* @param controlEnemyEffect
* @text 対エネミーの使用効果制御
* @parent <Effect>
* @type boolean
* @default true
* @desc ONならば仲間エネミーサイドに対する使用効果系スキルの制御を行います支援系ステートなど
*
* @param controlActorEffect
* @text 対アクターの使用効果制御
* @parent <Effect>
* @type boolean
* @default true
* @desc ONならば相手アクターサイドに対する使用効果系スキルの制御を行います異常系ステートなど
*
* @param watchResist
* @text ステート耐性を見るか
* @parent <Effect>
* @type boolean
* @default false
* @desc ONならば対象の耐性を確認し無効なステートは使用しません
*
* @param improveSubstitute
* @text 身代わりを改善
* @parent <Effect>
* @type boolean
* @default true
* @desc ONならば一人しかいない状態で身代わりステート付きのスキルを使用しません
*/
(function () {
"use strict";
function setDefault(str, def) {
return str ? str : def;
}
function toBoolean(val, def) {
// 空白なら初期値を返す
if (val === "" || val === undefined) {
return def;
}
// 文字列ならboolean型に変換して返す
return val.toLowerCase() == "true";
}
const parameters = PluginManager.parameters("NRP_EnemyRoutineKai");
const pResetAction = toBoolean(parameters["resetAction"], true);
const pTestApply = toBoolean(parameters["testApply"], true);
const pControlRecover = toBoolean(parameters["controlRecover"], true);
const pIfHpRecover = setDefault(parameters["ifHpRecover"], "b.hpRate() < 1.0");
const pIfMpRecover = setDefault(parameters["ifMpRecover"], "b.mpRate() < 1.0");
const pControlMpDrain = toBoolean(parameters["controlMpDrain"], true);
const pControlForDead = toBoolean(parameters["controlForDead"], true);
const pControlActorEffect = toBoolean(parameters["controlActorEffect"], true);
const pControlEnemyEffect = toBoolean(parameters["controlEnemyEffect"], true);
const pWatchResist = toBoolean(parameters["watchResist"], true);
const pImproveSubstitute = toBoolean(parameters["improveSubstitute"], true);
/**
* 行動再決定を行うか
*/
function isResetAction(subject) {
// メモ欄のmeta情報を確認
var flg = eval(subject.enemy().meta.RoutineReset);
// 設定がある場合
if (flg == true || flg == false) {
return flg;
}
// 未定義の場合
return pResetAction;
}
/**
* 行動判定の実行を行うか
*/
function isTestApply(subject) {
var flg = eval(subject.enemy().meta.RoutineTest);
if (flg == true || flg == false) {
return flg;
}
return pTestApply;
}
/**
* 回復系行動の制御を行うか
*/
function isControlRecover(subject) {
var flg = eval(subject.enemy().meta.RoutineRecover);
if (flg == true || flg == false) {
return flg;
}
return pControlRecover;
}
/**
* HP回復を行うかを判定する
* @param a 行動主体
* @param b 対象
*/
function isRoutineHpRecover(a, b) {
var flg = eval(a.enemy().meta.RoutineIfHp);
if (flg == true || flg == false) {
return flg;
}
return eval(pIfHpRecover);
}
/**
* MP回復を行うかを判定する
* @param a 行動主体
* @param b 対象
*/
function isRoutineMpRecover(a, b) {
var flg = eval(a.enemy().meta.RoutineIfMp);
if (flg == true || flg == false) {
return flg;
}
return eval(pIfMpRecover);
}
/**
* MP吸収制御を行うかを判定する
*/
function isControlMpDrain(subject) {
var flg = eval(subject.enemy().meta.RoutineMpDrain);
if (flg == true || flg == false) {
return flg;
}
return pControlMpDrain;
}
/**
* 蘇生系行動の制御を行うか
*/
function isControlForDead(subject) {
var flg = eval(subject.enemy().meta.RoutineForDead);
if (flg == true || flg == false) {
return flg;
}
return pControlForDead;
}
/**
* 対エネミーの使用効果制御を行うか
*/
function isControlEnemyEffect(subject) {
var flg = eval(subject.enemy().meta.RoutineEnemyEffect);
if (flg == true || flg == false) {
return flg;
}
return pControlEnemyEffect;
}
/**
* 対アクターの使用効果制御を行うか
*/
function isControlActorEffect(subject) {
var flg = eval(subject.enemy().meta.RoutineActorEffect);
if (flg == true || flg == false) {
return flg;
}
return pControlActorEffect;
}
/**
* 無効なステートを使用しないか
*/
function isRoutineWatchResist(subject) {
var flg = eval(subject.enemy().meta.RoutineWatchResist);
if (flg == true || flg == false) {
return flg;
}
return pWatchResist;
}
/**
* 速度補正技の除外処理を行うか
*/
function isSpeedException(action) {
// CTB, CTTB,なら速度補正の意味が異なるので除外しない
// _cttbCountの有無で判定
if (BattleManager._cttbCount || BattleManager._isCttb || BattleManager._isCtb) {
return false;
// MZのTPBも同じく除外
} else if (Utils.RPGMAKER_NAME == "MZ" && BattleManager.isTpb()) {
return false;
}
// 以下はターン制
// 速度補正技なので除外する
if (action.item().speed != 0) {
return true;
}
return false;
}
/**
* ターン開始入力
*/
var _BattleManager_startInput = BattleManager.startInput;
BattleManager.startInput = function () {
// 行動確定前にフラグ初期化
clearFirstActionDone();
_BattleManager_startInput.apply(this, arguments);
};
/**
* ターン開始
*/
var _BattleManager_startTurn = BattleManager.startTurn;
BattleManager.startTurn = function () {
_BattleManager_startTurn.apply(this, arguments);
// TPBではstartInputを通らないためこちらでクリア
if (Utils.RPGMAKER_NAME == "MZ" && this.isTpb()) {
// 行動確定前にフラグ初期化
clearFirstActionDone();
}
};
/**
* 行動確定前にフラグ初期化
*/
function clearFirstActionDone() {
for (let enemy of $gameTroop.members()) {
enemy._firstActionDone = undefined;
}
}
// 行動再設定を判定するフラグ
let mResetActionFlg = false;
/**
* 戦闘行動の処理
*/
const _BattleManager_processTurn = BattleManager.processTurn;
BattleManager.processTurn = function () {
const subject = this._subject;
// 敵の場合、行動直前の再設定を実行
if (subject.isEnemy() && isResetAction(subject)) {
const action = subject.currentAction();
// 行動前のタイミングでアクション再設定
if (action) {
// ただし、速度補正技は除く
if (!action.item() || !isSpeedException(action)) {
mResetActionFlg = true;
subject.makeActions();
mResetActionFlg = false;
}
// 既に一度行動した。
subject._firstActionDone = true;
}
}
// 元処理実行
_BattleManager_processTurn.apply(this);
};
/**
* アクション生成
* Game_Enemy.prototype.makeActionTimesをオーバライド
*/
const _Game_Enemy_makeActions = Game_Enemy.prototype.makeActions;
Game_Enemy.prototype.makeActions = function () {
// クリアする前に行動回数を保持しておく。
// 下のmakeActionTimesに使うだけの使い捨て
this._keepActionTimes = this._actions.length;
_Game_Enemy_makeActions.apply(this, arguments);
};
/**
* 行動回数計算
* Game_Battler.prototype.makeActionTimesをオーバライド
*/
const _Game_Enemy_makeActionTimes = Game_Enemy.prototype.makeActionTimes;
Game_Enemy.prototype.makeActionTimes = function () {
// 既に一度行動済の場合は、行動回数を加算しない。
if (this._firstActionDone) {
// 現在の残り行動回数をそのまま取得
return this._keepActionTimes;
}
return _Game_Enemy_makeActionTimes.apply(this, arguments);
};
/**
* 敵のターン参照
*/
const _Game_Troop_turnCount = Game_Troop.prototype.turnCount;
Game_Troop.prototype.turnCount = function () {
let turnCount = _Game_Troop_turnCount.apply(this);
// 行動再設定時はターン-1
// そうしないとターン最初の行動決定と条件が一致しない
if (mResetActionFlg) {
turnCount -= 1;
}
return turnCount;
};
/**
* 仲間への対象選択
*/
var _Game_Action_targetsForFriends = Game_Action.prototype.targetsForFriends;
Game_Action.prototype.targetsForFriends = function () {
var subject = this.subject();
/*
* 以下の条件を全て満たす場合が対象
* 行動主体が敵
* 死亡者向けではない
* 対象が使用者ではない
* 単体が対象
* 対象がランダム敵の単体対象は原則ランダム扱い
* ダメージ吸収ではない
*/
if (subject.isEnemy() && !this.isForDeadFriend() && !this.isForUser() && this.isForOne()
&& this._targetIndex < 0 && !this.isDamage() && !this.isDrain()) {
var targets = [];
var target;
var unit = this.friendsUnit();
// 回復制御を行う場合
if (isControlRecover(subject)) {
// HP回復の場合
if (this.isHpRecover()) {
// HPが最も減っている対象を選択
target = unit.aliveMembers().reduce(function (a, b) {
return a.hpRate() < b.hpRate() ? a : b;
});
targets.push(target);
return targets;
// MP回復の場合
} else if (this.isMpRecover()) {
// MPが最も減っている対象を選択
target = unit.aliveMembers().reduce(function (a, b) {
return a.mpRate() < b.mpRate() ? a : b;
});
targets.push(target);
return targets;
}
}
// ダメージタイプがなしで、かつ使用効果がある場合
if (this.checkDamageType([0]) && this.item().effects.length > 0) {
// 効果のある対象だけに候補を絞る
const filterTargets = unit.aliveMembers().filter(function (m) {
return this.testApplyEnemy(m);
}, this);
// 有効な対象が存在する場合
if (filterTargets.length > 0) {
// 絞った候補からさらにランダムで選択する。
targets.push(randomTargetFilter(filterTargets));
return targets;
}
}
}
// 条件を満たさない場合は元処理実行
return _Game_Action_targetsForFriends.apply(this);
};
/**
* 相手サイドへの対象選択
*/
var _Game_Action_targetsForOpponents = Game_Action.prototype.targetsForOpponents;
Game_Action.prototype.targetsForOpponents = function () {
var subject = this.subject();
/*
* 以下の条件を全て満たす場合が対象
* 行動主体が敵
* 単体が対象
* 対象がランダム敵の単体対象は原則ランダム扱い
*/
if (subject.isEnemy() && this.isForOne() && this._targetIndex < 0) {
// 制御対象かどうかの判定
let controlFlg = false;
/*
* ダメージタイプがなし
* 使用効果が存在する
*/
if (this.checkDamageType([0]) && this.item().effects.length > 0) {
controlFlg = true;
/*
* ダメージタイプがMPダメージMP吸収
*/
} else if (this.isMpEffect() && (this.isDamage() || this.isDrain())) {
controlFlg = true;
}
// 制御対象として処理する。
if (controlFlg) {
const targets = [];
const unit = this.opponentsUnit();
// 効果のある対象だけに候補を絞る
const filterTargets = unit.aliveMembers().filter(function (m) {
return this.testApplyEnemy(m);
}, this);
// 有効な対象が存在する場合
if (filterTargets.length > 0) {
// 絞った候補からさらにランダムで選択する。
targets.push(randomTargetFilter(filterTargets));
return targets;
}
}
}
// 条件を満たさない場合は元処理実行
return _Game_Action_targetsForOpponents.apply(this);
};
/**
* 独自定義指定した対象集団の狙われ率合計を求める
*/
function tgrSumFilter(targets) {
return targets.reduce(function (r, member) {
return r + member.tgr;
}, 0);
}
/**
* 独自定義指定した対象集団から狙われ率に従ってランダムで選択する
*/
function randomTargetFilter(targets) {
var tgrRand = Math.random() * tgrSumFilter(targets);
var target = null;
targets.forEach(function (member) {
tgrRand -= member.tgr;
if (tgrRand <= 0 && !target) {
target = member;
}
});
return target;
}
/**
* 敵の行動有効判定
* ここで無効にした行動は取らない
*/
var Game_Enemy_isActionValid = Game_Enemy.prototype.isActionValid;
Game_Enemy.prototype.isActionValid = function (action) {
// 元処理実行(通常の使用条件判定)
var ret = Game_Enemy_isActionValid.apply(this, arguments);
// 使用不可なら、そこで終了
if (ret == false) {
return ret;
}
// 行動判定の実行を行う場合のみ
if (isTestApply(this)) {
// 引数のactionはJSONのパラメータそのままなので、
// Game_Actionに変換する。
var gameAction = new Game_Action(this);
gameAction.setSkill(action.skillId);
// 既にターン実行中ならば、速度補正技は使用候補から外す。
if (isResetAction(this) && BattleManager.isInTurn()) {
if (gameAction.item() && isSpeedException(gameAction)) {
return false;
}
}
// 使用者が対象
if (gameAction.isForUser()) {
// 効果が無効ならば、使用候補から外す。
if (!gameAction.testApplyEnemy(this)) {
return false;
}
// それ以外
} else {
// 対象がアクター向けかつ全員無効ならば、使用候補から外す。
if (gameAction.isForOpponent()
&& $gameParty.members().every(function (m) { return !gameAction.testApplyEnemy(m); })) {
return false;
// 対象がエネミー向けかつ全員無効ならば、使用候補から外す。
} else if (gameAction.isForFriend()
&& $gameTroop.members().every(function (m) { return !gameAction.testApplyEnemy(m); })) {
return false;
}
}
}
// 使用可能と認定
return true;
};
/**
* 独自敵行動の有効判定
* ここでtrueを返した場合に使用可能な行動となる
*/
Game_Action.prototype.testApplyEnemy = function (target) {
const subject = this.subject();
// 対象が戦闘不能の仲間向け
if (this.isForDeadFriend()) {
// 蘇生制御を行わない場合は常に有効
if (!isControlForDead(subject)) {
return true;
}
// 対象が戦闘不能なら有効
if (target.isDead()) {
return true;
}
// それ以外は無効
return false;
// それ以外で対象が戦闘不能(逃走も含む)なら無効
} else if (!target.isAlive()) {
return false;
}
// ダメージまたは吸収
if (this.isDamage() || this.isDrain()) {
// MPダメージ/吸収制御を行う場合、
// MP効果の場合、対象のMPが0なら無効
if (isControlMpDrain(subject) && this.isMpEffect() && target.mp == 0) {
return false;
}
// それ以外は有効
return true;
// 回復系の場合
} else if (this.isRecover()) {
// 回復制御を行わない場合は常に有効
if (!isControlRecover(subject)) {
return true;
}
// 効果がHP回復、かつ対象のHPが減っている。
if (this.isHpRecover() && isRoutineHpRecover(subject, target)) {
return true;
// 効果がMP回復、かつ対象のMPが減っている。
} else if (this.isMpRecover() && isRoutineMpRecover(subject, target)) {
return true;
}
// ダメージタイプがなし
} else if (this.checkDamageType([0])) {
// 対象がアクター、かつ使用効果制御を行わない場合は有効
if (target.isActor() && !isControlActorEffect(subject)) {
return true;
// 対象がエネミー、かつ使用効果制御を行わない場合は有効
} else if (target.isEnemy() && !isControlEnemyEffect(subject)) {
return true;
}
// 使用効果が空(様子を見るなどの何もしない行動)なら有効
if (this.item().effects.length == 0) {
return true;
// 何らかの使用効果が得られるなら有効
} else if (this.hasItemAnyValidEffects(target)) {
// ただし、身代わりスキルの場合
if (pImproveSubstitute && this.isForFriend() && this.isSubstituteSkill()) {
// 人数が一人だと無効
if (this.friendsUnit().aliveMembers().length == 1) {
return false;
}
}
// それ以外は有効
return true;
}
}
// それ以外は無効と判定
return false;
};
/**
* 使用効果を得られるか
*/
var _Game_Action_testItemEffect = Game_Action.prototype.testItemEffect;
Game_Action.prototype.testItemEffect = function (target, effect) {
// 敵限定
if (this.subject().isEnemy()) {
// ステート追加の場合のみ、無効かどうかを判定
switch (effect.code) {
case Game_Action.EFFECT_ADD_STATE:
// 対象の耐性を参照する。
if (isRoutineWatchResist(this.subject())) {
// 対象がステート無効である。
if (target.isStateResist(effect.dataId)) {
return false;
// 行動が必中ではない。かつ、ステート成功率が0
} else if (!this.isCertainHit() && target.stateRate(effect.dataId) == 0) {
return false;
}
}
}
}
// 元処理実行
return _Game_Action_testItemEffect.apply(this, arguments);
};
/**
* 独自身代わりスキルかどうか
*/
Game_Action.prototype.isSubstituteSkill = function () {
// 使用効果に身代わりステートがあるか確認
return this.item().effects.some(effect => isEffectSubstitute(effect));
};
/**
* 使用効果が身代わりかどうか
*/
function isEffectSubstitute(effect) {
// ステート付加である
if (effect.code == Game_Action.EFFECT_ADD_STATE) {
// さらにステート情報を確認
const dataState = $dataStates[effect.dataId];
// 特徴が特殊フラグかつ身代わりである。
if (dataState.traits.some(trait => trait.code == Game_BattlerBase.TRAIT_SPECIAL_FLAG
&& trait.dataId == Game_BattlerBase.FLAG_ID_SUBSTITUTE)) {
return true;
}
}
return false;
}
/**
* エネミーに対する戦闘行動の強制
*/
const Game_Enemy_forceAction = Game_Enemy.prototype.forceAction;
Game_Enemy.prototype.forceAction = function (skillId, targetIndex) {
// 対象が-1ランダムの場合、decideRandomTarget()を経由せず、
// そのまま返すように修正。
// ここで確定してしまうと対象の補正を行えなくなる。
if (targetIndex === -1) {
this.clearActions();
var action = new Game_Action(this, true);
action.setSkill(skillId);
action.setTarget(targetIndex);
this._actions.push(action);
return;
}
// 元処理実行
Game_Enemy_forceAction.apply(this, arguments);
};
})();

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,743 @@
//=============================================================================
// NRP_MessageWindow.js
//=============================================================================
/*:
* @target MV MZ
* @plugindesc v1.01 Adjust the message window.
* @author Takeshi Sunagawa (http://newrpg.seesaa.net/)
* @url https://newrpg.seesaa.net/article/492543897.html
*
* @help Make various adjustments to the message window.
* For example, you can adjust the size and position of the window.
*
* -------------------------------------------------------------------
* [3-line Message Display]
* -------------------------------------------------------------------
* For example, a larger font and a 3-line display of the message
* will make the text easier to read.
*
* As you can find out, most JRPGs and ADVs nowadays
* have a style of 2 to 3 lines plus a name field.
* The MZ default style of 4 lines + name field is quite a lot of text,
* and the text tends to be small, making it difficult to read.
* It is not recommended to follow the default style without thinking.
*
* The key to this is to make the "LineHeight" wider.
*
* -------------------------------------------------------------------
* [Variable Window Size]
* -------------------------------------------------------------------
* Formulas can be used for most items.
* For example, if "WindowHeight" is set to "$gameVariables.value(1)",
* the height of the message window will change according to
* the value of variable 1.
*
* This is useful, for example, when you want to have
* two lines of text in a scene displaying a large image.
*
* -------------------------------------------------------------------
* [Mask Image Function]
* -------------------------------------------------------------------
* By setting "MaskImage",
* you can finely adjust the transparency of the window.
* For example, you can increase
* the transparency only on the right side of the window.
* White areas of the mask image
* are opaque and black areas are transparent.
* See the sample image for details.
*
* Note that this does not work in RPG Maker MV for some reason,
* so it is for MZ only.
*
* -------------------------------------------------------------------
* [Terms]
* -------------------------------------------------------------------
* There are no restrictions.
* Modification, redistribution freedom, commercial availability,
* and rights indication are also optional.
* The author is not responsible,
* but will deal with defects to the extent possible.
*
* @------------------------------------------------------------------
* @ Plugin Parameters
* @------------------------------------------------------------------
*
* @param <MessageWindow>
*
* @param WindowWidth
* @parent <MessageWindow>
* @default Graphics.boxWidth
* @desc The width of the message window.
* Default: Graphics.boxWidth
*
* @param WindowHeight
* @parent <MessageWindow>
* @default this.fittingHeight(4) + 8
* @desc The height of the message window.
* Default: this.fittingHeight(4) + 8
*
* @param WindowX
* @parent <MessageWindow>
* @desc X coordinate for displaying the message window.
*
* @param WindowY
* @parent <MessageWindow>
* @default (this._positionType * (Graphics.boxHeight - this.height)) / 2
* @desc Y coordinate for displaying the message window.
* Default: (this._positionType * (Graphics.boxHeight - this.height)) / 2
*
* @param LineHeight
* @parent <MessageWindow>
* @desc The height per line of the message.
* Default: 36
*
* @param AdjustMessageX
* @parent <MessageWindow>
* @type number
* @desc Adjust the X coordinate of the message.
*
* @param AdjustMessageY
* @parent <MessageWindow>
* @type number
* @desc Adjust the Y coordinate of the message.
*
* @param MessageFontSize
* @parent <MessageWindow>
* @desc The font size of the message.
*
* @param WindowOpacity
* @parent <MessageWindow>
* @desc Opacity of the message window.
* 255 makes it completely opaque.
*
* @param MaskImage
* @parent <MessageWindow>
* @type file
* @dir img/system
* @desc A mask image that applies semi-transparent processing to the window. For MZ only.
*
* @param NoMaskOpacity
* @parent MaskImage
* @desc The opacity of the message window if the mask could not be applied to it.
*
* @param FixIconY
* @parent <MessageWindow>
* @type boolean
* @default true
* @desc Fix a problem in which the Y coordinate of an icon is misaligned when the height of a line is changed.
*
* @param <NameBoxWindow>
* @desc This item is related to the name field.
* This field is invalid because it does not exist in RPG Maker MV.
*
* @param NameBoxAdjustX
* @parent <NameBoxWindow>
* @desc X-coordinate correction value for the name field.
*
* @param NameBoxAdjustY
* @parent <NameBoxWindow>
* @desc Y-coordinate correction value for the name field.
*
* @param NameBoxFontSize
* @parent <NameBoxWindow>
* @desc The font size of the name field.
*
* @param NameBoxOpacity
* @parent <NameBoxWindow>
* @desc Opacity of the name field.
* 255 makes it completely opaque.
*/
/*:ja
* @target MV MZ
* @plugindesc v1.01 メッセージウィンドウを調整する
* @author 砂川赳http://newrpg.seesaa.net/
* @url https://newrpg.seesaa.net/article/492543897.html
*
* @help メッセージウィンドウに対して様々な調整を行います
* 例えばウィンドウのサイズや位置を調整できます
*
* -------------------------------------------------------------------
* メッセージ表示の3行化
* -------------------------------------------------------------------
* 例えばフォントを大きくしてメッセージを3行表示にすれば
* 文章を読みやすくすることができます
*
* 調べてみれば分かりますが今時のJRPGやADVは
* 3行名前欄というスタイルが主流です
* MZデフォルトの4行名前欄というスタイルは
* かなり文章量が多く文字も小さくなりがちなので読みづらいです
* 何も考えず初期状態を踏襲することはあまりオススメしません
*
* この際一行の縦幅を広くすることがポイントです
* 特に漢字にルビを振るプラグインと併用する場合は
* 行間を広めに取ることをオススメします
*
* -------------------------------------------------------------------
* ウィンドウサイズの可変化
* -------------------------------------------------------------------
* ほとんどの項目で数式が使用可能です
* 例えばウィンドウの縦幅$gameVariables.value(1)にすれば
* 変数1の値によってメッセージウィンドウの縦幅が変化するようになります
*
* 例えば一枚絵を表示するシーンでは文章を2行にしたい
* といった場合に便利です
*
* -------------------------------------------------------------------
* マスク画像機能
* -------------------------------------------------------------------
* マスク画像を設定することでウィンドウの透明度を細かく設定できます
* 例えばウィンドウの右側だけ透明度を上げるといった調整ができます
* マスク画像の白い部分が不透明で黒い部分が透明となります
* 詳細はサンプル画像をご覧ください
*
* なおRPGツクールMVではなぜか機能しないのでMZ専用です
*
* -------------------------------------------------------------------
* 利用規約
* -------------------------------------------------------------------
* 特に制約はありません
* 改変再配布自由商用可権利表示も任意です
* 作者は責任を負いませんが不具合については可能な範囲で対応します
*
* @------------------------------------------------------------------
* @ プラグインパラメータ
* @------------------------------------------------------------------
*
* @param <MessageWindow>
* @text メッセージウィンドウ
*
* @param WindowWidth
* @parent <MessageWindow>
* @text ウィンドウの横幅
* @default Graphics.boxWidth
* @desc メッセージウィンドウの横幅です
* 初期値はGraphics.boxWidthです
*
* @param WindowHeight
* @parent <MessageWindow>
* @text ウィンドウの縦幅
* @default this.fittingHeight(4) + 8
* @desc メッセージウィンドウの縦幅です
* 初期値はthis.fittingHeight(4) + 8です
*
* @param WindowX
* @parent <MessageWindow>
* @text ウィンドウのX座標
* @desc メッセージウィンドウを表示するX座標です
*
* @param WindowY
* @parent <MessageWindow>
* @text ウィンドウのY座標
* @default (this._positionType * (Graphics.boxHeight - this.height)) / 2
* @desc メッセージウィンドウを表示するY座標です
* 初期値(this._positionType * (Graphics.boxHeight - this.height)) / 2
*
* @param LineHeight
* @parent <MessageWindow>
* @text 一行の縦幅
* @desc 文章の一行当たりの縦幅です
* 初期値は36です
*
* @param AdjustMessageX
* @parent <MessageWindow>
* @text 文章のX座標調整
* @type number
* @desc 文章のX座標を調整します
*
* @param AdjustMessageY
* @parent <MessageWindow>
* @text 文章のY座標調整
* @type number
* @desc 文章のY座標を調整します
*
* @param MessageFontSize
* @parent <MessageWindow>
* @text 文章のフォントサイズ
* @desc 文章のフォントサイズです
*
* @param WindowOpacity
* @parent <MessageWindow>
* @text ウィンドウの不透明度
* @desc メッセージウィンドウの不透明度です
* 255で完全な不透明になります
*
* @param MaskImage
* @parent <MessageWindow>
* @text マスク画像
* @type file
* @dir img/system
* @desc ウィンドウに半透明処理を施すマスク画像です
* この機能はMZ専用です
*
* @param NoMaskOpacity
* @parent MaskImage
* @text マスク対象外の不透明度
* @desc メッセージウィンドウにマスクを適用できなかった場合の不透明度です
*
* @param FixIconY
* @parent <MessageWindow>
* @text アイコンのY座標修正
* @type boolean
* @default true
* @desc 一行の縦幅を変更した時にアイコンのY座標がズレる問題を修正します
*
* @param <NameBoxWindow>
* @text 名前欄
* @desc 名前欄に関する項目です
* ツクールMVでは存在しないため無効です
*
* @param NameBoxAdjustX
* @parent <NameBoxWindow>
* @text 名前欄のX座標補正
* @desc 名前欄のX座標補正値です
*
* @param NameBoxAdjustY
* @parent <NameBoxWindow>
* @text 名前欄のY座標補正
* @desc 名前欄のY座標補正値です
*
* @param NameBoxFontSize
* @parent <NameBoxWindow>
* @text 名前欄のフォントサイズ
* @desc 名前欄のフォントサイズです
*
* @param NameBoxOpacity
* @parent <NameBoxWindow>
* @text 名前欄の不透明度
* @desc 名前欄の不透明度です
* 255で完全な不透明になります
*/
(function () {
"use strict";
function toBoolean(str, def) {
if (str === true || str === "true") {
return true;
} else if (str === false || str === "false") {
return false;
}
return def;
}
function toNumber(str, def) {
if (str == undefined || str == "") {
return def;
}
return isNaN(str) ? def : +(str || def);
}
function setDefault(str, def) {
if (str == undefined || str == "") {
return def;
}
return str;
}
/**
* 構造体二重配列をJSで扱えるように変換
*/
function parseStruct2(arg) {
var ret = [];
if (arg) {
JSON.parse(arg).forEach(function (str) {
ret.push(JSON.parse(str));
});
}
return ret;
}
const PLUGIN_NAME = "NRP_MessageWindow";
const parameters = PluginManager.parameters(PLUGIN_NAME);
const pWindowWidth = setDefault(parameters["WindowWidth"]);
const pWindowHeight = setDefault(parameters["WindowHeight"]);
const pWindowX = setDefault(parameters["WindowX"]);
const pWindowY = setDefault(parameters["WindowY"]);
const pLineHeight = setDefault(parameters["LineHeight"]);
const pAdjustMessageX = toNumber(parameters["AdjustMessageX"], 0);
const pAdjustMessageY = toNumber(parameters["AdjustMessageY"], 0);
const pMessageFontSize = setDefault(parameters["MessageFontSize"]);
const pWindowOpacity = setDefault(parameters["WindowOpacity"]);
const pMaskImage = setDefault(parameters["MaskImage"]);
const pNoMaskOpacity = setDefault(parameters["NoMaskOpacity"]);
const pFixIconY = toBoolean(parameters["FixIconY"]);
const pNameBoxAdjustX = setDefault(parameters["NameBoxAdjustX"]);
const pNameBoxAdjustY = setDefault(parameters["NameBoxAdjustY"]);
const pNameBoxFontSize = setDefault(parameters["NameBoxFontSize"]);
const pNameBoxOpacity = setDefault(parameters["NameBoxOpacity"]);
// ----------------------------------------------------------------------------
// Scene_Message
// ----------------------------------------------------------------------------
// MZのみのクラスなので存在しない場合は無視
if (typeof Scene_Message !== "undefined") {
/**
* メッセージウィンドウのサイズ配置
*/
Scene_Message.prototype.messageWindowRect = function () {
// 横幅
let ww = Graphics.boxWidth;
if (pWindowWidth != null) {
// とりあえず最大領域を確保しておく。
// ※値が小さいとはみ出した文字が表示されないため。
ww = Graphics.width;
}
// 縦幅
let wh = this.calcWindowHeight(4, false) + 8;
if (pWindowHeight != null) {
// ダミーのウィンドウを定義して計算
// ※この値は選択肢を呼んだ場合に参照される。
const dummyWindow = new Window_Message(new Rectangle(0, 0, 0, 0));
wh = dummyWindow.calcWindowHeight();
}
// 座標はそのままupdatePlacementで処理
const wx = (Graphics.boxWidth - ww) / 2;
const wy = 0;
return new Rectangle(wx, wy, ww, wh);
};
}
// /**
// * ●ウィンドウの生成
// * ※PicturePriorityCustomize.jsと併用する場合は重複につき注釈化
// * ※他にも競合するプラグインがあるので保留
// */
// const _Scene_Message_createAllWindows = Scene_Message.prototype.createAllWindows;
// Scene_Message.prototype.createAllWindows = function() {
// _Scene_Message_createAllWindows.apply(this, arguments);
//
// //--------------------------------------------------------------------
// // 名前欄の位置変更時、下に隠れたメッセージウィンドウが消えないよう調整
// // ※WindowLayer.prototype.renderの挙動によって、
// //  ウィンドウは重ねられない仕様なので、Scene_Message直下に移動する。
// //--------------------------------------------------------------------
// // メッセージウィンドウ
// this.addChild(this._windowLayer.removeChild(this._messageWindow));
// // 名前ウィンドウ
// this.addChild(this._windowLayer.removeChild(this._nameBoxWindow));
// // UIエリアの幅を考慮して加算
// // this._messageWindow.x += this._windowLayer.x;
// // this._nameBoxWindow.x += this._windowLayer.x;
// };
// ----------------------------------------------------------------------------
// Window_Message
// ----------------------------------------------------------------------------
let mInitialHeight = 0;
/**
* メッセージウィンドウの初期化
*/
const _Window_Message_initialize = Window_Message.prototype.initialize;
Window_Message.prototype.initialize = function (rect) {
_Window_Message_initialize.apply(this, arguments);
// 不透明度
if (pWindowOpacity != null) {
this.backOpacity = eval(pWindowOpacity);
}
// マスク
if (pMaskImage != null) {
this._maskSprite = new Sprite();
this._maskSprite.bitmap = ImageManager.loadSystem(pMaskImage);
this.addChild(this._maskSprite);
this.backSprite().mask = this._maskSprite;
}
// メッセージ用スプライトを位置調整
this.contentsSprite().x += pAdjustMessageX;
this.contentsSprite().y += pAdjustMessageY;
mInitialHeight = this.height;
};
/*
* Window_Message.prototype.createContentsが未定義の場合は事前に定義
* これをしておかないと以後のWindow_Base側への追記が反映されない
*/
if (Window_Message.prototype.createContents == Window_Base.prototype.createContents) {
Window_Message.prototype.createContents = function () {
Window_Base.prototype.createContents.apply(this, arguments);
}
}
/**
* コンテンツ作成
*/
const _Window_Message_createContents = Window_Message.prototype.createContents;
Window_Message.prototype.createContents = function () {
_Window_Message_createContents.apply(this, arguments);
// 縦幅が変更されている場合はマスクの対象外なのでクリアする。
// ※想定の縦幅以外はうまく表示できないため
if (this._maskSprite && mInitialHeight != this.height) {
this.backSprite().mask = null;
this._maskSprite.visible = false;
// マスク対象外の不透明度
if (pNoMaskOpacity != null) {
this.backOpacity = eval(pNoMaskOpacity);
}
}
};
/**
* メッセージウィンドウの配置
* Y座標のみウィンドウ位置で変動するためここで制御されている
*/
const _Window_Message_updatePlacement = Window_Message.prototype.updatePlacement;
Window_Message.prototype.updatePlacement = function () {
let changeFlg = false;
// ※サイズを参照して配置を決めているため、先に設定しておく。
// 横幅の更新
if (pWindowWidth != null) {
const width = eval(pWindowWidth);
if (this.width != width) {
this.width = width;
changeFlg = true;
}
}
// 縦幅の更新
if (pWindowHeight != null) {
const height = this.calcWindowHeight();
if (this.height != height) {
this.height = height;
changeFlg = true;
}
}
// いずれかを更新した場合
if (changeFlg) {
// 描画領域を更新
// これをやらないと文字が表示されなくなる。
this.createContents();
// サイズを文章の表示領域へ反映
// これをやらないと改ページ判定がおかしくなる。
this.contents.resize(this.width, this.height)
}
// 元の処理
_Window_Message_updatePlacement.apply(this, arguments);
// X座標
if (pWindowX != null) {
this.x = eval(pWindowX);
}
// Y座標
if (pWindowY != null) {
this.y = eval(pWindowY);
}
};
/**
* 独自ウィンドウの高さを計算する
*/
Window_Message.prototype.calcWindowHeight = function () {
return eval(pWindowHeight);
};
if (pLineHeight != null) {
/**
* メッセージウィンドウの一行当たりの縦幅
*/
Window_Message.prototype.lineHeight = function () {
return eval(pLineHeight);
};
}
// Window_Message.prototype.needsNewPage = function(textState) {
// alert(textState.y + textState.height + " > " + this.contents.height);
// return (
// !this.isEndOfText(textState) &&
// textState.y + textState.height > this.contents.height
// );
// };
/**
* アイコンのY座標修正
*/
if (pFixIconY) {
/*
* Window_Messageのメソッドが未定義の場合は事前に定義
* これをしておかないと以後のWindow_Base側への追記が反映されない
*/
if (Window_Message.prototype.processDrawIcon == Window_Base.prototype.processDrawIcon) {
Window_Message.prototype.processDrawIcon = function (iconIndex, textState) {
Window_Base.prototype.processDrawIcon.apply(this, arguments);
}
}
/**
* アイコンの描画
*/
const _Window_Message_processDrawIcon = Window_Message.prototype.processDrawIcon;
Window_Message.prototype.processDrawIcon = function (iconIndex, textState) {
// 描画しない場合は処理終了
if (!textState.drawing) {
_Window_Message_processDrawIcon.apply(this, arguments);
return;
}
// アイコンのY座標の算出に縦幅を考慮
const iconY = textState.y + (this.lineHeight() - ImageManager.iconHeight) / 2;
this.drawIcon(iconIndex, textState.x + 2, iconY);
textState.x += ImageManager.iconWidth + 4;
};
}
if (pMessageFontSize != null) {
/*
* Window_Messageのメソッドが未定義の場合は事前に定義
* これをしておかないと以後のWindow_Base側への追記が反映されない
*/
if (Window_Message.prototype.resetFontSettings == Window_Base.prototype.resetFontSettings) {
Window_Message.prototype.resetFontSettings = function () {
Window_Base.prototype.resetFontSettings.apply(this, arguments);
}
}
/**
* フォントサイズの設定
*/
const _Window_Message_resetFontSettings = Window_Message.prototype.resetFontSettings;
Window_Message.prototype.resetFontSettings = function () {
_Window_Message_resetFontSettings.apply(this, arguments);
this.contents.fontSize = eval(pMessageFontSize);
};
}
if (pMaskImage != null) {
/*
* Window_Messageのメソッドが未定義の場合は事前に定義
*/
if (Window_Message.prototype.showBackgroundDimmer == Window_Base.prototype.showBackgroundDimmer) {
Window_Message.prototype.showBackgroundDimmer = function () {
Window_Base.prototype.showBackgroundDimmer.apply(this, arguments);
}
}
/**
* 暗いウィンドウの表示
*/
const _Window_Message_showBackgroundDimmer = Window_Message.prototype.showBackgroundDimmer;
Window_Message.prototype.showBackgroundDimmer = function () {
this.backSprite().mask = null;
this._maskSprite.visible = false;
_Window_Message_showBackgroundDimmer.apply(this, arguments);
};
/*
* Window_Messageのメソッドが未定義の場合は事前に定義
*/
if (Window_Message.prototype.hideBackgroundDimmer == Window_Base.prototype.hideBackgroundDimmer) {
Window_Message.prototype.hideBackgroundDimmer = function () {
Window_Base.prototype.hideBackgroundDimmer.apply(this, arguments);
}
}
/**
* 暗いウィンドウの非表示
*/
const _Window_Message_hideBackgroundDimmer = Window_Message.prototype.hideBackgroundDimmer;
Window_Message.prototype.hideBackgroundDimmer = function () {
this.backSprite().mask = this._maskSprite;
this._maskSprite.visible = true;
_Window_Message_hideBackgroundDimmer.apply(this, arguments);
};
}
/**
* 独自文字描画用のスプライトを取得
*/
Window_Message.prototype.contentsSprite = function () {
// MZ用
if (this._contentsSprite) {
return this._contentsSprite;
// MV用
} else if (this._windowContentsSprite) {
return this._windowContentsSprite;
}
}
/**
* 独自背景描画用のスプライトを取得
*/
Window_Message.prototype.backSprite = function () {
// MZ用
if (this._backSprite) {
return this._backSprite;
// MV用
} else if (this._windowBackSprite) {
return this._windowBackSprite;
}
}
// ----------------------------------------------------------------------------
// Window_NameBox
// ----------------------------------------------------------------------------
// MZのみのクラスなので存在しない場合は無視
if (typeof Window_NameBox !== "undefined") {
/**
* 名前欄の初期化
*/
const _Window_NameBox_initialize = Window_NameBox.prototype.initialize;
Window_NameBox.prototype.initialize = function (rect) {
_Window_NameBox_initialize.apply(this, arguments);
// 不透明度
if (pNameBoxOpacity != null) {
this.backOpacity = eval(pNameBoxOpacity);
}
};
/**
* 名前欄の配置
*/
const _Window_NameBox_updatePlacement = Window_NameBox.prototype.updatePlacement;
Window_NameBox.prototype.updatePlacement = function () {
_Window_NameBox_updatePlacement.apply(this, arguments);
// X座標補正
if (pNameBoxAdjustX != null) {
this.x += eval(pNameBoxAdjustX);
}
// Y座標補正
if (pNameBoxAdjustY != null) {
this.y += eval(pNameBoxAdjustY);
}
};
if (pNameBoxFontSize != null) {
/*
* Window_NameBoxのメソッドが未定義の場合は事前に定義
* これをしておかないと以後のWindow_Base側への追記が反映されない
*/
if (Window_NameBox.prototype.resetFontSettings == Window_Base.prototype.resetFontSettings) {
Window_NameBox.prototype.resetFontSettings = function () {
Window_Base.prototype.resetFontSettings.apply(this, arguments);
}
}
/**
* フォントサイズの設定
*/
const _Window_NameBox_resetFontSettings = Window_Message.prototype.resetFontSettings;
Window_NameBox.prototype.resetFontSettings = function () {
_Window_NameBox_resetFontSettings.apply(this, arguments);
this.contents.fontSize = eval(pNameBoxFontSize);
};
}
}
})();

View file

@ -0,0 +1,773 @@
//=============================================================================
// NRP_WindowBattleLogLayout.js
//=============================================================================
/*:
* @target MV MZ
* @plugindesc v1.041 Change the layout of the battle log.
* @author Takeshi Sunagawa (http://newrpg.seesaa.net/)
* @orderAfter SimpleMsgSideViewMZ
* @url http://newrpg.seesaa.net/article/474864758.html
*
* @help Change the layout of the battle log.
* You can change the position and size of the window.
*
* [Main features]
* - You can use the official SimpleMsgSideView plugin together.
* - You can use gradations.
* - Switch to normal window.
* - You can change the background color and transparency.
* - When the message is long, it shrinks to fit the width of the window.
* - There is also a function to adjust the window width to the string length.
*
* [Described in the skills note]
* <NoName>
* Hide the skill name when using it.
*
* For more information, please see below.
* http://newrpg.seesaa.net/article/474864758.html
*
* [Terms]
* There are no restrictions.
* Modification, redistribution freedom, commercial availability,
* and rights indication are also optional.
* The author is not responsible,
* but we will respond to defects as far as possible.
*
* @param <Window Position>
* @desc Set up the position of the window.
*
* @param x
* @parent <Window Position>
* @type text
* @default 0
* @desc The X coordinate of the window.
*
* @param y
* @parent <Window Position>
* @type text
* @default 0
* @desc The Y coordinate of the window.
*
* @param showFront
* @parent <Window Position>
* @type boolean
* @default false
* @desc Show the window in the front.
* However, it's not guaranteed for windows generated by the following plugins.
*
* @param <Window Size>
* @desc Configure the window size settings.
*
* @param width
* @parent <Window Size>
* @type text
* @default this.windowWidth()
* @desc The width of the window.
* The initial value is "this.windowWidth()". This will fit the width of the screen.
*
* @param autoWidth
* @parent <Window Size>
* @type boolean
* @default false
* @desc Automatically adjusts the width of the window according to the number of characters.
*
* @param lineHeight
* @parent <Window Size>
* @type number
* @default 36
* @desc The height of one line.
* The default value is 36.
*
* @param <Window Message>
* @desc Configure the window messages.
*
* @param fontSize
* @parent <Window Message>
* @type number
* @default 28
* @desc Specify the size of the font.
* The default value is 28.
*
* @param padding
* @parent <Window Message>
* @type number
* @default 18
* @desc Specify the padding of the message.
* The default value is 18.
*
* @param <Window Background>
* @desc Set the background of the window.
*
* @param normalWindow
* @parent <Window Background>
* @type boolean
* @default false
* @desc Change to the same window as the normal message.
*
* @param backColor
* @parent <Window Background>
* @type text
* @default #000000
* @desc The background color. (RGB value in hex, Default: #000000)
* This doesn't make sense in the normal window.
*
* @param backPaintOpacity
* @parent <Window Background>
* @type number
* @default 64
* @desc The opacity of background. (Default: 64)
* This doesn't make sense in the normal window.
*
* @param gradientType
* @parent <Window Background>
* @type select
* @option 0:none @value 0
* @option 1:horizontal @value 1
* @option 2:vertical @value 2
* @default 0
* @desc This is the gradation type of the window.
* This doesn't make sense in the normal window.
*
* @param startGradientSize
* @parent <Window Background>
* @type text
* @default 18
* @desc The gradient width of the start side.
* (Default: 18)
*
* @param endGradientSize
* @parent <Window Background>
* @type text
* @default 18
* @desc The gradient width of the end side.
* (Default: 18)
*/
/*:ja
* @target MV MZ
* @plugindesc v1.041 戦闘メッセージのレイアウトを変更します
* @author 砂川赳http://newrpg.seesaa.net/
* @orderAfter SimpleMsgSideViewMZ
* @url http://newrpg.seesaa.net/article/474864758.html
*
* @help 戦闘メッセージのレイアウトを変更します
* ウィンドウの配置や大きさを変更可能です
*
* 主な特徴
* 公式プラグインのSimpleMsgSideViewに対応
* グラデーションに対応
* 通常ウィンドウに切替可能
* 背景色や透明度を変更可能
* メッセージが長い場合ウィンドウ幅に合わせて縮小
* 反対に文字列長にウィンドウ幅を合わせる機能も有
*
* スキルのメモ欄に記述
* <NoName>
* スキル使用時技名を非表示にします
*
* その他詳細は以下をご覧ください
* http://newrpg.seesaa.net/article/474864758.html
*
* 利用規約
* 特に制約はありません
* 改変再配布自由商用可権利表示も任意です
* 作者は責任を負いませんが不具合については可能な範囲で対応します
*
* @param <Window Position>
* @text 配置関連
* @desc 配置関連の設定を行います
*
* @param x
* @text X座標
* @parent <Window Position>
* @type text
* @default 0
* @desc ウィンドウのX座標です
*
* @param y
* @text Y座標
* @parent <Window Position>
* @type text
* @default 0
* @desc ウィンドウのY座標です
*
* @param showFront
* @text 前面表示する
* @parent <Window Position>
* @type boolean
* @default false
* @desc ウィンドウを前面表示します
* 下位のプラグインのウィンドウに対しては未保証
*
* @param <Window Size>
* @text サイズ関連
* @desc ウィンドウのサイズ関連の設定を行います
*
* @param width
* @text 横幅
* @parent <Window Size>
* @type text
* @default this.windowWidth()
* @desc ウィンドウの横幅です
* 初期値はthis.windowWidth()で画面横幅に合わせます
*
* @param autoWidth
* @text 横幅を文字数に合わせる
* @parent <Window Size>
* @type boolean
* @default false
* @desc ウィンドウの横幅を文字数に合わせて自動調整します
*
* @param lineHeight
* @text 一行の縦幅
* @parent <Window Size>
* @type number
* @default 36
* @desc 一行の縦幅です
* 初期値は36です
*
* @param <Window Message>
* @text メッセージ関連
* @desc ウィンドウのメッセージ関連の設定を行います
*
* @param fontSize
* @text フォントサイズ
* @parent <Window Message>
* @type number
* @default 28
* @desc フォントの大きさを指定します
* 初期値は28です
*
* @param padding
* @text メッセージの余白
* @parent <Window Message>
* @type number
* @default 18
* @desc メッセージの余白を指定します
* 初期値は18です
*
* @param <Window Background>
* @text 背景関連
* @desc ウィンドウの背景関連の設定を行います
*
* @param normalWindow
* @text 通常ウィンドウにする
* @parent <Window Background>
* @type boolean
* @default false
* @desc 通常メッセージと同様のウィンドウに変更します
*
* @param backColor
* @text 背景色
* @parent <Window Background>
* @type text
* @default #000000
* @desc 背景色を指定します16進数のRGB値初期値:#000000
* 通常ウィンドウでは意味がありません
*
* @param backPaintOpacity
* @text 背景不透明度
* @parent <Window Background>
* @type number
* @default 64
* @desc 背景の不透明度を指定します初期値:64
* 通常ウィンドウでは意味がありません
*
* @param gradientType
* @text グラデーション方式
* @parent <Window Background>
* @type select
* @option 0:なし @value 0
* @option 1: @value 1
* @option 2: @value 2
* @default 0
* @desc ウィンドウのグラデーション方式です
* 通常ウィンドウでは意味がありません
*
* @param startGradientSize
* @text 開始グラデーション幅
* @parent <Window Background>
* @type text
* @default 18
* @desc 開始側のグラデーション幅です
* 初期値は18です
*
* @param endGradientSize
* @text 終了グラデーション幅
* @parent <Window Background>
* @type text
* @default 18
* @desc 終了側のグラデーション幅です
* 初期値は18です
*/
(function () {
"use strict";
function toNumber(str, def) {
return isNaN(str) ? def : +(str || def);
}
function toBoolean(str) {
if (str == true) {
return true;
}
return (str == "true") ? true : false;
}
const parameters = PluginManager.parameters("NRP_WindowBattleLogLayout");
const pX = parameters["x"];
const pY = parameters["y"];
const pWidth = parameters["width"];
const pAutoWidth = toBoolean(parameters["autoWidth"]);
const pLineHeight = toNumber(parameters["lineHeight"]);
const pNormalWindow = toBoolean(parameters["normalWindow"]);
const pShowFront = toBoolean(parameters["showFront"]);
const pFontSize = toNumber(parameters["fontSize"]);
const pPadding = toNumber(parameters["padding"]);
const pBackColor = parameters["backColor"];
const pBackPaintOpacity = toNumber(parameters["backPaintOpacity"]);
const pGradientType = parameters["gradientType"];
const pStartGradientSize = parameters["startGradientSize"];
const pEndGradientSize = parameters["endGradientSize"];
if (pShowFront) {
/**
* 全ウィンドウ作成
*/
const _Scene_Battle_createAllWindows = Scene_Battle.prototype.createAllWindows;
Scene_Battle.prototype.createAllWindows = function () {
_Scene_Battle_createAllWindows.apply(this, arguments);
// 一旦削除して再追加(前面表示)
this._windowLayer.removeChild(this._logWindow);
this.createLogWindow();
};
}
/**
* アクション表示
*/
const _Window_BattleLog_displayAction = Window_BattleLog.prototype.displayAction;
Window_BattleLog.prototype.displayAction = function (subject, item) {
// eval参照用
var a = getBattlerSprite(subject);
// 横幅設定
var width;
if (pWidth) {
width = eval(pWidth);
} else {
width = this.windowWidth();
}
// 自動調整用に最大幅として保持しておく。
this._maxWidth = width;
// ウィンドウ幅自動調整以外の場合
if (!pAutoWidth) {
// 横幅を反映
this.width = width;
}
// <NoName>の指定があれば非表示
if (item.meta.NoName) {
return;
}
_Window_BattleLog_displayAction.apply(this, arguments);
}
/**
* ウィンドウ描画の更新
*/
const _Window_BattleLog_refresh = Window_BattleLog.prototype.refresh;
Window_BattleLog.prototype.refresh = function () {
// ウィンドウ幅自動調整
if (pAutoWidth) {
// 各行の中で最大幅を取得
var maxWidth = 0;
for (var line of this._lines) {
var textWidth = this.textWidth(this.convertEscapeCharacters(line));
var textPaddingWidth = textWidth + this.padding * 2 + this.textPadding() * 2;
// SimpleMsgSideViewMZのアイコン分を考慮
if (this._actionIconIndex) {
textPaddingWidth += ImageManager.iconWidth;
}
if (textPaddingWidth > maxWidth) {
maxWidth = textPaddingWidth;
}
}
// 最大幅を超えた場合は調整
if (maxWidth > this._maxWidth) {
maxWidth = this._maxWidth;
}
this.width = maxWidth;
}
// eval参照用
var subject = BattleManager._subject;
if (subject) {
var a = getBattlerSprite(subject);
var x;
if (pX) {
try {
x = eval(pX);
} catch (e) { }
} else {
x = this.x;
}
var y;
if (pY) {
try {
y = eval(pY);
} catch (e) { }
} else {
y = this.y;
}
// 位置変更
this.x = x;
this.y = y;
}
_Window_BattleLog_refresh.apply(this, arguments);
};
/**
* MVの場合のみ
*/
if (Utils.RPGMAKER_NAME == "MV") {
/**
* 独自実装文章表示
*/
Window_BattleLog.prototype.drawTextEx = function (text, x, y) {
if (text) {
var textState = { index: 0, x: x, y: y, left: x };
textState.text = this.convertEscapeCharacters(text);
textState.height = this.lineHeight();
this.resetFontSettings();
// 文字列長がウィンドウの表示領域を超えた場合は縮小
var textWidth = this.textWidth(textState.text);
var textSpace = this._maxWidth - this.padding * 2;
if (textWidth > textSpace) {
this.contents.fontSize = Math.floor(this.standardFontSize() * textSpace / textWidth);
textWidth = textSpace;
}
while (textState.index < textState.text.length) {
this.processCharacter(textState);
}
return textState.x - x;
} else {
return 0;
}
};
}
/**
* 背景描画
*/
Window_BattleLog.prototype.drawBackground = function () {
this.getBack().clear();
// 表示するメッセージがなければ処理しない
if (this.numLines() == 0) {
this.opacity = 0;
this.hide();
return;
}
var rect = this.backRect();
var w = rect.width;
var h = rect.height;
this.show();
// 行数に応じて縦幅変更
this.height = h + this.padding * 2;
// 通常ウィンドウ表示の場合
if (pNormalWindow) {
this.opacity = 255;
return;
}
this.getBack().paintOpacity = this.backPaintOpacity();
var m1 = this.startGradientSize();
var m2 = this.endGradientSize();
// 横のグラデーション領域を確保
if (pGradientType == 1) {
w -= m1 + m2;
// 縦のグラデーション領域を確保
} else if (pGradientType == 2) {
h -= m1 + m2;
}
// var c1 = this.dimColor1();
var c1 = this.backColor();
// MZ対応
if (Utils.RPGMAKER_NAME == "MV") {
var c2 = this.dimColor2();
} else {
var c2 = ColorManager.dimColor2();
}
// 非グラデーション部分
this.getBack().fillRect(rect.x, rect.y, w, h, c1);
// 横のグラデーション
if (pGradientType == 1) {
// 左
this.getBack().gradientFillRect(rect.x - m1, rect.y, m1, h, c2, c1, false);
// 右
this.getBack().gradientFillRect(rect.x + w, rect.y, m2, h, c1, c2, false);
// 縦のグラデーション
} else if (pGradientType == 2) {
// 上
this.getBack().gradientFillRect(rect.x, rect.y - m1, w, m1, c2, c1, true);
// 下
this.getBack().gradientFillRect(rect.x, rect.y + h, w, m2, c1, c2, true);
}
this.getBack().paintOpacity = 255;
};
/**
* 独自背景取得
* MVとMZで変数名が異なるため共通化
*/
Window_BattleLog.prototype.getBack = function () {
// MV
if (Utils.RPGMAKER_NAME == "MV") {
return this._backBitmap;
// MZ
} else {
return this.contentsBack;
}
}
/**
* 背景領域の確保
*/
Window_BattleLog.prototype.backRect = function () {
var x = 0;
var padding;
var width = this.width;
// MVの場合
if (Utils.RPGMAKER_NAME == "MV") {
padding = this.padding;
// MZの場合
} else {
// 計算方法が異なるため余白分を減算
padding = 0;
width -= this.padding * 2
}
var y = padding;
// 横グラデーションの場合、領域を確保
if (pGradientType == 1) {
x += this.startGradientSize();
// 縦グラデーションの場合、領域を確保
} else if (pGradientType == 2) {
var gradientSize = this.startGradientSize();
// 初期値の余白より開始グラデーション幅が広い場合のみ設定
if (gradientSize > padding) {
y += this.startGradientSize();
}
}
return {
x: x,
y: y,
width: width,
height: this.numLines() * this.lineHeight()
};
};
/**
* 独自実装開始側のグラデーションサイズを取得
*/
Window_BattleLog.prototype.startGradientSize = function () {
if (pStartGradientSize != undefined) {
return eval(pStartGradientSize);
}
// 指定がなければ余白を取得
return this.padding;
};
/**
* 独自実装終了側のグラデーションサイズを取得
*/
Window_BattleLog.prototype.endGradientSize = function () {
if (pEndGradientSize != undefined) {
return eval(pEndGradientSize);
}
// 指定がなければ余白を取得
return this.padding;
};
if (pLineHeight != undefined) {
/**
* 一行の縦幅
*/
Window_BattleLog.prototype.lineHeight = function () {
return pLineHeight;
};
}
if (pFontSize != undefined) {
/**
* フォントサイズ
*/
Window_BattleLog.prototype.standardFontSize = function () {
return pFontSize;
};
}
if (pPadding != undefined) {
/**
* ウィンドウの余白
*/
Window_BattleLog.prototype.standardPadding = function () {
return pPadding;
};
/**
* MZではこちらが参照される
*/
if (Utils.RPGMAKER_NAME != "MV") {
Window_BattleLog.prototype.updatePadding = function () {
this.padding = pPadding;
};
}
}
if (pBackColor != undefined) {
/**
* 背景色
*/
Window_BattleLog.prototype.backColor = function () {
return pBackColor;
};
}
if (pBackPaintOpacity != undefined) {
/**
* 背景不透明度
*/
Window_BattleLog.prototype.backPaintOpacity = function () {
return pBackPaintOpacity;
};
}
/**
* 指定したバトラーのスプライトを取得する
*/
function getBattlerSprite(battler) {
if (!battler) {
return undefined;
}
var sprite;
var sprites;
if (battler.isActor()) {
sprites = BattleManager._spriteset._actorSprites;
} else {
sprites = BattleManager._spriteset._enemySprites;
}
for (var i = 0; i < sprites.length; i++) {
var s = sprites[i];
if (s._battler == battler) {
sprite = s;
break;
}
}
// Sprite_Actorのサイズ設定
setActorSpriteSize(sprite);
return sprite;
}
/**
* 指定したアクタースプライトのサイズを設定する
*/
function setActorSpriteSize(sprite) {
if (sprite && sprite._battler.isActor()) {
// Sprite_Actorのサイズが取れないのでeffectTargetのものをセットする。
// やや強引かも……。
if (Utils.RPGMAKER_NAME == "MV") {
sprite.width = sprite._effectTarget.width;
sprite.height = sprite._effectTarget.height;
}
}
}
/**
* MZ対応
*/
if (Utils.RPGMAKER_NAME == "MZ") {
Window_BattleLog.prototype.windowWidth = function () {
return Graphics.boxWidth;
};
Window_Base.prototype.textPadding = function () {
return 6;
};
/**
* SimpleMsgSideViewMZが登録されている場合
*/
const isSimpleMsgSideViewMZ = PluginManager._scripts.some(function (scriptName) {
return scriptName == "SimpleMsgSideViewMZ";
});
if (isSimpleMsgSideViewMZ) {
/**
* スキル名の表示
*/
Window_BattleLog.prototype.drawLineText = function (index) {
const text = this._lines[index];
const rect = this.lineRect(index);
this.contents.clearRect(rect.x, rect.y, rect.width, rect.height);
let textX = rect.x;
// 描画可能領域の幅rect.widthを参照する
let textDrawWidth = rect.width;
if (this._actionIconIndex) {
// 描画可能領域からアイコン幅を減算
textDrawWidth = rect.width - ImageManager.iconWidth;
// 実際に描画される文字列長を求める。
const textWidth = Math.min(this.textWidth(text), textDrawWidth);
// 中央から文字列長分左へ調整
const x = (rect.width - textWidth) / 2 - 10;
this.drawIcon(this._actionIconIndex, x, rect.y + 2);
// アイコン分、右にずらす
textX += ImageManager.iconWidth;
}
this.drawText(text, textX, rect.y, textDrawWidth, 'center');
};
}
}
})();

213
js/plugins/NUUN_BigEnemy.js Normal file
View file

@ -0,0 +1,213 @@
/*:-----------------------------------------------------------------------------------
* NUUN_BigEnemy.js
*
* Copyright (C) 2020 NUUN
* This software is released under the MIT License.
* http://opensource.org/licenses/mit-license.php
* -------------------------------------------------------------------------------------
*/
/*:
* @target MZ
* @plugindesc 巨大エネミー
* @author NUUN
* @version 1.2.0
*
* @help エネミー画像を画面一杯またはゲーム画面下に合わせて表示します
* エネミーのメモ欄に以下のいずれかを記入してください
* 以下のタグは画面の横サイズに合わせて拡大されます
* <BigEnemy> 画像を画面サイズに合わせます
* <BigEnemy:OriginalRatio> 比率を変更せず横幅の倍率基準で拡大します
* 以下のタグはオリジナル画像サイズのままゲーム画面の下側に画像の下を合わせて表示されます
* <BigEnemy:UnderPosition> 画像を原寸倍率で画面下に合わせ表示させます画像のサイズ調整やX座標調整はいたしません
*
* オプションタグ エネミーのメモ欄
* <BigEnemyFront> 画像を一番手前側に表示させます
* <BigEnemyBack> 画像を一番後ろ側に表示させます
* <BigEnemyY:[y]> Y座標をシフトして表示します
*
* <BigEnemyY:50> Y座標を50下にシフトして表示します
*
* <BigEnemyDamageX:[x]> ダメージエフェクトのX座標を調整します
* <BigEnemyDamageX:[y]> ダメージエフェクトのY座標を調整します
* [x]X座標(相対)
* [y]Y座標(相対)
*
* <CorrectionScale:[scale]> 拡大率の補正を行います
* [scale]倍率
*
* <CorrectionScale:1.1>
*
*
* 仕様
* BigEnemy及びBigEnemy:OriginalRatioは画面の横サイズに合わせて拡大されます
* BigEnemy:UnderPositionはオリジナルサイズのまま表示されX座標の調整は行われませんがYは画像の一番下が画面の下に表示されるように調整されます
* BigEnemyYは表示した画像からの相対座標となりますなお巨大エネミーのみ有効です
*
* 利用規約
* このプラグインはMITライセンスで配布しています
*
* 更新履歴
* 2021/11/7 Ver.1.2.0
* ダメージエフェクトを調整できる機能を追加
* 一部の計算が間違っていたため修正
* 2021/6/31 Ver.1.1.6
* Ver.1.3.0以降で敵の画像が想定よりも大きく拡大されてしまう問題を修正
* 2021/5/31 Ver.1.1.5
* モンスターが出現していないときは拡大率のアップデートをしないように修正
* 2021/5/30 Ver.1.1.4
* UnderPositionモードの時に画像が表示されない問題を修正
* 2021/5/29 Ver.1.1.3
* MNKR_TMBattlerExMZの息づかいMOG_BattlerMotionのBreath Motionに対応
* 2021/3/20 Ver.1.1.2
* 標準の表示順をデフォルト仕様に変更<BigEnemyNormal>はデフォルト設定に変更されました<BigEnemyBack>が追加されVer.1.1.1までの
* デフォルト設定は<BigEnemyBack>を記入しなくてはならなくなりました
* 2021/3/20 Ver.1.1.1
* 巨大エネミーの表示順を元の仕様にする機能を追加
* 2021/3/18 Ver.1.1.0
* モンスター画像の下に合わせて表示する機能を追加
* 2回目の戦闘以降にモンスターが手前に表示される問題を修正
* 2021/3/17 Ver.1.0.3
* Y座標を調整できる機能を追加
* 2021/1/17 Ver.1.0.2
* 常に後ろに表示されるように変更
* 2020/12/15 Ver.1.0.1
* OriginalRatioモードの時にポップアップの位置がずれる問題を修正
* 2020/11/22 Ver.1.0.0
* 初版
*
*/
var Imported = Imported || {};
Imported.NUUN_BigEnemy = true;
(() => {
const parameters = PluginManager.parameters('NUUN_BigEnemy');
const _Game_Enemy_screenY = Game_Enemy.prototype.screenY;
Game_Enemy.prototype.screenY = function () {
if (this.enemy().meta.BigEnemy) {
if (this.enemy().meta.BigEnemyFront) {
return Graphics.height;
} else if (this.enemy().meta.BigEnemyBack) {
return 0;
} else {
return _Game_Enemy_screenY.call(this);
}
} else {
return _Game_Enemy_screenY.call(this);
}
};
const _Sprite_Battler_initMembers = Sprite_Battler.prototype.initMembers;
Sprite_Battler.prototype.initMembers = function () {
_Sprite_Battler_initMembers.call(this);
this._bigEnemy = false;
};
const _Sprite_Enemy_setBattler = Sprite_Enemy.prototype.setBattler;
Sprite_Enemy.prototype.setBattler = function (battler) {
_Sprite_Enemy_setBattler.call(this, battler);
if (battler.enemy().meta.BigEnemy) {
this._bigEnemy = battler.enemy().meta.BigEnemy;
if (this._bigEnemy) {
const name = this._enemy.battlerName();
if ($gameSystem.isSideView()) {
ImageManager.loadSvEnemy(name);
} else {
ImageManager.loadEnemy(name);
}
if (this.bitmap && !this.bitmap.isReady()) {
this.bitmap.addLoadListener(this.setBigEnemy.bind(this));
}
}
}
};
Sprite_Enemy.prototype.setBigEnemy = function () {
const bitmap = this.bitmap;
const correctionScale = this._enemy.enemy().meta.CorrectionScale;
if (this._bigEnemy === "UnderPosition") {
this._homeY = Graphics.height - 28;
this._originalscaleX = this.scale.x * (correctionScale || 1);
this._originalscaleY = this.scale.y * (correctionScale || 1);
} else {
this.scale.x = Graphics.width / bitmap.width * (correctionScale || 1);
this._originalscaleX = this.scale.x;
this._homeX = Graphics.boxWidth / 2;
let height = 0;
if (this._bigEnemy === 'OriginalRatio') {
this.scale.y = this.scale.x;
height = Math.floor((Graphics.height - bitmap.height * this.scale.y) / 2);
} else {
this.scale.y = Graphics.height / bitmap.height * (correctionScale || 1);
}
this._originalscaleY = this.scale.y;
this._homeY = Math.floor((Graphics.height - Graphics.boxHeight) / 2 + Graphics.boxHeight) + 24 - height;
}
this._homeY += this._enemy.enemy().meta.BigEnemyY ? Number(this._enemy.enemy().meta.BigEnemyY) : 0;
this.updatePosition();
};
const _Sprite_Enemy_update = Sprite_Enemy.prototype.update;
Sprite_Enemy.prototype.update = function () {
_Sprite_Enemy_update.call(this);
this.updateBigEnemy();
};
Sprite_Enemy.prototype.updateBigEnemy = function () {
if (this._appeared && this._bigEnemy && this.scale.x !== this._originalscaleX) {
this.scale.x *= this._originalscaleX;
}
if (this._appeared && this._bigEnemy && this.scale.y !== this._originalscaleY) {
this.scale.y *= this._originalscaleY;
}
};
const _Sprite_Enemy_updateStateSprite = Sprite_Enemy.prototype.updateStateSprite;
Sprite_Enemy.prototype.updateStateSprite = function () {
_Sprite_Enemy_updateStateSprite.call(this);
if (this._bigEnemy && this._bigEnemy !== "UnderPosition") {
const correctionScale = this._enemy.enemy().meta.CorrectionScale; console.log(this.scale.x)
this._stateIconSprite.y = (40 - this.y) / this.scale.y;
this._stateIconSprite.scale.x = 1 / this.scale.x * 0.5;
this._stateIconSprite.scale.y = 1 / this.scale.y;
}
};
const _Sprite_Enemy_damageOffsetX = Sprite_Enemy.prototype.damageOffsetX;
Sprite_Enemy.prototype.damageOffsetX = function () {
let x = _Sprite_Enemy_damageOffsetX.call(this);
if (this._bigEnemy) {
x += Number(this._enemy.enemy().meta.BigEnemyDamageX) || 0;
}
return x;
};
const _Sprite_Enemy_damageOffsetY = Sprite_Enemy.prototype.damageOffsetY;
Sprite_Enemy.prototype.damageOffsetY = function () {
let y = _Sprite_Enemy_damageOffsetY.call(this);
if (this._bigEnemy) {
if (this._bigEnemy === "OriginalRatio") {
y -= this.bitmap.height * this.scale.y / 2
} else if (this._bigEnemy === "UnderPosition") {
y -= this.bitmap.height / 2;
} else {
y -= Graphics.boxHeight / 2
}
y += Number(this._enemy.enemy().meta.BigEnemyDamageY) || 0;
}
return y;
};
const _Sprite_Enemy_loadBitmap = Sprite_Enemy.prototype.loadBitmap;
Sprite_Enemy.prototype.loadBitmap = function (name) {
_Sprite_Enemy_loadBitmap.call(this, name);
if (this._bigEnemy) {
if (this.bitmap && !this.bitmap.isReady()) {
this.bitmap.addLoadListener(this.setBigEnemy.bind(this));
} else {
this.setBigEnemy();
}
}
};
})();

View file

@ -0,0 +1,606 @@
//=============================================================================
// PictureVariableSetting.js
// ----------------------------------------------------------------------------
// (C) 2015 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.5.3 2021/08/29 DirectivityShake.jsと併用したとき、角度を付けたシェイクにもP_OUT_OF_SCREEN_SHAKE_ONが対応できるよう修正
// 1.5.2 2019/06/02 P_OUT_OF_SCREEN_SHAKE_ON設定時、シェイクの強さ次第で僅かに揺れていた問題を修正
// 1.5.1 2019/05/02 P_OUT_OF_SCREEN_SHAKE_ONのヘルプを追記
// 1.5.0 2016/08/06 ピクチャを画面のシェイクと連動しないようにするコマンドを追加
// 1.4.0 2016/06/23 ピクチャをシェイクさせるコマンドを追加
// 1.3.0 2016/04/29 ピクチャを指定した角度まで回転させるコマンドを追加
// 1.2.1 2016/04/14 処理を適用するピクチャを範囲指定もしくは複数指定する機能を追加
// 1.2.0 2016/03/19 表示中のすべてのピクチャに処理を適用するコマンドを追加
// 1.1.2 2016/01/24 ピクチャの最大表示数を設定できる機能を追加
// 1.1.1 2015/12/20 番号の変数指定の初期値を有効/無効で設定できるよう修正
// 1.1.0 2015/11/27 ピクチャのファイル名に変数を組み込むことが出来る機能を追加
// 1.0.0 2015/11/24 初版
// ----------------------------------------------------------------------------
// [Blog] : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================
/*:
* @plugindesc ピクチャ関連のイベント機能拡張プラグイン
* @author トリアコンタン
*
* @param 初期値
* @desc 初期状態での有効/無効の設定値(ON/OFF)
* @default OFF
*
* @param ピクチャ表示最大数
* @desc ピクチャ表示最大数デフォルト100個を設定します
* 変えない場合は何も入力しないでください
* @default
*
* @help ピクチャ関連のイベント命令の機能を拡張します
* プラグインコマンドから機能を有効にしてください
*
* ピクチャ関連のイベント命令で番号が指定された変数の値になるよう
* 仕様を変更します
* 例えば番号に1を設定すると1番の変数の値をピクチャ番号として設定します
* プラグインコマンドからP_VARIABLE_VALIDP_VARIABLE_INVALID
* 有効/無効を切り替えてください初期状態では無効です
*
* ピクチャのファイル名に変数を組み込むことが出来るようになります
* 連番を含むファイル名などの柔軟な指定に有効です
* プラグインコマンドP_D_FILENAMEを実行してから
* 画像を指定せずピクチャの表示を行ってください
*
* 要注意 ピクチャのファイル名を動的指定した場合デプロイメント時に
* 未使用ファイルとして除外される可能性があります
* その場合削除されたファイルを入れ直す等の対応が必要です
*
* 以下のイベントコマンドの対象が複数のピクチャになります
*   詳細は各プラグインコマンドの説明を確認してください
* ピクチャの移動
* ピクチャの色調変更
* ピクチャの回転
* ピクチャの消去
*
* プラグインコマンド詳細
* イベントコマンドプラグインコマンドから実行
* 引数の間は半角スペースで区切る
*
* P_VARIABLE_VALID : ピクチャ番号の変数設定が有効になります
* P_VARIABLE_INVALID : ピクチャ番号の変数設定が無効になります
* 一度有効に設定したら無効にするまでずっとそのままです
* P_VARIABLE_VALID
*
* P_D_FILENAME [ファイル名]
* 次に表示するピクチャのファイル名に変数を含めることができます
* 変数は文章の表示と同様の書式\V[n]で組み込んでください
* 拡張子は指定しないでください
* P_D_FILENAME file\V[1]
*
* P_TARGET_ALL
* ピクチャ関連のイベントコマンドの対象を
* 表示している全てのピクチャに変更します
* 1回実行すると設定はもとに戻ります
* P_TARGET_ALL
*
* P_TARGET_RANGE [開始番号] [終了番号]
* ピクチャ関連のイベントコマンドの対象を
* 開始番号から終了番号までのピクチャに変更します
* 1回実行すると設定はもとに戻ります
* P_TARGET_RANGE 3 5 // 3番から5番までの表示しているピクチャが対象
*
* P_TARGET_MULTI [ピクチャ番号]
* ピクチャ関連のイベントコマンドの対象を
* 指定したすべてのピクチャに変更しますカンマで区切ってください
* 1回実行すると設定はもとに戻ります
* P_TARGET_MULTI 3,5,6,\v[1] // 3番、5番、6番、変数「1」番のピクチャが対象
*
* P_SPIN [ピクチャ番号] [角度] [時間(フレーム)] [完了までウェイト]
* 対象のピクチャを指定した角度(degree)まで回転させます正の値が時計回りです
* 時間を0にすると即座に指定した角度に設定されます
* このコマンドにはP_TARGET_ALL等が適用されます
* 一番後ろにWAITと付けると回転が完了するまでウェイトします
* P_SPIN 1 90 60 WAIT
* -> ピクチャ番号1を60フレーム掛けて90度回転させる
*
* P_SPIN_RELATIVE [ピクチャ番号] [角度] [時間(フレーム)] [完了までウェイト]
* 対象のピクチャを現在の角度を基準に指定した角度のぶんだけ回転させます
* それ以外はP_SPINと同様です
* P_SPIN_RELATIVE \v[1] -90 0
* -> 変数1の値のピクチャを現在の角度から-90度まで即座に回転させる
*
* P_SHAKE [ピクチャ番号] [強さ] [速さ] [角度] [時間(フレーム)] [完了までウェイト]
* 対象のピクチャをシェイクさせます強さと速さはイベント画面のシェイク
* 同様の9段階の数値で指定します角度(degree)はシェイク方向を0から360までの
* 値で指定します(90で縦方向にシェイクします)
* 時間を指定しないと停止するまでシェイクし続けます
* 一番後ろにWAITと付けると回転が完了するまでウェイトします
* このコマンドにはP_TARGET_ALL等が適用されます
* P_SHAKE 1 3 9 0 60 WAIT
* -> ピクチャ番号1を60フレームのあいだ強さ3速さ9で横方向にシェイクします
*
* P_STOP_SHAKE [ピクチャ番号]
* 対象のピクチャをシェイクを止めますP_SHAKEで時間を指定しないと
* ずっとシェイクし続けるので当コマンドで無効にします
* このコマンドにはP_TARGET_ALL等が適用されます
*  P_STOP_SHAKE \v[1]
* -> 変数1の値のピクチャのシェイクを止めます
*
* P_OUT_OF_SCREEN_SHAKE_ON [ピクチャ番号]
* 対象のピクチャが画面のシェイクと連動しないようになります
* メッセージウィンドウ等と同じ扱いになります
* このコマンドはピクチャの表示後に実行する必要があります
* またこのコマンド実行後に同一番号でピクチャを再表示すると無効になります
*
* P_OUT_OF_SCREEN_SHAKE_ON 1
* -> ピクチャ番号1が画面のシェイクと連動しないようになります
*
* P_OUT_OF_SCREEN_SHAKE_OFF [ピクチャ番号]
* 対象のピクチャが画面のシェイクと再度連動するようになります
* P_OUT_OF_SCREEN_SHAKE_OFF 1
* -> ピクチャ番号1が画面のシェイクと再度連動するようになります
*
* 利用規約
* 作者に無断で改変再配布が可能で利用形態商用18禁利用等
* についても制限はありません
* このプラグインはもうあなたのものです
*/
(function () {
'use strict';
var pluginName = 'PictureVariableSetting';
//=============================================================================
// ローカル関数
// プラグインパラメータやプラグインコマンドパラメータの整形やチェックをします
//=============================================================================
var getParamBoolean = function (paramNames) {
var value = getParamOther(paramNames);
return (value || '').toUpperCase() === 'ON';
};
var getParamNumber = function (paramNames, min, max) {
var value = getParamOther(paramNames);
if (arguments.length < 2) min = -Infinity;
if (arguments.length < 3) max = Infinity;
return (parseInt(value, 10) || 0).clamp(min, max);
};
var getParamOther = function (paramNames) {
if (!Array.isArray(paramNames)) paramNames = [paramNames];
for (var i = 0; i < paramNames.length; i++) {
var name = PluginManager.parameters(pluginName)[paramNames[i]];
if (name) return name;
}
return null;
};
var getCommandName = function (command) {
return (command || '').toUpperCase();
};
var getArgString = function (arg, upperFlg) {
arg = convertEscapeCharactersAndEval(arg, false);
return upperFlg ? arg.toUpperCase() : arg;
};
var getArgNumber = function (arg, min, max) {
if (arguments.length < 2) min = -Infinity;
if (arguments.length < 3) max = Infinity;
return (parseInt(convertEscapeCharactersAndEval(arg, true), 10) || 0).clamp(min, max);
};
var getArgArrayString = function (args, upperFlg) {
var values = getArgString(args, upperFlg).split(',');
for (var i = 0; i < values.length; i++) values[i] = values[i].trim();
return values;
};
var getArgArrayNumber = function (args, min, max) {
var values = getArgArrayString(args, false);
if (arguments.length < 2) min = -Infinity;
if (arguments.length < 3) max = Infinity;
for (var i = 0; i < values.length; i++) values[i] = (parseInt(values[i], 10) || 0).clamp(min, max);
return values;
};
var convertEscapeCharactersAndEval = function (text, evalFlg) {
if (text === null || text === undefined) text = '';
var window = SceneManager._scene._windowLayer.children[0];
if (window) {
var result = window.convertEscapeCharacters(text);
return evalFlg ? eval(result) : result;
} else {
return text;
}
};
//=============================================================================
// Game_Interpreter
// プラグインコマンド[P_VARIABLE_VALID]などを追加定義します。
// ピクチャ番号を変数で指定するよう変更します。
//=============================================================================
var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function (command, args) {
_Game_Interpreter_pluginCommand.call(this, command, args);
switch (getCommandName(command)) {
case 'P_VARIABLE_VALID':
$gameSystem.pictureNumVariable = true;
break;
case 'P_VARIABLE_INVALID':
$gameSystem.pictureNumVariable = false;
break;
case 'P_D_FILENAME':
$gameScreen.dPictureFileName = getArgString(args[0]);
break;
case 'P_TARGET_ALL':
$gameScreen.setPictureTargetAll();
break;
case 'P_TARGET_RANGE':
$gameScreen.setPictureTargetRange(getArgNumber(args[0], 1), getArgNumber(args[1], 1));
break;
case 'P_TARGET_MULTI':
$gameScreen.setPictureTargetMulti(getArgArrayNumber(args[0], 1));
break;
case 'P_SPIN':
var spinDuration = getArgNumber(args[2], 0);
$gameScreen.spinPicture(getArgNumber(args[0], 1), getArgNumber(args[1]), spinDuration);
if (args[3]) this.wait(spinDuration);
break;
case 'P_SPIN_RELATIVE':
var spinRelativeDuration = getArgNumber(args[2], 0);
$gameScreen.spinPictureRelative(getArgNumber(args[0], 1), getArgNumber(args[1]), spinRelativeDuration);
if (args[3]) this.wait(spinRelativeDuration);
break;
case 'P_SHAKE':
var shakeDuration = getArgNumber(args[4], 0) || Infinity;
var power = getArgNumber(args[1], 1, 9);
var speed = getArgNumber(args[2], 1, 9);
var rotation = getArgNumber(args[3], 0, 360);
$gameScreen.shakePicture(getArgNumber(args[0], 1), power, speed, rotation, shakeDuration);
if (args[5] && shakeDuration !== Infinity) this.wait(shakeDuration);
break;
case 'P_STOP_SHAKE':
$gameScreen.shakePicture(getArgNumber(args[0], 1), 0, 0, 0, 0);
break;
case 'P_OUT_OF_SCREEN_SHAKE_ON':
$gameScreen.setOutOfScreenShakePicture(getArgNumber(args[0], 1), true);
break;
case 'P_OUT_OF_SCREEN_SHAKE_OFF':
$gameScreen.setOutOfScreenShakePicture(getArgNumber(args[0], 1), false);
break;
}
};
var _Game_Interpreter_command231 = Game_Interpreter.prototype.command231;
Game_Interpreter.prototype.command231 = function () {
return this.transPictureNumber(_Game_Interpreter_command231.bind(this));
};
var _Game_Interpreter_command232 = Game_Interpreter.prototype.command232;
Game_Interpreter.prototype.command232 = function () {
return this.transPictureNumber(_Game_Interpreter_command232.bind(this));
};
var _Game_Interpreter_command233 = Game_Interpreter.prototype.command233;
Game_Interpreter.prototype.command233 = function () {
return this.transPictureNumber(_Game_Interpreter_command233.bind(this));
};
var _Game_Interpreter_command234 = Game_Interpreter.prototype.command234;
Game_Interpreter.prototype.command234 = function () {
return this.transPictureNumber(_Game_Interpreter_command234.bind(this));
};
var _Game_Interpreter_command235 = Game_Interpreter.prototype.command235;
Game_Interpreter.prototype.command235 = function () {
return this.transPictureNumber(_Game_Interpreter_command235.bind(this));
};
Game_Interpreter.prototype.transPictureNumber = function (handler) {
var result;
if ($gameSystem.pictureNumVariable) {
var oldValue = this._params[0];
this._params[0] = $gameVariables.value(this._params[0]).clamp(1, $gameScreen.maxPictures());
result = handler();
this._params[0] = oldValue;
} else {
result = handler();
}
return result;
};
//=============================================================================
// Game_System
// ピクチャ番号の変数指定フラグを追加定義します。
//=============================================================================
var _Game_System_initialize = Game_System.prototype.initialize;
Game_System.prototype.initialize = function () {
_Game_System_initialize.call(this);
this.pictureNumVariable = getParamBoolean('初期値');
};
//=============================================================================
// Game_Screen
// 動的ファイル名指定用のプロパティを追加定義します。
//=============================================================================
var _Game_Screen_clear = Game_Screen.prototype.clear;
Game_Screen.prototype.clear = function () {
_Game_Screen_clear.call(this);
this.dPictureFileName = null;
this._pictureTargetStart = null;
this._pictureTargetEnd = null;
this._pictureTargetNumbers = null;
};
Game_Screen.prototype.setPictureTargetAll = function () {
this._pictureTargetAll = 1;
};
Game_Screen.prototype.setPictureTargetRange = function (start, end) {
this._pictureTargetAll = 2;
this._pictureTargetStart = start;
this._pictureTargetEnd = end;
};
Game_Screen.prototype.setPictureTargetMulti = function (args) {
this._pictureTargetAll = 3;
this._pictureTargetNumbers = args;
};
var _Game_Screen_movePicture = Game_Screen.prototype.movePicture;
Game_Screen.prototype.movePicture = function (pictureId, origin, x, y, scaleX,
scaleY, opacity, blendMode, duration) {
if (this._pictureTargetAll > 0) {
this.iteratePictures(function (picture) {
picture.move(origin, x, y, scaleX, scaleY, opacity, blendMode, duration);
}.bind(this));
this._pictureTargetAll = 0;
} else {
_Game_Screen_movePicture.apply(this, arguments);
}
};
var _Game_Screen_rotatePicture = Game_Screen.prototype.rotatePicture;
Game_Screen.prototype.rotatePicture = function (pictureId, speed) {
if (this._pictureTargetAll > 0) {
this.iteratePictures(function (picture) {
picture.rotate(speed);
}.bind(this));
this._pictureTargetAll = 0;
} else {
_Game_Screen_rotatePicture.apply(this, arguments);
}
};
var _Game_Screen_tintPicture = Game_Screen.prototype.tintPicture;
Game_Screen.prototype.tintPicture = function (pictureId, tone, duration) {
if (this._pictureTargetAll > 0) {
this.iteratePictures(function (picture) {
picture.tint(tone, duration);
}.bind(this));
this._pictureTargetAll = 0;
} else {
_Game_Screen_tintPicture.apply(this, arguments);
}
};
var _Game_Screen_erasePicture = Game_Screen.prototype.erasePicture;
Game_Screen.prototype.erasePicture = function (pictureId) {
if (this._pictureTargetAll) {
this.iteratePictures(function (picture, pictureId) {
var realPictureId = this.realPictureId(pictureId);
this._pictures[realPictureId] = null;
}.bind(this));
this._pictureTargetAll = 0;
} else {
_Game_Screen_erasePicture.apply(this, arguments);
}
};
Game_Screen.prototype.spinPicture = function (pictureId, rotation, duration) {
if (this._pictureTargetAll > 0) {
this.iteratePictures(function (picture) {
picture.spin(rotation, duration);
}.bind(this));
this._pictureTargetAll = 0;
} else {
var picture = this.picture(pictureId);
if (picture) {
picture.spin(rotation, duration);
}
}
};
Game_Screen.prototype.spinPictureRelative = function (pictureId, relativeRotation, duration) {
if (this._pictureTargetAll > 0) {
this.iteratePictures(function (picture) {
picture.spinRelative(relativeRotation, duration);
}.bind(this));
this._pictureTargetAll = 0;
} else {
var picture = this.picture(pictureId);
if (picture) {
picture.spinRelative(relativeRotation, duration);
}
}
};
Game_Screen.prototype.shakePicture = function (pictureId, power, speed, rotation, duration) {
if (this._pictureTargetAll > 0) {
this.iteratePictures(function (picture) {
picture.shake(power, speed, rotation, duration);
}.bind(this));
this._pictureTargetAll = 0;
} else {
var picture = this.picture(pictureId);
if (picture) {
picture.shake(power, speed, rotation, duration);
}
}
};
Game_Screen.prototype.setOutOfScreenShakePicture = function (pictureId, value) {
if (this._pictureTargetAll > 0) {
this.iteratePictures(function (picture) {
picture.setOutOfScreenShake(value);
}.bind(this));
this._pictureTargetAll = 0;
} else {
var picture = this.picture(pictureId);
if (picture) {
picture.setOutOfScreenShake(value);
}
}
};
Game_Screen.prototype.iteratePictures = function (callBack) {
for (var i = 1, n = this.maxPictures(); i <= n; i++) {
var picture = this.picture(i);
if (picture && this.isTargetPicture(i)) {
callBack.call(this, picture, i);
}
}
};
Game_Screen.prototype.isTargetPicture = function (number) {
switch (this._pictureTargetAll) {
case 2:
return this._pictureTargetStart <= number && this._pictureTargetEnd >= number;
case 3:
return this._pictureTargetNumbers.contains(number);
default:
return true;
}
};
var _Game_Screen_maxPictures = Game_Screen.prototype.maxPictures;
Game_Screen.prototype.maxPictures = function () {
var max = getParamNumber('ピクチャ表示最大数', 0);
return max > 0 ? max : _Game_Screen_maxPictures.apply(this, arguments);
};
//=============================================================================
// Game_Picture
// ファイル名の動的生成処理を追加定義します。
//=============================================================================
var _Game_Picture_show = Game_Picture.prototype.show;
Game_Picture.prototype.show = function (name, origin, x, y, scaleX,
scaleY, opacity, blendMode) {
if ($gameScreen.dPictureFileName != null) {
arguments[0] = $gameScreen.dPictureFileName;
$gameScreen.dPictureFileName = null;
}
_Game_Picture_show.apply(this, arguments);
};
var _Game_Picture_x = Game_Picture.prototype.x;
Game_Picture.prototype.x = function () {
return _Game_Picture_x.apply(this, arguments) + this.getShakeX() +
(this._outOfScreenShake ? this.antiShakeX() : 0);
};
Game_Picture.prototype.antiShakeX = function () {
if (!this._outOfScreenShake) {
return 0;
}
var shakeDistance = Math.round($gameScreen.shake());
if ($gameScreen.getShakeRotation) {
var shakeRotation = $gameScreen.getShakeRotation();
return -Math.round(Math.cos(shakeRotation) * shakeDistance);
} else {
return -shakeDistance;
}
};
var _Game_Picture_y = Game_Picture.prototype.y;
Game_Picture.prototype.y = function () {
return _Game_Picture_y.apply(this, arguments) + this.getShakeY() +
(this._outOfScreenShake ? this.antiShakeY() : 0);
};
Game_Picture.prototype.antiShakeY = function () {
if (!this._outOfScreenShake) {
return 0;
}
var shakeDistance = Math.round($gameScreen.shake());
if ($gameScreen.getShakeRotation) {
var shakeRotation = $gameScreen.getShakeRotation();
return -Math.sin(shakeRotation) * shakeDistance;
} else {
return 0;
}
};
Game_Picture.prototype.setOutOfScreenShake = function (value) {
this._outOfScreenShake = !!value;
};
Game_Picture.prototype.spin = function (targetRotation, duration) {
this._targetRotation = targetRotation;
this._angle = (this._angle % 360);
if (duration === 0) {
this._angle = this._targetRotation;
} else {
this._spinDuration = duration;
}
};
Game_Picture.prototype.spinRelative = function (targetRelativeRotation, duration) {
this._angle = (this._angle % 360);
this.spin(this._angle + targetRelativeRotation, duration);
};
Game_Picture.prototype.shake = function (power, speed, rotation, duration) {
this.stopShake();
this._shakePower = power;
this._shakeSpeed = speed;
this._shakeDuration = duration;
this._shakeRotation = rotation * Math.PI / 180;
};
Game_Picture.prototype.stopShake = function () {
this._shakeDirection = 1;
this._shake = 0;
};
var _Game_Picture_update = Game_Picture.prototype.update;
Game_Picture.prototype.update = function () {
_Game_Picture_update.apply(this, arguments);
this.updateSpin();
this.updateShake();
};
Game_Picture.prototype.updateSpin = function () {
if (this._spinDuration > 0) {
var d = this._spinDuration;
this._angle = (this._angle * (d - 1) + this._targetRotation) / d;
this._spinDuration--;
}
};
Game_Picture.prototype.updateShake = function () {
if (this._shakeDuration > 0) {
var delta = (this._shakePower * this._shakeSpeed * this._shakeDirection) / 10;
if (this._shakeDuration <= 1 && this._shake * (this._shake + delta) < 0) {
this._shake = 0;
} else {
this._shake += delta;
}
if (this._shake > this._shakePower * 2) {
this._shakeDirection = -1;
}
if (this._shake < -this._shakePower * 2) {
this._shakeDirection = 1;
}
this._shakeDuration--;
}
};
Game_Picture.prototype.getShakeX = function () {
return this._shake ? this._shake * Math.cos(this._shakeRotation) : 0;
};
Game_Picture.prototype.getShakeY = function () {
return this._shake ? this._shake * Math.sin(this._shakeRotation) : 0;
};
})();

View file

@ -0,0 +1,512 @@
//=============================================================================
// RPG Maker MZ - Plugin Analysis Common Base
//=============================================================================
// Version
// 1.0.5 2022/02/21 TextScriptBase.jsの\txの制御文字のなかに\s[n]を使ったときに正常に返還されない問題を修正
// 1.0.4 2021/12/19 オブジェクトのクラス名を取得する共通関数が一部のパターン
// functionを使った宣言かつ名称の後ろにスペースがあるケース等で正常に取得できない問題を修正
// 1.0.3 2021/10/07 文章の表示で「\\」が正しく表示されない問題を修正
// 1.0.2 2021/05/15 プラグインコマンドにもsuffixで型変換しない仕様を適用
// 1.0.1 2021/04/15 プラグイン名称取得で全角文字を考慮
// 配列の要素のパラメータの制御文字が正常に取得できない問題を修正
// 1.0.0 2020/08/20 初版
//=============================================================================
/*:
* @target MZ
* @plugindesc Plugin Analysis Common Base
* @author triacontane
*
* @help PluginCommonBase.js
*
* This plugin is a base plugin that is meant to be referenced from other plugins.
* This plugin allows you to use the following control characters in a variety of situations.
*
* Usable Control Characters
* \v[n] : nis converted to the value of the nth variable.
* \s[n] : nis converted to the value (true, false) of the nth switch.
* \ss[n] : nis converted to the value (true, false) of the nth self switch.
* n -> A, B, C, D
*
* The situations where control characters can be used are as follows.
* -Text display
* -Notes field (*)
* -Plugin command (*)
* -Plugin parameter (*)
* -Explanation fields for skills, etc.
* *Only for plugins that take PluginCommonBase.js as a base.
*
* Below is an explanation for developers.
*
* Introducing this plugin as a base allows conversion of parameter types and control characters,
* when analyzing parameters or fetching plugin commands/note fields, to be automated.
* Standardizing control character allows conversion processing, and consistent
* control character conversion specs to be implemented in all subordinate plugins.
*
* -Plugin Parameter Type Analysis
* Automatically analyzes type and converts plugin parameters.
* Also automatically converts control characters when the parameter is fetched.
* Calls the following methods to fetch return values.
* Always specifies "document.currentScript" in the argument.
*
* PluginManagerEx.createParameter(document.currentScript);
*
* However, if the end of the parameter name (regardless of case)
* is one of the following values, the value will be returned as-is without control character or type conversion.
* text
* name
* note
* desc
* script
*
* -Plugin Command Parameter Type Analysis
* Automatically analyzes type and converts plugin command parameters.
* Also automatically converts control characters when the parameter is fetched.
* Uses the following in place of PluginManager.registerCommand.
* Always specifies "document.currentScript" in the argument.
*
* PluginManagerEx.registerCommand(document.currentScript, "command", args => {
* });
*
* -Notes Field Analysis
* Retrieves notes field information from specified objects.
* Automatically converts control characters.
* Multiple names can be specified.
*
* PluginManagerEx.findMetaValue(obj, tagName1, tagName2...);
*
* -Dynamic Common Event Execution
* Executions dynamic common events.
* Dynamic common events are stacked parallel processed common events.
* Use to execute as many common events with the same ID in parallel as you want.
* It can register as many common events as you want and automatically discards those that have been executed.
*
* $gameMap.setupDynamicCommon(commonEventId);
*
*/
/*:ja
* @target MZ
* @plugindesc パラメータ解析を提供する共通基盤です
* @author トリアコンタン
* @url \dlc\BasicResources\plugins\official
*
* @help PluginCommonBase.js
*
* 本プラグインは他のプラグインから参照されることを前提としたベースプラグインです
* 本プラグインを導入すると様々な場面で以下の制御文字が使えるようになります
*
* 利用可能な制御文字
* \v[n] : n番目の変数の値に変換されます
* \s[n] : n番目のスイッチの値(true, false)に変換されます
* \ss[n] : セルフスイッチの値(true, false)に変換されます
* n -> A, B, C, D
*
* 制御文字を利用可能な場面は以下の通りです
* 文章の表示
* メモ欄()
* プラグインコマンド()
* プラグインパラメータ()
* スキルなどの説明欄
* PluginCommonBase.jsをベースとして取り込んだプラグインのみ
*
* 以下は開発者向けの解説です
*
* このプラグインをベースとして取り込むことでパラメータの解析や
* プラグインコマンドメモ欄の取得時にパラメータ型および制御文字の変換を自動化します
* 制御文字の変換処理を共通化することで配下の全てのプラグインで一貫した
* 制御文字の変換仕様を実現します
*
* プラグインパラメータの型解析
* プラグインパラメータを自動で型解析し変換します
* またパラメータ取得時に制御文字の変換を自動で行います
* 以下のメソッドを呼んで戻り値を取得します
* 引数には必ずdocument.currentScriptを指定します
*
* PluginManagerEx.createParameter(document.currentScript);
*
* ただしパラメータ名の末尾が(大文字小文字問わず)以下の値の場合
* 制御文字や型の変換は行われずそのままの値を返します
* text
* name
* note
* desc
* script
*
* プラグインコマンドパラメータの型解析
* プラグインコマンドパラメータを自動で型解析し変換します
* またパラメータ取得時に制御文字の変換を自動で行います
* PluginManager.registerCommandの代わりに以下を使用します
* 引数には必ずdocument.currentScriptを指定します
*
* PluginManagerEx.registerCommand(document.currentScript, "command", args => {
* });
*
* メモ欄の解析
* 指定したオブジェクトからメモ欄情報を取得します
* 制御文字の変換を自動で行います
* 名称は複数指定することも可能です
*
* PluginManagerEx.findMetaValue(obj, tagName1, tagName2...);
*
* 動的コモンイベントの実行
* 動的コモンイベントを実行できます
* 動的コモンイベントとはスタック型の並列処理コモンイベントです
* 同一IDのコモンイベントも好きなだけ並列実行できます
* 実行が終わったものから自働で破棄されます
*
* $gameMap.setupDynamicCommon(commonEventId);
*/
(() => {
'use strict';
/**
* PluginParam
*/
class PluginParam {
constructor(parameter, needParse = true) {
if (needParse) {
parameter = JSON.parse(JSON.stringify(parameter, this._paramReplacer));
}
this.setup(parameter);
}
setup(parameter) {
this._parameter = parameter;
for (let paramName in parameter) {
if (!parameter.hasOwnProperty(paramName)) {
continue;
}
const subParam = parameter[paramName];
if (this._isStructArray(subParam)) {
subParam.forEach((subParamItem, index) => {
subParam[index] = new PluginParam(subParamItem, false);
});
} else if (this._isStruct(subParam)) {
parameter[paramName] = new PluginParam(subParam, false);
}
this._createAccessor(paramName);
}
}
_createAccessor(paramName) {
Object.defineProperty(this, paramName, {
get() {
return this._convert(this._param(paramName), paramName);
},
set(value) {
this._parameter[paramName] = value;
},
configurable: true
});
}
_convert(param, paramName) {
if (this._isStruct(param) || this._isStructArray(param)) {
return param;
} else if (Array.isArray(param)) {
return param.map(paramItem => this._convert(paramItem, paramName));
}
if (!PluginManagerEx.findTextParamSuffixList().some(regExp => paramName.match(regExp))) {
return PluginManagerEx.convertVariables(param);
} else {
return String(param);
}
}
_isStructArray(param) {
return Array.isArray(param) && (param.length === 0 || this._isStruct(param[0]));
}
_isStruct(param) {
return Object.prototype.toString.call(param) === '[object Object]';
}
_param(name) {
return this._parameter[name];
}
_paramReplacer(key, value) {
if (value === 'null') {
return value;
}
if (value[0] === '"' && value[value.length - 1] === '"') {
return value;
}
try {
return JSON.parse(value);
} catch (e) {
return value;
}
}
}
/**
* PluginManagerEx
*/
class PluginManagerEx {
static convertVariables(text, data = null) {
if (text !== String(text)) {
return text;
}
text = this.convertEscapeCharacters(text, data);
if (text === 'true') {
return true;
} else if (text === 'false') {
return false;
} else if (Number(text) === parseFloat(text)) {
return parseFloat(text);
} else {
return text;
}
}
static convertEscapeCharacters(text, data = null, needEscape = true) {
if (needEscape) {
text = text.replace(/\\/g, "\x1b");
text = text.replace(/\x1b\x1b/g, "\\");
}
text = TextConverter.convertEscapeCharactersBase(text, data);
text = this.convertEscapeCharactersEx(text, data);
text = TextConverter.convertEscapeCharactersBase(text, data);
return text;
}
// Additional Escape Characters
static convertEscapeCharactersEx(text, data = null) {
text = text.replace(/\x1bS\[(\d+)]/gi, (_, p1) => {
return $gameSwitches ? $gameSwitches.value(parseInt(p1)) : '';
});
text = text.replace(/\x1bSS\[(\w+)]/gi, (_, p1) => {
const key = this._selfSwitchKey;
if (!key) {
return false;
}
key[2] = p1.toUpperCase();
return $gameSelfSwitches ? $gameSelfSwitches.value(key) : '';
});
return text;
}
static createParameter(currentScript) {
const paramText = PluginManager.parameters(this.findPluginName(currentScript));
return new PluginParam(paramText);
}
static createCommandArgs(args) {
const hasObject = Object.keys(args).some(key => {
return args[key].match(/^[\[{].*[}\]]$/);
});
if (hasObject) {
return new PluginParam(args);
}
const newArgs = {};
Object.keys(args).forEach(key => {
if (!this.findTextParamSuffixList().some(regExp => key.match(regExp))) {
newArgs[key] = this.convertVariables(args[key]);
} else {
newArgs[key] = args[key];
}
});
return newArgs;
}
static findMetaValue(object, nameList) {
if (!Array.isArray(nameList)) {
nameList = [nameList];
}
const meta = this.findMetaProperty(object);
this.generateSelfSwitchKey(object.id);
for (const name of nameList) {
if (meta.hasOwnProperty(name)) {
return this.convertVariables(meta[name], object);
}
}
}
static findMetaObject(object, nameList) {
if (!Array.isArray(nameList)) {
nameList = [nameList];
}
const meta = this.findMetaProperty(object);
this.generateSelfSwitchKey(object.id);
for (const name of nameList) {
if (meta.hasOwnProperty(name)) {
return new PluginParam(meta[name]);
}
}
}
static findMetaProperty(object) {
const meta = object.meta;
if (!meta) {
throw new Error(`Meta property not found : ${object}`)
}
return meta;
}
static findPluginName(currentScript) {
return currentScript.src.replace(/^.*\/(.*).js$/, function () {
return decodeURIComponent(arguments[1]);
});
}
static registerCommand(currentScript, commandName, funcName) {
const pluginName = this.findPluginName(currentScript);
const key = pluginName + ":" + commandName;
const func = typeof funcName === 'function' ? funcName : Game_Interpreter.prototype[funcName];
if (!func) {
throw new Error(`Not found function Game_Interpreter : ${funcName}`)
}
PluginManager.registerCommand(pluginName, commandName, function (args) {
func.call(this, PluginManagerEx.createCommandArgs(args, key));
});
}
static isExistPlugin(pluginName) {
return Object.keys(PluginManager.parameters(pluginName)).length > 0;
}
static generateSelfSwitchKey(eventId) {
if (!$gameMap) {
return;
}
this._selfSwitchKey = [$gameMap.mapId(), eventId, null];
}
static findClassName(object) {
const define = object.constructor.toString();
if (define.match(/^class/)) {
return define.replace(/class\s+(.*?)\s+[\s\S]*/m, '$1');
}
return define.replace(/function\s+(.*?)\s*\([\s\S]*/m, '$1');
}
static throwError(message, currentScript) {
const pluginName = this.findPluginName(currentScript);
throw new Error(`By ${pluginName} : ${message}`);
}
static escapeXmlTag(text) {
text = text.replace(/&gt;?/gi, '>');
return text.replace(/&lt;?/gi, '<');
}
static findTextParamSuffixList() {
return [/text$/gi, /name$/gi, /desc$/gi, /note$/gi, /script$/gi];
}
}
window.PluginManagerEx = PluginManagerEx;
class TextConverter {
// Copy of Window_Base.prototype.convertEscapeCharacters
static convertEscapeCharactersBase(text, data = null) {
text = text.replace(/\x1bV\[(\d+)]/gi, (_, p1) =>
$gameVariables ? $gameVariables.value(parseInt(p1)) : ''
);
text = text.replace(/\x1bV\[(\d+)]/gi, (_, p1) =>
$gameVariables ? $gameVariables.value(parseInt(p1)) : ''
);
text = text.replace(/\x1bN\[(\d+)]/gi, (_, p1) =>
this.actorName(parseInt(p1))
);
text = text.replace(/\x1bP\[(\d+)]/gi, (_, p1) =>
this.partyMemberName(parseInt(p1))
);
if ($dataSystem) {
text = text.replace(/\x1bG/gi, TextManager.currencyUnit);
}
return text;
}
static actorName(n) {
const actor = n >= 1 && $gameActors ? $gameActors.actor(n) : null;
return actor ? actor.name() : '';
}
static partyMemberName(n) {
const actor = n >= 1 && $gameParty ? $gameParty.members()[n - 1] : null;
return actor ? actor.name() : "";
}
}
const _PluginManager_callCommand = PluginManager.callCommand;
PluginManager.callCommand = function (self, pluginName, commandName, args) {
PluginManagerEx.generateSelfSwitchKey(self.eventId());
_PluginManager_callCommand.apply(this, arguments);
};
const _Window_Base_convertEscapeCharacters = Window_Base.prototype.convertEscapeCharacters;
Window_Base.prototype.convertEscapeCharacters = function (text) {
text = _Window_Base_convertEscapeCharacters.apply(this, arguments);
return PluginManagerEx.convertEscapeCharacters(text, null, false);
};
const _Game_System_onAfterLoad = Game_System.prototype.onAfterLoad;
Game_System.prototype.onAfterLoad = function () {
_Game_System_onAfterLoad.apply(this, arguments);
$gameMap.initDynamicEvents();
};
/**
* Game_Map
* Support dynamic events.
*/
const _Game_Map_setupEvents = Game_Map.prototype.setupEvents;
Game_Map.prototype.setupEvents = function () {
_Game_Map_setupEvents.apply(this, arguments);
this.initDynamicEvents();
};
Game_Map.prototype.initDynamicEvents = function () {
if (!this._dynamicEvents) {
this._dynamicEvents = [];
}
};
Game_Map.prototype.isInterpreterOf = function (interpreter) {
return this._interpreter === interpreter;
};
Game_Map.prototype.setupDynamicCommon = function (id) {
const event = $dataCommonEvents[id];
if (event) {
this.setupDynamicInterpreter(event.list);
}
};
Game_Map.prototype.setupDynamicInterpreter = function (list) {
const interpreter = new Game_Interpreter();
interpreter.setup(list, 0);
this._dynamicEvents.push(interpreter);
this._dynamicEvents = this._dynamicEvents.filter(
interpreter => interpreter.isRunning());
};
const _Game_Map_updateEvents = Game_Map.prototype.updateEvents;
Game_Map.prototype.updateEvents = function () {
_Game_Map_updateEvents.apply(this, arguments);
this._dynamicEvents.forEach(interpreter => interpreter.update());
};
/**
* Game_Event
*/
Game_Event.prototype.findMeta = function (metaNames) {
return PluginManagerEx.findMetaValue(this.event(), metaNames)
};
/**
* Game_Interpreter
*/
const _Game_Interpreter_setup = Game_Interpreter.prototype.setup;
Game_Interpreter.prototype.setup = function (list, eventId) {
_Game_Interpreter_setup.apply(this, arguments);
if (eventId) {
PluginManagerEx.generateSelfSwitchKey(eventId);
}
};
})();

File diff suppressed because it is too large Load diff

2716
js/plugins/StandPictureEC.js Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,471 @@
//
// 立ち絵表示制御文字用マクロ設定 ver1.02
//
// ------------------------------------------------------
// Copyright (c) 2016 Yana
// Released under the MIT license
// http://opensource.org/licenses/mit-license.php
// ------------------------------------------------------
//
// author Yana
//
var Imported = Imported || {};
Imported['StandPictureSettingM'] = 1.02;
if (!Imported.StandPictureSettingP) {
console.error('StandPictureSettingPを導入してください。')
}
/*:
* @plugindesc ver1.02/立ち絵表示制御文字用のマクロ設定用プラグインです
* @author Yana
*
* @param Start Index
* @desc 開始インデックスです
* 特に理由がない場合0を指定してください
* @default 0
*
* @param Macro0
* @desc インデックス0番のマクロです
* @default
*
* @param Macro1
* @desc インデックス1番のマクロです
* @default
*
* @param Macro2
* @desc インデックス2番のマクロです
* @default
*
* @param Macro3
* @desc インデックス3番のマクロです
* @default
*
* @param Macro4
* @desc インデックス4番のマクロです
* @default
*
* @param Macro5
* @desc インデックス5番のマクロです
* @default
*
* @param Macro6
* @desc インデックス6番のマクロです
* @default
*
* @param Macro7
* @desc インデックス7番のマクロです
* @default
*
* @param Macro8
* @desc インデックス8番のマクロです
* @default
*
* @param Macro9
* @desc インデックス9番のマクロです
* @default
*
* @param Macro10
* @desc インデックス10番のマクロです
* @default
*
* @param Macro11
* @desc インデックス11番のマクロです
* @default
*
* @param Macro12
* @desc インデックス12番のマクロです
* @default
*
* @param Macro13
* @desc インデックス13番のマクロです
* @default
*
* @param Macro14
* @desc インデックス14番のマクロです
* @default
*
* @param Macro15
* @desc インデックス15番のマクロです
* @default
*
* @param Macro16
* @desc インデックス16番のマクロです
* @default
*
* @param Macro17
* @desc インデックス17番のマクロです
* @default
*
* @param Macro18
* @desc インデックス18番のマクロです
* @default
*
* @param Macro19
* @desc インデックス19番のマクロです
* @default
*
* @param Macro20
* @desc インデックス20番のマクロです
* @default
*
* @param Macro21
* @desc インデックス21番のマクロです
* @default
*
* @param Macro22
* @desc インデックス22番のマクロです
* @default
*
* @param Macro23
* @desc インデックス23番のマクロです
* @default
*
* @param Macro24
* @desc インデックス24番のマクロです
* @default
*
* @param Macro25
* @desc インデックス25番のマクロです
* @default
*
* @param Macro26
* @desc インデックス26番のマクロです
* @default
*
* @param Macro27
* @desc インデックス27番のマクロです
* @default
*
* @param Macro28
* @desc インデックス28番のマクロです
* @default
*
* @param Macro29
* @desc インデックス29番のマクロです
* @default
*
* @param Macro30
* @desc インデックス30番のマクロです
* @default
*
* @param Macro31
* @desc インデックス31番のマクロです
* @default
*
* @param Macro32
* @desc インデックス32番のマクロです
* @default
*
* @param Macro33
* @desc インデックス33番のマクロです
* @default
*
* @param Macro34
* @desc インデックス34番のマクロです
* @default
*
* @param Macro35
* @desc インデックス35番のマクロです
* @default
*
* @param Macro36
* @desc インデックス36番のマクロです
* @default
*
* @param Macro37
* @desc インデックス37番のマクロです
* @default
*
* @param Macro38
* @desc インデックス38番のマクロです
* @default
*
* @param Macro39
* @desc インデックス39番のマクロです
* @default
*
* @param Macro40
* @desc インデックス40番のマクロです
* @default
*
* @param Macro41
* @desc インデックス41番のマクロです
* @default
*
* @param Macro42
* @desc インデックス42番のマクロです
* @default
*
* @param Macro43
* @desc インデックス43番のマクロです
* @default
*
* @param Macro44
* @desc インデックス44番のマクロです
* @default
*
* @param Macro45
* @desc インデックス45番のマクロです
* @default
*
* @param Macro46
* @desc インデックス46番のマクロです
* @default
*
* @param Macro47
* @desc インデックス47番のマクロです
* @default
*
* @param Macro48
* @desc インデックス48番のマクロです
* @default
*
* @param Macro49
* @desc インデックス49番のマクロです
* @default
*
* @param Macro50
* @desc インデックス50番のマクロです
* @default
*
* @param Macro51
* @desc インデックス51番のマクロです
* @default
*
* @param Macro52
* @desc インデックス52番のマクロです
* @default
*
* @param Macro53
* @desc インデックス53番のマクロです
* @default
*
* @param Macro54
* @desc インデックス54番のマクロです
* @default
*
* @param Macro55
* @desc インデックス55番のマクロです
* @default
*
* @param Macro56
* @desc インデックス56番のマクロです
* @default
*
* @param Macro57
* @desc インデックス57番のマクロです
* @default
*
* @param Macro58
* @desc インデックス58番のマクロです
* @default
*
* @param Macro59
* @desc インデックス59番のマクロです
* @default
*
* @param Macro60
* @desc インデックス60番のマクロです
* @default
*
* @param Macro61
* @desc インデックス61番のマクロです
* @default
*
* @param Macro62
* @desc インデックス62番のマクロです
* @default
*
* @param Macro63
* @desc インデックス63番のマクロです
* @default
*
* @param Macro64
* @desc インデックス64番のマクロです
* @default
*
* @param Macro65
* @desc インデックス65番のマクロです
* @default
*
* @param Macro66
* @desc インデックス66番のマクロです
* @default
*
* @param Macro67
* @desc インデックス67番のマクロです
* @default
*
* @param Macro68
* @desc インデックス68番のマクロです
* @default
*
* @param Macro69
* @desc インデックス69番のマクロです
* @default
*
* @param Macro70
* @desc インデックス70番のマクロです
* @default
*
* @param Macro71
* @desc インデックス71番のマクロです
* @default
*
* @param Macro72
* @desc インデックス72番のマクロです
* @default
*
* @param Macro73
* @desc インデックス73番のマクロです
* @default
*
* @param Macro74
* @desc インデックス75番のマクロです
* @default
*
* @param Macro75
* @desc インデックス75番のマクロです
* @default
*
* @param Macro76
* @desc インデックス76番のマクロです
* @default
*
* @param Macro77
* @desc インデックス77番のマクロです
* @default
*
* @param Macro78
* @desc インデックス78番のマクロです
* @default
*
* @param Macro79
* @desc インデックス79番のマクロです
* @default
*
* @param Macro80
* @desc インデックス80番のマクロです
* @default
*
* @param Macro81
* @desc インデックス81番のマクロです
* @default
*
* @param Macro82
* @desc インデックス82番のマクロです
* @default
*
* @param Macro83
* @desc インデックス83番のマクロです
* @default
*
* @param Macro84
* @desc インデックス84番のマクロです
* @default
*
* @param Macro85
* @desc インデックス85番のマクロです
* @default
*
* @param Macro86
* @desc インデックス86番のマクロです
* @default
*
* @param Macro87
* @desc インデックス87番のマクロです
* @default
*
* @param Macro88
* @desc インデックス88番のマクロです
* @default
*
* @param Macro89
* @desc インデックス89番のマクロです
* @default
*
* @param Macro90.
* @desc インデックス90番のマクロです
* @default
*
* @param Macro91
* @desc インデックス91番のマクロです
* @default
*
* @param Macro92
* @desc インデックス92番のマクロです
* @default
*
* @param Macro93
* @desc インデックス94番のマクロです
* @default
*
* @param Macro95
* @desc インデックス95番のマクロです
* @default
*
* @param Macro96
* @desc インデックス96番のマクロです
* @default
*
* @param Macro97
* @desc インデックス97番のマクロです
* @default
*
* @param Macro98
* @desc インデックス98番のマクロです
* @default
*
* @param Macro99
* @desc インデックス99番のマクロです
* @default
*
* @help プラグインコマンドはありません
*
* このプラグインは立ち絵表示制御文字用の設定プラグインです
* StandPictureECよりも上StandPictureSettingPよりも下に配置してください
*
* プラグインの設定は
* :×××
* という形式で設定してください
* の部分はマクロの内容をわかりやすくするためのヘルプ欄としてご活用ください
* 実際にマクロとして使用されるのは×××の部分になります
* ------------------------------------------------------
* 利用規約
* ------------------------------------------------------
* 当プラグインはMITライセンスで公開されています
* 使用に制限はありません商用アダルトいずれにも使用できます
* 二次配布も制限はしませんがサポートは行いません
* 著作表示は任意です行わなくても利用できます
* 要するに特に規約はありません
* バグ報告や使用方法等のお問合せはネ実ツクールスレまたはTwitterにお願いします
* https://twitter.com/yanatsuki_
* 素材利用は自己責任でお願いします
* ------------------------------------------------------
* 更新履歴:
* ver1.02:181001
* 処理を修正
* ver1.01:
* 処理を修正
* ver1.00:
* 公開
*/
(function () {
var parameters = PluginManager.parameters('StandPictureSettingM');
var startIndex = Number(parameters['Start Index'] || 0);
StPicManager.macro = function (index) {
if (this._macro) { return this._macro[index] }
this._macro = [];
for (var i = 0; i < 100; i++) {
var text = String(parameters[String('Macro' + i)] || '');
if (text.match(/(.+?:)?(.+)/)) {
this._macro[i + (startIndex * 100)] = RegExp.$2;
}
}
return this._macro[index];
}
}());

Some files were not shown because too many files have changed in this diff Show more