DivaScript: Difference between revisions
Created page with "''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 <code>.dsc</code> 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, <code>.dsc</code> files from ''Project..." |
mNo edit summary |
||
| (21 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 | |Character slot | ||
| | |int | ||
|- | |||
|parts | |||
|Hair parts to control: | |||
<code>0</code>: both | |||
<code>1</code>: left | |||
<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. | |||
<code>BAR_TIME_SET(bpm, beats);</code> | |||
|bpm | |||
|Beats per minute | |||
|int | |||
|- | |||
|beats | |||
|Number of quarter note beats minus 1. eg: <code>3</code> for 4/4. | |||
|int | |||
|- | |||
| rowspan="2" | | |||
====== BLOOM ====== | |||
| rowspan="2" |Sets data from <code>bloom</code> pv_param. | |||
FT, F2, X: <code>BLOOM(id, unk);</code> | |||
|id | |||
|ID matching the data in pv_param. | |||
|int | |||
|- | |||
|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> | |||
|id | |||
|ID matching the field number in <code>pv_field</code> or <code>pv_db</code>. | |||
|int | |||
|- | |||
| rowspan="2" | | |||
====== CHARA_SIZE ====== | |||
| rowspan="2" |Sets a character's scale/size. | |||
<code>CHARA_SIZE(chara, size);</code> | |||
|chara | |||
|Character slot | |||
|int | |||
|- | |||
|size | |||
|Character scale | |||
|int | |||
|- | |||
| | |||
====== END ====== | |||
|Ends reading of the script. | |||
<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 | |||
|Character slot | |||
|int | |||
|- | |||
|hand | |||
|Which hand to scale: | |||
<code>1</code>: left | |||
<code>2</code>: right | |||
|enum | |||
|- | |- | ||
|scale | |scale | ||
| | |Hand scale in percentage times 10; eg. for <code>105%</code> use <code>1050</code> | ||
| | |int | ||
|- | |||
| rowspan="2" | | |||
====== LYRIC ====== | |||
| rowspan="2" |Displays a lyric from <code>pv_db</code>. | |||
<code>LYRIC(id, color);</code> | |||
|id | |||
|ID matching the number of a lyric in <code>pv_db</code>. | |||
Use <code>-1</code> as "disable". | |||
|int | |||
|- | |||
|color | |||
|<code>#AARRGGBB</code> hex color code converted to decimal. | |||
eg.: for a red lyric the command would be <code>LYRIC(id, 16711680);</code> | |||
because Red: <code>#00FF0000</code> → <code>0x00ff0000</code> → <code>16711680</code> | |||
Default: <code>-1</code> | |||
|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 | |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 | |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 | |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> | <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 | |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 | |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 | |id | ||
|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 | |int | ||
|- | |- | ||
| | |freq | ||
| | |Frequency of the note's path wave. | ||
|int | |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>: | |||
<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 | |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
