Initial Commit

This commit is contained in:
Dazed 2024-03-13 22:56:16 -05:00
commit 6a0de1848e
93 changed files with 746995 additions and 0 deletions

36
.gitignore vendored Normal file
View file

@ -0,0 +1,36 @@
# Ignore all files
*.*
# Except
!*.json
!*.js
!*.zip
!*.7z
!*.csv
!*.ain
!*.fnl
!*.ks
!*.tjs
!*.yaml
!Data/*
!*.rb
!.gitignore
!README.md
!game.ini
# Images
!NE_0.rpgmvp
!NE_e2.rpgmvp
!NE_e3.rpgmvp
!NE_e4.rpgmvp
!NE_e5.rpgmvp
!NE_e6.rpgmvp
!NE_s2.rpgmvp
!NE_s3.rpgmvp
!NE_s4.rpgmvp
!NE_s5.rpgmvp
!NE_s6.rpgmvp
!clo.rpgmvp
!clo1.rpgmvp
!clo2.rpgmvp
!clo3.rpgmvp

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.

348
data/Actors.json Normal file
View file

@ -0,0 +1,348 @@
[
null,
{
"id": 1,
"battlerName": "Actor1_1",
"characterIndex": 1,
"characterName": "o-s-1",
"classId": 1,
"equips": [
2,
0,
0,
3,
0
],
"faceIndex": 0,
"faceName": "",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "佐藤 衛(さとう まもる)",
"nickname": "",
"note": "",
"profile": ""
},
{
"id": 2,
"battlerName": "Actor1_1",
"characterIndex": 0,
"characterName": "o-s-1",
"classId": 1,
"equips": [
2,
0,
0,
3,
0
],
"faceIndex": 0,
"faceName": "",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "佐藤 衛(さとう まもる)",
"nickname": "",
"note": "",
"profile": ""
},
{
"id": 3,
"battlerName": "Actor1_3",
"characterIndex": 0,
"characterName": "o-h-1",
"classId": 5,
"equips": [
31,
0,
65,
5,
0
],
"faceIndex": 2,
"faceName": "",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "朝火 誠(あさひ せい)",
"nickname": "",
"note": "",
"profile": ""
},
{
"id": 4,
"battlerName": "Actor1_3",
"characterIndex": 1,
"characterName": "o-h-1",
"classId": 5,
"equips": [
31,
0,
65,
5,
0
],
"faceIndex": 2,
"faceName": "",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "朝火 誠(あさひ せい)",
"nickname": "",
"note": "",
"profile": ""
},
{
"id": 5,
"battlerName": "Actor1_3",
"characterIndex": 3,
"characterName": "o-h-1",
"classId": 5,
"equips": [
31,
0,
65,
5,
0
],
"faceIndex": 2,
"faceName": "",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "朝火 誠(あさひ せい)",
"nickname": "",
"note": "",
"profile": ""
},
{
"id": 6,
"battlerName": "Actor1_3",
"characterIndex": 3,
"characterName": "o-h-1",
"classId": 5,
"equips": [
31,
0,
65,
5,
0
],
"faceIndex": 2,
"faceName": "",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "朝火 誠(あさひ せい)",
"nickname": "",
"note": "",
"profile": ""
},
{
"id": 7,
"battlerName": "",
"characterIndex": 0,
"characterName": "",
"classId": 1,
"equips": [
0,
0,
0,
0,
0
],
"faceIndex": 0,
"faceName": "",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "",
"nickname": "",
"note": "",
"profile": ""
},
{
"id": 8,
"battlerName": "",
"characterIndex": 0,
"characterName": "",
"classId": 1,
"equips": [
0,
0,
0,
0,
0
],
"faceIndex": 0,
"faceName": "",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "",
"nickname": "",
"note": "",
"profile": ""
},
{
"id": 9,
"battlerName": "",
"characterIndex": 0,
"characterName": "",
"classId": 1,
"equips": [
0,
0,
0,
0,
0
],
"faceIndex": 0,
"faceName": "",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "",
"nickname": "",
"note": "",
"profile": ""
},
{
"id": 10,
"battlerName": "",
"characterIndex": 0,
"characterName": "",
"classId": 1,
"equips": [
0,
0,
0,
0,
0
],
"faceIndex": 0,
"faceName": "",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "",
"nickname": "",
"note": "",
"profile": ""
},
{
"id": 11,
"battlerName": "",
"characterIndex": 0,
"characterName": "",
"classId": 1,
"equips": [
0,
0,
0,
0,
0
],
"faceIndex": 0,
"faceName": "",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "",
"nickname": "",
"note": "",
"profile": ""
},
{
"id": 12,
"battlerName": "",
"characterIndex": 0,
"characterName": "",
"classId": 1,
"equips": [
0,
0,
0,
0,
0
],
"faceIndex": 0,
"faceName": "",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "",
"nickname": "",
"note": "",
"profile": ""
},
{
"id": 13,
"battlerName": "",
"characterIndex": 0,
"characterName": "",
"classId": 1,
"equips": [
0,
0,
0,
0,
0
],
"faceIndex": 0,
"faceName": "",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "",
"nickname": "",
"note": "",
"profile": ""
},
{
"id": 14,
"battlerName": "",
"characterIndex": 0,
"characterName": "",
"classId": 1,
"equips": [
0,
0,
0,
0,
0
],
"faceIndex": 0,
"faceName": "",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "",
"nickname": "",
"note": "",
"profile": ""
},
{
"id": 15,
"battlerName": "",
"characterIndex": 0,
"characterName": "",
"classId": 1,
"equips": [
0,
0,
0,
0,
0
],
"faceIndex": 0,
"faceName": "",
"traits": [],
"initialLevel": 1,
"maxLevel": 99,
"name": "",
"nickname": "",
"note": "",
"profile": ""
}
]

9659
data/Animations.json Normal file

File diff suppressed because it is too large Load diff

2853
data/Armors.json Normal file

File diff suppressed because it is too large Load diff

7472
data/Classes.json Normal file

File diff suppressed because it is too large Load diff

55
data/CommonEvents.json Normal file
View file

@ -0,0 +1,55 @@
[
null,
{
"id": 1,
"list": [
{
"code": 0,
"indent": 0,
"parameters": []
}
],
"name": "",
"switchId": 1,
"trigger": 0
},
{
"id": 2,
"list": [
{
"code": 0,
"indent": 0,
"parameters": []
}
],
"name": "",
"switchId": 1,
"trigger": 0
},
{
"id": 3,
"list": [
{
"code": 0,
"indent": 0,
"parameters": []
}
],
"name": "",
"switchId": 1,
"trigger": 0
},
{
"id": 4,
"list": [
{
"code": 0,
"indent": 0,
"parameters": []
}
],
"name": "",
"switchId": 1,
"trigger": 0
}
]

358
data/Enemies.json Normal file
View file

@ -0,0 +1,358 @@
[
null,
{
"id": 1,
"actions": [
{
"conditionParam1": 0,
"conditionParam2": 0,
"conditionType": 0,
"rating": 5,
"skillId": 1
},
{
"skillId": 20,
"rating": 5,
"conditionType": 0,
"conditionParam1": 0,
"conditionParam2": 0
}
],
"battlerHue": 0,
"battlerName": "Goblin",
"dropItems": [
{
"dataId": 1,
"denominator": 1,
"kind": 0
},
{
"dataId": 1,
"denominator": 1,
"kind": 0
},
{
"dataId": 1,
"denominator": 1,
"kind": 0
}
],
"exp": 10,
"traits": [
{
"code": 22,
"dataId": 0,
"value": 0.95
},
{
"code": 22,
"dataId": 1,
"value": 0.05
},
{
"code": 31,
"dataId": 1,
"value": 0
}
],
"gold": 5,
"name": "ゴブリン",
"note": "",
"params": [
200,
0,
25,
20,
20,
20,
20,
20
]
},
{
"id": 2,
"actions": [
{
"conditionParam1": 0,
"conditionParam2": 0,
"conditionType": 0,
"rating": 5,
"skillId": 1
},
{
"skillId": 23,
"rating": 3,
"conditionType": 1,
"conditionParam1": 0,
"conditionParam2": 2
}
],
"battlerHue": 0,
"battlerName": "Gnome",
"dropItems": [
{
"dataId": 1,
"denominator": 1,
"kind": 0
},
{
"dataId": 1,
"denominator": 1,
"kind": 0
},
{
"dataId": 1,
"denominator": 1,
"kind": 0
}
],
"exp": 10,
"traits": [
{
"code": 22,
"dataId": 0,
"value": 0.95
},
{
"code": 22,
"dataId": 1,
"value": 0.05
},
{
"code": 31,
"dataId": 1,
"value": 0
}
],
"gold": 8,
"name": "ノーム",
"note": "",
"params": [
250,
0,
20,
25,
20,
20,
20,
20
]
},
{
"id": 3,
"actions": [
{
"conditionParam1": 0,
"conditionParam2": 0,
"conditionType": 0,
"rating": 5,
"skillId": 1
}
],
"battlerHue": 0,
"battlerName": "Crow",
"dropItems": [
{
"dataId": 1,
"denominator": 1,
"kind": 0
},
{
"dataId": 1,
"denominator": 1,
"kind": 0
},
{
"dataId": 1,
"denominator": 1,
"kind": 0
}
],
"exp": 15,
"traits": [
{
"code": 22,
"dataId": 0,
"value": 0.95
},
{
"code": 22,
"dataId": 1,
"value": 0.1
},
{
"code": 31,
"dataId": 1,
"value": 0
}
],
"gold": 8,
"name": "クロウ",
"note": "",
"params": [
250,
50,
25,
20,
20,
20,
25,
20
]
},
{
"id": 4,
"actions": [
{
"conditionParam1": 0,
"conditionParam2": 0,
"conditionType": 0,
"rating": 5,
"skillId": 1
},
{
"skillId": 52,
"rating": 4,
"conditionType": 2,
"conditionParam1": 0,
"conditionParam2": 0.3
}
],
"battlerHue": 0,
"battlerName": "Treant",
"dropItems": [
{
"dataId": 1,
"denominator": 1,
"kind": 0
},
{
"dataId": 1,
"denominator": 1,
"kind": 0
},
{
"dataId": 1,
"denominator": 1,
"kind": 0
}
],
"exp": 30,
"traits": [
{
"code": 22,
"dataId": 0,
"value": 0.95
},
{
"code": 22,
"dataId": 1,
"value": 0.05
},
{
"code": 31,
"dataId": 1,
"value": 0
},
{
"code": 11,
"dataId": 2,
"value": 2
}
],
"gold": 15,
"name": "トレント",
"note": "",
"params": [
500,
50,
30,
20,
30,
30,
30,
30
]
},
{
"id": 5,
"actions": [
{
"conditionParam1": 0,
"conditionParam2": 0,
"conditionType": 0,
"rating": 5,
"skillId": 1
},
{
"skillId": 99,
"rating": 4,
"conditionType": 1,
"conditionParam1": 0,
"conditionParam2": 2
},
{
"skillId": 13,
"rating": 6,
"conditionType": 2,
"conditionParam1": 0,
"conditionParam2": 0.3
}
],
"battlerHue": 0,
"battlerName": "Hi_monster",
"dropItems": [
{
"dataId": 1,
"denominator": 1,
"kind": 0
},
{
"dataId": 1,
"denominator": 1,
"kind": 0
},
{
"dataId": 1,
"denominator": 1,
"kind": 0
}
],
"exp": 100,
"traits": [
{
"code": 22,
"dataId": 0,
"value": 0.95
},
{
"code": 22,
"dataId": 1,
"value": 0.05
},
{
"code": 31,
"dataId": 1,
"value": 0
},
{
"code": 63,
"dataId": 1,
"value": 1
}
],
"gold": 50,
"name": "魔獣",
"note": "",
"params": [
1000,
50,
40,
20,
40,
40,
40,
40
]
}
]

982
data/Items.json Normal file
View file

@ -0,0 +1,982 @@
[
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": 176,
"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を1500ポイント回復する。",
"effects": [
{
"code": 11,
"dataId": 0,
"value1": 0,
"value2": 1500
}
],
"hitType": 0,
"iconIndex": 176,
"itypeId": 1,
"name": "ハイポーション",
"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": "MPを300ポイント回復する。",
"effects": [
{
"code": 12,
"dataId": 0,
"value1": 0,
"value2": 300
}
],
"hitType": 0,
"iconIndex": 176,
"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": 3,
"variance": 20
},
"description": "戦闘不能から復活させる。(HP半分回復)",
"effects": [
{
"code": 22,
"dataId": 1,
"value1": 1,
"value2": 0
}
],
"hitType": 0,
"iconIndex": 176,
"itypeId": 1,
"name": "スティミュラント",
"note": "",
"occasion": 0,
"price": 500,
"repeats": 1,
"scope": 9,
"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": 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": 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": 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": 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
}
]

1363
data/Map001.json Normal file

File diff suppressed because it is too large Load diff

9476
data/Map002.json Normal file

File diff suppressed because it is too large Load diff

1663
data/Map003.json Normal file

File diff suppressed because it is too large Load diff

2979
data/Map004.json Normal file

File diff suppressed because it is too large Load diff

9302
data/Map005.json Normal file

File diff suppressed because it is too large Load diff

5754
data/Map006.json Normal file

File diff suppressed because it is too large Load diff

8666
data/Map007.json Normal file

File diff suppressed because it is too large Load diff

4974
data/Map008.json Normal file

File diff suppressed because it is too large Load diff

13500
data/Map009.json Normal file

File diff suppressed because it is too large Load diff

6859
data/Map010.json Normal file

File diff suppressed because it is too large Load diff

6904
data/Map011.json Normal file

File diff suppressed because it is too large Load diff

31231
data/Map012.json Normal file

File diff suppressed because it is too large Load diff

54092
data/Map013.json Normal file

File diff suppressed because it is too large Load diff

2647
data/Map014.json Normal file

File diff suppressed because it is too large Load diff

1363
data/Map015.json Normal file

File diff suppressed because it is too large Load diff

4093
data/Map016.json Normal file

File diff suppressed because it is too large Load diff

48462
data/Map017.json Normal file

File diff suppressed because it is too large Load diff

35701
data/Map018.json Normal file

File diff suppressed because it is too large Load diff

19165
data/Map019.json Normal file

File diff suppressed because it is too large Load diff

7288
data/Map020.json Normal file

File diff suppressed because it is too large Load diff

15597
data/Map021.json Normal file

File diff suppressed because it is too large Load diff

7526
data/Map022.json Normal file

File diff suppressed because it is too large Load diff

5860
data/Map023.json Normal file

File diff suppressed because it is too large Load diff

1363
data/Map024.json Normal file

File diff suppressed because it is too large Load diff

6314
data/Map025.json Normal file

File diff suppressed because it is too large Load diff

15686
data/Map026.json Normal file

File diff suppressed because it is too large Load diff

1552
data/Map027.json Normal file

File diff suppressed because it is too large Load diff

3253
data/Map028.json Normal file

File diff suppressed because it is too large Load diff

3857
data/Map029.json Normal file

File diff suppressed because it is too large Load diff

8811
data/Map030.json Normal file

File diff suppressed because it is too large Load diff

6424
data/Map031.json Normal file

File diff suppressed because it is too large Load diff

4727
data/Map032.json Normal file

File diff suppressed because it is too large Load diff

8312
data/Map033.json Normal file

File diff suppressed because it is too large Load diff

9635
data/Map034.json Normal file

File diff suppressed because it is too large Load diff

8489
data/Map035.json Normal file

File diff suppressed because it is too large Load diff

5130
data/Map036.json Normal file

File diff suppressed because it is too large Load diff

1425
data/Map037.json Normal file

File diff suppressed because it is too large Load diff

7797
data/Map038.json Normal file

File diff suppressed because it is too large Load diff

3133
data/Map039.json Normal file

File diff suppressed because it is too large Load diff

6374
data/Map040.json Normal file

File diff suppressed because it is too large Load diff

10731
data/Map041.json Normal file

File diff suppressed because it is too large Load diff

6725
data/Map042.json Normal file

File diff suppressed because it is too large Load diff

6032
data/Map043.json Normal file

File diff suppressed because it is too large Load diff

1363
data/Map044.json Normal file

File diff suppressed because it is too large Load diff

15686
data/Map045.json Normal file

File diff suppressed because it is too large Load diff

9476
data/Map046.json Normal file

File diff suppressed because it is too large Load diff

2979
data/Map047.json Normal file

File diff suppressed because it is too large Load diff

2896
data/Map048.json Normal file

File diff suppressed because it is too large Load diff

7941
data/Map049.json Normal file

File diff suppressed because it is too large Load diff

461
data/MapInfos.json Normal file
View file

@ -0,0 +1,461 @@
[
null,
{
"id": 1,
"expanded": true,
"name": "MAP001",
"order": 49,
"parentId": 0,
"scrollX": 411.55555555555554,
"scrollY": 320.8888888888889
},
{
"id": 2,
"expanded": true,
"name": "暗い自室(回想部屋あり)",
"order": 14,
"parentId": 22,
"scrollX": 793.7142857142857,
"scrollY": 604.2857142857142
},
{
"id": 3,
"expanded": true,
"name": "ウィンドウ位置確認用マップ",
"order": 2,
"parentId": 0,
"scrollX": 0,
"scrollY": 0,
"quick": false
},
{
"id": 4,
"expanded": true,
"name": "セーブ用マップ 絶対消すな",
"order": 3,
"parentId": 0,
"scrollX": 516,
"scrollY": 597.4285714285714,
"quick": false
},
{
"id": 5,
"expanded": true,
"name": "公園",
"order": 15,
"parentId": 22,
"scrollX": 801.4285714285713,
"scrollY": 602.5714285714286
},
{
"id": 6,
"expanded": true,
"name": "過去の自宅",
"order": 16,
"parentId": 22,
"scrollX": 793.7142857142857,
"scrollY": 604.2857142857142
},
{
"id": 7,
"expanded": true,
"name": "受験 学校",
"order": 17,
"parentId": 22,
"scrollX": 832,
"scrollY": 944
},
{
"id": 8,
"expanded": true,
"name": "自宅前",
"order": 18,
"parentId": 22,
"scrollX": 793.7777777777778,
"scrollY": 413.77777777777777
},
{
"id": 9,
"expanded": true,
"name": "倉庫街",
"order": 19,
"parentId": 22,
"scrollX": 848.5714285714286,
"scrollY": 738
},
{
"id": 10,
"expanded": true,
"name": "学校教室",
"order": 21,
"parentId": 22,
"scrollX": 1061.142857142857,
"scrollY": 604.2857142857142
},
{
"id": 11,
"expanded": false,
"name": "真っ暗闇",
"order": 13,
"parentId": 22,
"scrollX": 825.3333333333334,
"scrollY": 470,
"quick": false
},
{
"id": 12,
"expanded": true,
"name": "鈴木宅 H用",
"order": 37,
"parentId": 13,
"scrollX": 801.4285714285713,
"scrollY": 583.7142857142857
},
{
"id": 13,
"expanded": true,
"name": "Hシーンまとめ",
"order": 36,
"parentId": 0,
"scrollX": 411.55555555555554,
"scrollY": 314.22222222222223,
"quick": false
},
{
"id": 14,
"expanded": false,
"name": "控室 エピ",
"order": 32,
"parentId": 15,
"scrollX": 617.3333333333334,
"scrollY": 459.3333333333333,
"quick": false
},
{
"id": 15,
"expanded": true,
"name": "女視点・エピローグまとめ",
"order": 28,
"parentId": 0,
"scrollX": 825.3333333333334,
"scrollY": 470,
"quick": false
},
{
"id": 16,
"expanded": true,
"name": "公園 H用",
"order": 39,
"parentId": 13,
"scrollX": 817.3333333333334,
"scrollY": 510
},
{
"id": 17,
"expanded": true,
"name": "ステージ H用",
"order": 40,
"parentId": 13,
"scrollX": 793.7142857142857,
"scrollY": 590.5714285714286
},
{
"id": 18,
"expanded": true,
"name": "ラブホ H用",
"order": 41,
"parentId": 13,
"scrollX": 787.7142857142857,
"scrollY": 597.4285714285714
},
{
"id": 19,
"expanded": true,
"name": "隣町トイレ H用",
"order": 42,
"parentId": 13,
"scrollX": 787.7142857142857,
"scrollY": 597.4285714285714
},
{
"id": 20,
"expanded": true,
"name": "隣町",
"order": 26,
"parentId": 22,
"scrollX": 801.4285714285713,
"scrollY": 703.7142857142857
},
{
"id": 21,
"expanded": true,
"name": "住宅街 H用",
"order": 38,
"parentId": 13,
"scrollX": 706.5,
"scrollY": 516.75
},
{
"id": 22,
"expanded": true,
"name": "通常マップまとめ",
"order": 12,
"parentId": 0,
"scrollX": 478.6666666666667,
"scrollY": 459.3333333333333,
"quick": false
},
{
"id": 23,
"expanded": true,
"name": "平和 自室",
"order": 6,
"parentId": 24,
"scrollX": 836,
"scrollY": 586
},
{
"id": 24,
"expanded": false,
"name": "平和な世界まとめ",
"order": 5,
"parentId": 0,
"scrollX": 1061.142857142857,
"scrollY": 604.2857142857142,
"quick": false
},
{
"id": 25,
"expanded": true,
"name": "平和 自宅前",
"order": 7,
"parentId": 24,
"scrollX": 778.8,
"scrollY": 418.2
},
{
"id": 26,
"expanded": false,
"name": "回想部屋 絶対消すな",
"order": 4,
"parentId": 0,
"scrollX": 516,
"scrollY": 597.4285714285714,
"quick": false
},
{
"id": 27,
"expanded": true,
"name": "実験用マップ",
"order": 1,
"parentId": 0,
"scrollX": 0,
"scrollY": 0,
"quick": false
},
{
"id": 28,
"expanded": true,
"name": "トイレ(回想部屋あり)",
"order": 20,
"parentId": 22,
"scrollX": 793.7142857142857,
"scrollY": 590.5714285714286
},
{
"id": 29,
"expanded": true,
"name": "平和 地元商店街",
"order": 8,
"parentId": 24,
"scrollX": 793.7142857142857,
"scrollY": 604.2857142857142
},
{
"id": 30,
"expanded": true,
"name": "平和 学校",
"order": 9,
"parentId": 24,
"scrollX": 807.4285714285713,
"scrollY": 979.7142857142857
},
{
"id": 31,
"expanded": true,
"name": "平和 廊下",
"order": 10,
"parentId": 24,
"scrollX": 1368,
"scrollY": 604.2857142857142
},
{
"id": 32,
"expanded": true,
"name": "平和 屋上",
"order": 11,
"parentId": 24,
"scrollX": 807.4285714285713,
"scrollY": 590.5714285714286
},
{
"id": 33,
"expanded": true,
"name": "学校 廊下",
"order": 22,
"parentId": 22,
"scrollX": 1659.4285714285713,
"scrollY": 604.2857142857142
},
{
"id": 34,
"expanded": true,
"name": "通常 学校",
"order": 23,
"parentId": 22,
"scrollX": 793.7142857142857,
"scrollY": 979.7142857142857
},
{
"id": 35,
"expanded": true,
"name": "鈴木宅",
"order": 24,
"parentId": 22,
"scrollX": 801.4285714285713,
"scrollY": 952.2857142857142
},
{
"id": 36,
"expanded": true,
"name": "過去の自宅前",
"order": 25,
"parentId": 22,
"scrollX": 807.4285714285713,
"scrollY": 590.5714285714286
},
{
"id": 37,
"expanded": false,
"name": "白い部屋",
"order": 27,
"parentId": 22,
"scrollX": 792,
"scrollY": 604.2857142857142,
"quick": false
},
{
"id": 38,
"expanded": true,
"name": "鈴木宅 中 エピ",
"order": 29,
"parentId": 15,
"scrollX": 801.4285714285713,
"scrollY": 583.7142857142857
},
{
"id": 39,
"expanded": false,
"name": "病院 エピ",
"order": 31,
"parentId": 15,
"scrollX": 478.6666666666667,
"scrollY": 459.3333333333333,
"quick": false
},
{
"id": 40,
"expanded": true,
"name": "公園 エピ",
"order": 30,
"parentId": 15,
"scrollX": 694.5,
"scrollY": 516.75
},
{
"id": 41,
"expanded": true,
"name": "ステージ エピ",
"order": 33,
"parentId": 15,
"scrollX": 793.7142857142857,
"scrollY": 590.5714285714286
},
{
"id": 42,
"expanded": true,
"name": "ラブホ エピ",
"order": 34,
"parentId": 15,
"scrollX": 694.5,
"scrollY": 516.75
},
{
"id": 43,
"expanded": true,
"name": "隣町トイレ ",
"order": 35,
"parentId": 15,
"scrollX": 706.5,
"scrollY": 516.75
},
{
"id": 44,
"expanded": false,
"name": "予備 まとめ",
"order": 43,
"parentId": 0,
"scrollX": 0,
"scrollY": 0,
"quick": false
},
{
"id": 45,
"expanded": false,
"name": "回想部屋 製品版",
"order": 46,
"parentId": 44,
"scrollX": 529.7142857142857,
"scrollY": 604.2857142857142,
"quick": false
},
{
"id": 46,
"expanded": true,
"name": "暗い自室(回想部屋あり)",
"order": 44,
"parentId": 44,
"scrollX": 793.7142857142857,
"scrollY": 604.2857142857142
},
{
"id": 47,
"expanded": true,
"name": "セーブ用マップ 製品版",
"order": 45,
"parentId": 44,
"scrollX": 816,
"scrollY": 640,
"quick": false
},
{
"id": 48,
"expanded": true,
"name": "セーブ用マップ 体験版",
"order": 47,
"parentId": 44,
"scrollX": 1061.142857142857,
"scrollY": 604.2857142857142,
"quick": false
},
{
"id": 49,
"expanded": false,
"name": "回想部屋 体験版",
"order": 48,
"parentId": 44,
"scrollX": 1061.142857142857,
"scrollY": 604.2857142857142,
"quick": false
}
]

7970
data/Skills.json Normal file

File diff suppressed because it is too large Load diff

980
data/States.json Normal file
View file

@ -0,0 +1,980 @@
[
null,
{
"id": 1,
"autoRemovalTiming": 0,
"chanceByDamage": 100,
"iconIndex": 1,
"maxTurns": 1,
"message1": "%1は倒れた",
"message2": "%1を倒した",
"message3": "",
"message4": "%1は立ち上がった",
"minTurns": 1,
"motion": 3,
"name": "戦闘不能",
"note": "ステート1番はHP0のときに付加されます。",
"overlay": 0,
"priority": 100,
"releaseByDamage": false,
"removeAtBattleEnd": false,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 4,
"stepsToRemove": 100,
"traits": [
{
"code": 23,
"dataId": 9,
"value": 0
}
],
"messageType": 1
},
{
"id": 2,
"autoRemovalTiming": 2,
"chanceByDamage": 100,
"iconIndex": 0,
"maxTurns": 1,
"message1": "",
"message2": "",
"message3": "",
"message4": "",
"minTurns": 1,
"motion": 0,
"name": "防御",
"note": "",
"overlay": 0,
"priority": 0,
"removeAtBattleEnd": true,
"removeByDamage": false,
"removeByRestriction": true,
"removeByWalking": false,
"restriction": 0,
"stepsToRemove": 100,
"traits": [
{
"code": 62,
"dataId": 1,
"value": 0
}
],
"messageType": 1
},
{
"id": 3,
"autoRemovalTiming": 0,
"chanceByDamage": 100,
"iconIndex": 0,
"maxTurns": 1,
"message1": "",
"message2": "",
"message3": "",
"message4": "",
"minTurns": 1,
"motion": 0,
"name": "不死身",
"note": "",
"overlay": 0,
"priority": 0,
"removeAtBattleEnd": true,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 0,
"stepsToRemove": 100,
"traits": [
{
"code": 14,
"dataId": 1,
"value": 0
}
],
"messageType": 1
},
{
"id": 4,
"autoRemovalTiming": 0,
"chanceByDamage": 100,
"iconIndex": 2,
"maxTurns": 1,
"message1": "%1は毒にかかった",
"message2": "%1に毒をかけた",
"message3": "",
"message4": "%1の毒が消えた",
"minTurns": 1,
"motion": 1,
"overlay": 1,
"name": "毒",
"note": "",
"priority": 50,
"releaseByDamage": false,
"removeAtBattleEnd": false,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 0,
"stepsToRemove": 100,
"traits": [
{
"code": 22,
"dataId": 7,
"value": -0.1
}
],
"messageType": 1
},
{
"id": 5,
"autoRemovalTiming": 1,
"chanceByDamage": 100,
"iconIndex": 3,
"maxTurns": 5,
"message1": "%1は暗闇に閉ざされた",
"message2": "%1を暗闇に閉ざした",
"message3": "",
"message4": "%1の暗闇が消えた",
"minTurns": 3,
"motion": 1,
"name": "暗闇",
"note": "",
"overlay": 2,
"priority": 60,
"releaseByDamage": false,
"removeAtBattleEnd": true,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 0,
"stepsToRemove": 100,
"traits": [
{
"code": 22,
"dataId": 0,
"value": -0.5
}
],
"messageType": 1
},
{
"id": 6,
"autoRemovalTiming": 1,
"chanceByDamage": 100,
"iconIndex": 4,
"maxTurns": 5,
"message1": "%1は沈黙した",
"message2": "%1を沈黙させた",
"message3": "",
"message4": "%1の沈黙が解けた",
"minTurns": 3,
"motion": 1,
"name": "沈黙",
"note": "",
"overlay": 3,
"priority": 65,
"releaseByDamage": false,
"removeAtBattleEnd": true,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 0,
"stepsToRemove": 100,
"traits": [
{
"code": 42,
"dataId": 1,
"value": 0
}
],
"messageType": 1
},
{
"id": 7,
"autoRemovalTiming": 1,
"chanceByDamage": 50,
"iconIndex": 5,
"maxTurns": 4,
"message1": "%1は激昂した",
"message2": "%1を激昂させた",
"message3": "",
"message4": "%1は我に返った",
"minTurns": 2,
"motion": 1,
"name": "激昂",
"note": "",
"overlay": 4,
"priority": 70,
"releaseByDamage": false,
"removeAtBattleEnd": true,
"removeByDamage": true,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 1,
"stepsToRemove": 100,
"traits": [],
"messageType": 1
},
{
"id": 8,
"autoRemovalTiming": 1,
"chanceByDamage": 50,
"iconIndex": 6,
"maxTurns": 4,
"message1": "%1は混乱した",
"message2": "%1を混乱させた",
"message3": "",
"message4": "%1は我に返った",
"minTurns": 2,
"motion": 1,
"name": "混乱",
"note": "",
"overlay": 5,
"priority": 75,
"releaseByDamage": false,
"removeAtBattleEnd": true,
"removeByDamage": true,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 2,
"stepsToRemove": 100,
"traits": [],
"messageType": 1
},
{
"id": 9,
"autoRemovalTiming": 1,
"chanceByDamage": 50,
"iconIndex": 7,
"maxTurns": 4,
"message1": "%1は魅了された",
"message2": "%1を魅了した",
"message3": "",
"message4": "%1は我に返った",
"minTurns": 2,
"motion": 1,
"name": "魅了",
"note": "",
"overlay": 6,
"priority": 80,
"releaseByDamage": false,
"removeAtBattleEnd": true,
"removeByDamage": true,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 3,
"stepsToRemove": 100,
"traits": [],
"messageType": 1
},
{
"id": 10,
"autoRemovalTiming": 1,
"chanceByDamage": 100,
"iconIndex": 8,
"maxTurns": 5,
"message1": "%1は眠った",
"message2": "%1を眠らせた",
"message3": "%1は眠っている。",
"message4": "%1は目を覚ました",
"minTurns": 3,
"motion": 2,
"name": "睡眠",
"note": "",
"overlay": 7,
"priority": 90,
"releaseByDamage": true,
"removeAtBattleEnd": true,
"removeByDamage": true,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 4,
"stepsToRemove": 100,
"traits": [
{
"code": 22,
"dataId": 1,
"value": -1
}
],
"messageType": 1
},
{
"id": 11,
"autoRemovalTiming": 0,
"chanceByDamage": 100,
"traits": [],
"iconIndex": 0,
"maxTurns": 1,
"message1": "",
"message2": "",
"message3": "",
"message4": "",
"minTurns": 1,
"motion": 0,
"name": "",
"note": "",
"overlay": 0,
"priority": 50,
"removeAtBattleEnd": false,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 0,
"stepsToRemove": 100,
"messageType": 1
},
{
"id": 12,
"autoRemovalTiming": 2,
"chanceByDamage": 100,
"traits": [
{
"code": 22,
"dataId": 1,
"value": -1
}
],
"iconIndex": 9,
"maxTurns": 3,
"message1": "%1はしびれて動けなくなった",
"message2": "%1を麻痺させた",
"message3": "%1は体がしびれて動けない",
"message4": "%1の麻痺が解けた",
"minTurns": 3,
"motion": 2,
"name": "麻痺",
"note": "",
"overlay": 8,
"priority": 95,
"removeAtBattleEnd": true,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 4,
"stepsToRemove": 100,
"messageType": 1
},
{
"id": 13,
"autoRemovalTiming": 2,
"chanceByDamage": 100,
"traits": [
{
"code": 22,
"dataId": 1,
"value": -1
}
],
"iconIndex": 9,
"maxTurns": 2,
"message1": "%1はバランスを崩した",
"message2": "%1はバランスを崩した",
"message3": "%1はバランスを崩している……",
"message4": "%1は体勢を立て直した",
"minTurns": 1,
"motion": 1,
"name": "スタン",
"note": "",
"overlay": 10,
"priority": 90,
"removeAtBattleEnd": true,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 4,
"stepsToRemove": 100,
"messageType": 1
},
{
"id": 14,
"autoRemovalTiming": 0,
"chanceByDamage": 100,
"traits": [],
"iconIndex": 0,
"maxTurns": 1,
"message1": "",
"message2": "",
"message3": "",
"message4": "",
"minTurns": 1,
"motion": 0,
"name": "",
"note": "",
"overlay": 0,
"priority": 50,
"removeAtBattleEnd": false,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 0,
"stepsToRemove": 100,
"messageType": 1
},
{
"id": 15,
"autoRemovalTiming": 2,
"chanceByDamage": 100,
"traits": [
{
"code": 22,
"dataId": 7,
"value": 0.1
}
],
"iconIndex": 72,
"maxTurns": 4,
"message1": "",
"message2": "",
"message3": "",
"message4": "",
"minTurns": 4,
"motion": 0,
"name": "HP再生",
"note": "",
"overlay": 0,
"priority": 40,
"removeAtBattleEnd": true,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 0,
"stepsToRemove": 100,
"messageType": 1
},
{
"id": 16,
"autoRemovalTiming": 2,
"chanceByDamage": 100,
"traits": [
{
"code": 22,
"dataId": 8,
"value": 0.1
}
],
"iconIndex": 72,
"maxTurns": 4,
"message1": "",
"message2": "",
"message3": "",
"message4": "",
"minTurns": 4,
"motion": 0,
"name": "MP再生",
"note": "",
"overlay": 0,
"priority": 40,
"removeAtBattleEnd": true,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 0,
"stepsToRemove": 100,
"messageType": 1
},
{
"id": 17,
"autoRemovalTiming": 2,
"chanceByDamage": 100,
"traits": [
{
"code": 22,
"dataId": 9,
"value": 0.1
}
],
"iconIndex": 72,
"maxTurns": 4,
"message1": "",
"message2": "",
"message3": "",
"message4": "",
"minTurns": 4,
"motion": 0,
"name": "TP再生",
"note": "",
"overlay": 0,
"priority": 40,
"removeAtBattleEnd": true,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 0,
"stepsToRemove": 100,
"messageType": 1
},
{
"id": 18,
"autoRemovalTiming": 2,
"chanceByDamage": 100,
"traits": [
{
"code": 22,
"dataId": 5,
"value": 1
}
],
"iconIndex": 70,
"maxTurns": 5,
"message1": "",
"message2": "",
"message3": "",
"message4": "",
"minTurns": 5,
"motion": 0,
"name": "魔法反射",
"note": "",
"overlay": 0,
"priority": 40,
"removeAtBattleEnd": true,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 0,
"stepsToRemove": 100,
"messageType": 1
},
{
"id": 19,
"autoRemovalTiming": 2,
"chanceByDamage": 100,
"traits": [
{
"code": 62,
"dataId": 2,
"value": 1
}
],
"iconIndex": 81,
"maxTurns": 1,
"message1": "",
"message2": "",
"message3": "",
"message4": "",
"minTurns": 1,
"motion": 0,
"name": "かばう",
"note": "",
"overlay": 0,
"priority": 40,
"removeAtBattleEnd": true,
"removeByDamage": false,
"removeByRestriction": true,
"removeByWalking": false,
"restriction": 0,
"stepsToRemove": 100,
"messageType": 1
},
{
"id": 20,
"autoRemovalTiming": 2,
"chanceByDamage": 100,
"traits": [
{
"code": 23,
"dataId": 0,
"value": 9
}
],
"iconIndex": 76,
"maxTurns": 5,
"message1": "%1は狙われやすくなった",
"message2": "",
"message3": "",
"message4": "",
"minTurns": 5,
"motion": 0,
"name": "挑発",
"note": "",
"overlay": 0,
"priority": 40,
"removeAtBattleEnd": true,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 0,
"stepsToRemove": 100,
"messageType": 1
},
{
"id": 21,
"autoRemovalTiming": 2,
"chanceByDamage": 100,
"traits": [
{
"code": 23,
"dataId": 0,
"value": 0
}
],
"iconIndex": 81,
"maxTurns": 5,
"message1": "%1は狙われにくくなった",
"message2": "",
"message3": "",
"message4": "",
"minTurns": 5,
"motion": 0,
"name": "隠れる",
"note": "",
"overlay": 0,
"priority": 40,
"removeAtBattleEnd": true,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 0,
"stepsToRemove": 100,
"messageType": 1
},
{
"id": 22,
"autoRemovalTiming": 1,
"chanceByDamage": 100,
"traits": [
{
"code": 22,
"dataId": 6,
"value": 1
}
],
"iconIndex": 77,
"maxTurns": 3,
"message1": "",
"message2": "",
"message3": "",
"message4": "",
"minTurns": 3,
"motion": 0,
"name": "反撃",
"note": "",
"overlay": 0,
"priority": 50,
"removeAtBattleEnd": true,
"removeByDamage": false,
"removeByRestriction": true,
"removeByWalking": false,
"restriction": 0,
"stepsToRemove": 100,
"messageType": 1
},
{
"id": 23,
"autoRemovalTiming": 2,
"chanceByDamage": 100,
"traits": [
{
"code": 14,
"dataId": 4,
"value": 1
},
{
"code": 14,
"dataId": 5,
"value": 1
},
{
"code": 14,
"dataId": 6,
"value": 1
},
{
"code": 14,
"dataId": 7,
"value": 1
},
{
"code": 14,
"dataId": 8,
"value": 1
},
{
"code": 14,
"dataId": 9,
"value": 1
},
{
"code": 14,
"dataId": 10,
"value": 1
},
{
"code": 14,
"dataId": 12,
"value": 1
},
{
"code": 14,
"dataId": 13,
"value": 1
}
],
"iconIndex": 70,
"maxTurns": 5,
"message1": "",
"message2": "",
"message3": "",
"message4": "",
"minTurns": 5,
"motion": 0,
"name": "状態異常防止",
"note": "",
"overlay": 0,
"priority": 50,
"removeAtBattleEnd": true,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 0,
"stepsToRemove": 100,
"messageType": 1
},
{
"id": 24,
"autoRemovalTiming": 2,
"chanceByDamage": 100,
"traits": [
{
"code": 23,
"dataId": 4,
"value": 0.25
}
],
"iconIndex": 70,
"maxTurns": 5,
"message1": "",
"message2": "",
"message3": "",
"message4": "",
"minTurns": 5,
"motion": 0,
"name": "消費MP減",
"note": "",
"overlay": 0,
"priority": 50,
"removeAtBattleEnd": true,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 0,
"stepsToRemove": 100,
"messageType": 1
},
{
"id": 25,
"autoRemovalTiming": 2,
"chanceByDamage": 100,
"traits": [
{
"code": 31,
"dataId": 2,
"value": 1
},
{
"code": 11,
"dataId": 2,
"value": 0.5
},
{
"code": 21,
"dataId": 2,
"value": 1.1
}
],
"iconIndex": 64,
"maxTurns": 5,
"message1": "%1は炎の力を身にまとった。",
"message2": "%1は炎の力を身にまとった。",
"message3": "",
"message4": "",
"minTurns": 5,
"motion": 0,
"name": "炎の力",
"note": "",
"overlay": 0,
"priority": 50,
"removeAtBattleEnd": true,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 0,
"stepsToRemove": 100,
"messageType": 1
},
{
"id": 26,
"autoRemovalTiming": 2,
"chanceByDamage": 100,
"traits": [
{
"code": 31,
"dataId": 3,
"value": 1
},
{
"code": 11,
"dataId": 3,
"value": 0.5
},
{
"code": 21,
"dataId": 2,
"value": 1.1
}
],
"iconIndex": 65,
"maxTurns": 5,
"message1": "%1は氷の力を身にまとった。",
"message2": "%1は氷の力を身にまとった。",
"message3": "",
"message4": "",
"minTurns": 5,
"motion": 0,
"name": "氷の力",
"note": "",
"overlay": 0,
"priority": 50,
"removeAtBattleEnd": true,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 0,
"stepsToRemove": 100,
"messageType": 1
},
{
"id": 27,
"autoRemovalTiming": 2,
"chanceByDamage": 100,
"traits": [
{
"code": 31,
"dataId": 4,
"value": 1
},
{
"code": 11,
"dataId": 4,
"value": 0.5
},
{
"code": 21,
"dataId": 2,
"value": 1.1
}
],
"iconIndex": 66,
"maxTurns": 5,
"message1": "%1は雷の力を身にまとった。",
"message2": "%1は雷の力を身にまとった。",
"message3": "",
"message4": "",
"minTurns": 5,
"motion": 0,
"name": "雷の力",
"note": "",
"overlay": 0,
"priority": 50,
"removeAtBattleEnd": true,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 0,
"stepsToRemove": 100,
"messageType": 1
},
{
"id": 28,
"autoRemovalTiming": 0,
"chanceByDamage": 100,
"traits": [],
"iconIndex": 0,
"maxTurns": 1,
"message1": "",
"message2": "",
"message3": "",
"message4": "",
"minTurns": 1,
"motion": 0,
"name": "",
"note": "",
"overlay": 0,
"priority": 50,
"removeAtBattleEnd": false,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": false,
"restriction": 0,
"stepsToRemove": 100,
"messageType": 1
},
{
"id": 29,
"autoRemovalTiming": 0,
"chanceByDamage": 100,
"traits": [
{
"code": 64,
"dataId": 0,
"value": 1
}
],
"iconIndex": 72,
"maxTurns": 1,
"message1": "",
"message2": "",
"message3": "",
"message4": "",
"minTurns": 1,
"motion": 0,
"name": "エンカウント半減",
"note": "",
"overlay": 0,
"priority": 20,
"removeAtBattleEnd": false,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": true,
"restriction": 0,
"stepsToRemove": 100,
"messageType": 1
},
{
"id": 30,
"autoRemovalTiming": 0,
"chanceByDamage": 100,
"traits": [
{
"code": 64,
"dataId": 4,
"value": 1
},
{
"code": 64,
"dataId": 5,
"value": 1
}
],
"iconIndex": 70,
"maxTurns": 1,
"message1": "",
"message2": "",
"message3": "",
"message4": "",
"minTurns": 1,
"motion": 0,
"name": "賞金・アイテム2倍",
"note": "",
"overlay": 0,
"priority": 20,
"removeAtBattleEnd": false,
"removeByDamage": false,
"removeByRestriction": false,
"removeByWalking": true,
"restriction": 0,
"stepsToRemove": 100,
"messageType": 1
}
]

676
data/System.json Normal file
View file

@ -0,0 +1,676 @@
{
"advanced": {
"gameId": 96063807,
"screenWidth": 1280,
"screenHeight": 720,
"uiAreaWidth": 1280,
"uiAreaHeight": 720,
"numberFontFilename": "mplus-2p-bold-sub.woff",
"fallbackFonts": "Verdana, sans-serif",
"fontSize": 26,
"mainFontFilename": "mplus-1m-regular.woff",
"screenScale": 1,
"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": "Battle1",
"pan": 0,
"pitch": 100,
"volume": 90
},
"battleback1Name": "GrassMaze",
"battleback2Name": "GrassMaze",
"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": "Defeat1",
"pan": 0,
"pitch": 100,
"volume": 90
},
"editMapId": 19,
"elements": [
"",
"物理",
"炎",
"氷",
"雷",
"水",
"土",
"風",
"光",
"闇"
],
"equipTypes": [
"",
"武器",
"盾",
"頭",
"身体",
"装飾品"
],
"gameTitle": "~王子様・外伝~雌豚王子は何処まで落ちる",
"gameoverMe": {
"name": "Gameover1",
"pan": 0,
"pitch": 100,
"volume": 90
},
"itemCategories": [
true,
true,
true,
true
],
"locale": "ja_JP",
"magicSkills": [
1
],
"menuCommands": [
true,
true,
true,
true,
true,
true
],
"optAutosave": false,
"optDisplayTp": true,
"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": 11,
"startX": 8,
"startY": 6,
"switches": [
"",
"冒頭ストーリー開始",
"回想 女視点",
"回想 男視点",
"ゴミスイッチ1",
"ゴミスイッチ2",
"ゴミスイッチ3",
"ゴミスイッチ4",
"ミニゲームスタート",
"",
"シーン1スイッチ",
"イベント中",
"中盤スイッチ",
"終盤スイッチ",
"倉庫スイッチ1",
"倉庫スイッチ2",
"倉庫スイッチ3",
"倉庫終了スイッチ1",
"倉庫終了スイッチ2",
"倉庫終了スイッチ3",
"最終イベント",
"最終イベント前",
"ED",
"メッセ終了",
"回想1",
"回想2",
"回想3",
"回想4",
"回想5",
"回想6",
"回想7",
"回想8",
"回想9",
"全開放",
"エピローグスキップ",
"EDメッセ終了",
"序盤シーン",
"体験版スイッチ",
"体験版めっせ",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""
],
"terms": {
"basic": [
"レベル",
"Lv",
"",
"HP",
"",
"MP",
"",
"TP",
"経験値",
"EXP"
],
"commands": [
"戦う",
"逃げる",
"攻撃",
"防御",
"アイテム",
"スキル",
"装備",
"ステータス",
"並び替え",
"セーブ",
"ゲーム終了",
"オプション",
"武器",
"防具",
"大事なもの",
"装備",
"最強装備",
"全て外す",
"ニューゲーム",
"コンティニュー",
null,
"タイトルへ",
"やめる",
null,
"購入する",
"売却する"
],
"params": [
"最大HP",
"最大MP",
"攻撃力",
"防御力",
"魔法力",
"魔法防御",
"敏捷性",
"運",
"命中率",
"回避率"
],
"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": 1,
"equips": [
2,
1,
2,
3,
0
]
},
{
"actorId": 4,
"level": 1,
"equips": [
31,
0,
0,
5,
0
]
},
{
"actorId": 6,
"level": 1,
"equips": [
7,
0,
65,
21,
0
]
},
{
"actorId": 7,
"level": 1,
"equips": [
7,
0,
0,
20,
0
]
}
],
"testTroopId": 1,
"title1Name": "taitoru",
"title2Name": "",
"titleBgm": {
"name": "Theme4",
"pan": 0,
"pitch": 100,
"volume": 90
},
"titleCommandWindow": {
"background": 0,
"offsetX": 0,
"offsetY": 0
},
"variables": [
"",
"イベント変数",
"ゴミ回収変数",
"ゴミ表示変数",
"回想用変数",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""
],
"versionId": 13333771,
"victoryMe": {
"name": "Victory1",
"pan": 0,
"pitch": 100,
"volume": 90
},
"weaponTypes": [
"",
"短剣",
"剣",
"フレイル",
"斧",
"ムチ",
"杖",
"弓",
"クロスボウ",
"銃",
"爪",
"グローブ",
"槍"
],
"windowTone": [
0,
0,
0,
0
],
"tileSize": 48,
"optSplashScreen": false,
"hasEncryptedImages": true,
"hasEncryptedAudio": true,
"encryptionKey": "2d969e2cee8cfa07ce7ca0bb13c7a36d"
}

139590
data/Tilesets.json Normal file

File diff suppressed because it is too large Load diff

211
data/Troops.json Normal file
View file

@ -0,0 +1,211 @@
[
null,
{
"id": 1,
"members": [
{
"enemyId": 1,
"x": 336,
"y": 436,
"hidden": false
},
{
"enemyId": 1,
"x": 480,
"y": 436,
"hidden": false
}
],
"name": "ゴブリン*2",
"pages": [
{
"conditions": {
"actorHp": 50,
"actorId": 1,
"actorValid": false,
"enemyHp": 50,
"enemyIndex": 0,
"enemyValid": false,
"switchId": 1,
"switchValid": false,
"turnA": 0,
"turnB": 0,
"turnEnding": false,
"turnValid": false
},
"list": [
{
"code": 0,
"indent": 0,
"parameters": []
}
],
"span": 0
}
]
},
{
"id": 2,
"members": [
{
"enemyId": 2,
"x": 337,
"y": 436,
"hidden": false
},
{
"enemyId": 2,
"x": 480,
"y": 436,
"hidden": false
}
],
"name": "ノーム*2",
"pages": [
{
"conditions": {
"actorHp": 50,
"actorId": 1,
"actorValid": false,
"enemyHp": 50,
"enemyIndex": 0,
"enemyValid": false,
"switchId": 1,
"switchValid": false,
"turnA": 0,
"turnB": 0,
"turnEnding": false,
"turnValid": false
},
"list": [
{
"code": 0,
"indent": 0,
"parameters": []
}
],
"span": 0
}
]
},
{
"id": 3,
"members": [
{
"enemyId": 3,
"x": 337,
"y": 436,
"hidden": false
},
{
"enemyId": 3,
"x": 479,
"y": 436,
"hidden": false
}
],
"name": "クロウ*2",
"pages": [
{
"conditions": {
"actorHp": 50,
"actorId": 1,
"actorValid": false,
"enemyHp": 50,
"enemyIndex": 0,
"enemyValid": false,
"switchId": 1,
"switchValid": false,
"turnA": 0,
"turnB": 0,
"turnEnding": false,
"turnValid": false
},
"list": [
{
"code": 0,
"indent": 0,
"parameters": []
}
],
"span": 0
}
]
},
{
"id": 4,
"members": [
{
"enemyId": 4,
"x": 408,
"y": 436,
"hidden": false
}
],
"name": "トレント",
"pages": [
{
"conditions": {
"actorHp": 50,
"actorId": 1,
"actorValid": false,
"enemyHp": 50,
"enemyIndex": 0,
"enemyValid": false,
"switchId": 1,
"switchValid": false,
"turnA": 0,
"turnB": 0,
"turnEnding": false,
"turnValid": false
},
"list": [
{
"code": 0,
"indent": 0,
"parameters": []
}
],
"span": 0
}
]
},
{
"id": 5,
"members": [
{
"enemyId": 5,
"x": 408,
"y": 436,
"hidden": false
}
],
"name": "魔獣",
"pages": [
{
"conditions": {
"actorHp": 50,
"actorId": 1,
"actorValid": false,
"enemyHp": 50,
"enemyIndex": 0,
"enemyValid": false,
"switchId": 1,
"switchValid": false,
"turnA": 0,
"turnB": 0,
"turnEnding": false,
"turnValid": false
},
"list": [
{
"code": 0,
"indent": 0,
"parameters": []
}
],
"span": 0
}
]
}
]

1703
data/Weapons.json Normal file

File diff suppressed because it is too large Load diff

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

File diff suppressed because it is too large Load diff

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

File diff suppressed because it is too large Load diff

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

File diff suppressed because it is too large Load diff

46358
js/libs/pixi.js Normal file

File diff suppressed because it is too large Load diff

859
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.8.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();
//-----------------------------------------------------------------------------

180
js/plugins.js Normal file
View file

@ -0,0 +1,180 @@
// Generated by RPG Maker.
// Do not edit this file directly.
var $plugins = [
{
name: "PluginCommonBase",
status: true,
description: "パラメータ解析を提供する共通基盤です",
parameters: {},
},
{
name: "MakeScreenCapture",
status: true,
description: "画面キャプチャ管理プラグイン",
parameters: {
PNGキャプチャキー: "F6",
JPEGキャプチャキー: "F7",
WEBPキャプチャキー: "F9",
Ctrl同時押し: "false",
Alt同時押し: "false",
ファイル名: "image",
出力場所: "captures",
保存形式: "png",
連番桁数: "2",
タイムスタンプ: "true",
署名: "",
署名サイズ: "22",
署名画像: "",
実行間隔: "0",
効果音: "",
JPEG品質: "9",
},
},
{
name: "MakeScreenMovie",
status: true,
description: "ゲーム動画作成プラグイン",
parameters: {
FunkKeyRecord: "F10",
RecordSwitchId: "0",
FileName: "movie_\\d",
Location: "movies",
IncludeAudio: "true",
MovieFileVariableId: "0",
TestOnly: "true",
PreventRecordingDisruption: "true",
MimeType: "自動",
RefreshRate: "30",
},
},
{
name: "NRP_GameWindowSize",
status: true,
description: "v1.05 ゲーム全体のウィンドウサイズを変更&オプションに追加",
parameters: {
windowWidth: "Graphics.width",
windowHeight: "Graphics.height",
screenWidth: "",
screenHeight: "",
"<option>": "",
useOption: "true",
optionPosition: "2",
optionName: "ウィンドウサイズ",
optionDispType: "percent",
windowSizeMin: "50",
windowSizeMax: "150",
windowSizeOffset: "25",
"<cooperation>": "",
overWriteSceneManagerRun: "false",
},
},
{
name: "MessageSkip",
status: true,
description: "メッセージスキッププラグイン",
parameters: {
スキップキー: "control",
オートキー: "tab",
スキップスイッチ: "0",
オートスイッチ: "0",
スキップアイコン: "140",
オートアイコン: "75",
アイコンX: "0",
アイコンY: "0",
押し続けスキップ: "true",
オート待機フレーム: "100 + textSize * 10",
終了解除スイッチID: "0",
スキップピクチャ: "",
スキップピクチャX: "500",
スキップピクチャY: "0",
オートピクチャ: "",
オートピクチャX: "750",
オートピクチャY: "0",
スイッチピクチャ: "",
スイッチピクチャトリガー: "0",
スイッチピクチャX: "750",
スイッチピクチャY: "0",
ボタン原点: "0",
ボタン表示スイッチID: "0",
ピクチャ座標タイプ: "relative",
無効化スイッチ: "0",
},
},
{
name: "MessageWindowHidden",
status: true,
description: "メッセージウィンドウ一時消去プラグイン",
parameters: {
triggerButton: '["右クリック"]',
triggerSwitch: "0",
linkPictureNumbers: "[]",
linkShowPictureNumbers: "[]",
disableLinkSwitchId: "0",
disableSwitchId: "0",
disableInBattle: "false",
disableInChoice: "true",
restoreByDecision: "false",
},
},
{
name: "NRP_MessageWindow",
status: true,
description: "v1.02 メッセージウィンドウを調整する。",
parameters: {
"<MessageWindow>": "",
WindowWidth: "Graphics.boxWidth",
WindowHeight: "this.fittingHeight(3) + 8",
WindowX: "",
WindowY: "(this._positionType * (Graphics.boxHeight - this.height)) / 2",
LineHeight: "",
AdjustMessageX: "0",
AdjustMessageY: "0",
MessageFontSize: "",
WindowOpacity: "",
MaskImage: "",
NoMaskOpacity: "",
FixIconY: "true",
"<NameBoxWindow>": "",
NameBoxAdjustX: "",
NameBoxAdjustY: "",
NameBoxFontSize: "",
NameBoxOpacity: "",
},
},
{
name: "ParallelBgs",
status: true,
description: "BGS並行演奏プラグイン",
parameters: {},
},
{
name: "AnotherNewGame",
status: false,
description: "アナザーニューゲーム追加プラグイン",
parameters: {
anotherDataList:
'["{\\"name\\":\\"回想モード\\",\\"mapId\\":\\"26\\",\\"mapX\\":\\"1\\",\\"mapY\\":\\"1\\",\\"hidden\\":\\"false\\",\\"disable\\":\\"false\\",\\"addPosition\\":\\"0\\",\\"switchId\\":\\"0\\",\\"fileLoad\\":\\"false\\",\\"noFadeout\\":\\"false\\"}"]',
},
},
{
name: "CustomizeConfigDefault",
status: true,
description: "オプションデフォルト値設定プラグイン",
parameters: {
AlwaysDash: "false",
CommandRemember: "false",
TouchUi: "true",
BgmVolume: "100",
BgsVolume: "100",
MeVolume: "100",
SeVolume: "100",
EraseAlwaysDash: "false",
EraseCommandRemember: "true",
EraseTouchUi: "true",
EraseBgmVolume: "false",
EraseBgsVolume: "false",
EraseMeVolume: "false",
EraseSeVolume: "false",
},
},
];

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

View file

@ -0,0 +1,440 @@
//=============================================================================
// AnotherNewGame.js
// ----------------------------------------------------------------------------
// (C)2015 Triacontane
// This plugin is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 4.0.2 2021/04/08 orderAfterアテーションを追加
// 4.0.1 2020/11/29 ブラウザからの実行でエラーになる問題を修正
// 4.0.0 2020/11/11 MZ向けに全面的にリファクタリング
// 3.0.0 2020/03/08 アナザーニューゲームコマンドを複数登録できるよう修正。以前のバージョンと互換性がありません。
// 2.0.0 2019/03/19 アナザーロード時に場所移動せず、セーブ位置から開始できる機能を追加
// アナザーニューゲーム時に自動でONになるスイッチを追加
// パラメータの型指定機能に対応
// 1.4.0 2017/06/18 アナザーニューゲームの追加位置を指定できる機能を追加
// 1.3.0 2017/05/27 ニューゲームを非表示にできる機能を追加
// 1.2.4 2017/05/23 プラグインコマンドのヘルプを修正
// 1.2.3 2017/01/25 同一サーバで同プラグインを適用した複数のゲームを公開する際に、設定が重複するのを避けるために管理番号を追加
// 1.2.2 2016/12/10 アナザーニューゲームをロードした際に、ロード元でイベントが実行中だった場合に続きが実行されてしまう現象を修正
// 1.2.1 2016/11/23 遠景タイトルプラグインParallaxTitle.jsと連携する設定を追加
// 1.2.0 2016/11/22 アナザーニューゲームを選択した際に、フェードアウトしなくなる設定を追加
// 1.1.0 2016/03/29 fftfanttさんからご提供いただいたコードを反映させ、アナザーニューゲーム選択時に
// 既存のセーブファイルをロードする機能を追加
// 1.0.1 2015/11/10 プラグイン適用中にセーブできなくなる不具合を修正
// 1.0.0 2015/11/07 初版
// ----------------------------------------------------------------------------
// [Blog] : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================
/*:
* @plugindesc アナザーニューゲーム追加プラグイン
* @target MZ
* @url https://github.com/triacontane/RPGMakerMV/tree/mz_master/AnotherNewGame.js
* @base PluginCommonBase
* @orderAfter PluginCommonBase
* @author トリアコンタン
*
* @param anotherDataList
* @text アナザーニューゲームリスト
* @desc アナザーニューゲームのコマンド一覧です
* @default []
* @type struct<COMMAND>[]
*
* @command SETTING
* @text コマンド制御
* @desc アナザーニューゲームコマンドの表示と利用可否を制御します
*
* @arg type
* @text 操作種別
* @desc 操作種別を選択します
* @default VISIBLE
* @type select
* @option コマンド表示
* @value VISIBLE
* @option コマンド非表示
* @value HIDDEN
* @option コマンド利用許可
* @value ENABLE
* @option コマンド利用禁止
* @value DISABLE
*
* @arg index
* @text コマンドインデックス
* @desc 操作対象のコマンドインデックスです(開始位置は0)
* @type number
* @default 0
*
* @command NEW_GAME_SETTING
* @text ニューゲーム制御
* @desc ニューゲームコマンドの表示を制御します設定次第でゲームが開始できなくなるので注意してください
*
* @arg type
* @text 操作種別
* @desc 操作種別を選択します
* @default VISIBLE
* @type select
* @option コマンド表示
* @value VISIBLE
* @option コマンド非表示
* @value HIDDEN
*
* @help AnotherNewGame.js
*
* タイトル画面にもう一つのニューゲームコマンドを追加します
* 選択するとニューゲームとは別の指定したマップに移動してゲーム開始します
* クリア後のおまけやCG回想モードスタッフクレジットミニゲーム
* 隠し要素など使い手次第で様々な用途に使えます
*
* 選択肢はあらかじめ非表示あるいは選択禁止にできます
* これらはプラグインコマンドから解除できます
* 解除状態はファイルanotherNewGame.rmmzsaveに保存されます
*
* 利用規約
* 作者に無断で改変再配布が可能で利用形態商用18禁利用等
* についても制限はありません
* このプラグインはもうあなたのものです
*/
/*~struct~COMMAND:
* @param name
* @text コマンド名称
* @desc タイトル画面に表示されるコマンド名です
* @default Another New Game
*
* @param mapId
* @text マップID
* @desc 移動先のマップIDです0を指定した場合場所移動しません
* @default 1
* @type number
*
* @param mapX
* @text X座標
* @desc 移動先のX座標です
* @default 1
* @type number
*
* @param mapY
* @text Y座標
* @desc 移動先のY座標です
* @default 1
* @type number
*
* @param hidden
* @text デフォルト非表示
* @desc デフォルトで選択肢を非表示にしますプラグインコマンドで有効化できます
* @default false
* @type boolean
*
* @param disable
* @text デフォルト使用禁止
* @desc デフォルトで選択肢を選択禁止にしますプラグインコマンドで有効化できます
* @default false
* @type boolean
*
* @param addPosition
* @text 追加位置
* @desc アナザーニューゲームのコマンド追加位置です(1:ニューゲームの上2:コンティニューの上3:オプションの上)
* @default 0
* @type select
* @option オプションの下
* @value 0
* @option ニューゲームの上
* @value 1
* @option コンティニューの上
* @value 2
* @option オプションの上
* @value 3
*
* @param switchId
* @text 開始時にONになるスイッチ
* @desc アナザーニューゲーム開始時に自動でONになるスイッチを指定できます
* @default 0
* @type switch
*
* @param fileLoad
* @text ファイルロード
* @desc アナザーニューゲーム選択時にロード画面に遷移して既存セーブデータをロードします
* @default false
* @type boolean
*
* @param noFadeout
* @text フェードアウト無効
* @desc アナザーニューゲーム選択時にオーディオや画面がフェードアウトしなくなります
* @default false
* @type boolean
*/
(function () {
let localExtraStageIndex = -1;
const script = document.currentScript;
const parameters = PluginManagerEx.createParameter(script);
PluginManagerEx.registerCommand(script, "SETTING", (args) => {
const index = args.index;
switch (args.type) {
case "VISIBLE":
ANGSettingManager.setVisible(index, true);
break;
case "ENABLE":
ANGSettingManager.setEnable(index, true);
break;
case "HIDDEN":
ANGSettingManager.setVisible(index, false);
break;
case "DISABLE":
ANGSettingManager.setEnable(index, false);
break;
default:
return;
}
ANGSettingManager.save();
});
PluginManagerEx.registerCommand(script, "NEW_GAME_SETTING", (args) => {
ANGSettingManager.newGameHidden = args.type === "HIDDEN";
ANGSettingManager.save();
});
//=============================================================================
// Game_Map
// アナザーニューゲームのロード時に実行していたイベントを中断します。
//=============================================================================
Game_Map.prototype.abortInterpreter = function () {
if (this.isEventRunning()) {
this._interpreter.command115();
}
};
//=============================================================================
// Scene_Boot
// アナザーニューゲームデータを読み込みます。
//=============================================================================
const _Scene_Boot_onDatabaseLoaded = Scene_Boot.prototype.onDatabaseLoaded;
Scene_Boot.prototype.onDatabaseLoaded = function () {
_Scene_Boot_onDatabaseLoaded.apply(this, arguments);
ANGSettingManager.loadData();
};
const _Scene_Boot_isReady = Scene_Boot.prototype.isReady;
Scene_Boot.prototype.isReady = function () {
return (
_Scene_Boot_isReady.apply(this, arguments) && ANGSettingManager.isLoaded()
);
};
//=============================================================================
// Scene_Title
// アナザーニューゲームの選択時の処理を追加定義します。
//=============================================================================
const _Scene_Title_commandContinue = Scene_Title.prototype.commandContinue;
Scene_Title.prototype.commandContinue = function () {
_Scene_Title_commandContinue.call(this);
localExtraStageIndex = -1;
};
const _Scene_Title_commandNewGameSecond =
Scene_Title.prototype.commandNewGameSecond;
Scene_Title.prototype.commandNewGameSecond = function (index) {
if (_Scene_Title_commandNewGameSecond) {
_Scene_Title_commandNewGameSecond.apply(this, arguments);
}
const command = parameters.anotherDataList[index];
if (command.noFadeout) {
this._noFadeout = true;
}
if (!command.fileLoad) {
const preMapId = $dataSystem.startMapId;
const preStartX = $dataSystem.startX;
const preStartY = $dataSystem.startY;
const newMapId = command.mapId;
if (newMapId > 0) {
$dataSystem.startMapId = newMapId;
$dataSystem.startX = command.mapX || 1;
$dataSystem.startY = command.mapY || 1;
}
this.commandNewGame();
$dataSystem.startMapId = preMapId;
$dataSystem.startX = preStartX;
$dataSystem.startY = preStartY;
const switchId = command.switchId;
if (switchId > 0) {
$gameSwitches.setValue(switchId, true);
}
} else {
this.commandContinue();
localExtraStageIndex = index;
}
};
const _Scene_Title_createCommandWindow =
Scene_Title.prototype.createCommandWindow;
Scene_Title.prototype.createCommandWindow = function () {
_Scene_Title_createCommandWindow.call(this);
parameters.anotherDataList.forEach((command, index) => {
if (ANGSettingManager.isVisible(index)) {
this._commandWindow.setHandler(
"nameGame2_" + index,
this.commandNewGameSecond.bind(this, index)
);
}
}, this);
};
Scene_Title.prototype.fadeOutAll = function () {
if (!this._noFadeout) {
Scene_Base.prototype.fadeOutAll.apply(this, arguments);
}
};
//=============================================================================
// Scene_Load
// ロード成功時にアナザーポイントに移動します。
//=============================================================================
const _Scene_Load_onLoadSuccess = Scene_Load.prototype.onLoadSuccess;
Scene_Load.prototype.onLoadSuccess = function () {
_Scene_Load_onLoadSuccess.call(this);
if (localExtraStageIndex >= 0) {
const command = parameters.anotherDataList[localExtraStageIndex];
const mapId = command.mapId;
if (mapId > 0) {
const x = command.mapX || 1;
const y = command.mapY || 1;
$gamePlayer.reserveTransfer(mapId, x, y);
}
$gameMap.abortInterpreter();
DataManager.selectSavefileForNewGame();
const switchId = command.switchId;
if (switchId > 0) {
$gameSwitches.setValue(switchId, true);
}
}
};
//=============================================================================
// Window_TitleCommand
// アナザーニューゲームの選択肢を追加定義します。
//=============================================================================
const _Window_TitleCommand_makeCommandList =
Window_TitleCommand.prototype.makeCommandList;
Window_TitleCommand.prototype.makeCommandList = function () {
_Window_TitleCommand_makeCommandList.call(this);
parameters.anotherDataList.forEach(function (command, index) {
if (ANGSettingManager.isVisible(index)) {
this.makeAnotherNewGameCommand(command, index);
}
}, this);
if (ANGSettingManager.newGameHidden) {
this.eraseCommandNewGame();
}
this.height = this.fittingHeight(this._list.length);
this.createContents();
this.updatePlacement();
};
Window_TitleCommand.prototype.makeAnotherNewGameCommand = function (
command,
index
) {
this.addCommand(
command.name,
"nameGame2_" + index,
ANGSettingManager.isEnable(index)
);
const addPosition = command.addPosition;
if (addPosition > 0) {
const anotherCommand = this._list.pop();
this._list.splice(addPosition - 1, 0, anotherCommand);
}
};
Window_TitleCommand.prototype.eraseCommandNewGame = function () {
this._list = this._list.filter(function (command) {
return command.symbol !== "newGame";
});
};
Window_TitleCommand.prototype.updatePlacement = function () {
const addSize = this._list.length - 3;
if (addSize > 0) {
this.y -= (addSize * this.itemHeight()) / 2;
}
};
//=============================================================================
// ANGManager
// アナザーニューゲームの設定ファイルのセーブとロードを定義します。
//=============================================================================
function ANGSettingManager() {
throw new Error("This is a static class");
}
ANGSettingManager._fileName = "anotherNewGame";
ANGSettingManager._visibleList = [];
ANGSettingManager._enableList = [];
ANGSettingManager.newGameHidden = false;
ANGSettingManager.make = function () {
const info = {};
info.visibleList = this._visibleList;
info.enableList = this._enableList;
info.newGameHidden = this.newGameHidden;
return info;
};
ANGSettingManager.isVisible = function (index) {
if (
this._visibleList[index] !== undefined &&
this._visibleList[index] !== null
) {
return this._visibleList[index];
} else {
return !parameters.anotherDataList[index].hidden;
}
};
ANGSettingManager.setVisible = function (index, value) {
this._visibleList[index] = value;
};
ANGSettingManager.isEnable = function (index) {
if (
this._enableList[index] !== undefined &&
this._enableList[index] !== null
) {
return this._enableList[index];
} else {
return !parameters.anotherDataList[index].disable;
}
};
ANGSettingManager.setEnable = function (index, value) {
this._enableList[index] = value;
};
ANGSettingManager.loadData = function () {
StorageManager.loadObject(this._fileName)
.then((info) => {
this._visibleList = info.visibleList || [];
this._enableList = info.enableList || [];
this.newGameHidden = !!info.newGameHidden;
this._loaded = true;
})
.catch(() => {
this._loaded = true;
});
};
ANGSettingManager.isLoaded = function () {
return this._loaded;
};
ANGSettingManager.save = function () {
StorageManager.saveObject(this._fileName, ANGSettingManager.make());
};
})();

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

