<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://wiki.darwinbots.com/index.php?action=history&amp;feed=atom&amp;title=Talk%3ASenses</id>
		<title>Talk:Senses - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.darwinbots.com/index.php?action=history&amp;feed=atom&amp;title=Talk%3ASenses"/>
		<link rel="alternate" type="text/html" href="http://wiki.darwinbots.com/index.php?title=Talk:Senses&amp;action=history"/>
		<updated>2026-05-01T18:29:33Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.29.0</generator>

	<entry>
		<id>http://wiki.darwinbots.com/index.php?title=Talk:Senses&amp;diff=3564&amp;oldid=prev</id>
		<title>Griz at 15:45, 28 October 2005</title>
		<link rel="alternate" type="text/html" href="http://wiki.darwinbots.com/index.php?title=Talk:Senses&amp;diff=3564&amp;oldid=prev"/>
				<updated>2005-10-28T15:45:30Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;' lang='en'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 15:45, 28 October 2005&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot; &gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Original code for 2.37.4 prior to our Debugging attempts. Just in case. ;)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;ask, discuss, here:&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;----&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;----&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Backup of &lt;/ins&gt;Original code for 2.37.4 prior to our Debugging attempts. Just in case. ;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key DarwinbotsWiki-DBWK_:diff:version:1.11a:oldid:706:newid:3564 --&gt;
&lt;/table&gt;</summary>
		<author><name>Griz</name></author>	</entry>

	<entry>
		<id>http://wiki.darwinbots.com/index.php?title=Talk:Senses&amp;diff=706&amp;oldid=prev</id>
		<title>Griz at 11:13, 27 October 2005</title>
		<link rel="alternate" type="text/html" href="http://wiki.darwinbots.com/index.php?title=Talk:Senses&amp;diff=706&amp;oldid=prev"/>
				<updated>2005-10-27T11:13:17Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Original code for 2.37.4 prior to our Debugging attempts. Just in case. ;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Attribute VB_Name = &amp;quot;Senses&amp;quot;&lt;br /&gt;
'&lt;br /&gt;
'     S E N S E S&lt;br /&gt;
'&lt;br /&gt;
&lt;br /&gt;
'This module is the most processor intensive.&lt;br /&gt;
&lt;br /&gt;
Option Explicit&lt;br /&gt;
&lt;br /&gt;
Dim Perfsquares(5000) As Long&lt;br /&gt;
&lt;br /&gt;
'Dim Perfsquares(2048) As Long 'for a faster square root function, we store the first 2048 perfect squares&lt;br /&gt;
&lt;br /&gt;
' Sets .sun to 1 if robot.aim is within 0.18 radians of 1.57 (Basically up)&lt;br /&gt;
' new version with less clutter.&lt;br /&gt;
Public Sub LandMark(ByVal iRobID As Integer)&lt;br /&gt;
&lt;br /&gt;
rob(iRobID).mem(LandM) = 0&lt;br /&gt;
If rob(iRobID).aim &amp;gt; 1.39 And rob(iRobID).aim &amp;lt; 1.75 Then rob(iRobID).mem(LandM) = 1&lt;br /&gt;
&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
' touch: tells a robot whether it has been hit by another one&lt;br /&gt;
' and where: up, dn dx, sx&lt;br /&gt;
Public Sub touch(a As Integer, x As Single, y As Single)&lt;br /&gt;
  Dim xc As Single&lt;br /&gt;
  Dim yc As Single&lt;br /&gt;
  Dim dx As Single&lt;br /&gt;
  Dim dy As Single&lt;br /&gt;
  Dim tn As Single&lt;br /&gt;
  Dim ang As Single&lt;br /&gt;
  Dim aim As Single&lt;br /&gt;
  Dim dang As Single&lt;br /&gt;
  aim = 6.28 - rob(a).aim&lt;br /&gt;
  xc = rob(a).x + Half&lt;br /&gt;
  yc = rob(a).y + Half&lt;br /&gt;
  dx = x - xc&lt;br /&gt;
  dy = y - yc&lt;br /&gt;
  If dx &amp;lt;&amp;gt; 0 Then&lt;br /&gt;
    tn = dy / dx&lt;br /&gt;
    ang = Atn(tn)&lt;br /&gt;
    If dx &amp;lt; 0 Then ang = ang - 3.14&lt;br /&gt;
  Else&lt;br /&gt;
    ang = 1.57 * Sgn(dy)&lt;br /&gt;
  End If&lt;br /&gt;
  dang = ang - aim&lt;br /&gt;
  While dang &amp;lt; 0&lt;br /&gt;
    dang = dang + 6.28&lt;br /&gt;
  Wend&lt;br /&gt;
  While dang &amp;gt; 6.28&lt;br /&gt;
    dang = dang - 6.28&lt;br /&gt;
  Wend&lt;br /&gt;
  If dang &amp;gt; 5.49 Or dang &amp;lt; 0.78 Then rob(a).mem(hitup) = 1&lt;br /&gt;
  If dang &amp;gt; 2.36 And dang &amp;lt; 3.92 Then rob(a).mem(hitdn) = 1&lt;br /&gt;
  If dang &amp;gt; 0.78 And dang &amp;lt; 2.36 Then rob(a).mem(hitdx) = 1&lt;br /&gt;
  If dang &amp;gt; 3.92 And dang &amp;lt; 5.49 Then rob(a).mem(hitsx) = 1&lt;br /&gt;
  rob(a).mem(hit) = 1&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
