QB64.org Forum

Active Forums => Programs => Topic started by: Dav on October 04, 2021, 10:42:43 pm

Title: JackStack - Halloween puzzle game
Post by: Dav on October 04, 2021, 10:42:43 pm
Put this together tonight for fun, (and because my gig tonight was cancelled).  I was inspired by the talk of making a one key game in the discussion thread.  This is a one key game, but it's not in SCREEN 0 so I post it here instead of using it for a competition. 

You press the space bar to stack jack-o-lanterns on top of each other.  If you miss it, game over.  If you stack them on top perfectly it will remove some.  If the stack reaches the top game is over.  Speed increases as you go.

See how many points you can reach.  Seems easy at first, but can get hard fast.

- Dav

  [ This attachment cannot be displayed inline in 'Print Page' view ]   (24k)

  [ This attachment cannot be displayed inline in 'Print Page' view ]  
Title: Re: JackStack - Halloween puzzle game
Post by: bplus on October 04, 2021, 10:59:18 pm
Quick game, for me anyway. Sure would like an automatic loop around and reset to try again until press esc to quit game.
Title: Re: JackStack - Halloween puzzle game
Post by: johnno56 on October 05, 2021, 08:51:37 am
Cool game.... Addictive little beastie...  Nicely done...  I was half expecting a skeleton to come and kick the stack over... But no! The stack had to build up and kill me off... lol Throw in an Easter egg... extra points for stacking and squishing the witch...
Title: Re: JackStack - Halloween puzzle game
Post by: Dav on October 05, 2021, 11:21:10 am
Thanks. I’m planning to finish it up, will make the game restart, add sounds, add another small cloud and make the witch fly randomly, and I was thinking of having the stack wobble left and right some as it gets taller, maybe something else.

-Dav
Title: Re: JackStack - Halloween puzzle game
Post by: bplus on October 05, 2021, 12:00:21 pm
Hey @Dav

Surely you've seen the witch on broomstick crashed into telephone pole or tree.

That would be so cool to do that with the jack stack when it reaches the top!
Title: Re: JackStack - Halloween puzzle game
Post by: bplus on October 05, 2021, 12:04:05 pm
Found image:
  [ This attachment cannot be displayed inline in 'Print Page' view ]  
Title: Re: JackStack - Halloween puzzle game
Post by: Dav on October 05, 2021, 12:20:01 pm
Lol, I’ll see what I can do with that.

- Dav
Title: Re: JackStack - Halloween puzzle game
Post by: Dav on October 05, 2021, 01:45:23 pm
I may add some other goals too. At first I was going to do a moving box on the ground, dropping the jack-o-lanterns in it, and call in the game Jacks in the box.

- Dav
Title: Re: JackStack - Halloween puzzle game
Post by: johnno56 on October 05, 2021, 11:56:47 pm
Game Maker 6 or 8 had a similar game. You are in a pit. Crates fall down and you have to jump up onto them to get out of the pit. Crates vary in construction. Stone, metal, wood, cardboard. Some crates with crush other crates. I think it was called Lazarus. Your game reminded me of it... Now I know why... I got killed off in that game as well... lol
Title: Re: JackStack - Halloween puzzle game
Post by: Dav on October 06, 2021, 04:26:49 pm
I seem to recall a game like that, @johnno56.  Forgot the name tho.

Here's an updated version.  I added some sound effects and stack wobble, also added a game restart, hi score keeping.  Haven't messed with the witch yet or put in some other ideas. 

One thing you will notice, there's a very annoying sound that repeats faster and higher as the stack builds up, to create some intensity.  Using just a sound I had on hand, will change it up to something less annoying.  I have put in RotoZoom3 in the code to use it for something else, but right now it zooms the jack-o-lantern when game over.

- Dav

   (108k)
Title: Re: JackStack - Halloween puzzle game
Post by: bplus on October 06, 2021, 04:37:58 pm
So the game is over when stacks to top? Thanks for the automatic restart.

Sounds good!
Title: Re: JackStack - Halloween puzzle game
Post by: johnno56 on October 06, 2021, 05:41:52 pm
Dav,

I like the changes to the game. Cool.


This should help you remember. GM6.  I still have the tutorial and resources... even though it's a Windows program... *sigh*

Lazarus.

  [ This attachment cannot be displayed inline in 'Print Page' view ]  
Title: Re: JackStack - Halloween puzzle game
Post by: Dav on October 06, 2021, 07:39:57 pm
Yes, that does look familiar. I played around with GameMaker a little bit.

About my little game here — it’s just too boring as is. Perhaps I can do stages, like stacking is one, dropping a number of them in a moving box is another, maybe shooting the witch down with jack-o-lanterns, etc. A stacking game just isn’t that fun after playing it once or twice.

@bplus, yes when it reaches the top it is over.

- Dav
Title: Re: JackStack - Halloween puzzle game
Post by: johnno56 on October 06, 2021, 09:57:12 pm
With those kind of changes, can we assume that, you may need to drift away from the "one key" approach?

Question: Did you hear any one of us say that your game is boring? Sur, it's no space shooter or mario-type platformer, but it does have that "challenge" feel. For me, it's fun... The extra audio etc also gives it a lift in "atmosphere". I think it's pretty good... What have you got in mind for Xmas? lol
Title: Re: JackStack - Halloween puzzle game
Post by: Dav on October 07, 2021, 08:41:07 am
I will try to keep the one key restriction for the challenge.  Haven’t thought of Christmas yet - flying Santa dropping presents in chimneys maybe.  I wonder if there will be another Christmas programs challenge like last year?  I still run @Petr ‘s Christmas demo now and then - it’s a very enjoyable one.

- Dav
Title: Re: JackStack - Halloween puzzle game
Post by: bplus on October 07, 2021, 10:59:21 am
@Dav I think Christmas comes every year, the task is to keep the presents coming too. :)

If you get the stack to top, don't you deserve to start over and add to your score? It's really gets hard to get a stack to top so it should be rewarded by a game continuance, maybe at a faster pace or smaller boxes, aha! yes that.... just keep game going as reward for stacking all boxes. That alone would make game less "boring"?
Title: Re: JackStack - Halloween puzzle game
Post by: Petr on October 07, 2021, 02:07:05 pm
@Dav wrote:

Quote
I still run @Petr ‘s Christmas demo now and then - it’s a very enjoyable one.

