Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - Clickbeetle

Pages: 1 ... 34 35 36 37 38 39 40 [41] 42 43 44 45 46 47 48 ... 174
801
Tournament Archives / Re: Ironbot SBV
« on: September 03, 2011, 10:08:13 PM »
OK I've got all the bots AI'd except Trovaner's (because the AI he sent me is crashing) and Naryar's.
 
Filming should commence within the week.  :mrgreen:

802
Tournament Archives / Re: In The Air Tonight
« on: August 28, 2011, 10:09:56 PM »
Problem.
 
I tried AI'ing my entry for this, which uses the custom thrusters, and there are some major issues:
 
- The thrusters are WAAAAY more powerful when the AI uses them than when a human uses them.
- The AI can only use the thrusters at +100 power.  If the AI is told to use them at any other value, say -50, it still inputs +100 anyway.
- It's really annoying getting the AI to turn off the thrusters once activated.  My entry is supposed to pulse its thrusters on and off, but it just keeps them on and doesn't turn them off until the enemy is out of range (I'm almost certain this isn't just a Python mistake as I've tried about 5 different methods of making it work).
 
You may want to consider not allowing those thrusters.  It's possible to work around those issues, but they're going to be seriously overpowered and it's going to be a pain AI'ing certain bots (like bots that use thrusters for drive... though you may want to double check that thrusters for drive have the same issues as thrusters for weapons.  RA2 is weird; maybe thruster-drive bots would work.)

803
Tournament Archives / Re: Clash Cubes IV - Splash, Brackets & Videos
« on: August 28, 2011, 12:59:01 AM »
Oh, I just assumed the numbers would alternate correctly to prevent rematches.  Didn't look at the bracket as a whole.
 

804
Discussion / Re: Robot Arena: 1.00.000 vs. 1.0.0.3
« on: August 27, 2011, 11:51:27 PM »
So THAT's what wimpy.wav is for.  I always wondered where that sound was used.
 
I didn't even know most of those bots existed... I only knew about Gammaraze and Omnivore because the skins can still be found in the new version.

805
Discussion / Re: DSL realistic and IRL realism
« on: August 27, 2011, 11:41:10 PM »
Maybe the more specific version would be related to long wedges that are essentially parallel to the combat surface.

Yeah that's more what I was thinking of.

806
Tournament Archives / Re: Clash Cubes IV - Splash, Brackets & Videos
« on: August 27, 2011, 11:32:06 PM »
Wait I'm confused about the bracket.  It says "Loser to 36" for my fight with R0B0.  And the spot numbered 36 in the loser's bracket would put me against Mike.  Are you not following the numbers?
 

807

808
Tournament Archives / Re: Blades of Fury SBV
« on: August 27, 2011, 09:13:01 PM »
Some of the bots in here I wouldn't have allowed as IRL realistic.  I guess some of us have different standards.
 
Regardless, I'm pretty happy with my matchup.  No bots that I'm totally doomed against.

809
Challenge Board / Re: Clickbeetle VS Russian Roulette (The Re-Match)
« on: August 27, 2011, 08:49:40 PM »
Whups, forgot to try and make a new Bisector.  Oh well, we'll see how the original does when you don't have your trolly extender in the front.

810
General Support / Re: Srimech issues
« on: August 27, 2011, 08:35:47 PM »
Ah.  Those bots don't work because they're not upside-down enough.  The AI still thinks they're right side up.
 
You can use this handy bit of code FB used for Seism 13:
 
Code: [Select]
        if list(plus.getDirection(self.GetID(),0))[1]>0.9:
            self.Input("Srimech", 0, 1)

Just throw that in def Tick somewhere.  It tells the AI to fire the srimech if the Y direction is pointing sideways (=the bot is stuck on its side or rear).

811
Discussion / Re: DSL realistic and IRL realism
« on: August 27, 2011, 08:17:39 PM »
I think a good guideline for IRL realistic is if you can find a real life example of what you're trying to do, it should be allowed.  If the realism is at all debatable and you can't find a real life example, it's not allowed.
 
Example: Flails do exist in real life.  There are several examples of bots with 2 flails on a spinner.  But 8 flails?  No.
 
Similarly, hinged wedges/forks do exist in real life.  But huge long 120cm angled sheets?  That's taking it too far.

812
Discussion / Re: Virus in Sage's DSL download!
« on: August 27, 2011, 08:01:55 PM »
This has been posted before, it's a false alarm.  The offending file is INF1.exe, which is the Infogrames registration service.  Perfectly harmless and definitely NOT A VIRUS.

813
No weapons line, would that affect it?

Yes, the AI is told to only spin if it still has weapons.  If there is no 'weapons' line, the AI doesn't know that it has any weapons and it won't spin.  If you don't want to actually have any real weapons set, just use 'weapons':(0,)
 
The reason the AI never stops spinning once they start is because button controls are almost impossible to turn off once activated.
 
Edit:
 
i ai-ed a pushy bot with a snowplow that fails. it's wired correctly, it faces the right way, but this is what it does.

it drives toward me, backs up, then drives staright into a corner. help?

What .py are you using?  Does it eventually drive out of the corner or does it just stay there?  Does the AI ever turn?  It may also help to post the bindings you're using.  Answer those questions and someone may be able to help.

814
General Support / Re: Swtich a BMP for a TGA?
« on: August 27, 2011, 07:39:55 PM »
'nuther bump.
 
You can replace "flipper1.bmp" with "flipper1.tga", (though it's actually named "emergency_flipper.bmp") but there's one extra step you need to do in order to get transparency.
 
Copy the whole texture like this
 
Code: [Select]
   *TEXTURE
   {
    *MAP_NAME Map #10
    *MAP_CLASS Bitmap
    *BITMAP emergency_flipper.tga
    *MAP_AMOUNT 1
    *MAP_DIFFUSE
    *MAP_TYPE Screen
    *UVW_U_OFFSET 0
    *UVW_V_OFFSET 0
    *UVW_U_TILING 1
    *UVW_V_TILING 1
    *UVW_ANGLE 0
    *UVW_BLUR 1
    *UVW_BLUR_OFFSET 0
    *UVW_NOISE_AMT 1
    *UVW_NOISE_SIZE 1
    *UVW_NOISE_LEVEL 1
    *UVW_NOISE_PHASE 0
    *BITMAP_FILTER Pyramidal
    *BITMAP_MAP_CHANNEL 1
   }

and paste it directly underneath, so you have two textures.  Now change MAP_DIFFUSE to MAP_OPACITY in the second texture.  This tells the game to apply that texture as an opacity map instead of a color map.
 
Finally, find where it says *TEXTURE_COUNT 1 above the two textures and change the 1 to a 2.

815
General Support / Re: Srimech issues
« on: August 27, 2011, 07:29:53 PM »
Bump
 
Most of my useful py's are included in various AI packs.  I really need to make a pack of just py's sometime.
 
Anyway, EcoOmni.py will fire srimechs during the immobility counter, though that's hardly an elegant solution.  It would be much better to actually self right as soon as the bot is upside down.  Can you post some pictures of the bots that won't self right?
 
Here is EcoOmni.py:
 
Code: [Select]
from __future__ import generators
import plus
import AI
from AI import vector3
import Arenas
import Gooey
import math
import Tactics
class EcoOmni(AI.SuperAI):
    "Energy-efficient, environmentally friendly, 100% organic (okay maybe not that last) Omni."
    name = "EcoOmni"
    # Has the option of using a smart zone for spinner activation.  Name this zone "spin" and then put 'UseSpinZone':1 in Bindings.  Set 'range' to something high like 99.
    # 'StartSpinup' is the time at the beginning of the match for which the AI should spin its weapons, to get them going.  Measured in seconds.  Default is 2.  Some bots can't move unless this is greater than 0.
    # Has the option for pulsing a spinner, rather than running it constantly, if the enemy is outside of a certain range.  Good for shell spinners that can't drive straight when the weapon is running.
    # 'Pulse' is the number of ticks the active weapon should stay on PLUS the number of ticks it stays off.  A tick is 1/8 second.
    # 'Coast' is the number of ticks the active weapon should turn off and coast for.  This should be less than the Pulse value.  For equal times on/off, set Coast equal to half of Pulse.
    # 'PulseRange' is the range within which the weapon should spin constantly.  A 0 value makes it always pulse.
    def __init__(self, **args):
        AI.SuperAI.__init__(self, **args)
               
        self.zone = "weapon"
        self.zone2 = "spin"
        self.triggers = ["Fire"]
        self.trigger2 = ["Srimech"]
        self.reloadTime = 0
        self.reloadDelay = 3
        self.goodFunction = self.GoodStuckHandler
        self.wiggletimer = -8
        self.srimechtimer = 0
        self.srispintimer = 0
        self.botinzone1 = 0
        self.botinzone2 = 0
        self.usespinzone = 0
        if 'UseSpinZone' in args: self.usespinzone = args.get('UseSpinZone')
       
        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']
       
        self.pulsetime = 0
        if 'Pulse' in args: self.pulsetime = args.get('Pulse')
        self.pulse = self.pulsetime
        self.pulsetime2 = self.pulsetime/2
        if 'Coast' in args: self.pulsetime2 = args.get('Coast')
        self.pulse_range = 0
        if 'PulseRange' in args: self.pulse_range = args.get('PulseRange')
        self.spinup = 2
        if 'StartSpinup' in args: self.spinup = args.get('StartSpinup')
       
        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, 512, 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("")
                tbox = self.debug.addText("line4", 10, 60, 512, 15)
                tbox.setText("")
           
            self.RegisterSmartZone(self.zone, 1)
            self.RegisterSmartZone(self.zone2, 2)
           
        else:
            # get rid of reference to self
            self.goodFunction = None
           
        return AI.SuperAI.Activate(self, active)
    def Tick(self):
        #self.DebugString(4, str(self.zone2))
        # spin weapons briefly at start because for some dumb reason we can't move otherwise.
        if plus.getTimeElapsed() <= self.spinup:
            self.Input("Spin", 0, 100)
               
        # spin up depending on enemy's range
        enemy, range = self.GetNearestEnemy()
        if enemy is not None:
            heading = self.GetHeadingToID(enemy, False)
       
        # spin weapons only when necessary, and don't waste battery on them when we're being counted out!
        if enemy is not None and self.weapons and range < self.spin_range and not self.bImmobile and (self.botinzone2 == 1 or self.usespinzone == 0):
            if self.pulsetime > 0 and range > self.pulse_range:
                # Pulse spinner
                self.pulse -= 1
                if self.pulsetime2 < self.pulse < self.pulsetime:
                    self.Input("Spin", 0, 100)
                if 0 < self.pulse < self.pulsetime2:
                    self.Input("Spin", 0, 0)
                if self.pulse <= 0:
                    self.pulse = self.pulsetime
            else:
                self.Input("Spin", 0, 100)
        else:
            if plus.getTimeElapsed() > self.spinup:
                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 self.botinzone1 == 1 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)
           
        # call this now so it takes place after other driving commands
        if self.goodFunction: self.goodFunction(len(targets) > 0)
       
        return bReturn
    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 StuckHandler(self):
        "Do nothing because the GoodStuckHandler function is better."
        while 1:
            for i in range(0, 16):
                yield 0
               
    def GoodStuckHandler(self, bTarget):
        if self.bImmobile:
            self.srimechtimer += 1
            # keep driving in one direction as long as we can
            if self.GetSpeed() > 0.5:
                self.Throttle(100)
            if self.GetSpeed() < -0.5:
                self.Throttle(-100)
            # if we're not moving very fast try wiggling back and forth
            if abs(self.GetSpeed()) <= 0.5:
                self.wiggletimer += 1
                if self.wiggletimer < 0:
                    self.Throttle(100)
                if self.wiggletimer >= 0:
                    self.Throttle(-100)
                if self.wiggletimer >= 8:
                    self.wiggletimer = -8
            # fire everything we have as a last-ditch effort if we're still not free after 5 seconds
            if self.srimechtimer >= 20:
                self.srispintimer += 1
                for trigger in self.triggers:
                    self.Input(trigger, 0, 1)
                for trigger in self.trigger2:
                    self.Input(trigger, 0, 1)
                if self.srispintimer < 7:
                    self.Input("Spin", 0, -100)
                if self.srispintimer >= 7:
                    self.Input("Spin", 0, 100)
                if self.srispintimer == 15:
                    self.srispintimer = 0
        else:
            self.srimechtimer = 0
            self.srispintimer = 0
            self.wiggletimer = -8
               
    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)
            elif id == 4: self.debug.get("line4").setText(string)
           
    def SmartZoneEvent(self, direction, id, robot, chassis):
        if id == 1:
            if robot > 0:
                if direction == 1:
                    self.botinzone1 = 1
                if direction == -1:
                    self.botinzone1 = 0
        elif id == 2:
            if robot > 0:
                if direction == 1:
                    self.botinzone2 = 1
                if direction == -1:
                    self.botinzone2 = 0
        return True
   
