View Full Version : Pyrogine2Dび「 API 2

26-12-2007, 02:36 AM
Pyrogine2Dび「 API v2.0.0.147 (Beta 1)

Welcome to Pyrogine2Dび「 ("P2DAPI"), a 2D game framework API for PC's running Microsoft Windows. This release is aimed specifically at Direct3D with 3D hardware. P2DAPI is feature complete and can easily create any type of 2D game with D3D for rendering. It was designed to be easy to use, robust and feature rich and should be easy to use in your projects.

Pyrogine2D is a pure rendering API suitable for making 2D games and graphic simulations. There are numerous exported routines which give you a solid low-level foundation for making any type of 2D game. You can build on top of this layer to any level of complexity that is required for your project.

The API includes support for surfaces, textures, sprites, audio, streams, archives, INI files, configuration variables, render targets, swap chains, scripting and much more. In addition to the low-level, to the metal access, there exist a thin high level framework unit that includes classes such as TP2DObject, TP2DObjectList, TP2DActor, TP2DActorList, TP2DEntity and TP2DGame that will give you enough high level support over the API to make it easy to get started with your projects in an object oriented way.

* Binary and source code license option.
* Uses Direct3D 9 for hardware 2D rendering.
* 32 bit surfaces and textures.
* Free scaling, rotation, alpha blending and other special effects.
* Windowed and full screen modes.
* Frame based timing support.
* INI file configuration support with config file variables.
* Configuration file variable support.
* Unified Streaming system (memory, file, EXE resources, zip archive).
* Can render to default application window or to a specified window handle.
* Advanced render target and swap chain support.
* Textured fonts (includes a font editor tool and support for custom fonts).
* Graphics primitives (lines, circles, rects, points).
* Advanced polygon rendering (scale, rotate, control line segment visibility).
* Support for rendering large images (640x480, 800x600, 1024x768 for example).
* Advanced sprite management.
* Polypoint collision system for fast precise collision detection.
* Mouse and keyboard input management.
* Unified audio system with support for WAV|MP3|MID|OGG|MOD|IT|S3M|XM streaming music.
* Comprehensive math routines (vectors, angles, line intersection, clipping).
* Log file support.
* Scripting system with full debugging support.
* Low-level access for raw nut & bolts power.
* Thin high-level framework for fast start using OOP.
* Robust and feature rich.

* Pentium III class CPU, 734MHz
* 256MB of RAM
* 20MB of free Hard Drive space
* Microsoft Windows 2000, XP, Vista
* DirectX 9 Summer 2003 Runtime
* Direct3D compliant 3D video card that can do 3D in a window (minimum recommend card INVIDIA FX5200)
* DirectSound compliant audio card (optional)

* Add {installdir}\Bin to your windows system path
* Add {installdir}\Sources to Delphi search path
* Add ..\Bin as the final output location for the examples for your compiler
* Add p2dApi.pas file to your project uses section low-level api access
* Add p2dFramework.pas to your project uses section for high-level api access
* See the docs and examples for more information on how to use P2DAPI

* Docs will be frequently updated and improved.
* Examples & tutorials will be updated and improved.

Our standard practice is providing affordable high quality development solutions. You can use P2DAPI free of charge in any of your freeware projects. If you use P2DAPI in any way to make money then you need to purchase a Registered Developer License from our website which entitles you to the full source code of the Pyrogine2D DLL and updates for a 12 month period. Visit www.pyrogine.com for more information on pricing.

If you need support you can reach us in several ways:
* Website - www.pyrogine.com
* Email - support[at]pyrogine.com
* Forums - support forums at pyrogine.com & pascalgamedevelopment.com