Thank you, Dav. That really pleased me a lot. Christmas for me is connected with pictures of Josef Lada. They are very distinctive and nice. You can see it here:

https://www.google.com/search?q=josef+lada+v%C3%A1noce+obr%C3%A1zky&tbm=isch&ved=2ahUKEwj3k6yH8LjzAhW-gM4BHfVcAVoQ2-cCegQIABAA&oq=josef+lada+v%C3%A1noce+obr%C3%A1zky&gs_lcp=CgNpbWcQAzoECAAQHlDFeVjciwFg844BaABwAHgAgAFLiAGVBJIBATiYAQCgAQGqAQtnd3Mtd2l6LWltZ8ABAQ&sclient=img&ei=KTVfYbfbCL6Bur4P9bmF0AU&bih=734&biw=1536&rlz=1C1GIGM_enCZ654CZ654#imgrc=mBAbxq3EV2Z4dM (https://www.google.com/search?q=josef+lada+v%C3%A1noce+obr%C3%A1zky&tbm=isch&ved=2ahUKEwj3k6yH8LjzAhW-gM4BHfVcAVoQ2-cCegQIABAA&oq=josef+lada+v%C3%A1noce+obr%C3%A1zky&gs_lcp=CgNpbWcQAzoECAAQHlDFeVjciwFg844BaABwAHgAgAFLiAGVBJIBATiYAQCgAQGqAQtnd3Mtd2l6LWltZ8ABAQ&sclient=img&ei=KTVfYbfbCL6Bur4P9bmF0AU&bih=734&biw=1536&rlz=1C1GIGM_enCZ654CZ654#imgrc=mBAbxq3EV2Z4dM)

So far, I am not working on any program with this topic, not even on anything on New Year's Eve. So far, I have only written two programs, both large, both unfinished and - both on a completely different topic.
Title: Re: JackStack - Halloween puzzle game
Post by: Petr on October 07, 2021, 02:14:13 pm
@Dav


I really like your game, especially appreciate the idea and design!
Title: Re: JackStack - Halloween puzzle game
Post by: bplus on October 07, 2021, 02:15:15 pm
@Petr We have one of those artist favorites in America:
https://www.google.com/search?q=norman+Rockwell+christmas&tbm=isch&ved=2ahUKEwjx__7i8rjzAhXVO80KHVLLATYQ2-cCegQIABAA&oq=norman+Rockwell+christmas&gs_lcp=CgNpbWcQAzIFCAAQgAQyBQgAEIAEMgUIABCABDIFCAAQgAQyBQgAEIAEMgUIABCABDIFCAAQgAQyBQgAEIAEMgUIABCABDIFCAAQgAQ6BwgjEO8DECc6CAgAEIAEELEDOgsIABCABBCxAxCDAToECAAQAzoHCAAQsQMQQzoECAAQQzoKCCMQ7wMQ6gIQJzoICAAQsQMQgwFQnKoCWMibA2C6pANoA3AAeACAAWuIAacjkgEENTEuMpgBAKABAaoBC2d3cy13aXotaW1nsAEKwAEB&sclient=img&ei=AjhfYfH2DNX3tAbSloewAw&bih=734&biw=1536&rlz=1C1GIGM_enCZ654CZ654

Are we hinting at a Theme for this year?
Title: Re: JackStack - Halloween puzzle game
Post by: Petr on October 07, 2021, 02:30:41 pm
@bplus

Thanks for the link. Nice :) If we hinting Theme.... maybe. I can't promise it. Given the ideas, I would need to write another program. When I write a program with twenty fingers (the first half with my hands and the second half of the source under the table from the middle to the end with my feet on a laptop) and with that program I then put it together,  will then catch everything :)
Title: Re: JackStack - Halloween puzzle game
Post by: Dav on October 09, 2021, 09:12:12 pm
Thanks, @Petr.

I decided to turn this into a game called Trick Or Treat, with several stages.  All game play uses just the space bar.  Right now there's the jacks stacker stage that is in the current download, and I've added the "Fly the Witch through the candy field" without getting hit, sort of like flappy bird where the space key raises the witch.  And there's a candy grid stage, where you pick 20 candies without hitting a witch on the grid, and there a spinning wheel where you stop on the jack-o-lantern 5 times with hitting other things (rotation speed increases).  Have a few other to add.  Hopefully will have it done before Halloween.  Trying to come up with a one key puzzle that is kind of fun  Here's a few screenshots...

- Dav

 [ This attachment cannot be displayed inline in 'Print Page' view ]  
 [ This attachment cannot be displayed inline in 'Print Page' view ]  
 [ This attachment cannot be displayed inline in 'Print Page' view ]  
Title: Re: JackStack - Halloween puzzle game
Post by: bplus on October 10, 2021, 01:23:15 am
Wow dav!
Title: Re: JackStack - Halloween puzzle game
Post by: Petr on October 10, 2021, 04:46:07 am
It looks really nice, Dav!
Title: Re: JackStack - Halloween puzzle game
Post by: Dav on October 12, 2021, 01:07:54 pm
I'm having a little problem getting the collision detection working well on the flying witch stage.   I'm not very experienced with that area, but I tried to use Terry's collision detection method described in his tutorials.  Needs tweaking, the witch falls out of the sky without hitting a candy.

Here's the flying witch stage (simplified) for download if anyone wants to help out. 

Press the space bar to raise the witch, avoid hitting the candies.

-Dav

  [ This attachment cannot be displayed inline in 'Print Page' view ]   (59k)
Title: Re: JackStack - Halloween puzzle game
Post by: bplus on October 12, 2021, 01:15:29 pm
I haven't seen your code Dav but is it just 2 image boxes to check for collision or are you trying by pixels or polygons?
Title: Re: JackStack - Halloween puzzle game
Post by: Dav on October 12, 2021, 01:17:54 pm
I'm using two block images, both 75x75 pixels.  Here's the collision code (should have posted it...)

- Dav

Code: QB64: [Select]
  1.  
  2.         wx1 = witchflyx: wy1 = witchflyy  'witch x/y's
  3.         wx2 = wx1 + 75: wy2 = wy1 + 75
  4.  
  5.         jx1 = jackysx(j): jy1 = jackysy(j)  'candies x/y
  6.         jx2 = jx1 + 75: jy2 = jy1 + 75
  7.  
  8.         hit = 0
  9.         IF wx2 >= jx1 THEN
  10.             IF wx1 <= jx2 THEN
  11.                 IF wy2 >= jy1 THEN
  12.                     IF wy1 <= jy2 THEN hit = 1
  13.                 END IF
  14.             END IF
  15.         END IF
  16.  
  17.  
