view 06/ecl.xml @ 7:2a7b9d62c0c4

Fix details, and details and documentation for a few instructions
author Thibaut Girka <thib@sitedethib.com>
date Tue, 23 Aug 2011 11:58:03 +0200
parents 578e67aa3c03
children 79dfd9765a67
line wrap: on
line source

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../html.xsl"?>
<?xml-stylesheet type="text/css" href="../style.css"?>
<!DOCTYPE html>
<opcodes xmlns="urn:opcodes:description">
	<title>ECL Sub format</title>

	<text>
		<div xmlns="http://www.w3.org/1999/xhtml">
			<h2>Lvalues and Rvalues / direct vs memory indirect addressing</h2>
			<p>In EoSD, most 32-bits arguments passed to instructions may be actual values or variable indexes.<br/>
			Values comprised between -10025 and -10001 are variable indexes, whereas other values are actual values.
			Values passed through variable/register indexes are Lvalues, other values are not. Some instructions require some of their operands to be Lvalues.</p>

			<h2>Accessing values</h2>
			<p>[TODO: verify] How the game accesses values passed as argument is as follows:<br/>
			TYPE is the type of the argument (float, int32, ...):</p>

<pre>if ((TYPE) argument &lt; -10000)
    return *(TYPE*) &amp;variables[(int)(-10000-(TYPE) argument)];
