MHeasell / rwe

Robot War Engine - Real-time strategy game engine compatible with Total Annihilation
https://www.robotwarengine.com/
GNU General Public License v3.0
117 stars 18 forks source link

Support COB GETTERs #44

Open Xon opened 6 years ago

Xon commented 6 years ago

Standard Total Annihilation Getter/setter values:

#define ACTIVATION          1   // set or get
#define STANDINGMOVEORDERS  2   // set or get
#define STANDINGFIREORDERS  3   // set or get
#define HEALTH              4   // get (0-100%)
#define INBUILDSTANCE       5   // set or get
#define BUSY                6   // set or get (used by misc. special case missions like transport ships)
#define PIECE_XZ            7   // get
#define PIECE_Y             8   // get
#define UNIT_XZ             9   // get
#define UNIT_Y              10  // get
#define UNIT_HEIGHT         11  // get
#define XZ_ATAN             12  // get atan of packed x,z coords
#define XZ_HYPOT            13  // get hypot of packed x,z coords
#define ATAN                14  // get ordinary two-parameter atan
#define HYPOT               15  // get ordinary two-parameter hypot
#define GROUND_HEIGHT       16  // get
#define BUILD_PERCENT_LEFT  17  // get 0 = unit is built and ready, 1-100 = How much is left to build
#define YARD_OPEN           18  // set or get (change which plots we occupy when building opens and closes)
#define BUGGER_OFF          19  // set or get (ask other units to clear the area)
#define ARMORED             20  // set or get

From my old TADR extension getter;

 // indicates if the 1st parameter(a unit ID) is local to this computer
#define  UNIT_IS_ON_THIS_COMP 68
 // returns the lowest valid unit ID number
#define  MIN_ID 69
 // returns the highest valid unit ID number
#define  MAX_ID 70
 // returns ID of current unit
#define  MY_ID 71
 // returns team of unit given with parameter
#define  UNIT_TEAM 72
 // basically BUILD_PERCENT_LEFT, but comes with a unit parameter
#define  UNIT_BUILD_PERCENT_LEFT 73
 // is unit given with parameter allied to the unit of the current COB script. 1=allied, 0=not allied
#define  UNIT_ALLIED 74
 // gets kills * 100
#define  VETERAN_LEVEL 32
MHeasell commented 6 years ago

Most of these should be straightforward once the relevant concepts are in the engine.

 // indicates if the 1st parameter(a unit ID) is local to this computer
#define  UNIT_IS_ON_THIS_COMP 68

Do you know what determines whether a unit is local to a computer? This is not a well-defined concept in RWE as multiplayer will employ a lock-step model where all players simulate all units.

Xon commented 6 years ago

For each side, Total Annihilation tracks if it was either; local human, local AI, or a remote player.

Xon commented 6 years ago

This is because Total Annihilation 's multiplayer is only appropriately lock-step multiplayer, As each instance knows knows if authoritative for a side. If it is, it send out periodic unit re-sync packets, and if not accepts them for a side.

The local AI/local human is a fairly obvious reason, to know if a local side has an AI driving it or not.

Even with lock-step multiplayer, you are going to need to handle the affects of latency between players. latency masking means the engine would need some sort of resync behaviour of some sort to 'rubberband' things back to the correct spot.

Honestly lock-step multiplayer has some significant complexities due to NAT everywhere which makes p2p model painful and general flakiness of consumer networks.

Xon commented 6 years ago

After a bit of thinking, I think UNIT_IS_ON_THIS_COMP is just a bad fit for anything but exactly Total Annihilation's multiplayer model. I'm not sure how heavily used it is however

MHeasell commented 6 years ago

Started work on this in 422afd0f696cf50714311219756a71218cde6150 on branch 'getters', not tested an awful lot yet. At the very least, RWE can load the commander from ESC now (after renaming all the "E" suffixed dirs back to normal).

Xon commented 6 years ago

FYI, CobExecutionContext::pop() should return 0 (or do error reporting) if the stack is empty rather than unexpectedly explode/break. As TA has no bounds checking which allows a script to pop off the bottom of the stack and then allows modifying of the TA's in-memory unit scripting structure.

I don't think any 3rd party units really on this bug.

MHeasell commented 6 years ago

I spent some time playing with the Zarganeth (one of Zodius' units with a fancy ground-tracking walk script) and got things working to the point where this is useful enough to be on master, so I've merged the getters code in.

I'm going to leave this issue hanging around for now as some of the getters/setters are still TODO. Either I will implement them or create other issues to track them before closing.

I have opened #56 to track fixing pop().