' taste: same as for touch, but for shots, and gives back&lt;br /&gt;
' also the flavour of the shot, that is, its shottype&lt;br /&gt;
' value&lt;br /&gt;
Public Sub taste(a As Integer, x As Long, y As Long, value As Integer)&lt;br /&gt;
  Dim xc As Single&lt;br /&gt;
  Dim yc As Single&lt;br /&gt;
  Dim dx As Single&lt;br /&gt;
  Dim dy As Single&lt;br /&gt;
  Dim tn As Single&lt;br /&gt;
  Dim ang As Single&lt;br /&gt;
  Dim aim As Single&lt;br /&gt;
  Dim dang As Single&lt;br /&gt;
  aim = 6.28 - rob(a).aim&lt;br /&gt;
  xc = rob(a).x + Half&lt;br /&gt;
  yc = rob(a).y + Half&lt;br /&gt;
  dx = x - xc&lt;br /&gt;
  dy = y - yc&lt;br /&gt;
  If dx &amp;lt;&amp;gt; 0 Then&lt;br /&gt;
    tn = dy / dx&lt;br /&gt;
    ang = Atn(tn)&lt;br /&gt;
    If dx &amp;lt; 0 Then ang = ang - 3.14&lt;br /&gt;
  Else&lt;br /&gt;
    ang = 1.57 * Sgn(dy)&lt;br /&gt;
  End If&lt;br /&gt;
  dang = ang - aim&lt;br /&gt;
  While dang &amp;lt; 0&lt;br /&gt;
    dang = dang + 6.28&lt;br /&gt;
  Wend&lt;br /&gt;
  While dang &amp;gt; 6.28&lt;br /&gt;
    dang = dang - 6.28&lt;br /&gt;
  Wend&lt;br /&gt;
  If dang &amp;gt; 5.49 Or dang &amp;lt; 0.78 Then rob(a).mem(shup) = value&lt;br /&gt;
  If dang &amp;gt; 2.36 And dang &amp;lt; 3.92 Then rob(a).mem(shdn) = value&lt;br /&gt;
  If dang &amp;gt; 0.78 And dang &amp;lt; 2.36 Then rob(a).mem(shdx) = value&lt;br /&gt;
  If dang &amp;gt; 3.92 And dang &amp;lt; 5.49 Then rob(a).mem(shsx) = value&lt;br /&gt;
  rob(a).mem(209) = dang * 200  'sysvar = .shang just returns the angle of the shot without the flavor&lt;br /&gt;
  rob(a).mem(shflav) = value    'sysvar = .shflav returns the flavor without the angle&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