@ -0,0 +1,103 @@
//=============================================================================
// 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()
);
};
})();

View file

@ -0,0 +1,305 @@
//=============================================================================
// 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,852 @@
//=============================================================================
// MakeScreenCapture.js
// ----------------------------------------------------------------------------
// (C)2015-2018 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.8.0 2021/09/24 署名に制御文字\v[n]を使えるよう修正
// 1.7.4 2021/05/16 プラグインコマンドがMZ対応できていなかったので修正
// 1.7.3 2018/06/28 出力パスの算出方法を変更
// 1.7.2 2018/03/06 各種ファンクションキーにCtrlおよびAltの同時押し要否の設定を追加しました。
// 1.7.1 2017/11/11 総合開発支援プラグインとの連携による修正
// 1.7.0 2017/08/13 パラメータの型指定機能に対応
// 1.6.0 2016/12/25 jpg保存時の拡張子を「jpeg」→「jpg」に変更
// jpeg品質をパラメータから指定できる機能を追加
// 1.5.0 2016/10/20 本体バージョン1.3.2でエラーが発生していたのを修正
// 1.4.0 2016/10/06 パラメータに環境変数を使えるように修正
// 1.3.0 2016/06/24 WEBP形式のショートカットキーを追加
// 1.2.3 2016/06/23 著名に画像とテキストを両方使えるよう修正
// 1.2.2 2016/05/13 プラグインコマンドから出力したときに拡張子の表示がおかしくなる問題を修正
// 1.2.1 2016/05/11 定期実行キャプチャを行ったときに拡張子の表示がおかしくなる問題を修正
// 1.2.0 2016/04/23 署名に任意の画像ファイルを利用できるようになりました。
// 細部のリファクタリング
// 1.1.5 2016/04/10 画像の出力先を管理画面のパラメータとして設定できるよう修正
// 1.1.4 2016/03/31 画像の出力先を絶対パスで指定できるよう修正
// 1.1.3 2016/03/15 文章のスクロール表示が正しくキャプチャできない問題を修正
// 1.1.2 2016/03/01 pngとjpegの形式ごとのファンクションキーを割り当てるよう修正
// 1.1.1 2016/02/26 PrintScreenでもキャプチャできるように修正
// 1.1.0 2016/02/25 複数のウィンドウを含む画面で正しくキャプチャできない不具合を修正
// 高度な設定項目の追加
// 1.0.0 2016/02/24 初版
// ----------------------------------------------------------------------------
// [Blog] : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================
/*:
* @plugindesc Screen Capture Plugin
* @target MZ
* @url https://github.com/triacontane/RPGMakerMV/tree/mz_master/MakeScreenCapture.js
* @base PluginCommonBase
* @orderAfter PluginCommonBase
* @author triacontane
*
* @param FuncKeyPngCapture
* @desc キャプチャとファイル保存を行うファンクションキーです
* 保存形式の設定にかかわらずpng形式で出力します
* @default F6
* @type select
* @option none
* @option F1
* @option F2
* @option F3
* @option F4
* @option F5
* @option F6
* @option F7
* @option F8
* @option F9
* @option F10
* @option F11
* @option F12
*
* @param FuncKeyJpegCapture
* @desc キャプチャとファイル保存を行うファンクションキーです
* 保存形式の設定にかかわらずjpeg形式で出力します
* @default F7
* @type select
* @option none
* @option F1
* @option F2
* @option F3
* @option F4
* @option F5
* @option F6
* @option F7
* @option F8
* @option F9
* @option F10
* @option F11
* @option F12
*
* @param FuncKeyWebpCapture
* @desc キャプチャとファイル保存を行うファンクションキーです
* 保存形式の設定にかかわらずwebp形式で出力します
* @default
* @type select
* @option none
* @option F1
* @option F2
* @option F3
* @option F4
* @option F5
* @option F6
* @option F7
* @option F8
* @option F9
* @option F10
* @option F11
* @option F12
*
* @param SimultaneousCtrl
* @desc 各機能を利用する際にCtrlキーの同時押しが必要かどうかです他のプラグインと対象キーが競合する場合に利用します
* @default false
* @type boolean
*
* @param SimultaneousAlt
* @desc 各機能を利用する際にAltキーの同時押しが必要かどうかです他のプラグインと対象キーが競合する場合に利用します
* @default false
* @type boolean
*
* @param FileName
* @desc 画像のファイル名です
* プラグインコマンドから実行した場合は参照されません
* @default image
*
* @param Location
* @desc ファイルの出力パスです相対パス絶対パスが利用できます
* 区切り文字は/もしくは\で指定してください
* @default captures
*
* @param FileFormat
* @desc 画像のデフォルト保存形式です(png/jpeg/webp)
* @default png
* @type select
* @option png
* @option jpeg
* @option webp
*
* @param NumberDigit
* @desc キャプチャファイルの連番桁数です
* @default 2
* @type number
*
* @param TimeStamp
* @desc ONにすると連番の代わりにタイムスタンプを付与します(ON/OFF)
* @default true
* @type boolean
*
* @param Signature
* @desc 保存時に画像の右下に書き込まれる署名です
* @default
*
* @param SignatureSize
* @desc 署名のフォントサイズです
* @default 22
* @type number
*
* @param SignatureImage
* @desc 保存時に画像の右下に書き込まれる著名画像ファイル名ですimg/picturesに配置拡張子不要
* @default
* @require 1
* @dir img/pictures/
* @type file
*
* @param Interval
* @desc キャプチャを定期実行する間隔秒単位です
* 0にすると定期キャプチャを行いません
* @default 0
* @type number
*
* @param SeName
* @desc キャプチャ実行時に演奏する効果音のファイル名です
* @default
* @require 1
* @dir audio/se/
* @type file
*
* @param JpegQuality
* @desc JPEG出力したときの品質です値を小さくすると容量も小さくなります(1...10)
* @default 9
* @type number
* @min 1
* @max 10
*
* @command MAKE
* @text キャプチャ作成
* @desc 実行時点でのキャプチャを作成してメモリ上に保持します
*
* @command OUT_PICTURE
* @text ピクチャ出力
* @desc 保持していた画面キャプチャをピクチャに表示しますコマンドの直後にピクチャの表示を実行してください
*
* @command OUT_FILE
* @text ファイル作成
* @desc 保持していた画面キャプチャをファイルに保存しますローカル実行でのみ動作します
*
* @arg name
* @text ファイル名
* @desc 出力するファイルの名称です
* @default capture
*
* @help プレー中のゲーム画面をキャプチャして
* ファイルに保存したりピクチャとして表示したりできます
* キャプチャは以下のタイミングで実行されます
*
* ファンクションキー or PrintScreen押下
* 一定時間ごと
* プラグインコマンド実行時
*
* プラグインコマンド以外はテストプレー時のみ有効になります
*
* キャプチャしたファイルの保存場所は絶対パス相対パスいずれも指定できるほか
* OSの環境変数%USERPROFILE%などにも対応しています
*
* またキャプチャの際に著名を自動で埋め込むことができます
* 著名は文字列で指定できるほか任意の画像も指定可能です
* 両方指定すると画像が優先されます
*
* 注意
* キャプチャピクチャの表示状態はセーブできません
* セーブされる前にピクチャの消去で消去してください
*
* 注意
* キャプチャを出力する機能はローカル環境でのみ有効です
* ブラウザやスマホ上では動作しません
*
* このプラグインの利用にはベースプラグインPluginCommonBase.jsが必要です
* PluginCommonBase.jsRPGツクールMZのインストールフォルダ配下の
* 以下のフォルダに格納されています
* dlc/BasicResources/plugins/official
*
* This plugin is released under the MIT License.
*/
/*:ja
* @plugindesc 画面キャプチャ管理プラグイン
* @target MZ
* @url https://github.com/triacontane/RPGMakerMV/tree/mz_master/MakeScreenCapture.js
* @base PluginCommonBase
* @orderAfter PluginCommonBase
* @author トリアコンタン
*
* @param PNGキャプチャキー
* @desc キャプチャとファイル保存を行うファンクションキーです
* 保存形式の設定にかかわらずpng形式で出力します
* @default F6
* @type select
* @option none
* @option F1
* @option F2
* @option F3
* @option F4
* @option F5
* @option F6
* @option F7
* @option F8
* @option F9
* @option F10
* @option F11
* @option F12
*
* @param JPEGキャプチャキー
* @desc キャプチャとファイル保存を行うファンクションキーです
* 保存形式の設定にかかわらずjpeg形式で出力します
* @default F7
* @type select
* @option none
* @option F1
* @option F2
* @option F3
* @option F4
* @option F5
* @option F6
* @option F7
* @option F8
* @option F9
* @option F10
* @option F11
* @option F12
*
* @param WEBPキャプチャキー
* @desc キャプチャとファイル保存を行うファンクションキーです
* 保存形式の設定にかかわらずwebp形式で出力します
* @default F9
* @type select
* @option none
* @option F1
* @option F2
* @option F3
* @option F4
* @option F5
* @option F6
* @option F7
* @option F8
* @option F9
* @option F10
* @option F11
* @option F12
*
* @param Ctrl同時押し
* @desc 各機能を利用する際にCtrlキーの同時押しが必要かどうかです他のプラグインと対象キーが競合する場合に利用します
* @default false
* @type boolean
*
* @param Alt同時押し
* @desc 各機能を利用する際にAltキーの同時押しが必要かどうかです他のプラグインと対象キーが競合する場合に利用します
* @default false
* @type boolean
*
* @param ファイル名
* @desc 画像のファイル名です
* プラグインコマンドから実行した場合は参照されません
* @default image
*
* @param 出力場所
* @desc ファイルの出力パスです相対パス絶対パスが利用できます
* 区切り文字は/もしくは\で指定してください
* @default captures
*
* @param 保存形式
* @desc 画像のデフォルト保存形式です(png/jpeg/webp)
* @default png
* @type select
* @option png
* @option jpeg
* @option webp
*
* @param 連番桁数
* @desc キャプチャファイルの連番桁数です数値はゲーム実行の度に初期化されるのでご注意ください
* @default 2
* @type number
*
* @param タイムスタンプ
* @desc ONにすると連番の代わりにタイムスタンプを付与します(ON/OFF)
* @default true
* @type boolean
*
* @param 署名
* @desc 保存時に画像の右下に書き込まれる署名です
* @default
*
* @param 署名サイズ
* @desc 署名のフォントサイズです
* @default 22
* @type number
*
* @param 署名画像
* @desc 保存時に画像の右下に書き込まれる著名画像ファイル名ですimg/picturesに配置拡張子不要
* @default
* @require 1
* @dir img/pictures/
* @type file
*
* @param 実行間隔
* @desc キャプチャを定期実行する間隔秒単位です
* 0にすると定期キャプチャを行いません
* @default 0
* @type number
*
* @param 効果音
* @desc キャプチャ実行時に演奏する効果音のファイル名です
* @default
* @require 1
* @dir audio/se/
* @type file
*
* @param JPEG品質
* @desc JPEG出力したときの品質です値を小さくすると容量も小さくなります(1...10)
* @default 9
* @type number
* @min 1
* @max 10
*
* @command MAKE
* @text キャプチャ作成
* @desc 実行時点でのキャプチャを作成してメモリ上に保持します
*
* @command OUT_PICTURE
* @text ピクチャ出力
* @desc 保持していた画面キャプチャをピクチャに表示しますコマンドの直後にピクチャの表示を実行してください
*
* @command OUT_FILE
* @text ファイル作成
* @desc 保持していた画面キャプチャをファイルに保存しますローカル実行でのみ動作します
*
* @arg name
* @text ファイル名
* @desc 出力するファイルの名称です
* @default capture
*
* @help プレー中のゲーム画面をキャプチャして
* ファイルに保存したりピクチャとして表示したりできます
* キャプチャは以下のタイミングで実行されます
*
* ファンクションキー or PrintScreen押下
* 一定時間ごと
* プラグインコマンド実行時
*
* プラグインコマンド以外はテストプレー時のみ有効になります
*
* キャプチャしたファイルの保存場所は絶対パス相対パスいずれも指定できるほか
* OSの環境変数%USERPROFILE%などにも対応しています
*
* またキャプチャの際に著名を自動で埋め込むことができます
* 著名は文字列で指定できるほか任意の画像も指定可能です
* 両方指定すると画像が優先されます
*
* 注意
* キャプチャピクチャの表示状態はセーブできません
* セーブされる前にピクチャの消去で消去してください
*
* 注意
* キャプチャを出力する機能はローカル環境でのみ有効です
* ブラウザやスマホ上では動作しません
*
* このプラグインの利用にはベースプラグインPluginCommonBase.jsが必要です
* PluginCommonBase.jsRPGツクールMZのインストールフォルダ配下の
* 以下のフォルダに格納されています
* dlc/BasicResources/plugins/official
*
* 利用規約
* 作者に無断で改変再配布が可能で利用形態商用18禁利用等
* についても制限はありません
* このプラグインはもうあなたのものです
*/
(() => {
"use strict";
const script = document.currentScript;
PluginManagerEx.registerCommand(script, "MAKE", (args) => {
SceneManager.makeCapture();
});
PluginManagerEx.registerCommand(script, "OUT_PICTURE", (args) => {
$gameScreen.captureFlg = true;
});
PluginManagerEx.registerCommand(script, "OUT_FILE", (args) => {
SceneManager.saveCapture(
String(args.name) || paramFileName,
paramFileFormat
);
});
//=============================================================================
// ユーザ書き換え領域 - 開始 -
// 高度な設定を記述しています。必要な場合は書き換えてください。
//=============================================================================
const settings = {
/* 署名のフォント情報です。faceはあらかじめフォントをロードしておかなければ使えません */
signature: {
face: "GameFont",
color: "rgba(255,255,255,1.0)",
align: "right",
},
/* 効果音情報です。ファイル名はプラグイン管理画面から取得します */
se: { volume: 90, pitch: 100, pan: 0 },
/* テストプレー以外での動作を無効にするフラグです */
testOnly: true,
};
//=============================================================================
// ユーザ書き換え領域 - 終了 -
//=============================================================================
const pluginName = "MakeScreenCapture";
const getParamString = function (paramNames) {
const value = getParamOther(paramNames);
return value == null ? "" : value;
};
const getParamNumber = function (paramNames, min, max) {
const value = getParamOther(paramNames);
if (arguments.length < 2) min = -Infinity;
if (arguments.length < 3) max = Infinity;
return (parseInt(value, 10) || 0).clamp(min, max);
};
const getParamBoolean = function (paramNames) {
const value = getParamOther(paramNames);
return (
(value || "").toUpperCase() === "ON" ||
(value || "").toUpperCase() === "TRUE"
);
};
const getParamOther = function (paramNames) {
if (!Array.isArray(paramNames)) paramNames = [paramNames];
for (let i = 0; i < paramNames.length; i++) {
const name = PluginManager.parameters(pluginName)[paramNames[i]];
if (name) return Utils.isNwjs() ? convertEnvironmentVariable(name) : name;
}
return null;
};
const getCommandName = function (command) {
return (command || "").toUpperCase();
};
const getArgString = function (arg, upperFlg) {
arg = convertEscapeCharacters(arg);
return upperFlg ? arg.toUpperCase() : arg;
};
const convertEnvironmentVariable = function (text) {
if (text == null) text = "";
text = text.replace(
/%(\w+)%/gi,
function () {
return process.env[arguments[1]] || "";
}.bind(this)
);
return text;
};
const convertEscapeCharacters = function (text) {
if (text == null) text = "";
const window = SceneManager._scene._windowLayer.children[0];
return window ? window.convertEscapeCharacters(text) : text;
};
//=============================================================================
// パラメータの取得と整形
//=============================================================================
const paramFuncKeyPngCapture = getParamString([
"FuncKeyPngCapture",
"PNGキャプチャキー",
]);
const paramFuncKeyJpegCapture = getParamString([
"FuncKeyJpegCapture",
"JPEGキャプチャキー",
]);
const paramFuncKeyWebpCapture = getParamString([
"FuncKeyWebpCapture",
"WEBPキャプチャキー",
]);
const paramFileName = getParamString(["FileName", "ファイル名"]);
const paramLocation = getParamString(["Location", "出力場所"]);
const paramFileFormat = getParamString([
"FileFormat",
"保存形式",
]).toLowerCase();
const paramSignature = getParamString(["Signature", "署名"]);
const paramSignatureImage = getParamString(["SignatureImage", "署名画像"]);
const paramSignatureSize = getParamNumber(["SignatureSize", "署名サイズ"]);
const paramNumberDigit = getParamNumber(["NumberDigit", "連番桁数"]);
const paramInterval = getParamNumber(["Interval", "実行間隔"]);
const paramSeName = getParamString(["SeName", "効果音"]);
const paramTimeStamp = getParamBoolean(["TimeStamp", "タイムスタンプ"]);
const paramJpegQuality = getParamNumber(["JpegQuality", "JPEG品質"]);
const paramSimultaneousCtrl = getParamBoolean([
"SimultaneousCtrl",
"Ctrl同時押し",
]);
const paramSimultaneousAlt = getParamBoolean([
"SimultaneousAlt",
"Alt同時押し",
]);
//=============================================================================
// Game_Screen
// キャプチャピクチャ用のプロパティを追加定義します。
//=============================================================================
const _Game_Screen_clear = Game_Screen.prototype.clear;
Game_Screen.prototype.clear = function () {
_Game_Screen_clear.apply(this, arguments);
this.clearCapturePicture();
};
Game_Screen.prototype.clearCapturePicture = function () {
this.captureFlg = false;
};
//=============================================================================
// Game_Picture
// キャプチャピクチャ用のプロパティを追加定義します。
//=============================================================================
const _Game_Picture_show = Game_Picture.prototype.show;
Game_Picture.prototype.show = function (
name,
origin,
x,
y,
scaleX,
scaleY,
opacity,
blendMode
) {
if ($gameScreen.captureFlg) {
arguments[0] = Date.now().toString();
this.captureFlg = true;
} else {
this.captureFlg = null;
}
$gameScreen.clearCapturePicture();
_Game_Picture_show.apply(this, arguments);
};
//=============================================================================
// Scene_Base
// 定期実行キャプチャを定義します。
//=============================================================================
const _Scene_Base_update = Scene_Base.prototype.update;
Scene_Base.prototype.update = function () {
_Scene_Base_update.apply(this, arguments);
const count = Graphics.frameCount;
if (
paramInterval !== 0 &&
Utils.isTestCapture() &&
(count + 1) % (paramInterval * 60) === 0
) {
SceneManager.takeCapture();
}
};
//=============================================================================
// Sprite_Picture
// 画像の動的生成を追加定義します。
//=============================================================================
const _Sprite_Picture_loadBitmap = Sprite_Picture.prototype.loadBitmap;
Sprite_Picture.prototype.loadBitmap = function () {
if (this.picture().captureFlg) {
this.bitmap = SceneManager.getCapture();
} else {
_Sprite_Picture_loadBitmap.apply(this, arguments);
}
};
//=============================================================================
// Utils
// テスト用のキャプチャを許可するかどうかを返します。
//=============================================================================
Utils.isTestCapture = function () {
return !settings.testOnly || Utils.isOptionValid("test");
};
//=============================================================================
// Bitmap
// 対象のビットマップを保存します。現状、ローカル環境下でのみ動作します。
//=============================================================================
Bitmap.prototype.save = function (fileName, format, extend) {
let data = this._canvas.toDataURL("image/" + format, extend);
data = data.replace(/^.*,/, "");
if (format === "jpeg") format = "jpg";
if (data) StorageManager.saveImg(fileName, format, data);
};
Bitmap.prototype.sign = function (text, fontInfo) {
this.fontFace = fontInfo.face;
this.fontSize = fontInfo.size;
this.textColor = fontInfo.color;
this.drawText(
text,
8,
this.height - this.fontSize - 8,
this.width - 8 * 2,
this.fontSize,
fontInfo.align
);
};
Bitmap.prototype.signAndSave = function (
signature,
fileName,
format,
signatureImage
) {
const fileFullPath = StorageManager.getLocalImgFileName(fileName);
if (signatureImage) {
this.signImage(signatureImage, signature);
}
this.sign(
PluginManagerEx.convertEscapeCharacters(paramSignature),
signature
);
this.save(
fileFullPath,
format,
format === "jpeg" ? paramJpegQuality / 10 : undefined
);
};
Bitmap.prototype.signImage = function (signBitmap, fontInfo) {
let dx = 0,
dy = this.height - signBitmap.height;
switch (fontInfo.align) {
case "center":
dx = this.width / 2 - signBitmap.width / 2;
break;
case "right":
dx = this.width - signBitmap.width;
break;
}
this.blt(signBitmap, 0, 0, signBitmap.width, signBitmap.height, dx, dy);
};
//=============================================================================
// Input
// ファンクションキーのマップを定義します。
//=============================================================================
Input.functionReverseMapper = {
F1: 112,
F2: 113,
F3: 114,
F4: 115,
F5: 116,
F6: 117,
F7: 118,
F8: 119,
F9: 120,
F10: 121,
F11: 122,
F12: 123,
};
//=============================================================================
// SceneManager
// ファンクションキーが押下されたときにキャプチャを実行します。
//=============================================================================
SceneManager.captureNumber = 0;
SceneManager.makeCapture = function () {
if (paramSeName) {
const se = settings.se;
se.name = paramSeName;
AudioManager.playSe(se);
}
this._captureBitmap = this.snap();
};
SceneManager.getCapture = function () {
return this._captureBitmap || ImageManager.loadBitmap("", "");
};
SceneManager.saveCapture = function (fileName, format) {
if (!this._captureBitmap) return;
const signature = this.getSignature();
if (paramSignatureImage) {
const image = ImageManager.loadPicture(paramSignatureImage, 0);
image.addLoadListener(
function () {
this._captureBitmap.signAndSave(signature, fileName, format, image);
}.bind(this)
);
} else {
this._captureBitmap.signAndSave(signature, fileName, format, null);
}
};
SceneManager.getSignature = function () {
const signature = settings.signature;
signature.size = paramSignatureSize;
return signature;
};
SceneManager.takeCapture = function (format) {
if (!format) {
format = paramFileFormat;
}
this.makeCapture();
this.saveCapture(paramFileName, format);
};
const _SceneManager_setupErrorHandlers = SceneManager.setupErrorHandlers;
SceneManager.setupErrorHandlers = function () {
_SceneManager_setupErrorHandlers.apply(this, arguments);
if (Utils.isTestCapture()) {
document.addEventListener("keyup", this.onKeyUpForCapture.bind(this));
}
};
const _SceneManager_onKeyDown = SceneManager.onKeyDown;
SceneManager.onKeyDown = function (event) {
_SceneManager_onKeyDown.apply(this, arguments);
if (
paramSimultaneousCtrl === event.ctrlKey &&
paramSimultaneousAlt === event.altKey &&
Utils.isTestCapture()
) {
this.onKeyDownForCapture(event);
}
};
SceneManager.onKeyDownForCapture = function (event) {
switch (event.keyCode) {
case Input.functionReverseMapper[paramFuncKeyPngCapture]:
SceneManager.takeCapture("png");
break;
case Input.functionReverseMapper[paramFuncKeyJpegCapture]:
SceneManager.takeCapture("jpeg");
break;
case Input.functionReverseMapper[paramFuncKeyWebpCapture]:
SceneManager.takeCapture("webp");
break;
}
};
SceneManager.onKeyUpForCapture = function (event) {
// PrintScreen
if (event.keyCode === 44) SceneManager.takeCapture();
};
//=============================================================================
// StorageManager
// イメージファイルを保存します。
//=============================================================================
StorageManager.saveImg = function (fileName, format, data) {
if (this.isLocalMode()) {
this.saveImgToLocalFile(fileName + "." + format, data);
} else {
this.saveImgToWebStorage(fileName, data);
}
};
StorageManager.saveImgToWebStorage = function (fileName, data) {
localStorage.setItem(fileName, data);
};
StorageManager.saveImgToLocalFile = function (fileName, data) {
const fs = require("fs");
const dirPath = this.localImgFileDirectoryPath();
const filePath = dirPath + fileName;
if (!fs.existsSync(dirPath)) {
fs.mkdirSync(dirPath);
}
fs.writeFileSync(filePath, new Buffer(data, "base64"));
};
StorageManager.localImgFileDirectoryPath = function () {
let filePath = paramLocation;
if (!filePath.match(/^[A-Z]:/)) {
const path = require("path");
filePath = path.join(path.dirname(process.mainModule.filename), filePath);
}
return decodeURIComponent(
filePath.match(/\/$/) ? filePath : filePath + "/"
);
};
StorageManager.getLocalImgFileName = function (fileName) {
if (paramTimeStamp) {
const date = new Date();
return (
fileName +
"_" +
date.getFullYear() +
(date.getMonth() + 1).padZero(2) +
date.getDate().padZero(2) +
"_" +
date.getHours().padZero(2) +
date.getMinutes().padZero(2) +
date.getSeconds().padZero(2)
);
} else {
let number = SceneManager.captureNumber;
if (number >= Math.pow(10, paramNumberDigit)) number = 0;
SceneManager.captureNumber = number + 1;
return fileName + (number > 0 ? number.padZero(paramNumberDigit) : "");
}
};
})();

