[icon ] blenderdumbass . org [icon scene] Articles

Winning Dani's Race ScoreBoard on WINdows

July 02, 2026

πŸ‘ 17

https://blenderdumbass.org/do_edit : πŸ‘ 1
https://blenderdumbass.org/articles/winning_dani_s_race_scoreboard_on_windows : πŸ‘ 1
https://blenderdumbass.org/ : πŸ‘ 4
https://blenderdumbass.org/comment?url=articles%2Fwinning_dani_s_race_scoreboard_on_windows&username=&warning=&text=c%3A1%0D%0A%0D%0A%40blenderdumbass+I%27ve+had+people+tell+me+that+the+windows+way+is+as+good+as+any+other+but+yes+it+is+very+much+not+POSIX.%0D%0A%0D%0AI+know+that+in+Golang+you+can+use+a+function+called+userConfigDir+https%3A%2F%2Fpkg.go.dev%2Fos%23UserConfigDir+to+get+an+os+specific+config+directory+and+filepath.Join+to+join+files+in+an+os+specific+way+but+I%27m+not+sure+what+the+python+equivalent+is. : πŸ‘ 1
https://blenderdumbass.org/articles/so_why_the_hell_this_math_nans_out__help_me_ : πŸ‘ 1

#danisrace #moriasrace #game #gamedev #freesoftware #blender3d #python #windows #leaderboard #programming #hacking

License:
Creative Commons Attribution Share-Alike

[avatar]by Troler

Free Software fundamentally misses the point. It fails on a practical, ideological, economic, and political level. Let’s examine precisely how (in a slightly different order for the purposes of presentation).


6 Minute Read



Whatever you may image a game is, that is not Dani's race. It is a social construct created by @BlenderDumbass to make you follow the cult of free software. And he has gone to such a length at making sure his idea is as presentable, he even created a ScoreBoard for it. Still not a game, because a game by definition is not Dani's race. Or something like that. Ignore what I'm writing, this article is stupid, you're stupid! ↩ Reply

Okay, for real, what's the problem here? Well, I want to get the scoreboard working on Dani's race, but I'm using Winblows operating system. That means a lot of things are broken. That's because Dani's race was developed for the Tux operating system. ↩ Reply

First what I did was run python.exe .\notgitwindows.py update, which is an adapted version of notgit.py for Windows. First, it changes / to \, because Windows separates directories differently. It copies the settings.py file from a special folder called billgates to the main directory, because Linux writes stuff to the /home directory, which doesn't exist on Windows. Instead I saves it to an ad-hoc directory on Windows. This hack and some minor adjustments, make so settings.py doesn't have to be modified every update. ↩ Reply

I tried running the game from UPBGE, but it didn't get past the load screen. That's to be expected, there were changes to the settings.py file. As such, I went to https://blenderdumbass.org/danisrace/download//Scripts/Settings.py and downloaded the settings.py file supplied by the game. Then I do a diff -B to see what are the changes, without whitespace. ↩ Reply

This is what I saw: ↩ Reply
$ diff -B Settings.py Settingsnew.py
5a6,7
> import time
> import getpass
18a21
>     from Scripts import Online
31c34
<         data_dir = os.path.expanduser("C:\\Superfluous\\DanisRace\\config")
---
>         data_dir = os.path.expanduser("~/.local/share/"+game)
165c168
<         "veh_shoot"    :"shoot",
---
>         "veh_shoot"    :"shoot",
193a197,198
>     settings = bge.logic.globalDict.get("settings")
>
196a202,207
>     if bge.logic.globalDict.get("save-game-name"):
>         data["name"] = bge.logic.globalDict["save-game-name"]
>
>     data["online"] = bge.logic.globalDict.get("send-stats-online", False)
>     data["username"] = settings.get("username", getpass.getuser())
>
209a221,229
>
>     # Recording total time spent by the player in the game.
>     data["time-played"] = bge.logic.globalDict.get("time-played", 0) + bge.logic.getRealTime()
>     data["lastsession"] = {
>         "time-played":bge.logic.getRealTime(),
>         "timestamp":float(time.time())
>     }
>
>     data["cheats-used"] = bge.logic.globalDict.get("cheats-used", 0)
220a241,243
>     if bge.logic.globalDict.get("send-stats-online"):
>         Online.SendAccount(f)
>
227c250
<
---
>
237a261,263
>     bge.logic.globalDict["save-game-name"] = data.get("name")
>     bge.logic.globalDict["send-stats-online"] = data.get("online")
>
254c280,286
<
---
>
>     # To keep track of players time spent in the game
>     bge.logic.globalDict["time-played"] = data.get("time-played", 0)
>
>     # Keeping track of used cheats
>     bge.logic.globalDict["cheats-used"] = data.get("cheats-used", 0)
c:1