Title: Re: JackStack - Halloween puzzle game
Post by: bplus on October 12, 2021, 01:37:37 pm
OK try this, your corn might need to be centered x-75/2, y-75/2 and a smaller more forgiving width=radius for spinning plus a little less corn please! ;-))
Code: QB64: [Select]
  1.  
  2.  
  3. Screen _NewImage(640, 640, 32)
  4.  
  5. board& = _LoadImage("background.png", 32)
  6. jack& = _LoadImage("pumpkin.png")
  7. witch& = _LoadImage("witch.png"): witchx = -300: witchy = 100 + (Rnd * 300)
  8. grass& = _LoadImage("grass.png")
  9. candy& = _LoadImage("candy.png")
  10.  
  11. jackys = 7 ' <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 11 * 75 is about the whole height
  12. Dim Shared jackysx(jackys), jackysy(jackys), jackysr(jackys)
  13.  
  14. raise& = _SndOpen("sfx_roll.ogg")
  15.  
  16. '======
  17. restart:
  18. '======
  19.  
  20. witchflyx = 20
  21. witchflyy = 300
  22. grassx = 0
  23.  
  24. candycount = 0
  25.  
  26. For j = 1 To jackys
  27.     jackysx(j) = _Width + (Rnd * _Width) * 2
  28.     jackysy(j) = 40 + (Rnd * (_Height - 100))
  29.     jackysr(j) = Rnd * 360
  30.  
  31.  
  32.  
  33.     Cls , _RGB(99, 49, 0)
  34.  
  35.     PPRINT 300, 10, 16, _RGB(255, 255, 255), 255, Str$(candycount)
  36.  
  37.     _PutImage (grassx, 0), grass&
  38.     _PutImage (grassx + 640, 0), grass&
  39.  
  40.     'draw candies
  41.     For j = 1 To jackys
  42.         '_PUTIMAGE (jackysx(j), jackysy(j)), candy&
  43.         RotoZoom3 jackysx(j), jackysy(j), candy&, 1, 1, _D2R(jackysr(j))
  44.         jackysr(j) = jackysr(j) + 3
  45.         If jackysr(j) > 360 Then jackysr(j) = 1
  46.     Next
  47.  
  48.     'if pressed space
  49.     If Inp(&H60) = 57 Then
  50.  
  51.         If Not _SndPlaying(raise&) Then _SndPlay raise&
  52.  
  53.         witchflyy = witchflyy - 2
  54.         witchflyx = witchflyx + 1
  55.     Else
  56.         _SndStop raise&
  57.         witchflyy = witchflyy + 1
  58.         witchflyx = witchflyx - .5
  59.     End If
  60.  
  61.     'keep witch in bounds
  62.     If witchflyx < 5 Then witchflyx = 5
  63.     If witchflyx > _Width - 75 Then witchflyx = _Width - 75
  64.     If witchflyy < 40 Then witchflyy = 40
  65.     If witchflyy > 500 Then witchflyy = 500
  66.  
  67.     _Limit 150
  68.  
  69.     _PutImage (witchflyx, witchflyy), witch&
  70.     _Display
  71.  
  72.     grassx = grassx - 1
  73.     If grassx <= -640 Then grassx = 0
  74.  
  75.  
  76.     '========================= collision dectection here ===========
  77.  
  78.     'see if witch hit a candy
  79.     For j = 1 To jackys
  80.  
  81.         wx1 = witchflyx: wy1 = witchflyy
  82.         wx2 = wx1 + 75: wy2 = wy1 + 75
  83.         jx1 = jackysx(j): jy1 = jackysy(j)
  84.         jx2 = jx1 + 75: jy2 = jy1 + 75
  85.  
  86.  
  87.         'hit = 0
  88.         'If wx2 >= jx1 Then
  89.         '    If wx1 <= jx2 Then
  90.         '        If wy2 >= jy1 Then
  91.         '            If wy1 <= jy2 Then hit = 1
  92.         '        End If
  93.         '    End If
  94.         'End If
  95.         hit = collision%(wx1, wy1, 50, 50, jackysx(j) - 37, jackysy(j) - 37, 60, 60)
  96.  
  97.         If hit Then
  98.  
  99.             _SndPlayFile "sfx_dropdown.mp3"
  100.  
  101.             Cls , _RGB(99, 49, 0)
  102.             PPRINT 300, 10, 16, _RGB(255, 255, 255), 255, Str$(candycount)
  103.             _PutImage (grassx, 0), grass&
  104.             _PutImage (grassx + 640, 0), grass&
  105.  
  106.             'draw jacks
  107.             For j2 = 1 To jackys
  108.                 ' _PUTIMAGE (jackysx(j), jackysy(j)), candy&
  109.                 RotoZoom3 jackysx(j2), jackysy(j2), candy&, 1, 1, _D2R(jackysr(j2))
  110.             Next
  111.  
  112.             tmp& = _CopyImage(_Display)
  113.             'spin witch out here
  114.             r = 1
  115.             For dy = witchflyy + 35 To _Height Step 3
  116.                 _PutImage (0, 0), tmp&
  117.                 RotoZoom3 witchflyx + 75, dy, witch&, 1, 1, _D2R(r)
  118.                 r = r + 5: If r > 360 Then r = 1
  119.                 _Limit 150
  120.                 _Display
  121.             Next
  122.             _FreeImage tmp&
  123.  
  124.             Exit Do
  125.  
  126.         End If
  127.  
  128.     Next
  129.  
  130.  
  131.     'move candies, compute
  132.     For j = 1 To jackys
  133.  
  134.         jackysx(j) = jackysx(j) - 2
  135.         If jackysx(j) < -75 Then
  136.  
  137.             candycount = candycount + 1
  138.  
  139.             'If won...
  140.             If candycount > 75 Then
  141.                 _SndPlayFile "sfx_clap.ogg"
  142.                 _Delay 3
  143.                 End
  144.             End If
  145.  
  146.             jackysx(j) = _Width + (Rnd * _Width) * 2
  147.             jackysy(j) = 40 + (Rnd * (_Height - 100))
  148.         End If
  149.     Next
  150.  
  151.  
  152. GoTo restart
  153.  
  154.  
  155.  
  156. Sub PPRINT (x, y, size, clr&, trans&, text$)
  157.     'This sub outputs to the current _DEST set
  158.     'It makes trans& the transparent color
  159.  
  160.     'x/y is where to print text
  161.     'size is the font size to use
  162.     'clr& is the color of your text
  163.     'trans& is the background transparent color
  164.     'text$ is the string to print
  165.  
  166.     '=== get users current write screen
  167.     orig& = _Dest
  168.  
  169.     '=== if you are using an 8 or 32 bit screen
  170.     bit = 32: If _PixelSize(0) = 1 Then bit = 256
  171.  
  172.     '=== step through your text
  173.     For t = 0 To Len(text$) - 1
  174.         '=== make a temp screen to use
  175.         pprintimg& = _NewImage(16, 16, bit)
  176.         _Dest pprintimg&
  177.         '=== set colors and print text
  178.         Cls , trans&: Color clr&
  179.         Print Mid$(text$, t + 1, 1);
  180.         '== make background color the transprent one
  181.         _ClearColor _RGB(0, 0, 0), pprintimg&
  182.         '=== go back to original screen  to output
  183.         _Dest orig&
  184.         '=== set it and forget it
  185.         x1 = x + (t * size): x2 = x1 + size
  186.         y1 = y: y2 = y + size
  187.         _PutImage (x1 - (size / 2), y1)-(x2, y2 + (size / 3)), pprintimg&
  188.         _FreeImage pprintimg&
  189.     Next
  190.  
  191. ' Description:
  192. ' Started from a mod of Galleon's in Wiki that both scales and rotates an image.
  193. ' This version scales the x-axis and y-axis independently allowing rotations of image just by changing X or Y Scales
  194. ' making this tightly coded routine a very powerful and versatile image tool.
  195.  
  196.  
  197. Sub RotoZoom3 (X As Long, Y As Long, Image As Long, xScale As Single, yScale As Single, radianRotation As Single)
  198.     ' This assumes you have set your drawing location with _DEST or default to screen.
  199.     ' X, Y - is where you want to put the middle of the image
  200.     ' Image - is the handle assigned with _LOADIMAGE
  201.     ' xScale, yScale - are shrinkage < 1 or magnification > 1 on the given axis, 1 just uses image size.
  202.     ' These are multipliers so .5 will create image .5 size on given axis and 2 for twice image size.
  203.     ' radianRotation is the Angle in Radian units to rotate the image
  204.     ' note: Radian units for rotation because it matches angle units of other Basic Trig functions
  205.     '       and saves a little time converting from degree.
  206.     '       Use the _D2R() function if you prefer to work in degree units for angles.
  207.  
  208.     Dim px(3) As Single: Dim py(3) As Single ' simple arrays for x, y to hold the 4 corners of image
  209.     Dim W&, H&, sinr!, cosr!, i&, x2&, y2& '   variables for image manipulation
  210.     W& = _Width(Image&): H& = _Height(Image&)
  211.     px(0) = -W& / 2: py(0) = -H& / 2 'left top corner
  212.     px(1) = -W& / 2: py(1) = H& / 2 ' left bottom corner
  213.     px(2) = W& / 2: py(2) = H& / 2 '  right bottom
  214.     px(3) = W& / 2: py(3) = -H& / 2 ' right top
  215.     sinr! = Sin(-radianRotation): cosr! = Cos(-radianRotation) ' rotation helpers
  216.     For i& = 0 To 3 ' calc new point locations with rotation and zoom
  217.         x2& = xScale * (px(i&) * cosr! + sinr! * py(i&)) + X: y2& = yScale * (py(i&) * cosr! - px(i&) * sinr!) + Y
  218.         px(i&) = x2&: py(i&) = y2&
  219.     Next
  220.     _MapTriangle _Seamless(0, 0)-(0, H& - 1)-(W& - 1, H& - 1), Image To(px(0), py(0))-(px(1), py(1))-(px(2), py(2))
  221.     _MapTriangle _Seamless(0, 0)-(W& - 1, 0)-(W& - 1, H& - 1), Image To(px(0), py(0))-(px(3), py(3))-(px(2), py(2))
  222.  
  223.  
  224. Function collision% (b1x, b1y, b1w, b1h, b2x, b2y, b2w, b2h)
  225.     ' x, y represent the box left most x and top most y
  226.     ' w, h represent the box width and height which is the usual way sprites / tiles / images are described
  227.     ' such that boxbottom = by + bh
  228.     '        and boxright = bx + bw
  229.     'so the specific gosub above is generalized to a function procedure here!
  230.     If (b1y + b1h < b2y) Or (b1y > b2y + b2h) Or (b1x > b2x + b2w) Or (b1x + b1w < b2x) Then
  231.         collision% = 0
  232.     Else
  233.         collision% = -1 ' Collsion is true
  234.     End If
  235.  
  236.  
  237.  
  238.  
