Well you CAN do something useful with Engine3d

Advanced game related topics
dracflamloc
Addict
Addict
Posts: 1648
Joined: Mon Sep 20, 2004 3:52 pm
Contact:

Well you CAN do something useful with Engine3d

Post by dracflamloc »

Check out this FP shooter accuracy tester:
http://dracsoft.com/zips/FPSTester.zip
byo
Enthusiast
Enthusiast
Posts: 635
Joined: Mon Apr 02, 2007 1:43 am
Location: Brazil

Post by byo »

Ha!

I like it. :lol:
I can imagine what we'll be able to do with the updated OGRE engine in a next PB update.
PB
PureBasic Expert
PureBasic Expert
Posts: 7581
Joined: Fri Apr 25, 2003 5:24 pm

Re: Well you CAN do something useful with Engine3d

Post by PB »

Wow, that's pretty impressive! I didn't expect to see something that good! :shock:
Has the same feel as the Quake games, which is a great achievement. 8)

You're saving BMPs with a PNG extension though, as reported by IrfanView:

Code: Select all

---------------------------
IrfanView
---------------------------
Warning !
The file: "E:\~ Temp ~\2007-10-4 1191507307\shot1.png" is a BMP file with incorrect extension !
Rename ?
---------------------------
Yes   No
---------------------------
dracflamloc
Addict
Addict
Posts: 1648
Joined: Mon Sep 20, 2004 3:52 pm
Contact:

Post by dracflamloc »

Oh yea I forgot to add that png constant. Thanks for noticing
Ollivier
Enthusiast
Enthusiast
Posts: 281
Joined: Mon Jul 23, 2007 8:30 pm
Location: FR

Post by Ollivier »

Hi dracflamloc,

There's no source! It's a commercial project?
User avatar
Kaeru Gaman
Addict
Addict
Posts: 4826
Joined: Sun Mar 19, 2006 1:57 pm
Location: Germany

Post by Kaeru Gaman »

is it duty nowadays to put sources to non-commercial projects? :shock:
oh... and have a nice day.
dracflamloc
Addict
Addict
Posts: 1648
Joined: Mon Sep 20, 2004 3:52 pm
Contact:

Post by dracflamloc »

THe source would make your eyes bleed. Trust me its for your own good.

But in case you want to torture yourself:

Code: Select all

;FPSTrainer - Copyright 2007 DracSoft - License: GNU GPL (www.gnu.org)

;todo - 'session log' of screenshots of every shot fired in a datetimed directory
;todo - 'onscreen accuraccy + totals

Define.f KeyX, KeyY, MouseX, MouseY

#RobotMesh    = 90
#RobotTexture = 90
#Robot        = 90

movex.f = Random(100)/100+0.5
movez.f = Random(100)/100+0.5
movey.f = Random(100)/100+0.5

scTerSize = 1024
mLwasdown = 0

isfullscreen=Val(ProgramParameter())
maxTime = Val(ProgramParameter())  

startMs = ElapsedMilliseconds()
shotsFired.f=0
shotsHit.f=0
shotCounter=0
sessionFolder.s=Str(Year(Date()))+"-"+Str(Month(Date()))+"-"+Str(Day(Date()))+" "+Str(Date())
  