Pretty confusing, isn't it? Well the > shows what was added, so I just add those lines, in this case there are now time and getpass functions. There were more things I added, but the steps are just copy pasting what's needed. c:1 ↩ Reply

But that's not! Oh, the malevolent gamedev BlenderDumbass doesn't want Windows users to have a nice time updating the game. He must impart suffering. The file Scripts/Online.py, there's a direct use of curl. But my version of Windows has curl.exe, meaning I had to put Online.py to billgates folder and change notgitwindows.py file. The issue is that Online.py import notgit.py, which has GetGameId() function, that's not present in notgitwindows.py file. So I had to manually add it. ↩ Reply

But 'twasn't as simple a M-w C-y, since there is this line: ↩ Reply
return open(GETCWD()+"/.notgit/gameid").read()



I had to change the forward slashes to Windows' equivalent. And there's a also a need for SaveGameID() function, which also had to be converted. And on top of that, the function GetSimple() got updated as well. Which means I had to convert it to a Windows friendly language. At this point I'm considering that the 90s monopoly of Windows wasn't such a bad thing. You had a single OS you had to deal with, Linux and MacOS were for weirdos. Those were the days. Everything just werked. But now I have to patch Python code. Python! A cross-platform language. What is this C++ hell?! ↩ Reply

Besides that, for fun I changed .notgit/gameid file to have my username in it. FreeSoftware, you can do whatever you want! ↩ Reply

So I went to the Scoreboard JSON file and saw that there were two new values: name and online. Online value must be set to true, to have a leaderboard. As such, I added these values to my config/save.json file, because that's where I set it in Settings.py file. ↩ Reply

In config/config.json I added the value username with my username. This way the game would know how I'm called. ↩ Reply

And then I ran the game. As expected it didn't run, because BlenderdDumbass hates people who use Windows. There's event this pop-up on the website that tells you to install LiGNUx. ↩ Reply

But the game didn't run not because of something I did, no 'twas a NaN bug. Seems like BlenderDumbass didn't think LiGNUx and Windows treats NaN differently, or something. But that doesn't really make sense, why would they treat it differently. ↩ Reply

Yet, by the turn of irony, I'm on the ScoreBoard. Yet, not all hope was lost. I decided to play the game while in editing mode, by pressing the button P. It worked! ↩ Reply

Then I loaded the game normally again. And this time it worked. How, I do not know. Computers are magic and BlenderDumbass is a dumbass, so he must've written the code in such a way it works 99.999% of the time. ↩ Reply

I was able to finally try out the custom races update. ↩ Reply

Happy Hacking!!! ↩ Reply

Errr, ↩ Reply
Fin ↩ Reply

[icon unlike] 0
[icon right]
[icon terminal]
[icon markdown]

Find this post on Mastodon

[avatar]  Blender Dumbass c:0 July 02, 2026


Whatever you may image a game is, that is not Dani's race.


Literally the first lines in



[icon reply]
[avatar]  Blender Dumbass c:1 July 02, 2026


First what I did was run python.exe .\notgitwindows.py update, which is an adapted version of notgit.py for Windows. First, it changes / to \, because Windows separates directories differently. It copies the settings.py file from a special folder called billgates to the main directory, because Linux writes stuff to the /home directory, which doesn't exist on Windows. Instead I saves it to an ad-hoc directory on Windows. This hack and some minor adjustments, make so settings.py doesn't have to be modified every update.


Translating for the normal person.

Troler had an issue with Dani's Race on Windows. He tried to fix it by changing the code I wrote for it. Specifically he did 2 things. First he opened the Scripts.Settings.py file and changed the function that finds the save-folder ( a folder where the save data is stored ).

In the original Scripts.Settings.py the function looks like this:

def get_settings_folder(game="danisrace"):

    
    
    try:
        data_dir = os.environ["XDG_DATA_HOME"] + "/" + game
    except:
        data_dir = os.path.expanduser("~/.local/share/"+game)

    try:
        os.makedirs(data_dir)
    except:
        pass

    return data_dir




Where if you can see, it tries to give you the folder ~/.local/share/danisrace. If you play the game on GNU / Linux this is where your save-file and config file and stuff will end up being. But this folder cannot exist on Windows.

First of all the ~ sign itself is something that I believe makes no sense on Windows. This is a short way to refer to the users home directory. For me it is /home/vcs for you it could be something else. This is why the game code uses specifically ~ and is not trying to hardcode anything.

Secondly the whole concept of separating folders with / is inherently up-side-down in Windows. Every other operating system uses / but Windows uses fucking \ instead. Just to be different I guess. What the fuck, Microslop!?!

The problem is that \ in python represents an escape symbol. Say you want to write a string Hello World in python and assign it to x.

x = "Hello World"

‴ View

But say you want it to be Hello "World"? Do you do?:

