OpenArena Message Boards

OpenArena Contributions => Development => Topic started by: Mirakus on April 21, 2011, 07:20:18 PM



Title: Source for program that converts Quake1 to Quake3/OA format - GPLv2
Post by: Mirakus on April 21, 2011, 07:20:18 PM
Here is the source for a small program I wrote which converts maps from Quake 1 to Quake3/OA/etc.  Basically all that it does is add three 0's to each surface of a brush in the map file, so that Radiant will recognize it as an OA/Q3 map. 

I'm sure there are plenty of scripts/programs that already accomplish this, but I was having a very hard time finding anything, and made the decision to just write some code to do it.  You will still need to handle the other parts of fully converting a map (entities, textures) yourself. 

I've only tested this on my GNU/Linux system, but it should build fine under Windows since all it uses is stuff in the C++ standard.  I would imagine you should have no problem building it with MinGW or creating a project for it under visual studio, but if doing the latter, you will want to make sure you're building it as a console application and run it from the command line. 

Usage: quakeconv infile outfile

Where infile is the original Quake map you wish to convert, and outfile is the resultant Q3/OA map.  This is something I whipped up quickly for a specific purpose, so there might be some bugs, but all of the maps I've converted have built fine.  Also, I was working on a way to convert the Q3 format back to Quake, that way I could make some interesting single player levels, but never got that far and wanted to get this out there.  I truly hope it's useful!

Also, I've renamed the filename extension to .c, but it is c++ code, make sure you rename the file/build accordingly. 


Title: Re: Source for program that converts Quake1 to Quake3/OA format - GPLv2
Post by: fromhell on April 21, 2011, 07:56:03 PM
Does it handle the teleporters and adapts the 'pushes' too?

Hopefully i'll be able to use this, as I prototype my maps through Quake first  (oa_bases7 was qrototyped)


Title: Re: Source for program that converts Quake1 to Quake3/OA format - GPLv2
Post by: Mirakus on April 21, 2011, 08:46:17 PM
I did have to set a target for one of my teleporters again, but I think that's just because I made some other mistake.  Also, doors, platforms, and switches continued to work.  I was also able to keep my lighting!  I think most of the stuff between the two engines is compatible aside from things like weapons and items.  Honestly, I just haven't tried it on enough maps yet.  I converted a few of the ones I did for Q1 as well as some of the source maps for Quake 1...other than the texturing, most everything seemed to be okay. 


Title: Re: Source for program that converts Quake1 to Quake3/OA format - GPLv2
Post by: Gig on April 22, 2011, 12:47:41 AM
Realeasing an executable version could be a nice thing...


Title: Re: Source for program that converts Quake1 to Quake3/OA format - GPLv2
Post by: Graion Dilach on April 22, 2011, 06:20:04 AM
It's nice. Even if I somehow miscompiled it in MSVC2008. I get a file filled with 0Ahs from every maps I tried. Crap that I messed up Dev-Cpp with installing MinGW. That was the only thing which compiled what I wrote without a problem.


Title: Re: Source for program that converts Quake1 to Quake3/OA format - GPLv2
Post by: 7 on April 22, 2011, 08:28:07 AM
If I understand correctly the only thing the code has to do is to append three zeroes to every line that starts with a bracket? If so then the simplest way to implement it is to write a standard i/o filter:

Code:
#include <iostream>
#include <string>

int main()
{
std::string line;
while(std::getline(std::cin, line)) {
std::cout << line;
if('(' == line[0]) {
std::cout << " 0 0 0";
}
std::cout << '\n';
}
return 0;
}

Usage: quakeconv < infile > outfile


Title: Re: Source for program that converts Quake1 to Quake3/OA format - GPLv2
Post by: Mirakus on April 22, 2011, 10:05:18 PM
Well, I have found one oddity that I can't explain yet.  In the two maps I originally did for Quake, there are a couple of select groupings of brushes that will not draw, yet they're shown with a proper texture in Radiant.  It hasn't caused any serious side effects though other than brief blur in one area of the map I've been working on.  I'll have to look through the map file and see if I can pick out anything obvious.  Also, remember that the program creates a new copy of the map and doesn't trash your source one unless you specify infile and outfile as the same on the command line. 

I'm sure there are plenty of other (and easier) ways to implement this, but I kind of took a "hack my way to getting it to work" approach.  I'm just glad I could get something working!   :D


Title: Re: Source for program that converts Quake1 to Quake3/OA format - GPLv2
Post by: 7 on April 23, 2011, 01:00:48 AM
Hey I'm not trying to put you down, I just wanted to demonstrate you don't need to read every line of the file into an array before you start changing them. You only have to do that if there are so called forward references in the file, that's when you don't know how to change a line until after you've read  and parsed more lines (for example if you only know how to change line 10 after reading line 300).

Even with forward references it's not really necessary to put all lines in an array, another approach is to read and parse the file twice: the first time to do all the work you can and to keep note of any forward references that come up, and a second time to fill in all the missing references. (This is why most compilers read your source files more than once by the way, every time a compiler reads your source files to resolve more forward references is called a parser pass.)

Edit:
Messed up the terminology, it's forward references.


Title: Re: Source for program that converts Quake1 to Quake3/OA format - GPLv2
Post by: Peter Silie on April 23, 2011, 05:59:59 AM
parsing?
sounds like to be a job for sed :)


Title: Re: Source for program that converts Quake1 to Quake3/OA format - GPLv2
Post by: andrewj on April 23, 2011, 06:41:36 AM
sed -e "g/^[(]/s/$/ 0 0 0/"


Title: Re: Source for program that converts Quake1 to Quake3/OA format - GPLv2
Post by: Mirakus on April 23, 2011, 05:10:38 PM
7, on the contrary, I'm very happy for the suggestions.  I haven't really coded anything for a while, and pretty much just thought of one possible solution and went with it.  I haven't quite bent my around your suggestion with the i/o filter, but I'll play around with it next time I go back to the program.  Thanks!  Thanks also for the sed suggestion.  I've been using linux systems for a few years now, but never quite learned how to use it. 


Title: Re: Source for program that converts Quake1 to Quake3/OA format - GPLv2
Post by: Peter Silie on April 23, 2011, 05:39:29 PM
the streaming editor is a mighty tool as you can see on andrews solution for your problem. :)
anyway: you always can solve a problem in different ways and if you do it for fun, all solutions are welcome!
maybe there is also a solution in brainforget or whatever - curious about that ;D

[EDIT]: cmon lei lol: this is the name of a programing language! :D