一大片东西。TA程序里的部分结构的定义

昨天HF问单位类型的结构,这个分析还有很多TA的功能没有做的,所以分析的数据文件就不发了,不过这个头文件修正,又补充了不少,做mod的话,应该可以有一些帮助,因为用了很久,出错的地方和理解错的地方比较少了,所以公开出来,主要是集合了SY_SJ, SY_YEHA, xon等的劳动,以及自己的一点点补充:

 
/*
   This file has been generated by IDA Pro.
   It contains local type definitions from
   D:\CAVEDOG\TOTALA\SWeaponA2.idb
*/
/*    6 */
#pragma pack(push, 1)
struct TAMainStruct
{
  char TAVersionStr[12];
  int TAProgramStruct_Ptr;
  int DSoundP;
  int HAPINET_Object;
  char unknow_0_[1201];
  int unknow_0__;
  int unknow_0___;
  char unknow_0____[72];
  int TAIngameGUIStruct;
  char unknow_0______[108];
  char AlteredUnitLimit;
  char field_58A[2127];
  char PlayerCameraRectColorInRadar;
  char field_DDA[1301];
  int ChatTextBegin;
  char field_12F3[59];
  int field_132E;
  char field_1332[1782];
  int field_1A28;
  char field_1A2C[311];
  PlayerStruct PlayerStructArray[10];
  char unknow_2[331];
  int unknow_2_;
  int AllyStruct_Ptr;
  char field_29A4[144];
  int PacketBufferSize;
  int PacketBuffer_p;
  __int16 CurrentPlayerNumbers;
  int ChatTextIndex;
  char HumanPlayer_EyeBallID;
  char LOS_Sight_PlayerID_Game;
  char NetworkLayerEnabled;
  char unknow_2____[585];
  __int16 BuildPosX;
  __int16 BuildPosY;
  int BuildPosRealX;
  int Height;
  int BuildPosRealY;
  int unknow_3;
  int Height2;
  char unknow_4[6];
  __int16 MouseMapPosX;
  char unknow_5[6];
  __int16 MouseMapPosY;
  char unknow_6[4];
  __int16 MouseOverUnit;
  __int16 unknow_7;
  char field_2CBE;
  char field_2CBF[5];
  __int16 BuildNum;
  char BuildSpotState;
  char unknow_8[44];
  WeaponStruct WeaponsTypedefArray[256];
  int NumProjectiles;
  int Projectiles_p;
  char MapDataStruct_NotPtr[16];
  int WreckageInfo_p;
  char unknow_10[28];
  int RadarPictureSize_InGameMeasure;
  int RadarPictureHeight_InGameMeasure;
  int FeatureMapSizeX;
  int FeatureMapSizeY;
  int EyeBallMapWidth;
  int EyeBallMapHeight;
  char field_14243[16];
  int NumFeatureDefs;
  char unknow_12[20];
  int TEDGENERATEDPIC;
  int FeatureDef_p;
  char unknow_13[8];
  int EyeBallMemory_p;
  __int16 unknow_14;
  __int16 MovingEyeBall;
  char field_14283[4];
  int FeaturesArray_p;
  char unknow_15[48];
  int field_142BB;
  int field_142BF;
  int field_142C3;
  int field_142C7;
  char MinimapEyeBallRect[16];
  int RadarFinal_p;
  int RadarMapped_p;
  int RadarPicture_p;
  __int16 XOffset_RadarMap_MiniMapMeasure;
  __int16 YOffset_RadarMap_MiniMapMeasure;
  __int16 RadarPicSizeWidth_MiniMapMeasure;
  __int16 RadarPicSizeHeight_MiniMapMeasure;
  __int16 unknow_16;
  __int16 field_142F1;
  int CirclePointer;
  char unknow_17[40];
  int EyeBallMapX;
  int EyeBallMapY;
  int EyeBallMapXScrollingTo_;
  int EyeBallMapYScrollingTo_;
  char unknow_18[30];
  __int16 scrollspeed;
  __int16 EveryPlayerUnitsNumber;
  char TotalGameUnits[6];
  int BeginUnitsArray_p;
  int EndOfUnitsArray_p;
  int HotUnits_AryPtr;
  int HotRadarUnits_pw;
  int NumHotUnits;
  int NumHotRadarUnits;
  char unknow_20[32];
  int UnitsTypedefArrayCount_p;
  char field_14393[8];
  int UnitsTypedefArray_p;
  char unknow_21[1088];
  int _0_FontValidCharNumber;
  int _1_FontValidCharNumber;
  char field_147E7[308];
  int NumExplosions;
  ExplosionStruct ExplosionsAry[300];
  int unknow_p_23;
  char unknow_24[102012];
  int EffectVoiceNum;
  char field_33A13[1024];
  char EffectVoiceAry;
  char field_33E14[16383];
  int SoundClassAry;
  int SoundClassNumber;
  int field_37E1B;
  char field_37E1F[24];
  int InGamePos_X;
  int InGamePos_Y;
  char field_37E3F[167];
  __int16 EveryPlayerUnitsNumber_0;
  char field_37EE8[6];
  int Difficulty;
  int side;
  int field_37EF6;
  int InterfaceType;
  int field_37EFE;
  int SingleLOSType;
  int screenchat;
  char field_37F0A[15];
  __int16 SoundMode;
  int DisplaymodeWidth;
  int DisplaymodeHeight;
  char field_37F23[12];
  __int16 field_37F2F;
  char field_37F31[12];
  RaceSideData RaceSideDataAry[5];
  char field_38A37[842];
  int TotalPlayers_CanBe;
  char field_38D85[1124];
  int GameSettingStruct_Ptr;
  char field_391ED[44];
  int SingleCommanderDeath;
  int SingleMapping;
  int SingleLineOfSight;
  int SingleLOSType_;
  char field_39229[3543];
};
#pragma pack(pop)
/*   10 */
#pragma pack(push, 1)
struct TickCountStruct
{
  int LastTickCount;
  char unknow_[56];
  int AllDeleyIn3Sub_468CF0;
  int AllDeleyIn4Sub_468CF0;
  char unknow__[8];
  int AllDeleyIn1Sub_468CF0;
};
#pragma pack(pop)
/*   11 */
#pragma pack(push, 1)
struct UnitsInGameStruct
{
  int MoveClass;
  int UsedSpot;
  int field_8;
  int field_C;
  int Weapon1_p;
  char unknow_1[11];
  char IsBuilder;
  char unknow_2[12];
  int Weapon2_p;
  char unknow_3[24];
  int Weapon3_p;
  char unknow_4[16];
  int UnitOrders_p;
  char UnitState;
  char unknow_5[3];
  __int16 ZTurn;
  __int16 XTurn;
  __int16 YTurn;
  __int16 unknow3;
  __int16 XPos;
  __int16 unknow4;
  __int16 ZPos;
  __int16 YPos__;
  __int16 YPos;
  __int16 XGridPos;
  __int16 YGridPos;
  __int16 XLargeGridPos;
  __int16 YLargeGridPos;
  char unknow_6[4];
  int unknow_p_7;
  char unknow_8[8];
  int FirstUnit_p;
  int UnitType_p;
  int Owner_p;
  int UnitScriptingData_p;
  int Object3do_P;
  int UNKnow_10;
  __int16 UnitTypeID_Word_;
  int UnitInGameID;
  char field_AC[12];
  __int16 Kills;
  char UNKnow_11[50];
  int Owner2_p;
  int Attacker_p;
  char unknow_12[2];
  char HealthPerA;
  char HealthPerB;
  char unKnow_13[2];
  char RecentDamage;
  char Height;
  __int16 OwnerIndex;
  char gap_FE[1];
  char Los_Sight_PlayerID_Unit;
  char unknow_14[4];
  int Nanoframe;
  __int16 Health;
  char unKnow_15[4];
  __int16 cIsCloaked;
  int UnitSelectedStateMask;
  char unknow_16[4];
};
#pragma pack(pop)
/*   12 */
#pragma pack(push, 1)
struct UnitsInGameStructPtr
{
  int UnitsInGameStruct;
};
#pragma pack(pop)
/*   13 */
enum COB_Opcodes
{
  COB_MovePieceWithSpeed = 0x10001000,
  COB_TurnPieceWithSpeed = 0x10002000,
  COB_StartSpin = 0x10003000,
  COB_StopSpin = 0x10004000,
  COB_ShowPiece = 0x10005000,
  COB_HidePiece = 0x10006000,
  COB_CachePiece = 0x10007000,
  COB_DontCachePiece = 0x10008000,
  COB_Unknown4 = 0x10009000,
  COB_DontShadow = 0x1000A000,
  COB_MovePieceNow = 0x1000B000,
  COB_TurnPieceNow = 0x1000C000,
  COB_Shade = 0x1000D000,
  COB_DontShade = 0x1000E000,
  COB_EmitSfx = 0x1000F000,
  COB_WaitForTurn = 0x10011000,
  COB_WaitForMove = 0x10012000,
  COB_Sleep = 0x10013000,
  COB_MetaPush = 0x10021000,
  COB_PushConstantOntoStack = 0x10021001,
  COB_PushLocalVariableOntoStack = 0x10021002,
  COB_PushStaticVariableOntoStack = 0x10021004,
  COB_StackAllocate = 0x10022000,
  COB_MetaPop = 0x10023000,
  COB_SetLocalVariable = 0x10023002,
  COB_SetStaticVariable = 0x10023004,
  COB_PopStack = 0x10024000,
  COB_Add = 0x10031000,
  COB_Subtract = 0x10032000,
  COB_Multiply = 0x10033000,
  COB_Divide = 0x10034000,
  COB_BitwiseAnd = 0x10035000,
  COB_BitwiseOr = 0x10036000,
  COB_BitwiseXor = 0x10037000,
  COB_BitwiseNot = 0x10038000,
  COB_Unknown1 = 0x10039000,
  COB_Unknown2 = 0x1003A000,
  COB_Unknown3 = 0x1003B000,
  COB_Random = 0x10041000,
  COB_GetUnitValue = 0x10042000,
  COB_GetFunctionResult = 0x10043000,
  COB_Unknown11 = 0x10044000,
  COB_Unknown12 = 0x10045000,
  COB_LessThan = 0x10051000,
  COB_LessThanOrEqual = 0x10052000,
  COB_GreaterThan = 0x10053000,
  COB_GreaterThanOrEqual = 0x10054000,
  COB_Equal = 0x10055000,
  COB_NotEqual = 0x10056000,
  COB_Unknown13 = 0x10057000,
  COB_LogicalOr = 0x10058000,
  COB_LogicalXor(check) = 0x10059000,
  COB_Unknown15 = 0x1005A000,
  COB_StartScript = 0x10061000,
  COB_CallScript = 0x10062000,
  COB_Unknown16 = 0x10063000,
  COB_JumpToOffset = 0x10064000,
  COB_Return = 0x10065000,
  COB_JumpToOffsetIfFalse = 0x10066000,
  COB_Signal = 0x10067000,
  COB_SetSignalMask = 0x10068000,
  COB_Explode = 0x10071000,
  COB_PlaySound = 0x10072000,
  COB_MapCommand = 0x10073000,
  COB_SetUnitValue = 0x10082000,
  COB_AttachUnit = 0x10083000,
  COB_DropUnit = 0x10084000,
  COB_ValidOPMask = 0x100FF000,
};
/*   14 */
enum COB_RunningFlags
{
  COB_NotInUse = 0x0,
  COB_RunningFlags_2 = 0x100000,
  COB_RunningFlags_3 = 0x200000,
  COB_RunningFlags_4 = 0x400000,
  COB_IsRunnable = 0x1000000,
  COB_RunningFlags_1 = 0x2000000,
  COB_CallScriptWait = 0x2800000,
};
/*   15 */
enum PacketID
{
  PacketID_Encypted = 0x3,
  PacketID_Compressed = 0x4,
  PacketID_ObjectState = 0xC,
};
/*   16 */
enum PlayerType
{
  Player_none = 0x0,
  Player_LocalHuman = 0x1,
  Player_AI = 0x2,
  Player_RemoteHuman = 0x3,
  Player_RemoteAI = 0x4,
};
/*   17 */
enum SharedStates
{
  SharedMetal = 0x2,
  SharedEnergy = 0x4,
  SharedLOS = 0x8,
  SharedMappings = 0x20,
  SharedRadar = 0x40,
};
/*   18 */
#pragma pack(push, 1)
struct ExplosionStruct
{
  void *Debris;
  __int16 Frame;
  char data2[6];
  void *FXGaf;
  char data3[12];
  int XPos;
  int ZPos;
  int YPos;
  char data4[36];
  __int16 XTurn;
  __int16 ZTurn;
  __int16 YTurn;
  char data5[2];
};
#pragma pack(pop)
/*   19 */
#pragma pack(push, 1)
struct ProjectileStruct
{
  void *Weapon;
  int XPos;
  int ZPos;
  int YPos;
  int XPosStart;
  int ZPosStart;
  int YPosStart;
  int XSpeed;
  int ZSpeed;
  int YSpeed;
  char data1[14];
  __int16 XTurn;
  __int16 ZTurn;
  __int16 YTurn;
  char data2[22];
  int field_52;
  char field_56[16];
  char ProjectileLos_PlayerID;
  char field_67[2];
  char WeaponFlags;
  char data3;
};
#pragma pack(pop)
/*   20 */
#pragma pack(push, 1)
struct WeaponStruct
{
  char WeaponName[32];
  char WeaponDescription[64];
  int Unkn1;
  int pWeaponUnkStruct;
  int weaponvelocity;
  int startvelocity;
  int weaponacceleration;
  int objects3d_file;
  void *LandExplodeAsGFX;
  void *WaterExplodeAsGFX;
  char data4[64];
  int energypershot;
  int metalpershot;
  int minbarrelangle;
  int shakemagnitude;
  int shakeduration;
  __int16 DefaultDamage;
  __int16 areaofeffect;
  float EdgeEffectivnes;
  __int16 Range;
  __int16 data5;
  int coverage;
  __int16 reloadtime;
  __int16 weapontimer;
  __int16 turnrate;
  __int16 burst;
  __int16 burstrate;
  __int16 sprayangle;
  __int16 duration;
  __int16 randomdecay;
  __int16 soundstart_EffectVoiceID;
  __int16 soundhit_EffectID;
  __int16 soundwater_EffectID;
  __int16 smokedelay;
  __int16 flighttime;
  __int16 holdtime;
  __int16 field_100;
  __int16 field_102;
  __int16 accuracy;
  __int16 nTolerance;
  __int16 pitchtolerance;
  char ID;
  char cFireStarter;
  char RenderType;
  char color;
  char color2;
  char gap_10F[2];
  int WeaponTypeMask_;
};
#pragma pack(pop)
/*   21 */
#pragma pack(push, 1)
struct PlayerResourcesStruct
{
  float fCurrentEnergy;
  float fEnergyProducton;
  float fEnergyExpense;
  float fCurrentMetal;
  float fMetalProduction;
  float fMetalExpense;
  float fMaxEnergyStorage;
  float fMaxMetalStorage;
  double fTotalEnergyProduced;
  double fTotalMetalProduced;
  double fTotalEnergyConsumed;
  double fTotalMetalConsumed;
  double fEnergyWasted;
  double fMetalWasted;
  int fPlayerEnergyStorage;
  double PlayerMetalStorage;
};
#pragma pack(pop)
/*   22 */
#pragma pack(push, 1)
struct UnitDefStruct
{
  char Name[32];
  char UnitName[32];
  char UnitDescription[64];
  char ObjectName[32];
  char Side[3];
  char data5[167];
  __int16 FootX;
  __int16 FootY;
  void *YardMap;
  char unknow_1[12];
  int XWidth;
  char unknow_2[4];
  int YWidth;
  char unknow_3[4];
  int ZWidth;
  int unknow_4;
  int field_176;
  int field_17A;
  int field_17E;
  int field_182;
  int buildcostenergy;
  int buildcostmetal;
  int field_18E;
  int lRawSpeed_maxvelocity;
  char data9[8];
  int acceleration;
  int bankscale;
  int pitchscale;
  int damagemodifier;
  int moverate1;
  int moverate2;
  int movementclass;
  __int16 turnrate;
  __int16 corpse;
  __int16 maxwaterdepth;
  __int16 minwaterdepth;
  int energymake;
  int energyuse;
  int metalmake;
  int extractsmetal;
  int windgenerator;
  int tidalgenerator;
  int cloakcost;
  int cloakcostmoving;
  int energystorage;
  int metalstorage;
  int buildtime;
  int weapon1;
  int weapon2;
  int weapon3;
  __int16 nMaxHP;
  char data8[2];
  __int16 nWorkerTime;
  __int16 nHealTime;
  __int16 nSightDistance;
  __int16 nRadarDistance;
  __int16 nSonarDistance;
  __int16 mincloakdistance;
  __int16 radardistancejam;
  __int16 sonardistancejam;
  __int16 SoundClassIndex;
  __int16 nBuildDistance;
  char builddistance[2];
  __int16 nManeuverLeashLength;
  __int16 attackrunlength;
  __int16 kamikazedistance;
  __int16 sortbias;
  char cruisealt;
  char data4;
  __int16 UnitTypeID;
  int explodeas;
  int selfdestructas;
  char maxslope;
  char badslope;
  char transportsize;
  char transportcapacity;
  char waterline;
  char makesmetal;
  char gap_22E[1];
  char bmcode;
  char defaultmissiontypeIndex;
  int wpri_badTargetCategory_MaskAryPtr;
  int wsec_badTargetCategory_MaskAryPtr;
  int wspe_badTargetCategory_MaskAryPtr;
  int noChaseCategory_MaskAryPtr;
  int UnitTypeMask_;
  int UnitTypeMask_1;
};
#pragma pack(pop)
/*   24 */
#pragma pack(push, 1)
struct PlayerStruct
{
  int PlayerActive;
  int field_4;
  char field_8[4];
  char PlayerNum;
  char field_D[3];
  int field_10;
  char field_14[14];
  char field_22;
  char field_23[4];
  int PlayerInfo;
  char Name[30];
  char SecondName[30];
  int Units_Begin;
  int Units_End;
  char field_6F[4];
  char PlayerType;
  int field_74;
  char field_78[4];
  int field_7C;
  int field_80;
  int field_84;
  int field_88;
  PlayerResourcesStruct Resource;
  char field_E8[8];
  int UpdateTime;
  int WinLoseTime;
  int DisplayTimer;
  __int16 Kills_word;
  __int16 Losses;
  char field_100[8];
  char field_108[10];
  char field_112[46];
  int UnitsCounters;
  __int16 UnitsNumber;
  char PlayerNumber;
  char field_147[2];
  __int16 AddPlayerStorage_word;
};
#pragma pack(pop)
/*   25 */
#pragma pack(push, 1)
struct PlayerInfoStruct
{
  char MapName[32];
  char gap_20[117];
  char Raceside;
  char PlayerLogoColor;
  char SharedBits;
  char gap_98[3];
  char field_9B;
};
#pragma pack(pop)
/*   26 */
#pragma pack(push, 1)
struct PlayerData
{
  PlayerInfoStruct field_0;
};
#pragma pack(pop)
/*   27 */
#pragma pack(push, 1)
struct ScriptSlot
{
  int Flags;
  int InstrIndex;
  int StackIndex;
  int LoopsToWait;
  int field_10;
  int field_14;
  int ScriptToWaitOn;
  int field_1C;
  int MethodReturnedCallBack;
  void *Stack;
  int field_28;
  int field_2C;
  int field_30;
  int field_34;
  int field_38;
  int field_3C;
  int field_40[8];
  int field_60;
};
#pragma pack(pop)
/*   28 */
#pragma pack(push, 1)
struct CobHeader
{
  int Version;
  int MethodCount;
  int PieceCount;
  int BytecodeLength;
  int StaticVariablesCount;
  int Always_0;
  int MethodEntryPoints;
  int MethodNameOffsets;
  int PieceNameOffsets;
  int ByteCodeStart;
  int NameArray;
};
#pragma pack(pop)
/*   29 */
#pragma pack(push, 1)
struct ScriptSlotArray
{
  ScriptSlot ScriptSlots[8];
};
#pragma pack(pop)
/*   30 */
#pragma pack(push, 1)
struct UnitScriptingData
{
  char field_0[8];
  void *pCOB;
  int field_C;
  void *GlobalVars;
  int field_14;
  int field_18;
  ScriptSlotArray ScriptSlots;
  char gap_33c[512];
  int StartRunningNow;
};
#pragma pack(pop)
/*   31 */
#pragma pack(push, 1)
struct COB_StackFrame
{
  ScriptSlot field_0;
};
#pragma pack(pop)
/*   32 */
#pragma pack(push, 1)
struct HAPINET
{
  char Buffer[1200];
  char gap_4b0[5];
  int DataSize;
  int BufferPtr;
  char gap_4bd[8];
  int DirectPlayInterface;
};
#pragma pack(pop)
/*   33 */
#pragma pack(push, 1)
struct StaticVarStuct_1
{
  void *FunctionPtr;
  char field_4[16];
  int field_14;
  char field_18[48];
  int field_48;
  char field_4C[480];
  int field_22C;
  int field_230;
  int field_234;
  int field_238;
};
#pragma pack(pop)
/*   34 */
#pragma pack(push, 1)
struct RadarPicStruc
{
  int XSize;
  int YSize;
  int Unk1;
  void *PixelPTR;
};
#pragma pack(pop)
/*   39 */
#pragma pack(push, 1)
struct UnitOrdersStruct
{
  int unknow_1;
  __int16 unknow_1_;
  int unknow_1___;
  char unknow_1____[4];
  int unknow_2_p;
  int unknow_3;
  char unknow_4[8];
  int ThisPTR;
  int PosX;
  int PosZ;
  int PosY;
  char unknow_5[6];
  char FootPrint;
  char unknow_6[12];
  char UnitOrderFlags;
  char unknow_7[8];
  int NextOrder_uosp;
  char unknow_8[4];
  int unknow_9_p;
};
#pragma pack(pop)
/*   40 */
struct WreckageInfoStruct
{
  int unk1;
  LPVOID unk2;
  int XPos;
  int ZPos;
  int YPos;
  char data1[12];
  __int16 ZTurn;
  __int16 XTurn;
  __int16 YTurn;
  char data2[10];
};
/*   41 */
struct FeatureStruct
{
  char data1[8];
  __int16 FeatureDefIndex;
  __int16 WreckageInfoIndex;
  char data2[1];
};
/*   42 */
struct FeatureDefStruct
{
  char Name[32];
  char data1[96];
  char Description[20];
  char Data2[108];
};
/*   43 */
struct MapFileStruct
{
  char data[516];
  char TNTFile[260];
};
/*   44 */
struct Point3
{
  int x;
  int y;
  int z;
};
/*   45 */
struct DebrisStruct
{
  char data1[36];
  Point3 *Vertices;
  DWORD *Unk;
  char data2[8];
};
/*   46 */
struct Unk1Struct
{
  char data1[24];
  FXGafStruct *Texture;
  char data2[4];
};
/*   47 */
struct FXGafStruct
{
  __int16 Frames;
  char data1[6];
  char Name[32];
  int FramePointers[1];
};
/*   48 */
struct DSoundStruct
{
  char data1[36];
  DWORD Directsound;
  DWORD DirectsoundBuffer;
  char data2[12];
  DWORD DirectsoundBuffer2;
};
/*   49 */
struct Object3doStruct
{
  __int16 NumParts;
  char data1[2];
  int TimeVisible;
  char data2[4];
  UnitsInGameStruct *ThisUnit;
  LPVOID *UnkPTR1;
  LPVOID *UnkPTR2;
  char data3[6];
  struct PrimitiveStruct *BaseObject;
};
/*   50 */
struct PrimitiveInfoStruct
{
  char data1[28];
  char *Name;
};
/*   51 */
struct PrimitiveStruct
{
  PrimitiveInfoStruct *PrimitiveInfo;
  int XPos;
  int ZPos;
  int YPos;
  unsigned __int16 XTurn;
  unsigned __int16 ZTurn;
  unsigned __int16 YTurn;
  char data3[18];
  BYTE Visible[2];
  char data2[1];
  struct PrimitiveStruct *SiblingObject;
  struct PrimitiveStruct *ChildObject;
  struct PrimitiveStruct *ParrentObject;
};
/*   52 */
struct RadarPicStruct
{
  int XSize;
  int YSize;
  int Unk1;
  LPVOID *PixelPTR;
};
/*   53 */
struct ParticleSystemStruct
{
  LPVOID DrawFunc;
  char data1[8];
  int Type;
  struct SmokeGraphics *firstDraw;
  struct SmokeGraphics *lastDraw;
  LPVOID *Unk;
  char data2[48];
};
/*   54 */
struct ParticleBase
{
  char data[8];
  ParticleSystemStruct **particles;
  char data2[8];
  ParticleSystemStruct **ParticlePTRArray;
  int SmokeParticleStructSize;
  int maxParticles;
  int curParticles;
};
/*   55 */
struct SmokeGraphics
{
  FXGafStruct *gaf;
  int XPos;
  int ZPos;
  int YPos;
  int unknown;
  int frame;
  int unknown2;
  int MoreSubs;
};
/*   56 */
#pragma pack(push, 1)
struct Context_Screen
{
  int Width;
  int Height;
  int PixelPerLine;
  int ScreenColorBits_Ptr;
  int field_10;
  int field_14;
  __int16 field_18;
  __int16 field_1A;
  RECT ScreenRect;
  int field_2C;
};
#pragma pack(pop)
/*   57 */
#pragma pack(push, 1)
struct FontStruct
{
  __int16 Left;
  __int16 Top;
  __int16 Right;
  __int16 Buttom;
  char TransparentColorMask;
  char PackedFont;
  char field_A;
  char gap_b[5];
  int FontColorBits_Ptr;
};
#pragma pack(pop)
/*   58 */
enum UnitSelectState
{
  UnitValid = 0x4,
  UnitSelected = 0x10,
  UnitValid2 = 0x20,
};
/*   59 */
#pragma pack(push, 1)
struct TAProgramStruct
{
  int HInstance;
  int field_4;
  int WindowsClassName;
  int WindowsName;
  char field_10[48];
  int TAMainWndHwnd;
  int WholeScreen_TAWindowDIBSECTION;
  int WndMemHDC_TAWindowHDC;
  int Palette_TAWindowHPALETTE;
  int field_50;
  int BackMemHDC_TAWindowHDC;
  char field_58[44];
  int TAlplpDD_TAFullScreen;
  int TAlpTADrawSurface_TAFullScreen;
  int lplp_unknow_TAFullScreen;
  char field_90[44];
  int MainScreenContext;
  char field_C0[20];
  int TA_LPDDSURFACEDESC;
  int lplpTADrawSurface;
  int GameScreenUpdatingFlag_1;
  char field_E0[16];
  __int16 field_F0;
  int GameScreenUpdatingFlag_2;
  int InputBuffer[30];
  int TotalChar_InputBuffer;
  int ReadChar_InputBuffer;
  char field_176[1186];
  int HPIFileAryPtr;
  int HPIFileNumber;
};
#pragma pack(pop)
/*   60 */
#pragma pack(push, 1)
struct RaceSideData
{
  char name[30];
  char nameprefix[4];
  char commanderUnitName[32];
  RECT Logo_rect;
  RECT Energy_rect;
  RECT EnergyNum_rect;
  RECT METALBAR_rect;
  RECT METALNUM_rect;
  RECT TOTALUNITS_rect;
  RECT TOTALTIME_rect;
  RECT ENERGYMAX_rect;
  RECT METALMAX_rect;
  RECT ENERGY0_rect;
  RECT METAL0_rect;
  RECT ENERGYPRODUCED;
  RECT ENERGYCONSUMED;
  RECT METALPRODUCED;
  RECT METALCONSUMED;
  RECT LOGO2;
  RECT UNITNAME;
  RECT DAMAGEBAR;
  RECT UNITENERGYMAKE;
  RECT UNITENERGYUSE;
  RECT UNITMETALMAKE;
  RECT UNITMETALUSE;
  RECT MISSIONTEXT;
  RECT UNITNAME2;
  RECT field_1C2;
  RECT NAME;
  RECT DESCRIPTION;
  RECT RELOAD_RaceID;
  char field_202[32];
  int energycolor;
  int metalcolor;
  int field_22A;
  int Font_File;
};
#pragma pack(pop)
/*   61 */
#pragma pack(push, 1)
struct AllyStruct
{
  int PlayerType;
  int RaceSide;
  int AllyTeamID;
  int StartMetal;
  int StartEnergy;
  int field_14;
  int field_18;
};
#pragma pack(pop)
/*   62 */
enum PlayerType_AllyStruct
{
  OPEN = 0x0,
  HUMAN = 0x1,
  COMPUTRE = 0x2,
};
/*   63 */
enum PlayerTeam_AllyStruct
{
  TEAM1 = 0x0,
  TEAM2 = 0x1,
  TEAM3 = 0x2,
  TEAM4 = 0x3,
  TEAM5 = 0x4,
  NOTEAM = 0x5,
};
/*   64 */
#pragma pack(push, 1)
struct MapDataStruct
{
  char field_0[144];
};
#pragma pack(pop)
/*   65 */
#pragma pack(push, 1)
struct GameSettingStruct
{
  int MultiOrSingleState;
  char field_4[3392];
  int field_D44;
  char field_D48[108];
  int MapStartPosAry_;
  int MapStartPosNumber;
  char field_DBC[263];
};
#pragma pack(pop)
/*   66 */
#pragma pack(push, 1)
struct MapStartPos
{
  int ValidMapStartPos_;
  int PlayerID;
  __int16 X_Pos;
  __int16 Y_Pos;
};
#pragma pack(pop)
/*   67 */
#pragma pack(push, 1)
struct temp_MapStartPos_InCreatePlayerCommander
{
  __int16 field_0;
  __int16 X_Pos;
  int Zero_field;
  __int16 field_8;
  __int16 Y_Pos;
};
#pragma pack(pop)
/*   68 */
#pragma pack(push, 1)
struct SoundClass
{
  char field_0[352];
};
#pragma pack(pop)
/*   69 */
#pragma pack(push, 1)
struct WeaponUnkStruct
{
  char gap_0[1];
  char field_1;
  char gap_2[3];
  int field_5;
  int field_9;
  int field_D;
};
#pragma pack(pop)
/*   70 */
enum WeaponMask
{
  targetable_mask = 0x20000000,
  interceptor_mask = 0x40000000,
};
/*   71 */
enum WeaponMask_shift
{
  targetable = 0x1D,
  interceptor = 0x1E,
};