x = "Hello "World""



No. It will fail. It will crash. It will tell you that you have an error somewhere in the code. It will fail to understand you. It will think that Hello is the string. And then you just put a World variable, without any operation. And then just an empty string "" in the end. So how can you do that.

Well...

You can do:

x = "Hello \"World\""



Where the \ before the " is the trick to let python understand you. But what if you want to actually use \ itself? Well fuck that. You must do \\ then.

So this url /home/vcs/.local/share/danisrace in Windows will look like this C:\\home\\vcs\\.local\\share\\danisrace. WHAT THE FUCK?!!?!

But then when you download updates ( with the notgit.py ) you must save them into the \\ Windows way, but fetch them in the / standard way, because guess what, internet urls aren't windows-stupid.

Basically yes.

... replies ( 1 )
[avatar]  AnonymousGuest c:3 July 04, 2026



@blenderdumbass I've had people tell me that the windows way is as good as any other but yes it is very much not POSIX.

I know that in Golang you can use a function called userConfigDir https://pkg.go.dev/os#UserConfigDir to get an os specific config directory and filepath.Join to join files in an os specific way but I'm not sure what the python equivalent is.




[icon reply]
[avatar]  Blender Dumbass c:2 July 02, 2026


I tried running the game from UPBGE, but it didn't get past the load screen.


The game is developed using the UPBGE engine. Specifically version 0.36.1. It is a Blender fork with the old BGE added back in. It tries to combine both old and new blender features together to make a game engine. Technically speaking there is a version for Microslop Losethose. And you can technically run the game by opening the files of the game in the engine editor and running it from there.

Will it be a good experience? IDK. But you can. Technically.

[icon reply]
[avatar]  AnonymousGuest c:3 July 04, 2026


... c:1
[avatar]  Blender Dumbass c:1 July 02, 2026


First what I did was run python.exe .\notgitwindows.py update, which is an adapted version of notgit.py for Windows. First, it changes / to \, because Windows separates directories differently. It copies the settings.py file from a special folder called billgates to the main directory, because Linux writes stuff to the /home directory, which doesn't exist on Windows. Instead I saves it to an ad-hoc directory on Windows. This hack and some minor adjustments, make so settings.py doesn't have to be modified every update.


Translating for the normal person.

Troler had an issue with Dani's Race on Windows. He tried to fix it by changing the code I wrote for it. Specifically he did 2 things. First he opened the Scripts.Settings.py file and changed the function that finds the save-folder ( a folder where the save data is stored ).

In the original Scripts.Settings.py the function looks like this:

def get_settings_folder(game="danisrace"):

    
    
    try:
        data_dir = os.environ["XDG_DATA_HOME"] + "/" + game
    except:
        data_dir = os.path.expanduser("~/.local/share/"+game)

    try:
        os.makedirs(data_dir)
    except:
        pass

    return data_dir




Where if you can see, it tries to give you the folder ~/.local/share/danisrace. If you play the game on GNU / Linux this is where your save-file and config file and stuff will end up being. But this folder cannot exist on Windows.

First of all the ~ sign itself is something that I believe makes no sense on Windows. This is a short way to refer to the users home directory. For me it is /home/vcs for you it could be something else. This is why the game code uses specifically ~ and is not trying to hardcode anything.

Secondly the whole concept of separating folders with / is inherently up-side-down in Windows. Every other operating system uses / but Windows uses fucking \ instead. Just to be different I guess. What the fuck, Microslop!?!

The problem is that \ in python represents an escape symbol. Say you want to write a string Hello World in python and assign it to x.

x = "Hello World"

‴ View

But say you want it to be Hello "World"? Do you do?:

x = "Hello "World""



No. It will fail. It will crash. It will tell you that you have an error somewhere in the code. It will fail to understand you. It will think that Hello is the string. And then you just put a World variable, without any operation. And then just an empty string "" in the end. So how can you do that.

Well...

You can do:

x = "Hello \"World\""



Where the \ before the " is the trick to let python understand you. But what if you want to actually use \ itself? Well fuck that. You must do \\ then.

So this url /home/vcs/.local/share/danisrace in Windows will look like this C:\\home\\vcs\\.local\\share\\danisrace. WHAT THE FUCK?!!?!

But then when you download updates ( with the notgit.py ) you must save them into the \\ Windows way, but fetch them in the / standard way, because guess what, internet urls aren't windows-stupid.

Basically yes.


@blenderdumbass I've had people tell me that the windows way is as good as any other but yes it is very much not POSIX.

I know that in Golang you can use a function called userConfigDir https://pkg.go.dev/os#UserConfigDir to get an os specific config directory and filepath.Join to join files in an os specific way but I'm not sure what the python equivalent is.

... replies ( 1 )
[avatar]  Blender Dumbass c:5 July 04, 2026



