• Content count

  • Joined

  • Last visited

Community Reputation

0 Neutral

About ShadowDog

  • Rank
  1. I logged in with the wrong account and didn't notice. Sorry.
  2. It's just no one notices nowadays because we have so much excess processor/ram when it comes to running DOS games.
  3. For the record, Victory Games has actually joined the BioWare branch of EA (I never realized BioWare was owned by EA; then again that Sonic RPG is the only BioWare game I've ever played, so...). Just a quick question: who here really cares that much about a Generals 2? Honestly, I'm just hoping for a Command and Conquer: All-Stars 2. Anyone know any BioWare jokes? I think they made Mass Effect? Maybe? I don't know... Damnit, Victory, you were supposed to make Command and Conquer 4: Command and Conquer Edition, not Generals 2. Here's to hoping they at least release a mod SDK. I miss not being entirely disillusioned about everything...
  4. How different are the two classes? I'm assuming different enough to where you couldn't "easily" convert all "c&c files" to "files" (or the "check everywhere" routine over the "check mixfiles" routine), but I suck at ASM, so I can't even wrap my brain around how classes work in ASM.
  5. There was a version of Dune 2 for Windows? Wow, I feel stupid for not knowing that.
  6. I just found out the other day that "The King is dead! Long live the King!" Referred to the old king, then the new one. I always thought it meant "Long live the old king's spirit".
  7. So on CnC-Comm's 365th birthday, you're going to be a whole year late?
  8. I'm not into tabletop RPGs, but you can't deny that it'll still probably be a better Command and Conquer game than that "4" game. Quick edit: While shutting down the computer, I realized that articles from Feb. Oops.
  9. Basically, C/++ doesn't scan the .c files for functions. The following code isn't valid, IIRC: void main() { stuff(); return 0; } void stuff() { //Lol } The compiler can't find stuff(). Yeah. So you have to specify that it exists. Technically, you could just go "void stuff();" above main(), but most people use header files. Even smarter people use C# instead, because A. you can put code pretty much anywhere once you find out about partial classes, and B. CLI/CLR is fast. Admittedly, programs running on it are generally slower, but that's because most graphical solutions involve C/++ wrappers. Nyer, this has gotten me interested in that disassembler program I was talking about again. I'm seriously going to look into it now. EDIT: The idea being that I could write a disassembler like the one OpenDUNE uses, only C# instead of C/++, x86 instead of... DOS stuff, and probably commented instead of working out of the box. Seriously, I know it's an unmanaged language, but HTF did they get that working? Fake X, Y, etc.? EDIT2: Oh, emulated memory. Then how do they convert things to C while still having it interface w/emulated memory? I'll have to read the code in a few minutes.
  10. Wait, so would I be able to run the DOS installer on Windows 7 without DOSBox or similar? Also, lets say that I made a program that looked at all the jumps, noted them, and automatically went through and output an ASM file where the jumps pointed to labels. What would the problems be with that? The only one I can think of off the top of my head is the possibility that the "JMP" is actually just something with the same byte as the JMP opcode, but not actually a JMP (Data, or an argument to another opcode). Shoot, I'd have to go through the whole file, jot down (in a List<WhateverProject_Opcode>) what all the opcodes are along with their arguments, and figure out what's data and what's not. Nyer, if you're programatically going through all the opcodes, etc., is there any way to tell if you're in data vs. an opcode?
  11. I'll parse the conquer.eng/.etc files, making a new MultiString for each that has it's values set accordingly. After that, I'll read whatever files those were that patch the conquer.* files. The MultiStrings are going to be in a list, BTW, so I can just call them up by index. I'm not going to be handling absolutely everything the way TD does. For example, while TD has it's pre-briefing briefing (the part that shows up after you select a territory, but before you actually load the mission) call up string number x, I'll first check to see if the mission's .ini has anything on it, then check some .ini file for that info. You already wrote down that info, and I made it into an .ini file and shoved it somewhere in Luftballon. Once I finish up .mix loading, find a good way to store the canonical versions of the files in memory, parse the .tmp and .shp files, and figure out how to use palettes in a shader environment, I'll get around to getting the fancier things like actually loading text. For now, I've just finished getting back on a normal sleep schedule, so I'll be around 7PM before I'm ready to screw with TibDawn some more. P.S. Played some more Black Ops. today. Kicks GoldenEye Wii's butt.
  12. I know the language thing isn't remotely like what TD uses; my idea is to make it so you can switch languages mid-mission, and also to let a half-implemented language fallback to another language. In my library, the language order is English, Spanish, French (due to being similar to Spanish), and German, though in TibSharp, it's English, German, French, Spanish. I'm planning on implementing the same thing for textures, too. Also, I'm planning on de-hardcoding it so that it uses the 2 list system I outlined previously. I'm heard that C# doesn't do palettes, only shaders, and that I'd need to either have multiple textures that I manipulate on initialization to replace their colors with whatever they should be, or write a shader that does that, which I hear would be a performance hit. Since I'm going to be creating the Image from scratch anyway, I'll probably just use fastpixel (which I have a program I can reference, thankfully) and create a CNCFakePaletteSHP class that holds all the sides' paletting of a SHP. Considering that even if I could get it to do palettes, it'd still have to be broken into multiple Image s, that'll be a PITA. Unless, of course, fastpixel is faster than the speed of freaking light and I could have it convert hundreds of SHP-data-thingys into an image per-frame. Argh. I'll probably ask godly-cheese to make a giant mission (bigger than SS/RA's maximum map size) with a stupid amount of units to stress test the thing once I've made a map editor. Edit: Opps, fastpixel isn't a library, it's a random class in ClassicMap, which is a Pokemon map editor. Argh. Anyway, research time, I suppose. Edit2: Changed some hacky stuff into a flexible function, and it hit the fan. I finally tracked it down to an XOR statement. The main problem was what the fuck is an XOR statement and why shouldn't ^ be the exponent symbol. I haven't even gotten to anything involving bit-shifting or whatever yet and I'm already finding it to be a PITA.
  13. Wasn't the DOS version (or was that just the installer)? Or am I confusing what 16-bit actually means? Edit: I figured out the problem with the MIX headers: I was multiplying 256 by 2, 3, etc, instead of it by that much. For the record (in case future peoples of the futures want something to reference when they discuss TD's .mix file format, because you know that'll be all the rage in A.D. 2101), TD has it's high bytes last. Which was that, big endian or little endian? I also get those two mixed up, no pun intended. Edit2: What are those last 3191 bytes in conquer.mix that supposedly aren't data for? 6 bytes for the header, 2456578 for the data, and the total file size is 2459775 bytes. Odd, isn't it?
  14. Of course, I forgot CnC was 16-bit. IIRC, 8-bits make up one byte, 16-bits would be 2 bytes, and 32 would be 4. Makes sense now. Thank you, Nyer. Oh, and I just realized that qword = quad-word. Obvious, but not as obvious when you don't know what a dword is. Edit: public class MultiString { public string Eng = ""; //!HACK public string Ger = ""; //!HACK public string Spa = ""; //!HACK public string Fre = ""; //!HACK public string String { get { string aaa = ""; BasicClass.Languages.ForEach(delegate(String lang) { string bbb = GetStringLang(lang); if (bbb != "") { aaa = bbb; } }); if (aaa != "") { return GetStringLang(aaa); } if (BasicClass.Production) { return ""; } else { return "*INVALID*"; } } } public string GetStringLang(string lang) { if (lang == "Eng") { return Eng; } else if (lang == "Ger") { return Ger; } else if (lang == "Spa") { return Spa; } else if (lang == "Fre") { return Fre; } if (BasicClass.Production) { return ""; } else { return "*INVALID*"; } } } That get{} construct (is that the term?) seems really handy, though admittedly I see no point in it as opposed to a procedure. However, what I really want is some way to have a list formatted like this: "Eng" = "Hi!", "Ger" = "Guten tag or whatever", "Fre" = "However the heck those Fremen say hello", "Spa" = "iHola senior!" //As you can tell, I got a D in Spanish. Mainly because I can't remember where that darn... "marky thing" goes... And return the later part based off the former. In BYOND, you make the list like this: var whatever = list("a" = "c","b" = "d") and access the later part by either going: whatever[1] //1-indexed, IIRC or: whatever["a"] with it returning null whenever you try to access something that isn't there. Is there anything that easy to use in C#, or am I going to have to have 2 lists, loop through the first list hoping to find string A, and if it's there, return the string at the same position in list B? Because if not, I'll make an API for that (in the last couple of days, I've done lots of stuff under the hood, but it's mainly been stuff like making my APIs easier to use and more child-proof; defensive programming is the way to go, because you never know when you'll be reduced to the intelligence level of a garden hose). Edit2: Are all the mouse cursors displayed from the center with the exception of the generic mouse, or is there some sort of table I'll need to mimic? Edit3: This is what I'm getting for conquer.mix NumFiles: 266 DataSize: 50690 But it should be 2459769 instead of 50690. Can you figure out what's wrong? This is conquer.mix, by the way. int NumFiles = (mixfile[1] * 256) + mixfile[0]; Console.WriteLine("NumFiles: " + NumFiles); int DataSize = (mixfile[5] * (256 * 3)) + (mixfile[4] * (256 * 2)) + (mixfile[3] * 256) + mixfile[2]; Console.WriteLine("DataSize: " + DataSize);
  15. I'm glad that you mentioned Pascal, because the file format guide I'm using refers to a Pascal longint. I know that an x86 int and long are the same size, so I'm wondering if Pascal has self-imposed sizes, or if the person just arbitrarily put longint instead of int. Honestly all this file format reading can be confusing when people say, for example, word instead of 2 bytes. Hyper, do you have a Bug Tracker? If not, I'll set up Mantis on my site.