Pyrogine2Dび「 API v2.0.0 (3.16 Mb) (http://www.pyrogine.com/index.php?component/option,com_docman/Itemid,58/task,doc_download/gid,11/)

Robert Kosek
26-12-2007, 04:57 PM
It would be a good idea to maintain a changelog, as telling differences between versions is somewhat of a challenge without it. Also, the page that is supposed to tell us pricing information doesn't exist yet, or isn't public--still.

Do you have, or will you have, Chrome support? Turbo Delphi is too unstable for my purposes, it is rare that I don't have a crash for every time I run the IDE, and I'm really impressed with Chrome. Unfortunately most graphics packages don't support it yet, and there's easy interfaces for DLL communication. I don't necessarily feel like implementing huge packages myself by hand anyway.

26-12-2007, 06:50 PM
Robert Kosek
Yea look for the changelog in the next build. I plain to release maybe 2-3 public betas while I finish up the last few bits (docs, e-commerce at the site and a few other things) at which time I will have the pricing info finalized.

I purchased Chrome some time ago and have been getting up to speed with it. Look for Chrome support in future builds. If all goes as planned I hope to do a lot with it ( http://www.chromegamedev.com , nothing there yet), hopefully in the coming months.

Thanks for your interest.

26-12-2007, 07:45 PM
Whats the speed of chrome? you guys have made some tests?

Robert Kosek
26-12-2007, 09:07 PM
I've not made a whole lot of tests, but the speeds seem roughly as fast if not a bit faster than Delphi. I made a quick and dirty RSS reader, and parsing is faster than I can blink.

It takes a good bit of getting used to, but for $300 instead of $900 for Delphi ... it's an absolute steal.

26-12-2007, 09:53 PM
I've not done extensive test yet either. I hope to do so in the coming months however. For a object pascal .net solution it is very nice and elegant. The first solution I will attempt to do is use it to make a .net binding for Pyrogine2D. At some point I hope to make a pure .net assembly (as pure as I can get, I will explain in a bit) of Pyrogine2D.

A few things that has been hampering me going full blast with .net for game development:

* That 30+MB extra download needed for the .net framework. Our stuff is casual games and 5-8MB downloads still seems to be that magical number. if you have .net framework installed, no big deal, but if you don't then many will just move on to the next game that is 5-8mb to download and try.

* A solution for this is have the installer do a prereqs checks and attempt to download what it needs. But still, if the machine does not have any of this installed, then it starts to become too much of a hassle to go through just to play a game that is say 3mb in size.

* I will have to do so some type of interop to talk to do DX and libs that I don't have a .net solution for. So this mean more DLLs in the distro. I like my distros to be lean and mean, easier for the end user the better.

* One solution is to use c++/cli to make the interop dll then I can put everything that don't have a .net solution or it needs to stay native in one interop dll such as Pyrogine2D.Interop.dll and then have Pyrogine2D.dll which will be the .net assembly you bind to. c++/cli allows you to make mixed mode assemblies with it. As far as I know this is where "it just works - ijw" came from. So I can pack all my native libs inside the interop dll and use c++/cli to make a nice neat abstraction layer that I can now use in chrome to build the rest of the library.

* I have .NET Reactor to protect my assemblies and it has a nice license feature too.

* I could use SlimDX for the managed dx layer, but for me it would be a better solution to pack as much in one interop dll rather than having yet another dll to manage.

Ahh, I still have some thinking to do about all of this.

Robert Kosek
27-12-2007, 12:02 AM
* I will have to do so some type of interop to talk to do DX and libs that I don't have a .net solution for. So this mean more DLLs in the distro. I like my distros to be lean and mean, easier for the end user the better.AFAIK, .NET includes its own managed interop for DX. I believe it is pretty lean and mean, but I have no ideas of its default capabilities and extensibility.

Your other points are quite well taken though. Just bear in mind that most people already have .NET 2.0 for their desktop applications, so distribution size won't be a huge issue.

27-12-2007, 01:21 AM
There is managed DirectX 1.1 and for a while a beta of 2.0, but it was never officially released. It became XNA which is now at version 2.0 and finally allows you to use all the VS 2005 SKUs, not just C# Express Edition . I only briefly looked at XNA. The main problem for me is that to use all it's goodness, you have to use c#. I understand Dom is doing some stuff with XNA to make it work with Chrome of which I will be keeping an eye on. SlimDX was created to fill that gap left by MDX 2.0. For me though I would most likely try and keep things tight and simple and pack everything in the one interop DLL

I now have pricing (http://www.pyrogine.com/index.php?component/option,com_digistore/task,list_products/id,1/) information for Pyrogine2D on the website. I set things up so after purchase I will then upgrade your account and you will have access to the registered developer files. There you can download the latest source snapshots and builds at your convenience.

27-12-2007, 02:16 AM
im disapointed :( with chome

i know it may mean nothing but i ported my usual bechmark to chome, and it simples ....

D7 / FPC
program bech;



i: integer;
a, b: string;
x, y: Double;
c: string;
t1, t2: Cardinal;
d: Integer;
x := 3;
y := 0.2;
a := ParamStr(2);
b := ParamStr(3);
d := StrToInt(ParamStr(1));
// timing starts
t1 := GetTickCount;
for i := 1 to d do
if a <> b then
x := x * y;
c := c + IntToStr(i) + 'x,';
t2 := GetTickCount;
// timing ends;
writeln((t2 - t1), ' ms');

namespace bechmark;


uses System.*;

ConsoleApp = class
class method Main(args: array of string);


class method ConsoleApp.Main(args: array of string);
i: integer;
a, b: string;
x, y: double;
c: string;
t1, t2 : cardinal;
d : integer;
x := 3;
y := 0.2;
a := args[1];
b := args[2];

d := integer.Parse(args[0]);
// timing starts
t1 := DateTime.Now.Ticks;

for i := 1 to d do
if a <> b then
x := x * y;
c := c + i.ToString + 'x,';
t2 := DateTime.Now.Ticks;
// timing ends;




echo "delphi 7"
bechD7 100000 "This is a BIG string 1" "This is a BIG string 2"
bechD7 150000 "This is a BIG string 2" "This is a BIG string 3"
bechD7 200000 "This is a BIG string 4" "This is a BIG string 5"
echo "FPC 2.2"
bechFPC 100000 "This is a BIG string 1" "This is a BIG string 2"
bechFPC 150000 "This is a BIG string 2" "This is a BIG string 3"
bechFPC 200000 "This is a BIG string 4" "This is a BIG string 5"
echo "Chrome"
bechChrome 10000 "This is a BIG string 1" "This is a BIG string 2"
bechChrome 10000 "This is a BIG string 2" "This is a BIG string 3"
bechChrome 10000 "This is a BIG string 4" "This is a BIG string 5"


Chrome app only runs once, the second i dont know why does not end..
(i waited for 3 min twice and it does not ended) .net framework problem maybe?

ps: the params for delphi7 and fpc are highter, if i set the same for Chrome it does not end after 3min...

27-12-2007, 03:05 AM
One problem is that in .net each time you concat a string it has to allocate a new instance, do the concat operation and return to you a new string object ( if I am not mistaken). There is something called a string builder which helps with this problem. I would be interested to see the result when you use the string builder instead. Note that this problem is not a chrome problem but it is a fundamental aspect of the .net framework which will effect any .net language.

27-12-2007, 04:42 AM
i need to install bds 2006 here to test bech with it, FPC shows itself as an kick ass pascal compiler

27-12-2007, 04:43 AM
One problem is that in .net each time you concat a string it has to allocate a new instance, do the concat operation and return to you a new string object ( if I am not mistaken). There is something called a string builder which helps with this problem. I would be interested to see the result when you use the string builder instead. Note that this problem is not a chrome problem but it is a fundamental aspect of the .net framework which will effect any .net language.
yes and the same on java virtual machine

Robert Kosek
27-12-2007, 02:29 PM
One of the problems is the following line. You're converting the executable's name to an integer, which could be a little troublesome.
d &#58;= integer.Parse&#40;args&#91;0&#93;&#41;;Which ought to be:
d &#58;= integer.Parse&#40;args&#91;1&#93;&#41;;This will cut your loop way down.

27-12-2007, 03:48 PM
One of the problems is the following line. You're converting the executable's name to an integer, which could be a little troublesome.
d &#58;= integer.Parse&#40;args&#91;0&#93;&#41;;Which ought to be:
d &#58;= integer.Parse&#40;args&#91;1&#93;&#41;;This will cut your loop way down.
I don't know why but on chome the args start at 0

i think its a .net thing

30-12-2007, 12:17 PM
I have FontStudio (http://www.nitrogen.za.org/projectinfo.asp?id=12) support in now. You just have to add p2dFont to your uses section and create an instance of TP2DFontStudio. This class is derived from TP2DFont which is the base class for adding new font support to Pyrogine2D. I plan to include this in the next release.


15-01-2008, 03:16 PM
Ok, the first draft of the Pyrogine2D2 (http://www.pyrogine.com/temp/p2dapi2_docs.zip) docs are now available. Note the documentation will be constantly improved and frequently updated. You will be able to download new updates from the same link up until the next official build of Pyrogine2D is released.

Each page has a link that can send us an email with the topic information if you find something wrong or wish to comment about that topic. Since this is the first draft there is bound to be some mistakes, errors and/or omissions. If you find something be sure to let us know so we can get it corrected.

07-02-2008, 04:39 PM
I was going to download pyroscript today but the website seems to be the old one, somethings is wrong.

Robert Kosek
07-02-2008, 05:18 PM
Once again, in upgrading or doing something to the site, Jarrod lost the data. Do you not have the ability to do a MySQL backup, Jarrod? :?

This is the primary reason I gave GameVision up, those year(s) ago. You never could keep the site running for long without data loss, harmful upgrades, or attempts to change something that went wrong. At a certain point, if you lose the userbase and all the information they work to accumulate they'll just leave and use something else.

Edit: Wait, it got wiped a second time? Just proves my point really.

07-02-2008, 05:35 PM
Some one hacked the site. I have no control over this. Then someone did a DoS on my hosting provider, again I have no control over this. I have the site backed up and trying to get things back online. It just sucks and pisses me off to no end. I get 3-5 people register per day with email address that don't work, all kinds of weird stuff, hack attempts. It's crazy man. I would love for this to no happen and not have to deal with this scrap, but this is the world we live in. Like I said, it should be up soon.

Things will be a little weird until full DNS propagation. My hosting company is moving me to a new server. Again, I am sorry about all this. Trying to get it resolved as fast as possible.

Robert Kosek
07-02-2008, 05:57 PM
Okay, so that explains all the trouble.

For one thing, do you know where the attacks are occurring primarily? If they are getting your passwords and logging into your host or MySQL databases, try generating an SHA1 hash of a random number and use that for your password. I'd rotate that once a month.

Joomla, for one thing, has very little respect in my eyes. I've used it several times and hated it each time. One thing you can do, if you understand PHP, is to block addresses from known temporary account domains. To see a list you can refer to this thread at TalkPHP (http://www.talkphp.com/advanced-php-programming/1824-checking-valid-email-addresses-using-regexp.html). There's a whole list there that you can copy-paste if need be. I suggest Enano (http://enanocms.org/News:Portal), which is newer, is built off PHP5 (which has better security), and has wiki-like features, so you needn't include a wiki for your documentation.

And do you have anything in the error logs that you can find? For instance, failed hacking attempts that might have caused an error.

This is all I can think of at the moment, but I can help you to secure your site.

07-02-2008, 06:18 PM
Thanks. I will consult with you. This is just nuts man. I finally get the site stable and then have to deal with this stuff.

It looks like a lot of the problems are from *gulp* Russia. I can not tell you the number of people that register per day all with bogus/bad/suspect emails. I will erase the account they will reregister in a few mins/hours. It's been crazy for me the past week or so to say the least.

As soon as the DNS fully propagates everyone should be able to see the correct site. Now, I will have to reupload the files and fix a few things which should take a day or two. The links will be slightly different and I will try to update them in the forum posts.

Robert I will talk to you about this more in private email. Again, thanks for your help on this and a general thanks to everyone for your patience and continue support.

Robert Kosek
07-02-2008, 07:19 PM
For anti-spam purposes, concatenate my first and last name with a dot and address it to the domain in my profile. You'll have my personal email in all of two seconds.

I took my blog offline because I got 1000 spam comments a week for either poker or porn, and the thing is ... commenting for guests was off. Wordpress just had bad holes in it.

I know how it goes, so lets get your site more robust. ;)

11-02-2008, 11:03 PM
Starting today you can download daily development builds of PyroGine SDK. This is for those people that like to stay on the bleeding edge. Note these builds are unstable and some features may/may not/may never be implemented in the current state.

DevBuilds (http://www.pyrogine.com/index.php?component/option,com_docman/task,cat_view/gid,35/Itemid,47/)

14-02-2008, 03:54 AM
[+] Added PyroBase, a dbase3 compatible database add-in for PyroGine

14-02-2008, 04:55 AM
pyro, check your personal messages

14-02-2008, 03:05 PM
arthurprs. check your email.

14-02-2008, 05:12 PM
arthurprs. check your email.

thanks :D

ps: i was creating IDirectSound instead of IDirectSound8 in my previous tests, there are difs?

14-02-2008, 05:28 PM
Yea. That will use an earlier interface. I forget what changes where introduce in IDirectSound8. The interface is pretty much consistent, internals have changed. In theory this is the nice thing about an interface. If you keep it consistent you can continue making improvements without breaking code. In theory that is.

18-02-2008, 03:08 AM
[+] Added PyroNet, a reliable UDP networking add-in for PyroGine

Download (http://www.pyrogine.com/index.php?component/option,com_docman/Itemid,47/task,doc_download/gid,4/)

18-02-2008, 08:48 AM
I did various attempts to download the SDK, but something went wrong. :(

After some time the download stopped, and after a minute i got an error about not being able of reading the source file. I would really like to take a look at the Pyrogine API. Maybe you can mail it to me? :razz:

Still having problems with hackers, DOS attacks etc??

18-02-2008, 01:18 PM
Hmmm... that's strange. I was able to download ok. Can you please try it again. Any one else having this problem? Please let me know so I can get it sorted out.


18-02-2008, 02:53 PM
Ah i'm back from school and the download appears to be working :D

I tried to download it with my laptop during my biology lessons (they were really boring :lol: ). I guess the my bad wireless connection prevented me from finishing my download succesfully. :)

18-02-2008, 03:55 PM
ahhh (exhaling).... ok good to know.


18-02-2008, 06:35 PM
I tried the samples and they worked fine. :)
I like your coding style very much because it's very consistent and structured. I also liked the naming conventions you used.

I have a few questions regarding the API?

1. Why have you flattened your API to a series of exported routines instead of keeping it OOP and use interfaces?

2. Why did you use dynamic linking instead of static linking for your DLL's? (Just curious)

3. I see that you use integer types as resource identifiers. But how do you use them inside your engine? Are they just indices into a resource list (starting 0, 1, 2 etc) or are they more complex?

4. About the application related routines? Do they wrap up the windows messaging system and window control?

5. How come your code looks so neat? :razz: are you using code templates alot?

6. How do you handle errors? I may have overlooked them, but i didn't see any error handling routines?

Can you elaborate a little more on these topics. I could learn from it :)

Thanx in advance.

18-02-2008, 09:28 PM
Ah good to know it runs ok on your system and thanks for your comments. BTW what is your system configuration?

1. a) The core API (PyroGine) I eventually want to work with more than just Delphi. I found that it's much easier using a consistent API of exported routines. If you look at the event system you will notice I have a aReciever param. This feature allows for a simple way to do callbacks to your class methods in other languages. There is no "of object" in C++ for example so how can this event fire to a method in your c++ class? Well when you define your event you pass the pointer of the class that will handle the event. In the event procedure (a normal procedure with stdcall convention), this object is passed in via the aReciever param, there you can typecast and call the method to handle the event. Simple, elegant and can work with most all modern languages. b) Having a consistent API prevents the need of having to deal with multiple Delphi versions and language inconsistencies. As is I can use the Delphi version that is most efficient for my needs and the end user can take advantage of the API via any Delphi version starting from version 2. Since its in standard API form it is much easier to create additional language bindings. Yes I can use interfaces, but in the case of languages that does not support them the API will still work. Now, you can build on top of this API in your language of choice. You can see this is what I've done in the PyroFramework unit.

2. With dynamic linking you open up all sorts of possibilities. I can check if the DLL exists, if the proper routines are exported and handle errors properly. I can bind to routines based on the OS or environment I'm running in. For example if a certain feature exists or does not exist then I can bind based on this. The idea when coding a system is to keep as much control as you can. With static linking, if the DLL can not be found or the routines does not exist it aborts and you really do not have much control over the process.

3. All the resources created are actual class objects on the back end. This allows me to do OOP even with the API. For example, you can destroy any object with Pyro_Object_Destroy or close any stream with Pyro_Stream_Close because all the classes on the back end are derived from a common base class. At present I support zip archives. If I add a new archive format in the future, Pyro_Archive_OpenFile will continue to work because of the polymorphic interface.

4. On the backend I have a TPyroApplication class that's global, akin to the TApplication class in Delphi. Functionality related to application are handled by it. Also, rather than dealing with a singleton I keep my "only one instance" objects there such as DisplayDevice, RenderDevice and so forth. You will only have one RenderDevice so why go through all the motion of dealing with a singleton? The application class keeps everything nice and neat and when the application object goes away everything it owns goes also so you don't have to worry about cleaning up these resources. I've found that having a single entry/exit point works good. What I mean is when the DLL is loaded the very first time the Application object is created and it persists until the DLL is finally unloaded. This way the resources that need to always be available are guaranteed to be so. Using the unit initialization/finalization does not always work as expected in this case.

5. Thanks. Well, its just years of trial and error and discipline. I like things to be consistent. In my minds eye I see it as reducing the complex to simple or as simple as possible. Simple yet elegant is the theme you will see throughout the SDK. I have a certain way I like to format my code as you see. Over the years I've tried many different ways of formating and what I do currently just seems to work for me.

6. PyroGine supports and uses exception handling. If a routine does not return a result it will most likely generate an exception and most likely will be fatal. You can check YourApplicationName.log for any errors generated during run-time. So the idea is that the routine should a) just work as expected, b) return a result which informs you of the success or failure or c) it's really bad, then log the error, generate an exception,which then gives you a chance to clean up your own code and then terminate the app.

Thanks for the questions. If I can assist please feel free to ask.

19-02-2008, 12:28 PM
Thank you for your explanations :)

My specs are:

AMD 64X2 5400+
2GB Ram
Club3d Geforce 8600GT
Soundblaster Audigy SE
Windows vista ultimate

I have some questions about the things you explained:

3. So all your resource int types are actually pointers to objects in your DLL. Do you perform any kind of validation on a resource pointer when the user passes it to a routine, or will an AV pop up?

6. Are exceptions safe over an App-DLL boundary. I alway's thought that raising an Exception in a DLL and handling/destroying it in the app causes even more trouble. :? And are you sure that exceptions are handled the same way in different languages?

Thanx in advance :)