View file

@ -0,0 +1,424 @@
/*=============================================================================
MakeScreenMovie.js
----------------------------------------------------------------------------
(C)2019 Triacontane
This software is released under the MIT License.
http://opensource.org/licenses/mit-license.php
----------------------------------------------------------------------------
Version
1.1.1 2020/10/17 ヘルプ修正
1.1.0 2020/10/16 テストプレー以外でも使えるよう修正
録画したファイル名を変数に格納する機能を追加
録画乱れを防止するパラメータを追加
1.0.1 2020/10/13 MZで動作するよう修正
1.0.0 2019/01/05 初版
----------------------------------------------------------------------------
[Blog] : https://triacontane.blogspot.jp/
[Twitter]: https://twitter.com/triacontane/
[GitHub] : https://github.com/triacontane/
=============================================================================*/
/*:
* @plugindesc ゲーム動画作成プラグイン
* @target MZ
* @url https://github.com/triacontane/RPGMakerMV/tree/mz_master/MakeScreenMovie.js
* @base PluginCommonBase
* @author トリアコンタン
*
* @param FunkKeyRecord
* @text 録画ファンクションキー
* @desc ゲーム画面の録画と停止を行うキーです
* @default F10
* @type select
* @option none
* @option F1
* @option F2
* @option F3
* @option F4
* @option F5
* @option F6
* @option F7
* @option F8
* @option F9
* @option F10
* @option F11
* @option F12
*
* @param RecordSwitchId
* @text 録画スイッチ番号
* @desc 指定したスイッチがONになると自動で録画を開始します
* @default 0
* @type switch
*
* @param FileName
* @text ファイル名
* @desc 作成した動画のファイル名です制御文字\V[n]が使えるほか\Dで日付文字列に変換できます
* @default movie_\d
*
* @param Location
* @text 保存場所
* @desc ファイルの出力パスです相対パス絶対パスが利用できます
* 区切り文字は/もしくは\で指定してください
* @default movies
*
* @param IncludeAudio
* @text 音声を含める
* @desc 録画した動画に音声データを含めるかどうかを選択できます
* @default true
* @type boolean
*
* @param MovieFileVariableId
* @text 動画ファイル名の格納変数
* @desc 録画した動画ファイル名称文字列が格納される変数です
* @default 0
* @type variable
*
* @param TestOnly
* @text テストプレー時のみ有効
* @desc プラグインの機能がテストプレー時のみ有効になります
* @default true
* @type boolean
*
* @param PreventRecordingDisruption
* @text 録画乱れ防止
* @desc メッセージ表示中に稀に発生する録画乱れを防止できますがメッセージが一瞬で表示されます
* @default true
* @type boolean
*
* @param MimeType
* @text MIMEタイプ
* @desc 生成する動画のMIMEタイプです通常は自動で問題ありませんサポート外の規格を選択すると自動選択されます
* @default 自動
* @type select
* @option 自動
* @option video/webm;codecs=vp9
* @option video/webm;codecs=vp8
* @option video/webm;codecs=h264
* @option video/webm
*
* @param RefreshRate
* @text リフレッシュレート
* @desc 動画のリフレッシュレートです-1で自動設定0で静止画になります動画が不安定になる場合は下げてください
* @default 30
* @type number
* @min -1
* @max 120
*
* @help MakeScreenMovie.js
*
* ゲーム画面を録画してwebm形式で保存できます
* 指定したファンクションキーを押すかスイッチがONになると録画開始します
* もう一度ファンクションキーを押すかスイッチがOFFになると録画終了します
* ファイル名や保存場所音声を含めるかどうかを設定できます
*
* 注意
*  録画中RECと表示されますが実際の動画には含まれません
*  このプラグインはローカル実行Game.exeでのみ動作します
*  あまりに長時間の録画は動作が不安定になる場合があります
*  現バージョンでは録画した動画にまれに映像乱れが生じる場合があります
*  (パラメータから抑止可能)
*
* 参考にした記事
* https://qiita.com/ru_shalm/items/0930aedad12c4e100446
*
* スクリプト
* 最後に録画した動画ファイルのフルパスを取得します
* StorageManager.getLatestMovieFilePath();
*
* このプラグインの利用にはベースプラグインPluginCommonBase.jsが必要です
* PluginCommonBase.jsRPGツクールMZのインストールフォルダ配下の
* 以下のフォルダに格納されています
* dlc/BasicResources/plugins/official
*
* We will create an English version when it works well.
*
* 利用規約
* 作者に無断で改変再配布が可能で利用形態商用18禁利用等
* についても制限はありません
* このプラグインはもうあなたのものです
*/
(function () {
"use strict";
if (!Utils.isNwjs()) {
console.error("MakeScreenMovie.js: This plugin use only Game.exe");
return;
}
const script = document.currentScript;
const param = PluginManagerEx.createParameter(script);
if (param.TestOnly && !Utils.isOptionValid("test")) {
return;
}
const MIME_TYPES = [
"video/webm;codecs=vp9",
"video/webm;codecs=vp8",
"video/webm;codecs=h264",
"video/webm",
];
/**
* 画面を録画状態を管理するクラス
*/
class ScreenRecorder {
constructor() {
this._recorder = null;
if (!this.getMimeType()) {
this._disable = true;
console.warn("MakeScreenMovie.js: Supported Mime type not found.");
}
}
_start() {
if (this._disable) {
return;
}
this._stream = param.IncludeAudio
? this._createStream()
: this._createCanvasStream();
const recorder = new MediaRecorder(this._stream, {
mimeType: this.getMimeType(),
});
this._chunks = [];
recorder.addEventListener("dataavailable", (event) =>
this._chunks.push(event.data)
);
recorder.addEventListener("stop", this._save.bind(this));
recorder.start(1000);
Graphics.showRecSign();
this._recorder = recorder;
}
_stop() {
this._recorder.stop();
this._stream.getTracks().forEach((track) => track.stop());
this._recorder = null;
this._stream = null;
}
_save() {
const blob = new Blob(this._chunks, { type: this.getMimeType() });
const reader = new FileReader();
reader.addEventListener("load", () => {
Graphics.hideRecSign();
StorageManager.saveMovieToLocalFile(new Buffer(reader.result));
});
reader.readAsArrayBuffer(blob);
this._chunks = null;
}
_createStream() {
const tracks = this._createCanvasStream()
.getVideoTracks()
.concat(WebAudio.createStream().getAudioTracks());
return new MediaStream(tracks);
}
_createCanvasStream() {
if (param.RefreshRate >= 0) {
return document
.querySelector("canvas")
.captureStream(param.RefreshRate);
} else {
return document.querySelector("canvas").captureStream();
}
}
toggle() {
if (!this.isRecording()) {
this._start();
} else {
this._stop();
}
}
update() {
const switchId = param.RecordSwitchId;
if ($gameSwitches.value(switchId) && !this.isRecording()) {
this._start();
} else if (!$gameSwitches.value(switchId) && this.isRecording()) {
this._stop();
}
}
isRecording() {
return !!this._recorder;
}
getMimeType() {
if (MediaRecorder.isTypeSupported(param.MimeType)) {
return param.MimeType;
} else {
return MIME_TYPES.filter(MediaRecorder.isTypeSupported)[0];
}
}
}
/**
* Game_Switches
* スイッチに連動してレコーダーを更新します
*/
const _Game_Switches_setValue = Game_Switches.prototype.setValue;
Game_Switches.prototype.setValue = function (variableId, value) {
_Game_Switches_setValue.apply(this, arguments);
if (variableId === param.RecordSwitchId) {
SceneManager.updateRecorder();
}
};
/**
* SceneManager
* ScreenRecorderを生成管理します
*/
const _SceneManager_initialize = SceneManager.initialize;
SceneManager.initialize = function () {
_SceneManager_initialize.apply(this, arguments);
this._screenRecorder = new ScreenRecorder();
};
const _SceneManager_onKeyDown = SceneManager.onKeyDown;
SceneManager.onKeyDown = function (event) {
_SceneManager_onKeyDown.apply(this, arguments);
this.onKeyDownForScreenMovie(event);
};
SceneManager.onKeyDownForScreenMovie = function (event) {
if (event.key === param.FunkKeyRecord) {
this._screenRecorder.toggle();
}
};
SceneManager.updateRecorder = function () {
this._screenRecorder.update();
};
SceneManager.isScreenRecording = function () {
return this._screenRecorder.isRecording();
};
/**
* StorageManager
* 作成した動画ファイルを保存します
*/
StorageManager.saveMovieToLocalFile = function (dataBuffer) {
const fs = require("fs");
const dirPath = StorageManager.localMovieFileDirectoryPath();
if (!fs.existsSync(dirPath)) {
fs.mkdirSync(dirPath);
}
const fileName = this.getMovieFileName();
const filePath = dirPath + fileName + ".webm";
this.saveMovieFileName(fileName);
fs.writeFileSync(filePath, dataBuffer);
};
StorageManager.saveMovieFileName = function (fileName) {
this._movieFilePath = fileName;
if (param.MovieFileVariableId) {
$gameVariables.setValue(param.MovieFileVariableId, fileName);
}
};
StorageManager.localMovieFileDirectoryPath = function () {
let filePath = param.Location;
if (!filePath.match(/^[A-Z]:/)) {
const path = require("path");
filePath = path.join(path.dirname(process.mainModule.filename), filePath);
}
return filePath.match(/\/$/) ? filePath : filePath + "/";
};
StorageManager.getMovieFileName = function () {
const tmpText = param.FileName.replace(/\\V\[(\d+)]/gi, () => {
return $gameVariables
? $gameVariables.value(parseInt(arguments[1]))
: "0";
});
return tmpText.replace(/\\D/gi, this.getTimeText);
};
StorageManager.getLatestMovieFilePath = function () {
return this._movieFilePath || "";
};
StorageManager.getTimeText = function () {
const d = new Date();
return (
`${d.getFullYear()}-${(d.getMonth() + 1).padZero(2)}-${d
.getDate()
.padZero(2)}` +
`_${d.getHours().padZero(2)}${d.getMinutes().padZero(2)}${d
.getSeconds()
.padZero(2)}`
);
};
/**
* Graphics
* 録画中のサインを表示します
*/
Graphics.showRecSign = function () {
if (this._recSign) {
this._recSign.style.opacity = "1";
}
};
Graphics.hideRecSign = function () {
if (this._recSign) {
this._recSign.style.opacity = "0";
}
};
const _Graphics__createAllElements = Graphics._createAllElements;
Graphics._createAllElements = function () {
_Graphics__createAllElements.apply(this, arguments);
this._createRecPrinter();
};
Graphics._createRecPrinter = function () {
const text = document.createElement("div");
text.id = "recSign";
text.style.position = "absolute";
text.style.left = "8px";
text.style.top = "8px";
text.style.width = "300px";
text.style.fontSize = "40px";
text.style.fontFamily = "monospace";
text.style.color = "red";
text.style.textAlign = "left";
text.style.textShadow = "1px 1px 0 rgba(0,0,0,0.5)";
text.innerHTML = "●REC";
text.style.zIndex = "9";
text.style.opacity = "0";
document.body.appendChild(text);
this._recSign = text;
};
/**
* WebAudio
* ストリームを生成して返します
*/
WebAudio.createStream = function () {
const audioContext = this._context;
const audioNode = this._masterGainNode;
const destination = audioContext.createMediaStreamDestination();
audioNode.connect(destination);
const oscillator = audioContext.createOscillator();
oscillator.connect(destination);
return destination.stream;
};
if (param.PreventRecordingDisruption) {
const _Window_Message_updateShowFast =
Window_Message.prototype.updateShowFast;
Window_Message.prototype.updateShowFast = function () {
_Window_Message_updateShowFast.apply(this, arguments);
if (SceneManager.isScreenRecording()) {
this._showFast = true;
}
};
}
})();

