changeset 12:79dfd9765a67

I *really* should commit more often.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Tue, 04 Oct 2011 11:45:04 +0200
parents 9f0e37b7eeab
children 2925b0e246c6
files 06/anm.xml 06/ecl.xhtml 06/ecl.xml html.xsl
diffstat 4 files changed, 348 insertions(+), 273 deletions(-) [+]
line wrap: on
line diff
--- a/06/anm.xml
+++ b/06/anm.xml
@@ -58,7 +58,7 @@
 
 	<op>
 		<num>7</num>
-		<name>set_mirror</name>
+		<name>toggle_mirror</name>
 		<desc>Performs a scale of -1 on the x axis.</desc>
 	</op>
 
@@ -195,9 +195,11 @@
 
 	<op>
 		<num>26</num>
+		<name>set_automatic_angle</name>
 		<params>
-			<param type="S"/>
+			<param type="S" name="x">Bitfield</param>
 		</params>
+		<desc>If <code>x &amp; 1</code>, rotate on z by <code>pi - angle</code>.</desc>
 	</op>
 
 	<op>
--- a/06/ecl.xhtml
+++ b/06/ecl.xhtml
@@ -49,7 +49,7 @@ typedef struct {
 } thecl_main_instr_t;
 </pre>
 
-		<p>Most present instruction, that pops an enemy.</p>
+		<p id="enemy_sub">Most present instruction, that pops an enemy.</p>
 <pre>
 typedef struct {
     uint16_t time;
--- a/06/ecl.xml
+++ b/06/ecl.xml
@@ -143,91 +143,91 @@ else
 
 	<op>
 		<num>9</num>
-		<name></name>
+		<name>set_random_float2</name>
 		<params>
-			<param type="S"/>
-			<param type="f"/>
-			<param type="f"/>
+			<param type="S" name="variable" unit="var_id" var="must"/>
+			<param type="f" name="amplitude"/>
+			<param type="f" name="minimum"/>
 		</params>
-		<desc></desc>
+		<desc>Assign a float in the [minimum, minimum+amplitude) range to the variable.</desc>
 	</op>
 
 	<op>
 		<num>10</num>
-		<name></name>
+		<name>store_x</name>
 		<params>
-			<param type="S" var="can/must" values="-10005"/>
+			<param type="S" name="variable" unit="var_id" var="must" values="-10005"/>
 		</params>
-		<desc>Used only one time, in <stage>2</stage>.</desc>
+		<desc>Store the x value of the enemy in the specified variable. Equivalent to <ref>4</ref>(variable, -10015).</desc>
 	</op>
 
 	<op>
 		<num>13</num>
-		<name></name>
+		<name>add_int</name>
 		<params>
-			<param type="S"/>
-			<param type="S"/>
-			<param type="S"/>
+			<param type="S" name="variable" unit="var_id" var="must"/>
+			<param type="S" name="a" var="can"/>
+			<param type="S" name="b" var="can"/>
 		</params>
-		<desc></desc>
+		<desc>variable = a + b;</desc>
 	</op>
 
 	<op>
 		<num>14</num>
-		<name></name>
+		<name>substract_int</name>
 		<params>
-			<param type="S"/>
-			<param type="S"/>
-			<param type="S"/>
+			<param type="S" name="variable" unit="var_id" var="must"/>
+			<param type="S" name="a" var="can"/>
+			<param type="S" name="b" var="can"/>
 		</params>
-		<desc></desc>
+		<desc>variable = a - b;</desc>
 	</op>
 
 	<op>
 		<num>15</num>
-		<name></name>
+		<name>multiply_int</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"/>
+			<param type="S" name="variable" var="must" values="-10001"/>
+			<param type="S" name="a" var="can" values="-10012"/>
+			<param type="S" name="b" var="can" values="1 to 5"/>
 		</params>
-		<desc></desc>
+		<desc>variable = a * b;</desc>
 	</op>
 
 	<op>
 		<num>16</num>
-		<name></name>
+		<name>divide_int</name>
 		<params>
-			<param type="S"/>
-			<param type="S"/>
-			<param type="S"/>
+			<param type="S" name="variable" var="must"/>
+			<param type="S" name="a" var="can"/>
+			<param type="S" name="b" var="can"/>
 		</params>
-		<desc></desc>
+		<desc>variable = a / b;</desc>
 	</op>
 
 	<op>
 		<num>17</num>
-		<name></name>
+		<name>modulo</name>
 		<params>
-			<param type="S" name="variable1?"/>
-			<param type="S" name="variable2?"/>
-			<param type="S"/>
+			<param type="S" name="variable" var="must"/>
+			<param type="S" name="a" var="can"/>
+			<param type="S" name="b" var="can"/>
 		</params>
-		<desc></desc>
+		<desc>variable = a % b;</desc>
 	</op>
 
 	<op>
 		<num>18</num>
-		<name></name>
+		<name>increment</name>
 		<params>
-			<param type="S" name="variable?" var="can/must" values="-10012, -10004, -10002, -10001"/>
+			<param type="S" name="variable" unit="var_id" var="must" values="-10012, -10004, -10002, -10001"/>
 		</params>
-		<desc></desc>
+		<desc>Increment the given integer variable of 1.</desc>
 	</op>
 
 	<op>
 		<num>20</num>
-		<name>add</name>
+		<name>add_float</name>
 		<params>
 			<param type="S" name="variable" unit="var_id" var="must"/>
 			<param type="f" var="can" name="a"/>
@@ -238,7 +238,7 @@ else
 
 	<op>
 		<num>21</num>
-		<name></name>
+		<name>substract_float</name>
 		<params>
 			<param type="S" name="variable" unit="var_id" var="must"/>
 			<param type="f" var="can" name="a"/>
@@ -249,35 +249,35 @@ else
 
 	<op>
 		<num>23</num>
-		<name></name>
+		<name>divide_float</name>
 		<params>
-			<param type="S"/>
-			<param type="f"/>
-			<param type="f"/>
+			<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></desc>
+		<desc>variable = a / b;</desc>
 	</op>
 
 	<op>
 		<num>25</num>
-		<name></name>
+		<name>get_direction</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"/>
+			<param type="S" var="must" values="-10005"/>
+			<param type="f" name="x1" unit="pixels" var="can"/>
+			<param type="f" name="y1" unit="pixels" var="can"/>
+			<param type="f" name="x2" unit="pixels" var="can" values="192.0f"/>
+			<param type="f" name="y2" unit="pixels" var="can" values="224.0f"/>
 		</params>
-		<desc></desc>
+		<desc>Compute the direction between two points. If the first is at the left of the second put 0.0f in the variable, if it is above put pi/2, etc.</desc>
 	</op>
 
 	<op>
 		<num>26</num>
-		<name></name>
+		<name>float_to_unit_circle</name>
 		<params>
-			<param type="S"/>
+			<param type="S" var="must" values="float variables"/>
 		</params>
-		<desc></desc>
+		<desc>Takes a float and transforms it to be in the [-pi, pi] interval.<br/>3.1415928 -> pi; 3.1415929 -> -pi.</desc>
 	</op>
 
 	<op>
@@ -292,32 +292,32 @@ else
 
 	<op>
 		<num>28</num>
-		<name></name>
+		<name>compare_floats</name>
 		<params>
-			<param type="f"/>
-			<param type="f"/>
+			<param type="f" var="can" name="a"/>
+			<param type="f" var="can" name="b"/>
 		</params>
-		<desc></desc>
+		<desc>Like <ref>27</ref>, but with floats.</desc>
 	</op>
 
 	<op>
 		<num>29</num>
-		<name></name>
+		<name>relative_jump_if_lower_than</name>
 		<params>
-			<param type="S"/>
-			<param type="S"/>
+			<param type="S" name="new_frame" unit="frame"/>
+			<param type="S" name="relative_offset" unit="bytes"/>
 		</params>
-		<desc></desc>
+		<desc>Like <ref>2</ref> but only when the comparison register equals to -1.</desc>
 	</op>
 
 	<op>
 		<num>30</num>
-		<name></name>
+		<name>relative_jump_if_lower_or_equal</name>
 		<params>
-			<param type="S"/>
-			<param type="S"/>
+			<param type="S" name="new_frame" unit="frame" values="0, 60, 65, 120"/>
+			<param type="S" name="relative_offset" unit="bytes" values="40, 44, 60, 456"/>
 		</params>
-		<desc></desc>
+		<desc>Like <ref>2</ref> but only when the comparison register is different of 1.</desc>
 	</op>
 
 	<op>
@@ -327,37 +327,37 @@ else
 			<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>
+		<desc>Like <ref>2</ref> but only when the comparison register equals to 0.</desc>
 	</op>
 
 	<op>
 		<num>32</num>
-		<name></name>
+		<name>relative_jump_if_greater_than</name>
 		<params>
-			<param type="S" value="120"/>
-			<param type="S" value="64"/>
+			<param type="S" name="new_frame" unit="frame" values="120"/>
+			<param type="S" name="relative_offset" unit="bytes" values="64"/>
 		</params>
-		<desc>Used only one time in <stage>4</stage></desc>
+		<desc>Like <ref>2</ref> but only when the comparison register equals to 1. Used only one time in <stage>4</stage>.</desc>
 	</op>
 
 	<op>
 		<num>33</num>
-		<name></name>
+		<name>relative_jump_if_greater_or_equal</name>
 		<params>
-			<param type="S"/>
-			<param type="S"/>
+			<param type="S" name="new_frame" unit="frame"/>
+			<param type="S" name="relative_offset" unit="bytes"/>
 		</params>
-		<desc></desc>
+		<desc>Like <ref>2</ref> but only when the comparison register is different of -1.</desc>
 	</op>
 
 	<op>
 		<num>34</num>
-		<name></name>
+		<name>relative_jump_if_not_equal</name>
 		<params>
-			<param type="S"/>
-			<param type="S"/>
+			<param type="S" name="new_frame" unit="frame"/>
+			<param type="S" name="relative_offset" unit="bytes"/>
 		</params>
-		<desc></desc>
+		<desc>Like <ref>2</ref> but only when the comparison register is different of 0.</desc>
 	</op>
 
 	<op>
@@ -374,7 +374,7 @@ else
 	<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>
+		<desc>When the sub is called by a <ref>35</ref> or a <ref>39</ref>, returns to the calling sub. If it was called from the main, crash.</desc>
 	</op>
 
 	<op>
@@ -383,7 +383,7 @@ else
 		<params>
 			<param type="S" name="function" unit="sub"/>
 			<param type="S" values="0" name="param1"/>
-			<param type="f" values="0" name="param2"/>
+			<param type="f" values="0.0f" name="param2"/>
 			<param type="S" name="a"/>
 			<param type="S" name="b"/>
 		</params>
@@ -392,11 +392,11 @@ else
 
 	<op>
 		<num>43</num>
-		<name>set_position</name>
+		<name>set_pos</name>
 		<params>
-			<param type="f" name="x"/>
-			<param type="f" name="y"/>
-			<param type="f" name="y" values="0">Ignored</param>
+			<param type="f" name="x" var="can"/>
+			<param type="f" name="y" var="can"/>
+			<param type="f" name="z" var="can" values="0.0f">Ignored</param>
 		</params>
 		<desc>Move the enemy to a new position, used for interpolation.</desc>
 	</op>
@@ -440,22 +440,22 @@ else
 
 	<op>
 		<num>49</num>
-		<name>set_random_?</name>
+		<name>set_random_angle</name>
 		<params>
-			<param type="f" values="0.7853982f">The new angle?</param>
-			<param type="f" values="2.3561945f">Some deplacement?</param>
+			<param type="f" name="min" unit="radian" values="0.7853982f"/>
+			<param type="f" name="max" unit="radian" values="2.3561945f"/>
 		</params>
-		<desc>Used only five times, in <stage>2</stage>. Seems to involve some randomness.</desc>
+		<desc>Set the enemy angle in the [min, max-min) range. Used only five times, in <stage>2</stage>.</desc>
 	</op>
 
 	<op>
 		<num>50</num>
-		<name></name>
+		<name>set_random_angle_ex</name>
 		<params>
 			<param type="f" values="-PI (-3.1415927f)"/>
 			<param type="f" values="PI (3.1415927f)"/>
 		</params>
-		<desc></desc>
+		<desc>Like <ref>49</ref>, but enclosed in boxes. TODO: document that.</desc>
 	</op>
 
 	<op>
@@ -470,49 +470,49 @@ else
 
 	<op>
 		<num>52</num>
-		<name></name>
+		<name>move_in_decel</name>
 		<params>
-			<param type="S"/>
-			<param type="f"/>
-			<param type="f"/>
+			<param type="S" name="duration" unit="frames" values="10, 370"/>
+			<param type="f" name="angle" unit="radian" values="0.0f to pi"/>
+			<param type="f" name="speed" unit="pixels/frame" values="0.8f, 4.0f"/>
 		</params>
-		<desc></desc>
+		<desc>Like <ref>45</ref>, but move the enemy in `duration` frames, using an decelerating interpolation function. TODO: find that function.</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>
+		<name>move_to_linear</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>
+		<desc>Move the enemy to the new position in `duration` amount of frames, using the <code>x↦x</code> function. Used only two times in <stage>7</stage>.</desc>
+	</op>
+
+	<op>
+		<num>57</num>
+		<name>move_to_decel</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>Like <ref>56</ref>, but with <code>x↦2x-x²</code>.</desc>
 	</op>
 
 	<op>
 		<num>59</num>
-		<name>move_to2</name>
+		<name>move_to_accel</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>
+		<desc>Like <ref>56</ref>, but with <code>x↦x²</code>.</desc>
 	</op>
 
 	<op>
@@ -553,16 +553,16 @@ else
 
 	<op>
 		<num>67</num>
-		<name>set_bullet_attributes</name>
+		<name>set_bullet_attributes_towards_player</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="anim" unit="script"/>
+			<param type="s" name="sprite_index_offset" unit="script"/>
+			<param type="S" name="bullets_per_shot" var="can"/>
 			<param type="S" name="number_of_shots"/>
 			<param type="f" name="speed" unit="pixels/frame"/>
-			<param type="f"/>
+			<param type="f" name="speed2" unit="pixels/frame">speed + (speed2 - speed) * salve / nb_salve</param>
 			<param type="f" name="launch_angle" unit="radian"/>
-			<param type="f" name="angle_between_two_bullets" unit="radian"/>
+			<param type="f" name="angle" 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>
@@ -570,7 +570,7 @@ else
 
 	<op>
 		<num>68</num>
-		<name></name>
+		<name>set_bullet_attributes_to_the_right</name>
 		<params>
 			<param type="s"/>
 			<param type="s"/>
@@ -582,12 +582,12 @@ else
 			<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>
+		<desc>The same as <ref>67</ref>, except the 0.0f launch angle is to the right of the enemy, instead of towards the player.</desc>
 	</op>
 
 	<op>
 		<num>69</num>
-		<name></name>
+		<name>set_bullet_attributes_towards_player_equally_distributed</name>
 		<params>
 			<param type="s"/>
 			<param type="s"/>
@@ -599,12 +599,12 @@ else
 			<param type="f"/>
 			<param type="S"/>
 		</params>
-		<desc>No visible difference from <ref>67</ref>.</desc>
+		<desc>Like <ref>67</ref>, except bullets of a shot are distributed equally all around the enemy, computing the angle by itself.</desc>
 	</op>
 
 	<op>
 		<num>70</num>
-		<name></name>
+		<name>set_bullet_attributes_to_the_right_equally_distributed</name>
 		<params>
 			<param type="s"/>
 			<param type="s"/>
@@ -616,12 +616,12 @@ else
 			<param type="f"/>
 			<param type="S"/>
 		</params>
-		<desc>No visible difference from <ref>68</ref>.</desc>
+		<desc>Like <ref>68</ref>, except bullets of a shot are distributed equally all around the enemy, computing the angle by itself.</desc>
 	</op>
 
 	<op>
 		<num>71</num>
-		<name></name>
+		<name>set_bullet_attributes_towards_player_equally_distributed_and_rotated</name>
 		<params>
 			<param type="s"/>
 			<param type="s"/>
@@ -629,16 +629,16 @@ else
 			<param type="S"/>
 			<param type="f"/>
 			<param type="f"/>
-			<param type="S"/>
-			<param type="S"/>
+			<param type="f" values="0.0f"/>
+			<param type="f" values="0.0f"/>
 			<param type="S"/>
 		</params>
-		<desc></desc>
+		<desc>Like <ref>69</ref>, but with a rotation of pi/bullets_per_shot.</desc>
 	</op>
 
 	<op>
 		<num>74</num>
-		<name></name>
+		<name>set_bullet_attributes_towards_player_randomly_distributed</name>
 		<params>
 			<param type="s"/>
 			<param type="s"/>
@@ -646,16 +646,16 @@ else
 			<param type="S"/>
 			<param type="f"/>
 			<param type="f"/>
-			<param type="S"/>
-			<param type="S"/>
+			<param type="f" values="0.0f"/>
+			<param type="f" values="0.0f"/>
 			<param type="S"/>
 		</params>
-		<desc>Used only one time, in <stage>3</stage>.</desc>
+		<desc>Used only one time, in <stage>3</stage>. Like <ref>70</ref> but with some alea (?) in the angle.</desc>
 	</op>
 
 	<op>
 		<num>75</num>
-		<name></name>
+		<name>set_bullet_attributes_to_the_right_with_some_random_angle</name>
 		<params>
 			<param type="s"/>
 			<param type="s"/>
@@ -667,25 +667,25 @@ else
 			<param type="f"/>
 			<param type="S"/>
 		</params>
-		<desc>Seems like <ref>68</ref>, but with some differences in speed.</desc>
+		<desc>Like <ref>68</ref>, but with some random angle.</desc>
 	</op>
 
 	<op>
 		<num>76</num>
-		<name></name>
+		<name>bullet_interval</name>
 		<params>
-			<param type="S"/>
+			<param type="S" name="interval" unit="frames" values="0 to 70"/>
 		</params>
-		<desc></desc>
+		<desc>Time between two shots, 0 is infinite.</desc>
 	</op>
 
 	<op>
 		<num>77</num>
-		<name>bullet_interval</name>
+		<name>bullet_interval_random</name>
 		<params>
-			<param type="S" name="interval" unit="frames"/>
+			<param type="S" name="interval" unit="frames" values="0 to 300"/>
 		</params>
-		<desc>Time between two shots.</desc>
+		<desc>Like <ref>76</ref>, but with a random delay of [0, interval) frames at the start.</desc>
 	</op>
 
 	<op>
@@ -697,47 +697,75 @@ else
 	<op>
 		<num>79</num>
 		<name>no_delay_attack</name>
-		<desc></desc>
+		<desc>Instantly start to attack.</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>
+			<param type="f" name="x" unit="pixels" var="can"/>
+			<param type="f" name="y" unit="pixels" var="can"/>
+			<param type="f" name="z" unit="pixels" var="can" values="0.0f">Ignored</param>
 		</params>
 		<desc>Change the offset of the launch of bullets.</desc>
 	</op>
 
 	<op>
 		<num>82</num>
-		<name></name>
+		<name>set_extended_bullet_attributes</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"/>
+			<param type="S" values="-1, 1, 2, 40 to 240"/>
+			<param type="S" values="-1, 1, 2"/>
+			<param type="S" values="-1">Unused</param>
+			<param type="S" values="-1">Unused</param>
+			<param type="f" var="can" values="-100021.0f, variables, -1.0f, -3.6651914f to 2.443461f"/>
+			<param type="f" var="can" values="variables, -999.0f, -1.0f, -0.03141593f to 4.0f"/>
+			<param type="f" values="-1.0f">Unused</param>
+			<param type="f" values="-1.0f">Unused</param>
 		</params>
-		<desc></desc>
+		<desc>Heavily linked to 67-75 last parameter, the flags:<dl>
+<dt>1:</dt>
+    <dd>TODO: changes the bullet's speed in a strange way</dd>
+
+<dt>2:</dt>
+    <dd>TODO: Whatever 2 does, it is in the same group as, and takes precedence over 4 and 8</dd>
+<dt>4:</dt>
+    <dd>TODO: Whatever 4 does, it is in the same group as, and takes precedence over 8</dd>
+<dt>8:</dt>
+    <dd>TODO</dd>
+
+<dt>16: <code><ref>82</ref>(int duration,,,, float length, float angle,,)</code></dt>
+    <dd>for `duration` frames, add (cos(angle) * length, sin(angle) * length) to the speed vector at each frame?</dd>
+<dt>32: <code><ref>82</ref>(int duration, int count,,, float acceleration, float angular_speed,,)</code></dt>
+    <dd>for `duration` frames, add acceleration to speed, and angular_speed to angle at each frame. Do that count times.</dd>
+<dt>64: <code><ref>82</ref>(int nb_frames, int count,,, float angle, float speed,,)</code></dt>
+    <dd>stop the bullet in nb_frames, then add angle to its angle, and sets its speed to speed. Do that count times.</dd>
+<dt>128: <code><ref>82</ref>(int nb_frames, int count,,, float angle, float speed,,)</code></dt>
+    <dd>stop the bullet in nb_frames, then directs the bullet towards the player, add angle to its angle, and sets its speed to speed. Do that count times.</dd>
+<dt>256: <code><ref>82</ref>(int nb_frames, int count,,, float angle, float speed,,)</code></dt>
+    <dd>stop the bullet in nb_frames, then sets the bullet's angle and speed to angle and speed. Do that count times.</dd>
+
+<dt>512:</dt>
+    <dd>TODO: doesn't seem to change anything?</dd>
+
+<dt>1024: <code><ref>82</ref>(int nb_bounces,,,, float speed,,,)</code></dt>
+    <dd>Bullets “bounce”, reentering the screen as soon as they leave it, with a new speed set.</dd>
+<dt>2048:</dt>
+    <dd>Like 1024, except it only bounces when colliding with the left and right edges.</dd></dl></desc>
 	</op>
 
 	<op>
 		<num>83</num>
-		<name></name>
-		<desc>No-op? Doesn't seem to change anything.</desc>
+		<name>change_bullets_in_star_bonus</name>
+		<desc>Isn’t called for every boss, there should be another way to do that.</desc>
 	</op>
 
 	<op>
 		<num>84</num>
 		<name></name>
 		<params>
-			<param type="S"/>
+			<param type="S" values="-1, 7, 22, 23, 25, 27"/>
 		</params>
 		<desc></desc>
 	</op>
@@ -761,7 +789,7 @@ else
 			<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>
+		<desc>Spawn a laser and set its attributes.</desc>
 	</op>
 
 	<op>
@@ -783,7 +811,7 @@ else
 			<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>
+		<desc>Like <ref>85</ref>, with the default direction towards the player.</desc>
 	</op>
 
 	<op>
@@ -810,27 +838,27 @@ else
 		<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"/>
+			<param type="S" values="0">Perhaps a float?</param>
+			<param type="S" values="0">Perhaps a float?</param>
+			<param type="S" values="0">Perhaps a float?</param>
 		</params>
-		<desc>Used only one time, in <stage>7</stage>.</desc>
+		<desc>Used only in <stage>7</stage>.</desc>
 	</op>
 
 	<op>
 		<num>92</num>
 		<name></name>
 		<params>
-			<param type="S"/>
+			<param type="S" values="0 to 3"/>
 		</params>
-		<desc></desc>
+		<desc>Used only in <stage>7</stage>.</desc>
 	</op>
 
 	<op>
 		<num>93</num>
 		<name>set_spellcard</name>
 		<params>
-			<param type="s"/>
+			<param type="s" value="0 to 3"/>
 			<param type="s" name="number">As in the captured spellcards screen, minus 1.</param>
 			<param type="z" name="name">In SHIFT_JIS</param>
 		</params>
@@ -839,36 +867,37 @@ else
 
 	<op>
 		<num>94</num>
-		<name></name>
-		<desc></desc>
+		<name>end_spellcard</name>
+		<desc>Finish the current spellcard.</desc>
 	</op>
 
 	<op>
 		<num>95</num>
-		<name></name>
+		<name>spawn_enemy</name>
 		<params>
-			<param type="S"/>
-			<param type="f"/>
-			<param type="f"/>
-			<param type="f"/>
-			<param type="s"/>
-			<param type="s"/>
-			<param type="S"/>
+			<param type="S" name="function" unit="sub" values="1, 20 to 66"/>
+			<param type="f" name="x" unit="pixels" var="can" values="-10015.0f, -10005.0f, -32.0f to 416.0f"/>
+			<param type="f" name="y" unit="pixels" var="can" values="-10016.0f, -32.0f to 464.0f"/>
+			<param type="f" name="z" unit="pixels" var="can" values="-10017.0f, -1.5707964f to 3.3379421f, 160.0f, 288.0f"/>
+			<param type="s" name="resistance" values="-5536, 2 to 2000"/>
+			<param type="s" name="drop_type" values="-2, 0, 1, 2"/>
+			<param type="s" name="unknown1" values="0, 10, 2000"/>
+			<param type="s" name="unknown2" values="0"/>
 		</params>
-		<desc></desc>
+		<desc>Spawns an enemy, see <a href="ecl.xhtml#enemy_sub">the main creation of an enemy</a>.</desc>
 	</op>
 
 	<op>
 		<num>96</num>
-		<name></name>
-		<desc></desc>
+		<name>kill_all_enemies</name>
+		<desc>Instantly kill all enemies presents in the screen, dropping their bonus as if they were killed by the player. Seems to not kill if the enemy is not touchable (see <ref>117</ref>).</desc>
 	</op>
 
 	<op>
 		<num>97</num>
 		<name>set_enemy_anim</name>
 		<params>
-			<param type="S" name="anim" unit="script"/>
+			<param type="S" name="anim" unit="script" var="no"/>
 		</params>
 		<desc>Set a sprite (taken from current anm) for the enemy.</desc>
 	</op>
@@ -877,11 +906,12 @@ else
 		<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>
+			<param type="s" name="default" unit="script" var="no"/>
+			<param type="s" name="far_left" unit="script" var="no"/>
+			<param type="s" name="far_right" unit="script" var="no"/>
+			<param type="s" name="left" unit="script" var="no"/>
+			<param type="s" name="right" unit="script" var="no"/>
+			<param type="s" name="padding"/>
 		</params>
 		<desc>Give a set of animations for a boss deplacements.</desc>
 	</op>
@@ -890,8 +920,8 @@ else
 		<num>99</num>
 		<name></name>
 		<params>
-			<param type="S"/>
-			<param type="S"/>
+			<param type="S" values="0, 4"/>
+			<param type="S" values="16 to 18, 66"/>
 		</params>
 		<desc></desc>
 	</op>
@@ -900,7 +930,7 @@ else
 		<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>
+			<param type="S" name="anim" unit="script" var="no" 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>
@@ -916,15 +946,15 @@ else
 
 	<op>
 		<num>102</num>
-		<name></name>
+		<name>create_squares</name>
 		<params>
-			<param type="S"/>
-			<param type="f"/>
-			<param type="f"/>
-			<param type="f"/>
+			<param type="S" values="0 to 11, 16, 22, 25"/>
+			<param type="f" name="x_rotate" values="-1.0f to 1.1f"/>
+			<param type="f" name="y_rotate" values="-1.0f to -0.1f"/>
+			<param type="f" name="z_rotate" values="-0.3f, -0.5f"/>
 			<param type="f" values="48.0f"/>
 		</params>
-		<desc>Create the "squares" running around Rumia ???</desc>
+		<desc>Create the squares turning around some boss. They stay even after the destruction of the enemy.</desc>
 	</op>
 
 	<op>
@@ -940,18 +970,18 @@ else
 
 	<op>
 		<num>104</num>
-		<name></name>
+		<name>set_collidable</name>
 		<params>
-			<param type="S" values="0, 1"/>
+			<param type="S" name="x" values="0, 1">Bitfield</param>
 		</params>
-		<desc>noop?</desc>
+		<desc>if x &amp; 1, the enemy can collide with the player, else it cannot.</desc>
 	</op>
 
 	<op>
 		<num>105</num>
-		<name>set_vulnerable</name>
+		<name>set_damageable</name>
 		<params>
-			<param type="S" name="x" values="0, 1"/>
+			<param type="S" name="x" values="0, 1">Bitfield</param>
 		</params>
 		<desc>if x &amp; 1, the enemy can take damage, else it cannot.</desc>
 	</op>
@@ -960,7 +990,11 @@ else
 		<num>106</num>
 		<name>play_sound</name>
 		<params>
-			<param type="S"/>
+			<param type="S" values="5 to 9, 14, 16 to 18, 22, 24 to 27">
+				0 = crash,
+				1 = crash,
+				/11
+			</param>
 		</params>
 		<desc>Play a sound.</desc>
 	</op>
@@ -985,12 +1019,20 @@ else
 
 	<op>
 		<num>109</num>
-		<name></name>
+		<name>memory_write_int32</name>
 		<params>
-			<param type="S"/>
-			<param type="S" values="0"/>
+			<param type="S" name="value"/>
+			<param type="S" name="offset" values="0"/>
 		</params>
-		<desc></desc>
+		<desc>
+			<pre>int32_t memory *= enemy->data;
+memory[offset] = value;</pre>
+			<p>Eight variables (indexes 0 to 7) seems to be available, the following data is enemy state, with:<br/>
+			9: x, 10: y, 11: z, 12: hitbox width, 13: hitbox height, 14: hitbox depth, ...<br/>
+			TODO: see 0x00409532</p>
+
+			<p>This is used to set a sub to call once the MSG has finished.</p>
+		</desc>
 	</op>
 
 	<op>
@@ -999,16 +1041,16 @@ else
 		<params>
 			<param type="S" name="life"/>
 		</params>
-		<desc>equivalent to <ref>4</ref>(-10024, life).</desc>
+		<desc>Equivalent to <ref>4</ref>(-10024, life).</desc>
 	</op>
 
 	<op>
 		<num>112</num>
-		<name></name>
+		<name>set_elapsed_time</name>
 		<params>
-			<param type="S" values="0, 99999"/>
+			<param type="S" name="time" unit="frames" values="0, 99999"/>
 		</params>
-		<desc></desc>
+		<desc>Equivalent to <ref>4</ref>(-10022, time).</desc>
 	</op>
 
 	<op>
@@ -1022,7 +1064,7 @@ else
 
 	<op>
 		<num>114</num>
-		<name>set_boss_callback</name>
+		<name>set_boss_life_callback</name>
 		<params>
 			<param type="S" name="callback" unit="sub" values="9-68"/>
 		</params>
@@ -1035,37 +1077,36 @@ else
 		<params>
 			<param type="S" name="timeout" unit="frame"/>
 		</params>
-		<desc>Sets the timeout of the current boss attack.</desc>
+		<desc>Set the timeout of the current boss attack.</desc>
 	</op>
 
 	<op>
 		<num>116</num>
-		<name></name>
+		<name>set_timeout_callback</name>
 		<params>
-			<param type="S"/>
+			<param type="S" name="function" unit="sub" values="6 to 68"/>
 		</params>
-		<desc>Doesn't seem to do anything. Tried to remove it, use 0, 1, 127, 1023, 1024, 4096 as an argument, nothing... ???</desc>
+		<desc>Like <ref>114</ref>, but when timeouted.</desc>
 	</op>
 
 	<op>
 		<num>117</num>
-		<name></name>
+		<name>set_touchable</name>
 		<params>
-			<param type="S"/>
+			<param type="S" name="x" values="0, 1">Bitfield</param>
 		</params>
-		<desc></desc>
+		<desc>If 0, the player's attacks don't do anything to the enemy. RumiaA's homing attack is no more attracted by that enemy. <ref>96</ref> won’t kill it. 1 restores the usual comportment.</desc>
 	</op>
 
 	<op>
 		<num>118</num>
-		<name></name>
+		<name>quot_explosion_quot</name> <!-- TODO: find a better name. -->
 		<params>
-			<param type="S"/>
-			<param type="S"/>
-			<param type="s"/>
-			<param type="s"/>
+			<param type="S" values="3, 4, 12, 17, 18"/>
+			<param type="S" values="1, 2, 6"/>
+			<param type="S" values="1, 0xffffffff, 0xffffff80, 0xffff8080, 0xff80ff80, 0xff8080ff"/>
 		</params>
-		<desc>TODO: "explosion" (dying boss).</desc>
+		<desc>"Explosion" (dying boss), Meiling’s moves, and various graphical effects like that.</desc>
 	</op>
 
 	<op>
@@ -1074,53 +1115,81 @@ else
 		<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>
+		<desc>Drop a certain number of bonus at the frame it is called, in a square around the enemy (TODO: check its dimensions). If the power is not max, drop power items, else drop point items.</desc>
 	</op>
 
 	<op>
 		<num>120</num>
-		<name></name>
+		<name>set_automatic_rotate</name>
 		<params>
-			<param type="S"/>
+			<param type="S" name="x" values="0, 1">Bitfield</param>
 		</params>
-		<desc></desc>
+		<desc>if x &amp; 1, rotate the sprite according to the angle of the enemy.</desc>
 	</op>
 
 	<op>
 		<num>121</num>
-		<name></name>
+		<name>call_special_function_with_param</name>
 		<params>
-			<param type="S"/>
-			<param type="S"/>
+			<param type="S" name="function" values="0, 1, 3, 4, 7 to 9, 11 to 14, 16"/>
+			<param type="S" name="param" values="0 to 3, 5, 6, 128"/>
 		</params>
-		<desc></desc>
+		<desc>
+			<p>Call an hardcoded function in this list:</p>
+			<table>
+				<tr><th>Function</th><th>Description</th></tr>
+				<tr><td>0</td><td>Freeze all the bullets in the screen if the parameter is 0, else unfreeze them. Do an explosion animation too.</td></tr>
+				<tr><td>1</td><td>Launch a bullet immediately, with a launch_offset of [-param, param] for each coordinate.</td></tr>
+				<tr><td>3</td><td>Do nothing?</td></tr>
+				<tr><td>4</td><td>If 0, unfreeze time and do an explosion animation. If 1, freeze time for the player, the bullets, the texts, but let the ECL run normally, also do an explosion animation. Else do nothing.</td></tr>
+				<tr><td>7</td><td>If 0, make a lasers web, and remove any previous. Else, a crapload of bullets directed towards the player (TODO: find their origin).</td></tr>
+				<tr><td>8</td><td>Do nothing?</td></tr>
+				<tr><td>9</td><td>Do an explosion animation.</td></tr>
+				<tr><td>11</td><td>Do an explosion animation.</td></tr>
+				<tr><td>12</td><td>Do nothing?</td></tr>
+				<tr><td>13</td><td>Launch `param` bullets in circle towards the player with the launch point being the center of the screen.</td></tr>
+				<tr><td>14</td><td>Do nothing?</td></tr>
+				<tr><td>16</td><td>Do nothing?</td></tr>
+			</table>
+		</desc>
 	</op>
 
 	<op>
 		<num>122</num>
-		<name></name>
+		<name>call_special_function_without_param</name>
 		<params>
-			<param type="S"/>
+			<param type="S" name="function"/>
 		</params>
-		<desc></desc>
+		<desc>
+			<p>Call an hardcoded function in this list:</p>
+			<table>
+				<tr><th>Function</th><th>Description</th></tr>
+				<tr><td>-1</td><td>Stop</td></tr>
+				<tr><td>2</td><td>Do nothing?</td></tr>
+				<tr><td>5</td><td>Sakuya’s knives, each 12 frames.</td></tr>
+				<tr><td>6</td><td>Some graphic animation.</td></tr>
+				<tr><td>10</td><td>Some graphic animation.</td></tr>
+				<tr><td>15</td><td>Some graphic animation.</td></tr>
+			</table>
+		</desc>
 	</op>
 
 	<op>
 		<num>123</num>
-		<name></name>
+		<name>skip_frames</name>
 		<params>
-			<param type="S"/>
+			<param type="S" name="number" unit="frames" var="can"/>
 		</params>
-		<desc></desc>
+		<desc>Skip a certain amount of frames, while keeping the current instruction pointer in place.</desc>
 	</op>
 
 	<op>
 		<num>124</num>
-		<name></name>
+		<name>drop_specific_bonus</name>
 		<params>
-			<param type="S"/>
+			<param type="S" name="type">0 = power, 1 = point, 2 = big power, 3 = bomb, 4 = full power, 5 = 1up, 6 = star bonus, greater drop nothing.</param>
 		</params>
-		<desc></desc>
+		<desc>Drop a bonus vertically. Can be called multiple times to drop more items, but they'll be superposed.</desc>
 	</op>
 
 	<op>
@@ -1142,26 +1211,26 @@ else
 		<num>127</num>
 		<name></name>
 		<params>
-			<param type="S"/>
+			<param type="S" var="can/must" values="integer variables"/>
 		</params>
 		<desc></desc>
 	</op>
 
 	<op>
 		<num>128</num>
-		<name></name>
+		<name>set_smooth_disappear</name>
 		<params>
-			<param type="S"/>
+			<param type="S" values="1">Bitfield</param>
 		</params>
-		<desc></desc>
+		<desc>If <code>x &amp; 1</code>, make the enemy sprite diseappear in a fade out now, not abruptly at <ref>1</ref>. TODO: check the duration.</desc>
 	</op>
 
 	<op>
 		<num>129</num>
 		<name></name>
 		<params>
-			<param type="S"/>
-			<param type="S"/>
+			<param type="S" values="0">Bitfield?</param>
+			<param type="S" values="1">Bitfield?</param>
 		</params>
 		<desc></desc>
 	</op>
@@ -1170,7 +1239,7 @@ else
 		<num>130</num>
 		<name></name>
 		<params>
-			<param type="S"/>
+			<param type="S" values="1">Bitfield?</param>
 		</params>
 		<desc></desc>
 	</op>
@@ -1179,42 +1248,42 @@ else
 		<num>131</num>
 		<name></name>
 		<params>
-			<param type="f"/>
-			<param type="f"/>
-			<param type="S"/>
-			<param type="S"/>
-			<param type="S"/>
-			<param type="S"/>
+			<param type="f" values="-1.0f, -0.5f, -0.3f, 0.0f"/>
+			<param type="f" values="0.0f, 0.3f, 0.8f, 1.0f"/>
+			<param type="S" values="-3, -2, -1, 0"/>
+			<param type="S" values="0, 2, 4, 5, 6"/>
+			<param type="S" values="0"/>
+			<param type="S" values="0"/>
 		</params>
 		<desc></desc>
 	</op>
 
 	<op>
 		<num>132</num>
-		<name></name>
+		<name>set_visible</name>
 		<params>
-			<param type="S"/>
+			<param type="S" values="0, 1">Bitfield</param>
 		</params>
-		<desc></desc>
+		<desc>If <code>x &amp; 1</code>, disable drawing of the sprite <strong>and</strong> destroy it. While it isn’t set to 0, loading a new sprite won’t make it reappear.</desc>
 	</op>
 
 	<op>
 		<num>133</num>
 		<name></name>
-		<desc></desc>
+		<desc>Do not influence on the game itself. TODO: what is its utility?</desc>
 	</op>
 
 	<op>
 		<num>134</num>
 		<name></name>
-		<desc></desc>
+		<desc>Do not influence on the game itself. TODO: what is its utility?</desc>
 	</op>
 
 	<op>
 		<num>135</num>
 		<name></name>
 		<params>
-			<param type="S"/>
+			<param type="S" values="0, 1">Bitfield</param>
 		</params>
 		<desc></desc>
 	</op>
--- a/html.xsl
+++ b/html.xsl
@@ -98,7 +98,7 @@
 
 	<x:template match="o:desc">
 		<x:choose>
-			<x:when test="o:p">
+			<x:when test="count(*) &gt; 1">
 				<x:apply-templates/>
 			</x:when>
 			<x:otherwise>
@@ -113,21 +113,25 @@
 		</x:copy>
 	</x:template>
 
-	<x:template match="o:p">
-		<p><x:apply-templates/></p>
-	</x:template>
+	<x:template match="o:p"><p><x:apply-templates/></p></x:template>
+	<x:template match="o:pre"><pre><x:apply-templates/></pre></x:template>
+	<x:template match="o:br"><br/></x:template>
 
-	<x:template match="o:br">
-		<br/>
-	</x:template>
+	<x:template match="o:dl"><dl><x:apply-templates/></dl></x:template>
+	<x:template match="o:dt"><dt><x:apply-templates/></dt></x:template>
+	<x:template match="o:dd"><dd><x:apply-templates/></dd></x:template>
 
-	<x:template match="o:ol">
-		<ol><x:apply-templates/></ol>
-	</x:template>
+	<x:template match="o:table"><table><x:apply-templates/></table></x:template>
+	<x:template match="o:tr"><tr><x:apply-templates/></tr></x:template>
+	<x:template match="o:th"><th><x:apply-templates/></th></x:template>
+	<x:template match="o:td"><td><x:apply-templates/></td></x:template>
 
-	<x:template match="o:li">
-		<li><x:apply-templates/></li>
-	</x:template>
+	<x:template match="o:ol"><ol><x:apply-templates/></ol></x:template>
+	<x:template match="o:li"><li><x:apply-templates/></li></x:template>
+
+	<x:template match="o:a"><a href="{@href}"><x:apply-templates/></a></x:template>
+	<x:template match="o:code"><code><x:apply-templates/></code></x:template>
+	<x:template match="o:sup"><sup><x:apply-templates/></sup></x:template>
 
 	<x:template match="o:stage">
 		<x:text>stage </x:text><x:value-of select="."/>