19-02-2008, 01:48 PM
Thanks for the specs.

3. There is no validation and if you pass something that is not correct bad things will happen. This is no different than passing a wrong param to any routine. In this case it will either work of fail since it's a pointer to a live object instance.

6. Generally you always have to be careful with this. In my case when the application can not continue Pyro_Abort is called which will clean things up on the back end and the application will terminate. I only use them in this specific way to signal the app that it's about to terminate. This has been a core feature the past 7 years and in the languages that I've tested it works (or seem to work) without issues (Delphi, C++ Builder, MSVC).

20-02-2008, 12:25 AM
Some site updates:

1. Simple Render Target Tutorial (http://www.pyrogine.com/index.php?content/view/41/53/)
2. Simple Swap Chain Tutorial (http://www.pyrogine.com/index.php?content/view/42/53/)
3. PyroGine SDK page updated + new screen shots (http://www.pyrogine.com/index.php?content/view/32/50/)

25-02-2008, 04:26 PM
[=] Updated PyroTestBed to display the startup dialog showing the source code for the running example.

[+] Added DisplayDevice, RenderDevice, Database, Sprite and Entity tutorials.

[+] Added new pfXXX framework units that wrap up the APIs and add new and enhanced features. Now you can access the SDK in a total oop manner.

[-] Removed PyroFramework unit

[F] Fixed a problem where audio would not be restored when app regained focus

Download (http://www.pyrogine.com/index.php?component/option,com_docman/Itemid,47/task,doc_download/gid,7/)

Note: I got a few emails about problems downloading. I tweaked some setting. If you have any issues, please let me know ASAP.

Thanks in advance.

11-01-2009, 08:35 PM
Do you have more sample programs for the engine? I downloaded and the samples do nothing, just switch to D3D mode.

We are currently working with DelphiX, but the lack of alphabending is a big problem. How easy/hard would it be to convert our code to Pyrogine? We have lots of sprites on the canvas, all animated at the same time and we do only movement and scrolling with a fixed large map.

12-01-2009, 01:51 AM

Hi, yes I'm working on examples today in fact. What sort of demos would you like to see?

PGSDK will have two layers: a core API (done) and oop layer (wip) over the core API. Depending on how you structured your code it should be able to integrate with relative ease. Something to consider, when you design your projects create an abstraction layer for your subsystems (graphics, audio, ai, etc), this way as you change implementations, the calls made to these subsystems will remain the same throughout your higher level code.

Give me an idea of the type of examples that you would want to see and I will see what I can do. Feel free to email/PM me if you wish.