1049
js/plugins/MessageSkip.js Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,413 @@
//=============================================================================
// MessageWindowHidden.js
// ----------------------------------------------------------------------------
// (C)2015 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 2.7.0 2021/01/25 ウィンドウ消去時、決定動作によってウィンドウを再表示できる設定を追加(by unaunagiさま)
// 2.6.2 2020/09/02 MZ向けにコード修正
// 2.6.1 2020/05/21 トリガースイッチと連動無効スイッチの状態によってエラーが起きうる記述を修正
// 2.6.0 2020/05/20 ピクチャの連動を無効にできるスイッチを追加
// 2.5.1 2020/05/19 2.3.0の仕様変更で連動表示ピクチャの透明度が復元できない問題を修正
// 2.5.0 2020/05/17 指定したスイッチに連動させてウィンドウの表示/非表示を切り替える機能を追加
// 2.4.0 2020/05/08 選択肢表示中でもウィンドウを隠せるよう設定を追加
// 2.3.0 2019/10/22 ウィンドウを表示状態にもどしたとき、連動ピクチャは、もともと表示していた不透明度を復元するよう仕様変更
// 2.2.0 2019/06/09 メッセージウィンドウと逆に連動して指定したピクチャの表示/非表示が自動で切り替わる機能を追加
// 2.1.0 2018/10/10 戦闘中にプラグインを無効化できる機能を追加。
// 2.0.0 2018/03/31 消去するトリガーを複数指定できる機能を追加。パラメータの指定方法を見直し。
// 1.4.0 2018/03/10 指定したスイッチがONの間はウィンドウ消去を無効化できる機能を追加
// 1.3.2 2017/08/02 ponidog_BackLog_utf8.jsとの競合を解消
// 1.3.1 2017/07/03 古いYEP_MessageCore.jsのネーム表示ウィンドウが再表示できない不具合の修正(by DarkPlasmaさま)
// 1.3.0 2017/03/16 連動して非表示にできるピクチャを複数指定できる機能を追加
// 1.2.1 2017/02/07 端末依存の記述を削除
// 1.2.0 2016/01/02 メッセージウィンドウと連動して指定したピクチャの表示/非表示が自動で切り替わる機能を追加
// 1.1.0 2016/08/25 選択肢の表示中はウィンドウを非表示にできないよう仕様変更
// 1.0.4 2016/07/22 YEP_MessageCore.jsのネーム表示ウィンドウと連携する機能を追加
// 1.0.3 2016/01/24 メッセージウィンドウが表示されていないときも非表示にできてしまう現象の修正
// 1.0.2 2016/01/02 競合対策
// 1.0.1 2015/12/31 コメント追加+英語対応(仕様に変化なし)
// 1.0.0 2015/12/30 初版
// ----------------------------------------------------------------------------
// [Blog] : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================
/*:
* @plugindesc Erase message window
* @target MZ
* @url https://github.com/triacontane/RPGMakerMV/tree/mz_master/MessageWindowHidden.js
* @author triacontane
*
* @param triggerButton
* @desc Trigger buttons
* (light_click or shift or control)
* @default ["light_click"]
* @type combo[]
* @option light_click
* @option shift
* @option control
* @option tab
* @option pageup
* @option pagedown
* @option debug
*
* @param triggerSwitch
* @desc The window will be erased in conjunction with the specified switch.
* @default 0
* @type switch
*
* @param linkPictureNumbers
* @desc Picture number of window show/hide
* @default []
* @type number[]
*
* @param linkShowPictureNumbers
* @desc Picture number of window show/hide
* @default []
* @type number[]
*
* @param disableLinkSwitchId
* @desc 指定した番号のスイッチがONのときピクチャの連動が無効になります
* @default 0
* @type switch
*
* @param disableSwitchId
* @desc 指定した番号のスイッチがONのときプラグインの機能が無効になります
* @default 0
* @type switch
*
* @param disableInBattle
* @desc trueのとき戦闘中にプラグインの機能を無効にします
* @default false
* @type boolean
*
* @param disableInChoice
* @desc 選択肢の表示中はウィンドウを非表示にできなくなります
* @default true
* @type boolean
*
* @param restoreByDecision
* @desc メッセージ消去時決定動作により非表示になっていたメッセージウィンドウを再表示できます
* @default false
* @type boolean
*
* @help Erase message window (and restore) when triggered
*
* This plugin is released under the MIT License.
*/
/*:ja
* @plugindesc メッセージウィンドウ一時消去プラグイン
* @target MZ
* @url https://github.com/triacontane/RPGMakerMV/tree/mz_master/MessageWindowHidden.js
* @author トリアコンタン
*
* @param triggerButton
* @text ボタン名称
* @desc ウィンドウを消去するボタンです(複数登録可能) プラグイン等で入力可能なボタンを追加した場合は直接入力
* @default ["右クリック"]
* @type combo[]
* @option 右クリック
* @option shift
* @option control
* @option tab
* @option pageup
* @option pagedown
* @option debug
*
* @param triggerSwitch
* @text トリガースイッチ
* @desc 指定したスイッチに連動させてウィンドウを消去します並列処理などを使ってON/OFFを適切に管理してください
* @default 0
* @type switch
*
* @param linkPictureNumbers
* @text 連動ピクチャ番号
* @desc ウィンドウ消去時に連動して不透明度を[0]にするピクチャの番号です
* @default []
* @type number[]
*
* @param linkShowPictureNumbers
* @text 連動表示ピクチャ番号
* @desc ウィンドウ消去時に連動して不透明度を[255]にするピクチャの番号です
* @default []
* @type number[]
*
* @param disableLinkSwitchId
* @text 連動ピクチャ無効スイッチ
* @desc 指定した番号のスイッチがONのときピクチャの連動が無効になります
* @default 0
* @type switch
*
* @param disableSwitchId
* @text 無効スイッチ
* @desc 指定した番号のスイッチがONのときプラグイン全体の機能が無効になります
* @default 0
* @type switch
*
* @param disableInBattle
* @text 戦闘中無効化
* @desc trueのとき戦闘中にプラグインの機能を無効にします
* @default false
* @type boolean
*
* @param disableInChoice
* @text 選択肢表示中は無効
* @desc 選択肢の表示中はウィンドウを非表示にできなくなります
* @default true
* @type boolean
*
* @param restoreByDecision
* @text 決定動作で復帰
* @desc メッセージ消去時決定動作により非表示になっていたメッセージウィンドウを再表示できます
* @default false
* @type boolean
*
* @help メッセージウィンドウを表示中に指定したボタンを押下することで
* メッセージウィンドウを消去しますもう一度押すと戻ります
*
* ウィンドウ消去時に連動して不透明度を[0]にするピクチャを指定することができます
* 背景に特定のピクチャを使用している場合などに指定してください
* 再表示すると不透明度はウィンドウ非表示まえの不透明度で復元されます
*
* ver2.0.0よりパラメータの指定方法が一部変更になりました
* 以前のバージョンを使っていた方は再設定をお願いします
*
* このプラグインにはプラグインコマンドはありません
*
* 利用規約
* 作者に無断で改変再配布が可能で利用形態商用18禁利用等
* についても制限はありません
* このプラグインはもうあなたのものです
*/
(function () {
"use strict";
/**
* Create plugin parameter. param[paramName] ex. param.commandPrefix
* @param pluginName plugin name(EncounterSwitchConditions)
* @returns {Object} Created parameter
*/
var createPluginParameter = function (pluginName) {
var paramReplacer = function (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;
}
};
var parameter = JSON.parse(
JSON.stringify(PluginManager.parameters(pluginName), paramReplacer)
);
PluginManager.setParameters(pluginName, parameter);
return parameter;
};
var param = createPluginParameter("MessageWindowHidden");
//=============================================================================
// Game_Picture
// メッセージウィンドウの表示可否と連動します。
//=============================================================================
Game_Picture.prototype.linkWithMessageWindow = function (opacity) {
this._opacity = opacity;
this._targetOpacity = opacity;
};
//=============================================================================
// Window_Message
// 指定されたボタン押下時にウィンドウとサブウィンドウを非表示にします。
//=============================================================================
var _Window_Message_updateWait = Window_Message.prototype.updateWait;
Window_Message.prototype.updateWait = function () {
if (
!this.isClosed() &&
this.isTriggeredHidden() &&
this.isEnableInChoice()
) {
if (!this.isHidden()) {
this.hideAllWindow();
} else {
this.showAllWindow();
}
} else if (
this.isHidden() &&
this.isTriggered() &&
param.restoreByDecision
) {
this.showAllWindow();
Input.update();
}
var wait = _Window_Message_updateWait.apply(this, arguments);
if (this.isHidden() && this.visible) {
this.hideAllWindow();
}
return wait;
};
Window_Message.prototype.isEnableInChoice = function () {
return !(param.disableInChoice && $gameMessage.isChoice());
};
Window_Message.prototype.hideAllWindow = function () {
this.hide();
this.subWindows().forEach(
function (subWindow) {
this.hideSubWindow(subWindow);
}.bind(this)
);
this._originalPictureOpacities = {};
this.linkPictures(0, param.linkPictureNumbers);
this.linkPictures(255, param.linkShowPictureNumbers);
this._hideByMessageWindowHidden = true;
};
Window_Message.prototype.subWindows = function () {
return [
this._goldWindow,
this._nameBoxWindow,
this._choiceListWindow,
this._numberInputWindow,
this._eventItemWindow,
];
};
Window_Message.prototype.showAllWindow = function () {
this.show();
this.subWindows().forEach(
function (subWindow) {
this.showSubWindow(subWindow);
}.bind(this)
);
this.linkPictures(null, param.linkShowPictureNumbers);
this.linkPictures(null, param.linkPictureNumbers);
this._hideByMessageWindowHidden = false;
};
Window_Message.prototype.isHidden = function () {
return this._hideByMessageWindowHidden;
};
Window_Message.prototype.linkPictures = function (opacity, pictureNumbers) {
if (!pictureNumbers || $gameSwitches.value(param.disableLinkSwitchId)) {
return;
}
pictureNumbers.forEach(function (pictureId) {
this.linkPicture(opacity, pictureId);
}, this);
};
Window_Message.prototype.linkPicture = function (opacity, pictureId) {
var picture = $gameScreen.picture(pictureId);
if (!picture) {
return;
}
if (opacity === null) {
if (!this._originalPictureOpacities.hasOwnProperty(pictureId)) {
return;
}
opacity = this._originalPictureOpacities[pictureId];
} else {
this._originalPictureOpacities[pictureId] = picture.opacity();
}
picture.linkWithMessageWindow(opacity);
};
Window_Message.prototype.hideSubWindow = function (subWindow) {
subWindow.prevVisible = subWindow.visible;
subWindow.hide();
};
Window_Message.prototype.showSubWindow = function (subWindow) {
if (subWindow.prevVisible) subWindow.show();
subWindow.prevVisible = undefined;
};
Window_Message.prototype.hasNameWindow = function () {
return this._nameWindow && typeof Window_NameBox !== "undefined";
};
// 古いYEP_MessageCore.jsでは、ネーム表示ウィンドウはsubWindowsに含まれる
Window_Message.prototype.nameWindowIsSubWindow = function () {
return (
this.subWindows().filter(function (subWindow) {
return subWindow === this._nameWindow;
}, this).length > 0
);
};
Window_Message.prototype.disableWindowHidden = function () {
return (
(param.disableSwitchId > 0 &&
$gameSwitches.value(param.disableSwitchId)) ||
(param.disableInBattle && $gameParty.inBattle())
);
};
Window_Message.prototype.isTriggeredHidden = function () {
if (this.disableWindowHidden()) {
return false;
}
if (param.triggerSwitch > 0 && this.isTriggeredHiddenSwitch()) {
return true;
}
return param.triggerButton.some(function (button) {
switch (button) {
case "":
case "右クリック":
case "light_click":
return TouchInput.isCancelled();
case "ok":
return false;
default:
return Input.isTriggered(button);
}
});
};
Window_Message.prototype.isTriggeredHiddenSwitch = function () {
var triggerSwitch = $gameSwitches.value(param.triggerSwitch);
if (triggerSwitch && !this.isHidden()) {
return true;
}
if (!triggerSwitch && this.isHidden()) {
return true;
}
return false;
};
var _Window_Message_updateInput = Window_Message.prototype.updateInput;
Window_Message.prototype.updateInput = function () {
if (this.isHidden()) return true;
return _Window_Message_updateInput.apply(this, arguments);
};
//=============================================================================
// Window_ChoiceList、Window_NumberInput、Window_EventItem
// 非表示の間は更新を停止します。
//=============================================================================
var _Window_ChoiceList_update = Window_ChoiceList.prototype.update;
Window_ChoiceList.prototype.update = function () {
if (!this.visible) return;
_Window_ChoiceList_update.apply(this, arguments);
};
var _Window_NumberInput_update = Window_NumberInput.prototype.update;
Window_NumberInput.prototype.update = function () {
if (!this.visible) return;
_Window_NumberInput_update.apply(this, arguments);
};
var _Window_EventItem_update = Window_EventItem.prototype.update;
Window_EventItem.prototype.update = function () {
if (!this.visible) return;
_Window_EventItem_update.apply(this, arguments);
};
})();

