my proposal for fixing
Index: src/droiddef.h
===================================================================
--- src/droiddef.h (revision 10620)
+++ src/droiddef.h (working copy)
@@ -169,7 +169,7 @@
UWORD orderX2, orderY2;
BOOL bTargetted;
-
+ /* when assign from saved objects this field is used as an ID, that is UDWORD */
BASE_OBJECT* psTarget; ///< Order target
BASE_STATS* psTarStats; ///< What to build etc
#ifdef DEBUG
Index: src/game.c
===================================================================
--- src/game.c (revision 10620)
+++ src/game.c (working copy)
@@ -92,11 +92,13 @@
#define SAVEKEY_ONMISSION 0x100
/*!
- * FIXME
- * The code is reusing some pointers as normal integer values apparently. This
- * should be fixed!
+ * FIXME, that is hacker code, using union should be used, would make codes harder to read
+ * The code is reusing some pointers as normal UDWORD values temporaly for restoring from saved
+ * game. This should be fixed! will not
*/
#define FIXME_CAST_ASSIGN(TYPE, lval, rval) { TYPE* __tmp = (TYPE*) &lval; *__tmp = (TYPE)rval; }
+/* 64-bit system dont like previous */
+#define FIXME_CAST_ASSIGN_ID_FROM_PTR(TYPE, lval, rval) { lval = (UDWORD)(long)rval; }
/// @note This represents a size internal to savegame files, so: DO NOT CHANGE THIS
#define MAX_GAME_STR_SIZE 20
@@ -5956,7 +5958,7 @@
{
UDWORD id;
//Target rebuild the object pointer from the ID
- FIXME_CAST_ASSIGN(UDWORD, id, psDroid->psTarget);
+ FIXME_CAST_ASSIGN_ID_FROM_PTR(UDWORD, id, psDroid->psTarget);
if (id != NULL_ID)
{
setSaveDroidTarget(psDroid, getBaseObjFromId(id));
@@ -5971,7 +5973,7 @@
setSaveDroidTarget(psDroid, NULL);
}
//ActionTarget rebuild the object pointer from the ID
- FIXME_CAST_ASSIGN(UDWORD, id, psDroid->psActionTarget[0]);
+ FIXME_CAST_ASSIGN_ID_FROM_PTR(UDWORD, id, psDroid->psActionTarget[0]);
if (id != NULL_ID)
{
setSaveDroidActionTarget(psDroid, getBaseObjFromId(id), 0);
@@ -5986,7 +5988,7 @@
setSaveDroidActionTarget(psDroid, NULL, 0);
}
//BaseStruct rebuild the object pointer from the ID
- FIXME_CAST_ASSIGN(UDWORD, id, psDroid->psBaseStruct);
+ FIXME_CAST_ASSIGN_ID_FROM_PTR(UDWORD, id, psDroid->psBaseStruct);
if (id != NULL_ID)
{
setSaveDroidBase(psDroid, (STRUCTURE*)getBaseObjFromId(id));
@@ -6004,10 +6006,10 @@
{
UDWORD _tmpid;
//rebuild group for droids in command group from the commander ID
- FIXME_CAST_ASSIGN(UDWORD, id, psDroid->psGrpNext);
+ FIXME_CAST_ASSIGN_ID_FROM_PTR(UDWORD, id, psDroid->psGrpNext);
if (id == NULL_ID)
{
- FIXME_CAST_ASSIGN(UDWORD, _tmpid, psDroid->psGroup);
+ FIXME_CAST_ASSIGN_ID_FROM_PTR(UDWORD, _tmpid, psDroid->psGroup);
psDroid->psGroup = NULL;
psDroid->psGrpNext = NULL;
if (_tmpid != NULL_ID)
@@ -6606,7 +6608,7 @@
if ((psCurr->psBaseStruct != NULL))
{
UDWORD _tmpid;
- FIXME_CAST_ASSIGN(UDWORD, _tmpid, psCurr->psBaseStruct);
+ FIXME_CAST_ASSIGN_ID_FROM_PTR(UDWORD, _tmpid, psCurr->psBaseStruct);
if (_tmpid != NULL_ID && psCurr->psBaseStruct->died <= 1 && checkValidId(psCurr->psBaseStruct->id))
{
psSaveDroid->baseStructID = psCurr->psBaseStruct->id;
@@ -8325,7 +8327,7 @@
case REF_CYBORG_FACTORY:
case REF_VTOL_FACTORY:
psFactory = ((FACTORY *)psStruct->pFunctionality);
- FIXME_CAST_ASSIGN(UDWORD, _tmpid, psFactory->psCommander);
+ FIXME_CAST_ASSIGN_ID_FROM_PTR(UDWORD, _tmpid, psFactory->psCommander);
//there is a commander then has been temporarily removed
//so put it back
if (_tmpid != NULL_ID)
@@ -8358,7 +8360,7 @@
break;
case REF_REPAIR_FACILITY:
psRepair = ((REPAIR_FACILITY *)psStruct->pFunctionality);
- FIXME_CAST_ASSIGN(UDWORD, _tmpid, psRepair->psObj);
+ FIXME_CAST_ASSIGN_ID_FROM_PTR(UDWORD, _tmpid, psRepair->psObj);
if (_tmpid == NULL_ID)
{
psRepair->psObj = NULL;
@@ -8381,7 +8383,7 @@
psReArmPad = ((REARM_PAD *)psStruct->pFunctionality);
if (saveGameVersion >= VERSION_26)//version 26
{
- FIXME_CAST_ASSIGN(UDWORD, _tmpid, psReArmPad->psObj)
+ FIXME_CAST_ASSIGN_ID_FROM_PTR(UDWORD, _tmpid, psReArmPad->psObj)
if (_tmpid == NULL_ID)
{
psReArmPad->psObj = NULL;
@@ -10769,7 +10771,7 @@
{
if (psStruct->pStructureType->type == factoryToFind)
{
- if ((UDWORD)((FACTORY *)psStruct->pFunctionality)->psAssemblyPoint == psflag->factoryInc)
+ if ((UDWORD)(long)((FACTORY *)psStruct->pFunctionality)->psAssemblyPoint == psflag->factoryInc)
{
//this is the one so set it
((FACTORY *)psStruct->pFunctionality)->psAssemblyPoint = psflag;
_______________________________________________
Warzone-dev mailing list
[email protected]
https://mail.gna.org/listinfo/warzone-dev