else
    return (TYPE) argument;</pre>

			<h2>Variables</h2>
			<p>Only variables in the range [-10001, -10025] without -10014, -10020 and -10023 are used in the game.</p>

			<h3>Local variables</h3>
			<p>Local variables may be read or written by the script, they are local to a subroutine, and put on a stack when a subroutine is called. They are not used by the game engine itself.</p>
			<table>
				<tr><th>Number</th><th>Type</th></tr>
				<tr><td>-10001</td><td>int</td></tr>
				<tr><td>-10002</td><td>int</td></tr>
				<tr><td>-10003</td><td>int</td></tr>
				<tr><td>-10004</td><td>int</td></tr>
				<tr><td>-10005</td><td>float</td></tr>
				<tr><td>-10006</td><td>float</td></tr>
				<tr><td>-10007</td><td>float</td></tr>
				<tr><td>-10008</td><td>float</td></tr>
				<tr><td>-10009</td><td>int</td></tr>
				<tr><td>-10010</td><td>int</td></tr>
				<tr><td>-10011</td><td>int</td></tr>
				<tr><td>-10012</td><td>int</td></tr>
			</table>

			<h3>Special variables</h3>
			<p>Special variables are game or enemy-scoped variables and most of them cannot be overriden by the script.</p>
			<table>
				<tr><th>Number</th><th>Type</th>	<th>Name</th>		<th>RW/RO</th>	<th>Notes</th></tr>
				<tr><td>-10013</td><td>int</td>		<td>rank</td>		<td>ro</td>	<td></td></tr>
				<tr><td>-10014</td><td>int</td>		<td>difficulty</td>	<td>ro</td>	<td>Unused.</td></tr>
				<tr><td>-10015</td><td>float</td>	<td>x</td>		<td>rw</td>	<td></td></tr>
				<tr><td>-10016</td><td>float</td>	<td>y</td>		<td>rw</td>	<td></td></tr>
				<tr><td>-10017</td><td>float</td>	<td>z</td>		<td>rw</td>	<td></td></tr>
				<tr><td>-10018</td><td>float</td>	<td>player_x</td>	<td>ro</td>	<td></td></tr>
				<tr><td>-10019</td><td>float</td>	<td>player_y</td>	<td>ro</td>	<td></td></tr>
				<tr><td>-10020</td><td>float</td>	<td></td>		<td>ro</td>	<td>Unused.</td></tr>
				<tr><td>-10021</td><td>float</td>	<td>enemy_player_angle</td> <td>ro</td>	<td></td></tr>
				<tr><td>-10022</td><td>int</td>		<td>last_frame</td>	<td>rw</td>	<td></td></tr>
				<tr><td>-10023</td><td>float</td>	<td>enemy_player_distance</td><td>ro</td><td>Unused.</td></tr>
				<tr><td>-10024</td><td>int</td>		<td>life</td>		<td>rw</td>	<td></td></tr>
				<tr><td>-10025</td><td>int</td>		<td>player</td>		<td>ro</td>	<td>0 = ReimuA, 1 = ReimuB, 2 = MarisaA, 3 = MarisaB</td></tr>
			</table>

			<h2>Opcodes</h2>
		</div>
	</text>

	<op>
		<num>0</num>
		<name>noop</name>
		<desc>Do nothing.</desc>
	</op>

	<op>
		<num>1</num>
		<name>delete</name>
		<params>
			<param type="S" values="0">Unknown</param>
		</params>
		<desc>Delete the sprite and perhaps free the memory used.</desc>
	</op>

	<op>
		<num>2</num>
		<name>relative_jump</name>
		<params>
			<param type="S" name="new_frame" unit="frame" values="0 to 360"/>
			<param type="S" name="relative_offset" unit="bytes" values="-2032 to 632">Starting from the start of the current opcode.</param>
		</params>
		<desc>Unconditionally jump to relative_offset with new frame counter. Used as a while.</desc>
	</op>

	<op>
		<num>3</num>
		<name>relative_jump_ex</name>
		<params>
			<param type="S" name="new_frame" unit="frame" values="0 to 532"/>
			<param type="S" name="relative_offset" unit="bytes" values="-1376 to -12"/>
			<param type="S" name="counter_id" unit="var_id" var="must" values="-10011 to -10009"/>
		</params>
		<desc>If the counter is non-null, jump to relative_offset with new frame counter, and decrease counter counter_id by 1. Used as a for.</desc>
	</op>

	<op>
		<num>4</num>
		<name>set_int</name>
		<params>
			<param type="S" name="variable" unit="var_id" var="must" values="-10012 to -10001"/>
			<param type="S" name="value" var="can" values="-10005 to -10021, 0 to 300"/>
		</params>
		<desc>Assign a value to the variable. Sometimes, value can be another variable.</desc>
	</op>

	<op>
		<num>5</num>
		<name>set_float</name>
		<params>
			<param type="S" name="variable" unit="var_id" var="must" values="-10005 to -10017"/>
			<param type="f" name="value" var="can" values="-12.0f to 460.0f"/>
		</params>
		<desc>Like <ref>4</ref>, but with a float as value.</desc>
	</op>

	<op>
		<num>6</num>
		<name>set_random_int</name>
		<params>
			<param type="S" name="variable" unit="var_id" var="must" values="-10001"/>
			<param type="S" name="value" var="can" values="2, 3"/>
		</params>
		<desc>Assign an integer in the [0, value) range to the variable.</desc>
	</op>

	<op>
		<num>8</num>
		<name>set_random_float</name>
		<params>
			<param type="S" name="variable" unit="var_id" var="must"/>
			<param type="f" name="maximum" var="can" values="1.0f to 2pi to 384.0f"/>
		</params>
		<desc>Like <ref>6</ref>, but with a float as value.</desc>
	</op>

	<op>
		<num>9</num>
		<name></name>
		<params>
			<param type="S"/>
			<param type="f"/>
			<param type="f"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>10</num>
		<name></name>
		<params>
			<param type="S" var="can/must" values="-10005"/>
		</params>
		<desc>Used only one time, in <stage>2</stage>.</desc>
	</op>

	<op>
		<num>13</num>
		<name></name>
		<params>
			<param type="S"/>
			<param type="S"/>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>14</num>
		<name></name>
		<params>
			<param type="S"/>
			<param type="S"/>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>15</num>
		<name></name>
		<params>
			<param type="S" var="can/must" values="-10001"/>
			<param type="S" var="can/must" values="-10012"/>
			<param type="S" values="1 to 5"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>16</num>
		<name></name>
		<params>
			<param type="S"/>
			<param type="S"/>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>17</num>
		<name></name>
		<params>
			<param type="S" name="variable1?"/>
			<param type="S" name="variable2?"/>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>18</num>
		<name></name>
		<params>
			<param type="S" name="variable?" var="can/must" values="-10012, -10004, -10002, -10001"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>20</num>
		<name>add</name>
		<params>
			<param type="S" name="variable" unit="var_id" var="must"/>
			<param type="f" var="can" name="a"/>
			<param type="f" var="can" name="b"/>
		</params>
		<desc>variable = a + b; Warning: a and b will be dereferenced as integers (not converted) if variable is an integer!</desc>
	</op>

	<op>
		<num>21</num>
		<name></name>
		<params>
			<param type="S" name="variable" unit="var_id" var="must"/>
			<param type="f" var="can" name="a"/>
			<param type="f" var="can" name="b"/>
		</params>
		<desc>variable = a - b; Warning: a and b will be dereferenced as integers (not converted) if variable is an integer!</desc>
	</op>

	<op>
		<num>23</num>
		<name></name>
		<params>
			<param type="S"/>
			<param type="f"/>
			<param type="f"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>25</num>
		<name></name>
		<params>
			<param type="S" var="can/must" values="-10005"/>
			<param type="f"/>
			<param type="f"/>
			<param type="f" values="192.0f"/>
			<param type="f" values="224.0f"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>26</num>
		<name></name>
		<params>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>27</num>
		<name>compare_ints</name>
		<params>
			<param type="S" var="can" name="a"/>
			<param type="S" var="can" name="b"/>
		</params>
		<desc>Compare a and b, store the result (-1 if a &lt; b, 0 if a == b, 1 if a > b) in the "comparison register".</desc>
	</op>

	<op>
		<num>28</num>
		<name></name>
		<params>
			<param type="f"/>
			<param type="f"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>29</num>
		<name></name>
		<params>
			<param type="S"/>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>30</num>
		<name></name>
		<params>
			<param type="S"/>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>31</num>
		<name>relative_jump_if_equal</name>
		<params>
			<param type="S" name="new_frame" unit="frame" values="0, 2, 60"/>
			<param type="S" name="relative_offset" unit="bytes" values="44, 176, 324">Starting from the start of the current opcode.</param>
		</params>
		<desc>Jump if the "comparison register" equals to 0, that is, if the compared values are equal.</desc>
	</op>

	<op>
		<num>32</num>
		<name></name>
		<params>
			<param type="S" value="120"/>
			<param type="S" value="64"/>
		</params>
		<desc>Used only one time in <stage>4</stage></desc>
	</op>

	<op>
		<num>33</num>
		<name></name>
		<params>
			<param type="S"/>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>34</num>
		<name></name>
		<params>
			<param type="S"/>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>35</num>
		<name>call</name>
		<params>
			<param type="S" name="function" unit="sub"/>
			<param type="S" name="param1"/>
			<param type="f" name="param2" values="-0.31415927f to 0.31415927f"/>
		</params>
		<desc>Call given sub with -10001 = param1, -10005 = param2.</desc>
	</op>

	<op>
		<num>36</num>
		<name>return</name>
		<desc>Almost always called at the end of the function. See stage3 for two times where it is called before <ref>1</ref>.</desc>
	</op>

	<op>
		<num>39</num>
		<name>call_if_equal</name>
		<params>
			<param type="S" name="function" unit="sub"/>
			<param type="S" values="0" name="param1"/>
			<param type="f" values="0" name="param2"/>
			<param type="S" name="a"/>
			<param type="S" name="b"/>
		</params>
		<desc>Call given sub with -10001 = param1, -10005 = param2 if a == b.</desc>
	</op>

	<op>
		<num>43</num>
		<name>set_position</name>
		<params>
			<param type="f" name="x"/>
			<param type="f" name="y"/>
			<param type="f" name="y" values="0">Ignored</param>
		</params>
		<desc>Move the enemy to a new position, used for interpolation.</desc>
	</op>

	<op>
		<num>45</num>
		<name>set_angle_speed</name>
		<params>
			<param type="f" name="angle" unit="radian">0.0f is left, PI/2 is down.</param>
			<param type="f" name="speed" unit="pixels/frame"/>
		</params>
		<desc>Set the angular trajectory and speed of the enemy.</desc>
	</op>

	<op>
		<num>46</num>
		<name>set_rotation_speed</name>
		<params>
			<param type="f" name="speed" unit="radian/frame"/>
		</params>
		<desc>Change the angular trajectory of the enemy. It continues to turn until this function is called again.</desc>
	</op>

	<op>
		<num>47</num>
		<name>set_speed</name>
		<params>
			<param type="f" name="speed" unit="pixels/frame"/>
		</params>
		<desc>Change the speed of the enemy.</desc>
	</op>

	<op>
		<num>48</num>
		<name>set_acceleration</name>
		<params>
			<param type="f" name="step" unit="pixels/frame"/>
		</params>
		<desc>Change the speed of the enemy step by step, at each frame.</desc>
	</op>

	<op>
		<num>49</num>
		<name>set_random_?</name>
		<params>
			<param type="f" values="0.7853982f">The new angle?</param>
			<param type="f" values="2.3561945f">Some deplacement?</param>
		</params>
		<desc>Used only five times, in <stage>2</stage>. Seems to involve some randomness.</desc>
	</op>

	<op>
		<num>50</num>
		<name></name>
		<params>
			<param type="f" values="-PI (-3.1415927f)"/>
			<param type="f" values="PI (3.1415927f)"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>51</num>
		<name>set_speed_towards_player</name>
		<params>
			<param type="S" value="0">Ignored</param>
			<param type="f" name="speed" unit="pixels/frame"/>
		</params>
		<desc>Sets the speed of the enemy, and change its direction to where the player is at that frame. Used only one time in <stage>2</stage>.</desc>
	</op>

	<op>
		<num>52</num>
		<name></name>
		<params>
			<param type="S"/>
			<param type="f"/>
			<param type="f"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>56</num>
		<name></name>
		<params>
			<param type="S"/>
			<param type="f"/>
			<param type="f"/>
			<param type="S" values="0"/>
		</params>
		<desc>Used only two times in <stage>7</stage></desc>
	</op>

	<op>
		<num>57</num>
		<name>move_to</name>
		<params>
			<param type="S" name="duration" unit="frames"/>
			<param type="f" name="x" unit="pixels"/>
			<param type="f" name="y" unit="pixels"/>
			<param type="f" name="z" unit="pixels" values="0.0f">Ignored</param>
		</params>
		<desc>Move the enemy to the new position in this amount of frames. TODO: find the exact interpolation method</desc>
	</op>

	<op>
		<num>59</num>
		<name>move_to2</name>
		<params>
			<param type="S" name="duration" unit="frames"/>
			<param type="f" name="x" unit="pixels" values="192.0f"/>
			<param type="f" name="y" unit="pixels" values="-64.0f, 150.0f"/>
			<param type="f" name="z" unit="pixels" values="0.0f"/>
		</params>
		<desc>Move the enemy to the new position in this amount of frames. TODO: how it is different from move_to?</desc>
	</op>

	<op>
		<num>61</num>
		<name>stop_in_decel</name>
		<params>
			<param type="S" name="duration" unit="frames"/>
		</params>
		<desc>Keep a straight trajectory with decelerating speed to stop in duration frames.</desc>
	</op>

	<op>
		<num>63</num>
		<name>stop_in_accel</name>
		<params>
			<param type="S" name="duration" unit="frames"/>
		</params>
		<desc>Like <ref>61</ref> but with acceleration instead of deceleration.</desc>
	</op>

	<op>
		<num>65</num>
		<name>set_screen_box</name>
		<params>
			<param type="f" name="x1" unit="pixels"/>
			<param type="f" name="y1" unit="pixels"/>
			<param type="f" name="x2" unit="pixels"/>
			<param type="f" name="y2" unit="pixels"/>
		</params>
		<desc>Disallow an enemy to quit the defined rectangle. If it goes outside it is destroyed. By default this rectangle is the displayed screen.</desc>
	</op>

	<op>
		<num>66</num>
		<name>clear_screen_box</name>
		<desc>Remove the limit set in <ref>65</ref>.</desc>
	</op>

	<op>
		<num>67</num>
		<name>set_bullet_attributes</name>
		<params>
			<param type="s" name="bullet" unit="script"/>
			<param type="s" name="launch" unit="script"/>
			<param type="S" name="bullets_per_shot"/>
			<param type="S" name="number_of_shots"/>
			<param type="f" name="speed" unit="pixels/frame"/>
			<param type="f"/>
			<param type="f" name="launch_angle" unit="radian"/>
			<param type="f" name="angle_between_two_bullets" unit="radian"/>
			<param type="S" name="flags">>= 64, freezed</param>
		</params>
		<desc>Modify the attributes of the next enemy attack. Directs it to the player.</desc>
	</op>

	<op>
		<num>68</num>
		<name></name>
		<params>
			<param type="s"/>
			<param type="s"/>
			<param type="S"/>
			<param type="S"/>
			<param type="f"/>
			<param type="f"/>
			<param type="f"/>
			<param type="f"/>
			<param type="S"/>
		</params>
		<desc>The same as <ref>67</ref>, except the shot is directed to the right of the enemy.</desc>
	</op>

	<op>
		<num>69</num>
		<name></name>
		<params>
			<param type="s"/>
			<param type="s"/>
			<param type="S"/>
			<param type="S"/>
			<param type="f"/>
			<param type="f"/>
			<param type="f"/>
			<param type="f"/>
			<param type="S"/>
		</params>
		<desc>No visible difference from <ref>67</ref>.</desc>
	</op>

	<op>
		<num>70</num>
		<name></name>
		<params>
			<param type="s"/>
			<param type="s"/>
			<param type="S"/>
			<param type="S"/>
			<param type="f"/>
			<param type="f"/>
			<param type="f"/>
			<param type="f"/>
			<param type="S"/>
		</params>
		<desc>No visible difference from <ref>68</ref>.</desc>
	</op>

	<op>
		<num>71</num>
		<name></name>
		<params>
			<param type="s"/>
			<param type="s"/>
			<param type="S"/>
			<param type="S"/>
			<param type="f"/>
			<param type="f"/>
			<param type="S"/>
			<param type="S"/>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>74</num>
		<name></name>
		<params>
			<param type="s"/>
			<param type="s"/>
			<param type="S"/>
			<param type="S"/>
			<param type="f"/>
			<param type="f"/>
			<param type="S"/>
			<param type="S"/>
			<param type="S"/>
		</params>
		<desc>Used only one time, in <stage>3</stage>.</desc>
	</op>

	<op>
		<num>75</num>
		<name></name>
		<params>
			<param type="s"/>
			<param type="s"/>
			<param type="S"/>
			<param type="S"/>
			<param type="f"/>
			<param type="f"/>
			<param type="f"/>
			<param type="f"/>
			<param type="S"/>
		</params>
		<desc>Seems like <ref>68</ref>, but with some differences in speed.</desc>
	</op>

	<op>
		<num>76</num>
		<name></name>
		<params>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>77</num>
		<name>bullet_interval</name>
		<params>
			<param type="S" name="interval" unit="frames"/>
		</params>
		<desc>Time between two shots.</desc>
	</op>

	<op>
		<num>78</num>
		<name>delay_attack</name>
		<desc>If present, delays the first attack of the amount of frames defined by <ref>77</ref>. If not, the enemy shoots instantly after setting the bullets attributes.</desc>
	</op>

	<op>
		<num>79</num>
		<name>no_delay_attack</name>
		<desc></desc>
	</op>

	<op>
		<num>81</num>
		<name>bullet_launch_offset</name>
		<params>
			<param type="f" name="x" unit="pixels"/>
			<param type="f" name="y" unit="pixels"/>
			<param type="f" name="z" unit="pixels" values="0">Ignored</param>
		</params>
		<desc>Change the offset of the launch of bullets.</desc>
	</op>

	<op>
		<num>82</num>
		<name></name>
		<params>
			<param type="S"/>
			<param type="S"/>
			<param type="S"/>
			<param type="S"/>
			<param type="f"/>
			<param type="f"/>
			<param type="f" values="-1.0f"/>
			<param type="f" values="-1.0f"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>83</num>
		<name></name>
		<desc>No-op? Doesn't seem to change anything.</desc>
	</op>

	<op>
		<num>84</num>
		<name></name>
		<params>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>85</num>
		<name>laser</name>
		<params>
			<param type="s"/>
			<param type="s"/>
			<param type="f" name="angle" unit="radian">clockwise, from the +x axis</param>
			<param type="S" name="speed" unit="pixels/frame">speed of the laser along its axis</param>
			<param type="f" name="start_offset" unit="pixels">offset along the laser axis, relative to the enemy. If negative, it is considered as 0.</param>
			<param type="f" name="end_offset" unit="pixels">offset along the laser axis, relative to the enemy. Can be negative. In case end_offset &lt; start_offset, the laser will be in the oposite direction.</param>
			<param type="f" name="length" unit="pixels">TODO: Not really a length, something really odd. The laser starts at max(start_offset, end_offset - length) and ends at end_offset.</param>
			<param type="f" name="width" unit="pixels"/>
			<param type="S" name="start_duration" unit="frames"/>
			<param type="S" name="duration" unit="frames"/>
			<param type="S" name="stop_duration" unit="frames"/>
			<param type="S" name="grazing_dealy" unit="frames">how long to wait before allowing grazing</param>
			<param type="S" name="grazing_extra_duration" unit="frames">how long to allow grazing after the laser started to disappear</param>
			<param type="S" values="0"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>86</num>
		<name>laser_towards_player</name>
		<params>
			<param type="s"/>
			<param type="s"/>
			<param type="f" name="angle" unit="radian">clockwise, from the enemy->player axis</param>
			<param type="S" name="speed" unit="pixels/frame">speed of the laser along its axis</param>
			<param type="f" name="start_offset" unit="pixels">offset along the laser axis, relative to the enemy. If negative, it is considered as 0.</param>
			<param type="f" name="end_offset" unit="pixels">offset along the laser axis, relative to the enemy. Can be negative. In case end_offset &lt; start_offset, the laser will be in the oposite direction.</param>
			<param type="f" name="length" unit="pixels">TODO: Not really a length, something really odd. The laser starts at max(start_offset, end_offset - length) and ends at end_offset.</param>
			<param type="f" name="width" unit="pixels"/>
			<param type="S" name="start_duration" unit="frames"/>
			<param type="S" name="duration" unit="frames"/>
			<param type="S" name="stop_duration" unit="frames"/>
			<param type="S" name="grazing_dealy" unit="frames">how long to wait before allowing grazing</param>
			<param type="S" name="grazing_extra_duration" unit="frames">how long to allow grazing after the laser started to disappear</param>
			<param type="S" values="0"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>87</num>
		<name>set_upcoming_id</name>
		<params>
			<param type="S" name="laser" unit="laser_id"/>
		</params>
		<desc>Sets upcoming laser to a given id, in order to manipulate it later.</desc>
	</op>

	<op>
		<num>88</num>
		<name>alter_laser_angle</name>
		<params>
			<param type="S" name="laser" unit="laser_id"/>
			<param type="f" name="delta" unit="radian"/>
		</params>
		<desc>Adds delta to the laser's angle.</desc>
	</op>

	<op>
		<num>90</num>
		<name></name>
		<params>
			<param type="S" values="0 to 3"/>
			<param type="S" values="0"/>
			<param type="S" values="0"/>
			<param type="S" values="0"/>
		</params>
		<desc>Used only one time, in <stage>7</stage>.</desc>
	</op>

	<op>
		<num>92</num>
		<name></name>
		<params>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>93</num>
		<name>set_spellcard</name>
		<params>
			<param type="s"/>
			<param type="s" name="number">As in the captured spellcards screen, minus 1.</param>
			<param type="z" name="name">In SHIFT_JIS</param>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>94</num>
		<name></name>
		<desc></desc>
	</op>

	<op>
		<num>95</num>
		<name></name>
		<params>
			<param type="S"/>
			<param type="f"/>
			<param type="f"/>
			<param type="f"/>
			<param type="s"/>
			<param type="s"/>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>96</num>
		<name></name>
		<desc></desc>
	</op>

	<op>
		<num>97</num>
		<name>set_enemy_anim</name>
		<params>
			<param type="S" name="anim" unit="script"/>
		</params>
		<desc>Set a sprite (taken from current anm) for the enemy.</desc>
	</op>

	<op>
		<num>98</num>
		<name>set_boss_anims</name>
		<params>
			<param type="s" name="default" unit="script"/>
			<param type="s" name="far_left" unit="script"/>
			<param type="s" name="far_right" unit="script"/>
			<param type="s" name="left" unit="script"/>
			<param type="S" name="right" unit="script">Perhaps two int16_t instead.</param>
		</params>
		<desc>Give a set of animations for a boss deplacements.</desc>
	</op>

	<op>
		<num>99</num>
		<name></name>
		<params>
			<param type="S"/>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>100</num>
		<name>set_death_anim</name>
		<params>
			<param type="S" name="anim" unit="script" values="768, 769, 258">In fact, any 256n+[0-2] works and is the same; other values make the program crash.</param>
		</params>
		<desc>When the enemy is destroyed, the animation used.</desc>
	</op>

	<op>
		<num>101</num>
		<name>set_boss_mode</name>
		<params>
			<param type="S" values="-1, 0">Unknown meaning, seems to be 0 for mid-boss and -1 for real boss.</param>
		</params>
		<desc>Activates the boss mode, with her life bar and lives number displayed on the top. Doesn't do anything before calling <ref>126</ref>.</desc>
	</op>

	<op>
		<num>102</num>
		<name></name>
		<params>
			<param type="S"/>
			<param type="f"/>
			<param type="f"/>
			<param type="f"/>
			<param type="f" values="48.0f"/>
		</params>
		<desc>Create the "squares" running around Rumia ???</desc>
	</op>

	<op>
		<num>103</num>
		<name>set_enemy_hitbox</name>
		<params>
			<param type="f" name="width" unit="pixels" values="16 to 56"/>
			<param type="f" name="height" unit="pixels" values="16 to 56"/>
			<param type="f" name="depth" unit="pixels" values="32.0f">Ignored</param>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>104</num>
		<name></name>
		<params>
			<param type="S" values="0, 1"/>
		</params>
		<desc>noop?</desc>
	</op>

	<op>
		<num>105</num>
		<name>set_vulnerable</name>
		<params>
			<param type="S" name="x" values="0, 1"/>
		</params>
		<desc>if x &amp; 1, the enemy can take damage, else it cannot.</desc>
	</op>

	<op>
		<num>106</num>
		<name>play_sound</name>
		<params>
			<param type="S"/>
		</params>
		<desc>Play a sound.</desc>
	</op>

	<op>
		<num>107</num>
		<name>set_death_flags</name>
		<params>
			<param type="S"/>
		</params>
		<desc>Control what to do when life falls to zero. 0 = normal, 1 = don't clean the sprite, 2 = don't die, 4 (unused) = don't die and don't drop bonus. These are flags that can be combined.</desc>
	</op>

	<op>
		<num>108</num>
		<name>call_when_killed</name>
		<params>
			<param type="S" name="function" unit="sub"/>
		</params>
		<desc>Specify the subroutine to call when the enemy is killed.</desc>
	</op>

	<op>
		<num>109</num>
		<name></name>
		<params>
			<param type="S"/>
			<param type="S" values="0"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>111</num>
		<name>set_life</name>
		<params>
			<param type="S" name="life"/>
		</params>
		<desc>equivalent to <ref>4</ref>(-10024, life).</desc>
	</op>

	<op>
		<num>112</num>
		<name></name>
		<params>
			<param type="S" values="0, 99999"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>113</num>
		<name>set_boss_lower_life_limit</name>
		<params>
			<param type="S" name="limit" unit="life" values="-1, 500-3400"/>
		</params>
		<desc>When enemy's life gets lower or equal to the limit, the callback set by <ref>114</ref> is called.</desc>
	</op>

	<op>
		<num>114</num>
		<name>set_boss_callback</name>
		<params>
			<param type="S" name="callback" unit="sub" values="9-68"/>
		</params>
		<desc>Specify the sub to call when the enemy's life gets below a certain amount set by a <ref>113</ref>.</desc>
	</op>

	<op>
		<num>115</num>
		<name>set_timeout</name>
		<params>
			<param type="S" name="timeout" unit="frame"/>
		</params>
		<desc>Sets the timeout of the current boss attack.</desc>
	</op>

	<op>
		<num>116</num>
		<name></name>
		<params>
			<param type="S"/>
		</params>
		<desc>Doesn't seem to do anything. Tried to remove it, use 0, 1, 127, 1023, 1024, 4096 as an argument, nothing... ???</desc>
	</op>

	<op>
		<num>117</num>
		<name></name>
		<params>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>118</num>
		<name></name>
		<params>
			<param type="S"/>
			<param type="S"/>
			<param type="s"/>
			<param type="s"/>
		</params>
		<desc>TODO: "explosion" (dying boss).</desc>
	</op>

	<op>
		<num>119</num>
		<name>drop_bonus</name>
		<params>
			<param type="S" name="number" values="3, 4, 5, 6, 8, 10, 12, 20"/>
		</params>
		<desc>Drop a certain number of bonus at the frame it is called. If the power is not max, drop power items, else drop point items.</desc>
	</op>

	<op>
		<num>120</num>
		<name></name>
		<params>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>121</num>
		<name></name>
		<params>
			<param type="S"/>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>122</num>
		<name></name>
		<params>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>123</num>
		<name></name>
		<params>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>124</num>
		<name></name>
		<params>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>125</num>
		<name></name>
		<desc></desc>
	</op>

	<op>
		<num>126</num>
		<name>set_boss_lives</name>
		<params>
			<param type="S" name="lives">Can even be negative. :D</param>
		</params>
		<desc>Sets the remaining lives of a boss. Should be called at the start of each round.</desc>
	</op>

	<op>
		<num>127</num>
		<name></name>
		<params>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>128</num>
		<name></name>
		<params>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>129</num>
		<name></name>
		<params>
			<param type="S"/>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>130</num>
		<name></name>
		<params>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>131</num>
		<name></name>
		<params>
			<param type="f"/>
			<param type="f"/>
			<param type="S"/>
			<param type="S"/>
			<param type="S"/>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>132</num>
		<name></name>
		<params>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>

	<op>
		<num>133</num>
		<name></name>
		<desc></desc>
	</op>

	<op>
		<num>134</num>
		<name></name>
		<desc></desc>
	</op>

	<op>
		<num>135</num>
		<name></name>
		<params>
			<param type="S"/>
		</params>
		<desc></desc>
	</op>
</opcodes>