<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.wowcube.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ratcliffe</id>
	<title>WowWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.wowcube.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ratcliffe"/>
	<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/wiki/Special:Contributions/Ratcliffe"/>
	<updated>2026-05-20T07:23:47Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.33.0</generator>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=File:CubeMapping2.JPG&amp;diff=16687</id>
		<title>File:CubeMapping2.JPG</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=File:CubeMapping2.JPG&amp;diff=16687"/>
		<updated>2023-05-21T18:12:15Z</updated>

		<summary type="html">&lt;p&gt;Ratcliffe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ratcliffe</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=Dealing_with_multiple_Modules_and_Screens&amp;diff=16686</id>
		<title>Dealing with multiple Modules and Screens</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=Dealing_with_multiple_Modules_and_Screens&amp;diff=16686"/>
		<updated>2023-05-21T18:11:59Z</updated>

		<summary type="html">&lt;p&gt;Ratcliffe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page covers various topics in dealing with the eight different modules, each with three screens, in a WOWCube.  Remember that each module has its own processor and screens and generally does not have a &amp;quot;direct connection&amp;quot; to any of the other modules.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;PhysicalVirtual&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==Physical cubelets and &amp;quot;virtual&amp;quot; mapping to them==&lt;br /&gt;
&amp;lt;span id=&amp;quot;AdjacencyDetermination&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
For this exercise:&lt;br /&gt;
* Start the WOWCube Emulator manually&lt;br /&gt;
* Left click the &amp;quot;0&amp;quot; at the upper left of the emulator screen to ensure the cube is arranged back to its default topology&lt;br /&gt;
* Start a new empty Pawn program (step by step how to in VSCode)&lt;br /&gt;
* Insert the code below into the ON_Render() routine (no other code is needed)&lt;br /&gt;
* Build and run the program so it loads and runs in the emulator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  public ON_Render()&lt;br /&gt;
  { &lt;br /&gt;
    new screen;&lt;br /&gt;
    new facelet[TOPOLOGY_FACELET];&lt;br /&gt;
    new place[TOPOLOGY_PLACE];&lt;br /&gt;
    for (screen = 0; screen &amp;lt;=2; screen++)&lt;br /&gt;
    {&lt;br /&gt;
      facelet.module = SELF_ID; // module on which this code is running&lt;br /&gt;
      facelet.screen = screen;&lt;br /&gt;
      place = TOPOLOGY_getPlace(facelet);&lt;br /&gt;
      GFX_setRenderTarget(screen);&lt;br /&gt;
      GFX_drawText([ 10,40 ], 10, 0, 0, TEXT_ALIGN_LEFT_TOP_CORNER, 0xFF0000FF, &amp;quot;module: %d&amp;quot;, SELF_ID);&lt;br /&gt;
      GFX_drawText([ 10,80 ], 10, 0, 0, TEXT_ALIGN_LEFT_TOP_CORNER, 0xFF0000FF, &amp;quot;screen:%d&amp;quot;,screen);&lt;br /&gt;
      GFX_drawText([ 10,120 ], 10, 0, 0, TEXT_ALIGN_LEFT_TOP_CORNER, 0xFF00FF00, &amp;quot;face: %d&amp;quot;, place.face);&lt;br /&gt;
      GFX_drawText([ 10,160 ], 10, 0, 0, TEXT_ALIGN_LEFT_TOP_CORNER, 0xFF00FF00, &amp;quot;position:%d&amp;quot;,place.position);&lt;br /&gt;
      GFX_render();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
CubeOS maintains a concept of &amp;quot;places&amp;quot; which consist of a cube face (numbered 0-5) and a position on the face (numbered 0-3). The screen capture below from the emulator shows the relationships on starting an app after clicking on &amp;quot;0&amp;quot; at the upper right in the emulator to reset the cube geometry to default.&lt;br /&gt;
&lt;br /&gt;
[[File:CubeMapping2.JPG|border|Cube Layout]]&lt;br /&gt;
&lt;br /&gt;
Here I will soon explain &lt;br /&gt;
* module/screen vs face/position&lt;br /&gt;
* how face/position changes as you rotate slices of the cube and when a program is started on the cube&lt;br /&gt;
* a strategy using these to code a map of what should appear on each cube screen at startup, that using the &amp;quot;place&amp;quot; functionality is guaranteed to show up the same way at application startup no matter how the cubelets have been repositioned&lt;br /&gt;
&lt;br /&gt;
==The magic of TOPOLOGY_getAdjacentFacelet()==&lt;br /&gt;
&amp;lt;span id=&amp;quot;AdjacencyMovement&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
In my RPG, the &amp;quot;party&amp;quot; moves through a maze of roads or tunnels.  As the party approaches the edge of a screen, it will try to go off the edge, to the screen adjacent to that edge.  How can we determine where the party is &amp;quot;going&amp;quot;?&lt;br /&gt;
&lt;br /&gt;
We assume you know, based on the coordinates of the party, which edge it is going to go off of.&lt;br /&gt;
* If the X coordinate is approaching 240 from an original lower number, you are going to go off the RIGHT edge&lt;br /&gt;
* If the X coordinate is approaching 0 from an original higher number, you are going to go off the LEFT edge&lt;br /&gt;
* If the Y coordinate is approaching 240 from an original lower number, you are going to go off the BOTTOM edge&lt;br /&gt;
* If the Y coordinate is approaching 0 from an original higher number, you are going to go off the TOP edge&lt;br /&gt;
&lt;br /&gt;
Accordingly, you can use the routine TOPOLOGY_getAdjacentFacelet() to determine the new module # and screen # you will be moving to, using the appropriate NEIGHBOR_xxx parameter.&lt;br /&gt;
&lt;br /&gt;
Example handling for moving off the bottom edge:&lt;br /&gt;
&lt;br /&gt;
 new facelet[TOPOLOGY_FACELET] &lt;br /&gt;
 new facelet1[TOPOLOGY_FACELET_INFO];&lt;br /&gt;
&lt;br /&gt;
 if (partyLocation.y &amp;gt; 230)&lt;br /&gt;
 {&lt;br /&gt;
 facelet.module = partyLocation.module;&lt;br /&gt;
 facelet.screen = partyLocation.screen;&lt;br /&gt;
 facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_BOTTOM);&lt;br /&gt;
 partyNewLocation.module = facelet1.module;&lt;br /&gt;
 partyNewLocation.screen = facelet1.screen;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
After this code executes, partyNewLocation will contain the module and screen of the &amp;quot;destination&amp;quot; and I can erase the party marker at partyLocation and redraw it at partyNewLocation.&lt;br /&gt;
&lt;br /&gt;
If the new module is the same as the old/current module, the code on this module can perform those redraws.  If the new module is different than the old/current module, the current module can erase the party marker at partyLocation, but must send a '''message''' to the new module to tell it to take over managing the party location and draw the party marker on the new screen.&lt;br /&gt;
&lt;br /&gt;
In the RPG, I also need to know if the receiving edge of the new module/screen has a tunnel opening for the party to enter, if not it can't leave the edge of the screen!  How do I determine this?&lt;br /&gt;
&lt;br /&gt;
By using TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_BOTTOM) again!   &lt;br /&gt;
&lt;br /&gt;
In the above case, knowing I am moving off the BOTTOM of the current screen/module, I can check if there is a tunnel opening on the top of the receiving screen/module.  Some trickiness is involved because that screen is likely rotated with respect to the current module, so I can't just use NEIGHBOR_TOP on the receiving screen.  Instead, using the NEW screen and module as the starting point, I can find which edge of that screen takes me &amp;quot;back&amp;quot; to the original screen.  Once this is determined, I can verify the appropriate cell on that screen has an &amp;quot;open tunnel&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 entryIsPossible()&lt;br /&gt;
 {&lt;br /&gt;
   // assumes validBoundsOnScreen has been set with the cell map for the destination screen&lt;br /&gt;
   facelet.module = partyNewLocation.module;&lt;br /&gt;
   facelet.screen = partyNewLocation.screen;&lt;br /&gt;
&lt;br /&gt;
   facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_LEFT);&lt;br /&gt;
   if ((facelet1.module == partyLocation.module) &amp;amp;&amp;amp; (facelet1.screen == partyLocation.screen))&lt;br /&gt;
   {&lt;br /&gt;
   // left entry on dest&lt;br /&gt;
      return validBoundsOnScreen[3];;&lt;br /&gt;
   }&lt;br /&gt;
   facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_RIGHT);&lt;br /&gt;
   if ((facelet1.module == partyLocation.module) &amp;amp;&amp;amp; (facelet1.screen == partyLocation.screen))&lt;br /&gt;
   {&lt;br /&gt;
   // right entry on dest&lt;br /&gt;
     return validBoundsOnScreen[5];&lt;br /&gt;
   }&lt;br /&gt;
   facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_TOP);&lt;br /&gt;
   if ((facelet1.module == partyLocation.module) &amp;amp;&amp;amp; (facelet1.screen == partyLocation.screen))&lt;br /&gt;
   {&lt;br /&gt;
   // top entry on dest&lt;br /&gt;
     return validBoundsOnScreen[1];&lt;br /&gt;
   }&lt;br /&gt;
   facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_BOTTOM);&lt;br /&gt;
   if ((facelet1.module == partyLocation.module) &amp;amp;&amp;amp; (facelet1.screen == partyLocation.screen))&lt;br /&gt;
   {&lt;br /&gt;
  // bottom entry on dest&lt;br /&gt;
    return validBoundsOnScreen[7];&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==How to handle moving from one screen to another (on the same or a different cubelet)==&lt;br /&gt;
Content coming soon!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Orientation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==Dealing with differing orientation of the screens==&lt;br /&gt;
Content coming soon!&lt;/div&gt;</summary>
		<author><name>Ratcliffe</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=Dealing_with_multiple_Modules_and_Screens&amp;diff=16685</id>
		<title>Dealing with multiple Modules and Screens</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=Dealing_with_multiple_Modules_and_Screens&amp;diff=16685"/>
		<updated>2023-05-21T18:01:21Z</updated>

		<summary type="html">&lt;p&gt;Ratcliffe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page covers various topics in dealing with the eight different modules, each with three screens, in a WOWCube.  Remember that each module has its own processor and screens and generally does not have a &amp;quot;direct connection&amp;quot; to any of the other modules.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;PhysicalVirtual&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==Physical cubelets and &amp;quot;virtual&amp;quot; mapping to them==&lt;br /&gt;
&amp;lt;span id=&amp;quot;AdjacencyDetermination&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
For this exercise:&lt;br /&gt;
* Start the WOWCube Emulator manually&lt;br /&gt;
* Left click the &amp;quot;0&amp;quot; at the upper left of the emulator screen to ensure the cube is arranged back to its default topology&lt;br /&gt;
* Start a new empty Pawn program (step by step how to in VSCode)&lt;br /&gt;
* Insert the code below into the ON_Render() routine (no other code is needed)&lt;br /&gt;
* Build and run the program so it loads and runs in the emulator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  public ON_Render()&lt;br /&gt;
  { &lt;br /&gt;
    new screen;&lt;br /&gt;
    new facelet[TOPOLOGY_FACELET];&lt;br /&gt;
    new place[TOPOLOGY_PLACE];&lt;br /&gt;
    for (screen = 0; screen &amp;lt;=2; screen++)&lt;br /&gt;
    {&lt;br /&gt;
      facelet.module = SELF_ID; // module on which this code is running&lt;br /&gt;
      facelet.screen = screen;&lt;br /&gt;
      place = TOPOLOGY_getPlace(facelet);&lt;br /&gt;
      GFX_setRenderTarget(screen);&lt;br /&gt;
      GFX_drawText([ 40,40 ], 8, 0, 0, TEXT_ALIGN_LEFT_TOP_CORNER, 0xFF0000FF, &amp;quot;module: %d&amp;quot;, SELF_ID);&lt;br /&gt;
      GFX_drawText([ 40,80 ], 8, 0, 0, TEXT_ALIGN_LEFT_TOP_CORNER, 0xFF0000FF, &amp;quot;screen:%d&amp;quot;,screen);&lt;br /&gt;
      GFX_drawText([ 40,120 ], 8, 0, 0, TEXT_ALIGN_LEFT_TOP_CORNER, 0xFF00FF00, &amp;quot;face: %d&amp;quot;, place.face);&lt;br /&gt;
      GFX_drawText([ 40,160 ], 8, 0, 0, TEXT_ALIGN_LEFT_TOP_CORNER, 0xFF00FF00, &amp;quot;position:%d&amp;quot;,place.position);&lt;br /&gt;
      GFX_render();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
CubeOS maintains a concept of &amp;quot;places&amp;quot; which consist of a cube face (numbered 0-5) and a position on the face (numbered 0-3). The screen capture below from the emulator shows the relationships on starting an app after clicking on &amp;quot;0&amp;quot; at the upper right in the emulator to reset the cube geometry to default.&lt;br /&gt;
&lt;br /&gt;
[[File:CubeMapping.JPG|border|Cube Layout]]&lt;br /&gt;
&lt;br /&gt;
Here I will soon explain &lt;br /&gt;
* module/screen vs face/position&lt;br /&gt;
* how face/position changes as you rotate slices of the cube and when a program is started on the cube&lt;br /&gt;
* a strategy using these to code a map of what should appear on each cube screen at startup, that using the &amp;quot;place&amp;quot; functionality is guaranteed to show up the same way at application startup no matter how the cubelets have been repositioned&lt;br /&gt;
&lt;br /&gt;
==The magic of TOPOLOGY_getAdjacentFacelet()==&lt;br /&gt;
&amp;lt;span id=&amp;quot;AdjacencyMovement&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
In my RPG, the &amp;quot;party&amp;quot; moves through a maze of roads or tunnels.  As the party approaches the edge of a screen, it will try to go off the edge, to the screen adjacent to that edge.  How can we determine where the party is &amp;quot;going&amp;quot;?&lt;br /&gt;
&lt;br /&gt;
We assume you know, based on the coordinates of the party, which edge it is going to go off of.&lt;br /&gt;
* If the X coordinate is approaching 240 from an original lower number, you are going to go off the RIGHT edge&lt;br /&gt;
* If the X coordinate is approaching 0 from an original higher number, you are going to go off the LEFT edge&lt;br /&gt;
* If the Y coordinate is approaching 240 from an original lower number, you are going to go off the BOTTOM edge&lt;br /&gt;
* If the Y coordinate is approaching 0 from an original higher number, you are going to go off the TOP edge&lt;br /&gt;
&lt;br /&gt;
Accordingly, you can use the routine TOPOLOGY_getAdjacentFacelet() to determine the new module # and screen # you will be moving to, using the appropriate NEIGHBOR_xxx parameter.&lt;br /&gt;
&lt;br /&gt;
Example handling for moving off the bottom edge:&lt;br /&gt;
&lt;br /&gt;
 new facelet[TOPOLOGY_FACELET] &lt;br /&gt;
 new facelet1[TOPOLOGY_FACELET_INFO];&lt;br /&gt;
&lt;br /&gt;
 if (partyLocation.y &amp;gt; 230)&lt;br /&gt;
 {&lt;br /&gt;
 facelet.module = partyLocation.module;&lt;br /&gt;
 facelet.screen = partyLocation.screen;&lt;br /&gt;
 facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_BOTTOM);&lt;br /&gt;
 partyNewLocation.module = facelet1.module;&lt;br /&gt;
 partyNewLocation.screen = facelet1.screen;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
After this code executes, partyNewLocation will contain the module and screen of the &amp;quot;destination&amp;quot; and I can erase the party marker at partyLocation and redraw it at partyNewLocation.&lt;br /&gt;
&lt;br /&gt;
If the new module is the same as the old/current module, the code on this module can perform those redraws.  If the new module is different than the old/current module, the current module can erase the party marker at partyLocation, but must send a '''message''' to the new module to tell it to take over managing the party location and draw the party marker on the new screen.&lt;br /&gt;
&lt;br /&gt;
In the RPG, I also need to know if the receiving edge of the new module/screen has a tunnel opening for the party to enter, if not it can't leave the edge of the screen!  How do I determine this?&lt;br /&gt;
&lt;br /&gt;
By using TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_BOTTOM) again!   &lt;br /&gt;
&lt;br /&gt;
In the above case, knowing I am moving off the BOTTOM of the current screen/module, I can check if there is a tunnel opening on the top of the receiving screen/module.  Some trickiness is involved because that screen is likely rotated with respect to the current module, so I can't just use NEIGHBOR_TOP on the receiving screen.  Instead, using the NEW screen and module as the starting point, I can find which edge of that screen takes me &amp;quot;back&amp;quot; to the original screen.  Once this is determined, I can verify the appropriate cell on that screen has an &amp;quot;open tunnel&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 entryIsPossible()&lt;br /&gt;
 {&lt;br /&gt;
   // assumes validBoundsOnScreen has been set with the cell map for the destination screen&lt;br /&gt;
   facelet.module = partyNewLocation.module;&lt;br /&gt;
   facelet.screen = partyNewLocation.screen;&lt;br /&gt;
&lt;br /&gt;
   facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_LEFT);&lt;br /&gt;
   if ((facelet1.module == partyLocation.module) &amp;amp;&amp;amp; (facelet1.screen == partyLocation.screen))&lt;br /&gt;
   {&lt;br /&gt;
   // left entry on dest&lt;br /&gt;
      return validBoundsOnScreen[3];;&lt;br /&gt;
   }&lt;br /&gt;
   facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_RIGHT);&lt;br /&gt;
   if ((facelet1.module == partyLocation.module) &amp;amp;&amp;amp; (facelet1.screen == partyLocation.screen))&lt;br /&gt;
   {&lt;br /&gt;
   // right entry on dest&lt;br /&gt;
     return validBoundsOnScreen[5];&lt;br /&gt;
   }&lt;br /&gt;
   facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_TOP);&lt;br /&gt;
   if ((facelet1.module == partyLocation.module) &amp;amp;&amp;amp; (facelet1.screen == partyLocation.screen))&lt;br /&gt;
   {&lt;br /&gt;
   // top entry on dest&lt;br /&gt;
     return validBoundsOnScreen[1];&lt;br /&gt;
   }&lt;br /&gt;
   facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_BOTTOM);&lt;br /&gt;
   if ((facelet1.module == partyLocation.module) &amp;amp;&amp;amp; (facelet1.screen == partyLocation.screen))&lt;br /&gt;
   {&lt;br /&gt;
  // bottom entry on dest&lt;br /&gt;
    return validBoundsOnScreen[7];&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==How to handle moving from one screen to another (on the same or a different cubelet)==&lt;br /&gt;
Content coming soon!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Orientation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==Dealing with differing orientation of the screens==&lt;br /&gt;
Content coming soon!&lt;/div&gt;</summary>
		<author><name>Ratcliffe</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=Dealing_with_multiple_Modules_and_Screens&amp;diff=16684</id>
		<title>Dealing with multiple Modules and Screens</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=Dealing_with_multiple_Modules_and_Screens&amp;diff=16684"/>
		<updated>2023-05-21T17:58:18Z</updated>

		<summary type="html">&lt;p&gt;Ratcliffe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page covers various topics in dealing with the eight different modules, each with three screens, in a WOWCube.  Remember that each module has its own processor and screens and generally does not have a &amp;quot;direct connection&amp;quot; to any of the other modules.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;PhysicalVirtual&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==Physical cubelets and &amp;quot;virtual&amp;quot; mapping to them==&lt;br /&gt;
&amp;lt;span id=&amp;quot;AdjacencyDetermination&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
For this exercise:&lt;br /&gt;
* Start the WOWCube Emulator manually&lt;br /&gt;
* Left click the &amp;quot;0&amp;quot; at the upper left of the emulator screen to ensure the cube is arranged back to its default topology&lt;br /&gt;
* Start a new empty Pawn program (step by step how to in VSCode)&lt;br /&gt;
* Insert the code below into the ON_Render() routine (no other code is needed)&lt;br /&gt;
* Build and run the program so it loads and runs in the emulator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  public ON_Render()&lt;br /&gt;
  { &lt;br /&gt;
    new screen;&lt;br /&gt;
    new facelet[TOPOLOGY_FACELET];&lt;br /&gt;
    new place[TOPOLOGY_PLACE];&lt;br /&gt;
    for (screen = 0; screen &amp;lt;=2; screen++)&lt;br /&gt;
    {&lt;br /&gt;
      facelet.module = SELF_ID; // module on which this code is running&lt;br /&gt;
      facelet.screen = screen;&lt;br /&gt;
      place = TOPOLOGY_getPlace(facelet);&lt;br /&gt;
      GFX_setRenderTarget(screen);&lt;br /&gt;
      GFX_drawText([ 40,40 ], 8, 0, 0, TEXT_ALIGN_LEFT_TOP_CORNER, 0xFF0000FF, &amp;quot;module: %d&amp;quot;, SELF_ID);&lt;br /&gt;
      GFX_drawText([ 40,80 ], 8, 0, 0, TEXT_ALIGN_LEFT_TOP_CORNER, 0xFF0000FF, &amp;quot;screen:%d&amp;quot;,screen);&lt;br /&gt;
      GFX_drawText([ 40,120 ], 8, 0, 0, TEXT_ALIGN_LEFT_TOP_CORNER, 0xFF00FF00, &amp;quot;face: %d&amp;quot;, place.face);&lt;br /&gt;
      GFX_drawText([ 40,160 ], 8, 0, 0, TEXT_ALIGN_LEFT_TOP_CORNER, 0xFF00FF00, &amp;quot;position:%d&amp;quot;,place.position);&lt;br /&gt;
      GFX_render();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
CubeOS maintains a concept of &amp;quot;places&amp;quot; which consist of a cube face (numbered 0-5) and a position on the face (numbered 0-3). The screen capture below from the emulator shows the relationships on starting an app after clicking on &amp;quot;0&amp;quot; at the upper right in the emulator to reset the cube geometry to default.&lt;br /&gt;
&lt;br /&gt;
[[File:CubeMapping.jpg|border|Cube Layout]]&lt;br /&gt;
&lt;br /&gt;
Here I will soon explain &lt;br /&gt;
* module/screen vs face/position&lt;br /&gt;
* how face/position changes as you rotate slices of the cube and when a program is started on the cube&lt;br /&gt;
* a strategy using these to code a map of what should appear on each cube screen at startup, that using the &amp;quot;place&amp;quot; functionality is guaranteed to show up the same way at application startup no matter how the cubelets have been repositioned&lt;br /&gt;
&lt;br /&gt;
==The magic of TOPOLOGY_getAdjacentFacelet()==&lt;br /&gt;
&amp;lt;span id=&amp;quot;AdjacencyMovement&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
In my RPG, the &amp;quot;party&amp;quot; moves through a maze of roads or tunnels.  As the party approaches the edge of a screen, it will try to go off the edge, to the screen adjacent to that edge.  How can we determine where the party is &amp;quot;going&amp;quot;?&lt;br /&gt;
&lt;br /&gt;
We assume you know, based on the coordinates of the party, which edge it is going to go off of.&lt;br /&gt;
* If the X coordinate is approaching 240 from an original lower number, you are going to go off the RIGHT edge&lt;br /&gt;
* If the X coordinate is approaching 0 from an original higher number, you are going to go off the LEFT edge&lt;br /&gt;
* If the Y coordinate is approaching 240 from an original lower number, you are going to go off the BOTTOM edge&lt;br /&gt;
* If the Y coordinate is approaching 0 from an original higher number, you are going to go off the TOP edge&lt;br /&gt;
&lt;br /&gt;
Accordingly, you can use the routine TOPOLOGY_getAdjacentFacelet() to determine the new module # and screen # you will be moving to, using the appropriate NEIGHBOR_xxx parameter.&lt;br /&gt;
&lt;br /&gt;
Example handling for moving off the bottom edge:&lt;br /&gt;
&lt;br /&gt;
 new facelet[TOPOLOGY_FACELET] &lt;br /&gt;
 new facelet1[TOPOLOGY_FACELET_INFO];&lt;br /&gt;
&lt;br /&gt;
 if (partyLocation.y &amp;gt; 230)&lt;br /&gt;
 {&lt;br /&gt;
 facelet.module = partyLocation.module;&lt;br /&gt;
 facelet.screen = partyLocation.screen;&lt;br /&gt;
 facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_BOTTOM);&lt;br /&gt;
 partyNewLocation.module = facelet1.module;&lt;br /&gt;
 partyNewLocation.screen = facelet1.screen;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
After this code executes, partyNewLocation will contain the module and screen of the &amp;quot;destination&amp;quot; and I can erase the party marker at partyLocation and redraw it at partyNewLocation.&lt;br /&gt;
&lt;br /&gt;
If the new module is the same as the old/current module, the code on this module can perform those redraws.  If the new module is different than the old/current module, the current module can erase the party marker at partyLocation, but must send a '''message''' to the new module to tell it to take over managing the party location and draw the party marker on the new screen.&lt;br /&gt;
&lt;br /&gt;
In the RPG, I also need to know if the receiving edge of the new module/screen has a tunnel opening for the party to enter, if not it can't leave the edge of the screen!  How do I determine this?&lt;br /&gt;
&lt;br /&gt;
By using TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_BOTTOM) again!   &lt;br /&gt;
&lt;br /&gt;
In the above case, knowing I am moving off the BOTTOM of the current screen/module, I can check if there is a tunnel opening on the top of the receiving screen/module.  Some trickiness is involved because that screen is likely rotated with respect to the current module, so I can't just use NEIGHBOR_TOP on the receiving screen.  Instead, using the NEW screen and module as the starting point, I can find which edge of that screen takes me &amp;quot;back&amp;quot; to the original screen.  Once this is determined, I can verify the appropriate cell on that screen has an &amp;quot;open tunnel&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 entryIsPossible()&lt;br /&gt;
 {&lt;br /&gt;
   // assumes validBoundsOnScreen has been set with the cell map for the destination screen&lt;br /&gt;
   facelet.module = partyNewLocation.module;&lt;br /&gt;
   facelet.screen = partyNewLocation.screen;&lt;br /&gt;
&lt;br /&gt;
   facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_LEFT);&lt;br /&gt;
   if ((facelet1.module == partyLocation.module) &amp;amp;&amp;amp; (facelet1.screen == partyLocation.screen))&lt;br /&gt;
   {&lt;br /&gt;
   // left entry on dest&lt;br /&gt;
      return validBoundsOnScreen[3];;&lt;br /&gt;
   }&lt;br /&gt;
   facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_RIGHT);&lt;br /&gt;
   if ((facelet1.module == partyLocation.module) &amp;amp;&amp;amp; (facelet1.screen == partyLocation.screen))&lt;br /&gt;
   {&lt;br /&gt;
   // right entry on dest&lt;br /&gt;
     return validBoundsOnScreen[5];&lt;br /&gt;
   }&lt;br /&gt;
   facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_TOP);&lt;br /&gt;
   if ((facelet1.module == partyLocation.module) &amp;amp;&amp;amp; (facelet1.screen == partyLocation.screen))&lt;br /&gt;
   {&lt;br /&gt;
   // top entry on dest&lt;br /&gt;
     return validBoundsOnScreen[1];&lt;br /&gt;
   }&lt;br /&gt;
   facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_BOTTOM);&lt;br /&gt;
   if ((facelet1.module == partyLocation.module) &amp;amp;&amp;amp; (facelet1.screen == partyLocation.screen))&lt;br /&gt;
   {&lt;br /&gt;
  // bottom entry on dest&lt;br /&gt;
    return validBoundsOnScreen[7];&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==How to handle moving from one screen to another (on the same or a different cubelet)==&lt;br /&gt;
Content coming soon!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Orientation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==Dealing with differing orientation of the screens==&lt;br /&gt;
Content coming soon!&lt;/div&gt;</summary>
		<author><name>Ratcliffe</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=File:CubeMapping.JPG&amp;diff=16683</id>
		<title>File:CubeMapping.JPG</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=File:CubeMapping.JPG&amp;diff=16683"/>
		<updated>2023-05-21T17:49:30Z</updated>

		<summary type="html">&lt;p&gt;Ratcliffe: for Pawn tutorial section on place/facelet mapping&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
for Pawn tutorial section on place/facelet mapping&lt;/div&gt;</summary>
		<author><name>Ratcliffe</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=PawnProgrammingNotes&amp;diff=16680</id>
		<title>PawnProgrammingNotes</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=PawnProgrammingNotes&amp;diff=16680"/>
		<updated>2023-05-12T04:38:53Z</updated>

		<summary type="html">&lt;p&gt;Ratcliffe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This &amp;quot;sub wiki&amp;quot; is being written (initially, at least) by me, ratcliffe. I have been doing software development for 30+ years in VB.NET, C#, C++ and Objective C.  This is my first experience with Pawn and of course with programming the WOWCube.  Feel free to drop me a DM in the WOWCube Discord if I've gotten anything wrong, or you can suggest a better way to do something, or want me to try to cover a specific topic.  I'm going to be making notes here as I build a basic RPG for the WOWCube.&lt;br /&gt;
&lt;br /&gt;
This is just a scaffolding for the moment, I will be fleshing out the listed items over the next few days.&lt;br /&gt;
&lt;br /&gt;
I also need to work to keep some terminology straight so I may change these terms a bit soon&lt;br /&gt;
&lt;br /&gt;
; cubelet or module&lt;br /&gt;
: one of the eight physical small cubes, each with three screens, in the WOWCube&lt;br /&gt;
; screen&lt;br /&gt;
: one of the three screens on a cubelet&lt;br /&gt;
; messaging&lt;br /&gt;
: the technique supported in the API to send a small packet of information to one or more other cubelets&lt;br /&gt;
----&lt;br /&gt;
Here are the current topics in place or coming soon!&lt;br /&gt;
&lt;br /&gt;
* A few Pawn Language &amp;quot;gotchas&amp;quot;/reminders&lt;br /&gt;
** Statements do NOT have to be terminated with &amp;quot;;&amp;quot; (but I usually do it anyway out of habit)&lt;br /&gt;
** Declare variables with &amp;quot;new&amp;quot; (not &amp;quot;var&amp;quot;, etc.)&lt;br /&gt;
** You can use the built in words &amp;quot;true&amp;quot; and &amp;quot;false&amp;quot; to represent a boolean value and test for it with &amp;quot;if (x) { }&amp;quot; which will execute the code in braces if x is true&lt;br /&gt;
** Arrays can be up to three dimensions and indexes start at 0, e.g. new x[8] defines a new array with 8 elements indexed 0..7 inclusive&lt;br /&gt;
** Use &amp;quot;==&amp;quot; (not &amp;quot;=&amp;quot;) to check for equivalence in an &amp;quot;if&amp;quot; statement&lt;br /&gt;
** Use &amp;quot;!=&amp;quot; instead of &amp;quot;&amp;lt;&amp;gt;&amp;quot; for &amp;quot;not equal to&amp;quot;&lt;br /&gt;
** You can enter numbers in hex by prefixing with 0x e.g. &amp;quot;0xFFFF0000&amp;quot; is used as an ARGB value for the color red&lt;br /&gt;
** &amp;quot;if&amp;quot; statements with more than one condition require an extra set of () around the whole expression e.g. &amp;quot;if ((x==1)||(x==2)) {}&amp;quot;&lt;br /&gt;
** function definitions are not prefixed with &amp;quot;f&amp;quot; or &amp;quot;func&amp;quot; or &amp;quot;function&amp;quot; e.g. &amp;quot;abs(x) {if (x&amp;gt;=0) {return x} else {return -1*x}}&amp;quot; is a valid function definition&lt;br /&gt;
** you can begin a comment on a line by itself or at the end of a line with &amp;quot;//&amp;quot;. Use &amp;quot;/* .... */&amp;quot; for block comments ... block comments CANNOT be nested&lt;br /&gt;
* A few Visual Studio Code &amp;quot;gotchas&amp;quot;/reminders&lt;br /&gt;
** Under circumstances that are not yet entirely clear to me, Visual Studio Code may sometimes open the parent folder of the folder containing the actual project, this may occur mainly or only when using &amp;quot;Create Example Project&amp;quot; from the samples, inside a new folder you have just created.  Symptom is errors saying &amp;quot;could not find the task&amp;quot;, e.g. when you try to build.  The fix is to use the File, Open Folder menu item and then select the folder containing the actual project (that folder will have subfolders named .vscode, assets etc.)&lt;br /&gt;
** So far, it doesn't appear that Visual Studio Code has an automatic feature to fix indenting of all of your code so that it is consistent&lt;br /&gt;
* [[The basic concepts of running code on eight cubelets|Remembering that the WOWCube is &amp;quot;eight processors all running the same code&amp;quot;]]&lt;br /&gt;
* ON_Tick() vs ON_Render()&lt;br /&gt;
** The &amp;quot;lifecycle&amp;quot; of a running Pawn application will repeatedly call ON_Tick() followed by ON_Render().  You should generally put all logic that will set the current/new state of the objects that will appear on the cubelet's screens in ON_Tick(), and then use ON_Render() only to do GFX_xxx calls to display the objects on the screens.&lt;br /&gt;
* [[Rendering Text and Graphics#AllAtOnce|You have to render everything on a screen at once!]]&lt;br /&gt;
* [[Dealing with multiple Modules and Screens#PhysicalVirtual| Physical cubelets and &amp;quot;virtual&amp;quot; mapping to them]]&lt;br /&gt;
* [[Dealing with multiple Modules and Screens#Orientation|Dealing with differing orientation of the screens]]&lt;br /&gt;
* Putting text on a screen&lt;br /&gt;
* [[Basics of developing a simple map with tunnels]]&lt;br /&gt;
* [[Dealing with multiple Modules and Screens#AdjacencyDetermination|The magic of TOPOLOGY_getAdjacentFacelet()]]&lt;br /&gt;
* [[Dealing with multiple Modules and Screens#AdjacencyMovement|How to handle moving from one screen to another (on the same or a different cubelet)]]&lt;br /&gt;
----&lt;br /&gt;
* Tricks when using the Emulator&lt;/div&gt;</summary>
		<author><name>Ratcliffe</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=Dealing_with_multiple_Modules_and_Screens&amp;diff=16679</id>
		<title>Dealing with multiple Modules and Screens</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=Dealing_with_multiple_Modules_and_Screens&amp;diff=16679"/>
		<updated>2023-05-12T04:35:37Z</updated>

		<summary type="html">&lt;p&gt;Ratcliffe: /* Physical cubelets and &amp;quot;virtual&amp;quot; mapping to them */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page covers various topics in dealing with the eight different modules, each with three screens, in a WOWCube.  Remember that each module has its own processor and screens and generally does not have a &amp;quot;direct connection&amp;quot; to any of the other modules.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;PhysicalVirtual&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==Physical cubelets and &amp;quot;virtual&amp;quot; mapping to them==&lt;br /&gt;
&amp;lt;span id=&amp;quot;AdjacencyDetermination&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
For this exercise:&lt;br /&gt;
* Start the WOWCube Emulator manually&lt;br /&gt;
* Left click the &amp;quot;0&amp;quot; at the upper left of the emulator screen to ensure the cube is arranged back to its default topology&lt;br /&gt;
* Start a new empty Pawn program (step by step how to in VSCode)&lt;br /&gt;
* Insert the code below into the ON_Render() routine (no other code is needed)&lt;br /&gt;
* Build and run the program so it loads and runs in the emulator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  public ON_Render()&lt;br /&gt;
  { &lt;br /&gt;
    new screen;&lt;br /&gt;
    new facelet[TOPOLOGY_FACELET];&lt;br /&gt;
    new place[TOPOLOGY_PLACE];&lt;br /&gt;
    for (screen = 0; screen &amp;lt;=2; screen++)&lt;br /&gt;
    {&lt;br /&gt;
      facelet.module = SELF_ID; // module on which this code is running&lt;br /&gt;
      facelet.screen = screen;&lt;br /&gt;
      place = TOPOLOGY_getPlace(facelet);&lt;br /&gt;
      GFX_setRenderTarget(screen);&lt;br /&gt;
      GFX_drawText([ 40,40 ], 8, 0, 0, TEXT_ALIGN_LEFT_TOP_CORNER, 0xFF0000FF, &amp;quot;module: %d&amp;quot;, SELF_ID);&lt;br /&gt;
      GFX_drawText([ 40,80 ], 8, 0, 0, TEXT_ALIGN_LEFT_TOP_CORNER, 0xFF0000FF, &amp;quot;screen:%d&amp;quot;,screen);&lt;br /&gt;
      GFX_drawText([ 40,120 ], 8, 0, 0, TEXT_ALIGN_LEFT_TOP_CORNER, 0xFF00FF00, &amp;quot;face: %d&amp;quot;, place.face);&lt;br /&gt;
      GFX_drawText([ 40,160 ], 8, 0, 0, TEXT_ALIGN_LEFT_TOP_CORNER, 0xFF00FF00, &amp;quot;position:%d&amp;quot;,place.position);&lt;br /&gt;
      GFX_render();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Here I will soon explain &lt;br /&gt;
* module/screen vs face/position&lt;br /&gt;
* how face/position changes as you rotate slices of the cube and when a program is started on the cube&lt;br /&gt;
* a strategy using these to code a map of what should appear on each cube screen at startup, that using the &amp;quot;place&amp;quot; functionality is guaranteed to show up the same way at application startup no matter how the cubelets have been repositioned&lt;br /&gt;
&lt;br /&gt;
==The magic of TOPOLOGY_getAdjacentFacelet()==&lt;br /&gt;
&amp;lt;span id=&amp;quot;AdjacencyMovement&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
In my RPG, the &amp;quot;party&amp;quot; moves through a maze of roads or tunnels.  As the party approaches the edge of a screen, it will try to go off the edge, to the screen adjacent to that edge.  How can we determine where the party is &amp;quot;going&amp;quot;?&lt;br /&gt;
&lt;br /&gt;
We assume you know, based on the coordinates of the party, which edge it is going to go off of.&lt;br /&gt;
* If the X coordinate is approaching 240 from an original lower number, you are going to go off the RIGHT edge&lt;br /&gt;
* If the X coordinate is approaching 0 from an original higher number, you are going to go off the LEFT edge&lt;br /&gt;
* If the Y coordinate is approaching 240 from an original lower number, you are going to go off the BOTTOM edge&lt;br /&gt;
* If the Y coordinate is approaching 0 from an original higher number, you are going to go off the TOP edge&lt;br /&gt;
&lt;br /&gt;
Accordingly, you can use the routine TOPOLOGY_getAdjacentFacelet() to determine the new module # and screen # you will be moving to, using the appropriate NEIGHBOR_xxx parameter.&lt;br /&gt;
&lt;br /&gt;
Example handling for moving off the bottom edge:&lt;br /&gt;
&lt;br /&gt;
 new facelet[TOPOLOGY_FACELET] &lt;br /&gt;
 new facelet1[TOPOLOGY_FACELET_INFO];&lt;br /&gt;
&lt;br /&gt;
 if (partyLocation.y &amp;gt; 230)&lt;br /&gt;
 {&lt;br /&gt;
 facelet.module = partyLocation.module;&lt;br /&gt;
 facelet.screen = partyLocation.screen;&lt;br /&gt;
 facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_BOTTOM);&lt;br /&gt;
 partyNewLocation.module = facelet1.module;&lt;br /&gt;
 partyNewLocation.screen = facelet1.screen;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
After this code executes, partyNewLocation will contain the module and screen of the &amp;quot;destination&amp;quot; and I can erase the party marker at partyLocation and redraw it at partyNewLocation.&lt;br /&gt;
&lt;br /&gt;
If the new module is the same as the old/current module, the code on this module can perform those redraws.  If the new module is different than the old/current module, the current module can erase the party marker at partyLocation, but must send a '''message''' to the new module to tell it to take over managing the party location and draw the party marker on the new screen.&lt;br /&gt;
&lt;br /&gt;
In the RPG, I also need to know if the receiving edge of the new module/screen has a tunnel opening for the party to enter, if not it can't leave the edge of the screen!  How do I determine this?&lt;br /&gt;
&lt;br /&gt;
By using TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_BOTTOM) again!   &lt;br /&gt;
&lt;br /&gt;
In the above case, knowing I am moving off the BOTTOM of the current screen/module, I can check if there is a tunnel opening on the top of the receiving screen/module.  Some trickiness is involved because that screen is likely rotated with respect to the current module, so I can't just use NEIGHBOR_TOP on the receiving screen.  Instead, using the NEW screen and module as the starting point, I can find which edge of that screen takes me &amp;quot;back&amp;quot; to the original screen.  Once this is determined, I can verify the appropriate cell on that screen has an &amp;quot;open tunnel&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 entryIsPossible()&lt;br /&gt;
 {&lt;br /&gt;
   // assumes validBoundsOnScreen has been set with the cell map for the destination screen&lt;br /&gt;
   facelet.module = partyNewLocation.module;&lt;br /&gt;
   facelet.screen = partyNewLocation.screen;&lt;br /&gt;
&lt;br /&gt;
   facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_LEFT);&lt;br /&gt;
   if ((facelet1.module == partyLocation.module) &amp;amp;&amp;amp; (facelet1.screen == partyLocation.screen))&lt;br /&gt;
   {&lt;br /&gt;
   // left entry on dest&lt;br /&gt;
      return validBoundsOnScreen[3];;&lt;br /&gt;
   }&lt;br /&gt;
   facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_RIGHT);&lt;br /&gt;
   if ((facelet1.module == partyLocation.module) &amp;amp;&amp;amp; (facelet1.screen == partyLocation.screen))&lt;br /&gt;
   {&lt;br /&gt;
   // right entry on dest&lt;br /&gt;
     return validBoundsOnScreen[5];&lt;br /&gt;
   }&lt;br /&gt;
   facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_TOP);&lt;br /&gt;
   if ((facelet1.module == partyLocation.module) &amp;amp;&amp;amp; (facelet1.screen == partyLocation.screen))&lt;br /&gt;
   {&lt;br /&gt;
   // top entry on dest&lt;br /&gt;
     return validBoundsOnScreen[1];&lt;br /&gt;
   }&lt;br /&gt;
   facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_BOTTOM);&lt;br /&gt;
   if ((facelet1.module == partyLocation.module) &amp;amp;&amp;amp; (facelet1.screen == partyLocation.screen))&lt;br /&gt;
   {&lt;br /&gt;
  // bottom entry on dest&lt;br /&gt;
    return validBoundsOnScreen[7];&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==How to handle moving from one screen to another (on the same or a different cubelet)==&lt;br /&gt;
Content coming soon!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Orientation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==Dealing with differing orientation of the screens==&lt;br /&gt;
Content coming soon!&lt;/div&gt;</summary>
		<author><name>Ratcliffe</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=Basics_of_developing_a_simple_map_with_tunnels&amp;diff=16678</id>
		<title>Basics of developing a simple map with tunnels</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=Basics_of_developing_a_simple_map_with_tunnels&amp;diff=16678"/>
		<updated>2023-05-12T04:07:00Z</updated>

		<summary type="html">&lt;p&gt;Ratcliffe: Created page with &amp;quot;In my RPG game, the cube faces comprise a maze of tunnels, that connect rooms where things happen (finding new party members!  buying potions!  Attacking monsters!).   There a...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In my RPG game, the cube faces comprise a maze of tunnels, that connect rooms where things happen (finding new party members!  buying potions!  Attacking monsters!).   There are no doubt a number of approaches on implementing this in Pawn code, but I am using the following method:&lt;br /&gt;
* A 2D matrix with the first index being a module # and the second index being a screen # yields the ID # of the &amp;quot;map piece&amp;quot; that is on that screen&lt;br /&gt;
* Another 2D matrix with the first index being a module # and the second index being a screen # yields the &amp;quot;rotation count&amp;quot; of that map piece on that screen&lt;br /&gt;
* There are a small number of map pieces and each is initially designed as if the top of the screen is at the top of the piece:&lt;br /&gt;
** A straight tunnel (that will go top to bottom or left to right on the screen)&lt;br /&gt;
** An L shaped tunnel (that will connect left to bottom, left to top, right to bottom, or right to top)&lt;br /&gt;
** A cross shaped tunnel (that connects all four sides together)&lt;br /&gt;
** A dead end tunnel (that opens at the top, left, bottom, or right, but closes off 2/3 of the way down)&lt;br /&gt;
** A stairs tunnel (that opens at the top, left, bottom, or right, but the final third of the tunnel is a green square indicating stairs up or down to another level)&lt;br /&gt;
&lt;br /&gt;
Based on initial topology of the cube on application startup (to be explained), I determine for each screen face the map piece I want on it, and the needed rotation (based on adjacent map pieces and the known orientation of that screen) for the map piece.  The ON_Render routine is then able to just look at the two values for each screen to determine how to draw the tunnels (to be explained further)&lt;br /&gt;
&lt;br /&gt;
Since I also need to be able to indicate where on the face the party can exist, I also set a &amp;quot;cell array&amp;quot; of size [9] (indexes 0..8) where the screen is divided into a 3x3 grid and the cell array for a given cell is 1 if the party can be there or 0 if it cannot:&lt;br /&gt;
&lt;br /&gt;
 0 1 2&lt;br /&gt;
 3 4 5&lt;br /&gt;
 6 7 8&lt;br /&gt;
&lt;br /&gt;
If the map piece is a cross, it would always be the case that indexes 1,3,4,5, and 7 would be 1.  For an L piece, it would be one of the following based on the rotation: (1,4,5), (4,5,7), (3,4,7), or (1,3,4).&lt;/div&gt;</summary>
		<author><name>Ratcliffe</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=PawnProgrammingNotes&amp;diff=16677</id>
		<title>PawnProgrammingNotes</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=PawnProgrammingNotes&amp;diff=16677"/>
		<updated>2023-05-12T03:54:58Z</updated>

		<summary type="html">&lt;p&gt;Ratcliffe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This &amp;quot;sub wiki&amp;quot; is being written (initially, at least) by me, ratcliffe. I have been doing software development for 30+ years in VB.NET, C#, C++ and Objective C.  This is my first experience with Pawn and of course with programming the WOWCube.  Feel free to drop me a DM in the WOWCube Discord if I've gotten anything wrong, or you can suggest a better way to do something, or want me to try to cover a specific topic.  I'm going to be making notes here as I build a basic RPG for the WOWCube.&lt;br /&gt;
&lt;br /&gt;
This is just a scaffolding for the moment, I will be fleshing out the listed items over the next few days.&lt;br /&gt;
&lt;br /&gt;
I also need to work to keep some terminology straight so I may change these terms a bit soon&lt;br /&gt;
&lt;br /&gt;
; cubelet or module&lt;br /&gt;
: one of the eight physical small cubes, each with three screens, in the WOWCube&lt;br /&gt;
; screen&lt;br /&gt;
: one of the three screens on a cubelet&lt;br /&gt;
; messaging&lt;br /&gt;
: the technique supported in the API to send a small packet of information to one or more other cubelets&lt;br /&gt;
----&lt;br /&gt;
Here are the current topics in place or coming soon!&lt;br /&gt;
&lt;br /&gt;
* A few Pawn Language &amp;quot;gotchas&amp;quot;/reminders&lt;br /&gt;
** Statements do NOT have to be terminated with &amp;quot;;&amp;quot; (but I usually do it anyway out of habit)&lt;br /&gt;
** Declare variables with &amp;quot;new&amp;quot; (not &amp;quot;var&amp;quot;, etc.)&lt;br /&gt;
** You can use the built in words &amp;quot;true&amp;quot; and &amp;quot;false&amp;quot; to represent a boolean value and test for it with &amp;quot;if (x) { }&amp;quot; which will execute the code in braces if x is true&lt;br /&gt;
** Arrays can be up to three dimensions and indexes start at 0&lt;br /&gt;
** Use &amp;quot;==&amp;quot; (not &amp;quot;=&amp;quot;) to check for equivalence in an &amp;quot;if&amp;quot; statement&lt;br /&gt;
** Use &amp;quot;!=&amp;quot; instead of &amp;quot;&amp;lt;&amp;gt;&amp;quot; for &amp;quot;not equal to&amp;quot;&lt;br /&gt;
** You can enter numbers in hex by prefixing with 0x e.g. &amp;quot;0xFFFF0000&amp;quot; is used as an ARGB value for the color red&lt;br /&gt;
** &amp;quot;if&amp;quot; statements with more than one condition require an extra set of () around the whole expression e.g. &amp;quot;if ((x==1)||(x==2)) {}&amp;quot;&lt;br /&gt;
** function definitions are not prefixed with &amp;quot;f&amp;quot; or &amp;quot;func&amp;quot; or &amp;quot;function&amp;quot; e.g. &amp;quot;abs(x) {if (x&amp;gt;=0) {return x} else {return -1*x}}&amp;quot; is a valid function definition&lt;br /&gt;
** you can begin a comment on a line by itself or at the end of a line with &amp;quot;//&amp;quot;. Use &amp;quot;/* .... */&amp;quot; for block comments ... block comments CANNOT be nested&lt;br /&gt;
* A few Visual Studio Code &amp;quot;gotchas&amp;quot;/reminders&lt;br /&gt;
** Under circumstances that are not yet entirely clear to me, Visual Studio Code may sometimes open the parent folder of the folder containing the actual project, this may occur mainly or only when using &amp;quot;Create Example Project&amp;quot; from the samples, inside a new folder you have just created.  Symptom is errors saying &amp;quot;could not find the task&amp;quot;, e.g. when you try to build.  The fix is to use the File, Open Folder menu item and then select the folder containing the actual project (that folder will have subfolders named .vscode, assets etc.)&lt;br /&gt;
** So far, it doesn't appear that Visual Studio Code has an automatic feature to fix indenting of all of your code so that it is consistent&lt;br /&gt;
* [[The basic concepts of running code on eight cubelets|Remembering that the WOWCube is &amp;quot;eight processors all running the same code&amp;quot;]]&lt;br /&gt;
* ON_Tick() vs ON_Render()&lt;br /&gt;
** The &amp;quot;lifecycle&amp;quot; of a running Pawn application will repeatedly call ON_Tick() followed by ON_Render().  You should generally put all logic that will set the current/new state of the objects that will appear on the cubelet's screens in ON_Tick(), and then use ON_Render() only to do GFX_xxx calls to display the objects on the screens.&lt;br /&gt;
* [[Rendering Text and Graphics#AllAtOnce|You have to render everything on a screen at once!]]&lt;br /&gt;
* [[Dealing with multiple Modules and Screens#PhysicalVirtual| Physical cubelets and &amp;quot;virtual&amp;quot; mapping to them]]&lt;br /&gt;
* [[Dealing with multiple Modules and Screens#Orientation|Dealing with differing orientation of the screens]]&lt;br /&gt;
* Putting text on a screen&lt;br /&gt;
* [[Basics of developing a simple map with tunnels]]&lt;br /&gt;
* [[Dealing with multiple Modules and Screens#AdjacencyDetermination|The magic of TOPOLOGY_getAdjacentFacelet()]]&lt;br /&gt;
* [[Dealing with multiple Modules and Screens#AdjacencyMovement|How to handle moving from one screen to another (on the same or a different cubelet)]]&lt;br /&gt;
----&lt;br /&gt;
* Tricks when using the Emulator&lt;/div&gt;</summary>
		<author><name>Ratcliffe</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=Dealing_with_multiple_Modules_and_Screens&amp;diff=16676</id>
		<title>Dealing with multiple Modules and Screens</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=Dealing_with_multiple_Modules_and_Screens&amp;diff=16676"/>
		<updated>2023-05-12T03:49:08Z</updated>

		<summary type="html">&lt;p&gt;Ratcliffe: /* The magic of TOPOLOGY_getAdjacentFacelet() */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page covers various topics in dealing with the eight different modules, each with three screens, in a WOWCube.  Remember that each module has its own processor and screens and generally does not have a &amp;quot;direct connection&amp;quot; to any of the other modules.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;PhysicalVirtual&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==Physical cubelets and &amp;quot;virtual&amp;quot; mapping to them==&lt;br /&gt;
Content coming soon!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;AdjacencyDetermination&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==The magic of TOPOLOGY_getAdjacentFacelet()==&lt;br /&gt;
&amp;lt;span id=&amp;quot;AdjacencyMovement&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
In my RPG, the &amp;quot;party&amp;quot; moves through a maze of roads or tunnels.  As the party approaches the edge of a screen, it will try to go off the edge, to the screen adjacent to that edge.  How can we determine where the party is &amp;quot;going&amp;quot;?&lt;br /&gt;
&lt;br /&gt;
We assume you know, based on the coordinates of the party, which edge it is going to go off of.&lt;br /&gt;
* If the X coordinate is approaching 240 from an original lower number, you are going to go off the RIGHT edge&lt;br /&gt;
* If the X coordinate is approaching 0 from an original higher number, you are going to go off the LEFT edge&lt;br /&gt;
* If the Y coordinate is approaching 240 from an original lower number, you are going to go off the BOTTOM edge&lt;br /&gt;
* If the Y coordinate is approaching 0 from an original higher number, you are going to go off the TOP edge&lt;br /&gt;
&lt;br /&gt;
Accordingly, you can use the routine TOPOLOGY_getAdjacentFacelet() to determine the new module # and screen # you will be moving to, using the appropriate NEIGHBOR_xxx parameter.&lt;br /&gt;
&lt;br /&gt;
Example handling for moving off the bottom edge:&lt;br /&gt;
&lt;br /&gt;
 new facelet[TOPOLOGY_FACELET] &lt;br /&gt;
 new facelet1[TOPOLOGY_FACELET_INFO];&lt;br /&gt;
&lt;br /&gt;
 if (partyLocation.y &amp;gt; 230)&lt;br /&gt;
 {&lt;br /&gt;
 facelet.module = partyLocation.module;&lt;br /&gt;
 facelet.screen = partyLocation.screen;&lt;br /&gt;
 facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_BOTTOM);&lt;br /&gt;
 partyNewLocation.module = facelet1.module;&lt;br /&gt;
 partyNewLocation.screen = facelet1.screen;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
After this code executes, partyNewLocation will contain the module and screen of the &amp;quot;destination&amp;quot; and I can erase the party marker at partyLocation and redraw it at partyNewLocation.&lt;br /&gt;
&lt;br /&gt;
If the new module is the same as the old/current module, the code on this module can perform those redraws.  If the new module is different than the old/current module, the current module can erase the party marker at partyLocation, but must send a '''message''' to the new module to tell it to take over managing the party location and draw the party marker on the new screen.&lt;br /&gt;
&lt;br /&gt;
In the RPG, I also need to know if the receiving edge of the new module/screen has a tunnel opening for the party to enter, if not it can't leave the edge of the screen!  How do I determine this?&lt;br /&gt;
&lt;br /&gt;
By using TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_BOTTOM) again!   &lt;br /&gt;
&lt;br /&gt;
In the above case, knowing I am moving off the BOTTOM of the current screen/module, I can check if there is a tunnel opening on the top of the receiving screen/module.  Some trickiness is involved because that screen is likely rotated with respect to the current module, so I can't just use NEIGHBOR_TOP on the receiving screen.  Instead, using the NEW screen and module as the starting point, I can find which edge of that screen takes me &amp;quot;back&amp;quot; to the original screen.  Once this is determined, I can verify the appropriate cell on that screen has an &amp;quot;open tunnel&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 entryIsPossible()&lt;br /&gt;
 {&lt;br /&gt;
   // assumes validBoundsOnScreen has been set with the cell map for the destination screen&lt;br /&gt;
   facelet.module = partyNewLocation.module;&lt;br /&gt;
   facelet.screen = partyNewLocation.screen;&lt;br /&gt;
&lt;br /&gt;
   facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_LEFT);&lt;br /&gt;
   if ((facelet1.module == partyLocation.module) &amp;amp;&amp;amp; (facelet1.screen == partyLocation.screen))&lt;br /&gt;
   {&lt;br /&gt;
   // left entry on dest&lt;br /&gt;
      return validBoundsOnScreen[3];;&lt;br /&gt;
   }&lt;br /&gt;
   facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_RIGHT);&lt;br /&gt;
   if ((facelet1.module == partyLocation.module) &amp;amp;&amp;amp; (facelet1.screen == partyLocation.screen))&lt;br /&gt;
   {&lt;br /&gt;
   // right entry on dest&lt;br /&gt;
     return validBoundsOnScreen[5];&lt;br /&gt;
   }&lt;br /&gt;
   facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_TOP);&lt;br /&gt;
   if ((facelet1.module == partyLocation.module) &amp;amp;&amp;amp; (facelet1.screen == partyLocation.screen))&lt;br /&gt;
   {&lt;br /&gt;
   // top entry on dest&lt;br /&gt;
     return validBoundsOnScreen[1];&lt;br /&gt;
   }&lt;br /&gt;
   facelet1 = TOPOLOGY_getAdjacentFacelet(facelet,NEIGHBOR_BOTTOM);&lt;br /&gt;
   if ((facelet1.module == partyLocation.module) &amp;amp;&amp;amp; (facelet1.screen == partyLocation.screen))&lt;br /&gt;
   {&lt;br /&gt;
  // bottom entry on dest&lt;br /&gt;
    return validBoundsOnScreen[7];&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==How to handle moving from one screen to another (on the same or a different cubelet)==&lt;br /&gt;
Content coming soon!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Orientation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==Dealing with differing orientation of the screens==&lt;br /&gt;
Content coming soon!&lt;/div&gt;</summary>
		<author><name>Ratcliffe</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=Dealing_with_multiple_Modules_and_Screens&amp;diff=16675</id>
		<title>Dealing with multiple Modules and Screens</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=Dealing_with_multiple_Modules_and_Screens&amp;diff=16675"/>
		<updated>2023-05-08T03:29:39Z</updated>

		<summary type="html">&lt;p&gt;Ratcliffe: Created page with &amp;quot;This page covers various topics in dealing with the eight different modules, each with three screens, in a WOWCube.  Remember that each module has its own processor and screen...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page covers various topics in dealing with the eight different modules, each with three screens, in a WOWCube.  Remember that each module has its own processor and screens and generally does not have a &amp;quot;direct connection&amp;quot; to any of the other modules.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;PhysicalVirtual&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==Physical cubelets and &amp;quot;virtual&amp;quot; mapping to them==&lt;br /&gt;
Content coming soon!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;AdjacencyDetermination&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==The magic of TOPOLOGY_getAdjacentFacelet()==&lt;br /&gt;
Content coming soon!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;AdjacencyMovement&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==How to handle moving from one screen to another (on the same or a different cubelet)==&lt;br /&gt;
Content coming soon!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Orientation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==Dealing with differing orientation of the screens==&lt;br /&gt;
Content coming soon!&lt;/div&gt;</summary>
		<author><name>Ratcliffe</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=PawnProgrammingNotes&amp;diff=16674</id>
		<title>PawnProgrammingNotes</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=PawnProgrammingNotes&amp;diff=16674"/>
		<updated>2023-05-08T03:23:07Z</updated>

		<summary type="html">&lt;p&gt;Ratcliffe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This &amp;quot;sub wiki&amp;quot; is being written (initially, at least) by me, ratcliffe. I have been doing software development for 30+ years in VB.NET, C#, C++ and Objective C.  This is my first experience with Pawn and of course with programming the WOWCube.  Feel free to drop me a DM in the WOWCube Discord if I've gotten anything wrong, or you can suggest a better way to do something, or want me to try to cover a specific topic.  I'm going to be making notes here as I build a basic RPG for the WOWCube.&lt;br /&gt;
&lt;br /&gt;
This is just a scaffolding for the moment, I will be fleshing out the listed items over the next few days.&lt;br /&gt;
&lt;br /&gt;
I also need to work to keep some terminology straight so I may change these terms a bit soon&lt;br /&gt;
&lt;br /&gt;
; cubelet or module&lt;br /&gt;
: one of the eight physical small cubes, each with three screens, in the WOWCube&lt;br /&gt;
; screen&lt;br /&gt;
: one of the three screens on a cubelet&lt;br /&gt;
; messaging&lt;br /&gt;
: the technique supported in the API to send a small packet of information to one or more other cubelets&lt;br /&gt;
----&lt;br /&gt;
Here are the current topics in place or coming soon!&lt;br /&gt;
&lt;br /&gt;
* A few Pawn Language &amp;quot;gotchas&amp;quot;/reminders&lt;br /&gt;
** Statements do NOT have to be terminated with &amp;quot;;&amp;quot; (but I usually do it anyway out of habit)&lt;br /&gt;
** Declare variables with &amp;quot;new&amp;quot; (not &amp;quot;var&amp;quot;, etc.)&lt;br /&gt;
** You can use the built in words &amp;quot;true&amp;quot; and &amp;quot;false&amp;quot; to represent a boolean value and test for it with &amp;quot;if (x) { }&amp;quot; which will execute the code in braces if x is true&lt;br /&gt;
** Arrays can be up to three dimensions and indexes start at 0&lt;br /&gt;
** Use &amp;quot;==&amp;quot; (not &amp;quot;=&amp;quot;) to check for equivalence in an &amp;quot;if&amp;quot; statement&lt;br /&gt;
** Use &amp;quot;!=&amp;quot; instead of &amp;quot;&amp;lt;&amp;gt;&amp;quot; for &amp;quot;not equal to&amp;quot;&lt;br /&gt;
** You can enter numbers in hex by prefixing with 0x e.g. &amp;quot;0xFFFF0000&amp;quot; is used as an ARGB value for the color red&lt;br /&gt;
** &amp;quot;if&amp;quot; statements with more than one condition require an extra set of () around the whole expression e.g. &amp;quot;if ((x==1)||(x==2)) {}&amp;quot;&lt;br /&gt;
** function definitions are not prefixed with &amp;quot;f&amp;quot; or &amp;quot;func&amp;quot; or &amp;quot;function&amp;quot; e.g. &amp;quot;abs(x) {if (x&amp;gt;=0) {return x} else {return -1*x}}&amp;quot; is a valid function definition&lt;br /&gt;
** you can begin a comment on a line by itself or at the end of a line with &amp;quot;//&amp;quot;. Use &amp;quot;/* .... */&amp;quot; for block comments ... block comments CANNOT be nested&lt;br /&gt;
* A few Visual Studio Code &amp;quot;gotchas&amp;quot;/reminders&lt;br /&gt;
** Under circumstances that are not yet entirely clear to me, Visual Studio Code may sometimes open the parent folder of the folder containing the actual project, this may occur mainly or only when using &amp;quot;Create Example Project&amp;quot; from the samples, inside a new folder you have just created.  Symptom is errors saying &amp;quot;could not find the task&amp;quot;, e.g. when you try to build.  The fix is to use the File, Open Folder menu item and then select the folder containing the actual project (that folder will have subfolders named .vscode, assets etc.)&lt;br /&gt;
** So far, it doesn't appear that Visual Studio Code has an automatic feature to fix indenting of all of your code so that it is consistent&lt;br /&gt;
* [[The basic concepts of running code on eight cubelets|Remembering that the WOWCube is &amp;quot;eight processors all running the same code&amp;quot;]]&lt;br /&gt;
* ON_Tick() vs ON_Render()&lt;br /&gt;
** The &amp;quot;lifecycle&amp;quot; of a running Pawn application will repeatedly call ON_Tick() followed by ON_Render().  You should generally put all logic that will set the current/new state of the objects that will appear on the cubelet's screens in ON_Tick(), and then use ON_Render() only to do GFX_xxx calls to display the objects on the screens.&lt;br /&gt;
* [[Rendering Text and Graphics#AllAtOnce|You have to render everything on a screen at once!]]&lt;br /&gt;
* [[Dealing with multiple Modules and Screens#PhysicalVirtual| Physical cubelets and &amp;quot;virtual&amp;quot; mapping to them]]&lt;br /&gt;
* [[Dealing with multiple Modules and Screens#Orientation|Dealing with differing orientation of the screens]]&lt;br /&gt;
* Putting text on a screen&lt;br /&gt;
* Basics of developing a simple map with tunnels&lt;br /&gt;
* [[Dealing with multiple Modules and Screens#AdjacencyDetermination|The magic of TOPOLOGY_getAdjacentFacelet()]]&lt;br /&gt;
* [[Dealing with multiple Modules and Screens#AdjacencyMovement|How to handle moving from one screen to another (on the same or a different cubelet)]]&lt;br /&gt;
----&lt;br /&gt;
* Tricks when using the Emulator&lt;/div&gt;</summary>
		<author><name>Ratcliffe</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=PawnProgrammingNotes&amp;diff=16673</id>
		<title>PawnProgrammingNotes</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=PawnProgrammingNotes&amp;diff=16673"/>
		<updated>2023-05-08T03:13:00Z</updated>

		<summary type="html">&lt;p&gt;Ratcliffe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This &amp;quot;sub wiki&amp;quot; is being written (initially, at least) by me, ratcliffe. I have been doing software development for 30+ years in VB.NET, C#, C++ and Objective C.  This is my first experience with Pawn and of course with programming the WOWCube.  Feel free to drop me a DM in the WOWCube Discord if I've gotten anything wrong, or you can suggest a better way to do something, or want me to try to cover a specific topic.  I'm going to be making notes here as I build a basic RPG for the WOWCube.&lt;br /&gt;
&lt;br /&gt;
This is just a scaffolding for the moment, I will be fleshing out the listed items over the next few days.&lt;br /&gt;
&lt;br /&gt;
I also need to work to keep some terminology straight so I may change these terms a bit soon&lt;br /&gt;
&lt;br /&gt;
; cubelet or module&lt;br /&gt;
: one of the eight physical small cubes, each with three screens, in the WOWCube&lt;br /&gt;
; screen&lt;br /&gt;
: one of the three screens on a cubelet&lt;br /&gt;
; messaging&lt;br /&gt;
: the technique supported in the API to send a small packet of information to one or more other cubelets&lt;br /&gt;
----&lt;br /&gt;
Here are the current topics in place or coming soon!&lt;br /&gt;
&lt;br /&gt;
* A few Pawn Language &amp;quot;gotchas&amp;quot;/reminders&lt;br /&gt;
** Statements do NOT have to be terminated with &amp;quot;;&amp;quot; (but I usually do it anyway out of habit)&lt;br /&gt;
** Declare variables with &amp;quot;new&amp;quot; (not &amp;quot;var&amp;quot;, etc.)&lt;br /&gt;
** You can use the built in words &amp;quot;true&amp;quot; and &amp;quot;false&amp;quot; to represent a boolean value and test for it with &amp;quot;if (x) { }&amp;quot; which will execute the code in braces if x is true&lt;br /&gt;
** Arrays can be up to three dimensions and indexes start at 0&lt;br /&gt;
** Use &amp;quot;==&amp;quot; (not &amp;quot;=&amp;quot;) to check for equivalence in an &amp;quot;if&amp;quot; statement&lt;br /&gt;
** Use &amp;quot;!=&amp;quot; instead of &amp;quot;&amp;lt;&amp;gt;&amp;quot; for &amp;quot;not equal to&amp;quot;&lt;br /&gt;
** You can enter numbers in hex by prefixing with 0x e.g. &amp;quot;0xFFFF0000&amp;quot; is used as an ARGB value for the color red&lt;br /&gt;
** &amp;quot;if&amp;quot; statements with more than one condition require an extra set of () around the whole expression e.g. &amp;quot;if ((x==1)||(x==2)) {}&amp;quot;&lt;br /&gt;
** function definitions are not prefixed with &amp;quot;f&amp;quot; or &amp;quot;func&amp;quot; or &amp;quot;function&amp;quot; e.g. &amp;quot;abs(x) {if (x&amp;gt;=0) {return x} else {return -1*x}}&amp;quot; is a valid function definition&lt;br /&gt;
** you can begin a comment on a line by itself or at the end of a line with &amp;quot;//&amp;quot;. Use &amp;quot;/* .... */&amp;quot; for block comments ... block comments CANNOT be nested&lt;br /&gt;
* A few Visual Studio Code &amp;quot;gotchas&amp;quot;/reminders&lt;br /&gt;
** Under circumstances that are not yet entirely clear to me, Visual Studio Code may sometimes open the parent folder of the folder containing the actual project, this may occur mainly or only when using &amp;quot;Create Example Project&amp;quot; from the samples, inside a new folder you have just created.  Symptom is errors saying &amp;quot;could not find the task&amp;quot;, e.g. when you try to build.  The fix is to use the File, Open Folder menu item and then select the folder containing the actual project (that folder will have subfolders named .vscode, assets etc.)&lt;br /&gt;
** So far, it doesn't appear that Visual Studio Code has an automatic feature to fix indenting of all of your code so that it is consistent&lt;br /&gt;
* [[The basic concepts of running code on eight cubelets|Remembering that the WOWCube is &amp;quot;eight processors all running the same code&amp;quot;]]&lt;br /&gt;
* ON_Tick() vs ON_Render()&lt;br /&gt;
** The &amp;quot;lifecycle&amp;quot; of a running Pawn application will repeatedly call ON_Tick() followed by ON_Render().  You should generally put all logic that will set the current/new state of the objects that will appear on the cubelet's screens in ON_Tick(), and then use ON_Render() only to do GFX_xxx calls to display the objects on the screens.&lt;br /&gt;
* [[Rendering Text and Graphics#AllAtOnce|You have to render everything on a screen at once!]]&lt;br /&gt;
* Physical cubelets and &amp;quot;virtual&amp;quot; mapping to them&lt;br /&gt;
* Dealing with differing orientation of the screens&lt;br /&gt;
* Putting text on a screen&lt;br /&gt;
* Basics of developing a simple map with tunnels&lt;br /&gt;
* The magic of TOPOLOGY_getAdjacentFacelet()&lt;br /&gt;
* How to handle moving from one screen to another (on the same or a different cubelet)&lt;br /&gt;
----&lt;br /&gt;
* Tricks when using the Emulator&lt;/div&gt;</summary>
		<author><name>Ratcliffe</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=PawnProgrammingNotes&amp;diff=16672</id>
		<title>PawnProgrammingNotes</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=PawnProgrammingNotes&amp;diff=16672"/>
		<updated>2023-05-06T06:02:01Z</updated>

		<summary type="html">&lt;p&gt;Ratcliffe: Correct casing for &amp;quot;WOWCube&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This &amp;quot;sub wiki&amp;quot; is being written (initially, at least) by me, ratcliffe. I have been doing software development for 30+ years in VB.NET, C#, C++ and Objective C.  This is my first experience with Pawn and of course with programming the WOWCube.  Feel free to drop me a DM in the WOWCube Discord if I've gotten anything wrong, or you can suggest a better way to do something, or want me to try to cover a specific topic.  I'm going to be making notes here as I build a basic RPG for the WOWCube.&lt;br /&gt;
&lt;br /&gt;
This is just a scaffolding for the moment, I will be fleshing out the listed items over the next few days.&lt;br /&gt;
&lt;br /&gt;
I also need to work to keep some terminology straight so I may change these terms a bit soon&lt;br /&gt;
&lt;br /&gt;
; cubelet or module&lt;br /&gt;
: one of the eight physical small cubes, each with three screens, in the WOWCube&lt;br /&gt;
; screen&lt;br /&gt;
: one of the three screens on a cubelet&lt;br /&gt;
; messaging&lt;br /&gt;
: the technique supported in the API to send a small packet of information to one or more other cubelets&lt;br /&gt;
----&lt;br /&gt;
Here are the current topics in place or coming soon!&lt;br /&gt;
&lt;br /&gt;
* A few Pawn Language &amp;quot;gotchas&amp;quot;/reminders&lt;br /&gt;
** Statements do NOT have to be terminated with &amp;quot;;&amp;quot; (but I usually do it anyway out of habit)&lt;br /&gt;
** Declare variables with &amp;quot;new&amp;quot; (not &amp;quot;var&amp;quot;, etc.)&lt;br /&gt;
** You can use the built in words &amp;quot;true&amp;quot; and &amp;quot;false&amp;quot; to represent a boolean value and test for it with &amp;quot;if (x) { }&amp;quot; which will execute the code in braces if x is true&lt;br /&gt;
** Arrays can be up to three dimensions and indexes start at 0&lt;br /&gt;
** Use &amp;quot;==&amp;quot; (not &amp;quot;=&amp;quot;) to check for equivalence in an &amp;quot;if&amp;quot; statement&lt;br /&gt;
** Use &amp;quot;!=&amp;quot; instead of &amp;quot;&amp;lt;&amp;gt;&amp;quot; for &amp;quot;not equal to&amp;quot;&lt;br /&gt;
** You can enter numbers in hex by prefixing with 0x e.g. &amp;quot;0xFFFF0000&amp;quot; is used as an ARGB value for the color red&lt;br /&gt;
** &amp;quot;if&amp;quot; statements with more than one condition require an extra set of () around the whole expression e.g. &amp;quot;if ((x==1)||(x==2)) {}&amp;quot;&lt;br /&gt;
** function definitions are not prefixed with &amp;quot;f&amp;quot; or &amp;quot;func&amp;quot; or &amp;quot;function&amp;quot; e.g. &amp;quot;abs(x) {if (x&amp;gt;=0) {return x} else {return -1*x}}&amp;quot; is a valid function definition&lt;br /&gt;
** you can begin a comment on a line by itself or at the end of a line with &amp;quot;//&amp;quot;. Use &amp;quot;/* .... */&amp;quot; for block comments ... block comments CANNOT be nested&lt;br /&gt;
* A few Visual Studio Code &amp;quot;gotchas&amp;quot;/reminders&lt;br /&gt;
* [[The basic concepts of running code on eight cubelets|Remembering that the WOWCube is &amp;quot;eight processors all running the same code&amp;quot;]]&lt;br /&gt;
* ON_Tick() vs ON_Render()&lt;br /&gt;
* [[Rendering Text and Graphics#AllAtOnce|You have to render everything on a screen at once!]]&lt;br /&gt;
* Physical cubelets and &amp;quot;virtual&amp;quot; mapping to them&lt;br /&gt;
* Dealing with differing orientation of the screens&lt;br /&gt;
* Putting text on a screen&lt;br /&gt;
* Basics of developing a simple map with tunnels&lt;br /&gt;
* The magic of TOPOLOGY_getAdjacentFacelet()&lt;br /&gt;
* How to handle moving from one screen to another (on the same or a different cubelet)&lt;br /&gt;
----&lt;br /&gt;
* Tricks when using the Emulator&lt;/div&gt;</summary>
		<author><name>Ratcliffe</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=PawnProgrammingNotes&amp;diff=16671</id>
		<title>PawnProgrammingNotes</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=PawnProgrammingNotes&amp;diff=16671"/>
		<updated>2023-05-06T06:01:07Z</updated>

		<summary type="html">&lt;p&gt;Ratcliffe: Correct casing for &amp;quot;WOWCube&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This &amp;quot;sub wiki&amp;quot; is being written (initially, at least) by me, ratcliffe. I have been doing software development for 30+ years in VB.NET, C#, C++ and Objective C.  This is my first experience with Pawn and of course with programming the WOWCube.  Feel free to drop me a DM in the WOWCube Discord if I've gotten anything wrong, or you can suggest a better way to do something, or want me to try to cover a specific topic.  I'm going to be making notes here as I build a basic RPG for the WOWCube.&lt;br /&gt;
&lt;br /&gt;
This is just a scaffolding for the moment, I will be fleshing out the listed items over the next few days.&lt;br /&gt;
&lt;br /&gt;
I also need to work to keep some terminology straight so I may change these terms a bit soon&lt;br /&gt;
&lt;br /&gt;
; cubelet or module&lt;br /&gt;
: one of the eight physical small cubes, each with three screens, in the WOWCube&lt;br /&gt;
; screen&lt;br /&gt;
: one of the three screens on a cubelet&lt;br /&gt;
; messaging&lt;br /&gt;
: the technique supported in the API to send a small packet of information to one or more other cubelets&lt;br /&gt;
----&lt;br /&gt;
Here are the current topics in place or coming soon!&lt;br /&gt;
&lt;br /&gt;
* A few Pawn Language &amp;quot;gotchas&amp;quot;/reminders&lt;br /&gt;
** Statements do NOT have to be terminated with &amp;quot;;&amp;quot; (but I usually do it anyway out of habit)&lt;br /&gt;
** Declare variables with &amp;quot;new&amp;quot; (not &amp;quot;var&amp;quot;, etc.)&lt;br /&gt;
** You can use the built in words &amp;quot;true&amp;quot; and &amp;quot;false&amp;quot; to represent a boolean value and test for it with &amp;quot;if (x) { }&amp;quot; which will execute the code in braces if x is true&lt;br /&gt;
** Arrays can be up to three dimensions and indexes start at 0&lt;br /&gt;
** Use &amp;quot;==&amp;quot; (not &amp;quot;=&amp;quot;) to check for equivalence in an &amp;quot;if&amp;quot; statement&lt;br /&gt;
** Use &amp;quot;!=&amp;quot; instead of &amp;quot;&amp;lt;&amp;gt;&amp;quot; for &amp;quot;not equal to&amp;quot;&lt;br /&gt;
** You can enter numbers in hex by prefixing with 0x e.g. &amp;quot;0xFFFF0000&amp;quot; is used as an ARGB value for the color red&lt;br /&gt;
** &amp;quot;if&amp;quot; statements with more than one condition require an extra set of () around the whole expression e.g. &amp;quot;if ((x==1)||(x==2)) {}&amp;quot;&lt;br /&gt;
** function definitions are not prefixed with &amp;quot;f&amp;quot; or &amp;quot;func&amp;quot; or &amp;quot;function&amp;quot; e.g. &amp;quot;abs(x) {if (x&amp;gt;=0) {return x} else {return -1*x}}&amp;quot; is a valid function definition&lt;br /&gt;
** you can begin a comment on a line by itself or at the end of a line with &amp;quot;//&amp;quot;. Use &amp;quot;/* .... */&amp;quot; for block comments ... block comments CANNOT be nested&lt;br /&gt;
* A few Visual Studio Code &amp;quot;gotchas&amp;quot;/reminders&lt;br /&gt;
* [[The basic concepts of running code on eight cubelets|Remembering that the WOWCUBE is &amp;quot;eight processors all running the same code&amp;quot;]]&lt;br /&gt;
* ON_Tick() vs ON_Render()&lt;br /&gt;
* [[Rendering Text and Graphics#AllAtOnce|You have to render everything on a screen at once!]]&lt;br /&gt;
* Physical cubelets and &amp;quot;virtual&amp;quot; mapping to them&lt;br /&gt;
* Dealing with differing orientation of the screens&lt;br /&gt;
* Putting text on a screen&lt;br /&gt;
* Basics of developing a simple map with tunnels&lt;br /&gt;
* The magic of TOPOLOGY_getAdjacentFacelet()&lt;br /&gt;
* How to handle moving from one screen to another (on the same or a different cubelet)&lt;br /&gt;
----&lt;br /&gt;
* Tricks when using the Emulator&lt;/div&gt;</summary>
		<author><name>Ratcliffe</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=The_basic_concepts_of_running_code_on_eight_cubelets&amp;diff=16670</id>
		<title>The basic concepts of running code on eight cubelets</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=The_basic_concepts_of_running_code_on_eight_cubelets&amp;diff=16670"/>
		<updated>2023-05-06T05:57:59Z</updated>

		<summary type="html">&lt;p&gt;Ratcliffe: Created page with &amp;quot;In general you will write ONE source program in Visual Studio Code that will be loaded onto and run on all eight cubelets.   It's very likely you will want different things to...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In general you will write ONE source program in Visual Studio Code that will be loaded onto and run on all eight cubelets.   It's very likely you will want different things to appear on each screen, so you will have logic to check which cubelet you are running on (0..7) by referencing '''SELF_ID''', and then the various API routines will often let you specify a screen where you want to do something on that screen.&lt;br /&gt;
&lt;br /&gt;
If you want to do something like have a RPG party moving in a maze from one screen to another, you will likely want to use the '''TOPOLOGY_getAdjacentFacelet()''' API routine to determine which cubelet+screen you will be moving to when you go off a particular edge of a screen.  If the movement ends up being to a different cubelet, you will accomplish this by using the API to send a '''message''' to that cubelet so that it can alter what it does in it's next ON_Render() execution to draw a marker for the party's location on the appropriate screen on the new cubelet.  (More details on this coming soon!)&lt;/div&gt;</summary>
		<author><name>Ratcliffe</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=PawnProgrammingNotes&amp;diff=16669</id>
		<title>PawnProgrammingNotes</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=PawnProgrammingNotes&amp;diff=16669"/>
		<updated>2023-05-06T05:50:23Z</updated>

		<summary type="html">&lt;p&gt;Ratcliffe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This &amp;quot;sub wiki&amp;quot; is being written (initially, at least) by me, ratcliffe. I have been doing software development for 30+ years in VB.NET, C#, C++ and Objective C.  This is my first experience with Pawn and of course with programming the WOWCUBE.  Feel free to drop me a DM in the WOWCUBE Discord if I've gotten anything wrong, or you can suggest a better way to do something, or want me to try to cover a specific topic.  I'm going to be making notes here as I build a basic RPG for the WOWCUBE.&lt;br /&gt;
&lt;br /&gt;
This is just a scaffolding for the moment, I will be fleshing out the listed items over the next few days.&lt;br /&gt;
&lt;br /&gt;
I also need to work to keep some terminology straight so I may change these terms a bit soon&lt;br /&gt;
&lt;br /&gt;
; cubelet or module&lt;br /&gt;
: one of the eight physical small cubes, each with three screens, in the WOWCUBE&lt;br /&gt;
; screen&lt;br /&gt;
: one of the three screens on a cubelet&lt;br /&gt;
; messaging&lt;br /&gt;
: the technique supported in the API to send a small packet of information to one or more other cubelets&lt;br /&gt;
----&lt;br /&gt;
Here are the current topics in place or coming soon!&lt;br /&gt;
&lt;br /&gt;
* A few Pawn Language &amp;quot;gotchas&amp;quot;/reminders&lt;br /&gt;
** Statements do NOT have to be terminated with &amp;quot;;&amp;quot; (but I usually do it anyway out of habit)&lt;br /&gt;
** Declare variables with &amp;quot;new&amp;quot; (not &amp;quot;var&amp;quot;, etc.)&lt;br /&gt;
** You can use the built in words &amp;quot;true&amp;quot; and &amp;quot;false&amp;quot; to represent a boolean value and test for it with &amp;quot;if (x) { }&amp;quot; which will execute the code in braces if x is true&lt;br /&gt;
** Arrays can be up to three dimensions and indexes start at 0&lt;br /&gt;
** Use &amp;quot;==&amp;quot; (not &amp;quot;=&amp;quot;) to check for equivalence in an &amp;quot;if&amp;quot; statement&lt;br /&gt;
** Use &amp;quot;!=&amp;quot; instead of &amp;quot;&amp;lt;&amp;gt;&amp;quot; for &amp;quot;not equal to&amp;quot;&lt;br /&gt;
** You can enter numbers in hex by prefixing with 0x e.g. &amp;quot;0xFFFF0000&amp;quot; is used as an ARGB value for the color red&lt;br /&gt;
** &amp;quot;if&amp;quot; statements with more than one condition require an extra set of () around the whole expression e.g. &amp;quot;if ((x==1)||(x==2)) {}&amp;quot;&lt;br /&gt;
** function definitions are not prefixed with &amp;quot;f&amp;quot; or &amp;quot;func&amp;quot; or &amp;quot;function&amp;quot; e.g. &amp;quot;abs(x) {if (x&amp;gt;=0) {return x} else {return -1*x}}&amp;quot; is a valid function definition&lt;br /&gt;
** you can begin a comment on a line by itself or at the end of a line with &amp;quot;//&amp;quot;. Use &amp;quot;/* .... */&amp;quot; for block comments ... block comments CANNOT be nested&lt;br /&gt;
* A few Visual Studio Code &amp;quot;gotchas&amp;quot;/reminders&lt;br /&gt;
* [[The basic concepts of running code on eight cubelets|Remembering that the WOWCUBE is &amp;quot;eight processors all running the same code&amp;quot;]]&lt;br /&gt;
* ON_Tick() vs ON_Render()&lt;br /&gt;
* [[Rendering Text and Graphics#AllAtOnce|You have to render everything on a screen at once!]]&lt;br /&gt;
* Physical cubelets and &amp;quot;virtual&amp;quot; mapping to them&lt;br /&gt;
* Dealing with differing orientation of the screens&lt;br /&gt;
* Putting text on a screen&lt;br /&gt;
* Basics of developing a simple map with tunnels&lt;br /&gt;
* The magic of TOPOLOGY_getAdjacentFacelet()&lt;br /&gt;
* How to handle moving from one screen to another (on the same or a different cubelet)&lt;br /&gt;
----&lt;br /&gt;
* Tricks when using the Emulator&lt;/div&gt;</summary>
		<author><name>Ratcliffe</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=Rendering_Text_and_Graphics&amp;diff=16668</id>
		<title>Rendering Text and Graphics</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=Rendering_Text_and_Graphics&amp;diff=16668"/>
		<updated>2023-05-06T05:47:16Z</updated>

		<summary type="html">&lt;p&gt;Ratcliffe: Created page with &amp;quot;To put text and/or graphics on a cubelet screen, you put code in the ON_Render() routine.  This code would put some text on screen 0 on the cubelet where the code is running,...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To put text and/or graphics on a cubelet screen, you put code in the ON_Render() routine.&lt;br /&gt;
&lt;br /&gt;
This code would put some text on screen 0 on the cubelet where the code is running, displaying the cubelet # and the screen #, and a small blue circle.&lt;br /&gt;
&lt;br /&gt;
 GFX_setRenderTarget(0);&lt;br /&gt;
 GFX_drawText([ 120,180 ], TEXT_SIZE, 0, 0, TEXT_ALIGN_CENTER, 0xFF0000FF, &amp;quot;md: %d sn:%d&amp;quot;, SELF_ID,0);&lt;br /&gt;
 GFX_drawSolidCircleXY(80,80,10,0xFF0000FF);&lt;br /&gt;
 GFX_render();&lt;br /&gt;
&lt;br /&gt;
* Once you call GFX_setRenderTarget, everything currently on that screen is erased&lt;br /&gt;
* Once you call GFX_Render, all of the calls after the previous GFX_setRenderTarget will &amp;quot;take effect&amp;quot;&lt;br /&gt;
* &amp;lt;span id=&amp;quot;AllAtOnce&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;The upshot of this is that anything you want to appear on the screen has to all be executed between those two statements.  You can render some text in one place and add more text or circles in another place.   Therefore you may have a lot of logic in ON_Render to determine what should be drawn at any given time.&lt;/div&gt;</summary>
		<author><name>Ratcliffe</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=PawnProgrammingNotes&amp;diff=16667</id>
		<title>PawnProgrammingNotes</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=PawnProgrammingNotes&amp;diff=16667"/>
		<updated>2023-05-06T05:37:49Z</updated>

		<summary type="html">&lt;p&gt;Ratcliffe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This &amp;quot;sub wiki&amp;quot; is being written (initially, at least) by me, ratcliffe. I have been doing software development for 30+ years in VB.NET, C#, C++ and Objective C.  This is my first experience with Pawn and of course with programming the WOWCUBE.  Feel free to drop me a DM in the WOWCUBE Discord if I've gotten anything wrong, or you can suggest a better way to do something, or want me to try to cover a specific topic.  I'm going to be making notes here as I build a basic RPG for the WOWCUBE.&lt;br /&gt;
&lt;br /&gt;
This is just a scaffolding for the moment, I will be fleshing out the listed items over the next few days.&lt;br /&gt;
&lt;br /&gt;
I also need to work to keep some terminology straight so I may change these terms a bit soon&lt;br /&gt;
&lt;br /&gt;
; cubelet or module&lt;br /&gt;
: one of the eight physical small cubes, each with three screens, in the WOWCUBE&lt;br /&gt;
; screen&lt;br /&gt;
: one of the three screens on a cubelet&lt;br /&gt;
; messaging&lt;br /&gt;
: the technique supported in the API to send a small packet of information to one or more other cubelets&lt;br /&gt;
----&lt;br /&gt;
Here are the current topics in place or coming soon!&lt;br /&gt;
&lt;br /&gt;
* A few Pawn Language &amp;quot;gotchas&amp;quot;/reminders&lt;br /&gt;
** Statements do NOT have to be terminated with &amp;quot;;&amp;quot; (but I usually do it anyway out of habit)&lt;br /&gt;
** Declare variables with &amp;quot;new&amp;quot; (not &amp;quot;var&amp;quot;, etc.)&lt;br /&gt;
** You can use the built in words &amp;quot;true&amp;quot; and &amp;quot;false&amp;quot; to represent a boolean value and test for it with &amp;quot;if (x) { }&amp;quot; which will execute the code in braces if x is true&lt;br /&gt;
** Arrays can be up to three dimensions and indexes start at 0&lt;br /&gt;
** Use &amp;quot;==&amp;quot; (not &amp;quot;=&amp;quot;) to check for equivalence in an &amp;quot;if&amp;quot; statement&lt;br /&gt;
** Use &amp;quot;!=&amp;quot; instead of &amp;quot;&amp;lt;&amp;gt;&amp;quot; for &amp;quot;not equal to&amp;quot;&lt;br /&gt;
** You can enter numbers in hex by prefixing with 0x e.g. &amp;quot;0xFFFF0000&amp;quot; is used as an ARGB value for the color red&lt;br /&gt;
** &amp;quot;if&amp;quot; statements with more than one condition require an extra set of () around the whole expression e.g. &amp;quot;if ((x==1)||(x==2)) {}&amp;quot;&lt;br /&gt;
** function definitions are not prefixed with &amp;quot;f&amp;quot; or &amp;quot;func&amp;quot; or &amp;quot;function&amp;quot; e.g. &amp;quot;abs(x) {if (x&amp;gt;=0) {return x} else {return -1*x}}&amp;quot; is a valid function definition&lt;br /&gt;
** you can begin a comment on a line by itself or at the end of a line with &amp;quot;//&amp;quot;. Use &amp;quot;/* .... */&amp;quot; for block comments ... block comments CANNOT be nested&lt;br /&gt;
* A few Visual Studio Code &amp;quot;gotchas&amp;quot;/reminders&lt;br /&gt;
* Remembering that the WOWCUBE is &amp;quot;eight processors all running the same code&amp;quot;&lt;br /&gt;
* ON_Tick() vs ON_Render()&lt;br /&gt;
* [[Rendering Text and Graphics#AllAtOnce|You have to render everything on a screen at once!]]&lt;br /&gt;
* Physical cubelets and &amp;quot;virtual&amp;quot; mapping to them&lt;br /&gt;
* Dealing with differing orientation of the screens&lt;br /&gt;
* Putting text on a screen&lt;br /&gt;
* Basics of developing a simple map with tunnels&lt;br /&gt;
* The magic of TOPOLOGY_getAdjacentFacelet()&lt;br /&gt;
* How to handle moving from one screen to another (on the same or a different cubelet)&lt;br /&gt;
----&lt;br /&gt;
* Tricks when using the Emulator&lt;/div&gt;</summary>
		<author><name>Ratcliffe</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=PawnProgrammingNotes&amp;diff=16666</id>
		<title>PawnProgrammingNotes</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=PawnProgrammingNotes&amp;diff=16666"/>
		<updated>2023-05-05T03:29:21Z</updated>

		<summary type="html">&lt;p&gt;Ratcliffe: New root page for the Pawn Programming Notes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This &amp;quot;sub wiki&amp;quot; is being written (initially, at least) by me, ratcliffe. I have been doing software development for 30+ years in VB.NET, C#, C++ and Objective C.  This is my first experience with Pawn and of course with programming the WOWCUBE.  Feel free to drop me a DM in the WOWCUBE Discord if I've gotten anything wrong, or you can suggest a better way to do something, or want me to try to cover a specific topic.  I'm going to be making notes here as I build a basic RPG for the WOWCUBE.&lt;br /&gt;
&lt;br /&gt;
This is just a scaffolding for the moment, I will be fleshing out the listed items over the next few days.&lt;br /&gt;
&lt;br /&gt;
I also need to work to keep some terminology straight so I may change these terms a bit soon&lt;br /&gt;
&lt;br /&gt;
; cubelet or module&lt;br /&gt;
: one of the eight physical small cubes, each with three screens, in the WOWCUBE&lt;br /&gt;
; screen&lt;br /&gt;
: one of the three screens on a cubelet&lt;br /&gt;
; messaging&lt;br /&gt;
: the technique supported in the API to send a small packet of information to one or more other cubelets&lt;br /&gt;
----&lt;br /&gt;
Here are the current topics in place or coming soon!&lt;br /&gt;
&lt;br /&gt;
* A few Pawn Language &amp;quot;gotchas&amp;quot;/reminders&lt;br /&gt;
* A few Visual Studio Code &amp;quot;gotchas&amp;quot;/reminders&lt;br /&gt;
* Remembering that the WOWCUBE is &amp;quot;eight processors all running the same code&amp;quot;&lt;br /&gt;
* ON_Tick() vs ON_Render()&lt;br /&gt;
* You have to render everything on a screen at once!&lt;br /&gt;
* Physical cubelets and &amp;quot;virtual&amp;quot; mapping to them&lt;br /&gt;
* Dealing with differing orientation of the screens&lt;br /&gt;
* Putting text on a screen&lt;br /&gt;
* Basics of developing a simple map with tunnels&lt;br /&gt;
* The magic of TOPOLOGY_getAdjacentFacelet()&lt;br /&gt;
* How to handle moving from one screen to another (on the same or a different cubelet)&lt;br /&gt;
----&lt;br /&gt;
* Tricks when using the Emulator&lt;/div&gt;</summary>
		<author><name>Ratcliffe</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=Development&amp;diff=16665</id>
		<title>Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=Development&amp;diff=16665"/>
		<updated>2023-05-05T03:04:23Z</updated>

		<summary type="html">&lt;p&gt;Ratcliffe: Start of new Developer Notes Page (thanks to Christof and Wishnewsky for giving me this opportunity).  I am an experienced software developer but this is my first experience with Pawn and my first experience programming for the WOWCUBE.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Developing WOWCube-specific applications&lt;br /&gt;
&lt;br /&gt;
 If you have a coding question, consider visiting '''#how-to''' in our Discord's Code Desk (https://discord.gg/kCay3Rdbst) for getting help from fellow developers and official support both.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WOWCube offers several programming paradigms. Development of specialized applications (cubelets) can be carried out:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===in PAWN. Pawn language is a derivative of “Small C”===&lt;br /&gt;
 (See [https://github.com/compuphase/pawn/blob/master/doc/Pawn_Language_Guide.pdf Pawn_Language_Guide.pdf], and [https://wiki.alliedmods.net/Pawn_Tutorial Pawn Tutorial])&lt;br /&gt;
:: [[API|WOWCube PAWN API (Cube-specific Pawn functions)]]&lt;br /&gt;
:: [[PawnProgrammingNotes|(New) &amp;quot;How To's&amp;quot; of Pawn Programming]]&lt;br /&gt;
&lt;br /&gt;
===C/C++/Rust using [https://webassembly.org/ WebAssembly] ( based on wasm3 )=== &lt;br /&gt;
:: [[WASM|WOWCube WASM API (Cube-specific Wasm functions)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===also with our DevKit=== &lt;br /&gt;
&lt;br /&gt;
:: [[SDK|WOWCube DevKit Guide]]&lt;br /&gt;
&lt;br /&gt;
:WOWCube DevKit is the multi-platform software bundle that allows developers to streamline the programming workflow for WOWCube device using only Mac/PC or a laptop, before testing games/apps on a physical cube. &lt;br /&gt;
:Utilizing the VSC plugin included in the DevKit, apps can be transferred to a cube via Bluetooth 4.2 as well.&lt;/div&gt;</summary>
		<author><name>Ratcliffe</name></author>
		
	</entry>
</feed>