' erases some senses&lt;br /&gt;
Public Sub erasesenses(n As Integer)&lt;br /&gt;
  Dim l As Integer&lt;br /&gt;
  With rob(n)&lt;br /&gt;
    .mem(hitup) = 0&lt;br /&gt;
    .mem(hitdn) = 0&lt;br /&gt;
    .mem(hitdx) = 0&lt;br /&gt;
    .mem(hitsx) = 0&lt;br /&gt;
    .mem(shup) = 0&lt;br /&gt;
    .mem(shdn) = 0&lt;br /&gt;
    .mem(shdx) = 0&lt;br /&gt;
    .mem(shsx) = 0&lt;br /&gt;
    .mem(214) = 0   'edge collision detection&lt;br /&gt;
    For l = 1 To 10 ' resets *trefvars&lt;br /&gt;
      .mem(455 + l) = 0&lt;br /&gt;
    Next l&lt;br /&gt;
    For l = 0 To 10     'resets&lt;br /&gt;
        .mem(trefxpos + l) = 0&lt;br /&gt;
    Next l&lt;br /&gt;
    .mem(472) = 0&lt;br /&gt;
  End With&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
' writes some senses: view, .ref* vars, absvel&lt;br /&gt;
' pain, pleas, nrg&lt;br /&gt;
Public Sub WriteSenses(nd As node)&lt;br /&gt;
  Dim n As Integer&lt;br /&gt;
  Dim t As Integer&lt;br /&gt;
  n = nd.robn&lt;br /&gt;
  LandMark n&lt;br /&gt;
  With rob(n)&lt;br /&gt;
    If .view Then proximity nd, RobSize * 12&lt;br /&gt;
    If .lastopp &amp;gt; 0 Then&lt;br /&gt;
      lookoccurr n, .lastopp&lt;br /&gt;
    End If&lt;br /&gt;
    &lt;br /&gt;
    If Abs(.vx) &amp;gt; 100 Then .vx = 100 * Sgn(.vx) '2 new lines added to stop weird crashes&lt;br /&gt;
    If Abs(.vy) &amp;gt; 100 Then .vy = 100 * Sgn(.vy)&lt;br /&gt;
    &lt;br /&gt;
    If Abs(.nrg) &amp;gt; 32000 Then .nrg = 32000 * Sgn(.nrg)&lt;br /&gt;
    If .onrg &amp;lt; 0 Then .onrg = 0&lt;br /&gt;
    If .obody &amp;lt; 0 Then .obody = 0&lt;br /&gt;
    .mem(pain) = .onrg - .nrg&lt;br /&gt;
    .mem(pleas) = .nrg - .onrg&lt;br /&gt;
    .mem(bodloss) = .obody - .body&lt;br /&gt;
    .mem(bodgain) = .body - .obody&lt;br /&gt;
    .onrg = .nrg&lt;br /&gt;
    .obody = .body&lt;br /&gt;
    .mem(energy) = .nrg&lt;br /&gt;
    If .age = 0 And .mem(body) = 0 Then .mem(body) = .body 'to stop an odd bug in birth.  Don't ask&lt;br /&gt;
    If .Fixed Then .mem(215) = 1 Else .mem(215) = 0&lt;br /&gt;
    If .y &amp;lt;= 32000 Then .mem(217) = .y&lt;br /&gt;
    If .x &amp;lt;= 32000 Then .mem(219) = .x&lt;br /&gt;
    If OptionsForm.Daytime Then .mem(218) = 1 Else .mem(218) = 0&lt;br /&gt;
  End With&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