View file

@ -0,0 +1,737 @@
//=============================================================================
// NRP_GameWindowSize.js
//=============================================================================
/*:
* @target MV MZ
* @plugindesc v1.05 Resize the entire game window & add to the options.
* @author Takeshi Sunagawa (http://newrpg.seesaa.net/)
* @url http://newrpg.seesaa.net/article/475413177.html
*
* @help Change the window size of the entire game.
* It also adds the ability to change the window size to the options screen.
*
* Main features
* - Window size can be set independently from resolution.
* - Window size change function can be added to the options screen.
* If changed, the change will be reflected at startup thereafter.
*
* Note that it does not make sense on mobile or browser activation.
* This plugin is automatically disabled.
*
* -------------------------------------------------------------------
* [Notice (for MZ)]
* -------------------------------------------------------------------
* About the window size immediately after starting the game
* The window size at the moment the game is launched
* cannot be changed by this plugin.
* Normally, the window size should switch after a beat.
*
* In MZ, the window size immediately after startup is determined
* by the "Screen Width" and "Screen Height" in "System 2".
* These are values shared with the pixel size handled in the game.
*
* It is somewhat odd that pixel size and window size are determined
* by the same item, but there is currently no way around this.
*
* There is no perfect solution, but the following is a tentative one.
*
* If you set the "screenWidth" and "screenHeight" in the plugin parameters,
* you can change only the pixel size of the game,
* independently of the "System 2" setting values.
* In this case, set the window size to the "System 2" setting value.
*
* However, since the System 2 configuration values are also referenced
* in the editor, the display area of the Troop screen in the database
* is reduced as a side effect.
* This is not a problem if the Troop screen is not used
* at the end of development or in ARPGs.
*
* In addition, the horizontal scroll bar may appear
* when the screen size is reduced, but this can be suppressed
* by adding the following three lines to "[Project]\css\game.css"
*
* body::-webkit-scrollbar {
* display:none;
* }
*
* Please note that game.css is a file
* that may be overwritten when the main unit is upgraded.
*
* -------------------------------------------------------------------
* [Notice (for MV)]
* -------------------------------------------------------------------
* About the window size immediately after starting the game
* In MV, the window size at the moment of startup can be set
* in "package.json" directly under the project.
* If you want to change the standard window size,
* it is better to set this value as well.
* This can suppress the behavior of the window size
* switching immediately after startup.
*
* Conflict with YEP_CoreEngine.
* YEP_CoreEngine has a specification
* that forces the window size to match the resolution.
* By placing this plugin underneath the YEP_CoreEngine,
* you can only resize the window appropriately.
*
* -------------------------------------------------------------------
* [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 windowWidth
* @type string
* @default Graphics.width
* @desc The width of the window (exclude frame) as the standard.
* The default value is the same as the resolution.
*
* @param windowHeight
* @type string
* @default Graphics.height
* @desc The height of the window (exclude frame) as the standard.
* The default value is the same as the resolution.
*
* @param screenWidth
* @type string
* @desc Screen width.
* Overrides the value of System2 only when entered.
*
* @param screenHeight
* @type string
* @desc Screen height.
* Overrides the value of System2 only when entered.
*
* @param <option>
*
* @param useOption
* @parent <option>
* @type boolean
* @default true
* @desc Add the ability to change the window size to the options screen.
*
* @param optionPosition
* @parent <option>
* @type number
* @default 2
* @desc The position to insert an item into the options screen.
* The default value is 2, which is under Command Remember.
*
* @param optionName
* @parent <option>
* @type string
* @default Window Size
* @desc Set the display name on the options screen.
*
* @param optionDispType
* @parent <option>
* @type select
* @option % Style @value percent
* @option Width*Heigth Style @value size
* @default percent
* @desc Set the display type on the options screen.
*
* @param windowSizeMin
* @parent <option>
* @type string
* @default 50
* @desc The minimum window size that can be changed.
* The default value is 50(%).
*
* @param windowSizeMax
* @parent <option>
* @type string
* @default 150
* @desc The maximum window size that can be changed.
* The default value is 150(%).
*
* @param windowSizeOffset
* @parent <option>
* @type string
* @default 25
* @desc The unit of change in window size.
* The default value is 25(%).
*
* @param <cooperation>
*
* @param overWriteSceneManagerRun
* @parent <cooperation>
* @type boolean
* @default false
* @desc Override the SceneManager.run function. This function is used to disable window resizing by YEP_CoreEngine.
*/
/*:ja
* @target MV MZ
* @plugindesc v1.05 ゲーム全体のウィンドウサイズを変更オプションに追加
* @author 砂川赳http://newrpg.seesaa.net/
* @url http://newrpg.seesaa.net/article/475413177.html
*
* @help ゲーム全体のウィンドウサイズを変更します
* またオプション画面にウィンドウサイズの変更機能を追加します
*
* 主な特徴
* 解像度とは別に独立してウィンドウサイズを設定可能
* オプション画面にウィンドウサイズの変更機能を追加可能
*  変更すると以降起動時にも反映されます
*
* なおモバイルやブラウザ起動では意味がないので
* このプラグインは自動で無効化されます
*
* -------------------------------------------------------------------
* 注意点MZ向け
* -------------------------------------------------------------------
* 起動直後のウィンドウサイズについて
* ゲームを起動した瞬間のウィンドウサイズはこのプラグインでは変更できません
* 通常は一拍遅れてウィンドウサイズが切り替わるはずです
*
* MZでは起動直後のウィンドウサイズは
* システム2にある画面の幅画面の高さによって決定されます
* これらはゲーム内で処理する解像度ピクセルサイズと共有する値です
*
* ピクセルサイズとウィンドウサイズが同じ項目で決定されるのは
*  少々おかしな仕様なのですが現状ではどうにもなりません
*
* 完璧な対処法はありませんが以下は一応の対処法です
*
* プラグインパラメータで画面の幅画面の高さの設定をすれば
* システム2の設定値とは別にゲームのピクセルサイズだけを変更できます
* この場合システム2の設定値にはウィンドウサイズを設定しておきます
*
* ただしシステム2の設定値はエディタでも参照しているため
* 副作用としてデータベースの敵グループ画面の表示領域が狭まってしまいます
* 開発終盤やARPGなどで敵グループ画面を使わないなら問題ありません
*
* また画面サイズを縮めた場合に横スクロールバーが表示される場合がありますが
* [プロジェクト]\css\game.css
* に以下の三行を追記することで抑制できます
*
* body::-webkit-scrollbar {
* display:none;
* }
*
* なおgame.cssは本体のバージョンアップ時に
*  上書きされる可能性があるファイルなのでご注意ください
*
* -------------------------------------------------------------------
* 注意点MV向け
* -------------------------------------------------------------------
* 起動直後のウィンドウサイズについて
* MVでは起動した瞬間のウィンドウサイズを
* プロジェクト直下のpackage.jsonで設定できます
* 標準のウィンドウサイズを変更する場合はこちらの値も合わせておくとベターです
* 起動直後にウィンドウサイズが切り替わる挙動を抑制できます
*
* YEP_CoreEngineとの競合について
* YEP_CoreEngineには強制的にウィンドウサイズを解像度に合わせる仕様があります
* このプラグインをYEP_CoreEngineの下へ配置すれば
* 適切にウィンドウサイズだけを変更できます
*
* -------------------------------------------------------------------
* 利用規約
* -------------------------------------------------------------------
* 特に制約はありません
* 改変再配布自由商用可権利表示も任意です
* 作者は責任を負いませんが不具合については可能な範囲で対応します
*
* @------------------------------------------------------------------
* @ プラグインパラメータ
* @------------------------------------------------------------------
*
* @param windowWidth
* @text ウィンドウ横幅
* @type string
* @default Graphics.width
* @desc 標準とするウィンドウの横幅枠除くです
* 初期値は解像度と同じです
*
* @param windowHeight
* @text ウィンドウ縦幅
* @type string
* @default Graphics.height
* @desc 標準とするウィンドウの縦幅枠除くです
* 初期値は解像度と同じです
*
* @param screenWidth
* @text 画面の幅
* @type string
* @desc 画面の横幅です
* 入力時のみシステム2の値を上書きします
*
* @param screenHeight
* @text 画面の高さ
* @type string
* @desc 画面の縦幅です
* 入力時のみシステム2の値を上書きします
*
* @param <option>
* @text オプション
*
* @param useOption
* @text オプションに表示
* @parent <option>
* @type boolean
* @default true
* @desc ウィンドウサイズの変更機能をオプション画面に追加します
*
* @param optionPosition
* @text オプション挿入位置
* @parent <option>
* @type number
* @default 2
* @desc オプション画面に項目を挿入する位置です
* 初期値は2コマンド記憶の下になります
*
* @param optionName
* @text オプション表示名
* @parent <option>
* @type string
* @default ウィンドウサイズ
* @desc オプション画面での表示名を設定します
*
* @param optionDispType
* @text オプション表示形式
* @parent <option>
* @type select
* @option 表示 @value percent
* @option *縦表示 @value size
* @default percent
* @desc オプション画面での表示形式を設定します
*
* @param windowSizeMin
* @text 最小ウィンドウサイズ
* @parent <option>
* @type string
* @default 50
* @desc 変更可能な最小のウィンドウサイズです
* 初期値は50(%)です
*
* @param windowSizeMax
* @text 最大ウィンドウサイズ
* @parent <option>
* @type string
* @default 150
* @desc 変更可能な最大のウィンドウサイズです
* 初期値は150(%)です
*
* @param windowSizeOffset
* @text 変更単位
* @parent <option>
* @type string
* @default 25
* @desc ウィンドウサイズの変更単位です
* 初期値は25(%)です
*
* @param <cooperation>
* @text 外部連携
*
* @param overWriteSceneManagerRun
* @text SceneManager.runを上書
* @parent <cooperation>
* @type boolean
* @default false
* @desc SceneManager.run関数を上書きしますYEP_CoreEngineのウィンドウサイズ変更を無効化するための機能です
*/
(function () {
"use strict";
function setDefault(str, def) {
return str ? str : def;
}
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_GameWindowSize");
// 基本項目
const pWindowWidth = parameters["windowWidth"];
const pWindowHeight = parameters["windowHeight"];
const pScreenWidth = parameters["screenWidth"];
const pScreenHeight = parameters["screenHeight"];
// オプション
const pUseOption = toBoolean(parameters["useOption"]);
const pOptionName = parameters["optionName"];
const pOptionPosition = toNumber(parameters["optionPosition"], 2);
const pOptionDispType = parameters["optionDispType"];
const pWindowSizeMin = setDefault(parameters["windowSizeMin"], 50);
const pWindowSizeMax = setDefault(parameters["windowSizeMax"], 150);
const pWindowSizeOffset = setDefault(parameters["windowSizeOffset"], 25);
// 外部連携
const pOverWriteSceneManagerRun = toBoolean(
parameters["overWriteSceneManagerRun"]
);
// 識別子
const WINDOW_SIZE_SYMBOL = "windowSize";
/**
* 上書きの場合
*/
if (pOverWriteSceneManagerRun) {
SceneManager.run = function (sceneClass) {
try {
this.initialize();
this.goto(sceneClass);
// MVの場合
if (Utils.RPGMAKER_NAME == "MV") {
this.requestUpdate();
// MZの場合
} else {
Graphics.startGameLoop();
}
} catch (e) {
this.catchException(e);
}
};
}
/**
* ゲーム起動時
*/
const _Scene_Boot_start = Scene_Boot.prototype.start;
Scene_Boot.prototype.start = function () {
_Scene_Boot_start.apply(this, arguments);
// ウィンドウサイズを設定値へ変更
changeWindowSize();
// 強制的に画面サイズを変更
if (pScreenWidth && pScreenHeight) {
Graphics.width = eval(pScreenWidth);
Graphics.height = eval(pScreenHeight);
}
};
/**
* ウィンドウサイズの変更
*/
function changeWindowSize() {
// ローカル実行以外では機能無効
if (!Utils.isNwjs()) {
return;
}
if (pWindowWidth || pWindowHeight) {
const dw = getWindowWidth() - window.innerWidth;
const dh = getWindowHeight() - window.innerHeight;
window.resizeBy(dw, dh);
window.moveBy(-dw / 2, -dh / 2);
}
}
/**
* ウィンドウの横幅取得
*/
function getWindowWidth() {
var width = Graphics.width;
if (pWindowWidth) {
width = eval(pWindowWidth);
}
return Math.round(width * getWindowSizeRate());
}
/**
* ウィンドウの縦幅取得
*/
function getWindowHeight() {
var height = Graphics.height;
if (pWindowHeight) {
height = eval(pWindowHeight);
}
return Math.round(height * getWindowSizeRate());
}
/**
* ウィンドウサイズのレートを取得
*/
function getWindowSizeRate() {
var windowSizeRate = 1;
// オプションを使用しない場合は1
if (!pUseOption) {
return windowSizeRate;
}
if (ConfigManager.windowSize) {
windowSizeRate = ConfigManager.windowSize / 100;
}
return windowSizeRate;
}
// ローカル実行以外では機能無効
if (!Utils.isNwjs()) {
return;
}
/**
* オプションを使用しない場合はここで処理終了
*/
if (!pUseOption) {
return;
}
/**
* オプション用ウィンドウサイズの最小値
*/
function windowSizeMin() {
return eval(pWindowSizeMin);
}
/**
* オプション用ウィンドウサイズの最大値
*/
function windowSizeMax() {
return eval(pWindowSizeMax);
}
/**
* オプション用ウィンドウサイズの変更単位
*/
function windowSizeOffset() {
return eval(pWindowSizeOffset);
}
// ウィンドウサイズの初期値
ConfigManager.windowSize = 100;
/**
* オプション画面の項目生成
*/
var _ConfigManager_makeData = ConfigManager.makeData;
ConfigManager.makeData = function () {
var config = _ConfigManager_makeData.apply(this, arguments);
config.windowSize = this.windowSize;
return config;
};
/**
* オプション画面の項目生成
*/
var _ConfigManager_applyData = ConfigManager.applyData;
ConfigManager.applyData = function (config) {
_ConfigManager_applyData.apply(this, arguments);
this.windowSize = this.readWindowSize(config, WINDOW_SIZE_SYMBOL);
};
/**
* 独自ウィンドウサイズをコンフィグから読込
*/
ConfigManager.readWindowSize = function (config, name) {
var value = config[name];
if (value !== undefined) {
return Number(value).clamp(windowSizeMin(), windowSizeMax());
} else {
return 100;
}
};
/**
* 表示状態取得
*/
var _Window_Options_statusText = Window_Options.prototype.statusText;
Window_Options.prototype.statusText = function (index) {
var symbol = this.commandSymbol(index);
var value = this.getConfigValue(symbol);
if (isWindowsSizeSymbol(symbol)) {
return windowSizeStatusText(value);
}
return _Window_Options_statusText.apply(this, arguments);
};
/**
* ウィンドウサイズの表示名
*/
function windowSizeStatusText(value) {
// サイズ表示
if (pOptionDispType == "size") {
return getWindowWidth() + "*" + getWindowHeight();
}
// %表示
return Math.round(value * 10) / 10 + "%";
}
/**
* あまり細かい値にならないよう丸める
*/
function windowSizeRound(value) {
// 最小値、最大値、100と1以内ならそれぞれの値を設定する。
// (涙ぐましい微調整……)
if (Math.abs(value - windowSizeMin()) < 1) {
value = windowSizeMin();
} else if (Math.abs(value - windowSizeMax()) < 1) {
value = windowSizeMax();
} else if (Math.abs(value - 100) < 1) {
value = 100;
}
// 少数第二位まで
return Math.round(value * 100) / 100;
}
/**
* 決定キー
*/
var _Window_Options_processOk = Window_Options.prototype.processOk;
Window_Options.prototype.processOk = function () {
var index = this.index();
var symbol = this.commandSymbol(index);
var value = this.getConfigValue(symbol);
if (isWindowsSizeSymbol(symbol)) {
value += windowSizeOffset();
value = windowSizeRound(value);
if (value > windowSizeMax()) {
value = windowSizeMin();
}
this.changeWindowSizeValue(symbol, value);
return;
}
_Window_Options_processOk.apply(this, arguments);
};
/**
* カーソル右
*/
var _Window_Options_cursorRight = Window_Options.prototype.cursorRight;
Window_Options.prototype.cursorRight = function (wrap) {
var index = this.index();
var symbol = this.commandSymbol(index);
var value = this.getConfigValue(symbol);
if (isWindowsSizeSymbol(symbol)) {
value += windowSizeOffset();
value = windowSizeRound(value);
this.changeWindowSizeValue(symbol, value);
return;
}
_Window_Options_cursorRight.apply(this, arguments);
};
/**
* カーソル左
*/
var _Window_Options_cursorLeft = Window_Options.prototype.cursorLeft;
Window_Options.prototype.cursorLeft = function (wrap) {
var index = this.index();
var symbol = this.commandSymbol(index);
var value = this.getConfigValue(symbol);
if (isWindowsSizeSymbol(symbol)) {
value -= windowSizeOffset();
value = windowSizeRound(value);
this.changeWindowSizeValue(symbol, value);
return;
}
_Window_Options_cursorLeft.apply(this, arguments);
};
/**
* 独自ウィンドウサイズの値を変更
*/
Window_Options.prototype.changeWindowSizeValue = function (symbol, value) {
value = value.clamp(windowSizeMin(), windowSizeMax());
this.changeValue(symbol, value);
// MZの場合
if (Utils.RPGMAKER_NAME != "MV") {
// タッチによる選択を禁止
// ウィンドウサイズ変更による選択状態の変更を避けるため
this._noTouchSelect = true;
}
};
// MZの場合
if (Utils.RPGMAKER_NAME != "MV") {
/**
* タッチ時のセレクト処理
*/
const _Window_Options_onTouchSelect =
Window_Options.prototype.onTouchSelect;
Window_Options.prototype.onTouchSelect = function (trigger) {
// タッチ選択を禁止!
if (this._noTouchSelect) {
this._noTouchSelect = undefined;
return;
}
_Window_Options_onTouchSelect.apply(this, arguments);
};
}
/**
* ウィンドウサイズの項目追加
*/
const _Window_Options_makeCommandList =
Window_Options.prototype.makeCommandList;
Window_Options.prototype.makeCommandList = function () {
_Window_Options_makeCommandList.apply(this, arguments);
this._list.splice(pOptionPosition, 0, {
name: pOptionName,
symbol: WINDOW_SIZE_SYMBOL,
enabled: true,
ext: null,
});
// Mano_InputConfig.jsとの競合対処
if (this._gamepadOptionIndex >= pOptionPosition) {
this._gamepadOptionIndex++;
}
if (this._keyboardConfigIndex >= pOptionPosition) {
this._keyboardConfigIndex++;
}
};
/**
* 設定値を反映
*/
var _Window_Options_setConfigValue = Window_Options.prototype.setConfigValue;
Window_Options.prototype.setConfigValue = function (symbol, volume) {
_Window_Options_setConfigValue.apply(this, arguments);
if (isWindowsSizeSymbol(symbol)) {
// ウィンドウサイズを反映
changeWindowSize();
}
};
/**
* ウィンドウサイズのオプションか
*/
function isWindowsSizeSymbol(symbol) {
if (symbol == WINDOW_SIZE_SYMBOL) {
return true;
}
return false;
}
/**
* コマンド数を加算
*/
const _Scene_Options_maxCommands = Scene_Options.prototype.maxCommands;
Scene_Options.prototype.maxCommands = function () {
return _Scene_Options_maxCommands.apply(this, arguments) + 1;
};
})();

