Jump to content

ShadowDog

Members
  • Posts

    61
  • Joined

  • Last visited

Everything posted by ShadowDog

  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 exponential...ing 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.
  16. Orca? There's an Ares for TS? Cool. Wait, memory management? TD, RA, SS, TS, RA2, even Renegade were written in C? They never went to C++? Is that why it runs so fast?
  17. What do you do in C#? I want to know so I quit assuming you know what I'm referring to whenever it's something that's XNA/WinForms specific. Also, there's leaked Renegade code? I'll have to investigate that (first thing to investigate: Does EA care?) Edit: Legal problems. Natch. Edit2: Firefox, quit acting stupid and actually send the edit. Now Hyper ninja'd me.
  18. You don't know what SpriteBatch is? I assume you generally use WinForms (I love WinForms). I'm using XNA Framework 4.0. The bracket is from when I was trying to bold some code, but the code tag doesn't parse other tags inside of it. I was thinking more about the changing the units' stats via the mission's .ini file when I said that. Do you know if it's possible to use WWLib via C#? I retrospect, I'm probably not going to use it, but I'm interested in whether it's possible.
  19. So are all inaccurate weapons just as inaccurate? Also, what I'm referring to is how I display all my sprites: public void draw_sprite(int X, int Y, Texture2D tex) { spriteBatch.Draw(tex, new Vector2(X, Y)], Color.White); } public void draw_sprite(int X, int Y, Texture2D tex, int frame) { draw_sprite(X, Y, default_size_x, default_size_y, default_size_x, default_size_y, tex, frame); } public void draw_sprite(int X, int Y, int W, int H, Texture2D tex, int frame) { draw_sprite(X, Y, W, H, W, H, tex, frame); } public void draw_sprite(int X, int Y, int W, int H, int W2, int H2, Texture2D tex, int frame) { int Y2 = frame / (tex.Width / W); int X2 = frame % (tex.Width / W); spriteBatch.Draw( tex, new Rectangle(X, Y, W2, H2), //Destination new Rectangle(X2 * W, Y2 * H, W, H), //Source Color.White ); } This isn't horrible code, is it? Also, I know I could probably get a miniscule speed up by not making two of those overloads redirects to another overload, but I don't think I'd get anything noticeable unless I had a lot of things to draw. Anyway, my main bottleneck right now is remembering how much of a PITA it was to make that tileset for Luftballon/DesertFox, and knowing how much of a PITA it will be to write a .mix reader. A quick note on implementation: I'm planning on allowing indefinitely-sized (so long as it's a square) maps. This is so I don't have to tell the difference between a Sole Survivor and a TD map (since TD conforms to that anyway). I'm also making maps an instanced class just in case I think of a use for having 2 maps loaded. I'm going to eventually put in a SS mode (which would also work in RA mode). As such, I'm planning on implementing 32-player matches, and having the UI limit it to 2-4/6 (depending on the map) for TD/RA and 32 for SS. The idea being that SS shouldn't be treated that differently from TD/RA's standard multiplayer. In fact, I should probably define the engine's goals: [*]Accurately play TD/RA/SS/Dune 2 (TD and aspects of RA and SS for first release) [*]Modernize what should be modernized; ie. load square maps of arbitrary size rather than just 64x64, allow (not force) use of better AI; load data from .ini files rather than executable; not randomly deciding that x-gameplay-aspect is outdated or that the sidebar should be on the bottom. [*]Act as a general Westwood-style RTS engine [*]Be compatible with mods (to a sane degree; executable-hack-requiring mods don't count) [*]Stuff. Specifically, stuff not feasible via pure x86 ASM. [*]Fuck "CnC" 4.
  20. The Vector2 thing is about drawing the sprites. I remember you saying something about knowing how the accuracy or the shooting or something works. Is there anything you don't have the slightest clue about and need a little help with?
  21. You program in C#? I could have sworn you said you didn't know how to program. Maybe I was confusing another ASM hacker? I know a surprising amount of them. Also, I'm glad you know C#, because that means if I run into a brick wall (as in, can't get something to work and internet tutorials aren't helping), I can ask you. Speaking of which, certain sections of scb30ea.ini (Nod Spec. Ops. 2, the level I grew up with, thus why it's being used for testing) has keys like "001" rather than "1" in some parts. Do you know of any way to load a key where those two would be treated the same without checking for "1", then "01", then "001"? Also, any clue why [briefing] is 1-indexed while everything else is 0-indexed? I'm working on an API for opening TD/RA stuff, so when I get a bit farther, I'll work on some sort of amalgamation of XCC Editor and CC-Scen. I might even integrate it into TiberianSharp. I PMed SubDrag and asked him to look into the accuracy in the N64 version. He said he'll check in out in a few weeks (he has quite the backlog). P.S. Is creating an unreferenced Vector2 every time you draw a frame a bad idea in C#? I can't think of any other way, but it sort of hurts inside to know I'm creating x number of objects every frame that'll be garbage collected next frame. In my current tests, I'm having no problems, but a remake of Pokemon Blue is hardly a stress test. Edit: Nyer, could you send me your database? I have an older copy from about five seconds before I gave up on learning ASM (I'm amazed computers have gotten this far seeing as everything still goes back to X and Y registers or something. Lord). Also, I keep calling you Nyer. Is that annoying? I was listening to the Top Gear Rally theme song for most of this, and that can boost my self confidence a little too high sometimes. Edit2: Nyerguds, where is the accuracy data most likely stored/what would load it? I assume it would be the projectile, because that's how it works in the newer games and makes sense seeing as when I give an inaccurate weapon user and accurate weapon, it's accurate. Then again, it could be on the Weapon (which TibEd lacks data on). I'm going to ask SubDrag to post in this topic so he can get some accurate information rather than just decently-informed speculation.
  22. I've been trying to contact him, but he never got back to me. I've looked through his past posts here, though, and it seems he frequents PPM. And hasn't been here since last year. So I guess I'll send him a PM over there. By the way: I don't quite understand this. Could you explain this in a bit more depth? Also, what would the filename be for the heightmaps be in the N64 ROM? Are they just the normal filename, only with a different extension? I'm probably just going to wind up asking SubDrag about CnC64 today. (Yes, I am planning on implementing N64 heightmap support; the only problems I can see with it are that I'll have to implement them into my BasicClass , which is no problem, I'll be hardpressed to figure out how to make the cursor go up and down with the terrain (unless it's just a texture, in which case implementing it into BasicClass might be less feasible without some creative constructor overload), and how to figure out where a TechnoType should be z-wise). Just wondering, do you actually know what overloading is, Nyer? I just realized that in assembly, an overload of a function would probably be considered a separate function entirely (it's only really the "same" function as far as the name goes). I honestly sort of have a hard time understanding what happens inbetween a high level language and the ASM code.
  23. CnC clone. Preferably one that can read the data out of the mix files, but I'll just hardcode versions of the .shps in meantime. I figure by the time I've gotten far enough to where the actual accuracy data matters, either someone will have found it or I'll just beg SubDrag or scarboy to look at the N64 and PS1 versions, respectively, to see if they can figure it out. Of course, I don't know SubDrag that well and barely even know of scarboy, but I'm in the mindset of crossing bridges when I get there rather than before. Basically, I want the TechnoTypes accurate so that I can go: TechnoTypes -> basic map loading -> building upon that, rather than trying to figure out what goes where the whole way through. I could just go with the TibEd data for what each TechnoType descendant has, but I figure I might as well ask where each variable comes from. Though now that I think about, it's not likely very easy to tell where a class inherits it's variables and routines from in ASM, is it? That's the downside to the crossing-the-bridge mentality: you forget simple things because they aren't directly between points A and B. An open note to myself: When I finally get around to implementing .mix reading support and .shp reading support, first off remember to mimic TD's reading of .mix files (perhaps have a list that checks if a file with that name is already in the list before adding, then actually dynamically adds the resources?), first reading the folder, then the mixes (ask Nyerguds for the order). Then, store the map's "terrain" (I forgot what the game call's it; temperat, desert, snow, winter, and the non-existent "jungle") as an Image wherein each "major byte" is the y value and the "minor byte" is the x value. Then use a modified version of my own BasicClass 's frame drawing code to draw the tile.
  24. The other day I was trying to get a decent map editor for Pokemon Blue. I also needed the tilesets for the game, which the map editor loaded from the ROM rather than a .png file. So I tried to figure out how to get it to output the tilesets. My final code wound up being: if (pTileset.Image != null) { Rectangle temprect = new Rectangle(0, 0, 32, (selectedTile * 32) + 32); Image tempimg = cropImage(pTileset.Image, temprect); //selectedTile tempimg.Save("C:\\Pokemon\\ClassicMap\\tileset" + mapLoader.mapHeader.Tileset + ".png"); } Seriously? That's all it took? I was amazed. I looked into C# a little more, and the more I tried stuff out, the more I liked it. Progress on Luftballon has been halted for a long time, but now I've got the motivation to get back to work on it. Here's where the problem comes: I'm not one of the original developers, nor am I Nyerguds. I know the gist of pretty much everything except accuracy in this game, but I don't know the specifics. The first step, as far as I'm concerned, is to implement some obvious datatypes. For some other games, this might be a problem, but it's not for TD. I know that this is how the basic object chain goes: TechnoType |->BuildingType |->UnitType |->InfantryType |->AircraftType There may be a few more, but I've forgotten them and they're not extremely important at this stage in the game (though if you know, say, that OverlayType(?) is under technotype, please tell me). What I do need to know is exactly what is defined under each. Also, if you have any information that should be kept in mind in this critical early phase, let me know. Tidbits: Harvesters follow "All to Hunt".
  25. I thought you could only have 6 players in RA? Also, how would a 3x3x1 map support 8 players? Would the last one share a spot with the 1? Other than that, I like the idea of having three separate teams.
×
×
  • Create New...