Private Sub Checkleft(field As Long, n As Integer, realfield As Long)&lt;br /&gt;
  Dim counter As Integer&lt;br /&gt;
  Dim robnumber As Integer&lt;br /&gt;
  Dim dx As Long&lt;br /&gt;
  Dim dy As Long&lt;br /&gt;
  Dim dissquared As Long&lt;br /&gt;
  Dim x As Long&lt;br /&gt;
  Dim y As Long&lt;br /&gt;
  Dim dis As Long&lt;br /&gt;
  &lt;br /&gt;
  With rob(n)&lt;br /&gt;
  x = rob(n).x&lt;br /&gt;
  y = rob(n).y&lt;br /&gt;
  End With&lt;br /&gt;
  &lt;br /&gt;
  dissquared = realfield * realfield&lt;br /&gt;
  &lt;br /&gt;
  'check out all the robots to the left&lt;br /&gt;
  counter = rob(n).order - 1&lt;br /&gt;
  &lt;br /&gt;
  If counter &amp;lt;&amp;gt; -1 Then&lt;br /&gt;
    robnumber = Roborder(counter)&lt;br /&gt;
    If robnumber &amp;lt;&amp;gt; -1 Then&lt;br /&gt;
      dx = x - rob(robnumber).x&lt;br /&gt;
    Else&lt;br /&gt;
      dx = field + 1&lt;br /&gt;
    End If&lt;br /&gt;
  Else&lt;br /&gt;
    Exit Sub&lt;br /&gt;
  End If&lt;br /&gt;
  &lt;br /&gt;
  If dx &amp;lt; 0 Then dx = -dx&lt;br /&gt;
  &lt;br /&gt;
  While dx &amp;lt; field&lt;br /&gt;
    dy = y - rob(robnumber).y&lt;br /&gt;
    If dy &amp;lt; 0 Then dy = -dy&lt;br /&gt;
    If dy &amp;lt; realfield Then&lt;br /&gt;
      dis = dy * dy + dx * dx&lt;br /&gt;
      If dis &amp;lt; dissquared Then target n, robnumber, dis&lt;br /&gt;
    End If&lt;br /&gt;
    &lt;br /&gt;
    counter = counter - 1&lt;br /&gt;
    If counter = -1 Then Exit Sub&lt;br /&gt;
    robnumber = Roborder(counter)&lt;br /&gt;
    &lt;br /&gt;
    dx = x - rob(robnumber).x&lt;br /&gt;
    If dx &amp;lt; 0 Then dx = -dx&lt;br /&gt;
  Wend&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
Private Sub Checkright(field As Long, n As Integer, realfield As Long)&lt;br /&gt;
  Dim counter As Integer&lt;br /&gt;
  Dim robnumber As Integer&lt;br /&gt;
  Dim dx As Long&lt;br /&gt;
  Dim dy As Long&lt;br /&gt;
  Dim dissquared As Long&lt;br /&gt;
  &lt;br /&gt;
  Dim x As Long&lt;br /&gt;
  Dim y As Long&lt;br /&gt;
  Dim dis As Long&lt;br /&gt;
  &lt;br /&gt;
  With rob(n)&lt;br /&gt;
  x = rob(n).x&lt;br /&gt;
  y = rob(n).y&lt;br /&gt;
  End With&lt;br /&gt;
  &lt;br /&gt;
  dissquared = realfield * realfield&lt;br /&gt;
  'check out all the robots to the right&lt;br /&gt;
  &lt;br /&gt;
  counter = rob(n).order + 1&lt;br /&gt;
  robnumber = Roborder(counter)&lt;br /&gt;
  If robnumber &amp;lt;&amp;gt; -1 Then&lt;br /&gt;
    dx = rob(robnumber).x - x&lt;br /&gt;
  Else&lt;br /&gt;
    dx = field + 1&lt;br /&gt;
  End If&lt;br /&gt;
  &lt;br /&gt;
  If dx &amp;lt; 0 Then dx = -dx&lt;br /&gt;
  &lt;br /&gt;
  While dx &amp;lt; field&lt;br /&gt;
    dy = rob(robnumber).y - y&lt;br /&gt;
    If dy &amp;lt; 0 Then dy = -dy&lt;br /&gt;
        &lt;br /&gt;
    If dy &amp;lt; realfield Then&lt;br /&gt;
      dis = dy * dy + dx * dx&lt;br /&gt;
      If dis &amp;lt; dissquared Then target n, robnumber, dis&lt;br /&gt;
    End If&lt;br /&gt;
    &lt;br /&gt;
    counter = counter + 1&lt;br /&gt;
    robnumber = Roborder(counter)&lt;br /&gt;
    If robnumber = -1 Then&lt;br /&gt;
      dx = field + 1&lt;br /&gt;
    Else&lt;br /&gt;
      dx = rob(robnumber).x - x&lt;br /&gt;
    End If&lt;br /&gt;
    If dx &amp;lt; 0 Then dx = -dx&lt;br /&gt;
  Wend&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