AI.register(EcoOmni)

816
General Support / Re: GMF issues
« on: August 27, 2011, 07:20:31 PM »
Okay, so I select the gmf file for both source and destination and select compile, press "compile", and then I get this:

Run-time error '62':

Input past end of file

What am I doing wrong now? :P

You have to decompile first.  Decompiling puts the gmf into a readable, editable format.  When you're done making changes, THEN you compile the file, which puts it back into a compressed form that is readable by RA2.
 
Also, when decompiling, you should enter a different name in the Destination field.  Like if you're decompiling ram_plate.gmf, put ram_plate.gmf as the Source and ram_plate_txt.gmf as the Destination.  Then when you're ready to compile, put ram_plate_txt.gmf as the Source and ram_plate.gmf as the Destination.

817
General Support / Re: Change arenas mid-battle
« on: August 27, 2011, 07:08:15 PM »
All right I got it to work!  ...kind of sort of not really.  It switches arenas without crashing, but none of the hazards work and the bots start out inside the floor.  :(
 
I suspected this might happen if I used createArenaByName, but it was worth a try.  Fortunately, I have a backup plan.
 
Though I suspect that apanx used the same technique as me, I must say that my way is extremely sloppy and would require quite a few tweaks to the main arena PY and possibly GMF. I've also yet to figure out a way of getting the hammer's zone to work after the change. I would strongly suggest using Madiaba's method instead...

Similar to how Mad did the Matrix Arena, you can add the walls, floor, and ceiling separately (using self.AddXtra or self.AddXtraSound). All that needs to be loaded at the beginning are the startpoints, zones, and hinges. As long as you use some fancy camera work during the introduction, people won't even notice the difference between this method and the use of Arenas.createArenaByName.

I'll have to do that, which will mean some more .gmf editing, but at least I'm sure it will work.

818
General Support / Change arenas mid-battle
« on: August 23, 2011, 11:13:07 PM »
Advanced Python question for Trovaner or Mad here.
 
I need to make an arena that changes into another arena at the start of the match (right after the countdown).  I know it's possible because I remember Mad (at least I think it was Mad) making an arena that cycles through all the stock arenas mid-battle.  However, I cannot find this arena anywhere.
 
I'm fairly certain the command used for this is Arenas.createArenaByName("Arena name").  That's what I used for the special SFTW AI to make it switch to the Epic Showdown arena automatically.  However, when I put that command in an arena, it crashes as soon as it's called.  I've tried Arenas.createArenaByName, self.createArenaByName, self.Arenas.createArenaByName, and even Arenas.SuperArena.createArenaByName.  Same result.
 
Here's my full .py in context:
 
Code: [Select]
from __future__ import generators
import plus
import Arenas
import random
import Hazards
import math
class Box(Arenas.SuperArena):
    "In space, no one can hear you scream... as your bot's components are brutally torn off with magic Python powers."
    name = "Ironbot Space"
    preview = "cube/cube_preview.bmp"
    game_types = ['DEATHMATCH', 'BATTLE ROYAL', 'TEAM MATCH']
    extent = (-16, 16, 16, -16)
    def __init__(self):
        Arenas.SuperArena.__init__(self, "Arenas/cube/ironbotspace.gmf")
        #plus.Arena.__init__(self, "")
        plus.setBackColor(0, 0, 0)
       
        degrad = 0.01745
        self.AddStaticCamera("Battle Veiw", (19.5, 15, 19.5), (50*degrad,225*degrad), 55*degrad)
        self.AddStaticCamera("High Flipper View", (-19.5, 45, -19.5), (48*degrad,45*degrad), 84*degrad)
        self.AddStaticCamera("Birds Eye View", (0, 45, 0), (90*degrad,0), 75*degrad)
        self.AddWatchCamera("Combat Cam", (-12, 8, 12), (16, 36, 65*degrad, 30*degrad))
        self.AddWatchCamera("Aerial Cam", (-19.5, 35, -19.5), (50, 60, 45*degrad, 60*degrad))
        self.AddWatchCamera("Ground Cam", (8, -5, -8), (15, 40, 75*degrad, 35*degrad))
        self.AddWatchCamera("Spectator Cam", (13, 15, 13), (6, 18, 45*degrad, 45*degrad))
 
        self.players = ()
       
    def Introduction(self): 
        self.LostComps0 = eval(open("Bot0_comps.txt").read())
        for id in self.LostComps0:
            plus.damage(0, id, 1000, plus.getLocation(0))
            plus.damage(0, id, 1000, plus.getLocation(0))
        self.LostComps1 = eval(open("Bot1_comps.txt").read())
        for id in self.LostComps1:
            plus.damage(1, id, 1000, plus.getLocation(1))
            plus.damage(1, id, 1000, plus.getLocation(1))
        yield 0
       
    def Activate(self, on):
        if on:
            self.players = plus.getPlayers()
            Arenas.createArenaByName("Containment Cube")
       
        Arenas.SuperArena.Activate(self, on)
       
Arenas.register(Box)

The arena itself is just empty space with a single grape crate in the middle (just so there is some object).  I'm using it for Ironbot so I can break off all the bots' components that were broken in previous fights via a list imported from txt files (this part works fine), have the broken parts fall into empty space during the countdown so they don't interfere with the fight, and then change the arena to the Containment Cube for the actual fight (this part doesn't work fine).
 
If anyone knows what I'm doing wrong, or if you know where to find that arena that switches arenas mid-battle, help is appreciated.

819
DSL TC Showcases / Re: NFX.showcase/DSL
« on: August 21, 2011, 11:35:06 PM »
That is awesome.  It looks like something I might have built as a MW Drumblebee.
 
... I've just realized that drums are like the optimum design for IRL realism.  No other real life bot has as many weapon components.

820
DSL TC Showcases / Re: Clickbeetle's Supreme DSL bots
« on: August 21, 2011, 11:25:16 PM »
Update!
 

 
Turns out I DID have weight for a tribar setup.  I get one more tooth out of the deal, a few DSL bars, still perfectly stable, and still IRL realistic.

Pages: 1 ... 34 35 36 37 38 39 40 [41] 42 43 44 45 46 47 48 ... 174