/* End of file */


:6_288:能不能增加参数?

例如第四种武器这样的?或者能不能把TAK的参数移植过来TA?

forgot that. 可能可以做到什么,现在想到的有这些:
1 NO CD music的HOOK.
TA的HOOK,对出错地方的HOOK,veh, 判断eip,直接到可以正常执行的地方:
004b7ff7
0049ce6a
004B34B7
0048ba07
480cc8
4a8c5d
480cc8
4CF5E5
004B0E66
458c5d
00438EEE
004B0E6
0072AE9E
04802DD
0048A4F5
42CCF0
04339E8
04339C0
0480C48
435100
04CBCB6
Exception: Assertion failure (F:\tademoscr\tadr1RC2_src\tademo\trunk\src\Recorder\PlayerDataU.pas, line 201)
PlayerDataU:TPlayerData.Create:201
Exception: System Error. Code: 1813.
找不到映像文件中指定的资源类型。
SysUtils:RaiseLastOSError:15639
Exception: System Error. Code: 1813.
SysUtils:RaiseLastOSError:15639
---- end -------------------
2.单位总数的修改
42aab3
4c6503
访问到单位结构的:
0040949C
0409891
488D48
//–
crash:

  1. 004B79F7 8D4C24 10 LEA ECX,DWORD PTR SS:[ESP+10]
    此处的ecx很奇怪,有时会变成指向TAMainStruct
    3.不同exe读取的 hpi/ccx/ufo/gp3文件的名字。详细的会被载入的单位列表。
    1.调用录像机播放不同exe的录像
    4.快捷键的自定义
  2. ctrl+z第一次只选中同屏幕中相同类型单位
  3. 鼠标双击拥有和ctrl+z相同功能
  4. 选中多个工厂时,可以有功能取消所有工厂正在建造的单位们。还可以给每个工厂设置都建造相同的单位。
    4.shift+把選中的部隊加入到已經有的編隊中
    5.试验品的扩充
    一个获取当前单位ID的脚本接口
    一个修改最大单位ID、武器ID的修改
    一个unicode文字支持的修改
    DrawTextInScreen: text:004A50E0
    对TA的Hook。绘制出来的字体的大小的调节。
    ParseColorBitsToRect 方式绘制出来的字体,width和height不是恰当长度的rect,错位。
    单位总数显示的地方,TA未删除原位置的文字导致的问题。
    32位真彩色的支持
    6.shootall等命令行的短些字符串的自定义,等等TA中字符串自定义修改。( 特别的,针对不同exe不同处理。)
    7.TA中小地图的支持。
    1.tab的全屏地图,单位在小地图的重新绘制。全屏地图单独用的地图图片,然后绘制出来的大地图是用工具根据TNT生成的图片,哈哈哈哈哈哈哈哈哈哈
    TNT parse,把TNT转换成bmp文件- done
    在TA主界面显示出来TAB地图。-todo
    小地图的思路我是这样的:
    1.首先实现一个根据TNT绘制出来全地图的东西,然后按照4:3, 16:9的二个40003000, 6400:3600比例的缩略图出来保存成bmp之类的读取迅速的文件到硬盘上,接着按照实际屏幕分辨率弄一个合适的背景缩略图出来。 -done
    2.把TA的HPI接口统计好,在TA读取游戏data的时候,直接填自己的线程进去,把对应的TNT从内存中读。考虑,可以从内存中直接读取。-todo
    3.根据单位数组,把存活的单位,按照指挥官,工程,飞机,坦克,轮船这样不同的图标绘到要用的和分辨率一样的空图片上。这个在一个单独的线程里不停的有间隔的比方0.5秒一次的做。-todo
    4.在录像机绘图的地方,要绘缩略图了,就按照先弄背景,再绘单位图覆盖上去的法子来显示。
    按照单位图标来显示
    2.全屏地图上的单位控制。再把消息处理给包装一下,自己处理对这图片的操作,全部映射成原TA里的操作和移动,哈哈哈哈哈哈哈哈哈哈。
    1是我们需要一个把单位显示成什么样的图标设计,还有,缩放一两倍时那个图标的大小时不时要放大一些,合适的图标大小是24
    24还是32*32像素等等这样的玩意。
    2.把单位按照玩家可以看到的,看不到的来显示出来。这个还得分析下那方面是怎么判断的,TA里有现成的函数可以包装一下完成这样的功能,所以相对简单一些。
    3.炮弹的显示就比较麻烦了。如果还有一些其他的类似于炮弹这样的东西需要显示,可能得处理处理。
    4.还有一个有麻烦的地方。TA里的指令这些发送给单位,倒不是很麻烦。但是,鼠标移动到单位上面,显示出来的对应的变化,还有摆建筑时那个矩形的玩意,可不是很容易了。
    8.单位数量过高时不再计算寻路的破解。单独线程中完成寻路,支持多核。
    9.TA联网端口的自定义。 也许的,端口穿透…
    10.作弊玩家的检测,自动发包让作弊玩家的40空血。
    11.单位体积过大引起非法的问题。
    12.做一个自适应版本的WZ TA mod选择的DLL
    13.运输机可以在不静止的时候释放单位
    14.3、4个工程分别在造一个电厂,然后40过去X圈一圈,就按照顺序每个都加速一下。
    15.随机图的功能
  5. new colours , team colors
    17.单位移动时阵型是否不会改变, 单位可以倒着走
  6. F1中按照选中的单位,显示F1目标图标的单位的建造需要时间和每秒消耗。
  7. multi reclaim will be remove

:7_344:一个个来
1.调用录像机播放不同exe的录像
这个现在的录像机好像就可以吧
选中多个工厂时,可以有功能取消所有工厂正在建造的单位们。还可以给每个工厂设置都建造相同的单位
选中多个单位时TA会使用gen界面,选中单个单位时才显示DL界面,你考虑一下可能性
一个获取当前单位ID的脚本接口

联机时ID好像是会重新分配的,这个功能可能会出问题,是不是考虑其他比较好,例如获取单位分类,司令,坦克飞机等等
一个unicode文字支持的修改
这个是不是必须配套一个unicode字库

看了这么多,大概重新写一个TA主程序也比改程序容易点吧。:L

well, TA3D的源代码有10MB,上面那个头文件的大小是25KB,也就是说TA3D的源代码等于这一段的将近400份。所以我还是决定改TA简单一些。

:7_349:我的意见是,把TA3D的强化视觉效果去除就好了,TA功能不够…TA3D太卡

单位总数能改啦????武器ID数能改吗???

[

早就有人改了,后来做录像机的那个人没有用那个改了的版本而已。

不过说实在的512个兵种,自己做一个MOD够多了,但是下载兵种来玩就远远不够。

[

不是说那个修改过的很不稳定吗?