Private Sub CheckBoth(field As Long, n As Integer, realfield As Long)&lt;br /&gt;
  Dim counter As Integer&lt;br /&gt;
  Dim robnumber As Integer&lt;br /&gt;
  Dim dx As Long&lt;br /&gt;
  Dim dy As Long&lt;br /&gt;
  Dim dissquared As Long&lt;br /&gt;
  &lt;br /&gt;
  Dim x As Long&lt;br /&gt;
  Dim y As Long&lt;br /&gt;
  Dim dis As Long&lt;br /&gt;
  &lt;br /&gt;
  With rob(n)&lt;br /&gt;
  x = rob(n).x&lt;br /&gt;
  y = rob(n).y&lt;br /&gt;
  End With&lt;br /&gt;
  &lt;br /&gt;
  dissquared = realfield * realfield&lt;br /&gt;
  'check out all the robots to the right&lt;br /&gt;
  &lt;br /&gt;
  counter = 0 ' rob(n).order + 1&lt;br /&gt;
  robnumber = Roborder(counter)&lt;br /&gt;
  If robnumber &amp;lt;&amp;gt; -1 Then&lt;br /&gt;
    dx = rob(robnumber).x - x&lt;br /&gt;
    If dx &amp;lt; 0 Then dx = -dx&lt;br /&gt;
  Else&lt;br /&gt;
    dx = field + 1&lt;br /&gt;
  End If&lt;br /&gt;
  &lt;br /&gt;
  While robnumber &amp;lt;&amp;gt; -1&lt;br /&gt;
  'While dx &amp;lt; field&lt;br /&gt;
    dy = rob(robnumber).y - y&lt;br /&gt;
    If dy &amp;lt; 0 Then dy = -dy&lt;br /&gt;
        &lt;br /&gt;
    If dy &amp;lt; realfield Then&lt;br /&gt;
      dis = dy * dy + dx * dx&lt;br /&gt;
      If dis &amp;lt; dissquared Then target n, robnumber, dis&lt;br /&gt;
    End If&lt;br /&gt;
    &lt;br /&gt;
    counter = counter + 1&lt;br /&gt;
    robnumber = Roborder(counter)&lt;br /&gt;
    If robnumber = -1 Then&lt;br /&gt;
      dx = field + 1&lt;br /&gt;
    Else&lt;br /&gt;
      dx = x - rob(robnumber).x&lt;br /&gt;
      If dx &amp;lt; 0 Then dx = -dx&lt;br /&gt;
    End If&lt;br /&gt;
  Wend&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
' start of the viewing process&lt;br /&gt;
' takes robots far at most &amp;quot;field&amp;quot; from nd (a pointer to a&lt;br /&gt;
' robot in the linked list) and passes them&lt;br /&gt;
' to the viewing procedure&lt;br /&gt;
Public Sub proximity(ByRef nd As node, field As Long) 'byref for speed&lt;br /&gt;
'current largest field size is 12 * Robsize, which is = 1440&lt;br /&gt;
  Dim n As Integer&lt;br /&gt;
  Dim x As Long&lt;br /&gt;
  Dim y As Long&lt;br /&gt;
  Dim t As Integer&lt;br /&gt;
  Dim dis As Long&lt;br /&gt;
  Dim counter As Integer&lt;br /&gt;
  Dim robnumber As Integer&lt;br /&gt;
  Dim leftfield As Long&lt;br /&gt;
  Dim rightfield As Long&lt;br /&gt;
  Dim anglestuff As Single&lt;br /&gt;
  Dim tempcos As Single&lt;br /&gt;
  Dim tempsin As Single&lt;br /&gt;
  &lt;br /&gt;
  Dim dx As Long&lt;br /&gt;
  Dim dy As Long&lt;br /&gt;
  Dim aim As Single&lt;br /&gt;
    &lt;br /&gt;
  n = nd.robn&lt;br /&gt;
  &lt;br /&gt;
  With rob(n)&lt;br /&gt;
    For t = EyeStart To EyeEnd&lt;br /&gt;
      .mem(t) = 0&lt;br /&gt;
    Next t&lt;br /&gt;
    x = .x&lt;br /&gt;
    y = .y&lt;br /&gt;
    aim = .aim&lt;br /&gt;
  End With&lt;br /&gt;
  &lt;br /&gt;
  If aim &amp;gt;= 5.498 Or aim &amp;lt;= 0.785 Then&lt;br /&gt;
    Checkright field, n, field&lt;br /&gt;
    Exit Sub&lt;br /&gt;
  End If&lt;br /&gt;
  &lt;br /&gt;
  If aim &amp;gt;= 2.356 And aim &amp;lt;= 3.927 Then&lt;br /&gt;
    Checkleft field, n, field&lt;br /&gt;
    Exit Sub&lt;br /&gt;
  End If&lt;br /&gt;
  &lt;br /&gt;
  'check both,&lt;br /&gt;
  'but only for dx is within (leftfield, rightfield)&lt;br /&gt;
    &lt;br /&gt;
  'figure out what x distances we need to test&lt;br /&gt;
  tempcos = rob(n).aimx&lt;br /&gt;
  tempsin = rob(n).aimy&lt;br /&gt;
  &lt;br /&gt;
  If field = 1440 Then&lt;br /&gt;
    rightfield = 1018&lt;br /&gt;
  Else&lt;br /&gt;
    rightfield = field * 0.707107&lt;br /&gt;
  End If&lt;br /&gt;
  anglestuff = tempcos - tempsin&lt;br /&gt;
  leftfield = rightfield * anglestuff&lt;br /&gt;
  anglestuff = tempcos + tempsin&lt;br /&gt;
  rightfield = rightfield * anglestuff&lt;br /&gt;
