You got my vote for RA2 Wizard. Always and forever.
I wonder... if maybe you could set invertibility to NO? Would it still try to move?
Is the robot a double wedge or something? If so, I remember Joe saying that the AI needed might be in the stock BBEANS pack somewhere...
I ask the same question when making those torque reaction vs, apparently you can't do it.
Quote from: 123savethewhales on August 21, 2012, 11:55:23 PMI ask the same question when making those torque reaction vs, apparently you can't do it.You mean its actually hard coded into the .exe?
Quote from: Urjak on August 22, 2012, 12:31:06 AMQuote from: 123savethewhales on August 21, 2012, 11:55:23 PMI ask the same question when making those torque reaction vs, apparently you can't do it.You mean its actually hard coded into the .exe?I think it's possible, but i need someone that knows what they're doing in python to clarify.
from __future__ import generatorsimport plusimport AIimport Gooeyimport Tacticsclass OmniReversible(AI.SuperAI): "Omni strategy that doesn't switch directions when inverted" name = "OmniReversible" def __init__(self, **args): AI.SuperAI.__init__(self, **args) self.zone = "weapon" self.triggers = ["Fire"] self.trigger2 = ["Srimech"] self.reloadTime = 0 self.reloadDelay = 3 self.escapeDuration = int(2/self.tickInterval) #2 seconds self.spin_range = 3.0 if 'range' in args: self.spin_range = args.get('range') if 'triggers' in args: self.triggers = args['triggers'] if 'reload' in args: self.reloadDelay = args['reload'] if 'escapeDuration' in args: self.escapeDuration = int(args['escapeDuration']/self.tickInterval) self.triggerIterator = iter(self.triggers) self.tactics.append(Tactics.Engage(self)) def Activate(self, active): if active: if AI.SuperAI.debugging: self.debug = Gooey.Plain("watch", 0, 75, 100, 75) tbox = self.debug.addText("line0", 0, 0, 100, 15) tbox.setText("Throttle") tbox = self.debug.addText("line1", 0, 15, 100, 15) tbox.setText("Turning") tbox = self.debug.addText("line2", 0, 30, 100, 15) tbox.setText("") tbox = self.debug.addText("line3", 0, 45, 100, 15) tbox.setText("") self.RegisterSmartZone(self.zone, 1) return AI.SuperAI.Activate(self, active) def Tick(self): # fire weapon if self.weapons: # spin up depending on enemy's range enemy, range = self.GetNearestEnemy() if enemy is not None and range < self.spin_range: self.Input("Spin", 0, 1) elif self.GetInputStatus("Spin", 0) != 0: self.Input("Spin", 0, 0) targets = [x for x in self.sensors.itervalues() if x.contacts > 0 \ and not plus.isDefeated(x.robot)] # slight delay between firing if self.reloadTime > 0: self.reloadTime -= 1 if len(targets) > 0 and self.reloadTime <= 0: try: trigger = self.triggerIterator.next() except StopIteration: self.triggerIterator = iter(self.triggers) trigger = self.triggerIterator.next() self.Input(trigger, 0, 1) self.reloadTime = self.reloadDelay return AI.SuperAI.Tick(self) def InvertHandler(self): # fire all weapons once per second (until we're upright!) while 1: for trigger in self.trigger2: self.Input(trigger, 0, 1) for i in range(0, 8): yield 0 def LostComponent(self, id): # if we lose all our weapons, stop using the Engage tactic and switch to Shove if id in self.weapons: self.weapons.remove(id) if not self.weapons: tactic = [x for x in self.tactics if x.name == "Engage"] if len(tactic) > 0: self.tactics.remove(tactic[0]) self.tactics.append(Tactics.Shove(self)) self.tactics.append(Tactics.Charge(self)) return AI.SuperAI.LostComponent(self, id) def Throttle(self, throttle): # if we're car steering and we're not moving much, throttle up if self.bCarSteering and self.last_turn_throttle != 0: speed = self.GetSpeed() if speed > 0 and speed < self.top_speed / 3: throttle = self.last_throttle + 10 elif speed < 0 and speed > -self.top_speed / 3: throttle = self.last_throttle - 10 throttle = min(max(throttle, -100), 100) self.set_throttle = throttle self.Input('Forward', 0, throttle) self.DebugString(0, "Throttle = " + str(int(throttle))) def Turn(self, turning): if self.bInvertible and self.IsUpsideDown(): turning = -turning turning = min(max(turning, -100), 100) self.set_turn_throttle = turning self.Input('LeftRight', 0, -turning) self.Input('LeftRight', 1, turning) self.DebugString(1, "Turning = " + str(int(turning))) def StuckHandler(self): "This generator is called when the bot is almost immobile." while 1: # back up for 2 seconds (will stop once we're not immobile) for i in range(0, self.escapeDuration): self.Throttle(-100) yield 0 # go forward for 2 seconds for i in range(0, self.escapeDuration): self.Throttle(100) yield 0 def DebugString(self, id, string): if self.debug: if id == 0: self.debug.get("line0").setText(string) elif id == 1: self.debug.get("line1").setText(string) elif id == 2: self.debug.get("line2").setText(string) elif id == 3: self.debug.get("line3").setText(string)AI.register(OmniReversible)
WHAT HAVE I DONE(Image removed from quote.)^That battle was AI'd. Happened the first time I tried it.So... as you can see, I made a .py for Big Wheel. It was actually pretty easy; you just need to delete that line in def Throttle (I was wrong about def Turning though, you need to leave that as is).*LINK*Then I just added a feature where you can make it spin continuously when the opponent is in range (so it won't stop dead still when the opponent is right under it). Also, you can put 'SpinCycle':x in Bindings to make it spin back and forth for x/2 ticks in each direction when the opponent is in range (so in theory, it would drive back and forth over opponents and trample them, but in practice it seems to work better in just one direction). Just make a new analog control named "Spin" to make the AI do that.Now I hope I don't regret unleashing this scourge upon the tournament scene...