[Release] BoulderCaves+, a Krissz Engine compatible remake
Moderator: Admin
- SheepsTooth
- Member
- Posts: 6
- Joined: Fri Sep 04, 2020 6:20 pm
Thank you so much for the kind words!SheepsTooth wrote:Hello Agetian,
I just wanted to thank you for the work you have put into this project - it is much appreciated.
I don't get to play nearly as much as I'd like to these days but when I do I shall use your version of the remake.
Enjoy the holidays!

- Agetian
- Chris Neilson
- Member
- Posts: 33
- Joined: Wed Aug 29, 2007 2:53 am
There error at editor

Here map code is
if there firefly and butterfly direction
Firefly direction: o-up O-right Q-left q-down
butterfly direction: b-up B-right C-left c-down
if space or dirt or etc. is not direction.
firefly or butterfly direction at editor. whlie playtest or save.PLAYTESTING: saving temporary cave file...
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\Chris\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__
return self.func(*args)
File "C:\Users\Chris\Desktop\Chris Neilson\Python\Boulder Cave\Source\bouldercaves\editor.py", line 934, in playtest
if self.save(gamefile):
File "C:\Users\Chris\Desktop\Chris Neilson\Python\Boulder Cave\Source\bouldercaves\editor.py", line 899, in save
mapline += BDCFFSYMBOL[obj, direction]
KeyError: (<GameObject EMPTY (#0) at 0x190044c8430>, <Direction.RIGHT: 'r'>)

Here map code is
Code: Select all
[map]
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WP.....................................W
W......................................W
W......................................W
W........ .............................W
W........ .............................W
W........ .............................W
W........ ............ ................W
W........o............ ................W
W........ ............ ................W
W.. Q O ....b................W
W........ ............ ................W
W........q...... C B ......W
W........ ............ ................W
W........ ............c................W
W........ ............ ................W
W........ ............ ................W
W........ ............ ................W
W..................... ................W
W......................................W
W.....................................XW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
[/map]
Firefly direction: o-up O-right Q-left q-down
butterfly direction: b-up B-right C-left c-down
if space or dirt or etc. is not direction.
Boulder Dash Construction Kit
Crazy Light Construction Kit
GDash <> XDC-engine
Crazy Light Construction Kit
GDash <> XDC-engine
Hi Chris, thanks for the report!
It was a little tricky to reproduce, but I think I figured out what the problem was. I released an update which will hopefully fix this
If it still persists, let me know and I'll look around some more.
UPDATE (12/26/21): Version 1.1.2 has been released. It's a minor bugfix release addressing the following issue:
* Editor: fix a bug with the direction improperly assigned to objects that can't have a direction in certain cases when RMB-erasing objects.
- Agetian
It was a little tricky to reproduce, but I think I figured out what the problem was. I released an update which will hopefully fix this

UPDATE (12/26/21): Version 1.1.2 has been released. It's a minor bugfix release addressing the following issue:
* Editor: fix a bug with the direction improperly assigned to objects that can't have a direction in certain cases when RMB-erasing objects.
- Agetian
- Chris Neilson
- Member
- Posts: 33
- Joined: Wed Aug 29, 2007 2:53 am
Hey. there problem with width or height cave with open border.
to
I playtest the cave went through.

A min/max is 2 - 100 + open border (100).
I change the code game.py at line 425ValueError: invalid playfield/cave width or height (2-100)
Code: Select all
if width < 2 or width > 100 + self.mirrored_border_size or height < 2 or height > 100 + self.mirrored_border_size:
Code: Select all
if width < 2 or width > 100 + 100 or height < 2 or height > 100 + 100:

A min/max is 2 - 100 + open border (100).
Boulder Dash Construction Kit
Crazy Light Construction Kit
GDash <> XDC-engine
Crazy Light Construction Kit
GDash <> XDC-engine
Thanks for the report, Chris! Fixed 
UPDATE (12/27/21): Version 1.1.3 is released. It's a bugfix release that addresses the following issues:
* Fixed a bug that caused the maximum allowed open border size to be less than what's needed for a map with width/height above 90.
* Converted the slow per-object checks in the editor and cave decoder to faster per-ID checks (only noticeable in the editor on slower legacy hardware).
- Agetian

UPDATE (12/27/21): Version 1.1.3 is released. It's a bugfix release that addresses the following issues:
* Fixed a bug that caused the maximum allowed open border size to be less than what's needed for a map with width/height above 90.
* Converted the slow per-object checks in the editor and cave decoder to faster per-ID checks (only noticeable in the editor on slower legacy hardware).
- Agetian
Hi.
I noticed a little inconsistency with the original BD,
the intermission caves are movable here, they move.
In the original BD, the intermission caves stood still.
The cool thing about BC +, as well as Gdash, is the Rockford animation pushing the boulder through.
This is the idea for future releases:
Could Rockford's animations be extended to what they are in "Boulder dashes" by Honz Liepa.
Such a small thing, and it makes me happy.
greetings
I noticed a little inconsistency with the original BD,
the intermission caves are movable here, they move.
In the original BD, the intermission caves stood still.
The cool thing about BC +, as well as Gdash, is the Rockford animation pushing the boulder through.
This is the idea for future releases:
Could Rockford's animations be extended to what they are in "Boulder dashes" by Honz Liepa.
Such a small thing, and it makes me happy.
greetings
Hi! That's an interesting observation, can you give an example of this? Usually intermission caves are small and I guess they shouldn't scroll anyway, but maybe there's a special case of some sort that I'm missing. At any rate, this should be relatively straightforward to implement, I just need to know what kind of an effect would be desirable exactly, and possibly an example cave where this would manifest itself and could be tested.zsom wrote:Hi.
I noticed a little inconsistency with the original BD,
the intermission caves are movable here, they move.
In the original BD, the intermission caves stood still.
I think it should be possible, but I'm not familiar with "Boulder Dashes", I'd need to look into it to determine what differences are meantzsom wrote: This is the idea for future releases:
Could Rockford's animations be extended to what they are in "Boulder dashes" by Honz Liepa. Such a small thing, and it makes me happy.

- Agetian
-
- Member
- Posts: 15
- Joined: Tue Dec 14, 2021 10:52 pm
I don't know what the actual cave size for intermission is set for C64, but I guess it's reasonable to scroll the cave if it's still just 40x22, but filled with titanium wall, the game will see that rendered area is still in an acceptable range (between 0 and 40 width, and 0-22 height).Agetian wrote:I just need to know what kind of an effect would be desirable exactly
I can think of two solutions:
- there is an Intermission flag in the cave file, I believe you could just disable scrolling if the current cave is an intermission
- set max cave size if the current cave is an intermission to maximum that is your rendered, visible area (or an actual 20x12 intermission)
With solution two, intermissions can still be smaller than 20x12, the rest of the cave can still be just filled with titanum wall anyway, but the game won't be able to scroll.
I'd personally just toggle the scrolling if the cave is an intermission.
I also don't see anything in GDash source regarding the scroll for intermissions, can't check things at the moment.
---
A bit of off-topic, yesterday I noticed that in GDash, whenever I just hold a movement button (even if Rockford is not moving), my CPU spikes from 2% usage to 25%

Alright, I changed this upstream so that caves that are marked as "Intermission" no longer scroll. With this approach, they can be 20*11 or smaller (even not necessarily filled with titanium wall, just smaller sized) and they won't scroll, but caves bigger than that and marked as Intermission won't scroll either. Please check to see if this is the desired effect. At the very least, it makes BD1 intermissions not scroll in C64 mode. You'd need to download the current master source to test this behavior since it's not yet in an actual release.
I also spent some time today experimenting with the mysterious "lag spikes" that we're experiencing. It's really weird actually. I narrowed it down to the call to repaint() made from tick_loop() - no other call has quite the effect on "dt", which is the delta time between the current update and the previous one. I then started disabling parts of repaint() to determine what exactly did this, but interersingly, no single part seemed to be the culprit. Moreover, even disabling pretty much all of repaint(), leaving only the increase to the graphics counter in, doesn't solve it - it looks almost as if the very call to repaint was somehow "costly" and would take a random amount of time to complete, sometimes taking nearly 500 ms more than at other times. Disabling repaint() completely made the game update timer "calm down" and stop jumping up and down (there were some minor jumps, but within the 0.1 s range, as opposed to 0.2-0.5 s). Interestingly, the game logic update call doesn't seem to have this kind of an effect on things. So, I'm still stumped as to what's going on there :/
- Agetian
I also spent some time today experimenting with the mysterious "lag spikes" that we're experiencing. It's really weird actually. I narrowed it down to the call to repaint() made from tick_loop() - no other call has quite the effect on "dt", which is the delta time between the current update and the previous one. I then started disabling parts of repaint() to determine what exactly did this, but interersingly, no single part seemed to be the culprit. Moreover, even disabling pretty much all of repaint(), leaving only the increase to the graphics counter in, doesn't solve it - it looks almost as if the very call to repaint was somehow "costly" and would take a random amount of time to complete, sometimes taking nearly 500 ms more than at other times. Disabling repaint() completely made the game update timer "calm down" and stop jumping up and down (there were some minor jumps, but within the 0.1 s range, as opposed to 0.2-0.5 s). Interestingly, the game logic update call doesn't seem to have this kind of an effect on things. So, I'm still stumped as to what's going on there :/
- Agetian
-
- Member
- Posts: 15
- Joined: Tue Dec 14, 2021 10:52 pm
Hmmmm...
Perhaps the delta needs to be updated more frequently?
I can only guess that can be a clue. Updating the delta for cave scanning more frequently with some external timer (to not update the entire game), more than 60 times a sec can result in higher accuracy, let's say update the variable 240 times/s, having 4ms of time difference only for the cave scanner rather than 16ms. This is what I believe can be happening here. There should not be any impact on performance if you run a timer just to update the delta for cave scanner.
Let's say we are playing a cave that has speed of 8fps (125ms per scan)
One tick_loop is 16ms, because you are using floor division (1000 // 60)
So we keep looping every frame, incrementing the delta until it ends up being above 125ms:
16 -> 32 -> 48 -> 64 -> 80 -> 96 -> 112 -> 128 [we run a scan, and we are left with 3 milliseconds]
Next scan:
3+16 -> 19 -> 35 -> 51 -> 67 -> 83 -> 99 -> 115 -> 131 [another scan, and we are left with 6ms)
With each scan you will have to wait for a couple milliseconds more until it eventually gets to this point
12ms + 16 -> 28 -> 44 -> 60 -> 76 -> 92 -> 108 -> 124 -> 140 [new scan]
Heads-up, this is only how I think it works both in BC+ and GDash, haven't tested it out yet.
---
I the end, you could try to find a very close interpretation of JavaScript's setInterval function in Python, maybe that would give some high accuracy updates
Perhaps the delta needs to be updated more frequently?
I can only guess that can be a clue. Updating the delta for cave scanning more frequently with some external timer (to not update the entire game), more than 60 times a sec can result in higher accuracy, let's say update the variable 240 times/s, having 4ms of time difference only for the cave scanner rather than 16ms. This is what I believe can be happening here. There should not be any impact on performance if you run a timer just to update the delta for cave scanner.
Let's say we are playing a cave that has speed of 8fps (125ms per scan)
One tick_loop is 16ms, because you are using floor division (1000 // 60)
So we keep looping every frame, incrementing the delta until it ends up being above 125ms:
16 -> 32 -> 48 -> 64 -> 80 -> 96 -> 112 -> 128 [we run a scan, and we are left with 3 milliseconds]
Next scan:
3+16 -> 19 -> 35 -> 51 -> 67 -> 83 -> 99 -> 115 -> 131 [another scan, and we are left with 6ms)
With each scan you will have to wait for a couple milliseconds more until it eventually gets to this point
12ms + 16 -> 28 -> 44 -> 60 -> 76 -> 92 -> 108 -> 124 -> 140 [new scan]
Heads-up, this is only how I think it works both in BC+ and GDash, haven't tested it out yet.
---
I the end, you could try to find a very close interpretation of JavaScript's setInterval function in Python, maybe that would give some high accuracy updates
- Chris Neilson
- Member
- Posts: 33
- Joined: Wed Aug 29, 2007 2:53 am