DivaScript: Difference between revisions
m Added more DSC commands |
mNo edit summary |
||
| (20 intermediate revisions by 5 users not shown) | |||
| Line 9: | Line 9: | ||
== List of DSC Commands ''(Incomplete)'' == | == List of DSC Commands ''(Incomplete)'' == | ||
List of commands that can be used in FT, F, F2/X DSC formats. Format-exclusive commands are marked individually. | |||
{| class="wikitable sortable" | |||
|+ | |||
!Command Name | |||
!Definition | |||
{| class="wikitable | |||
!Parameter | !Parameter | ||
!Description | !Description | ||
!Type | !Type | ||
|- | |- | ||
| rowspan="6" | | |||
====== AGEAGE_CTRL ====== | |||
| rowspan="6" |Controls the effect for the hair of the module "AgeAge Again". | |||
FT: <code>AGEAGE_CTRL(chara, parts, npr, rot_speed, skip, disp, -1, -1);</code> | |||
|chara | |chara | ||
|Character slot | |Character slot | ||
|int | |int | ||
|- | |- | ||
| | |parts | ||
| | |Hair parts to control: | ||
<code>0</code>: both | |||
0: both | <code>1</code>: left | ||
1: left | |||
2: right | <code>2</code>: right | ||
|enum | |||
|- | |||
|npr | |||
|sets NPR material | |||
|bool | |||
|- | |- | ||
| | |speed | ||
| | |Effect speed | ||
|int | |int | ||
|- | |- | ||
| | |skip | ||
| | |Skips 200 frames of animation. | ||
| | |bool | ||
|- | |- | ||
| | |disp | ||
| | |Whether to display the effect or not. | ||
| | |bool | ||
|- | |- | ||
| | | rowspan="2" | | ||
| | ====== BAR_TIME_SET ====== | ||
| rowspan="2" |Sets the length of a measure. | |||
=== BAR_TIME_SET === | |||
Sets the length of a measure. | |||
<code>BAR_TIME_SET(bpm, beats);</code> | <code>BAR_TIME_SET(bpm, beats);</code> | ||
|bpm | |bpm | ||
|Beats per minute | |Beats per minute | ||
|int | |int | ||
|- | |- | ||
|beats | |beats | ||
|Number of quarter note beats minus 1. eg | |Number of quarter note beats minus 1. eg: <code>3</code> for 4/4. | ||
|int | |int | ||
|- | |- | ||
| rowspan="2" | | |||
====== BLOOM ====== | |||
| rowspan="2" |Sets data from <code>bloom</code> pv_param. | |||
FT, F2, X: <code>BLOOM(id, unk);</code> | |||
|id | |id | ||
|ID matching the data in pv_param. | |ID matching the data in pv_param. | ||
|int | |int | ||
|- | |- | ||
|unk | |unk | ||
|Unknown | |Unknown | ||
|int | |int | ||
| | |- | ||
| | |||
====== CHANGE_FIELD ====== | |||
|Changes the field defined in <code>pv_field</code>/<code>pv_db</code>. | |||
<code>CHANGE_FIELD(id);</code> | |||
F2, X: <code>CHANGE_FIELD(id, unk);</code> | |||
<code>CHANGE_FIELD(id);</code> | |||
|id | |id | ||
|ID matching the field number in <code>pv_field</code> or <code>pv_db</code>. | |ID matching the field number in <code>pv_field</code> or <code>pv_db</code>. | ||
|int | |int | ||
| | |- | ||
| rowspan="2" | | |||
====== CHARA_SIZE ====== | |||
=== CHARA_SIZE === | | rowspan="2" |Sets a character's scale/size. | ||
Sets a character's scale/size. | |||
<code>CHARA_SIZE(chara, size);</code> | <code>CHARA_SIZE(chara, size);</code> | ||
|chara | |chara | ||
|Character slot | |Character slot | ||
|int | |int | ||
|- | |- | ||
|size | |size | ||
|Character scale | |Character scale | ||
|int | |int | ||
| | |- | ||
| | |||
=== END === | ====== END ====== | ||
Ends reading of the script. | |Ends reading of the script. | ||
<code>END();</code> | <code>END();</code> | ||
| colspan="3" | | |||
|- | |- | ||
| rowspan="3" | | |||
====== HAND_SCALE ====== | |||
| rowspan="3" |Sets the size of a character's hand. | |||
FT: <code>HAND_SCALE(chara, hand, scale);</code> | |||
|chara | |chara | ||
|Character slot | |Character slot | ||
|int | |int | ||
|- | |- | ||
|hand | |hand | ||
|Which hand | |Which hand to scale: | ||
<code>1</code>: left | |||
1: left | <code>2</code>: right | ||
2: right | |enum | ||
|- | |- | ||
|scale | |scale | ||
|Hand scale in percentage times 10; eg. | |Hand scale in percentage times 10; eg. for <code>105%</code> use <code>1050</code> | ||
|int | |int | ||
| | |- | ||
| rowspan="2" | | |||
=== LYRIC === | ====== LYRIC ====== | ||
| rowspan="2" |Displays a lyric from <code>pv_db</code>. | |||
<code>LYRIC(id, color);</code> | <code>LYRIC(id, color);</code> | ||
|id | |id | ||
|ID matching the number of a lyric in <code>pv_db</code>. | |ID matching the number of a lyric in <code>pv_db</code>. | ||
Use <code>-1</code> as "disable". | Use <code>-1</code> as "disable". | ||
|int | |int | ||
|- | |- | ||
|color | |color | ||
|<code>#AARRGGBB</code> hex color code converted to decimal. | |<code>#AARRGGBB</code> hex color code converted to decimal. | ||
eg.: for a red lyric the command would be <code>LYRIC(id, 16711680);</code> because | eg.: for a red lyric the command would be <code>LYRIC(id, 16711680);</code> | ||
Red: <code>#00FF0000</code> → <code>0x00ff0000</code> → <code>16711680</code> | |||
because Red: <code>#00FF0000</code> → <code>0x00ff0000</code> → <code>16711680</code> | |||
Default: <code>-1</code> | Default: <code>-1</code> | ||
|int | |int | ||
|} | |- | ||
| rowspan="2" | | |||
====== MIKU_DISP ====== | |||
| rowspan="2" |Shows or hides a character in a PV. | |||
<code>MIKU_DISP(chara, disp);</code> | |||
|chara | |||
|Character slot | |||
|int | |||
|- | |||
|disp | |||
|Whether to display the character or not. | |||
|bool | |||
|- | |||
| rowspan="4" | | |||
====== MIKU_MOVE ====== | |||
| rowspan="4" |Moves a character in 3D space in a PV. | |||
<code>MIKU_MOVE(chara, x, y, z);</code> | |||
|chara | |||
|Character slot | |||
|int | |||
|- | |||
|x | |||
|X coordinate | |||
|int | |||
|- | |||
|y | |||
|Y coordinate | |||
|int | |||
|- | |||
|z | |||
|Z coordinate | |||
|int | |||
|- | |||
| rowspan="2" | | |||
====== MIKU_ROT ====== | |||
| rowspan="2" |Rotates a character in a PV. | |||
<code>MIKU_ROT(chara, angle);</code> | |||
|chara | |||
|Character slot | |||
|int | |||
|- | |||
|angle | |||
|Angle value | |||
|int | |||
|- | |||
| rowspan="2" | | |||
====== MIKU_SHADOW ====== | |||
| rowspan="2" |Shows or hides a character's shadow in a PV. | |||
<code>MIKU_SHADOW(chara, disp);</code> | |||
|chara | |||
|Character slot | |||
|int | |||
|- | |||
|disp | |||
|Whether to display the character's shadow or not. | |||
|bool | |||
|- | |||
| rowspan="2" | | |||
====== MODE_SELECT ====== | |||
| rowspan="2" |Starts or ends a special chart segment, such as Chance Time. | |||
<code>MODE_SELECT(difficulty, mode);</code> | |||
|difficulty | |||
|Indicates under what difficulties the command will trigger in this exact script. | |||
This value is a bit flag corresponding to a group of difficulties: | |||
<code>1</code> - Easy | |||
<code>2</code> - Normal | |||
<code>4</code> - Hard | |||
<code>8</code> - Extreme | |||
<code>16</code> - Encore | |||
Adding the values up to each other results in a group: <code>6</code> = Hard (4) and Normal (2). | |||
Use <code>31</code> as a universal value (works on any difficulty). | |||
|bitfield enum | |||
|- | |||
|mode | |||
|What segment to start/end: | |||
<code>1</code> - Challenge Time (Arcade games) / Chance Time (Console games) Start | |||
<code>3</code> - Challenge Time (Arcade games) / Chance Time (Console games) End | |||
<code>8</code> - Technical Zone Start | |||
<code>9</code> - Technical Zone End | |||
Only used by the [https://divamodarchive.com/post/169 New Classics mod]: | |||
<code>4</code> - Chance Time Start | |||
<code>5</code> - Chance Time End | |||
|enum | |||
|- | |||
| rowspan="2" | | |||
====== MOVIE_CUT_CHG ====== | |||
| rowspan="2" |Plays, shows or hides the movie defined in <code>pv_db</code> or a movie from <code>movie.list</code> in <code>pv_db</code>. It can be used as a fancier version of both <code>MOVIE_DISP</code> and <code>MOVIE_PLAY</code> that allows more control. | |||
FT: <code>MOVIE_CUT_CHG(id, disp);</code> | |||
|id | |||
|The number in <code>movie.list</code> of the movie to be played. | |||
Playback starts at the moment the command is called for a newly called <code>movie.list</code> item. Re-calling a movie again doesn't play it from the starting position. | |||
|int | |||
|- | |||
|disp | |||
|<code>1</code> - display the movie layer | |||
Any other value - hide the movie layer (playback keeps going) | |||
|bool | |||
|- | |||
| | |||
====== MOVIE_DISP ====== | |||
|Shows or hides the movie layer in a PV. | |||
<code>MOVIE_DISP(disp);</code> | |||
|disp | |||
|<code>1</code> - display the movie layer | |||
Any other value - hide the movie layer (playback keeps going) | |||
|bool | |||
|- | |||
| | |||
====== MOVIE_PLAY ====== | |||
|Starts playing the movie defined in <code>pv_db</code> or the first movie in <code>movie.list</code> in <code>pv_db</code>. | |||
<code>MOVIE_PLAY(play);</code> | |||
|play | |||
|<code>1</code> - plays the movie | |||
Any other value doesn't do anything. | |||
|bool | |||
|- | |||
| | |||
====== MUSIC_PLAY ====== | |||
|Starts playing the song file defined in <code>pv_db</code>. | |||
<code>MUSIC_PLAY();</code> | |||
| colspan="3" | | |||
|- | |||
| | |||
====== PV_BRANCH_MODE ====== | |||
|Make future DSC commands only be executed on either the <code>Global</code>, <code>Fail</code> or <code>Success</code> branch. | |||
FT, F, F2, X: <code>PV_BRANCH_MODE(branch);</code> | |||
|branch | |||
|<code>0</code> - Global (commands are executed regardless of success state) | |||
<code>1</code> - Fail (commands are executed only if the PV is in the 'failed' state) | |||
<code>2</code> - Success (commands are executed only if the PV is in the 'success' state) | |||
|enum | |||
|- | |||
| | |||
====== PV_END ====== | |||
|Ends PV playback. | |||
<code>PV_END();</code> | |||
| colspan="3" | | |||
|- | |||
| | |||
====== SATURATE ====== | |||
|Changes color saturation in a PV. | |||
<code>SATURATE(amount);</code> | |||
|amount | |||
|Saturation strength on a scale from 0 to 1000: | |||
<code>0</code> - No color, perfect grayscale | |||
<code>1000</code> - Regular colors | |||
|int | |||
|- | |||
| rowspan="6" | | |||
====== SCENE_FADE ====== | |||
| rowspan="6" |Plays a screen fade effect during PVs. | |||
<code>SCENE_FADE(duration, start, end, r, g, b)</code> | |||
|duration | |||
|Fade duration in milliseconds | |||
eg: | |||
<code>1000</code>: 1 second | |||
<code>800</code>: 0.8 seconds | |||
|int | |||
|- | |||
|start | |||
|The opacity the fade will start with | |||
<code>0</code>: fully transparent | |||
<code>1000</code>: fully opaque | |||
|int | |||
|- | |||
|end | |||
|The opacity the fade will end with | |||
<code>0</code>: fully transparent | |||
<code>1000</code>: fully opaque | |||
|int | |||
|- | |||
|r | |||
|Red color component scale, from 0 to 1000 | |||
|int | |||
|- | |||
|g | |||
|Green color component scale, from 0 to 1000 | |||
|int | |||
|- | |||
|b | |||
|Blue color component scale, from 0 to 1000 | |||
|int | |||
|- | |||
| | |||
====== SE_EFFECT ====== | |||
|Plays a sound effect in a PV defined in <code>pv_db</code>. Normally used for success scenes but not restricted to them. | |||
FT, F, F2, X: <code>SE_EFFECT(id);</code> | |||
|id | |||
|number of a <code>effect_se_name_list</code> item defined in <code>pv_db</code>. | |||
|int | |||
|- | |||
| rowspan="12" | | |||
====== TARGET ====== | |||
| rowspan="12" |Spawns a rhythm game note. | |||
FT: <code>TARGET(type, pos_x, pos_y, angle, dist, amp, freq);</code> | |||
F: <code>TARGET(type, duration, is_end, pos_x, pos_y, angle, freq, dist, amp, fly_time, sig);</code> | |||
F2, X: <code>TARGET(type, duration, is_end, pos_x, pos_y, angle, freq, dist, amp, fly_time, sig, hit_eff);</code> | |||
|type | |||
|ID corresponding to a note type. | |||
Full ID list for each game on the dedicated [[Target]] page. | |||
|enum | |||
|- | |||
|pos_x | |||
|X position of the note's target. | |||
|int | |||
|- | |||
|pos_y | |||
|Y position of the note's target. | |||
|int | |||
|- | |||
|angle | |||
|Angle of the note's path. | |||
|int | |||
|- | |||
|distance | |||
|Distance between the note's spawn position and the target's position. | |||
Default: <code>300000</code> | |||
|int | |||
|- | |||
|amp | |||
|Amplitude of the note's path wave. | |||
Default: <code>500</code> | |||
|int | |||
|- | |||
|freq | |||
|Frequency of the note's path wave. | |||
|int | |||
|- | |||
|duration | |||
|(for F/F2/X formats) | |||
Sustain and Rush Note duration. | |||
Default (for notes other than Sustain and Rush): <code>-1</code> | |||
|DivaTime | |||
|- | |||
|is_end | |||
|(for F/F2/X formats) | |||
set to <code>1</code> for Sustain 'end' notes, otherwise set to <code>-1</code> | |||
|bool | |||
|- | |||
|fly_time | |||
|(for F/F2/X formats) | |||
Target Flying Time value (same format as the TARGET_FLYING_TIME command) | |||
|DivaTime | |||
|- | |||
|sig | |||
|(for F/F2/X formats) | |||
Time Signature | |||
The same value that would otherwise go in <code>BAR_TIME_SET</code>: | |||
Number of quarter note beats minus 1. eg: <code>3</code> for 4/4. | |||
|int | |||
|- | |||
|hit_eff | |||
|(for F2/X formats) | |||
Assigns a hit effect to the note based on a local ID defined in a previous TARGET_EFFECT command. | |||
|int | |||
|- | |||
| | |||
====== TARGET_FLYING_TIME ====== | |||
|Sets the time it takes for the rhythm game notes to hit their targets. | |||
<code>TARGET_FLYING_TIME(flytime);</code> | |||
|flytime | |||
|time value in milliseconds | |||
|int | |||
|- | |||
| | |||
====== TIME ====== | |||
|Waits until a specified game time. | |||
<code>TIME(t);</code> | |||
|t | |||
|time value in DivaTime | |||
|DivaTime | |||
|}<!-- Please keep all the commands in alphabetical order!! --> | |||
= References = | |||
somewhatlurker's [https://github.com/somewhatlurker/pydiva/blob/dsc/pydiva/pydsc_op_db.py pyDIVA/pyDSC] | |||
Revision as of 15:22, 23 October 2025
DivaScript (commonly referred to as DSC) is the file format used by all the Project DIVA games for storing various commands related to Music Videos/PVs and Rhythm Game Charts.
The data inside .dsc files is stored in a binary format. This means that they can not be edited with a text editor and instead require specialized programs that can decode them such as DSC Studio or ScriptEditor. Additionally, .dsc files from Project DIVA F2nd and Project DIVA X are encrypted using DIVAFILE encryption. They need to be decrypted before editing.
DSC Formats
Every Project DIVA game uses a specific DivaScript format. The exact format of a .dsc file is determined by the first 4 bytes of the file.
List of DSC Commands (Incomplete)
List of commands that can be used in FT, F, F2/X DSC formats. Format-exclusive commands are marked individually.
| Command Name | Definition | Parameter | Description | Type |
|---|---|---|---|---|
AGEAGE_CTRL |
Controls the effect for the hair of the module "AgeAge Again".
FT: |
chara | Character slot | int |
| parts | Hair parts to control:
|
enum | ||
| npr | sets NPR material | bool | ||
| speed | Effect speed | int | ||
| skip | Skips 200 frames of animation. | bool | ||
| disp | Whether to display the effect or not. | bool | ||
BAR_TIME_SET |
Sets the length of a measure.
|
bpm | Beats per minute | int |
| beats | Number of quarter note beats minus 1. eg: 3 for 4/4.
|
int | ||
BLOOM |
Sets data from bloom pv_param.
FT, F2, X: |
id | ID matching the data in pv_param. | int |
| unk | Unknown | int | ||
CHANGE_FIELD |
Changes the field defined in pv_field/pv_db.
F2, X: |
id | ID matching the field number in pv_field or pv_db.
|
int |
CHARA_SIZE |
Sets a character's scale/size.
|
chara | Character slot | int |
| size | Character scale | int | ||
END |
Ends reading of the script.
|
|||
HAND_SCALE |
Sets the size of a character's hand.
FT: |
chara | Character slot | int |
| hand | Which hand to scale:
|
enum | ||
| scale | Hand scale in percentage times 10; eg. for 105% use 1050
|
int | ||
LYRIC |
Displays a lyric from pv_db.
|
id | ID matching the number of a lyric in pv_db.
Use |
int |
| color | #AARRGGBB hex color code converted to decimal.
eg.: for a red lyric the command would be because Red: Default: |
int | ||
MIKU_DISP |
Shows or hides a character in a PV.
|
chara | Character slot | int |
| disp | Whether to display the character or not. | bool | ||
MIKU_MOVE |
Moves a character in 3D space in a PV.
|
chara | Character slot | int |
| x | X coordinate | int | ||
| y | Y coordinate | int | ||
| z | Z coordinate | int | ||
MIKU_ROT |
Rotates a character in a PV.
|
chara | Character slot | int |
| angle | Angle value | int | ||
MIKU_SHADOW |
Shows or hides a character's shadow in a PV.
|
chara | Character slot | int |
| disp | Whether to display the character's shadow or not. | bool | ||
MODE_SELECT |
Starts or ends a special chart segment, such as Chance Time.
|
difficulty | Indicates under what difficulties the command will trigger in this exact script.
This value is a bit flag corresponding to a group of difficulties:
Adding the values up to each other results in a group: Use |
bitfield enum |
| mode | What segment to start/end:
Only used by the New Classics mod:
|
enum | ||
MOVIE_CUT_CHG |
Plays, shows or hides the movie defined in pv_db or a movie from movie.list in pv_db. It can be used as a fancier version of both MOVIE_DISP and MOVIE_PLAY that allows more control.
FT: |
id | The number in movie.list of the movie to be played.
Playback starts at the moment the command is called for a newly called |
int |
| disp | 1 - display the movie layer
Any other value - hide the movie layer (playback keeps going) |
bool | ||
MOVIE_DISP |
Shows or hides the movie layer in a PV.
|
disp | 1 - display the movie layer
Any other value - hide the movie layer (playback keeps going) |
bool |
MOVIE_PLAY |
Starts playing the movie defined in pv_db or the first movie in movie.list in pv_db.
|
play | 1 - plays the movie
Any other value doesn't do anything. |
bool |
MUSIC_PLAY |
Starts playing the song file defined in pv_db.
|
|||
PV_BRANCH_MODE |
Make future DSC commands only be executed on either the Global, Fail or Success branch.
FT, F, F2, X: |
branch | 0 - Global (commands are executed regardless of success state)
|
enum |
PV_END |
Ends PV playback.
|
|||
SATURATE |
Changes color saturation in a PV.
|
amount | Saturation strength on a scale from 0 to 1000:
|
int |
SCENE_FADE |
Plays a screen fade effect during PVs.
|
duration | Fade duration in milliseconds
eg:
|
int |
| start | The opacity the fade will start with
|
int | ||
| end | The opacity the fade will end with
|
int | ||
| r | Red color component scale, from 0 to 1000 | int | ||
| g | Green color component scale, from 0 to 1000 | int | ||
| b | Blue color component scale, from 0 to 1000 | int | ||
SE_EFFECT |
Plays a sound effect in a PV defined in pv_db. Normally used for success scenes but not restricted to them.
FT, F, F2, X: |
id | number of a effect_se_name_list item defined in pv_db.
|
int |
TARGET |
Spawns a rhythm game note.
FT: F: F2, X: |
type | ID corresponding to a note type.
Full ID list for each game on the dedicated Target page. |
enum |
| pos_x | X position of the note's target. | int | ||
| pos_y | Y position of the note's target. | int | ||
| angle | Angle of the note's path. | int | ||
| distance | Distance between the note's spawn position and the target's position.
Default: |
int | ||
| amp | Amplitude of the note's path wave.
Default: |
int | ||
| freq | Frequency of the note's path wave. | int | ||
| duration | (for F/F2/X formats)
Sustain and Rush Note duration.
Default (for notes other than Sustain and Rush): |
DivaTime | ||
| is_end | (for F/F2/X formats)
set to |
bool | ||
| fly_time | (for F/F2/X formats)
Target Flying Time value (same format as the TARGET_FLYING_TIME command) |
DivaTime | ||
| sig | (for F/F2/X formats)
Time Signature The same value that would otherwise go in Number of quarter note beats minus 1. eg: |
int | ||
| hit_eff | (for F2/X formats)
Assigns a hit effect to the note based on a local ID defined in a previous TARGET_EFFECT command. |
int | ||
TARGET_FLYING_TIME |
Sets the time it takes for the rhythm game notes to hit their targets.
|
flytime | time value in milliseconds | int |
TIME |
Waits until a specified game time.
|
t | time value in DivaTime | DivaTime |
References
somewhatlurker's pyDIVA/pyDSC