If InitEngine3D()

  Add3DArchive("\", #PB_3DArchive_FileSystem)
  
  InitSound()
  InitSprite()
  UsePNGImageDecoder()
  UsePNGImageEncoder()
  UseOGGSoundDecoder()
  InitKeyboard()
  InitMouse()
  
  LoadSound(0,"./hit.ogg")
  LoadSound(1,"./miss.wav")
  
  If isfullscreen
    OpenScreen(640,480,32,"FPS Trainer")
  Else 
    OpenWindow(0,0,0,640,480,"FPS Trainer",#PB_Window_TitleBar|#PB_Window_SystemMenu|#PB_Window_Maximize|#PB_Window_Minimize|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)  
    OpenWindowedScreen(WindowID(0),0,0,640,480,1,0,0)
  EndIf 
  If 1=1
    LoadSprite(1,"gun.PNG")
    LoadSprite(2,"gunfire.PNG")
    EnableWorldPhysics(1)
    EnableWorldCollisions(1)
    
    WorldShadows(#PB_Shadow_Additive)
    WorldGravity(30)    
    
    AmbientColor(RGB(255,255,255))
    
    CreateMaterial  (0, LoadTexture(0, "Terrain_Texture.jpg"))
    AddMaterialLayer(0, LoadTexture(1, "Terrain_Detail.jpg"), 1)
    
    CreateTerrain("Terrain.png", MaterialID(0), 1,1,1, 4)

    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0, 128, 25, 128)
    
    SkyDome("Clouds.jpg",10)    
    
    LoadMesh   (#RobotMesh   , "Robot.mesh")
    LoadTexture(#RobotTexture, "skin.jpg")
    LoadTexture(#RobotTexture+1, "skinhit.jpg")
    
    CreateMaterial(0, TextureID(#RobotTexture))
    CreateMaterial(1, TextureID(#RobotTexture+1))
    
    CreateEntity(#Robot, MeshID(#RobotMesh), MaterialID(0))
    ScaleEntity(#robot,0.1,0.1,0.1)
    SetEntityMass(#robot,69)
    EntityMaterial(#Robot, MaterialID(0))
    EntityLocate(#robot,100,TerrainHeight(100,100),100)
    EntityRenderMode(#robot,#PB_Entity_CastShadow)
    
    EntityPhysicBody(#Robot,#PB_Entity_BoxBody)
    AnimateEntity(#Robot, "Walk")
    
    DisableMaterialLighting(0, 1)
    
    MaterialAmbientColor(0, RGB(100, 100, 100))
    MaterialSpecularColor(0, RGB(255, 255, 255))
    ScrollMaterial(0, 0.15, 0, 1)
        
    CreateLight(0, RGB(0,0,255), 100.0, 0, 0)
    LightSpecularColor(0, RGB(255, 0, 0))
    
    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0,scTerSize/2,TerrainHeight(scTerSize/2,scTerSize/2)+10,scTerSize/2)
    CameraLookAt(0,EntityX(#robot),EntityY(#robot),EntityZ(#robot))
    ; CameraBackColor(0, RGB(0, 0, 255))
      
    Repeat
      event=WindowEvent()
      
      
      If setphys
        EnableWorldPhysics(1)
        EntityPhysicBody(#Robot,#PB_Entity_BoxBody)
        SetEntityMass(#robot,69)
        setphys=0
      EndIf 

      ClearScreen(RGB(0, 0, 0))
            
      If ExamineKeyboard()
      
        If KeyboardPushed(#PB_Key_A)
          KeyX = -2
        ElseIf KeyboardPushed(#PB_Key_D)
          KeyX = 2
        Else
          KeyX = 0
        EndIf
        
        If KeyboardPushed(#PB_Key_W)
          KeyY = -2
        ElseIf KeyboardPushed(#PB_Key_S)
          KeyY = 2
        Else
          KeyY = 0
        EndIf
                
        If KeyboardPushed(#PB_Key_Add)
          Frame.f+0.005
        EndIf
        
      EndIf
      
      If ExamineMouse()
        MouseX = -MouseDeltaX()/5 
        MouseY = -MouseDeltaY()/5
      EndIf
      
      RotateEntity(#Robot, 1, 0, 0)
      RotateCamera(0, MouseX, MouseY, 0)
      MoveCamera  (0, KeyX, 0, KeyY)
      CameraLocate(0,CameraX(0),TerrainHeight(CameraX(0),CameraZ(0))+10,CameraZ(0))
      
      EntityLocate(#robot,EntityX(#robot)+movex,EntityY(#robot)+movey,EntityZ(#robot)+movez)
            
      If EntityY(#robot)<=TerrainHeight(EntityX(#robot),EntityZ(#robot)) Or prevEX < 0 Or prevEX > scTerSize Or prevEZ < 0 Or prevEZ > scTerSize
        ;EntityLocate(#robot,EntityX(#robot),TerrainHeight(EntityX(#robot),EntityY(#robot)),EntityZ(#robot))
        ex=Random(scTerSize/2)
        ez=Random(scTerSize/2)
        EntityLocate(#robot,ex,TerrainHeight(ex,ez),ez)
        EnableWorldPhysics(0)
        movex.f = Random(100)/100+0.5
        movez.f = Random(100)/100+0.5
        movey.f = Random(100)/100+0.5
        setphys=1
        EntityMaterial(#robot,MaterialID(0))
      EndIf 
      
      RenderWorld()
      
      If MouseButton(1) And mlwasDown=0
        DisplayTransparentSprite(2,0,0) ;fire!
      Else 
        DisplayTransparentSprite(1,0,0) ;normal
      EndIf 
      
      StartDrawing(ScreenOutput())
        DrawingMode(1)
        FrontColor(RGB(255,255,255))
        DrawText(10,10,"Loc: "+Str(CameraX(0))+", "+Str(CameraZ(0)))
        DrawText(10,25,"Fired: "+Str(shotsFired))
        DrawText(10,40,"Hit: "+Str(shotsHit))
        If shotsfired>0
          DrawText(10,55,"Acc%: "+Str((shotsHit/shotsFired)*100.0))
        Else
          DrawText(10,70,"Acc%: n/a")
        EndIf 
        DrawText(10,85,"Time: "+Str((ElapsedMilliseconds()-startms)/1000)+" s")
      StopDrawing()
      
      FlipBuffers()
      
      If MouseButton(1) And mlwasDown=0
        GrabSprite(3,295,215,50,50)
        StartDrawing(SpriteOutput(3))
        shotsfired+1
        For i = 23 To 27
          For j = 23 To 27
            p=Point(i,j)
            If Red(p)>230 And Green(p)<10 And Blue(p)<10
              EntityMaterial(#robot,MaterialID(1))
              hitStr.s="H"
              PlaySound(0)
              Break 
            EndIf 
          Next 
        Next 
        DrawingMode(#PB_2DDrawing_Outlined)
        Box(22,22,6,6,RGB(0,255,0))
        StopDrawing()
        
        If hitStr="H"
          shotshit+1
        Else
          PlaySound(1)
        EndIf 
        
        If shotsfired=1
          CreateDirectory("./"+sessionFolder)
        EndIf 
        SaveSprite(3,"./"+sessionFolder+"/shot"+Str(shotsFired)+hitStr.s+".png")
        hitStr.s = ""
        mlwasDown=1
      EndIf         
      
      If MouseButton(1)
        mLwasdown=1
      Else 
        mLwasdown=0
      EndIf 
      
      prevEX = EntityX(#robot)
      prevEY = EntityY(#robot)
      prevEZ = EntityZ(#robot)
      
      If (ElapsedMilliseconds()-startms)/1000 >= maxTime And maxtime>0
        Quit=1
      EndIf 
      
      Delay(10) ;60+fps
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
    
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

If shotsfired>0  
  fid=CreateFile(#PB_Any,"./"+sessionFolder+"/stats.log")
  If fid<>0
    WriteStringN(fid,"Fired: "+Str(shotsFired))
    WriteStringN(fid,"Hit: "+Str(shotsHit))
    WriteStringN(fid,"Acc%: "+Str((shotsHit/shotsFired)*100.0))
    WriteStringN(fid,"Time (s): "+Str((ElapsedMilliseconds()-startms)/1000))
    CloseFile(fid)
  EndIf
EndIf 
 
End
; IDE Options = PureBasic v4.02 (Windows - x86)
; CursorPosition = 229
; FirstLine = 199
; Folding = -
; Executable = FPSTrainer.exe
; DisableDebugger
Last edited by dracflamloc on Sun Oct 07, 2007 10:05 pm, edited 1 time in total.
Ollivier
Enthusiast
Enthusiast
Posts: 281
Joined: Mon Jul 23, 2007 8:30 pm
Location: FR

Post by Ollivier »

2 kaeru

Where have you seen such a obligation !?
User avatar
Kaeru Gaman
Addict
Addict
Posts: 4826
Joined: Sun Mar 19, 2006 1:57 pm
Location: Germany

Post by Kaeru Gaman »

Ollivier wrote:There's no source! It's a commercial project?
oh... and have a nice day.
Ollivier
Enthusiast
Enthusiast
Posts: 281
Joined: Mon Jul 23, 2007 8:30 pm
Location: FR

Post by Ollivier »

2 drac

Thanks! I will directly change 2, 3 lines and sell it!

>> It's really good to encourage using Ogre. I'm searching to pitch movements. But I didn't find X, Y and Z rotation values with the misc handles available. It could be certainly a simple calcul, like a cardan' rotation simulation.
I ask you the source too in order to know if there is many architectures of main loop with native statements. If there is only one, my 3D game' editor is in the good way! (Opensource, comme d'hab)
Ollivier
Enthusiast
Enthusiast
Posts: 281
Joined: Mon Jul 23, 2007 8:30 pm
Location: FR

Post by Ollivier »

2 kaeru

There's no bread! Does the baker fall ill?
Irene
Enthusiast
Enthusiast
Posts: 461
Joined: Thu Oct 04, 2007 12:41 pm

Post by Irene »

Ollivier wrote:2 kaeru

There's no bread! Does the baker fall ill?
No because the baker will most likely bake new bread ^o^

There are many free as in free beer products, meaning they are free to use but the source code isn't available for them. Open-Source <> Free @_@
Ollivier
Enthusiast
Enthusiast
Posts: 281
Joined: Mon Jul 23, 2007 8:30 pm
Location: FR

Post by Ollivier »

@drac

I changed sound and keys (Why not key arrows?). I hope you won't kill me...

Tschüss!

Code: Select all

;FPSTrainer - Copyright 2007 DracSoft - License: GNU GPL (www.gnu.org) 
;3D engine : OGRE. License : See www.ogre3d.org

;FPSTrainer - Copyright 2007 DracSoft - License: GNU GPL (www.gnu.org) 
;3D engine : OGRE. License : See www.ogre3d.org 

Global m_hMidiOut,m_MIDIOpen.b 


Procedure SendMIDIMessage(nStatus.l,nCanal.l,nData1.l,nData2.l) 
  dwFlags.l = nStatus | nCanal | (nData1 << 8 ) | (nData2 << 16) 
  temp.l = midiOutShortMsg_ (m_hMidiOut,dwFlags) ; 
   If temp<>0 
     MessageRequester ( "Problème" , "Erreur dans l'envoi du message MIDI" ,0) 
   EndIf 
EndProcedure 
Procedure MIDIOpen() 
   If m_MIDIOpen = 0 
     If midiOutOpen_ (@m_hMidiOut,MIDIMAPPER,0,0,0) <> 0 
       MessageRequester ( "Problème" , "Impossible d'ouvrir le périphérique MIDI" ,0) 
     Else 
      SendMIDIMessage($C0,0,0,0) 
      m_MIDIOpen = 1 
     EndIf 
   EndIf 
EndProcedure 
Procedure PlayNoteMIDI(Canal.b,Note.b,VelociteDown.b,VelociteUp.b) 
   If m_MIDIOpen 
    SendMIDIMessage($80 | Canal,0,Note,VelociteDown) 
    SendMIDIMessage($90 | Canal,0,Note,VelociteUp) 
   EndIf 
EndProcedure 
Procedure ChargeInstrument(Canal.b,Instrument.b) 
   If m_MIDIOpen 
    SendMIDIMessage($C0 | Canal,0,Instrument,0) 
   EndIf 
EndProcedure 

MIDIOpen() 

ChargeInstrument(0,127) ; canal , instrument 
;FPSTrainer - Copyright 2007 DracSoft 

;todo - 'session log' of screenshots of every shot fired in a datetimed directory 
;todo - 'onscreen accuraccy + totals 

Define.f KeyX, KeyY, MouseX, MouseY 

#RobotMesh    = 90 
#RobotTexture = 90 
#Robot        = 90 

movex.f = Random(100)/100+0.5 
movez.f = Random(100)/100+0.5 
movey.f = Random(100)/100+0.5 

scTerSize = 1024 
mLwasdown = 0 

isfullscreen=Val(ProgramParameter()) 
maxTime = Val(ProgramParameter())  

startMs = ElapsedMilliseconds() 
shotsFired.f=0 
shotsHit.f=0 
shotCounter=0 
sessionFolder.s=Str(Year(Date()))+"-"+Str(Month(Date()))+"-"+Str(Day(Date()))+" "+Str(Date()) 
  
If InitEngine3D() 

  Add3DArchive("E:\FPS\", #PB_3DArchive_FileSystem) 
  
  InitSound() 
  InitSprite() 
  UsePNGImageDecoder() 
  UsePNGImageEncoder() 
  UseOGGSoundDecoder() 
  InitKeyboard() 
  InitMouse() 
  
;  LoadSound(0,"./hit.ogg") 
;  LoadSound(1,"./miss.wav") 
  
  If isfullscreen 
    OpenScreen(640,480,32,"FPS Trainer") 
  Else 
    OpenWindow(0,0,0,640,480,"FPS Trainer",#PB_Window_TitleBar|#PB_Window_SystemMenu|#PB_Window_Maximize|#PB_Window_Minimize|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)  
    OpenWindowedScreen(WindowID(0),0,0,640,480,1,0,0) 
  EndIf 
  If 1=1 
    LoadSprite(1,"E:\FPS\gun.PNG") 
    LoadSprite(2,"E:\FPS\gunfire.PNG") 
    EnableWorldPhysics(1) 
    EnableWorldCollisions(1) 
    
    WorldShadows(#PB_Shadow_Additive) 
    WorldGravity(30)    
    
    AmbientColor(RGB(255,255,255)) 
    
    CreateMaterial  (0, LoadTexture(0, "Terrain_Texture.jpg")) 
    AddMaterialLayer(0, LoadTexture(1, "Terrain_Detail.jpg"), 1) 
    
    CreateTerrain("Terrain.png", MaterialID(0), 1,1,1, 4) 

    CreateCamera(0, 0, 0, 100, 100) 
    CameraLocate(0, 128, 25, 128) 
    
    SkyDome("Clouds.jpg",10)    
    
    LoadMesh   (#RobotMesh   , "Robot.mesh") 
    LoadTexture(#RobotTexture, "skin.jpg") 
    LoadTexture(#RobotTexture+1, "skinhit.jpg") 
    
    CreateMaterial(0, TextureID(#RobotTexture)) 
    CreateMaterial(1, TextureID(#RobotTexture+1)) 
    
    CreateEntity(#Robot, MeshID(#RobotMesh), MaterialID(0)) 
    ScaleEntity(#robot,0.1,0.1,0.1) 
    SetEntityMass(#robot,69) 
    EntityMaterial(#Robot, MaterialID(0)) 
    EntityLocate(#robot,100,TerrainHeight(100,100),100) 
    EntityRenderMode(#robot,#PB_Entity_CastShadow) 
    
    EntityPhysicBody(#Robot,#PB_Entity_BoxBody) 
    AnimateEntity(#Robot, "Walk") 
    
    DisableMaterialLighting(0, 1) 
    
    MaterialAmbientColor(0, RGB(100, 100, 100)) 
    MaterialSpecularColor(0, RGB(255, 255, 255)) 
    ScrollMaterial(0, 0.15, 0, 1) 
        
    CreateLight(0, RGB(0,0,255), 100.0, 0, 0) 
    LightSpecularColor(0, RGB(255, 0, 0)) 
    
    CreateCamera(0, 0, 0, 100, 100) 
    CameraLocate(0,scTerSize/2,TerrainHeight(scTerSize/2,scTerSize/2)+10,scTerSize/2) 
    CameraLookAt(0,EntityX(#robot),EntityY(#robot),EntityZ(#robot)) 
    ; CameraBackColor(0, RGB(0, 0, 255)) 
      
    Repeat 
      event=WindowEvent() 
      
      
      If setphys 
        EnableWorldPhysics(1) 
        EntityPhysicBody(#Robot,#PB_Entity_BoxBody) 
        SetEntityMass(#robot,69) 
        setphys=0 
      EndIf 

      ClearScreen(RGB(0, 0, 0)) 
            
      If ExamineKeyboard() 
      
        If KeyboardPushed(#PB_Key_Left) 
          KeyX = -2 
        ElseIf KeyboardPushed(#PB_Key_Right) 
          KeyX = 2 
        Else 
          KeyX = 0 
        EndIf 
        
        If KeyboardPushed(#PB_Key_Up) 
          KeyY = -2 
        ElseIf KeyboardPushed(#PB_Key_Down) 
          KeyY = 2 
        Else 
          KeyY = 0 
        EndIf 
                
        If KeyboardPushed(#PB_Key_Add) 
          Frame.f+0.005 
        EndIf 
        
      EndIf 
      
      If ExamineMouse() 
        MouseX = -MouseDeltaX()/5 
        MouseY = -MouseDeltaY()/5 
      EndIf 
      
      RotateEntity(#Robot, 1, 0, 0) 
      RotateCamera(0, MouseX, MouseY, 0) 
      MoveCamera  (0, KeyX, 0, KeyY) 
      CameraLocate(0,CameraX(0),TerrainHeight(CameraX(0),CameraZ(0))+10,CameraZ(0)) 
      
      EntityLocate(#robot,EntityX(#robot)+movex,EntityY(#robot)+movey,EntityZ(#robot)+movez) 
            
      If EntityY(#robot)<=TerrainHeight(EntityX(#robot),EntityZ(#robot)) Or prevEX < 0 Or prevEX > scTerSize Or prevEZ < 0 Or prevEZ > scTerSize 
        ;EntityLocate(#robot,EntityX(#robot),TerrainHeight(EntityX(#robot),EntityY(#robot)),EntityZ(#robot)) 
        ex=Random(scTerSize/2) 
        ez=Random(scTerSize/2) 
        EntityLocate(#robot,ex,TerrainHeight(ex,ez),ez) 
        EnableWorldPhysics(0) 
        movex.f = Random(100)/100+0.5 
        movez.f = Random(100)/100+0.5 
        movey.f = Random(100)/100+0.5 
        setphys=1 
        EntityMaterial(#robot,MaterialID(0)) 
      EndIf 
      
      RenderWorld() 
      
      If MouseButton(1) And mlwasDown=0 
        DisplayTransparentSprite(2,0,0) ;fire! 
      Else 
        DisplayTransparentSprite(1,0,0) ;normal 
      EndIf 
      
      StartDrawing(ScreenOutput()) 
        DrawingMode(1) 
        FrontColor(RGB(255,255,255)) 
        DrawText(10,10,"Loc: "+Str(CameraX(0))+", "+Str(CameraZ(0))) 
        DrawText(10,25,"Fired: "+Str(shotsFired)) 
        DrawText(10,40,"Hit: "+Str(shotsHit)) 
        If shotsfired>0 
          DrawText(10,55,"Acc%: "+Str((shotsHit/shotsFired)*100.0)) 
        Else 
          DrawText(10,70,"Acc%: n/a") 
        EndIf 
        DrawText(10,85,"Time: "+Str((ElapsedMilliseconds()-startms)/1000)+" s") 
      StopDrawing() 
      
      FlipBuffers() 
      
      If MouseButton(1) And mlwasDown=0 
        GrabSprite(3,295,215,50,50) 
        StartDrawing(SpriteOutput(3)) 
        shotsfired+1 
        For i = 23 To 27 
          For j = 23 To 27 
            p=Point(i,j) 
            If Red(p)>230 And Green(p)<10 And Blue(p)<10 
              EntityMaterial(#robot,MaterialID(1)) 
              hitStr.s="H" 
              PlayNoteMIDI(0,50, 127, 80) 
              Break 
            EndIf 
          Next 
        Next 
        DrawingMode(#PB_2DDrawing_Outlined) 
        Box(22,22,6,6,RGB(0,255,0)) 
        StopDrawing() 
        
        If hitStr="H" 
          shotshit+1 
        Else 
          PlayNoteMIDI(0,50, 127, 80) 
        EndIf 
        
        hitStr.s = "" 
        mlwasDown=1 
      EndIf          
      
      If MouseButton(1) 
        mLwasdown=1 
      Else 
        mLwasdown=0 
      EndIf 
      
      prevEX = EntityX(#robot) 
      prevEY = EntityY(#robot) 
      prevEZ = EntityZ(#robot) 
      
      If (ElapsedMilliseconds()-startms)/1000 >= maxTime And maxtime>0 
        Quit=1 
      EndIf 
      
      Delay(10) ;60+fps 
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1 
  EndIf 
    
Else 
  MessageRequester("Error", "The 3D Engine can't be initialized",0) 
EndIf 

  
End 
Last edited by Ollivier on Wed Oct 10, 2007 3:56 am, edited 4 times in total.
dracflamloc
Addict
Addict
Posts: 1648
Joined: Mon Sep 20, 2004 3:52 pm
Contact:

Post by dracflamloc »

Btw I forgot to put a license on that code above, though I did have my copyright on it. It will be licensed under the GPL.
Ollivier
Enthusiast
Enthusiast
Posts: 281
Joined: Mon Jul 23, 2007 8:30 pm
Location: FR

Post by Ollivier »

Fixed!
Post Reply