&lt;br /&gt;
  If aim &amp;gt; 0.785398 And aim &amp;lt; 2.356195 Then&lt;br /&gt;
    Checkleft -leftfield, n, field&lt;br /&gt;
    Checkright rightfield, n, field&lt;br /&gt;
    Exit Sub&lt;br /&gt;
  End If&lt;br /&gt;
  &lt;br /&gt;
  If aim &amp;gt; 3.926991 And aim &amp;lt; 5.497787 Then&lt;br /&gt;
    Checkleft -rightfield, n, field&lt;br /&gt;
    Checkright leftfield, n, field&lt;br /&gt;
    Exit Sub&lt;br /&gt;
  End If&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
' calculates projection of robot t in n's eye&lt;br /&gt;
' then calls cells to actually&lt;br /&gt;
' write it in the eye cells&lt;br /&gt;
Public Sub target(n As Integer, t As Integer, dis As Long)&lt;br /&gt;
  Dim dx As Long&lt;br /&gt;
  Dim dy As Long&lt;br /&gt;
  Dim an As Single&lt;br /&gt;
  Dim m As Integer&lt;br /&gt;
  Dim dan As Long&lt;br /&gt;
  Dim aim As Single&lt;br /&gt;
  Dim answer As Long&lt;br /&gt;
  m = -20&lt;br /&gt;
  dan = 0&lt;br /&gt;
  aim = rob(n).aim&lt;br /&gt;
    &lt;br /&gt;
  If rob(t).Exist And dis &amp;gt; 1 Then&lt;br /&gt;
    dx = rob(t).x - rob(n).x&lt;br /&gt;
    dy = -(rob(t).y - rob(n).y)&lt;br /&gt;
    If dx = 0 Then&lt;br /&gt;
      an = pi / 2 * Sgn(dy)&lt;br /&gt;
    Else&lt;br /&gt;
      an = Atn(dy / dx)&lt;br /&gt;
    End If&lt;br /&gt;
      &lt;br /&gt;
    If dx &amp;lt; 0 Then&lt;br /&gt;
      an = an + pi&lt;br /&gt;
    Else&lt;br /&gt;
      If an &amp;lt; 0 Then an = 2 * pi + an&lt;br /&gt;
    End If&lt;br /&gt;
     &lt;br /&gt;
    If (an &amp;gt; (3 * pi) / 4 And aim &amp;lt; pi / 2) Then&lt;br /&gt;
      an = -(2 * pi - an)&lt;br /&gt;
    End If&lt;br /&gt;
    &lt;br /&gt;
    If (aim &amp;gt; (3 * pi) / 4 And an &amp;lt; pi / 2) Then&lt;br /&gt;
      aim = -(2 * pi - aim)&lt;br /&gt;
    End If&lt;br /&gt;
    &lt;br /&gt;
    'finds square root&lt;br /&gt;
    answer = 320 + dis / 1280&lt;br /&gt;
    answer = 0.5 * (answer + dis / answer)&lt;br /&gt;
    dis = 0.5 * (answer + dis / answer)&lt;br /&gt;
    &lt;br /&gt;
    If Abs(an - aim) &amp;lt; (0.5 + RobSize / dis) Then&lt;br /&gt;
      dan = 300 / dis&lt;br /&gt;
      m = -(an - aim) * 5         'originally *10. changing to 5 gives a wider field of vision 45 degrees each way instead of 26 degrees&lt;br /&gt;
      cells n, t, m, dan, dis&lt;br /&gt;
    End If&lt;br /&gt;
  End If&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
