1. You currently have something like this:
def HazardsOn(self, on):
self.spinner = self.GetHinge("Hinge01")
self.spinner.SetAutoLocks(False, False)
self.spinner.Lock(False)
self.spinner = self.GetHinge("Hinge02")
self.spinner.SetAutoLocks(False, False)
self.spinner.Lock(False)
self.spinner = self.GetHinge("Hinge03")
self.spinner.SetAutoLocks(False, False)
self.spinner.Lock(False)
self.spinner = self.GetHinge("Hinge04")
self.spinner.SetAutoLocks(False, False)
self.spinner.Lock(False)
self.prism = self.AddPrismatic("floor", "bladewall", 0, -1, 0, 0, 3, 0)
self.prism.SetAutoLock(False)
if on:
self.SetSubMaterialSound("blade1", "metal", 2.0, "Sounds\\spinnerhit.wav")
self.spinner.SetPowerSettings(150,68)
self.spinner.SetDirection(-100)
self.SetSubMaterialSound("blade2", "metal", 2.0, "Sounds\\spinnerhit.wav")
self.spinner.SetPowerSettings(150,68)
self.spinner.SetDirection(-100)
self.SetSubMaterialSound("blade3", "metal", 2.0, "Sounds\\spinnerhit.wav")
self.spinner.SetPowerSettings(150,68)
self.spinner.SetDirection(-100)
self.SetSubMaterialSound("blade4", "metal", 2.0, "Sounds\\spinnerhit.wav")
self.spinner.SetPowerSettings(150,68)
self.spinner.SetDirection(-100)
What I'm saying is that you should have something like this:
def HazardsOn(self, on):
self.spinner1 = self.GetHinge("Hinge01")
self.spinner1.SetAutoLocks(False, False)
self.spinner1.Lock(False)
self.spinner2 = self.GetHinge("Hinge02")
self.spinner2.SetAutoLocks(False, False)
self.spinner2.Lock(False)
self.spinner3 = self.GetHinge("Hinge03")
self.spinner3.SetAutoLocks(False, False)
self.spinner3.Lock(False)
self.spinner4 = self.GetHinge("Hinge04")
self.spinner4.SetAutoLocks(False, False)
self.spinner4.Lock(False)
if on:
self.SetSubMaterialSound("blade1", "metal", 2.0, "Sounds\\spinnerhit.wav")
self.spinner1.SetPowerSettings(150,68)
self.spinner1.SetDirection(-100)
self.SetSubMaterialSound("blade2", "metal", 2.0, "Sounds\\spinnerhit.wav")
self.spinner2.SetPowerSettings(150,68)
self.spinner2.SetDirection(-100)
self.SetSubMaterialSound("blade3", "metal", 2.0, "Sounds\\spinnerhit.wav")
self.spinner3.SetPowerSettings(150,68)
self.spinner3.SetDirection(-100)
self.SetSubMaterialSound("blade4", "metal", 2.0, "Sounds\\spinnerhit.wav")
self.spinner4.SetPowerSettings(150,68)
self.spinner4.SetDirection(-100)
Since "self.spinner" is just a variable, you could have called it anything but, by having them named the same, you are only setting the power and direction for the last spinner rather than all of them. This wouldn't have mattered if it weren't for the fact that you use object assigned to the variable again after the IF condition ("if on:").
It might help if I make an analogy... Let's say bikes can only hold one person at a time and there are 2 people that want to ride it to different destinations. If we followed the logic that you have than we would have one person get on a bike and immediately get off of it so that the next person can get on and go to their destination. If we follow my logic than we would have two bikes so that both people can go to their destinations. The bikes are our variables, the people are our hinges, and the destinations are the properties that we assign to our variable after the IF condition. This analogy kind of falls apart if you read too much into it but I hope it helps in getting my point across.
2. When I posted that, I was thinking you were going to have to make calls to ApplyTorque but, now that I think about it, I think there is a way of setting it up so that you don't need to tell it to spin once per Tick. IIRC, Mars Base Arena does something like the former with the rover's wheels. I'd suggest taking a look at that. Edit: I checked and it may be as simple as setting your autolocks so that the first value is False and the second value is True (I can't remember what these correspond to but this is how I did it in one of my custom arenas).
As for your other issues...
3. Having a blank arena list or missing arena usually means that there was a syntax error in your code.
4. When you add collision lines, the first two numbers represent the position of one end of the line while the second two numbers represent the position of the other end. The line between the two points acts as an "obstacle" to the AI that they will try not to cross. There isn't really much else to it. Perhaps you are mixing them up with POVs?