View file

@ -0,0 +1,772 @@
//=============================================================================
// NRP_MessageWindow.js
//=============================================================================
/*:
* @target MZ
* @plugindesc v1.02 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 MZ
* @plugindesc v1.02 メッセージウィンドウを調整する
* @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);
};
}
}
})();

418
js/plugins/ParallelBgs.js Normal file
View file

@ -0,0 +1,418 @@
//=============================================================================
// ParallelBgs.js
// ----------------------------------------------------------------------------
// (C)2016 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.1.1 2021/03/06 BGMのフェードアウトのイベントコマンドでは現在のラインのBGSのみフェードアウトするよう修正
// 1.1.0 2020/12/14 MZ向けに全面的に修正
// 1.0.3 2020/02/02 ヘルプのプラグインコマンド「PB_BGSライン変更」が間違っていたので「PB_BGS_ライン変更」に修正(コード修正なし)
// 1.0.2 2017/01/05 BGSの演奏状態によっては、セーブロードした際に一部のBGSが演奏されなくなる現象の修正(byくらむぼん氏)
// 1.0.1 2016/11/16 BGSをプレーしていない状態でセーブロードするとエラーになる現象の修正
// 1.0.0 2016/11/12 初版
// ----------------------------------------------------------------------------
// [Blog] : http://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================
/*:ja
* @plugindesc BGS並行演奏プラグイン
* @target MZ
* @url https://github.com/triacontane/RPGMakerMV/tree/mz_master/ParallelBgs.js
* @base PluginCommonBase
* @author トリアコンタン
*
* @command CHANGE_LINE
* @text ライン変更
* @desc 現在のBGSの演奏ラインを変更します演奏ラインの異なるBGSは並行して演奏できます
*
* @arg line
* @text ライン番号
* @desc 変更するBGSのライン番号です
* @default 1
* @type number
*
* @command ALL_STOP
* @text 全停止
* @desc 全ての演奏中のBGSを停止します
*
* @command FADEOUT_FOR_SE
* @text SE演奏時フェードアウト
* @desc SEが演奏されたタイミングでBGSを自動フェードアウトします
*
* @arg type
* @text フェードアウト種別
* @desc フェードアウトのやり方です
* @default 1
* @type select
* @option 0:フェードアウトせずに通常通りSEを演奏します
* @value 0
* @option 1:SE演奏と同時にフェードアウトを開始します
* @value 1
* @option 2:フェードアウトが完了してからSE演奏します
* @value 2
*
* @arg fadeTime
* @text フェード時間
* @desc 自動フェードアウトに掛かる時間(フレーム)です
* @default 60
* @type number
*
* @help ParallelBgs.js
*
* 複数のBGSを並行して演奏できます
* プラグインコマンドからBGSの演奏ラインを変更すると元のBGSを演奏したまま
* 新しく別のBGSを演奏することができます
* 並行演奏しているBGSはそれぞれ個別に音量やピッチ左右バランスを調節できます
* 演奏ラインのデフォルトは[1]です
*
* ラインの数に制限はありませんがあまりに大量のBGSを
* 同時に演奏しようとすると動作に影響がでる恐れがあります
*
* なおマップで指定するオート演奏のBGSはラインが[1]で固定になります
*
* 利用規約
* 作者に無断で改変再配布が可能で利用形態商用18禁利用等
* についても制限はありません
* このプラグインはもうあなたのものです
*/
(function () {
"use strict";
const script = document.currentScript;
PluginManagerEx.registerCommand(script, "CHANGE_LINE", (args) => {
$gameSystem.setBgsLine(args.line);
});
PluginManagerEx.registerCommand(script, "ALL_STOP", (args) => {
AudioManager.stopAllBgs();
});
PluginManagerEx.registerCommand(script, "FADEOUT_FOR_SE", (args) => {
$gameSystem.setBgsFadeForSe(args.type, args.fadeTime);
});
const _Game_Interpreter_command246 = Game_Interpreter.prototype.command246;
Game_Interpreter.prototype.command246 = function (params) {
AudioManager._bgsFadeOutByLine = true;
const result = _Game_Interpreter_command246.apply(this, arguments);
AudioManager._bgsFadeOutByLine = false;
return result;
};
//=============================================================================
// Game_System
// BGS演奏ラインを変更します。
//=============================================================================
const _Game_System_initialize = Game_System.prototype.initialize;
Game_System.prototype.initialize = function () {
_Game_System_initialize.apply(this, arguments);
this.initBgsMember();
};
Game_System.prototype.initBgsMember = function () {
this.setBgsLine(this.getBgsLine());
this.setBgsFadeForSe(this.getBgsFadeForSe(), this.getBgsFadeTime());
};
Game_System.prototype.getBgsLine = function () {
return this._bgsLine || 1;
};
Game_System.prototype.setBgsLine = function (value) {
this._bgsLine = value;
AudioManager.setBgsLineIndex(value);
};
Game_System.prototype.getBgsFadeForSe = function () {
return this._bgsFadeForPlayingSe || 0;
};
Game_System.prototype.setBgsFadeForSe = function (se, time) {
this._bgsFadeForPlayingSe = se;
this._bgsFadeTime = time;
AudioManager.setBgsFadeForSe(se);
};
Game_System.prototype.getBgsFadeTime = function () {
return this._bgsFadeTime || 1;
};
const _Game_System_onAfterLoad = Game_System.prototype.onAfterLoad;
Game_System.prototype.onAfterLoad = function () {
_Game_System_onAfterLoad.apply(this, arguments);
this.initBgsMember();
};
const _Game_Map_autoplay = Game_Map.prototype.autoplay;
Game_Map.prototype.autoplay = function () {
AudioManager.multiLineDisable = true;
_Game_Map_autoplay.apply(this, arguments);
AudioManager.multiLineDisable = false;
};
//=============================================================================
// AudioManager
// 複数のBGS演奏ラインを管理します。
//=============================================================================
AudioManager.multiLineDisable = false;
AudioManager._bgsLineIndex = 1;
AudioManager._bgsFadeForSe = 0;
AudioManager._bgsFadeTime = 1;
AudioManager._allBgsBuffer = [];
AudioManager._currentAllBgs = [];
AudioManager._delaySeStack = [];
AudioManager._allStop = false;
AudioManager._stopAllBgs = true;
AudioManager._bgsFading = false;
AudioManager._bgsFadeCounter = 0;
const _AudioManager_bgsVolume = Object.getOwnPropertyDescriptor(
AudioManager,
"bgsVolume"
);
Object.defineProperty(AudioManager, "bgsVolume", {
get: function () {
return _AudioManager_bgsVolume.get.call(this);
},
set: function (value) {
_AudioManager_bgsVolume.set.call(this, value);
const nowBgs = this._currentBgs;
this.iterateAllBgs(
function () {
if (nowBgs !== this._currentBgs)
this.updateBgsParameters(this._currentBgs);
}.bind(this)
);
},
configurable: true,
});
Object.defineProperty(AudioManager, "_bgsBuffer", {
get: function () {
return this._allBgsBuffer[this.getBgsLineIndex()];
},
set: function (value) {
this._allBgsBuffer[this.getBgsLineIndex()] = value;
},
});
Object.defineProperty(AudioManager, "_currentBgs", {
get: function () {
return this._currentAllBgs[this.getBgsLineIndex()];
},
set: function (value) {
this._currentAllBgs[this.getBgsLineIndex()] = value;
},
});
AudioManager.getBgsLineIndex = function () {
return this.multiLineDisable ? 1 : this._bgsLineIndex;
};
AudioManager.setBgsLineIndex = function (index) {
this._bgsLineIndex = index;
};
AudioManager.setBgsFadeForSe = function (value) {
this._bgsFadeForSe = value;
};
AudioManager.setBgsFadeTime = function (value) {
this._bgsFadeTime = value;
};
const _AudioManager_playBgs = AudioManager.playBgs;
AudioManager.playBgs = function (bgs, pos) {
if (!bgs) return;
this._stopAllBgs = false;
if (Array.isArray(bgs)) {
this.playAllBgs(bgs);
} else {
_AudioManager_playBgs.apply(this, arguments);
}
this._stopAllBgs = true;
};
AudioManager.playAllBgs = function (bgsArray) {
this.stopAllBgs();
const prevIndex = this._bgsLineIndex;
this._bgsLineIndex = 1;
bgsArray.forEach(function (bgs, index) {
this._bgsLineIndex = index;
this.playBgs(bgs, null);
}, this);
this._bgsLineIndex = prevIndex;
};
const _AudioManager_replayBgs = AudioManager.replayBgs;
AudioManager.replayBgs = function (bgs) {
if (!bgs) return;
if (Array.isArray(bgs)) {
this.replayAllBgs(bgs);
} else {
_AudioManager_replayBgs.apply(this, arguments);
}
};
AudioManager.replayAllBgs = function (bgsArray) {
this.stopAllBgs();
const prevIndex = this._bgsLineIndex;
this._bgsLineIndex = 1;
bgsArray.forEach(function (bgs, index) {
this._bgsLineIndex = index;
this.replayBgs(bgs);
}, this);
this._bgsLineIndex = prevIndex;
};
const _AudioManager_saveBgs = AudioManager.saveBgs;
AudioManager.saveBgs = function () {
const bgsArray = [];
this.iterateAllBgs(
function () {
bgsArray[this._bgsLineIndex] = _AudioManager_saveBgs.apply(
this,
arguments
);
}.bind(this)
);
return bgsArray.length > 1 ? bgsArray : bgsArray[0];
};
const _AudioManager_stopBgs = AudioManager.stopBgs;
AudioManager.stopBgs = function () {
if (!this._stopAllBgs) {
_AudioManager_stopBgs.apply(this, arguments);
} else {
this.stopAllBgs();
}
};
AudioManager.stopAllBgs = function () {
this.iterateAllBgs(
function () {
_AudioManager_stopBgs.apply(this, arguments);
}.bind(this)
);
};
const _AudioManager_fadeOutBgs = AudioManager.fadeOutBgs;
AudioManager.fadeOutBgs = function (time) {
if (this._bgsFadeOutByLine) {
_AudioManager_fadeOutBgs.call(this, time);
} else {
this.iterateAllBgs(
function () {
_AudioManager_fadeOutBgs.call(this, time);
}.bind(this)
);
}
};
const _AudioManager_fadeInBgs = AudioManager.fadeInBgs;
AudioManager.fadeInBgs = function (time) {
this.iterateAllBgs(
function () {
_AudioManager_fadeInBgs.call(this, time);
}.bind(this)
);
};
AudioManager.iterateAllBgs = function (callBack) {
const prevIndex = this._bgsLineIndex;
Object.keys(this._allBgsBuffer).forEach(function (index) {
this._bgsLineIndex = index;
callBack(this._bgsBuffer);
}, this);
this._bgsLineIndex = prevIndex;
};
const _AudioManager_playSe = AudioManager.playSe;
AudioManager.playSe = function (se) {
if (this.isNeedFadeOut()) {
this.fadeOutBgsForSe();
}
if (
this._bgsFadeForSe === 2 &&
this._currentBgs &&
this._bgsFadeCounter > 0
) {
this._delaySeStack.push(se);
} else {
_AudioManager_playSe.apply(this, arguments);
}
};
AudioManager.updateBgsFade = function () {
if (this.isNeedFadeIn()) {
this.fadeInBgsForSe();
}
if (this._bgsFadeCounter > 0) {
this._bgsFadeCounter--;
if (this._bgsFadeCounter === 0) {
this.playDelayedSe();
}
}
};
AudioManager.fadeOutBgsForSe = function () {
const currentAllBgs = this._currentAllBgs.clone();
this.fadeOutBgs(this._bgsFadeTime);
this._currentAllBgs = currentAllBgs;
this._bgsFading = true;
this._bgsFadeCounter = this._bgsFadeTime * 60;
};
AudioManager.isNeedFadeOut = function () {
return !this._bgsFading && this._bgsFadeForSe !== 0;
};
AudioManager.fadeInBgsForSe = function () {
this.fadeInBgs(this._bgsFadeTime);
this._bgsFading = false;
this._bgsFadeCounter = 0;
};
AudioManager.isNeedFadeIn = function () {
return (
this._bgsFading && !this.isPlayingAnySe() && this._bgsFadeCounter === 0
);
};
AudioManager.playDelayedSe = function () {
while (this._delaySeStack.length > 0) {
_AudioManager_playSe.call(this, this._delaySeStack.pop());
}
};
AudioManager.isPlayingAnySe = function () {
return this._seBuffers.some(function (audio) {
return audio.isExist();
});
};
//=============================================================================
// WebAudio
// 演奏が要求済みかどうかを返します。
//=============================================================================
WebAudio.prototype.isExist = function () {
return this._autoPlay;
};
//=============================================================================
// SceneManager
// AudioManagerの更新処理を呼び出します。
//=============================================================================
const _SceneManager_updateScene = SceneManager.updateScene;
SceneManager.updateScene = function () {
_SceneManager_updateScene.apply(this, arguments);
if (this._scene) {
AudioManager.updateBgsFade();
}
};
})();