Title: Re: JackStack - Halloween puzzle game
Post by: bplus on October 12, 2021, 01:43:34 pm
PS the witch almost has a chance now! but might need to control new corn so that there is actually some open space to fly to and through.
Title: Re: JackStack - Halloween puzzle game
Post by: bplus on October 12, 2021, 01:44:25 pm
PPS Nice adaption from flappy!
Title: Re: JackStack - Halloween puzzle game
Post by: Dav on October 12, 2021, 01:52:24 pm
That's great, @bplus!   Nice collision function.  I've seen that before posted somewhere here, had forgotten about it.   Cool.  Thanks for the help!

- Dav
Title: Re: JackStack - Halloween puzzle game
Post by: bplus on October 12, 2021, 03:54:17 pm
Yes with white circles and display and delay immediately on collision,  I have confirmed a guess about the corn boundaries for their x,y's, the x,y's are corn centers for Rotozoom x, y's are centers not corners, that is why I subtract half the height or width (75) for collision checking between two box images for the x, y top left corner, plus did not use full 75 for width, height. For witch I should have used full 75x75 for that image,

Theoretically you might want collision detection for the Corn circle not the corn box that would sit square with x,y axis, a picture is worth a 1000 words:
Code: QB64: [Select]
  1.  
  2.  
  3. Screen _NewImage(640, 640, 32)
  4.  
  5. board& = _LoadImage("background.png", 32)
  6. jack& = _LoadImage("pumpkin.png")
  7. witch& = _LoadImage("witch.png"): witchx = -300: witchy = 100 + (Rnd * 300)
  8. grass& = _LoadImage("grass.png")
  9. candy& = _LoadImage("candy.png")
  10.  
  11. jackys = 7
  12. Dim Shared jackysx(jackys), jackysy(jackys), jackysr(jackys)
  13.  
  14. raise& = _SndOpen("sfx_roll.ogg")
  15.  
  16. '======
  17. restart:
  18. '======
  19.  
  20. witchflyx = 20
  21. witchflyy = 300
  22. grassx = 0
  23.  
  24. candycount = 0
  25.  
  26. For j = 1 To jackys
  27.     jackysx(j) = _Width + (Rnd * _Width) * 2
  28.     jackysy(j) = 40 + (Rnd * (_Height - 100))
  29.     jackysr(j) = Rnd * 360
  30.  
  31.  
  32.  
  33.     Cls , _RGB(99, 49, 0)
  34.  
  35.     PPRINT 300, 10, 16, _RGB(255, 255, 255), 255, Str$(candycount)
  36.  
  37.     _PutImage (grassx, 0), grass&
  38.     _PutImage (grassx + 640, 0), grass&
  39.  
  40.     'draw candies
  41.     For j = 1 To jackys
  42.         '_PUTIMAGE (jackysx(j), jackysy(j)), candy&
  43.         RotoZoom3 jackysx(j), jackysy(j), candy&, 1, 1, _D2R(jackysr(j))
  44.         ' check boundary of images with circles, confirm  jackysx(j), jackysy(j) is a center NOT a CORNER
  45.         Circle (jackysx(j), jackysy(j)), 75 / 2, &HFFFFFFFF
  46.         jackysr(j) = jackysr(j) + 3
  47.         If jackysr(j) > 360 Then jackysr(j) = 1
  48.     Next
  49.  
  50.     'if pressed space
  51.     If Inp(&H60) = 57 Then
  52.  
  53.         If Not _SndPlaying(raise&) Then _SndPlay raise&
  54.  
  55.         witchflyy = witchflyy - 2
  56.         witchflyx = witchflyx + 1
  57.     Else
  58.         _SndStop raise&
  59.         witchflyy = witchflyy + 1
  60.         witchflyx = witchflyx - .5
  61.     End If
  62.  
  63.     'keep witch in bounds
  64.     If witchflyx < 5 Then witchflyx = 5
  65.     If witchflyx > _Width - 75 Then witchflyx = _Width - 75
  66.     If witchflyy < 40 Then witchflyy = 40
  67.     If witchflyy > 500 Then witchflyy = 500
  68.  
  69.     _Limit 150
  70.  
  71.     _PutImage (witchflyx, witchflyy), witch&
  72.     _Display
  73.  
  74.     grassx = grassx - 1
  75.     If grassx <= -640 Then grassx = 0
  76.  
  77.  
  78.     '========================= collision dectection here ===========
  79.  
  80.     'see if witch hit a candy
  81.     For j = 1 To jackys
  82.  
  83.         wx1 = witchflyx: wy1 = witchflyy
  84.         wx2 = wx1 + 75: wy2 = wy1 + 75
  85.         jx1 = jackysx(j): jy1 = jackysy(j)
  86.         jx2 = jx1 + 75: jy2 = jy1 + 75
  87.  
  88.  
  89.         'hit = 0
  90.         'If wx2 >= jx1 Then
  91.         '    If wx1 <= jx2 Then
  92.         '        If wy2 >= jy1 Then
  93.         '            If wy1 <= jy2 Then hit = 1
  94.         '        End If
  95.         '    End If
  96.         'End If
  97.         hit = collision%(wx1, wy1, 75, 75, jackysx(j) - 37, jackysy(j) - 37, 60, 60)
  98.  
  99.         If hit Then
  100.             _SndPlayFile "sfx_dropdown.mp3"
  101.             _Display
  102.             _Delay 2
  103.  
  104.             Cls , _RGB(99, 49, 0)
  105.             PPRINT 300, 10, 16, _RGB(255, 255, 255), 255, Str$(candycount)
  106.             _PutImage (grassx, 0), grass&
  107.             _PutImage (grassx + 640, 0), grass&
  108.  
  109.             'draw jacks
  110.             For j2 = 1 To jackys
  111.                 ' _PUTIMAGE (jackysx(j), jackysy(j)), candy&
  112.                 RotoZoom3 jackysx(j2), jackysy(j2), candy&, 1, 1, _D2R(jackysr(j2))
  113.             Next
  114.  
  115.             tmp& = _CopyImage(_Display)
  116.             'spin witch out here
  117.             r = 1
  118.             For dy = witchflyy + 35 To _Height Step 3
  119.                 _PutImage (0, 0), tmp&
  120.                 RotoZoom3 witchflyx + 75, dy, witch&, 1, 1, _D2R(r)
  121.                 r = r + 5: If r > 360 Then r = 1
  122.                 _Limit 150
  123.                 _Display
  124.             Next
  125.             _FreeImage tmp&
  126.  
  127.             Exit Do
  128.  
  129.         End If
  130.  
  131.     Next
  132.  
  133.  
  134.     'move candies, compute
  135.     For j = 1 To jackys
  136.  
  137.         jackysx(j) = jackysx(j) - 2
  138.         If jackysx(j) < -75 Then
  139.  
  140.             candycount = candycount + 1
  141.  
  142.             'If won...
  143.             If candycount > 75 Then
  144.                 _SndPlayFile "sfx_clap.ogg"
  145.                 _Delay 3
  146.                 End
  147.             End If
  148.  
  149.             jackysx(j) = _Width + (Rnd * _Width) * 2
  150.             jackysy(j) = 40 + (Rnd * (_Height - 100))
  151.         End If
  152.     Next
  153.  
  154.  
  155. GoTo restart
  156.  
  157.  
  158.  
  159. Sub PPRINT (x, y, size, clr&, trans&, text$)
  160.     'This sub outputs to the current _DEST set
  161.     'It makes trans& the transparent color
  162.  
  163.     'x/y is where to print text
  164.     'size is the font size to use
  165.     'clr& is the color of your text
  166.     'trans& is the background transparent color
  167.     'text$ is the string to print
  168.  
  169.     '=== get users current write screen
  170.     orig& = _Dest
  171.  
  172.     '=== if you are using an 8 or 32 bit screen
  173.     bit = 32: If _PixelSize(0) = 1 Then bit = 256
  174.  
  175.     '=== step through your text
  176.     For t = 0 To Len(text$) - 1
  177.         '=== make a temp screen to use
  178.         pprintimg& = _NewImage(16, 16, bit)
  179.         _Dest pprintimg&
  180.         '=== set colors and print text
  181.         Cls , trans&: Color clr&
  182.         Print Mid$(text$, t + 1, 1);
  183.         '== make background color the transprent one
  184.         _ClearColor _RGB(0, 0, 0), pprintimg&
  185.         '=== go back to original screen  to output
  186.         _Dest orig&
  187.         '=== set it and forget it
  188.         x1 = x + (t * size): x2 = x1 + size
  189.         y1 = y: y2 = y + size
  190.         _PutImage (x1 - (size / 2), y1)-(x2, y2 + (size / 3)), pprintimg&
  191.         _FreeImage pprintimg&
  192.     Next
  193.  
  194. ' Description:
  195. ' Started from a mod of Galleon's in Wiki that both scales and rotates an image.
  196. ' This version scales the x-axis and y-axis independently allowing rotations of image just by changing X or Y Scales
  197. ' making this tightly coded routine a very powerful and versatile image tool.
  198.  
  199.  
  200. Sub RotoZoom3 (X As Long, Y As Long, Image As Long, xScale As Single, yScale As Single, radianRotation As Single)
  201.     ' This assumes you have set your drawing location with _DEST or default to screen.
  202.     ' X, Y - is where you want to put the middle of the image
  203.     ' Image - is the handle assigned with _LOADIMAGE
  204.     ' xScale, yScale - are shrinkage < 1 or magnification > 1 on the given axis, 1 just uses image size.
  205.     ' These are multipliers so .5 will create image .5 size on given axis and 2 for twice image size.
  206.     ' radianRotation is the Angle in Radian units to rotate the image
  207.     ' note: Radian units for rotation because it matches angle units of other Basic Trig functions
  208.     '       and saves a little time converting from degree.
  209.     '       Use the _D2R() function if you prefer to work in degree units for angles.
  210.  
  211.     Dim px(3) As Single: Dim py(3) As Single ' simple arrays for x, y to hold the 4 corners of image
  212.     Dim W&, H&, sinr!, cosr!, i&, x2&, y2& '   variables for image manipulation
  213.     W& = _Width(Image&): H& = _Height(Image&)
  214.     px(0) = -W& / 2: py(0) = -H& / 2 'left top corner
  215.     px(1) = -W& / 2: py(1) = H& / 2 ' left bottom corner
  216.     px(2) = W& / 2: py(2) = H& / 2 '  right bottom
  217.     px(3) = W& / 2: py(3) = -H& / 2 ' right top
  218.     sinr! = Sin(-radianRotation): cosr! = Cos(-radianRotation) ' rotation helpers
  219.     For i& = 0 To 3 ' calc new point locations with rotation and zoom
  220.         x2& = xScale * (px(i&) * cosr! + sinr! * py(i&)) + X: y2& = yScale * (py(i&) * cosr! - px(i&) * sinr!) + Y
  221.         px(i&) = x2&: py(i&) = y2&
  222.     Next
  223.     _MapTriangle _Seamless(0, 0)-(0, H& - 1)-(W& - 1, H& - 1), Image To(px(0), py(0))-(px(1), py(1))-(px(2), py(2))
  224.     _MapTriangle _Seamless(0, 0)-(W& - 1, 0)-(W& - 1, H& - 1), Image To(px(0), py(0))-(px(3), py(3))-(px(2), py(2))
  225.  
  226.  
  227. Function collision% (b1x, b1y, b1w, b1h, b2x, b2y, b2w, b2h)
  228.     ' x, y represent the box left most x and top most y
  229.     ' w, h represent the box width and height which is the usual way sprites / tiles / images are described
  230.     ' such that boxbottom = by + bh
  231.     '        and boxright = bx + bw
  232.     'so the specific gosub above is generalized to a function procedure here!
  233.     If (b1y + b1h < b2y) Or (b1y > b2y + b2h) Or (b1x > b2x + b2w) Or (b1x + b1w < b2x) Then
  234.         collision% = 0
  235.     Else
  236.         collision% = -1 ' Collsion is true
  237.     End If
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  