' writes down projections (taking care of not deleting&lt;br /&gt;
' nearer objects)&lt;br /&gt;
Public Sub cells(nr As Integer, opp As Integer, n As Integer, l As Long, dis As Long)&lt;br /&gt;
  Dim jj As Integer&lt;br /&gt;
  Dim kk As Integer&lt;br /&gt;
  Dim t As Integer&lt;br /&gt;
  If n &amp;gt; -20 Then&lt;br /&gt;
    If l &amp;gt; 5 Then l = 5&lt;br /&gt;
    kk = (RobSize / dis) * 100&lt;br /&gt;
    For t = -l To l&lt;br /&gt;
      If Abs(n + t) &amp;lt; 5 Then&lt;br /&gt;
        jj = n + t + EyeStart + 5&lt;br /&gt;
        If rob(nr).mem(jj) &amp;lt; kk Then&lt;br /&gt;
          rob(nr).mem(jj) = kk&lt;br /&gt;
          If jj = EyeStart + 5 Then&lt;br /&gt;
            rob(nr).lastopp = opp&lt;br /&gt;
          End If&lt;br /&gt;
        End If&lt;br /&gt;
      End If&lt;br /&gt;
    Next t&lt;br /&gt;
  End If&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
' copies the occurr array of a viewed robot&lt;br /&gt;
' in the ref* vars of the viewing one&lt;br /&gt;
Public Sub lookoccurr(n As Integer, o As Integer)&lt;br /&gt;
  If rob(n).Corpse Then Exit Sub&lt;br /&gt;
  Dim t As Byte&lt;br /&gt;
  'If rob(n).lastviewed &amp;lt;&amp;gt; rob(o).AbsNum Then&lt;br /&gt;
    For t = 1 To 8&lt;br /&gt;
      rob(n).mem(occurrstart + t) = rob(o).occurr(t)&lt;br /&gt;
    Next t&lt;br /&gt;
    rob(n).lastviewed = rob(o).AbsNum&lt;br /&gt;
  'End If&lt;br /&gt;
  If rob(o).nrg &amp;lt; 32001 Then&lt;br /&gt;
    rob(n).mem(occurrstart + 9) = rob(o).nrg&lt;br /&gt;
  Else&lt;br /&gt;
    rob(n).mem(occurrstart + 9) = 32000&lt;br /&gt;
  End If&lt;br /&gt;
  rob(n).mem(occurrstart + 10) = rob(o).age '.refage&lt;br /&gt;
  rob(n).mem(in1) = rob(o).mem(out1)&lt;br /&gt;
  rob(n).mem(in2) = rob(o).mem(out2)&lt;br /&gt;
  rob(n).mem(711) = rob(o).mem(18)      'refaim&lt;br /&gt;
  rob(n).mem(712) = rob(o).occurr(9)    'reftie&lt;br /&gt;
  rob(n).mem(refshell) = rob(o).Shell&lt;br /&gt;
  rob(n).mem(refbody) = rob(o).body&lt;br /&gt;
  rob(n).mem(refypos) = rob(o).mem(217)&lt;br /&gt;
  rob(n).mem(refxpos) = rob(o).mem(219)&lt;br /&gt;
  'give reference variables from the bots frame of reference&lt;br /&gt;
  rob(n).mem(refvelup) = (rob(o).vx * Cos(rob(n).aim) + rob(o).vy * Sin(rob(n).aim) * -1) - rob(n).mem(velup)&lt;br /&gt;
  rob(n).mem(refveldn) = rob(n).mem(refvelup) * -1&lt;br /&gt;
  rob(n).mem(refveldx) = (rob(o).vy * Cos(rob(n).aim) + rob(o).vx * Sin(rob(n).aim)) - rob(n).mem(veldx)&lt;br /&gt;
  rob(n).mem(refvelsx) = rob(n).mem(refvelsx) * -1&lt;br /&gt;
  rob(n).mem(refvelscalar) = Sqr(rob(n).mem(refvelup) ^ 2 + rob(n).mem(refveldx) ^ 2) ' how fast is this robot moving compared to me?&lt;br /&gt;
  rob(n).mem(713) = rob(o).mem(827)     'refpoison. current value of poison. not poison commands&lt;br /&gt;
  rob(n).mem(714) = rob(o).mem(825)     'refvenom (as with poison)&lt;br /&gt;
  rob(n).mem(715) = rob(o).kills        'refkills&lt;br /&gt;
   If rob(o).Multibot = True Then&lt;br /&gt;
    rob(n).mem(refmulti) = 1&lt;br /&gt;
  Else&lt;br /&gt;
    rob(n).mem(refmulti) = 0&lt;br /&gt;
  End If&lt;br /&gt;
  If rob(n).mem(474) &amp;gt; 0 And rob(n).mem(474) &amp;lt;= 1000 Then 'readmem and memloc couple used to read a specified memory location of the target robot&lt;br /&gt;
    rob(n).mem(473) = rob(o).mem(rob(n).mem(474))&lt;br /&gt;
    'rob(n).mem(474) = 0&lt;br /&gt;
  End If&lt;br /&gt;
  If rob(o).Fixed Then                  'reffixed. Tells if a viewed robot is fixed by .fixpos.&lt;br /&gt;
    rob(n).mem(477) = 1&lt;br /&gt;
  Else&lt;br /&gt;
    rob(n).mem(477) = 0&lt;br /&gt;
  End If&lt;br /&gt;
  rob(n).mem(825) = rob(n).venom&lt;br /&gt;
  rob(n).mem(827) = rob(n).poison&lt;br /&gt;
    &lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
