18,970
edits
(→cutscene: added info on begin_cutscene's arguments and on cutscene_sync's usage) |
(added key names for chr_holdkey) |
||
(12 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
{{TOCfloat}} | {{TOCfloat}} | ||
To learn how to declare and use functions, read the BSL manual's [[BSL:Manual#Functions|Functions]] section. This page documents Oni's built-in (or "native") scripting functions. The other half of the available scripting commands are in [[BSL:Variables]]. | |||
==About chr_index== | |||
"chr_index" is a means of identifying a character in a level, required by some functions like <tt>chr_focus</tt>. Each character including the player-character has a chr_index associated with him/her. Typically the chr_index is determined by the spawn order of the characters. Characters can be spawned either by scripting or by the engine itself (if the character doesn't have the "NotInitiallyPresent" flag in the [[OBD:BINA/OBJC/CHAR|BINACJBOCharacter]] file). | |||
For example, if this was run after loading the level with no one spawned except Konoko… | |||
<pre> | <pre> | ||
ai2_spawn Muro | ai2_spawn Muro | ||
Line 61: | Line 12: | ||
</pre> | </pre> | ||
…then Muro will receive chr_index 1, Mukade will have index 2 and the Bomber index 3. Konoko always has a chr_index of 0 because she's the first character to be spawned. As the game runs, however, things become more complicated. Once a character is deleted, either by being killed (after which the engine deletes them automatically) or by calling <tt>chr_delete</tt> directly, any characters spawned subsequently will fill in the holes left by the deleted characters. | |||
For example, if this is done… | |||
<pre> | <pre> | ||
ai2_spawn Muro | ai2_spawn Muro | ||
Line 73: | Line 22: | ||
</pre> | </pre> | ||
…Mukade will have index 2, but once he's deleted, his index will be freed up. When Bomber is spawned, he will receive index 2 in order to fill the hole left behind. If you are desperate to reset chr_index assignments for the sake of your scripting, you may want to use <tt>ai2_reset</tt>, which resets all characters to the level's initial state. | |||
{{clearall}} | |||
==Legend== | |||
{{Fmbox | |||
== | | image = none | ||
| text = • function_name parameter_name:type - description - example<br>''Optional notes'' | |||
}} | |||
Parameter | ;Parameter | ||
* | *parameter_name:type | ||
: | :You have to supply this parameter. | ||
*[parameter] | *[parameter] | ||
: | :This parameter is optional. You can use it or not. | ||
*[parameter1:type1 | parameter2:type2] | |||
:You can supply a parameter of the first type or second type. | |||
*(null) | *(null) | ||
: | :There are no parameters; you call the function by name alone. | ||
;Description | |||
The function name, parameters and description come directly from Oni (the command "dump_docs"). The description given after a dash is sometimes too short or cryptic to be of much use. Sometimes it's even a placeholder value like "bla bla bla" (thanks Bungie West). In those cases a modder may have added a note in italics under the function to explain what it really does. | |||
;Availability | |||
*<span style="color:green">Functions in this color are Windows-only</span> | |||
*<span style="color:blue">Functions in this color are Mac-only</span> | |||
==Native functions== | |||
===ai2=== | ===ai2=== | ||
'''Commands which can have an effect on all AIs (see below to use these same commands on one AI):''' | '''Commands which can have an effect on all AIs (see below to use these same commands on one AI):'''<br> | ||
*ai2_allpassive passive:int {0 | 1} - stops all AIs from thinking for themselves - ai2_allpassive 1 | *ai2_allpassive passive:int {0 | 1} - stops all AIs from thinking for themselves - ai2_allpassive 1 | ||
*ai2_kill - kills one or more AIs | |||
''If you don't specify any parameters to it, ai2_kill kills all AIs.'' | |||
*ai2_spawnall (null) - spawns all AI, even those not initially present - ai2_spawnall | *ai2_spawnall (null) - spawns all AI, even those not initially present - ai2_spawnall | ||
*ai2_takecontrol on_off:int {0 | 1} - makes the AI movement system take control of the player - ai2_takecontrol 1 | *ai2_takecontrol on_off:int {0 | 1} - makes the AI movement system take control of the player - ai2_takecontrol 1 | ||
* | *ai2_tripalarm - alarm_id:int [ai_name:string | script_id:int] - trips an alarm - ai2_tripalarm 2 0 | ||
''Tells all AIs about the character named in the third parameter (optional; default is the player-character). AIs will ignore the alarm if they are passive, are not set in their [[OBD:BINA/OBJC/CHAR|CHAR]] to respond to this alarm group, are an ally of the named character, or (when target is to be the player) they have had ai2_makeignoreplayer used on them or the variable ai2_ignore_player is true. The notified AIs will run to the target character's current location as of the time the alarm was tripped.'' | |||
'''Commands which have an effect on one AI:''' | '''Commands which have an effect on one AI:''' | ||
Line 111: | Line 65: | ||
*ai2_debug_makesound [sound_type:string | ] [volume:float | ] - causes the player to make a sound (alerts nearby AIs) | *ai2_debug_makesound [sound_type:string | ] [volume:float | ] - causes the player to make a sound (alerts nearby AIs) | ||
*ai2_doalarm [ai_name:string | script_id:int] [console_id:int] - tells an AI to run for an alarm - ai2_doalarm ambush_commguy_2 4 | *ai2_doalarm [ai_name:string | script_id:int] [console_id:int] - tells an AI to run for an alarm - ai2_doalarm ambush_commguy_2 4 | ||
'' | ''If the AI is passive, ai2_doalarm cannot be executed.'' | ||
*ai2_dopath [ai_name:string | script_id:int] path_name:string - tells an AI to run a particular path - ai2_dopath A_E3 patrol_49 | *ai2_dopath [ai_name:string | script_id:int] path_name:string - tells an AI to run a particular path - ai2_dopath A_E3 patrol_49 | ||
'' | ''If the AI is passive, ai2_dopath cannot be executed.'' | ||
*ai2_findconnections [distance:int | ] - finds all BNV connections from the player's location | *ai2_findconnections [distance:int | ] - finds all BNV connections from the player's location | ||
*ai2_followme [ai_name:string | script_id:int] - tells an AI to follow the player - ai2_followme s2_t05 | *ai2_followme [ai_name:string | script_id:int] - tells an AI to follow the player - ai2_followme s2_t05 | ||
''The AI will navigate to your position, but will stay there instead of continuing to follow you.'' | |||
*ai2_forget [ai_name:string | script_id:int] [forget_char:string] - makes one or all AIs forget they saw anything - ai2_forget Sec_Ambush_BOL_1 | *ai2_forget [ai_name:string | script_id:int] [forget_char:string] - makes one or all AIs forget they saw anything - ai2_forget Sec_Ambush_BOL_1 | ||
*ai2_idle [ai_name:string | script_id:int] - tells an AI to become idle - ai2_idle A1_intro01 | *ai2_idle [ai_name:string | script_id:int] - tells an AI to become idle - ai2_idle A1_intro01 | ||
*ai2_inactive [ai_name:string | script_id:int] - forces an AI into inactive mode | *ai2_inactive [ai_name:string | script_id:int] - forces an AI into inactive mode | ||
*ai2_kill [param1:string] [param2:string] - kills one or more AIs - ai2_kill ScanKerr01 / | *ai2_kill [param1:string] [param2:string] - kills one or more AIs - ai2_kill ScanKerr01 | ||
''You can kill every AI but one by specifying its name using the "except" keyword: <tt>ai2_kill except Griffin</tt>.'' | |||
*ai2_lookatchar [ai_name:string | script_id:int] [ai_name:string | script_id:int] - tells an AI to look at a character - ai2_lookatchar 0 Barabus | *ai2_lookatchar [ai_name:string | script_id:int] [ai_name:string | script_id:int] - tells an AI to look at a character - ai2_lookatchar 0 Barabus | ||
'' | ''Needs <tt>ai2_takecontrol 1</tt> if being used on Konoko.'' | ||
*ai2_lookatme [ai_name:string | script_id:int] - tells an AI to look at the player - ai2_lookatme s2_t05 | *ai2_lookatme [ai_name:string | script_id:int] - tells an AI to look at the player - ai2_lookatme s2_t05 | ||
*ai2_makeaware [ai_name:string | script_id:int] [target_name:string | target_script_id:int] - makes an AI aware of another character - ai2_makeaware GrifElite04 char_0 | *ai2_makeaware [ai_name:string | script_id:int] [target_name:string | target_script_id:int] - makes an AI aware of another character - ai2_makeaware GrifElite04 char_0 | ||
Line 128: | Line 84: | ||
*ai2_makeignoreplayer [ai_name:string | script_id:int] on_off:int{0 | 1} - makes a single AI ignore the player - ai2_makeignoreplayer ParkStriker 1 | *ai2_makeignoreplayer [ai_name:string | script_id:int] on_off:int{0 | 1} - makes a single AI ignore the player - ai2_makeignoreplayer ParkStriker 1 | ||
*ai2_movetoflag [ai_name:string | script_id:int] flag_id:int [setfacing:string{"setfacing"}] - tells an AI to move to a flag - ai2_movetoflag 0 1091 | *ai2_movetoflag [ai_name:string | script_id:int] flag_id:int [setfacing:string{"setfacing"}] - tells an AI to move to a flag - ai2_movetoflag 0 1091 | ||
''ai2_movetoflag will only work if there is a path to that flag. Needs <tt>ai2_takecontrol 1</tt> if being used on Konoko.'' | |||
''ai2_movetoflag will only work if there is a path to that flag'' | |||
*ai2_neutralbehavior [ai_name:string | script_id:int] behavior:string - sets up an AI's neutral-interaction - ai2_neutralbehavior neutral_3 none | *ai2_neutralbehavior [ai_name:string | script_id:int] behavior:string - sets up an AI's neutral-interaction - ai2_neutralbehavior neutral_3 none | ||
*ai2_noncombatant [ai_name:string | script_id:int] non_combatant:int{0 | 1} - sets or clears an AI's non-combatant state - ai2_noncombatant A1_intro01 1 | *ai2_noncombatant [ai_name:string | script_id:int] non_combatant:int{0 | 1} - sets or clears an AI's non-combatant state - ai2_noncombatant A1_intro01 1 | ||
Line 139: | Line 94: | ||
*ai2_report_verbose [ai_name:string | script_id:int | ] - tells an AI to report in verbosely | *ai2_report_verbose [ai_name:string | script_id:int | ] - tells an AI to report in verbosely | ||
*ai2_reset [reset_player:int] - resets AI as if start of level - ai2_reset | *ai2_reset [reset_player:int] - resets AI as if start of level - ai2_reset | ||
'' | ''Resets all consoles and characters as if you started the level again.'' | ||
*ai2_set_handlesilenterror handle_silent:bool [subsystem:string | ] - sets whether handled errors are silent | *ai2_set_handlesilenterror handle_silent:bool [subsystem:string | ] - sets whether handled errors are silent | ||
*ai2_set_logerror error_level:string [subsystem:string | ] - sets the level of errors to log to file | *ai2_set_logerror error_level:string [subsystem:string | ] - sets the level of errors to log to file | ||
Line 145: | Line 100: | ||
*ai2_setalert [ai_name:string | script_id:int] alert:string - sets the alert state of an AI - ai2_setalert Floor2_Striker_2 high (alert strings: lull, low, medium, high, combat) | *ai2_setalert [ai_name:string | script_id:int] alert:string - sets the alert state of an AI - ai2_setalert Floor2_Striker_2 high (alert strings: lull, low, medium, high, combat) | ||
*ai2_setjobstate [ai_name:string | script_id:int] - tells an AI to take its current state as its job - ai2_setjobstate E_Er34 | *ai2_setjobstate [ai_name:string | script_id:int] - tells an AI to take its current state as its job - ai2_setjobstate E_Er34 | ||
'' | ''If the AI is passive, ai2_setjobstate cannot be executed.'' | ||
*ai2_setmovementmode [ai_name:string | script_id:int] mode:string - sets an AI's current movement mode - ai2_setmovementmode finalam_striker_1 walk (movement mode strings: creep, walk, walk_noaim, run, run_noaim) | *ai2_setmovementmode [ai_name:string | script_id:int] mode:string - sets an AI's current movement mode - ai2_setmovementmode finalam_striker_1 walk (movement mode strings: creep, walk, walk_noaim, run, run_noaim) | ||
'' | ''Needs <tt>ai2_takecontrol 1</tt> if being used on Konoko.'' | ||
*ai2_showmem - shows AI memory usage | *ai2_showmem - shows AI memory usage | ||
*ai2_skill_bestangle best_angle:float - sets an AI's best aiming angle in degrees | *ai2_skill_bestangle best_angle:float - sets an AI's best aiming angle in degrees | ||
Line 153: | Line 108: | ||
*ai2_skill_delaymax maxdelay:int - sets an AI's max delay between shots, in frames | *ai2_skill_delaymax maxdelay:int - sets an AI's max delay between shots, in frames | ||
*ai2_skill_delaymin mindelay:int - sets an AI's min delay between shots, in frames | *ai2_skill_delaymin mindelay:int - sets an AI's min delay between shots, in frames | ||
*ai2_skill_error error_amount:float - sets an AI's grouping error (demonstration [https:// | *ai2_skill_error error_amount:float - sets an AI's grouping error (demonstration [https://www.youtube.com/watch?v=cxTz30YOPhc HERE]) | ||
*ai2_skill_inaccuracy inaccuracy:float - sets an AI's shooting inaccuracy multiplier | *ai2_skill_inaccuracy inaccuracy:float - sets an AI's shooting inaccuracy multiplier | ||
*ai2_skill_recoil recoil_compensation:float - sets an AI's recoil compensation amount (0-1) | *ai2_skill_recoil recoil_compensation:float - sets an AI's recoil compensation amount (0-1) | ||
Line 161: | Line 116: | ||
*ai2_skill_show - shows the currently selected shooting skill | *ai2_skill_show - shows the currently selected shooting skill | ||
*ai2_spawn ai_name:string [force_spawn:string{"force"}] - creates and starts an AI from a character object - ai2_spawn ambush_striker_2 | *ai2_spawn ai_name:string [force_spawn:string{"force"}] - creates and starts an AI from a character object - ai2_spawn ambush_striker_2 | ||
===chr=== | ===chr=== | ||
Line 174: | Line 128: | ||
*chr_animate_block [ai_name:string | script_id:int] anim_name:string [num_frames:int] [interp_frames:int] - plays an animation on a character and blocks until done - chr_animate_block 0 KONOKOlev11_cnsl_idle 300 | *chr_animate_block [ai_name:string | script_id:int] anim_name:string [num_frames:int] [interp_frames:int] - plays an animation on a character and blocks until done - chr_animate_block 0 KONOKOlev11_cnsl_idle 300 | ||
*chr_boss_shield [ai_name:string | script_id:int] - turns on the boss shield for a character - chr_boss_shield OutroNinja | *chr_boss_shield [ai_name:string | script_id:int] - turns on the boss shield for a character - chr_boss_shield OutroNinja | ||
''See [[Shields]] for a definition of "boss shield".'' | |||
*chr_changeteam [ai_name:string | script_id:int] team_name:string - changes a character's team - chr_changeteam guard1 Syndicate | *chr_changeteam [ai_name:string | script_id:int] team_name:string - changes a character's team - chr_changeteam guard1 Syndicate | ||
''Team name strings: Konoko, TCTF, Syndicate, Neutral, SecurityGuard, RogueKonoko, Switzerland, SyndicateAccessory'' | ''Team name strings: Konoko, TCTF, Syndicate, Neutral, SecurityGuard, RogueKonoko, Switzerland, SyndicateAccessory'' | ||
Line 195: | Line 150: | ||
''powerup strings: ammo, cell, hypo, shield (in percent), invis (invisibility in frames, -1 = forever), lsi (amount is ignored)'' | ''powerup strings: ammo, cell, hypo, shield (in percent), invis (invisibility in frames, -1 = forever), lsi (amount is ignored)'' | ||
*chr_giveweapon [ai_name:string | script_id:int] weapon_name:string - gives a character a new weapon - chr_giveweapon 0 w1_tap | *chr_giveweapon [ai_name:string | script_id:int] weapon_name:string - gives a character a new weapon - chr_giveweapon 0 w1_tap | ||
''weapon | ''weapon names: w1_tap, w2_sap, w3_phr, w4_psm, w5_sbg, w6_vdg, w7_scc, w8_mbo, w9_scr, w10_sni, w11_ba1, w12_ba2'' | ||
*chr_has_empty_weapon [ai_name:string | script_id:int] - returns if this character is holding a weapon that is empty - chr_has_empty_weapon(char_0) | *chr_has_empty_weapon [ai_name:string | script_id:int] - returns if this character is holding a weapon that is empty - chr_has_empty_weapon(char_0) | ||
''This function only returns if the player is out of ammo for the weapon and the weapon is also empty.'' | ''This function only returns if the player is out of ammo for the weapon and the weapon is also empty.'' | ||
Line 201: | Line 156: | ||
*chr_health chr_index:int [hit_points:int] - sets character's health - chr_health 0 300 | *chr_health chr_index:int [hit_points:int] - sets character's health - chr_health 0 300 | ||
*chr_holdkey [ai_name:string | script_id:int] key_name:string num_frames:int - forces a character to hold a key down for some frames | *chr_holdkey [ai_name:string | script_id:int] key_name:string num_frames:int - forces a character to hold a key down for some frames | ||
''key names: forward, back, stepleft, stepright, turnleft, turnright, crouch, jump, fire, altfire, punch, kick, action'' | |||
*chr_inv_reset [ai_name:string | script_id:int] - clears a characters inventory - chr_inv_reset ambush_tanker_1a | *chr_inv_reset [ai_name:string | script_id:int] - clears a characters inventory - chr_inv_reset ambush_tanker_1a | ||
*chr_invincible [ai_name:string | script_id:int] [on_off:int{0 | 1}] - makes a character invincible - chr_invincible char_0 1 | *chr_invincible [ai_name:string | script_id:int] [on_off:int{0 | 1}] - makes a character invincible - chr_invincible char_0 1 | ||
Line 211: | Line 167: | ||
''If you provide an index number ("IN") higher than the available number of characters ("NC"), the engine will keep iterating through the available characters, wrapping around when it hits the end, until it has traversed IN characters. For instance if NC = 85 and you input chr_main_class(180), the engine will change your class to the index 10 (180-85-85).'' | ''If you provide an index number ("IN") higher than the available number of characters ("NC"), the engine will keep iterating through the available characters, wrapping around when it hits the end, until it has traversed IN characters. For instance if NC = 85 and you input chr_main_class(180), the engine will change your class to the index 10 (180-85-85).'' | ||
''The practical effect seems to be different than chr_set_class (besides the parameters). For example with chr_main_class(ninja_hard_1) your ninja will be | ''The practical effect seems to be different than chr_set_class (besides the parameters). For example with chr_main_class(ninja_hard_1) your ninja will be righthanded while with chr_set_class(0,ninja_hard_1) your ninja will be lefthanded. Another difference is that chr_main_class seem to disable the Daodan effect when using chr_super on the character itself.'' | ||
*chr_neutral [ai_name:string | script_id:int] passive:int{0 | 1} - stops an AI from thinking for itself - chr_neutral ParkStriker 1 | *chr_neutral [ai_name:string | script_id:int] passive:int{0 | 1} - stops an AI from thinking for itself - chr_neutral ParkStriker 1 | ||
*chr_nocollision [ai_name:string | script_id:int] on_off:int{0 | 1} - disables collision for a character - chr_nocollision 0 1 | *chr_nocollision [ai_name:string | script_id:int] on_off:int{0 | 1} - disables collision for a character - chr_nocollision 0 1 | ||
Line 229: | Line 185: | ||
''chr_showextent_globals must be on for this to work.'' | ''chr_showextent_globals must be on for this to work.'' | ||
*<span style="color:blue">chr_showextent_globals - shows the global parts of an attack animation's extent - chr_showextent 1</span> | *<span style="color:blue">chr_showextent_globals - shows the global parts of an attack animation's extent - chr_showextent 1</span> | ||
*chr_super [ai_name:string | script_id:int] super_amount:float - set's a character's super value | *chr_super [ai_name:string | script_id:int] super_amount:float - set's a character's super value | ||
''This sets a character's "<u>external</u> super" value, meaning their Daodan glow, but will not grant them any special powers such as Daodan overpower. It is used to give Konoko her Daodan glow in the Mountain Compound opening cutscene (she isn't granted overhealth until the cutscene ends). The super_amount value determines the brightness of the Daodan particles: consider the effective range to be 1-10. The Compound cutscene gives Konoko a glow of 1, and the cheat code "chenille" gives her a glow of 10.'' | |||
*chr_talk [ai_name:string | script_id:int] sound_name:string pre_pause:int post_pause:int [priority:string | ] - causes a character to play a line of dialogue - chr_talk victim_mansci_1 c02_62_11sci 0 0 | *chr_talk [ai_name:string | script_id:int] sound_name:string pre_pause:int post_pause:int [priority:string | ] - causes a character to play a line of dialogue - chr_talk victim_mansci_1 c02_62_11sci 0 0 | ||
*chr_teleport [ai_name:string | script_id:int] flag_id:int - teleports a character to a flag - chr_teleport 0 105 | *chr_teleport [ai_name:string | script_id:int] flag_id:int - teleports a character to a flag - chr_teleport 0 105 | ||
Line 272: | Line 229: | ||
*console_print - dumps all arguments | *console_print - dumps all arguments | ||
*co_toggle_text - cycles console text color | *co_toggle_text - cycles console text color | ||
*dump_docs - shows all registered variables and | *dump_docs - shows all registered variables and functions | ||
''These will be dumped into the file script_commands.txt, next to Oni.'' | |||
*text_console name:string - turns on the text console display | *text_console name:string - turns on the text console display | ||
Line 345: | Line 303: | ||
*did_kill_griffen (null) - returns if we did kill griffen - did_kill_griffen() | *did_kill_griffen (null) - returns if we did kill griffen - did_kill_griffen() | ||
*difficulty (null) - returns the difficulty level | *difficulty (null) - returns the difficulty level | ||
''See [[Difficulty modes]] for all the factors changed with the difficulty level.'' | |||
*flag_view_prefix prefix:string - view flags with a specific prefix | *flag_view_prefix prefix:string - view flags with a specific prefix | ||
*hang when:string{"now"} - hangs the game (used for testing error handling) | *hang when:string{"now"} - hangs the game (used for testing error handling) | ||
Line 355: | Line 314: | ||
*print_type type:int - prints an anim type | *print_type type:int - prints an anim type | ||
*restore_game (null) - restores the game - restore_game | *restore_game (null) - restores the game - restore_game | ||
''Tells the game to load from disk the player state data saved in [[persist.dat]] – Konoko's position, health and inventory – for the current save point. The save point can be set in two ways: the player selecting an option from the Load Game screen, and the <tt>save_game</tt> function being called.'' | |||
*save_game save_point:int [type:string{"autosave"}] - saves the game - save_game 1 autosave | *save_game save_point:int [type:string{"autosave"}] - saves the game - save_game 1 autosave | ||
''Saves the player state to persist.dat. <tt>save_point</tt> is restricted to the range 0-10, but only values 1-10 are expected to be passed in. If you pass in "0", the error "invalid save point" will print on the console line but Oni will actually create "Save Point 0" under that level (or "Save Point -1" in the case of Chapter 1!). Loading this save point will be equivalent to clicking on the level title.<br>The only effect of passing "autosave" as the third parameter is playing the game-saved sound effect and displaying the message "Game saved." The game will be saved with or without it. No other value for this parameter has special meaning.'' | |||
*splash_screen texture:string - displays a splash screen - splash_screen warehouse_splash_screen | *splash_screen texture:string - displays a splash screen - splash_screen warehouse_splash_screen | ||
*tr_stop_lookup - bla bla bla | *tr_stop_lookup - bla bla bla |