Might be better to do collision check between box and a circle,

Does anyone have that?
Title: Re: JackStack - Halloween puzzle game
Post by: Dav on October 12, 2021, 07:12:54 pm
That circle is  a smart way to see what's going on there.   I shrank the witch boundaries a little, and this seems to be look better with most collisions - no hits so far away as to look odd. 

Code: QB64: [Select]
  1. hit = collision%(wx1 + 15, wy1 + 15, 60, 60, jackysx(j) - 37, jackysy(j) - 37, 60, 60)
  2.  

- Dav

Title: Re: JackStack - Halloween puzzle game
Post by: bplus on October 12, 2021, 09:12:01 pm
Excellent!

Had to rush to get mom to doc appointment so I'm sorry I didn't think of this the first time around but now checking your box circle numbers, I put white frames for the witch borders to check :
Code: QB64: [Select]
  1.  
  2.  
  3. Screen _NewImage(640, 640, 32)
  4.  
  5. board& = _LoadImage("background.png", 32)
  6. jack& = _LoadImage("pumpkin.png")
  7. witch& = _LoadImage("witch.png"): witchx = -300: witchy = 100 + (Rnd * 300)
  8. grass& = _LoadImage("grass.png")
  9. candy& = _LoadImage("candy.png")
  10.  
  11. jackys = 7
  12. Dim Shared jackysx(jackys), jackysy(jackys), jackysr(jackys)
  13.  
  14. raise& = _SndOpen("sfx_roll.ogg")
  15.  
  16. '======
  17. restart:
  18. '======
  19.  
  20. witchflyx = 20
  21. witchflyy = 300
  22. grassx = 0
  23.  
  24. candycount = 0
  25.  
  26. For j = 1 To jackys
  27.     jackysx(j) = _Width + (Rnd * _Width) * 2
  28.     jackysy(j) = 40 + (Rnd * (_Height - 100))
  29.     jackysr(j) = Rnd * 360
  30.  
  31.  
  32.  
  33.     Cls , _RGB(99, 49, 0)
  34.  
  35.     PPRINT 300, 10, 16, _RGB(255, 255, 255), 255, Str$(candycount)
  36.  
  37.     _PutImage (grassx, 0), grass&
  38.     _PutImage (grassx + 640, 0), grass&
  39.  
  40.     'draw candies
  41.     For j = 1 To jackys
  42.         '_PUTIMAGE (jackysx(j), jackysy(j)), candy&
  43.         RotoZoom3 jackysx(j), jackysy(j), candy&, 1, 1, _D2R(jackysr(j))
  44.         ' check boundary of images with circles, confirm  jackysx(j), jackysy(j) is a center NOT a CORNER
  45.         Circle (jackysx(j), jackysy(j)), 75 / 2, &HFFFFFFFF
  46.         jackysr(j) = jackysr(j) + 3
  47.         If jackysr(j) > 360 Then jackysr(j) = 1
  48.     Next
  49.  
  50.     'if pressed space
  51.     If Inp(&H60) = 57 Then
  52.  
  53.         If Not _SndPlaying(raise&) Then _SndPlay raise&
  54.  
  55.         witchflyy = witchflyy - 2
  56.         witchflyx = witchflyx + 1
  57.     Else
  58.         _SndStop raise&
  59.         witchflyy = witchflyy + 1
  60.         witchflyx = witchflyx - .5
  61.     End If
  62.  
  63.     'keep witch in bounds
  64.     If witchflyx < 5 Then witchflyx = 5
  65.     If witchflyx > _Width - 75 Then witchflyx = _Width - 75
  66.     If witchflyy < 40 Then witchflyy = 40
  67.     If witchflyy > 500 Then witchflyy = 500
  68.  
  69.     _Limit 150
  70.  
  71.     _PutImage (witchflyx, witchflyy), witch&
  72.     '   collision%(wx1 + 15, wy1 + 15, 60, 60, jackysx(j) - 37, jackysy(j) - 37, 60, 60) ' dav's mod
  73.     Line (witchflyx + 15, witchflyy + 15)-Step(60, 60), &HFFFFFFFF, B
  74.     _Display
  75.  
  76.     grassx = grassx - 1
  77.     If grassx <= -640 Then grassx = 0
  78.  
  79.  
  80.     '========================= collision dectection here ===========
  81.  
  82.     'see if witch hit a candy
  83.     For j = 1 To jackys
  84.  
  85.         wx1 = witchflyx: wy1 = witchflyy
  86.         wx2 = wx1 + 75: wy2 = wy1 + 75
  87.         jx1 = jackysx(j): jy1 = jackysy(j)
  88.         jx2 = jx1 + 75: jy2 = jy1 + 75
  89.  
  90.  
  91.         'hit = 0
  92.         'If wx2 >= jx1 Then
  93.         '    If wx1 <= jx2 Then
  94.         '        If wy2 >= jy1 Then
  95.         '            If wy1 <= jy2 Then hit = 1
  96.         '        End If
  97.         '    End If
  98.         'End If
  99.         'hit = collision%(wx1, wy1, 75, 75, jackysx(j) - 37, jackysy(j) - 37, 60, 60)
  100.         hit = collision%(wx1 + 15, wy1 + 15, 60, 60, jackysx(j) - 37, jackysy(j) - 37, 60, 60) ' dav's mod
  101.         If hit Then
  102.             _SndPlayFile "sfx_dropdown.mp3"
  103.             _Display
  104.             _Delay 2
  105.  
  106.             Cls , _RGB(99, 49, 0)
  107.             PPRINT 300, 10, 16, _RGB(255, 255, 255), 255, Str$(candycount)
  108.             _PutImage (grassx, 0), grass&
  109.             _PutImage (grassx + 640, 0), grass&
  110.  
  111.             'draw jacks
  112.             For j2 = 1 To jackys
  113.                 ' _PUTIMAGE (jackysx(j), jackysy(j)), candy&
  114.                 RotoZoom3 jackysx(j2), jackysy(j2), candy&, 1, 1, _D2R(jackysr(j2))
  115.             Next
  116.  
  117.             tmp& = _CopyImage(_Display)
  118.             'spin witch out here
  119.             r = 1
  120.             For dy = witchflyy + 35 To _Height Step 3
  121.                 _PutImage (0, 0), tmp&
  122.                 RotoZoom3 witchflyx + 75, dy, witch&, 1, 1, _D2R(r)
  123.                 r = r + 5: If r > 360 Then r = 1
  124.                 _Limit 150
  125.                 _Display
  126.             Next
  127.             _FreeImage tmp&
  128.  
  129.             Exit Do
  130.  
  131.         End If
  132.  
  133.     Next
  134.  
  135.  
  136.     'move candies, compute
  137.     For j = 1 To jackys
  138.  
  139.         jackysx(j) = jackysx(j) - 2
  140.         If jackysx(j) < -75 Then
  141.  
  142.             candycount = candycount + 1
  143.  
  144.             'If won...
  145.             If candycount > 75 Then
  146.                 _SndPlayFile "sfx_clap.ogg"
  147.                 _Delay 3
  148.                 End
  149.             End If
  150.  
  151.             jackysx(j) = _Width + (Rnd * _Width) * 2
  152.             jackysy(j) = 40 + (Rnd * (_Height - 100))
  153.         End If
  154.     Next
  155.  
  156.  
  157. GoTo restart
  158.  
  159.  
  160.  
  161. Sub PPRINT (x, y, size, clr&, trans&, text$)
  162.     'This sub outputs to the current _DEST set
  163.     'It makes trans& the transparent color
  164.  
  165.     'x/y is where to print text
  166.     'size is the font size to use
  167.     'clr& is the color of your text
  168.     'trans& is the background transparent color
  169.     'text$ is the string to print
  170.  
  171.     '=== get users current write screen
  172.     orig& = _Dest
  173.  
  174.     '=== if you are using an 8 or 32 bit screen
  175.     bit = 32: If _PixelSize(0) = 1 Then bit = 256
  176.  
  177.     '=== step through your text
  178.     For t = 0 To Len(text$) - 1
  179.         '=== make a temp screen to use
  180.         pprintimg& = _NewImage(16, 16, bit)
  181.         _Dest pprintimg&
  182.         '=== set colors and print text
  183.         Cls , trans&: Color clr&
  184.         Print Mid$(text$, t + 1, 1);
  185.         '== make background color the transprent one
  186.         _ClearColor _RGB(0, 0, 0), pprintimg&
  187.         '=== go back to original screen  to output
  188.         _Dest orig&
  189.         '=== set it and forget it
  190.         x1 = x + (t * size): x2 = x1 + size
  191.         y1 = y: y2 = y + size
  192.         _PutImage (x1 - (size / 2), y1)-(x2, y2 + (size / 3)), pprintimg&
  193.         _FreeImage pprintimg&
  194.     Next
  195.  
  196. ' Description:
  197. ' Started from a mod of Galleon's in Wiki that both scales and rotates an image.
  198. ' This version scales the x-axis and y-axis independently allowing rotations of image just by changing X or Y Scales
  199. ' making this tightly coded routine a very powerful and versatile image tool.
  200.  
  201.  
  202. Sub RotoZoom3 (X As Long, Y As Long, Image As Long, xScale As Single, yScale As Single, radianRotation As Single)
  203.     ' This assumes you have set your drawing location with _DEST or default to screen.
  204.     ' X, Y - is where you want to put the middle of the image
  205.     ' Image - is the handle assigned with _LOADIMAGE
  206.     ' xScale, yScale - are shrinkage < 1 or magnification > 1 on the given axis, 1 just uses image size.
  207.     ' These are multipliers so .5 will create image .5 size on given axis and 2 for twice image size.
  208.     ' radianRotation is the Angle in Radian units to rotate the image
  209.     ' note: Radian units for rotation because it matches angle units of other Basic Trig functions
  210.     '       and saves a little time converting from degree.
  211.     '       Use the _D2R() function if you prefer to work in degree units for angles.
  212.  
  213.     Dim px(3) As Single: Dim py(3) As Single ' simple arrays for x, y to hold the 4 corners of image
  214.     Dim W&, H&, sinr!, cosr!, i&, x2&, y2& '   variables for image manipulation
  215.     W& = _Width(Image&): H& = _Height(Image&)
  216.     px(0) = -W& / 2: py(0) = -H& / 2 'left top corner
  217.     px(1) = -W& / 2: py(1) = H& / 2 ' left bottom corner
  218.     px(2) = W& / 2: py(2) = H& / 2 '  right bottom
  219.     px(3) = W& / 2: py(3) = -H& / 2 ' right top
  220.     sinr! = Sin(-radianRotation): cosr! = Cos(-radianRotation) ' rotation helpers
  221.     For i& = 0 To 3 ' calc new point locations with rotation and zoom
  222.         x2& = xScale * (px(i&) * cosr! + sinr! * py(i&)) + X: y2& = yScale * (py(i&) * cosr! - px(i&) * sinr!) + Y
  223.         px(i&) = x2&: py(i&) = y2&
  224.     Next
  225.     _MapTriangle _Seamless(0, 0)-(0, H& - 1)-(W& - 1, H& - 1), Image To(px(0), py(0))-(px(1), py(1))-(px(2), py(2))
  226.     _MapTriangle _Seamless(0, 0)-(W& - 1, 0)-(W& - 1, H& - 1), Image To(px(0), py(0))-(px(3), py(3))-(px(2), py(2))
  227.  
  228.  
  229. Function collision% (b1x, b1y, b1w, b1h, b2x, b2y, b2w, b2h)
  230.     ' x, y represent the box left most x and top most y
  231.     ' w, h represent the box width and height which is the usual way sprites / tiles / images are described
  232.     ' such that boxbottom = by + bh
  233.     '        and boxright = bx + bw
  234.     'so the specific gosub above is generalized to a function procedure here!
  235.     If (b1y + b1h < b2y) Or (b1y > b2y + b2h) Or (b1x > b2x + b2w) Or (b1x + b1w < b2x) Then
  236.         collision% = 0
  237.     Else
  238.         collision% = -1 ' Collsion is true
  239.     End If
  240.  
  241.  