'no longer used, but I put enough effort into these that I don't want to lose them.&lt;br /&gt;
Private Function Sqr_Binary_Search(csquare As Long) As Long&lt;br /&gt;
'searches for the closest whole number square root (always rounds down)&lt;br /&gt;
'of csquare using a binary search of a lookup table&lt;br /&gt;
'worst case scenario: 11 iterations.  That's fast!&lt;br /&gt;
  Dim low As Integer&lt;br /&gt;
  Dim high As Integer&lt;br /&gt;
  Dim mid As Integer&lt;br /&gt;
&lt;br /&gt;
  If csquare &amp;gt; 4194304 Then 'it's not going to be in our array&lt;br /&gt;
    Sqr_Binary_Search = Sqr(csquare)&lt;br /&gt;
    Exit Function&lt;br /&gt;
  End If&lt;br /&gt;
&lt;br /&gt;
  If csquare &amp;lt; 2 Then&lt;br /&gt;
   Sqr_Binary_Search = csquare&lt;br /&gt;
   Exit Function&lt;br /&gt;
  End If&lt;br /&gt;
&lt;br /&gt;
  If Perfsquares(2) &amp;lt;&amp;gt; 4 Then Setup_Perfsquares&lt;br /&gt;
&lt;br /&gt;
  low = 1&lt;br /&gt;
  high = 2048&lt;br /&gt;
&lt;br /&gt;
  While low &amp;lt;= high&lt;br /&gt;
   mid = (low + high) / 2&lt;br /&gt;
   If csquare &amp;lt; Perfsquares(mid) Then&lt;br /&gt;
     high = mid - 1&lt;br /&gt;
   ElseIf csquare &amp;gt; Perfsquares(mid) Then&lt;br /&gt;
     low = mid + 1&lt;br /&gt;
   Else&lt;br /&gt;
     Sqr_Binary_Search = mid&lt;br /&gt;
     Exit Function&lt;br /&gt;
   End If&lt;br /&gt;
  Wend&lt;br /&gt;
  Sqr_Binary_Search = high&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
Private Sub Setup_Perfsquares()&lt;br /&gt;
  Dim x As Long&lt;br /&gt;
  For x = 1 To 2048&lt;br /&gt;
   Perfsquares(x) = x * x&lt;br /&gt;
  Next x&lt;br /&gt;
End Sub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Griz</name></author>	</entry>

	</feed>