from __future__ import generatorsimport plusimport AIfrom AI import vector3import Arenasimport Gooeyimport mathimport Tacticsclass PopupInverted(AI.SuperAI): "Popup inverted strategy" name = "PopupInverted" # bot has to be invertible, not mandatory to mention it in your binding, it is force. # much like Popup except that the bot use a button control called 'Inverter' to invert itself if it is not. def __init__(self, **args): AI.SuperAI.__init__(self, **args) # force bot to be invertible : self.invertible = True self.zone1 = "weapon" self.triggers1 = ["Fire"] self.triggers2 = ["Srimech"] self.reloadTime = 0 self.reloadDelay = 3 self.InverterTime = 3 if 'zone' in args: self.zone = args['zone'] if 'triggers' in args: self.triggers1 = args['triggers'] if 'triggers' in args: self.triggers2 = args['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.zone1, 1) return AI.SuperAI.Activate(self, active) def Tick(self): # fire weapon # If the bot is not inverted, try to invert it : use the button control called 'Inverter' : # here again, slight delay before inverting if self.InverterTime > 0: self.InverterTime -= 1 #if (not self.ai.IsUpsideDown()) and (self.InverterTime <= 0) : #if (self.InverterTime <= 0) : if (not self.IsUpsideDown()) and (self.InverterTime <= 0) : self.Input("Inverter", 0, 1) self.InverterTime = self.reloadDelay 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 bReturn = AI.SuperAI.Tick(self) return bReturn def InvertHandler(self): # fire all weapons once per second (until we're upright!) while 1: for trigger in self.triggers2: 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 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) def SmartZoneEvent(self, direction, id, robot, chassis): if id == 1 and self.weapons: if chassis: if direction == 1: for trigger in self.triggers1: self.Input(trigger, 0, 1) return True AI.register(PopupInverted)
I was trying to AI this bot(Image removed from quote.)I want to combine the OmniInverted.py with the Popup.py. But when I tried doing it it won't fire on smart zone, then it rams the wall and crash the game on quit. I am not sure what I am doing wrong. Also, is it possible to alter the starting facing without changing the nose (so it faces forward immediately after the flip)?Code: [Select]from __future__ import generatorsimport plusimport AIfrom AI import vector3import Arenasimport Gooeyimport mathimport Tacticsclass PopupInverted(AI.SuperAI): "Popup inverted strategy" name = "PopupInverted" # bot has to be invertible, not mandatory to mention it in your binding, it is force. # much like Popup except that the bot use a button control called 'Inverter' to invert itself if it is not. def __init__(self, **args): AI.SuperAI.__init__(self, **args) # force bot to be invertible : self.invertible = True self.zone1 = "weapon" self.triggers1 = ["Fire"] self.triggers2 = ["Srimech"] self.reloadTime = 0 self.reloadDelay = 3 self.InverterTime = 3 if 'zone' in args: self.zone = args['zone'] if 'triggers' in args: self.triggers1 = args['triggers'] if 'triggers' in args: self.triggers2 = args['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.zone1, 1) return AI.SuperAI.Activate(self, active) def Tick(self): # fire weapon # If the bot is not inverted, try to invert it : use the button control called 'Inverter' : # here again, slight delay before inverting if self.InverterTime > 0: self.InverterTime -= 1 #if (not self.ai.IsUpsideDown()) and (self.InverterTime <= 0) : #if (self.InverterTime <= 0) : if (not self.IsUpsideDown()) and (self.InverterTime <= 0) : self.Input("Inverter", 0, 1) self.InverterTime = self.reloadDelay 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 bReturn = AI.SuperAI.Tick(self) return bReturn def InvertHandler(self): # fire all weapons once per second (until we're upright!) while 1: for trigger in self.triggers2: 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 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) def SmartZoneEvent(self, direction, id, robot, chassis): if id == 1 and self.weapons: if chassis: if direction == 1: for trigger in self.triggers1: self.Input(trigger, 0, 1) return True AI.register(PopupInverted)
It's the latest version of Popup.py which you can conveniently get in the thread I just posted on the Modifications board. Just set 'RunUpsideDown' to 1 and it should work.