Looks about right.

@Dav have you considered how to have some sort of a reasonable path through corn at all times or maybe the witch deserves to die to random placements of obstacles. Flappy bird always had a hole between pipes and pipes were spaced so you could drop or rise in time to get through placements.

Code: QB64: [Select]
  1. For j = 1 To jackys
  2.     jackysx(j) = _Width + (Rnd * _Width) * 2
  3.     jackysy(j) = 40 + (Rnd * (_Height - 100))
  4.     jackysr(j) = Rnd * 360
  5.  

Are you putting Candy on like a scroll for like a player piano, punching holes where candy is, so you just recycle to the scroll as you come to the end? I am not seeing new candy being created anywhere else in code, maybe I missed it. If true I am surprised, I didn't pick up on the pattern recycle. And If True you could draw a path in scroll the forbids random placement of a candy on the path. That way you don't make an impossible game. The path would have to end same place it starts and never turn more than witch could rise or fall.
Title: Re: JackStack - Halloween puzzle game
Post by: Dav on October 13, 2021, 09:51:22 am
It's hidden in the moving candies part.  When a candy goes off screen on the left then re-spawn it on the right somewhere. It would probably be a better idea to have a layout of somekind, so there would always be a way through when playing good.

- Dav


Code: QB64: [Select]
  1.     'move candies, compute
  2.     FOR j = 1 TO jackys
  3.  
  4.         jackysx(j) = jackysx(j) - 2
  5.         IF jackysx(j) < -75 THEN    '<<<<<<<< here it says bye
  6.  
  7.             candycount = candycount + 1
  8.  
  9.             'If won...
  10.             IF candycount > 75 THEN
  11.                 _SNDPLAYFILE "sfx_clap.ogg"
  12.                 _DELAY 3
  13.                 END
  14.             END IF
  15.  
  16.             jackysx(j) = _WIDTH + (RND * _WIDTH) * 2   '<<<<<< and here make new values
  17.             jackysy(j) = 40 + (RND * (_HEIGHT - 100))
  18.         END IF
  19.     NEXT
Title: Re: JackStack - Halloween puzzle game
Post by: bplus on October 17, 2021, 11:51:28 am
@Dav are you still dabbling with this? I have an idea for a Halloween Variation. You might look at what I was criticizing and arrive at same simple, easy fix solution. Hint, hint... ;-))
Title: Re: JackStack - Halloween puzzle game
Post by: Dav on October 17, 2021, 12:41:08 pm
I've haven't been the past few days, my music work has kind of piling up on me, but if you have an idea I sure would like to see it.   

- Dav
Title: Re: JackStack - Halloween puzzle game
Post by: bplus on October 17, 2021, 01:24:25 pm
Hi @Dav, Check your PM's.