home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 2 / goldfish_vol2_cd2.bin / bbs / gfx / flaminator-1.5.lha / Flaminator / Flaminator.oprx next >
Text File  |  1994-09-09  |  25KB  |  918 lines

  1. /*                      FLAMINATOR v1.5b                           */
  2. /*                                                                 */
  3. /*                    ©1993 Carmen Rizzolo                         */
  4. /*                                                                 */
  5. /*                     for OpalPaint v1.4+                         */
  6. /*                                                                 */
  7.  
  8. /* History:                                                        */
  9. /* v0.9   2/24/93  Just Starting, but the program is pretty much   */
  10. /*                 done, in my head.                               */
  11. /* v0.95  2/25/93  The script is done and (semi-)functional, but   */
  12. /*                 it's bumping into bugs.  Needs a little         */
  13. /*                 polishing.                                      */
  14. /* v1.0   2/25/93  Finally done and fairly stable.  Consult        */
  15. /*                 documentation for more info.                    */
  16. /* v1.0a  2/25/93  Fixed version number in startup requestor.      */
  17. /*                 Fixed Method number in one of these goofy       */
  18. /*                 REMARK thingies.  Nothing that matters.         */
  19. /* v1.0b  2/26/93  Corrected some spelling errors in the           */
  20. /*                 documentation.                                  */
  21. /* v1.1   2/26/93  Vastly icreased speed.  By optimizing the       */
  22. /*                 diffusion and smoothing process.  Now uses Blur */
  23. /*                 DrawMode instead of Smooth to avoid the cross-  */
  24. /*                 hatch look.  Then Uses Smooth DrawMode for top  */
  25. /*                 scanline to repair Blur's sloppiness.  Only one */
  26. /*                 or two Smooth passes are really all you'll ever */
  27. /*                 need now.                                       */
  28. /*                 Also, the flames seem to look better now.       */
  29. /* v1.1b 2/26/93   Now only performs diffuse and blur operations   */
  30. /*                 from upper-left corner to brush-size + 25       */
  31. /*                 pixels.                                         */
  32. /* v1.1c 2/27/93   Now only performs diffuse and blur operations   */
  33. /*                 from upper-left of brush to lower-left of brush */
  34. /*                 MUCH faster.                                    */
  35. /* v1.1d 2/27/93   Speeded it up a bit more.  I don't think I can  */
  36. /*                 squeeze much more speed out of this thing!      */
  37. /* v1.1e 2/28/93   Do you want to go FASTER??! :)  I did it again. */
  38. /*                 It's turbo-charged, especially for Hi-Res work. */
  39. /*                 I also changed the sample images.  I think it   */
  40. /*                 makes a bit of a better animation now.          */
  41. /* v1.1f 3/2/93    Fixed some bad syntax.  Thanks for the          */
  42. /*                 correction Martin!                              */
  43. /* v1.2  3/6/93    By request, I added another 'method.'  Be       */
  44. /*                 sure to browse the documentation for a full     */
  45. /*                 explanation of how this works.                  */
  46. /* v1.2b 4/11/93   Fixed AskString requestors to be friendly with  */
  47. /*                 OpalPaint v2.3 and higher                       */
  48. /* v1.5  9/3/94    Upgraded requestors to take full advantage of   */
  49. /*                 OpalPaint v2.3's new Customizable requestors.   */
  50. /*                 Added Savable Default file feature              */
  51. /*                 Added Custom Flame colour-set feature.          */
  52. /*                 Added ability to visually preview your flame    */
  53. /*                 colour-set.                                     */
  54. /*                 Added ability to disable blur passes.  Why?     */
  55. /*                 HeckifIKnow!                                    */
  56. /* v1.5b           Added lables for hottest to coolest colours in  */
  57. /*                 the "Custom" flame colour settings area.        */
  58.  
  59. /*  See documentation for more information                         */
  60.  
  61. /* Initialization of variables.  Don't touch unless you know what
  62.    you are doing. */
  63.  
  64. ROOT = 'pic.'
  65. ZERO = '0'
  66. Options Results
  67. Address 'OpalPaint_Rexx'
  68.  
  69. Call Panic()
  70. Call VersionCheck()
  71. Call ConfirmFlaminator()
  72.  
  73. Call AskMethod()
  74. Call AskColour()
  75. Call AskFlamePrefs()
  76.  
  77. /* Get BackgroundSource pathname */
  78. If Method < 2 Then Do
  79.     Call GetDefaults()
  80.     PathNameDef = BkgndSrcPathDef
  81.     ReqTitle = 'Enter the pathname of your BACKGROUND source image(s)'
  82.     ReqHail = 'Get BACKGROUND animation PATH'
  83.     Call PathNameGetter()
  84.     BkgndSrcPathDef = PathNameDef
  85.     BackGroundSource = PathName
  86.     Call SaveDefaults()
  87.     End
  88.  
  89. If Method = 0 Then Call CheckDirForFiles()
  90.  
  91. /* Get FlameSource pathname */
  92. Call GetDefaults()
  93. PathNameDef = FlameSrcPathDef
  94. ReqTitle = 'Enter the pathname of your FLAME source image(s)'
  95. ReqHail = 'Get FLAME animation PATH'
  96. Call PathNameGetter()
  97. FlameSrcPathDef = PathNameDef
  98. FlameSource = PathName
  99. Call SaveDefaults()
  100.  
  101. If FlameSource = BackgroundSource Then Do
  102.     Okay 'FATAL ERROR!  The FLAME source images can NOT be in\nthe same drawer as the BACKGROUND source images.\nPlease make sure you are REALLY ready to launch this script.\nRead the documentation for more info.  Exiting...'
  103.     Exit
  104.     End
  105.  
  106. Call GetFlameNumbers()
  107.  
  108. /* Get Destination pathname for Method 0 or 2 */
  109. If Method ~= 1 Then Do
  110.     Call GetDefaults()
  111.     PathNameDef = DestPathDef
  112.     ReqTitle = 'Enter pathname for FLAMED DESTINATION images.'
  113.     ReqHail = 'Get DESTINATION animation PATH'
  114.     Call PathNameGetter()
  115.     DestPathDef = PathNameDef
  116.     FlameDest = PathName
  117.     Call SaveDefaults()
  118.  
  119.     If FlameDest = BackgroundSource Then Do
  120.         Okay 'FATAL ERROR!  The FLAMED destination images can NOT be in\nthe same drawer as the BACKGROUND source images.\nPlease make sure you are REALLY ready to launch this script.\nRead the documentation for more info.  Exiting...'
  121.         Exit
  122.         End
  123.     End
  124.  
  125. If Method = 1 Then Do
  126.     Call AskOverwrite()
  127.  
  128.     If Overwrite = 0 Then Do
  129.         Call GetDefaults()
  130.         PathNameDef = DestPathDef
  131.         ReqTitle = 'Enter pathname for FLAMED DESTINATION images.'
  132.         ReqHail = 'Get DESTINATION animation PATH'
  133.         Call PathNameGetter()
  134.         DestPathDef = PathNameDef
  135.         FlameDest = PathName
  136.         Call SaveDefaults()
  137.  
  138.         If FlameDest = BackgroundSource Then Do
  139.             Okay 'FATAL ERROR!  The FLAMED destination images can NOT be in\nthe same drawer as the BACKGROUND source images.\nPlease make sure you are REALLY ready to launch this script.\nRead the documentation for more info.  Exiting...'
  140.             Exit
  141.             End
  142.         End
  143.     End
  144.  
  145. If Method = 2 Then Do
  146.     Finder = Exists('Ram:Method2/')
  147.     If Finder = 0 Then Do
  148.         Address COMMAND
  149.         'Makedir ram:Method2'
  150.         End
  151.     BackgroundSource = 'Ram:Method2'
  152.     Address 'OpalPaint_Rexx'
  153.     Save BackgroundSource || '/pic.0001'
  154.     Method = 0
  155.     End
  156.  
  157. /* Here we go!!  I'll take it from here. */
  158. Address 'OpalPaint_Rexx'
  159. Okay 'Here we go.'
  160.  
  161. Call Panic()
  162.  
  163. Do A = StartFrame to EndFrame
  164.  
  165.     /* Get IFF Variables */
  166.     Iff = Root || Zero || Zero || Zero || A
  167.     If A < 10000 & A > 999 Then Iff = Root || A
  168.     If A < 1000 & A > 99 Then Iff = Root || Zero || A
  169.     If A < 100 & A > 9  Then Iff = Root || Zero || Zero || A
  170.  
  171.     /* Search for next FLAME frame and load*/
  172.     DisplayStatus 'Find ' || A
  173.     Finder = Exists(FlameSource || Iff)
  174.     If Finder = 1 Then Do
  175.         Load Flamesource || Iff
  176.         PageSize
  177.         Parse Var Result X2 Y2
  178.  
  179.         /* Set pots */
  180.         SetPot 1 0 0 0
  181.         SetPot 2 255 255 255
  182.         SetPot 3 FlameCol1
  183.         SetPot 4 FlameCol2
  184.         SetPot 5 FlameCol3
  185.         SetPot 6 FlameCol4
  186.         SetPot 7 1 1 1
  187.  
  188.         DisplayStatus 'Initialze'
  189.         Trans 0
  190.         Texture 0
  191.         FillMode SOLID
  192.         SetDrawMode 1
  193.         SmoothPaper
  194.         ActiveNozzle 1
  195.         MaskSten 0
  196.         ColSten 1
  197.  
  198.         /* Check for special brightness code */
  199.         If Method = 0 Then Do
  200.             DisplayStatus 'Code Check'
  201.             MethodCode = 1
  202.             ReadPixel 0 0
  203.             Parse Var Result R G B
  204.             If R > 0 Then MethodCode = 1
  205.             ReadPixel 1 0
  206.             Parse Var Result R G B
  207.             If R > 0 Then MethodCode = 2
  208.             ReadPixel 2 0
  209.             Parse Var Result R G B
  210.             If R > 0 Then MethodCode = 3
  211.             ReadPixel 3 0
  212.             Parse Var Result R G B
  213.             If R > 0 Then MethodCode = 4
  214.             ReadPixel 4 0
  215.             Parse Var Result R G B
  216.             If R > 0 Then MethodCode = 5
  217.             End
  218.  
  219.         /* Cleanup corner */
  220.         ActivePot 1
  221.         'StenEnable DISABLE'
  222.         Line 0 0 5 0
  223.  
  224.         /* Turn on Stencil to fix white to 255 255 255 */
  225.         DisplayStatus 'Fix White'
  226.         SetColSten 1 0 0 0 0 0 0 0
  227.         EnableColEntry 1 1
  228.         StenEnable 0
  229.         ActivePot 2
  230.         FreeHand 0 0
  231.         LastPoint 0 0
  232.         'StenEnable ENABLE'
  233.         RectCut 0 0 X2 Y2
  234.         'StenEnable DISABLE'
  235.         Handle 0 0
  236.         ColourSource 'PAINTPOT'
  237.         PutBrush 0 0
  238.         ColourSource 'MULTICOLOUR'
  239.  
  240.         BrushSize
  241.         parse var Result BX2 BY2
  242.  
  243.  
  244.         /* Pick up White flame image */
  245.         ActiveNozzle 1
  246.         NozzleSize 1 1
  247.         ActivePot 1
  248.         FreeHand 0 0
  249.         LastPoint 0 0
  250.         'StenEnable ENABLE'
  251.         DisplayStatus 'Get Brush'
  252.         ActiveBrush 2
  253.         RectCut 0 0 BX2 BY2
  254.         Handle 0 0
  255.  
  256.         /*Get upper-left Brush Sizer */
  257.         BrushSize
  258.         parse var Result BX1 BY1
  259.  
  260.         BX1 = BX2 - BX1
  261.         BY1 = BY2 - BY1
  262.         BX1 = BX1 - (FlameSize + 7)
  263.         BY1 = BY1 - (FlameSize + 7)
  264.         If BX1 < 0 Then BX1 = 0
  265.         If BY1 < 0 Then BY1 = 0
  266.  
  267.         BX2 = BX2 + (FlameSize + 7)
  268.         BY2 = BY2 + (FlameSize + 7)
  269.         If BX2 > X2 Then BX2 = X2
  270.         If BY2 > Y2 Then BY2 = Y2
  271.         'StenEnable DISABLE'
  272.  
  273.         /* Clean up corner again */
  274.         ActivePot 1
  275.         ActiveNozzle 1
  276.         NozzleSize 0 0
  277.         FreeHand 0 0
  278.         LastPoint 0 0
  279.         Point BX1 BY1
  280.         FreeHand BX1 BY1
  281.         LastPoint BX1 BY1
  282.  
  283.         /* Diffuse White flame image */
  284.         If DiffuseBool = 1 Then Do
  285.             DisplayStatus 'Diffuse 1'
  286.             SetSpare 1 Diffuse
  287.             SetDrawMode 19 FlameSize
  288.             SetDrawMode 19 FlameSize
  289.             SolidRect BX1 BY1 BX2 BY2
  290.             End
  291.  
  292.         /* Add 'Handle Dot' */
  293.         'StenEnable DISABLE'
  294.         DisplayStatus 'Handle Dot'
  295.         SetDrawMode 1
  296.         ActivePot 7
  297.         ActiveNozzle 1
  298.         NozzleSize 1 1
  299.         Point BX1 BY1
  300.         FreeHand BX1 BY1
  301.         LastPoint BX1 BY1
  302.  
  303.         /* Pick up White flame image */
  304.         'StenEnable ENABLE'
  305.         DisplayStatus 'Get Brush'
  306.         ActiveBrush 1
  307.         RectCut BX1 BY1 X2 Y2
  308.         Handle 0 0
  309.  
  310.         'StenEnable DISABLE'
  311.         ActiveNozzle 1
  312.         NozzleSize 1 1
  313.         Point BX1 BY1
  314.         FreeHand BX1 BY1
  315.         LastPoint BX1 BY1
  316.  
  317.         /* Outline Brush with flame colours */
  318.         ActiveBrush 1
  319.         ActivePot 3
  320.         NotBusy
  321.         Key 'o'
  322.         ActivePot 4
  323.         Key 'o'
  324.         Key 'o'
  325.         ActivePot 5
  326.         Key 'o'
  327.         Key 'o'
  328.         ActivePot 6
  329.         Key 'o'
  330.         Busy
  331.  
  332.         /* Stamp coloured brush down */
  333.         DisplayStatus 'stamping'
  334.         Handle 6 6
  335.         'StenEnable DISABLE'
  336.         ColourSource 'MULTICOLOUR'
  337.         PutBrush BX1 BY1
  338.  
  339.         /* Cleanup corner */
  340.         ActivePot 1
  341.         'StenEnable DISABLE'
  342.         NewBX1 = BX1 - 6
  343.         If NewBX1 < 0 Then NewBX1 = 0
  344.         NewBY1 = BY1 - 6
  345.         If NewBY1 < 0 Then NewBY1 = 0
  346.         SolidRect NewBX1 NewBY1 (BX1 + 6) (BY1 + 6)
  347.  
  348.         /* Diffuse Coloured flame image */
  349.         If DiffuseBool = 1 Then Do
  350.             DisplayStatus 'Diffuse 2'
  351.             SetDrawMode 19 FlameSize
  352.             SetDrawMode 19 FlameSize
  353.             SolidRect BX1 BY1 BX2 BY2
  354.             End
  355.  
  356.         /* Blur image */
  357.         If BlurValue > 0 Then Do
  358.             ActivePot 1
  359.             ActiveNozzle 1
  360.             NozzleSize 1 1
  361.             SetSpare 1 Blur
  362.             SetDrawMode 19 100
  363.             SetDrawMode 19 100
  364.             Do Smoothy = 1 to BlurValue
  365.                 SolidRect BX1 BY1 BX2 BY2
  366.                 End
  367.             SetDrawMode 16 100
  368.             SetDrawMode 16 100
  369.             Do SmoothyB = 1 to 4
  370.                 Line NewBX1 0 BX2 0
  371.                 End
  372.             End
  373.  
  374.         /* Repair Handle Dot */
  375.         SetDrawMode 1
  376.         ActivePot 7
  377.         Point BX1 BY1
  378.         FreeHand BX1 BY1
  379.         LastPoint BX1 BY1
  380.  
  381.         /* Pick up finished flame brush! */
  382.         ActiveBrush 1
  383.         RectCut BX1 BY1 BX2 BY2
  384.         Handle 0 0
  385.  
  386.         /* Method 0 */
  387.         If Method = 0 Then Do
  388.             If MethodCode = 1 Then Do
  389.                 Load BackgroundSource || 'pic.0001'
  390.                 End
  391.             If MethodCode = 2 Then Do
  392.                 Finder = Exists(BackgroundSource || 'pic.0002')
  393.                 If Finder = 0 Then Load BackgroundSource || 'pic.0001'
  394.                 If Finder = 1 Then Load BackgroundSource || 'pic.0002'
  395.                 End
  396.             If MethodCode = 3 Then Do
  397.                 Finder = Exists(BackgroundSource || '/pic.0003')
  398.                 If Finder = 0 Then Load BackgroundSource || 'pic.0001'
  399.                 If Finder = 1 Then Load BackgroundSource || 'pic.0003'
  400.                 End
  401.             If MethodCode = 4 Then Do
  402.                 Finder = Exists(BackgroundSource || '/pic.0004')
  403.                 If Finder = 0 Then Load BackgroundSource || 'pic.0001'
  404.                 If Finder = 1 Then Load BackgroundSource || 'pic.0004'
  405.                 End
  406.             If MethodCode = 5 Then Do
  407.                 Finder = Exists(BackgroundSource || '/pic.0005')
  408.                 If Finder = 0 Then Load BackgroundSource || 'pic.0001'
  409.                 If Finder = 1 Then Load BackgroundSource || 'pic.0005'
  410.                 End
  411.             End
  412.  
  413.         /* Method 1 */
  414.         If Method = 1 Then Do
  415.             Finder = Exists(BackgroundSource || Iff)
  416.             If Finder = 0 Then Do
  417.                 Okay 'FATAL ERROR!  Background source image is missing!\nSorry, gotta exit.'
  418.                 Exit
  419.                 End
  420.             Load BackGroundSource || Iff
  421.             End
  422.  
  423.         /* Add Fire to image */
  424.         SetDrawMode 2 100
  425.         ActiveBrush 1
  426.         Handle 0 0
  427.         Do Loopsy = 1 to FlameIntensity
  428.             Putbrush BX1 BY1
  429.             End
  430.  
  431.         Refresh
  432.  
  433.         /* Save composited image for Method 0 */
  434.         If Method = 0 Then Do
  435.             Save FlameDest || Iff
  436.             End
  437.  
  438.         /* Save composited image for Method 1 */
  439.         If Method = 1 Then Do
  440.             If Overwrite = 0 Then Do
  441.                 Save FlameDest || Iff
  442.                 End
  443.             If Overwrite = 1 Then Do
  444.                 Save BackgroundSource || Iff
  445.                 End
  446.             End
  447.         End
  448.     End
  449.  
  450. /*All Done! */
  451.  
  452. Okay 'Operation Complete!  Go animate it and impress your friends!\n\nThink this script is cool?\nCheck out Part And Particle or the Video Panel Machine!\nCall Carmen at (619) 573-0285 for more info.'
  453.  
  454. Exit
  455.  
  456. VersionCheck:
  457.     /* Check to make sure user has at least OpalPaint v2.3 */
  458.     Version
  459.     Parse Var Result VerThingy ' ' OpalName ' ' VersionNum ' ' DateNum
  460.  
  461.     If Left(VersionNum,3) < 2.3 Then Do
  462.         AskBool 'It appears that you are using OpalPaint v' || VersionNum || '\n\nFLAMINATOR v1.5 requires OpalPaint v2.3 or higher\n\nShall I continue?'
  463.         If Result = 0 Then Do
  464.             Okay 'Exiting...'
  465.             Exit
  466.             End
  467.         End
  468.     Return
  469.  
  470. ConfirmFlaminator:
  471.     Address 'OpalPaint_Rexx'
  472.     ReqBuild '420 130 " "'
  473.     AddBox '10 10 400 110'
  474.     AddBox '15 15 5 5 Raised'
  475.     AddBox '-20 15 5 5 Raised'
  476.     AddBox '15 -20 5 5 Raised'
  477.     AddBox '-20 -20 5 5 Raised'
  478.     AddBox '47 -53 106 31'
  479.     AddBox '-153 -53 106 31'
  480.     AddHeading 'CenterX 20 "Flaminator v1.5b"'
  481.     AddHeading 'CenterX 35 "an Arexx script for OpalPaint v2.3 or higher"'
  482.     AddHeading 'CenterX 45 "by Carmen Rizzolo"'
  483.     AddGadget 'Button YesButton 50 -25 Medium "Continue"'
  484.     AddGadget 'Button NoButton -50 -25 Medium "Quit"'
  485.  
  486.     Request NoOK NoCancel
  487.  
  488.     GadgetStatus NoButton
  489.     If Result = 1 Then Do
  490.         Exit
  491.         End
  492.     Return
  493.  
  494. AskMethod:
  495.     Address 'OpalPaint_Rexx'
  496.     ReqBuild '342 101 " "'
  497.     AddBox '5 5 330 90'
  498.     AddHeading 'CenterX 20 "Choose BACKGROUND Method"'
  499.     AddGadget 'Button StaticButton 10 50 Medium "Static"'
  500.     AddGadget 'Button AnimButton 120 50 Medium "Animated"'
  501.     AddGadget 'Button CurrentButton 230 50 Medium "Current"'
  502.     AddText 'CenterX 81 "See documentation for more information."'
  503.     Request NoOK NoCancel
  504.  
  505.     GadgetStatus StaticButton
  506.     If Result = 1 Then Method = 0
  507.  
  508.     GadgetStatus AnimButton
  509.     If Result = 1 Then Method = 1
  510.  
  511.     GadgetStatus CurrentButton
  512.     If Result = 1 Then Method = 2
  513.  
  514.     Return Method
  515.  
  516. AskColour:
  517.     Address 'OpalPaint_Rexx'
  518.  
  519. /* Make sure page is at least 100x60 */
  520.     AlterPageMode = 0
  521.     PageSize
  522.     Parse Var Result PageX PageY
  523.     If PageX < 100 Then AlterPageMode = 1
  524.     If PageY < 60 Then Do
  525.         If AlterPageMode = 1 Then AlterPageMode = 3
  526.         If AlterPageMode = 0 Then AlterPageMode = 2
  527.         End
  528.  
  529.     If AlterPageMode ~= 0 Then Do
  530.         PageResTokens = ''
  531.         PageRes
  532.         If Result ~= '' Then PageResTokens = Result
  533.         If AlterPageMode = 1 Then PageSize 100 PageY PageResTokens 0
  534.         If AlterPageMode = 2 Then PageSize PageX 60 PageResTokens 0
  535.         If AlterPageMode = 3 Then PageSize 100 60 PageResTokens 0
  536.         End
  537.  
  538. /* Grab brush in corner */
  539.     Call Panic()
  540.     ActiveBrush 1
  541.     RectCut 50 30 100 60
  542.     Handle 0 0
  543.  
  544.     Call DoASkColourRequest()
  545.     ActiveBrush 1
  546.     PutBrush 50 30
  547.     Refresh
  548.  
  549.     If AlterPageMode ~= 0 Then PageSize PageX PageY PageResTokens 0
  550.  
  551.     Return FlameCol1 FlameCol2 FlameCol3 FlameCol4
  552.  
  553. DoASkColourRequest:
  554.     Call GetDefaults()
  555.  
  556.     Do Forever
  557.         ReqBuild '390 220 " "'
  558.         AddBox '5 5 379 80'
  559.         AddBox '5 88 379 126'
  560.         AddHeading 'CenterX 15 "Choose Flame Colour"'
  561.         AddGadget 'Cycle FlameColGad CenterX 30 90 20 Normal Yellow Red Blue Green Purple Custom'
  562.         AddGadget 'Button OKButton 45 55 Medium "Okay"'
  563.         AddGadget 'Button TestButton 244 55 Medium "TEST"'
  564.         AddHeading 'CenterX 95 "Custom Flame Settings"'
  565.  
  566.         AddGadget 'VProp C1R 15 120 16 65 0 255 1'
  567.         AddText 'Above C1R 4 0 "R"'
  568.         AddGadget 'VProp C1G 45 120 16 65 0 255 1'
  569.         AddText 'Above C1G 4 0 "G"'
  570.         AddGadget 'VProp C1B 75 120 16 65 0 255 1'
  571.         AddText 'Above C1B 4 0 "B"'
  572.  
  573.         AddGadget 'VProp C2R 110 120 16 65 0 255 1'
  574.         AddText 'Above C2R 4 0 "R"'
  575.         AddGadget 'VProp C2G 140 120 16 65 0 255 1'
  576.         AddText 'Above C2G 4 0 "G"'
  577.         AddGadget 'VProp C2B 170 120 16 65 0 255 1'
  578.         AddText 'Above C2B 4 0 "B"'
  579.  
  580.         AddGadget 'VProp C3R 205 120 16 65 0 255 1'
  581.         AddText 'Above C3R 4 0 "R"'
  582.         AddGadget 'VProp C3G 235 120 16 65 0 255 1'
  583.         AddText 'Above C3G 4 0 "G"'
  584.         AddGadget 'VProp C3B 265 120 16 65 0 255 1'
  585.         AddText 'Above C3B 4 0 "B"'
  586.  
  587.         AddGadget 'VProp C4R 300 120 16 65 0 255 1'
  588.         AddText 'Above C4R 4 0 "R"'
  589.         AddGadget 'VProp C4G 330 120 16 65 0 255 1'
  590.         AddText 'Above C4G 4 0 "G"'
  591.         AddGadget 'VProp C4B 360 120 16 65 0 255 1'
  592.         AddText 'Above C4B 4 0 "B"'
  593.  
  594.         AddHeading 'CenterX 200 "Hottest <-                      -> Coolest"'
  595.  
  596.         InitGadget FlameColGad FlameColDefault
  597.  
  598.         InitGadget C1R DC1R
  599.         InitGadget C1G DC1G
  600.         InitGadget C1B DC1B
  601.         InitGadget C2R DC2R
  602.         InitGadget C2G DC2G
  603.         InitGadget C2B DC2B
  604.         InitGadget C3R DC3R
  605.         InitGadget C3G DC3G
  606.         InitGadget C3B DC3B
  607.         InitGadget C4R DC4R
  608.         InitGadget C4G DC4G
  609.         InitGadget C4B DC4B
  610.  
  611.         Request NoOK NoCancel
  612.  
  613.         GadgetStatus C1R
  614.         DC1R = Result
  615.         GadgetStatus C1G
  616.         DC1G = Result
  617.         GadgetStatus C1B
  618.         DC1B = Result
  619.         GadgetStatus C2R
  620.         DC2R = Result
  621.         GadgetStatus C2G
  622.         DC2G = Result
  623.         GadgetStatus C2B
  624.         DC2B = Result
  625.         GadgetStatus C3R
  626.         DC3R = Result
  627.         GadgetStatus C3G
  628.         DC3G = Result
  629.         GadgetStatus C3B
  630.         DC3B = Result
  631.         GadgetStatus C4R
  632.         DC4R = Result
  633.         GadgetStatus C4G
  634.         DC4G = Result
  635.         GadgetStatus C4B
  636.         DC4B = Result
  637.  
  638.         GadgetStatus FlameColGad
  639.         If Result = 'Normal' Then Do
  640.             FlameCol1 = '255 240 0'
  641.             FlameCol2 = '240 127 0'
  642.             FlameCol3 = '240 0 0'
  643.             FlameCol4 = '120 0 0'
  644.             End
  645.         If Result = 'Yellow' Then Do
  646.             FlameCol1 = '255 240 0'
  647.             FlameCol2 = '210 180 0'
  648.             FlameCol3 = '165 119 0'
  649.             FlameCol4 = '120 58 0'
  650.             End
  651.         If Result = 'Red' Then Do
  652.             FlameCol1 = '255 123 0'
  653.             FlameCol2 = '255 0 0'
  654.             FlameCol3 = '188 0 0'
  655.             FlameCol4 = '120 0 0'
  656.             End
  657.         If Result = 'Blue' Then Do
  658.             FlameCol1 = '0 214 255'
  659.             FlameCol2 = '0 86 255'
  660.             FlameCol3 = '0 43 188'
  661.             FlameCol4 = '0 0 120'
  662.             End
  663.         If Result = 'Green' Then Do
  664.             FlameCol1 = '90 255 90'
  665.             FlameCol2 = '0 255 0'
  666.             FlameCol3 = '0 188 0'
  667.             FlameCol4 = '0 120 0'
  668.             End
  669.         If Result = 'Purple' Then Do
  670.             FlameCol1 = '255 0 235'
  671.             FlameCol2 = '255 0 209'
  672.             FlameCol3 = '172 0 165'
  673.             FlameCol4 = '88 0 120'
  674.             End
  675.         If Result = 'Custom' Then Do
  676.             FlameCol1 = DC1R || ' ' || DC1G || ' ' || DC1B
  677.             FlameCol2 = DC2R || ' ' || DC2G || ' ' || DC2B
  678.             FlameCol3 = DC3R || ' ' || DC3G || ' ' || DC3B
  679.             FlameCol4 = DC4R || ' ' || DC4G || ' ' || DC4B
  680.             End
  681.  
  682.         GadgetStatus FlameColGad
  683.         FlameColDefault = Result
  684.  
  685.         GadgetStatus TestButton
  686.         If Result = 1 Then Call DoColourTest()
  687.  
  688.         GadgetStatus OKButton
  689.         If Result = 1 Then Leave
  690.  
  691.         End
  692.     Call SaveDefaults()
  693.  
  694.     Return FlameCol1 FlameCol2 FlameCol3 FlameCol4
  695.  
  696. DoColourTest:
  697.     Call Panic()
  698.     SetPen 255 255 255
  699.     SolidRect 50 30 60 45
  700.     SetPen FlameCol1
  701.     SolidRect 61 30 70 45
  702.     SetPen FlameCol2
  703.     SolidRect 71 30 80 45
  704.     SetPen FlameCol3
  705.     SolidRect 81 30 90 45
  706.     SetPen FlameCol4
  707.     SolidRect 91 30 100 45
  708.     ActiveGrad 1
  709.     GradType HORIZONTAL
  710.     ClearTransGrad
  711.     ClearColGrad
  712.     ColGradTag 0 255 255 255
  713.     ColGradTag .20 FlameCol1
  714.     ColGradTag .40 FlameCol2
  715.     ColGradTag .60 FlameCol3
  716.     ColGradTag .80 FlameCol4
  717.     ColGradTag .99 0 0 0
  718.     FillMode GRADIENT
  719.     SolidRect 50 46 100 60
  720.     Refresh
  721.     Call Panic()
  722.     Return
  723.  
  724. Panic:
  725.     Panic
  726.     'StenEnable DISABLE'
  727.     Trans Disable
  728.     SetDrawMode 1
  729.     ActiveNozzle 1
  730.     ResetATool
  731.     Texture = 0
  732.     AntiAlias DISABLE
  733.     Menu DISABLE
  734.     Return
  735.  
  736. AskFlamePrefs:
  737.     Address 'OpalPaint_Rexx'
  738.  
  739.     Call GetDefaults()
  740.     Parse Var FlamePrefs DiffuseDefault BlurDefault IntensityDefault
  741.  
  742.     ReqBuild '390 204 " "'
  743.     AddBox '5 25 379 52'
  744.     AddBox '5 80 379 49'
  745.     AddBox '5 132 379 39'
  746.     AddHeading 'CenterX 10 "Flame Preferences"'
  747.  
  748.     AddText 'CenterX 32 "Flame Size (Diffusion)"'
  749.     AddGadget 'HProp FlameSizGad CenterX 50 300 10 0 31'
  750.     AddText 'CenterX 65 "0 = Disable diffusion"'
  751.  
  752.     AddText 'CenterX 86 "Number of blur passes"'
  753.     AddGadget 'HProp BlurGad CenterX 103 300 10 0 3'
  754.     AddText 'CenterX 117 "0 = Disable blur"'
  755.  
  756.     AddText 'CenterX 139 "Flame intensity"'
  757.     AddGadget 'HProp IntensityGad CenterX 155 300 10 1 4'
  758.  
  759.     AddGadget 'Button OkayButton CenterX 174 Medium "Okay"'
  760.  
  761.     InitGadget FlameSizGad DiffuseDefault
  762.     InitGadget BlurGad BlurDefault
  763.     InitGadget IntensityGad IntensityDefault
  764.  
  765.     Request NoOK NoCancel
  766.  
  767.     GadgetStatus FlameSizGad
  768.     FlameSize = Result
  769.     GadgetStatus BlurGad
  770.     BlurValue = Result
  771.     GadgetStatus IntensityGad
  772.     FlameIntensity = Result
  773.  
  774.     DiffuseBool = 1
  775.     If FlameSize = 0 Then DiffuseBool = 0
  776.     /* Convert FlameSize into an odd number if needed */
  777.     If FlameSize/2 = FlameSize%2 Then FlameSize = FlameSize - 1
  778.  
  779.     FlamePrefs = FlameSize || ' ' || BlurValue || ' ' || FlameIntensity
  780.     Call SaveDefaults()
  781.     Return FlameSize BlurValue FlameIntensity DiffuseBool
  782.  
  783. CheckDirForFiles:
  784.     Finder = Exists(BackgroundSource || 'pic.0001')
  785.     If Finder = 0 Then Do
  786.         Okay 'FATAL ERROR!  There must be at least a "pic.0001" image\nin your background source drawer when using the static method.\nExiting...'
  787.         Exit
  788.         End
  789.     Return
  790.  
  791. GetDefaults:
  792.     Call Open('Defaults','OpalPaint:Rexx/FlaminatorDefault.TXT','r')
  793.     LineYow = ReadLn('Defaults')
  794.     Parse Var LineYow DC1R DC1G DC1B DC2R DC2G DC2B DC3R DC3G DC3B DC4R DC4G DC4B
  795.     FlameColDefault = ReadLn('Defaults')
  796.     FlamePrefs = ReadLn('Defaults')
  797.     BkgndSrcPathDef = ReadLn('Defaults')
  798.     FlameSrcPathDef = ReadLn('Defaults')
  799.     DestPathDef = ReadLn('Defaults')
  800.     DefaultFrames = ReadLn('Defaults')
  801.     Call Close('Defaults')
  802.     Return DC1R DC1G DC1B DC2R DC2G DC2B DC3R DC3G DC3B DC4R DC4G DC4B FlameColDefault FlamePrefs BkgndSrcPathDef FlameSrcPathDef DestPathDef DefaultFrames
  803.  
  804. SaveDefaults:
  805.     Call Open('Defaults','OpalPaint:Rexx/FlaminatorDefault.TXT','w')
  806.     Call WriteLn('Defaults',DC1R DC1G DC1B DC2R DC2G DC2B DC3R DC3G DC3B DC4R DC4G DC4B)
  807.     Call WriteLn('Defaults',FlameColDefault)
  808.     Call WriteLn('Defaults',FlamePrefs)
  809.     Call WriteLn('Defaults',BkgndSrcPathDef)
  810.     Call WriteLn('Defaults',FlameSrcPathDef)
  811.     Call WriteLn('Defaults',DestPathDef)
  812.     Call WriteLn('Defaults',DefaultFrames)
  813.     Call Close('Defaults')
  814.     Return
  815.  
  816. GetFlameNumbers:
  817.     Call GetDefaults()
  818.     Parse Var DefaultFrames StartDef EndDef
  819.     Do Forever
  820.         ReqBuild '250 167 ""'
  821.         AddHeading 'CenterX 5 "Enter START and END"'
  822.         AddHeading 'CenterX 15 "FLAME frame numbers"'
  823.         AddBox '10 26 230 104'
  824.         AddText 'CenterX 31 "Enter normal numbers only."'
  825.         AddText 'CenterX 41 "1 = right  pic.0001 = wrong"'
  826.         AddText 'CenterX 60 "Start"'
  827.         AddGadget 'Integer StartGad CenterX 70 Small 1 9998'
  828.         AddText 'CenterX 95 "End"'
  829.         AddGadget 'Integer EndGad CenterX 105 Small 1 9999'
  830.         AddGadget 'Button OKButton CenterX 135 Medium "Okay"'
  831.  
  832.         InitGadget StartGad StartDef
  833.         InitGadget EndGad EndDef
  834.  
  835.         Request NoOK NoCancel
  836.  
  837.         GadgetStatus StartGad
  838.         StartFrame = Result
  839.         GadgetStatus EndGad
  840.         EndFrame = Result
  841.  
  842.         If EndFrame >= StartFrame Then Leave
  843.         Okay 'Ending FLAME frame number should be equal to or higher than\nStarting FLAME frame number.  Try again.'
  844.  
  845.         End
  846.     Return StartFrame EndFrame
  847.  
  848. PathNameGetter:
  849.     Address 'OpalPaint_Rexx'
  850.     PathWarn = 1
  851.  
  852.     Do Forever
  853.         LeaveBool = 1
  854.         ReqBuild '450 161 "' || ReqTitle || '"'
  855.         AddBox '10 23 430 105'
  856.         AddText 'CenterX 29 "NOTE: Pathnames must end with a / character"'
  857.  
  858.         AddGadget 'String PathNameGad CenterX 60 Large'
  859.         AddGadget 'Button PathNameReq 25 60 80 20 " "'
  860.         AddBox '22 57 86 26'
  861.         AddHeading '29 67 "REQUESTOR"'
  862.  
  863.         AddGadget 'Button OKButton CenterX -5 Medium "Okay"'
  864.  
  865.         InitGadget PathNameGad PathNameDef
  866.  
  867.         Request NoOK NoCancel
  868.  
  869.         GadgetStatus PathNameGad
  870.         PathName = Result
  871.  
  872.         GadgetStatus PathNameReq
  873.         If Result = 1 Then Do
  874.             If PathWarn = 1 Then Do
  875.                 ReqBuild '369 76 " "'
  876.                 AddBox '5 5 358 65'
  877.                 AddText 'CenterX 10 "NOTE: You are about to use a file requestor"'
  878.                 AddText 'CenterX 20 "to choose a PATHNAME.  Do not select any"'
  879.                 AddText 'CenterX 30 "files.  Get the pathname only!"'
  880.                 AddGadget 'Button Okeedoke CenterX 40 Medium "Proceed"'
  881.                 Request NoOK NoCancel
  882.                 PathWarn = 0
  883.                 End
  884.             AskFileName ReqHail PathNameDef ''
  885.             PathName = Result
  886.             LeaveBool = 0
  887.             End
  888.  
  889.         If Right(PathName,1) ~= '/' Then PathName = PathName || '/'
  890.  
  891.         PathNameDef = PathName
  892.  
  893.         If LeaveBool = 1 Then Do
  894.             Finder = Exists(PathName)
  895.             If Finder = 0 Then Do
  896.                 Okay 'Drawer not found!  Try again...'
  897.                 LeaveBool = 0
  898.                 End
  899.             End
  900.         If LeaveBool = 1 Then Leave
  901.         End
  902.  
  903.     Return PathName PathNameDef
  904.  
  905. AskOverwrite:
  906.     ReqBuild '549 63 " "'
  907.     AddBox '5 5 538 52'
  908.     AddText 'CenterX 10 "Overwrite original Background source images with FLAMED images?"'
  909.     AddGadget 'Button YesGad 109 25 Medium "Yes"'
  910.     AddGadget 'Button NoGad 327 25 Medium "No"'
  911.  
  912.     Request NoOK NoCancel
  913.     GadgetStatus YesGad
  914.     If Result = 1 Then Overwrite = 1
  915.     GadgetStatus NoGad
  916.     If Result = 1 Then Overwrite = 0
  917.     Return Overwrite
  918.