![[icon left]](/icon/left) Next
    Next
    
    
    
        ![[icon right]](/icon/right) Previous
    Previous
    
    
A few days ago I had told you that I'm stopping with making the police station in my game 
Dani's Race because it had a 
Spaghetti Code Problem. The 
main() function in the 
Main_Update.py file was 1683 lines of code long and contained way too many things in it. At the moment, the same function is down to 641 lines of code. This is still way too much stuff in the 
main() but this is a hell of a lot of reduction.
  Racing Code
After the article I worked on cleaning the 
main() function by myself and documented some of it on 
Dani's Race Matrix Chatroom. This is when I moved pretty much the majority of the racing code out of 
main() and into 
Racing.py. 
I did not simply dumped the code from 
main() into an equally stupid spaghetti code thing in Racing.py. Instead I've broken it up into 13 individual functions, which are now useful to do various interesting things that weren't possible before.
![Moria sitting in the car in the game. [embedded image]](https://lm.madiator.cloud/pictrs/image/c8b36327-90cf-4e9f-9375-656acd9f53ea.png) 
There is a point in the first story mission where 
Moria sits into a car you bring her and goes on practicing the racetrack. To do this in the 
Script.py I had to manually fool the system to think that Moria is now a part of the race.
if Story["Moria"].get("driving"):
    racepos = [-61.7856, 1028, 0]
    
            
    if Story["Moria"]["driving"].getDistanceTo(racepos) > 2 and "Moria-Practicing" not in Story:
        Story["Moria"]["driving"]["npc"] = "story"
        Story["Moria"]["driving"]["target"] = racepos
        Vehicle.TargetedNPC(Story["Moria"]["driving"])
    
                
    elif "Moria-Practicing" not in Story:
        Story["Moria"]["driving"]["race"] = "RacetrackRace"
        Story["Moria"]["driving"]["npc"]  = "racer"
        Story["Moria"]["driving"]["racing"] = True
        Story["Moria-Practicing"] = True
But now I have a specific function 
StartRace() which can start any race even without Dani being a part of it. 
def StartRace(racename, dani=None):
    
    race = Races()[racename]
    race["started"] = True
    race["start-time"] = bge.logic.getRealTime()
    
    for starter in race["starters"]:
        if starter["cylinder"]:
            DeleteCylinder(starter, ignoreTimer=True)
    
    for racer in race["racers"]:
        racer["racing"] = True
        racer["launchtime"] = 100
        racer["race"] = racename
        
        
        racer["npc"] = "racer"
        racer["active"] = False
        
        racer["beam"] = Reuse.Create("Racer.Indicator")
    
    if dani:
        dani["race"] = racename
        dani["checkpoint"] = 0   
        dani["lap"] = 0
        
        
        scene = bge.logic.getCurrentScene()
        pointer = scene.objects["PointingArrow"]
        posindicator = scene.objects["Dani_Pos_Indicator"]
        timeindicator = scene.objects["Dani_Time_Indicator"]
        lapindicator = scene.objects["Dani_Lap_Indicator"]
        
        posindicator.visible = True
        pointer.visible = True
        timeindicator.visible = True
        lapindicator.visible = True
        
        bge.logic.globalDict["SoundDevice"].play(bge.logic.globalDict["sounds"]["active"]["sound"]) 
This theoretically gives me an ability ( with a minor modification ) to make racing in the city happen in the background. Like once every so often you would be able to stumble upon street racers doing their racing by themselves. Which sounds like it could be a lot of fun and could give the game a bit more life.
In the same time making the functions smaller gave me an ability to look at them more carefully and it made me fix two long lasting bugs: 
Bug #26 and 
Bug #29.
The thing causing both of those bugs was a rather sloppy implementation of the car's spawning. For example, you may drive pass a racing event, for which the race driver cars would spawn. And then you may continue a little bit further, making one of the cars de-spawn and re-spawn again as a car on the road, which is no longer a race car, but which still was recorded in the metadata of the race as a race car in the race. Which you can probably guess did some problems.
![Racing cars spawned for racing. [embedded image]](https://files.mastodon.online/media_attachments/files/113/688/641/706/220/431/original/c1affecd02c6c233.png) 
Also if a car spawned for the race it would not spawn ever again, for some reason, if you go further from the race. Forcing you to restart the game if you want to play the same race twice.
One friend of mine was playing the story mode and one mission required going to a race. But he chose to pass through the race starting zone when going through the previous part in the story. The cars spawned and then when the story needed it to be a race, refused to spawn again, making everything break. So cleaning the 
main() actually helped the game be a bit less buggy, since I saw all those mistakes and fixed them along the way.
Here is a recording of 
my PeerTube livestream where I finished moving the code of the racing. And where I discovered and fixed some of the bugs.
By the way, 
subscribing to the RSS of this website will not only give you new articles, but also notify you when I am streaming on PeerTube.
 The rest of the main
Further I had to move all kinds of other code, such as optimization code and code for doors and elevators. Some of which I did during the livestream that I linked above. 
Later I tried doing another livestream where I tried cleaning the code, but I was tired as hell and so it became a stupid ADHD-fest where I ended up working on the Police Station instead, in the end, because I couldn't concentrate on the code.
But, then even later I actually streamed again, this time with proper energy and concentration and moved elevators, doors and a lot of optimization code out of 
main(). Here is the recording of that stream:
In the same time I broke 
main() itself into a few functions, separating it into 
main(), 
Init() which runs in the first frame of the game and 
OnExit() which runs when you close the game. The 
Init() itself is also not just a copy-paste from what there was in the 
main() but rather I broken off some of the initialization into Racing.py, Doors.py, Elevators.py and 
Opt.py. Leaving only just a few 
if statements in the 
Init():
for object in scene.objects:
	if "spawn" in object:
		Vehicle.RegisterSpawnPoint(object)
	if str(object.name).startswith("Crate"):
		crates = bge.logic.globalDict["garage-crates"]
		crates.append(object)
	if "LightSpawn" in object:
		Opt.RegisterObjects(object, spawnAtDistance, "LightSpawn")
            
	elif type(object.blenderObject.data) == bpy.types.AreaLight:
		Opt.RegisterObjects(object, spawnAtDistance, "AreaLamp")
	elif "Tree" in object.name:
		Opt.RegisterObjects(object, spawnAtDistance, "Tree")
	
	elif "Palm" in object.name:
		Opt.RegisterObjects(object, spawnAtDistance, "Palm")
	elif "Elevator" in object:
		Elevators.RegisterElevator(object)
            
	elif "Door" in object:
		Doors.RegisterDoor(object)
	elif "ambiance-sound" in object:
		bge.logic.globalDict["sound-ambiances"].append(object)
I could have made functions to precalculate all those things in some sort of way that would look like this in 
Init():
Opt.Precalculate()
Doors.Precalculate()
Elevators.Precalculate()
But I decided against that, because it would have required looping over all those objects multiple times and the game has a lot of them. Even if it only happens on the first frame. The first frame is already a bit too slow, so to optimize it a bit I made one loop in the 
Init() and call functions based of the object type from there.
 Petition
I just want to remind you that there is a 
petition going on for the game and it is taking a bit long. Please, if you have a fediverse account, make sure to sign that petition so that this "already old" version could be released and a new petition with all those improvements could be started.
Happy Hacking!!!
    
        ![[icon terminal]](/icon/terminal) JSON
    JSON
    
    
    
        ![[icon markdown]](/icon/markdown) Markdown
    Markdown
    
    ![[icon left]](/icon/left) Next
    Next
    
    
    
        ![[icon right]](/icon/right) Previous
    Previous
    
    
    
    
    
    
    
    
    
     
    
    
    
    
    
    
    
    ![[icon reviews]](/icon/star) Crimson Tide 1995 is a stupidly smart movie
Crimson Tide 1995 is a stupidly smart movie
![[thumbnail]](https://upload.wikimedia.org/wikipedia/en/thumb/f/ff/Crimson_tide_movie_poster.jpg/250px-Crimson_tide_movie_poster.jpg)
![[avatar]](/pictures/favicon.png) Blender Dumbass
 👁 3 💬 0
  Blender Dumbass
 👁 3 💬 0 
Before 
Jerry Bruckheimer was obsessed with telling all his directors to be like 
Michael Bay and before 
Don Simpson had passed away. The duo of Simpson and Bruckheimer were obsessed with 
Tony Scott, the director of such classics as 
Top Gun, 
Days of Thunder and 
Enemy of the State ( which coincidentally were all produced by Jerry and Don, apart from the last film, which was produced after Don's passing ). But Tony Scott didn't only work with the duo. For example in 1993 he made a film not produced by Jerry and Don called 
True Romance from a screenplay of 
Quentin Tarantino. Which makes 
Crimson Tide the second collaboration of the two
#CrimsonTide #TonyScott #film #review #movies #cinemastodon  
    
    
    
    ![[icon reviews]](/icon/star) Something Evil
Something Evil
![[thumbnail]](https://upload.wikimedia.org/wikipedia/en/3/3a/Something_Evil.jpg)
![[avatar]](/pictures/favicon.png) Blender Dumbass
 👁 75 💬 0
  Blender Dumbass
 👁 75 💬 0 
Conceptually the film is very much like 
Stanley Kubrick's "The Shinning". It deals with a parent going slowly insane and becoming a threat to the children. Both movies suggest a possibility of a supernatural explanation of the insanity. But the movies are made in such a smart way where there is enough doubt in those supernatural occurrences that you can read it as psychological deterioration only. Which is a very interesting challenge to a filmmaker. And young Spielberg pulled it off.
 
    
    
    
    
    
    
        ![[icon codeberg]](/icon/codeberg) Powered with BDServer
    Powered with BDServer
    
    
    
        ![[icon python]](/icon/python) Plugins
    Plugins
    
    
    
        ![[icon analytics]](/icon/analytics) Analytics
    Analytics
    
    
    
        ![[icon mastodon]](/icon/mastodon) Mastodon
    Mastodon
    
    
    
        ![[icon peertube]](/icon/peertube) PeerTube
    PeerTube
    
    
    
        ![[icon element]](/icon/element) Matrix
    Matrix