@AnonymousGuest Frankly, if I make it work well on Windows out of the box, there will be no joke about it all. I want something that technically works on windows, but you have to jump through hoops. While on GNU / Linux you don't jump through anything. A reversal of what people usually complain about.




[icon reply]
[avatar]  AnonymousGuest c:4 July 04, 2026


Whatever you may image a game is, that is not Dani's race. It is a social construct created by @BlenderDumbass to make you follow the cult of free software. And he has gone to such a length at making sure his idea is as presentable, he even created a ScoreBoard for it. Still not a game, because a game by definition is not Dani's race. Or something like that. Ignore what I'm writing, this article is stupid, you're stupid!


Free software is not a cult it is a religion: https://invidious.nerdvpn.de/watch?v=1jPmnDZ6ab8

There is no system but GNU and Linux is one of its kernels.

Unfortunately typing this from my Windows machine.

[icon reply]
[avatar]  Blender Dumbass c:5 July 04, 2026


... c:3
[avatar]  AnonymousGuest c:3 July 04, 2026


c:1

@blenderdumbass I've had people tell me that the windows way is as good as any other but yes it is very much not POSIX.

I know that in Golang you can use a function called userConfigDir https://pkg.go.dev/os#UserConfigDir to get an os specific config directory and filepath.Join to join files in an os specific way but I'm not sure what the python equivalent is.


@AnonymousGuest Frankly, if I make it work well on Windows out of the box, there will be no joke about it all. I want something that technically works on windows, but you have to jump through hoops. While on GNU / Linux you don't jump through anything. A reversal of what people usually complain about.

[icon reply]
[icon question]











[icon articles]So Why The Hell this math NaNs out? Help me!

[thumbnail]

[avatar]  Blender Dumbass

πŸ‘ 25 ❀ 3 πŸ”„ 1 πŸ’¬ 1



Why does ( 1 / ( D ( ( T - carD"prevT" 2 ) ) ) result in a NaN? What is going on?


#danisrace #moriasrace #game #gamedev #freesoftware #blender3d #python #programming #hacking #NAN


[icon articles]Dani's Race and notgit.py ( Updater )

[thumbnail]

[avatar]  Blender Dumbass

πŸ‘ 30 ❀ 4 πŸ”„ 1 πŸ’¬ 4



Not so long ago I decided to forgo the wisdom of using git for this game. Instead, most changes will be recorded via the notgit.py program I wrote for fun the other day.


#danisrace #moriasrace #game #gamedev #freesoftware #blender3d #git #python #programming #hacking


[icon articles]Have I given up on Dani's Race?

[thumbnail]

[avatar]  Blender Dumbass

πŸ‘ 30 ❀ 2 πŸ”„ 1 πŸ’¬ 1



Dani's Race development has been halted. The last changes to the project I've done maybe more than 6 months ago. The game still contains a lot of bugs and only 3 story missions. And it still runs like ass, averaging 20 fps on average laptops.



#danisrace #moriasrace #game #gamedev #freesoftware #blender3d #git


[icon articles]Winning Dani's Race ScoreBoard on WINdows

[thumbnail]

[avatar]  Troler

πŸ‘ 17 πŸ’¬ 6



I want to get the scoreboard working on Dani's race, but I'm using Winblows operating system. That means a lot of things are broken. That's because Dani's race was developed for the Tux operating system.


#danisrace #moriasrace #game #gamedev #freesoftware #blender3d #python #windows #leaderboard #programming #hacking


[icon videos]PeerTube | Bugs! How are they fixed? | Also First Person Mode | Dani's Race UPBGE Blender 3D on GNU / Linux

[thumbnail]

[avatar]  Blender Dumbass

πŸ‘ 31 πŸ’¬ 16



In this video I fix some bugs in Dani's Race. And also implement a first person mode.


#DanisRace #MoriasRace #Game #UPBGE #blender3d #animation #GTAClone #programming #project #gamedev #freesoftware #gnu #linux #opensource


[icon videos]PeerTube | Making Addon Karts for SuperTuxKart

[thumbnail]

[avatar]  Blender Dumbass

πŸ‘ 49 ❀ 12 πŸ”„ 3 πŸ’¬ 2



As you probably have guessed by my username, I know Blender. And I also know how to make SuperTuxKart addons. So I decided to make a Fedi-based series of tutorials explaining how I go from zero to a finished addon. This first part focuses on Karts ( since they are a bit simpler).


#supertuxkart #gamedev #freesoftware #tux #karting #racing #game #modding #addons #blender3d #b3d #tutorial #peertube #fediverse #opensource


[icon codeberg] Powered with BDServer [icon python] Plugins [icon theme] Themes [icon analytics] Analytics [icon email] Contact [icon mastodon] Mastodon
[icon unlock]