… | |
… | |
101 | sub enc_U64 { |
101 | sub enc_U64 { |
102 | enc_U32 $_[0] & 0xffffffff; |
102 | enc_U32 $_[0] & 0xffffffff; |
103 | enc_U32 +($_[0] >> 32) & 0xffffffff; |
103 | enc_U32 +($_[0] >> 32) & 0xffffffff; |
104 | } |
104 | } |
105 | |
105 | |
|
|
106 | sub enc_I8 { |
|
|
107 | $data .= pack "c", $_[0]; |
|
|
108 | } |
|
|
109 | |
|
|
110 | sub enc_I16 { |
|
|
111 | enc_U16 unpack "S", pack "s", $_[0]; |
|
|
112 | } |
|
|
113 | |
106 | sub enc_I32 { |
114 | sub enc_I32 { |
107 | enc_U32 unpack "I", pack "i", $_[0]; |
115 | enc_U32 unpack "I", pack "i", $_[0]; |
108 | } |
116 | } |
109 | |
117 | |
110 | sub enc_DATA { |
118 | sub enc_DATA { |
… | |
… | |
114 | |
122 | |
115 | sub enc_STRING { |
123 | sub enc_STRING { |
116 | # should use encode for speed and clarity ;) |
124 | # should use encode for speed and clarity ;) |
117 | $data .= pack "v*", map ord, split //, $_[0]; |
125 | $data .= pack "v*", map ord, split //, $_[0]; |
118 | } |
126 | } |
|
|
127 | |
|
|
128 | sub enc_password { |
|
|
129 | require Math::BigInt; # I insist on 32-bit-perl.. should use C |
|
|
130 | # $hash must be 64 bit |
|
|
131 | my $hash = new Math::BigInt; |
|
|
132 | $hash = $hash * 1055 + ord for split //, $_[0]; |
|
|
133 | enc_U64 $hash; |
|
|
134 | } |
|
|
135 | |
119 | ]]> |
136 | ]]> |
120 | |
137 | |
121 | ############################################################################# |
138 | ############################################################################# |
122 | # types |
139 | # types |
123 | <xsl:apply-templates select="descendant::type"/> |
140 | <xsl:apply-templates select="descendant::type"/> |
… | |
… | |
187 | |
204 | |
188 | } elsif ($type == 17 || $type == 18) { |
205 | } elsif ($type == 17 || $type == 18) { |
189 | push @r, [score => $type - 17, dec_score16]; |
206 | push @r, [score => $type - 17, dec_score16]; |
190 | |
207 | |
191 | } elsif ($type == 19) { |
208 | } elsif ($type == 19) { |
192 | push @r, [result => dec_result]; |
209 | push @r, [result => dec_result]; # not certain |
193 | |
210 | |
194 | } elsif ($type == 30) { |
211 | } elsif ($type == 30) { |
195 | push @r, [active_player => dec_U8]; |
212 | push @r, [active_player => dec_U8]; |
196 | |
213 | |
197 | } elsif ($type == 0) { # label(?) |
214 | } elsif ($type == 0) { # label(?) |
… | |
… | |
325 | |
342 | |
326 | <xsl:template match="member" mode="enc"> |
343 | <xsl:template match="member" mode="enc"> |
327 | <!-- #d#, remove when kgs is repaired --><xsl:if test="@type = 'username'"> |
344 | <!-- #d#, remove when kgs is repaired --><xsl:if test="@type = 'username'"> |
328 | $_[0]{<xsl:value-of select="@name"/>} =~ /^[A-Za-z][A-Za-z0-9]{0,11}$/ |
345 | $_[0]{<xsl:value-of select="@name"/>} =~ /^[A-Za-z][A-Za-z0-9]{0,11}$/ |
329 | or Carp::confess "FATAL: tried to send illegal username '$_[0]{<xsl:value-of select="@name"/>}'"; |
346 | or Carp::confess "FATAL: tried to send illegal username '$_[0]{<xsl:value-of select="@name"/>}'"; |
330 | </xsl:if><!--#d#--> |
|
|
331 | <!-- #d#, remove when kgs is repaired --><xsl:if test="@name = 'channel'"> |
|
|
332 | $_[0]{<xsl:value-of select="@name"/>} > 0 |
|
|
333 | or Carp::confess "FATAL: tried to send a zero channel id"; |
|
|
334 | </xsl:if><!--#d#--> |
347 | </xsl:if><!--#d#--> |
335 | enc_<xsl:value-of select="@type"/> defined $_[0]{<xsl:value-of select="@name"/>} ? $_[0]{<xsl:value-of select="@name"/> |
348 | enc_<xsl:value-of select="@type"/> defined $_[0]{<xsl:value-of select="@name"/>} ? $_[0]{<xsl:value-of select="@name"/> |
336 | <xsl:text>} : (</xsl:text> |
349 | <xsl:text>} : (</xsl:text> |
337 | <xsl:value-of select="@default"/> |
350 | <xsl:value-of select="@default"/> |
338 | <xsl:text>);</xsl:text> |
351 | <xsl:text>);</xsl:text> |