home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #7 / amigamamagazinepolishissue1998.iso / rozrywka / rpg / amigamud / src / basics / icons.m < prev    next >
Text File  |  1997-01-30  |  19KB  |  661 lines

  1. /*
  2.  * Amiga MUD
  3.  *
  4.  * Copyright (c) 1997 by Chris Gray
  5.  */
  6.  
  7. /*
  8.  * icons.m - code for dealing with icons.
  9.  */
  10.  
  11. private tp_icons CreateTable()$
  12. use tp_icons
  13.  
  14. /*
  15.  * ShowIcon - show this machine's icon to anyone here.
  16.  */
  17.  
  18. define t_icons proc utility public ShowIconOnce(thing th)void:
  19.     thing me;
  20.  
  21.     if GOn(th) then
  22.     me := Me();
  23.     GShowIcon(th, me, not me@p_pStandard, Parent(me) ~= nil);
  24.     fi;
  25. corp;
  26.  
  27. define t_icons proc utility public ShowIcon()void:
  28.  
  29.     ForEachAgent(Here(), ShowIconOnce);
  30. corp;
  31.  
  32. /*
  33.  * DoShowIcon - handy for ForceAction on an arriving entity.
  34.  */
  35.  
  36. define t_icons proc utility public DoShowIcon()status:
  37.  
  38.     ShowIcon();
  39.     continue
  40. corp;
  41.  
  42. /*
  43.  * UnShowIcon - remove my icon from anyone else here.
  44.  */
  45.  
  46. define t_icons proc utility UnShowIconOnce(thing th)void:
  47.     thing me;
  48.  
  49.     if GOn(th) then
  50.     me := Me();
  51.     if (me@p_pIcon ~= nil or me@p_pStandard) and Parent(me) = nil then
  52.         /* If the player or machine has a specific icon, or this is a
  53.            player or a "standard" machine (Packrat, etc.), and this is
  54.            not a cloned entity, then we just tell the client to undisplay
  55.            the icon, but to remember it for later use. */
  56.         GRemoveIcon(th, me);
  57.     else
  58.         /* Otherwise, we tell the client to undisplay the icon, but also
  59.            to forget it, since the thing associated with it may be reused
  60.            later for something with a different icon. */
  61.         GDeleteIcon(th, me);
  62.     fi;
  63.     fi;
  64. corp;
  65.  
  66. define t_icons proc utility public UnShowIcon()void:
  67.  
  68.     ForEachAgent(Here(), UnShowIconOnce);
  69. corp;
  70.  
  71. /*
  72.  * DoUnShowIcon - handy for ForceAction on a leaving entity.
  73.  */
  74.  
  75. define t_icons proc utility public DoUnShowIcon()status:
  76.  
  77.     UnShowIcon();
  78.     continue
  79. corp;
  80.  
  81. /*
  82.  * PrintIcon - print an icon in binary form.
  83.  */
  84.  
  85. define t_icons proc PrintIcon(list int icon)void:
  86.     int i, bits, j;
  87.  
  88.     Print("define t_icons proc makeXXXIcon()list int:\n");
  89.     Print("    list int li;\n\n");
  90.     Print("    li := CreateIntArray(8);\n");
  91.     for i from 0 upto 7 do
  92.     Print("    li[" + IntToString(i) + "] := 0b");
  93.     bits := icon[i];
  94.     for j from 0 upto 31 do
  95.         if bits < 0 then
  96.         Print("1");
  97.         else
  98.         Print("0");
  99.         fi;
  100.         bits := bits << 1;
  101.     od;
  102.     Print(";\n");
  103.     od;
  104.     Print("corp;\n");
  105. corp;
  106.  
  107. /*
  108.  * some specific icons
  109.  */
  110.  
  111. define t_icons proc makeCaretakerIcon()list int:
  112.     list int icon;
  113.  
  114.     icon := CreateIntArray(8);
  115.     icon[0] := 0b00000000000000000001100000000000;
  116.     icon[1] := 0b00011000000000000000110000000000;
  117.     icon[2] := 0b00001100000000000000011000000000;
  118.     icon[3] := 0b00000110000000000000001100000000;
  119.     icon[4] := 0b00000011000000000000000110000000;
  120.     icon[5] := 0b00000001111000000000001111100000;
  121.     icon[6] := 0b00000011111100000000000111110000;
  122.     icon[7] := 0b00000001100000000000000000000000;
  123.     icon
  124. corp;
  125.  
  126. define t_icons proc makePackratIcon()list int:
  127.     list int icon;
  128.  
  129.     icon := CreateIntArray(8);
  130.     icon[0] := 0b00000000000000000000000000000000;
  131.     icon[1] := 0b00000000000000000000000100000000;
  132.     icon[2] := 0b00000010100000000001101011100000;
  133.     icon[3] := 0b00100111100100000001111111100000;
  134.     icon[4] := 0b00000111010000000000110110100000;
  135.     icon[5] := 0b00010101011000000010001000000000;
  136.     icon[6] := 0b00100000000000000100000000000000;
  137.     icon[7] := 0b01000000000000000000000000000000;
  138.     icon
  139. corp;
  140.  
  141. define t_icons proc makePostmanIcon()list int:
  142.     list int icon;
  143.  
  144.     icon := CreateIntArray(8);
  145.     icon[0] := 0b00000000000000000000000000000000;
  146.     icon[1] := 0b00000000000000000000000000000000;
  147.     icon[2] := 0b01111111111111100111000000001110;
  148.     icon[3] := 0b01001100001100100100001111000010;
  149.     icon[4] := 0b01000000000000100111111111111110;
  150.     icon[5] := 0b00000000000000000000000000000000;
  151.     icon[6] := 0b00000000000000000000000000000000;
  152.     icon[7] := 0b00000000000000000000000000000000;
  153.     icon
  154. corp;
  155.  
  156. define t_icons proc makeQuestorIcon()list int:
  157.     list int icon;
  158.  
  159.     icon := CreateIntArray(8);
  160.     icon[0] := 0b00000000000000000000000000000000;
  161.     icon[1] := 0b00000111111000000001100000011000;
  162.     icon[2] := 0b00100000000001000100000000000010;
  163.     icon[3] := 0b01000000000000100100000000000010;
  164.     icon[4] := 0b01000000000000100100100000000010;
  165.     icon[5] := 0b01000110000000100010000110000100;
  166.     icon[6] := 0b00011000010110000000011111100000;
  167.     icon[7] := 0b00000000000111000000000000000011;
  168.     icon
  169. corp;
  170.  
  171. define t_icons proc makeMerlinIcon()list int:
  172.     list int icon;
  173.  
  174.     icon := CreateIntArray(8);
  175.     icon[0] := 0b00000000000000000000000000000000;
  176.     icon[1] := 0b00000001111110000000001000000100;
  177.     icon[2] := 0b00000100001110100000010000100110;
  178.     icon[3] := 0b00001000000100000000100000010000;
  179.     icon[4] := 0b00010010010010000001000110001000;
  180.     icon[5] := 0b00100111111001000010000110000100;
  181.     icon[6] := 0b01000010010000100100000000000010;
  182.     icon[7] := 0b00111111111111000000000000000000;
  183.     icon
  184. corp;
  185.  
  186. define t_icons proc makeWandererIcon()list int:
  187.     list int icon;
  188.  
  189.     icon := CreateIntArray(8);
  190.     icon[0] := 0b00000000000000000000011111100000;
  191.     icon[1] := 0b00001000000100000001000000001000;
  192.     icon[2] := 0b00100011110001000100010000100010;
  193.     icon[3] := 0b01001000000100100100100110010010;
  194.     icon[4] := 0b01001001100100100100100000010010;
  195.     icon[5] := 0b01000100001000100010001111000100;
  196.     icon[6] := 0b00010000000010000000100000010000;
  197.     icon[7] := 0b00000111111000000000000000000000;
  198.     icon
  199. corp;
  200.  
  201. /* The icons from here on are absolutely laughable! */
  202.  
  203. define t_icons proc makeBirdIcon()list int:
  204.     list int icon;
  205.  
  206.     icon := CreateIntArray(8);
  207.     icon[0] := 0b00000000000000000000011110000000;
  208.     icon[1] := 0b00011111110000000011111111100000;
  209.     icon[2] := 0b00111111111000000111111011111000;
  210.     icon[3] := 0b01111110011111100111111111110000;
  211.     icon[4] := 0b01111111111111100111111111110000;
  212.     icon[5] := 0b00111111111000000011111111000000;
  213.     icon[6] := 0b00011111110000000000011110000000;
  214.     icon[7] := 0b00000000000000000000000000000000;
  215.     icon
  216. corp;
  217.  
  218. define t_icons proc makeRockPileIcon()list int:
  219.     list int li;
  220.  
  221.     li := CreateIntArray(8);
  222.     li[0] := 0b00000000000000000000000000000000;
  223.     li[1] := 0b00000000000000000000000000000000;
  224.     li[2] := 0b00000000000000000000000000000000;
  225.     li[3] := 0b00000000000000000000110001110000;
  226.     li[4] := 0b00010010100010000001101110000100;
  227.     li[5] := 0b00110100101101000010100001001100;
  228.     li[6] := 0b01001011010100100100110010001010;
  229.     li[7] := 0b00110011011101000000000000000000;
  230.     li
  231. corp;
  232.  
  233. define t_icons proc makeSnakeIcon()list int:
  234.     list int li;
  235.  
  236.     li := CreateIntArray(8);
  237.     li[0] := 0b00000000000000000000000000000000;
  238.     li[1] := 0b00000000000000000000000000000000;
  239.     li[2] := 0b00110000000001100111100000011111;
  240.     li[3] := 0b11001100001101001000010000100010;
  241.     li[4] := 0b10000110001000001100011000110000;
  242.     li[5] := 0b01100011000100000000000110110000;
  243.     li[6] := 0b00000000111000000000000000000000;
  244.     li[7] := 0b00000000000000000000000000000000;
  245.     li
  246. corp;
  247.  
  248. define t_icons proc makeDeerIcon()list int:
  249.     list int li;
  250.  
  251.     li := CreateIntArray(8);
  252.     li[0] := 0b00000000000000000000000000000000;
  253.     li[1] := 0b00000000000000000000000000000000;
  254.     li[2] := 0b00000000000000000000000000000000;
  255.     li[3] := 0b00000000000010000000010000011100;
  256.     li[4] := 0b00000011111110000000011111110000;
  257.     li[5] := 0b00000111111000000000010000100000;
  258.     li[6] := 0b00000010001000000000001000010000;
  259.     li[7] := 0b00000000000000000000000000000000;
  260.     li
  261. corp;
  262.  
  263. define t_icons proc makeRatIcon()list int:
  264.     list int li;
  265.  
  266.     li := CreateIntArray(8);
  267.     li[0] := 0b00000000000000000000000000000000;
  268.     li[1] := 0b00000000000000000000011110000000;
  269.     li[2] := 0b00001111111000000011111111110000;
  270.     li[3] := 0b01111111111110000101111111110100;
  271.     li[4] := 0b10011011110111101000100001001000;
  272.     li[5] := 0b10010000001000000100000001000000;
  273.     li[6] := 0b01100000000000000001110000000000;
  274.     li[7] := 0b00000011000000000000000000000000;
  275.     li
  276. corp;
  277.  
  278. define t_icons proc makeDogIcon()list int:
  279.     list int li;
  280.  
  281.     li := CreateIntArray(8);
  282.     li[0] := 0b00000000000000000000000000000000;
  283.     li[1] := 0b00000000000000000000000000000000;
  284.     li[2] := 0b00000010000000000000011000000000;
  285.     li[3] := 0b00000111000000000000110110000000;
  286.     li[4] := 0b00011110111000000011111111110000;
  287.     li[5] := 0b01111111111100001111111001000000;
  288.     li[6] := 0b11111100001000001111110000000000;
  289.     li[7] := 0b11111100000000001111110000000000;
  290.     li
  291. corp;
  292.  
  293. define t_icons proc makeGremlinIcon()list int:
  294.     list int li;
  295.  
  296.     li := CreateIntArray(8);
  297.     li[0] := 0b00000000000000000000001111100000;
  298.     li[1] := 0b00000111111100000000111000111000;
  299.     li[2] := 0b00001100000110000001100000000000;
  300.     li[3] := 0b00011000000000000001100000111100;
  301.     li[4] := 0b00011000001111000001110000011000;
  302.     li[5] := 0b00001110000110000000011111111000;
  303.     li[6] := 0b00000011111100000000000000000000;
  304.     li[7] := 0b00000000000000000000000000000000;
  305.     li
  306. corp;
  307.  
  308. define t_icons proc makeBearIcon()list int:
  309.     list int li;
  310.  
  311.     li := CreateIntArray(8);
  312.     li[0] := 0b00000000000000000000000110000000;
  313.     li[1] := 0b00000011011000000001001111100000;
  314.     li[2] := 0b00011001110000000001100110001100;
  315.     li[3] := 0b00001111110110000000011111110000;
  316.     li[4] := 0b00000111111000000000011111100000;
  317.     li[5] := 0b00000011111000000000001111000000;
  318.     li[6] := 0b00000011110000000000011001000000;
  319.     li[7] := 0b00000100001000000000010000100000;
  320.     li
  321. corp;
  322.  
  323. define t_icons proc makeMooseIcon()list int:
  324.     list int li;
  325.  
  326.     li := CreateIntArray(8);
  327.     li[0] := 0b00000000010010100000000001001010;
  328.     li[1] := 0b00000010110001110000011100100100;
  329.     li[2] := 0b00000000001011000000000111010000;
  330.     li[3] := 0b00000000100100000000000001111100;
  331.     li[4] := 0b00000011111111100000011111111011;
  332.     li[5] := 0b00001111111111110001111111100110;
  333.     li[6] := 0b01111111100000001111111100000000;
  334.     li[7] := 0b11111111000000001111111000000000;
  335.     li
  336. corp;
  337.  
  338. define t_icons proc makeTrollIcon()list int:
  339.     list int li;
  340.  
  341.     li := CreateIntArray(8);
  342.     li[0] := 0b00000000000000000000000000000000;
  343.     li[1] := 0b00000000000000000011111111110000;
  344.     li[2] := 0b00111111111100000011001100110000;
  345.     li[3] := 0b00000011000000000000001100000000;
  346.     li[4] := 0b00000011000000000000001100000000;
  347.     li[5] := 0b00000011000000000000001100000000;
  348.     li[6] := 0b00000111100000000000011110000000;
  349.     li[7] := 0b00000000000000000000000000000000;
  350.     li
  351. corp;
  352.  
  353. define t_icons proc makeWolfIcon()list int:
  354.     list int li;
  355.  
  356.     li := CreateIntArray(8);
  357.     li[0] := 0b00001000000000000001100000000000;
  358.     li[1] := 0b00011000000000000011110000000000;
  359.     li[2] := 0b00111010000000000111100100000110;
  360.     li[3] := 0b11111001100111111111111111111111;
  361.     li[4] := 0b11111111111111111111111111100101;
  362.     li[5] := 0b11111111111100001111111111110101;
  363.     li[6] := 0b11111111111111111111100000001111;
  364.     li[7] := 0b11110000000000001110000000000000;
  365.     li
  366. corp;
  367.  
  368. define t_icons proc makeGoblinIcon()list int:
  369.     list int li;
  370.  
  371.     li := CreateIntArray(8);
  372.     li[0] := 0b00000111110000000000111111100000;
  373.     li[1] := 0b00001110011100000001110000110000;
  374.     li[2] := 0b00011100001100000011100000000000;
  375.     li[3] := 0b00111000000000000011100000000000;
  376.     li[4] := 0b00111000000000000011100000000000;
  377.     li[5] := 0b00111000011110000001100001111000;
  378.     li[6] := 0b00011100001100000000110000110000;
  379.     li[7] := 0b00001111111000000000011111000000;
  380.     li
  381. corp;
  382.  
  383. define t_icons proc makeSpiderIcon()list int:
  384.     list int li;
  385.  
  386.     li := CreateIntArray(8);
  387.     li[0] := 0b00000000000000000100100010010000;
  388.     li[1] := 0b01001000100100000100100010010000;
  389.     li[2] := 0b00100101001000000001111111100100;
  390.     li[3] := 0b00111011011111100011110110111100;
  391.     li[4] := 0b00111101101111000011101101111110;
  392.     li[5] := 0b00011111111001000010010100100000;
  393.     li[6] := 0b01001000100100000100100010010000;
  394.     li[7] := 0b01001000100100000000000000000000;
  395.     li
  396. corp;
  397.  
  398. define t_icons proc makeTSpiderIcon()list int:
  399.     list int li;
  400.  
  401.     li := CreateIntArray(8);
  402.     li[0] := 0b00000000000000000100100010010000;
  403.     li[1] := 0b01001000100100000100100010010000;
  404.     li[2] := 0b00100101001000000001111011100100;
  405.     li[3] := 0b00110011011111100011100010111100;
  406.     li[4] := 0b00110011011111000011111011111110;
  407.     li[5] := 0b00011111111001000010010100100000;
  408.     li[6] := 0b01001000100100000100100010010000;
  409.     li[7] := 0b01001000100100000000000000000000;
  410.     li
  411. corp;
  412.  
  413.  
  414. /* routines for the icon editor */
  415.  
  416. define tp_icons EDIT_DONE_BUTTON     14$
  417. define tp_icons EDIT_CANCEL_BUTTON   15$
  418. define tp_icons EDIT_CLEAR_BUTTON    16$
  419. define tp_icons EDIT_REGION         2$
  420.  
  421. define tp_icons p_pEIRestoreAction CreateActionProp()$
  422. define tp_icons p_pEIEditIcon CreateIntListProp()$
  423. define tp_icons p_pEISaveButtonAction CreateActionProp()$
  424. define tp_icons p_pEISaveMouseAction CreateActionProp()$
  425. define tp_icons p_pEIIsCursor CreateBoolProp()$
  426.  
  427. define tp_icons proc showIconPixel(int x, y)void:
  428.     int rows, cols, xScale, yScale, xOffset, yOffset;
  429.     int n;
  430.  
  431.     rows := GRows(nil);
  432.     cols := GCols(nil);
  433.     xScale := (cols / 2 - 30) / 16;
  434.     yScale := (rows - 8) / 16;
  435.     xOffset := (cols / 2 - 30 - 16 * xScale) / 2;
  436.     yOffset := (rows - 8 - 16 * yScale) / 2;
  437.  
  438.     n := y * 16 + x;
  439.     if (Me()@p_pEIEditIcon[n >> 5] >> (31 - n & 0x1f)) & 1 ~= 0 then
  440.     GSetPen(nil, C_WHITE);
  441.     else
  442.     GSetPen(nil, C_BLACK);
  443.     fi;
  444.     GAMovePixels(nil, xOffset + x * xScale + 4, yOffset + y * yScale + 4);
  445.     GRectanglePixels(nil, xScale, yScale, true);
  446.     GAMovePixels(nil, cols / 2 - 20 + x, rows - 20 + y);
  447.     GPixel(nil);
  448. corp;
  449.  
  450. define tp_icons proc showWholeIcon()void:
  451.     int x, y;
  452.  
  453.     for x from 0 upto 15 do
  454.     for y from 0 upto 15 do
  455.         showIconPixel(x, y);
  456.     od;
  457.     od;
  458. corp;
  459.  
  460. define tp_icons proc iconEditMouseHandler(int n, x, y)void:
  461.  
  462.     if n = EDIT_REGION then
  463.     x := x / ((GCols(nil) / 2 - 30) / 16);
  464.     y := y / ((GRows(nil) - 8) / 16);
  465.     n := y * 16 + x;
  466.     Me()@p_pEIEditIcon[n >> 5] := Me()@p_pEIEditIcon[n >> 5] ><
  467.         (1 << (31 - n & 0x1f));
  468.     GUndrawIcons(nil);
  469.     showIconPixel(x, y);
  470.     GRedrawIcons(nil);
  471.     fi;
  472.     /* do not complain about other regions hit - MOVE_REGION is all around
  473.        EDIT_REGION, and we just want to ignore hits there. */
  474. corp;
  475.  
  476. define tp_icons proc iconEditReset()void: corp;
  477.  
  478. define tp_icons proc iconEditActiveAction()void:
  479.  
  480.     Print("\n* You were editing your icon or cursor when a backup was "
  481.       "made. The system is now running from that backup. Your edit "
  482.       "changes have been lost. *\n\n");
  483.     iconEditReset();
  484. corp;
  485.  
  486. replace iconEditReset()void:
  487.     thing me;
  488.  
  489.     me := Me();
  490.     DelElement(me@p_pEnterActions, iconEditActiveAction);
  491.     DelElement(me@p_pExitActions, iconEditReset);
  492.     me -- p_pEIIsCursor;
  493.     me -- p_pEIEditIcon;
  494.     ignore SetCharacterButtonAction(me@p_pEISaveButtonAction);
  495.     me -- p_pEISaveButtonAction;
  496.     ignore SetCharacterMouseDownAction(me@p_pEISaveMouseAction);
  497.     me -- p_pEISaveMouseAction;
  498.     me -- p_pEIRestoreAction;
  499. corp;
  500.  
  501. define t_icons proc EndIconEdit()void:
  502.     action a;
  503.  
  504.     a := Me()@p_pEIRestoreAction;
  505.     iconEditReset();
  506.     EraseButton(EDIT_DONE_BUTTON);
  507.     EraseButton(EDIT_CANCEL_BUTTON);
  508.     EraseButton(EDIT_CLEAR_BUTTON);
  509.     EraseRegion(EDIT_REGION);
  510.     GUndrawIcons(nil);
  511.     GSetPen(nil, C_BLACK);
  512.     GAMove(nil, 0.0, 0.0);
  513.     GRectangle(nil, 0.5, 1.0, true);
  514.     if a ~= nil then
  515.     call(a, void)();
  516.     fi;
  517.     GRedrawIcons(nil);
  518. corp;
  519.  
  520. define tp_icons proc iconEditButtonHandler(int whichButton)void:
  521.     thing me;
  522.     int i;
  523.     list int icon;
  524.  
  525.     me := Me();
  526.     case whichButton
  527.     incase EDIT_CLEAR_BUTTON:
  528.     icon := me@p_pEIEditIcon;
  529.     for i from 0 upto 7 do
  530.         icon[i] := 0b0;
  531.     od;
  532.     GUndrawIcons(nil);
  533.     showWholeIcon();
  534.     GRedrawIcons(nil);
  535.     incase EDIT_DONE_BUTTON:
  536.     if me@p_pEIIsCursor then
  537.         me@p_pCursor := me@p_pEIEditIcon;
  538.         SetCursorPattern(me@p_pCursor);
  539.     else
  540.         GNewIcon(me, me@p_pEIEditIcon);
  541.     fi;
  542.     EndIconEdit();
  543.     incase EDIT_CANCEL_BUTTON:
  544.     EndIconEdit();
  545.     default:
  546.     call(me@p_pEISaveButtonAction, void)(whichButton);
  547.     esac;
  548. corp;
  549.  
  550. define tp_icons proc copyIcon(list int old)list int:
  551.     list int new;
  552.     int i;
  553.  
  554.     new := CreateIntArray(8);
  555.     for i from 0 upto 7 do
  556.     new[i] := old[i];
  557.     od;
  558.     new
  559. corp;
  560.  
  561. define tp_icons EDIT_BOX_ID NextEffectId()$
  562.  
  563. define tp_icons proc startEdit()void:
  564.     thing me;
  565.     action a;
  566.     int i;
  567.     int rows, cols, xBase, yBase, xScale, yScale, xOffset, yOffset;
  568.  
  569.     me := Me();
  570.     if Character(me@p_pName) ~= nil then
  571.     /* Keep NPC's out of this. */
  572.     a := SetCharacterButtonAction(iconEditButtonHandler);
  573.     if a ~= nil then
  574.         me@p_pEISaveButtonAction := a;
  575.     fi;
  576.     a := SetCharacterMouseDownAction(iconEditMouseHandler);
  577.     if a ~= nil then
  578.         me@p_pEISaveMouseAction := a;
  579.     fi;
  580.     AddHead(me@p_pEnterActions, iconEditActiveAction);
  581.     AddHead(me@p_pExitActions, iconEditReset);
  582.  
  583.     if not KnowsEffect(nil, EDIT_BOX_ID) then
  584.         rows := GRows(nil);
  585.         cols := GCols(nil);
  586.         xBase := cols * 3 / 4;
  587.         yBase := rows / 2;
  588.         xScale := (cols / 2 - 30) / 16;
  589.         yScale := (rows - 8) / 16;
  590.         xOffset := (cols / 2 - 30 - 16 * xScale) / 2;
  591.         yOffset := (rows - 8 - 16 * yScale) / 2;
  592.  
  593.         DefineEffect(nil, EDIT_BOX_ID);
  594.         AddButtonPixels(xBase - 76, yBase + 33, EDIT_DONE_BUTTON, "Done");
  595.         AddButtonPixels(xBase - 32, yBase + 33,
  596.         EDIT_CANCEL_BUTTON, "Cancel");
  597.         AddButtonPixels(xBase + 28, yBase + 33, EDIT_CLEAR_BUTTON,"Clear");
  598.         AddRegionPixels(xOffset + 4, yOffset + 4,
  599.                 xScale * 16, yScale * 16,
  600.                 EDIT_REGION);
  601.         GUndrawIcons(nil);
  602.         RemoveCursor();
  603.         ClearGraphics();
  604.         for i from 0 upto 3 do
  605.         GSetPen(nil, i + 1);
  606.         GAMovePixels(nil, xOffset + i, yOffset + i);
  607.         GRectanglePixels(nil, xScale * 16 + 8 - 2 * i,
  608.                       yScale * 16 + 8 - 2 * i, false);
  609.         od;
  610.         EndEffect();
  611.     fi;
  612.     CallEffect(nil, EDIT_BOX_ID);
  613.     showWholeIcon();
  614.     GRedrawIcons(nil);
  615.     fi;
  616. corp;
  617.  
  618. define t_icons proc public StartIconEdit(action restoreAction)void:
  619.     list int icon;
  620.     thing me;
  621.  
  622.     me := Me();
  623.     if restoreAction ~= nil then
  624.     me@p_pEIRestoreAction := restoreAction;
  625.     fi;
  626.     icon := me@p_pIcon;
  627.     if icon = nil then
  628.     icon := CreateIntArray(8);
  629.     /* fill in the default smiley-face icon */
  630.     icon[0] := 0b00000000000000000000000000000000;
  631.     icon[1] := 0b00000011110000000000110000110000;
  632.     icon[2] := 0b00010000000010000001000000001000;
  633.     icon[3] := 0b00100110011001000010000000000100;
  634.     icon[4] := 0b00100000000001000010010000100100;
  635.     icon[5] := 0b00010011110010000001000000001000;
  636.     icon[6] := 0b00001100001100000000001111000000;
  637.     icon[7] := 0b00000000000000000000000000000000;
  638.     else
  639.     /* lists are true database objects - we cannot do a 'cancel' if we
  640.        just edit the original! */
  641.     icon := copyIcon(icon);
  642.     fi;
  643.     me@p_pEIEditIcon := icon;
  644.     me@p_pEIIsCursor := false;
  645.     startEdit();
  646. corp;
  647.  
  648. define t_icons proc public StartCursorEdit(action restoreAction)void:
  649.     thing me;
  650.  
  651.     me := Me();
  652.     if restoreAction ~= nil then
  653.     me@p_pEIRestoreAction := restoreAction;
  654.     fi;
  655.     me@p_pEIEditIcon := copyIcon(me@p_pCursor);
  656.     me@p_pEIIsCursor := true;
  657.     startEdit();
  658. corp;
  659.  
  660. unuse tp_icons
  661.