home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Games / Arashi 1.1.1 / source code / Game Source / (Level shape Editor) / src / Spedit.c < prev   
Encoding:
C/C++ Source or Header  |  1992-10-28  |  5.7 KB  |  325 lines  |  [TEXT/KAHL]

  1. /*/
  2.      Project Arashi: Spedit.c
  3.      Major release: Version 1.1d2, 9/5/95
  4.  
  5.      Last modification: Wednesday, October 28, 1992, 23:37
  6.      Created: Sunday, February 5, 1989, 22:32
  7.  
  8.      Copyright © 1989-1992, Juri Munkki
  9. /*/
  10.  
  11. #include <Math.h>
  12. #define    PI 3.1415926535
  13.  
  14. #define MAXSEGS    48
  15. #define    ANGLES    120
  16. #define OLDANGLES 64
  17. typedef struct
  18. {
  19.     int        numsegs;
  20.     char    wraps;
  21.     char    seglen;
  22.     char    xoff;
  23.     char    yoff;
  24.     int        filler;
  25.     int        ang[MAXSEGS];
  26. }    shape;
  27.  
  28. WindowPtr    MyWind;
  29. EventRecord    Event;
  30. char        thechar;
  31. Point        Mouse,where;
  32. int            CurEdit;
  33. int            CurRes;
  34. int            Multiplier=4;
  35. shape        space;
  36.  
  37. int        Sins[ANGLES+1];
  38. int        Cosins[ANGLES+1];
  39.  
  40. void    LoadSpace(num)
  41. int        num;
  42. {
  43.     Handle        Spce;
  44.     
  45.     Spce=GetResource('SPCE',num);
  46.     if(Spce)
  47.     {    space=**(shape **)Spce;
  48.         ReleaseResource(Spce);
  49.     }
  50.     else
  51.     {    SysBeep(10);
  52.     }
  53. }
  54. void    SaveSpace(num)
  55. int        num;
  56. {
  57.     Handle        Spce;
  58.     int            zip=0;
  59.     
  60.     Spce=GetResource('SPCE',num);
  61.     if(Spce==0)
  62.     {    Spce=GetResource('SPCE',100);
  63.         DetachResource(Spce);
  64.         AddResource(Spce,'SPCE',num,&zip);
  65.     }
  66.     SetHandleSize(Spce,sizeof(space));
  67.     **(shape **)Spce=space;
  68.     ChangedResource(Spce);
  69.     WriteResource(Spce);
  70.     ReleaseResource(Spce);
  71. }
  72. int        QueryNum(num)
  73. int        num;
  74. {
  75.     char        numstr[256];
  76.     DialogPtr    MyDialog;
  77.     int            hit;
  78.     Handle        item;
  79.     Rect        Garbage;
  80.     long        thenum;
  81.     
  82.     NumToString(num,numstr);
  83.     MyDialog=GetNewDialog(200,0,(WindowPtr)-1);
  84.     GetDItem(MyDialog,3,&Garbage,&item,&Garbage);
  85.     SetIText(item,numstr);
  86.     ShowWindow(MyDialog);
  87.     do    {    ModalDialog(0,&hit);
  88.         }    while(hit!=1);
  89.     GetIText(item,numstr);
  90.     StringToNum(numstr,&thenum);
  91.     DisposDialog(MyDialog);
  92.  
  93.     return thenum;
  94. }
  95. void    InitSins()
  96. {
  97.     double    a;
  98.     double    b;
  99.     int        i;
  100.     
  101.     a=0.0;
  102.     b=PI/(ANGLES/2);
  103.     for(i=0;i<=ANGLES;i++)
  104.     {    Sins[i]=8192*sin(a);
  105.         Cosins[i]=8192*cos(a);
  106.         a+=b;
  107.     }
  108. }
  109. void    SmallCross()
  110. {
  111.     Move(-3,-3);
  112.     Line(6,6);
  113.     Move(-6,0);
  114.     Line(6,-6);
  115.     Move(-3,3);
  116. }
  117. void    DrawSpace()
  118. {
  119.     int        i;
  120.     double    a,x,y;
  121.     char    num[32];
  122.  
  123.     EraseRect(&MyWind->portRect);
  124.     MoveTo(20,20);
  125.     NumToString(space.seglen,num);
  126.     DrawString(num);
  127.     DrawString("\p, ");
  128.     NumToString(Multiplier,num);
  129.     DrawString(num);
  130.     DrawChar(' ');
  131.     if(space.wraps)
  132.         DrawChar('W');
  133.     a=0;
  134.     x=where.h;
  135.     y=where.v;
  136.     for(i=0;i<space.numsegs;i++)
  137.     {    MoveTo((int)(x+0.5),(int)(y+0.5));
  138.         a+=space.ang[i];
  139.         if(i==CurEdit)    PenSize(2,2);
  140.         SmallCross();        
  141.         x+=cos(a/ANGLES*PI*2)*space.seglen;
  142.         y+=-sin(a/ANGLES*PI*2)*space.seglen;
  143.         LineTo((int)(x+0.5),(int)(y+0.5));
  144.         if(i==CurEdit)    PenSize(1,1);
  145.     }
  146.     SmallCross();
  147. }
  148. void    DoMouseDown()
  149. {
  150.     int        i;
  151.     double    a,x,y,x2,y2,x3,y3;
  152.     char    num[32];
  153.  
  154.     EraseRect(&MyWind->portRect);
  155.     MoveTo(20,20);
  156.     NumToString(space.seglen,num);
  157.     DrawString(num);
  158.     a=0;
  159.     x=where.h;
  160.     y=where.v;
  161.     for(i=0;i<space.numsegs;i++)
  162.     {    x2=300.0+(x-300.0)*.2;
  163.         y2=200.0+(y-200.0)*.2;
  164.         MoveTo((int)(x2+0.5),(int)(y2+0.5));
  165.         LineTo((int)(x+0.5),(int)(y+0.5));
  166.         a+=space.ang[i];
  167.         x+=cos(a/ANGLES*PI*2)*space.seglen;
  168.         y+=-sin(a/ANGLES*PI*2)*space.seglen;
  169.         LineTo((int)(x+0.5),(int)(y+0.5));
  170.         x3=300.0+(x-300.0)*.2;
  171.         y3=200.0+(y-200.0)*.2;
  172.         LineTo((int)(x3+0.5),(int)(y3+0.5));
  173.         LineTo((int)(x2+0.5),(int)(y2+0.5));
  174.     }
  175.     while(Button());
  176. }
  177. void    DoKeyHit()
  178. {
  179.     int        amount=Multiplier;
  180.     
  181.     if(Event.modifiers & shiftKey)
  182.     {    amount*=2;
  183.     }
  184.     if(Event.modifiers & alphaLock)
  185.     {    amount*=2;
  186.     }
  187.     switch(thechar)
  188.     {    case '6':
  189.             space.ang[CurEdit]=(space.ang[CurEdit]-amount) % ANGLES;
  190.             break;
  191.         case '8':
  192.             CurEdit+=1;
  193.             if(CurEdit>=space.numsegs)    CurEdit=0;
  194.             break;
  195.         case '4':
  196.             space.ang[CurEdit]=(space.ang[CurEdit]+amount) % ANGLES;
  197.             break;
  198.         case '5':
  199.             CurEdit-=1;
  200.             if(CurEdit<0)    CurEdit=space.numsegs-1;
  201.             break;
  202.         case '1':
  203.             Multiplier=1;
  204.             break;
  205.         case '2':
  206.             Multiplier=2;
  207.             break;
  208.         case '3':
  209.             Multiplier=3;
  210.             break;
  211.         case 3:
  212.             Multiplier=5;
  213.             break;
  214.         case '+':
  215.             space.numsegs++;
  216.             if(space.numsegs>MAXSEGS)        space.numsegs--;
  217.             break;
  218.         case '-':
  219.             space.numsegs--;
  220.             if(space.numsegs<=0)            space.numsegs=1;
  221.             if(CurEdit>=space.numsegs)        CurEdit=space.numsegs-1;
  222.             break;
  223.         case '*':
  224.             space.seglen+=amount;
  225.             break;
  226.         case '/':
  227.             space.seglen-=amount;
  228.             break;
  229.         case '0':    /*    Insert segment    */
  230.             space.numsegs++;
  231.             if(space.numsegs>MAXSEGS)        space.numsegs--;
  232.             else
  233.             {    for(amount=space.numsegs;amount>CurEdit;amount--)
  234.                     space.ang[amount]=space.ang[amount-1];
  235.             }
  236.             break;
  237.         case ',':
  238.         case '.':
  239.             space.numsegs--;
  240.             if(space.numsegs<=0)            space.numsegs=1;
  241.             else
  242.             {    for(amount=CurEdit;amount<=space.numsegs;amount++)
  243.                     space.ang[amount]=space.ang[amount+1];
  244.             }
  245.             break;
  246.         case 's':
  247.         case 'S':
  248.             CurRes=QueryNum(CurRes);
  249.             SaveSpace(CurRes);
  250.             break;
  251.         case 'l':
  252.         case 'L':
  253.             CurRes=QueryNum(CurRes);
  254.             LoadSpace(CurRes);
  255.             break;
  256.         case ' ':
  257.             HideCursor();
  258.             break;
  259.         case '@':
  260.             ShowCursor();
  261.             break;
  262.         case '_':
  263.             for(amount=0;amount<space.numsegs;amount++)
  264.             {    space.ang[amount]=(space.ang[amount]*ANGLES)/OLDANGLES;
  265.             }
  266.             break;
  267.         case 9:
  268.             CreateFit();
  269.             while(!EventAvail(everyEvent,&Event));
  270.             break;
  271.         case '7':
  272.             TestFlip();
  273.             break;
  274.         case 'W':
  275.         case 'w':
  276.             space.wraps = !space.wraps;
  277.     }
  278.     DrawSpace();
  279. }
  280. void    main()
  281. {
  282.     CursHandle    cross;
  283.     
  284.     DoInits();
  285.     cross=GetCursor(crossCursor);
  286.     HLock(cross);
  287.     SetCursor(*cross);
  288.     
  289.     MyWind=GetNewWindow(100,0,(WindowPtr)-1);
  290.     SetPort(MyWind);
  291.     InitSins();
  292.     CurRes=100;
  293.     LoadSpace(CurRes);
  294.     GetMouse(&Mouse);
  295.     thechar=' ';
  296.     
  297.     do
  298.     {    if(GetNextEvent(everyEvent,&Event))
  299.         {    switch(Event.what)
  300.             {    case updateEvt:
  301.                     BeginUpdate(MyWind);
  302.                     DrawSpace();
  303.                     EndUpdate(MyWind);
  304.                     break;
  305.                 case keyDown:
  306.                 case autoKey:
  307.                     thechar=Event.message;
  308.                     DoKeyHit();
  309.                     break;
  310.                 case mouseDown:
  311.                     DoMouseDown();
  312.                     break;
  313.                 default:
  314.                     break;
  315.             }
  316.         }
  317.         if(Event.where.h != Mouse.h || Event.where.v != Mouse.v)
  318.         {    Mouse=Event.where;
  319.             where=Mouse;
  320.             GlobalToLocal(&where);
  321.             DrawSpace();
  322.         }
  323.     } while(thechar!=27);
  324.  
  325. }