View file

@ -0,0 +1,506 @@
//=============================================================================
// RPG Maker MZ - Plugin Analysis Common Base
//=============================================================================
/*:
* @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 トリアコンタン
*
* @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 (
!this._findTextParamSuffixList().some((regExp) =>
paramName.match(regExp)
)
) {
return PluginManagerEx.convertVariables(param);
} else {
return String(param);
}
}
_findTextParamSuffixList() {
return [/text$/gi, /name$/gi, /desc$/gi, /note$/gi, /script$/gi];
}
_isStructArray(param) {
return (
Array.isArray(param) && (param.length === 0 || this._isStruct(param))
);
}
_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) {
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\[(.+)]/gi, (_, p1) => {
return $gameSwitches ? $gameSwitches.value(parseInt(p1)) : "";
});
const key = this._selfSwitchKey;
if (!key) {
return text;
}
text = text.replace(/\x1bSS\[(.+)]/gi, (_, p1) => {
key[2] = p1;
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) => {
newArgs[key] = this.convertVariables(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 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, "<");
}
}
window.PluginManagerEx = PluginManagerEx;
class TextConverter {
// Copy of Window_Base.prototype.convertEscapeCharacters
static convertEscapeCharactersBase(text, data = null) {
text = text.replace(/\\/g, "\x1b");
text = text.replace(/\x1b\x1b/g, "\\");
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);
};
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);
}
};
})();

116
js/plugins/TextPicture.js Normal file
View file

@ -0,0 +1,116 @@
//=============================================================================
// RPG Maker MZ - Text Picture
//=============================================================================
/*:
* @target MZ
* @plugindesc Displays text as a picture.
* @author Yoji Ojima
*
* @help TextPicture.js
*
* This plugin provides a command to show text as a picture.
*
* Use it in the following procedure.
* 1. Call the plugin command "Set Text Picture".
* 2. Execute "Show Picture" without specifying an image.
*
* @command set
* @text Set Text Picture
* @desc Sets text to display as a picture.
* After this, execute "Show Picture" without specifying an image.
*
* @arg text
* @type multiline_string
* @text Text
* @desc Text to display as a picture.
* Control characters are allowed.
*/
/*:ja
* @target MZ
* @plugindesc テキストをピクチャとして表示します
* @author Yoji Ojima
*
* @help TextPicture.js
*
* このプラグインはテキストをピクチャとして表示するコマンドを提供します
*
* 次の手順で使用してください
* 1. プラグインコマンドテキストピクチャの設定を呼び出します
* 2. 画像を指定せずにピクチャの表示を実行します
*
* @command set
* @text テキストピクチャの設定
* @desc ピクチャとして表示するテキストを設定します
* この後画像を指定せずにピクチャの表示を実行してください
*
* @arg text
* @type multiline_string
* @text テキスト
* @desc ピクチャとして表示するテキストです
* 制御文字が使用可能です
*/
(() => {
const pluginName = "TextPicture";
let textPictureText = "";
PluginManager.registerCommand(pluginName, "set", (args) => {
textPictureText = String(args.text);
});
const _Game_Picture_show = Game_Picture.prototype.show;
Game_Picture.prototype.show = function () {
_Game_Picture_show.apply(this, arguments);
if (this._name === "" && textPictureText) {
this.mzkp_text = textPictureText;
this.mzkp_textChanged = true;
textPictureText = "";
}
};
const _Sprite_Picture_destroy = Sprite_Picture.prototype.destroy;
Sprite_Picture.prototype.destroy = function () {
destroyTextPictureBitmap(this.bitmap);
_Sprite_Picture_destroy.apply(this, arguments);
};
const _Sprite_Picture_updateBitmap = Sprite_Picture.prototype.updateBitmap;
Sprite_Picture.prototype.updateBitmap = function () {
_Sprite_Picture_updateBitmap.apply(this, arguments);
if (this.visible && this._pictureName === "") {
const picture = this.picture();
const text = picture ? picture.mzkp_text || "" : "";
const textChanged = picture && picture.mzkp_textChanged;
if (this.mzkp_text !== text || textChanged) {
this.mzkp_text = text;
destroyTextPictureBitmap(this.bitmap);
this.bitmap = createTextPictureBitmap(text);
picture.mzkp_textChanged = false;
}
} else {
this.mzkp_text = "";
}
};
function createTextPictureBitmap(text) {
const tempWindow = new Window_Base(new Rectangle());
const size = tempWindow.textSizeEx(text);
tempWindow.padding = 0;
tempWindow.move(0, 0, size.width, size.height);
tempWindow.createContents();
tempWindow.drawTextEx(text, 0, 0, 0);
const bitmap = tempWindow.contents;
tempWindow.contents = null;
tempWindow.destroy();
bitmap.mzkp_isTextPicture = true;
return bitmap;
}
function destroyTextPictureBitmap(bitmap) {
if (bitmap && bitmap.mzkp_isTextPicture) {
bitmap.destroy();
}
}
})();

6483
js/rmmz_core.js Normal file

File diff suppressed because it is too large Load diff

3121
js/rmmz_managers.js Normal file

File diff suppressed because it is too large Load diff

11300
js/rmmz_objects.js Normal file

File diff suppressed because it is too large Load diff

3685
js/rmmz_scenes.js Normal file

File diff suppressed because it is too large Load diff

3697
js/rmmz_sprites.js Normal file

File diff suppressed because it is too large Load diff

6647
js/rmmz_windows.js Normal file

File diff suppressed because it is too large Load diff

12
package.json Normal file
View file

@ -0,0 +1,12 @@
{
"name": "rmmz-game",
"main": "index.html",
"chromium-args": "--force-color-profile=srgb --disable-devtools",
"window": {
"title": "~王子様・外伝~雌豚王子は何処まで落ちる",
"width": 1280,
"height": 720,
"position": "center",
"icon": "icon/icon.png"
}
}