From be0ca9c1afd52679e32cc35bfa26249ea339ba0e Mon Sep 17 00:00:00 2001 From: Zero Fanker Date: Fri, 22 Nov 2024 19:24:23 -0500 Subject: [PATCH] Fix: change object owner (#118) * split out overlay handling function, and change digit to meaningful enum values . * GetStructureData returns ID and readd using the same . * resolved data insert sequence issue . --- MissionEditor/IsoView.cpp | 609 +++++++++++++++++++------------------- MissionEditor/IsoView.h | 1 + MissionEditor/MapData.cpp | 112 ++++--- MissionEditor/MapData.h | 6 +- MissionEditor/Structs.h | 10 + 5 files changed, 393 insertions(+), 345 deletions(-) diff --git a/MissionEditor/IsoView.cpp b/MissionEditor/IsoView.cpp index b86a914..4239f77 100644 --- a/MissionEditor/IsoView.cpp +++ b/MissionEditor/IsoView.cpp @@ -4605,7 +4605,220 @@ void CIsoView::ShowAllTileSets() } } +void CIsoView::handleMouseActionManageOverlays(int x, int y) +{ + // Overlay + DWORD dwPos = x + y * Map->GetIsoSize(); + FIELDDATA m = *Map->GetFielddataAt(dwPos); + if (m.wGround == 0xFFFF) m.wGround = 0; + + BYTE oldOverlay = Map->GetOverlayAt(dwPos); + BYTE oldOverlayData = Map->GetOverlayDataAt(dwPos); + + if (AD.data == 1) // delete overlay + { + int gx, gy; + for (gx = x - AD.data2; gx <= x + AD.data2; gx++) { + for (gy = y - AD.data2; gy <= y + AD.data2; gy++) { + Map->SetOverlayDataAt(gx + gy * Map->GetIsoSize(), 0xFF); + Map->SetOverlayAt(gx + gy * Map->GetIsoSize(), 0xFF); + + + HandleTrail(gx - 1, gy - 1); + HandleTrail(gx + 1, gy - 1); + HandleTrail(gx - 1, gy + 1); + HandleTrail(gx + 1, gy + 1); + HandleTrail(gx - 0, gy - 1); + HandleTrail(gx + 0, gy + 1); + HandleTrail(gx - 1, gy + 0); + HandleTrail(gx + 1, gy + 0); + } + } + + + } + else if (AD.data == 2) // green tiberium mode + { + + { + if (AD.data2 == 0) { + int i, e; + for (i = 0; i < m_BrushSize_x; i++) { + for (e = 0; e < m_BrushSize_y; e++) { + int curground = Map->GetFielddataAt(dwPos + i + e * Map->GetIsoSize())->wGround; + if (curground == 0xFFFF) curground = 0; + + if ((*tiledata)[curground].bAllowTiberium) { + //srand( GetTickCount()+i+e*5 ); + int v1 = ((float)rand() / (float)RAND_MAX) * 8.0f + 0x68; + int v2 = ((float)rand() / (float)RAND_MAX) * 8.0f + 1; + Map->SetOverlayAt(dwPos + i + e * Map->GetIsoSize(), v1); + Map->SetOverlayDataAt(dwPos + i + e * Map->GetIsoSize(), v2); + } + } + } + } + else if (AD.data2 == 10) { + int i, e; + for (i = 0; i < m_BrushSize_x; i++) { + for (e = 0; e < m_BrushSize_y; e++) { + int curground = Map->GetFielddataAt(dwPos + i + e * Map->GetIsoSize())->wGround; + if (curground == 0xFFFF) curground = 0; + + if ((*tiledata)[curground].bAllowTiberium) { + Map->SetOverlayAt(dwPos + i + e * Map->GetIsoSize(), 0x70); + Map->SetOverlayDataAt(dwPos + i + e * Map->GetIsoSize(), 0x5); + } + } + } + } + else if (AD.data2 == 20) { + int i, e; + for (i = 0; i < m_BrushSize_x; i++) { + for (e = 0; e < m_BrushSize_y; e++) { + int ovrl = Map->GetOverlayAt(dwPos + i + e * Map->GetIsoSize()); + if (ovrl > 0x65 && ovrl < 0x72) { + if (Map->GetOverlayDataAt(i + e * Map->GetIsoSize() + dwPos) < 9) Map->SetOverlayDataAt(dwPos + i + e * Map->GetIsoSize(), Map->GetOverlayDataAt(dwPos + i + e * Map->GetIsoSize()) + 1); + } + } + } + } + else if (AD.data2 == 21) { + + int i, e; + for (i = 0; i < m_BrushSize_x; i++) { + for (e = 0; e < m_BrushSize_y; e++) { + int ovrl = Map->GetOverlayAt(dwPos + i + e * Map->GetIsoSize()); + if (ovrl > 0x65 && ovrl < 0x72) { + if (Map->GetOverlayDataAt(dwPos + i + e * Map->GetIsoSize()) > 0) Map->SetOverlayDataAt(dwPos + i + e * Map->GetIsoSize(), Map->GetOverlayDataAt(dwPos + i + e * Map->GetIsoSize()) - 1); + } + } + } + } + } + + } + else if (AD.data == 3) // blue tiberium mode + { + int o = 0x7f; +#ifdef RA2_MODE + o = 0x1e; +#endif + //if((*tiledata)[m.wGround].bAllowTiberium) + { + if (AD.data2 == 0) { + + int i, e; + for (i = 0; i < m_BrushSize_x; i++) { + for (e = 0; e < m_BrushSize_y; e++) { + int curground = Map->GetFielddataAt(dwPos + i + e * Map->GetIsoSize())->wGround; + if (curground == 0xFFFF) curground = 0; + + if ((*tiledata)[curground].bAllowTiberium) { + + int v2 = ((float)rand() / (float)RAND_MAX) * 8 + 1; + Map->SetOverlayAt(dwPos + i + e * Map->GetIsoSize(), o); + Map->SetOverlayDataAt(dwPos + i + e * Map->GetIsoSize(), v2); + } + } + } + + } + else if (AD.data2 == 10) { + int i, e; + for (i = 0; i < m_BrushSize_x; i++) { + for (e = 0; e < m_BrushSize_y; e++) { + int curground = Map->GetFielddataAt(dwPos + i + e * Map->GetIsoSize())->wGround; + if (curground == 0xFFFF) curground = 0; + + if ((*tiledata)[curground].bAllowTiberium) { + Map->SetOverlayAt(dwPos + i + e * Map->GetIsoSize(), o); + Map->SetOverlayDataAt(dwPos + i + e * Map->GetIsoSize(), 0x5); + } + } + } + } + else if (AD.data2 == 20) { + int i, e; + for (i = 0; i < m_BrushSize_x; i++) { + for (e = 0; e < m_BrushSize_y; e++) { + int ovrl = Map->GetOverlayAt(dwPos + i + e * Map->GetIsoSize()); + if (ovrl == o) { + if (Map->GetOverlayDataAt(dwPos + i + e * Map->GetIsoSize()) < 9) Map->SetOverlayDataAt(dwPos + i + e * Map->GetIsoSize(), Map->GetOverlayDataAt(dwPos + i + e * Map->GetIsoSize()) + 1); + } + } + } + } + else if (AD.data2 == 21) { + int i, e; + for (i = 0; i < m_BrushSize_x; i++) { + for (e = 0; e < m_BrushSize_y; e++) { + int ovrl = Map->GetOverlayAt(dwPos + i + e * Map->GetIsoSize()); + if (ovrl == o) { + if (Map->GetOverlayDataAt(dwPos + i + e * Map->GetIsoSize()) > 0) Map->SetOverlayDataAt(dwPos + i + e * Map->GetIsoSize(), Map->GetOverlayDataAt(dwPos + i + e * Map->GetIsoSize()) - 1); + } + } + } + } + } + + } + else if (AD.data == 4) // veinhole stuff mode + { + if (AD.data2 == 0) // Set veinhole! + { + int gx, gy; + for (gx = x - 1; gx <= x + 1; gx++) { + for (gy = y - 1; gy <= y + 1; gy++) { + Map->SetOverlayAt(gx + gy * Map->GetIsoSize(), OVRL_VEINHOLEBORDER); + Map->SetOverlayDataAt(gx + gy * Map->GetIsoSize(), 0x0); + } + } + Map->SetOverlayAt(dwPos, OVRL_VEINHOLE); + Map->SetOverlayDataAt(dwPos, 0x0); + Map->SetHeightAt(dwPos, Map->GetHeightAt(dwPos) - 1); + } + else if (AD.data2 == 1) // set veins + { + Map->SetOverlayAt(dwPos, OVRL_VEINS); + Map->SetOverlayDataAt(dwPos, 0x30); + } + + } + else if (AD.data == 30) // any overlay + { + Map->SetOverlayAt(dwPos, AD.data2); + Map->SetOverlayDataAt(dwPos, 0); + int i; + for (i = 0; i < overlay_count; i++) { + if (overlay_number[i] == AD.data2) { + if (overlay_trail[i]) { + // handle trail stuff! + HandleTrail(x, y); + } + } + } + } + else if (AD.data == 33) { + int i, e; + for (i = 0; i < m_BrushSize_x; i++) { + for (e = 0; e < m_BrushSize_y; e++) { + Map->SetOverlayAt(dwPos + i + e * Map->GetIsoSize(), AD.data2); + Map->SetOverlayDataAt(dwPos + i + e * Map->GetIsoSize(), AD.data3); + } + } + } + + else if (AD.data == 31) { + Map->SetOverlayAt(dwPos, AD.data2); + } + else if (AD.data == 32) { + Map->SetOverlayDataAt(dwPos, AD.data2); + } + + // RedrawWindow(NULL,NULL,RDW_INVALIDATE | RDW_UPDATENOW); +} void CIsoView::PlaceCurrentObjectAt(int x, int y) { @@ -4629,328 +4842,128 @@ void CIsoView::PlaceCurrentObjectAt(int x, int y) return; } - if (AD.type == 1) // ADD INFANTRY - { - if (Map->GetInfantryCountAt(x + y * Map->GetIsoSize()) >= SUBPOS_COUNT) { - return; - } - - Map->AddInfantry(NULL, AD.data_s, currentOwner, x + y * Map->GetIsoSize()); - //RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW); - } else if (AD.type == 2) // add structure - { - int n = Map->GetStructureAt(x + y * Map->GetIsoSize()); - if (n >= 0) { - STDOBJECTDATA sod; - Map->GetStdStructureData(n, &sod); - if (strcmp(sod.type, "GAPAVE") != NULL) { - //isMoving=FALSE; + switch (MouseActionType(AD.type)) { + case MouseActionType::AddInfantry: { + if (Map->GetInfantryCountAt(x + y * Map->GetIsoSize()) >= SUBPOS_COUNT) { return; } - } - - Map->AddStructure(NULL, AD.data_s, currentOwner, x + y * Map->GetIsoSize()); - //RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW); - } else if (AD.type == 3) // add aircraft - { - - if (Map->GetAirAt(x + y * Map->GetIsoSize()) >= 0) { - return; - } - - Map->AddAircraft(NULL, AD.data_s, currentOwner, x + y * Map->GetIsoSize()); - - //RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW); - } else if (AD.type == 4) // add vehicle - { - if (Map->GetUnitAt(x + y * Map->GetIsoSize()) >= 0) { - return; - } - - Map->AddUnit(NULL, AD.data_s, currentOwner, x + y * Map->GetIsoSize()); - - //RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW); - } else if (AD.type == 5) // add terrain - { - if (Map->GetTerrainAt(x + y * Map->GetIsoSize()) >= 0) { - return; - } - - Map->AddTerrain(AD.data_s, x + y * Map->GetIsoSize()); - - //RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW); - } else if (AD.type == 6) { - // Overlay - - - - DWORD dwPos = x + y * Map->GetIsoSize(); - - FIELDDATA m = *Map->GetFielddataAt(dwPos); - if (m.wGround == 0xFFFF) m.wGround = 0; - - BYTE oldOverlay = Map->GetOverlayAt(dwPos); - BYTE oldOverlayData = Map->GetOverlayDataAt(dwPos); - - if (AD.data == 1) // delete overlay - { - int gx, gy; - for (gx = x - AD.data2; gx <= x + AD.data2; gx++) { - for (gy = y - AD.data2; gy <= y + AD.data2; gy++) { - Map->SetOverlayDataAt(gx + gy * Map->GetIsoSize(), 0xFF); - Map->SetOverlayAt(gx + gy * Map->GetIsoSize(), 0xFF); - - - HandleTrail(gx - 1, gy - 1); - HandleTrail(gx + 1, gy - 1); - HandleTrail(gx - 1, gy + 1); - HandleTrail(gx + 1, gy + 1); - HandleTrail(gx - 0, gy - 1); - HandleTrail(gx + 0, gy + 1); - HandleTrail(gx - 1, gy + 0); - HandleTrail(gx + 1, gy + 0); + Map->AddInfantry(NULL, AD.data_s, currentOwner, x + y * Map->GetIsoSize()); + //RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW); + } break; + case MouseActionType::AddStructure: { + int n = Map->GetStructureAt(x + y * Map->GetIsoSize()); + if (n >= 0) { + STDOBJECTDATA sod; + Map->GetStdStructureData(n, &sod); + if (strcmp(sod.type, "GAPAVE") != NULL) { + //isMoving=FALSE; + return; } } - } else if (AD.data == 2) // green tiberium mode - { + Map->AddStructure(NULL, AD.data_s, currentOwner, x + y * Map->GetIsoSize()); + //RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW); + } break; + case MouseActionType::AddAircraft: { - { - if (AD.data2 == 0) { - int i, e; - for (i = 0; i < m_BrushSize_x; i++) { - for (e = 0; e < m_BrushSize_y; e++) { - int curground = Map->GetFielddataAt(dwPos + i + e * Map->GetIsoSize())->wGround; - if (curground == 0xFFFF) curground = 0; - - if ((*tiledata)[curground].bAllowTiberium) { - //srand( GetTickCount()+i+e*5 ); - int v1 = ((float)rand() / (float)RAND_MAX) * 8.0f + 0x68; - int v2 = ((float)rand() / (float)RAND_MAX) * 8.0f + 1; - Map->SetOverlayAt(dwPos + i + e * Map->GetIsoSize(), v1); - Map->SetOverlayDataAt(dwPos + i + e * Map->GetIsoSize(), v2); - } - } - } - } else if (AD.data2 == 10) { - int i, e; - for (i = 0; i < m_BrushSize_x; i++) { - for (e = 0; e < m_BrushSize_y; e++) { - int curground = Map->GetFielddataAt(dwPos + i + e * Map->GetIsoSize())->wGround; - if (curground == 0xFFFF) curground = 0; - - if ((*tiledata)[curground].bAllowTiberium) { - Map->SetOverlayAt(dwPos + i + e * Map->GetIsoSize(), 0x70); - Map->SetOverlayDataAt(dwPos + i + e * Map->GetIsoSize(), 0x5); - } - } - } - } else if (AD.data2 == 20) { - int i, e; - for (i = 0; i < m_BrushSize_x; i++) { - for (e = 0; e < m_BrushSize_y; e++) { - int ovrl = Map->GetOverlayAt(dwPos + i + e * Map->GetIsoSize()); - if (ovrl > 0x65 && ovrl < 0x72) { - if (Map->GetOverlayDataAt(i + e * Map->GetIsoSize() + dwPos) < 9) Map->SetOverlayDataAt(dwPos + i + e * Map->GetIsoSize(), Map->GetOverlayDataAt(dwPos + i + e * Map->GetIsoSize()) + 1); - } - } - } - } else if (AD.data2 == 21) { - - int i, e; - for (i = 0; i < m_BrushSize_x; i++) { - for (e = 0; e < m_BrushSize_y; e++) { - int ovrl = Map->GetOverlayAt(dwPos + i + e * Map->GetIsoSize()); - if (ovrl > 0x65 && ovrl < 0x72) { - if (Map->GetOverlayDataAt(dwPos + i + e * Map->GetIsoSize()) > 0) Map->SetOverlayDataAt(dwPos + i + e * Map->GetIsoSize(), Map->GetOverlayDataAt(dwPos + i + e * Map->GetIsoSize()) - 1); - } - } - } - } + if (Map->GetAirAt(x + y * Map->GetIsoSize()) >= 0) { + return; } - } else if (AD.data == 3) // blue tiberium mode - { - int o = 0x7f; -#ifdef RA2_MODE - o = 0x1e; -#endif - //if((*tiledata)[m.wGround].bAllowTiberium) - { - if (AD.data2 == 0) { + Map->AddAircraft(NULL, AD.data_s, currentOwner, x + y * Map->GetIsoSize()); - int i, e; - for (i = 0; i < m_BrushSize_x; i++) { - for (e = 0; e < m_BrushSize_y; e++) { - int curground = Map->GetFielddataAt(dwPos + i + e * Map->GetIsoSize())->wGround; - if (curground == 0xFFFF) curground = 0; - - if ((*tiledata)[curground].bAllowTiberium) { - - int v2 = ((float)rand() / (float)RAND_MAX) * 8 + 1; - Map->SetOverlayAt(dwPos + i + e * Map->GetIsoSize(), o); - Map->SetOverlayDataAt(dwPos + i + e * Map->GetIsoSize(), v2); - } - } - } - - } else if (AD.data2 == 10) { - int i, e; - for (i = 0; i < m_BrushSize_x; i++) { - for (e = 0; e < m_BrushSize_y; e++) { - int curground = Map->GetFielddataAt(dwPos + i + e * Map->GetIsoSize())->wGround; - if (curground == 0xFFFF) curground = 0; - - if ((*tiledata)[curground].bAllowTiberium) { - Map->SetOverlayAt(dwPos + i + e * Map->GetIsoSize(), o); - Map->SetOverlayDataAt(dwPos + i + e * Map->GetIsoSize(), 0x5); - } - } - } - } else if (AD.data2 == 20) { - int i, e; - for (i = 0; i < m_BrushSize_x; i++) { - for (e = 0; e < m_BrushSize_y; e++) { - int ovrl = Map->GetOverlayAt(dwPos + i + e * Map->GetIsoSize()); - if (ovrl == o) { - if (Map->GetOverlayDataAt(dwPos + i + e * Map->GetIsoSize()) < 9) Map->SetOverlayDataAt(dwPos + i + e * Map->GetIsoSize(), Map->GetOverlayDataAt(dwPos + i + e * Map->GetIsoSize()) + 1); - } - } - } - } else if (AD.data2 == 21) { - int i, e; - for (i = 0; i < m_BrushSize_x; i++) { - for (e = 0; e < m_BrushSize_y; e++) { - int ovrl = Map->GetOverlayAt(dwPos + i + e * Map->GetIsoSize()); - if (ovrl == o) { - if (Map->GetOverlayDataAt(dwPos + i + e * Map->GetIsoSize()) > 0) Map->SetOverlayDataAt(dwPos + i + e * Map->GetIsoSize(), Map->GetOverlayDataAt(dwPos + i + e * Map->GetIsoSize()) - 1); - } - } - } - } + //RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW); + } break; + case MouseActionType::AddVehicle: { + if (Map->GetUnitAt(x + y * Map->GetIsoSize()) >= 0) { + return; } - } else if (AD.data == 4) // veinhole stuff mode - { - if (AD.data2 == 0) // Set veinhole! - { - int gx, gy; - for (gx = x - 1; gx <= x + 1; gx++) { - for (gy = y - 1; gy <= y + 1; gy++) { - Map->SetOverlayAt(gx + gy * Map->GetIsoSize(), OVRL_VEINHOLEBORDER); - Map->SetOverlayDataAt(gx + gy * Map->GetIsoSize(), 0x0); - } - } - Map->SetOverlayAt(dwPos, OVRL_VEINHOLE); - Map->SetOverlayDataAt(dwPos, 0x0); - Map->SetHeightAt(dwPos, Map->GetHeightAt(dwPos) - 1); - } else if (AD.data2 == 1) // set veins - { - Map->SetOverlayAt(dwPos, OVRL_VEINS); - Map->SetOverlayDataAt(dwPos, 0x30); + Map->AddUnit(NULL, AD.data_s, currentOwner, x + y * Map->GetIsoSize()); + + //RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW); + } break; + case MouseActionType::AddTerrain: { + if (Map->GetTerrainAt(x + y * Map->GetIsoSize()) >= 0) { + return; } - } else if (AD.data == 30) // any overlay - { - Map->SetOverlayAt(dwPos, AD.data2); - Map->SetOverlayDataAt(dwPos, 0); - int i; - for (i = 0; i < overlay_count; i++) { - if (overlay_number[i] == AD.data2) { - if (overlay_trail[i]) { - // handle trail stuff! - HandleTrail(x, y); - } - } - } - } else if (AD.data == 33) { - int i, e; - for (i = 0; i < m_BrushSize_x; i++) { - for (e = 0; e < m_BrushSize_y; e++) { - Map->SetOverlayAt(dwPos + i + e * Map->GetIsoSize(), AD.data2); - Map->SetOverlayDataAt(dwPos + i + e * Map->GetIsoSize(), AD.data3); - } - } - } + Map->AddTerrain(AD.data_s, x + y * Map->GetIsoSize()); - else if (AD.data == 31) { - Map->SetOverlayAt(dwPos, AD.data2); - } else if (AD.data == 32) { - Map->SetOverlayDataAt(dwPos, AD.data2); - } + //RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW); + } break; + case MouseActionType::ManageOverlay: + this->handleMouseActionManageOverlays(x, y); + break; + case MouseActionType::ChangeOwner: { + // set owner! + BOOL bchanged = FALSE; - // RedrawWindow(NULL,NULL,RDW_INVALIDATE | RDW_UPDATENOW); - } else if (AD.type == 7) { - // set owner! - BOOL bchanged = FALSE; - - int t = Map->GetStructureAt(x + y * Map->GetIsoSize()); - if (t >= 0) { - STRUCTURE structure; - Map->GetStructureData(t, &structure); - Map->DeleteStructure(t); - structure.house = AD.data_s; - Map->AddStructure(&structure); - bchanged = TRUE; - } - t = Map->GetUnitAt(x + y * Map->GetIsoSize()); - if (t >= 0) { - UNIT unit; - Map->GetUnitData(t, &unit); - Map->DeleteUnit(t); - unit.house = AD.data_s; - Map->AddUnit(&unit); - bchanged = TRUE; - } - t = Map->GetAirAt(x + y * Map->GetIsoSize()); - if (t >= 0) { - AIRCRAFT aircraft; - Map->GetAircraftData(t, &aircraft); - Map->DeleteAircraft(t); - aircraft.house = AD.data_s; - Map->AddAircraft(&aircraft); - bchanged = TRUE; - } - int z; - for (z = 0; z < SUBPOS_COUNT; z++) { - t = Map->GetInfantryAt(x + y * Map->GetIsoSize(), z); + int t = Map->GetStructureAt(x + y * Map->GetIsoSize()); if (t >= 0) { - INFANTRY infantry; - Map->GetInfantryData(t, &infantry); - Map->DeleteInfantry(t); - infantry.house = AD.data_s; - Map->AddInfantry(&infantry); + STRUCTURE structure; + auto const id = Map->GetStructureData(t, &structure); + Map->DeleteStructure(t); + structure.house = AD.data_s; + Map->AddStructure(&structure, nullptr, nullptr, 0, std::move(id)); bchanged = TRUE; } - } + t = Map->GetUnitAt(x + y * Map->GetIsoSize()); + if (t >= 0) { + UNIT unit; + auto const id = Map->GetUnitData(t, &unit); + Map->DeleteUnit(t); + unit.house = AD.data_s; + Map->AddUnit(&unit, nullptr, nullptr, 0, std::move(id)); + bchanged = TRUE; + } + t = Map->GetAirAt(x + y * Map->GetIsoSize()); + if (t >= 0) { + AIRCRAFT aircraft; + auto const id = Map->GetAircraftData(t, &aircraft); + Map->DeleteAircraft(t); + aircraft.house = AD.data_s; + Map->AddAircraft(&aircraft, nullptr, nullptr, 0, std::move(id)); + bchanged = TRUE; + } + int z; + for (z = 0; z < SUBPOS_COUNT; z++) { + t = Map->GetInfantryAt(x + y * Map->GetIsoSize(), z); + if (t >= 0) { + INFANTRY infantry; + Map->GetInfantryData(t, &infantry); + Map->DeleteInfantry(t); + infantry.house = AD.data_s; + Map->AddInfantry(&infantry); + bchanged = TRUE; + } + } - if (bchanged) { - //RedrawWindow(NULL,NULL,RDW_INVALIDATE | RDW_UPDATENOW); - } + if (bchanged) { + //RedrawWindow(NULL,NULL,RDW_INVALIDATE | RDW_UPDATENOW); + } + } break; + #ifdef SMUDGE_SUPP + case MouseActionType::AddSmudge: { + if (Map->GetFielddataAt(x + y * Map->GetIsoSize())->smudge >= 0) { + return; + } + SMUDGE s; + s.type = AD.data_s; + s.x = x; + s.y = y; + s.deleted = 0; + Map->AddSmudge(&s); + //RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW); + } break; + #endif + default: + break; } -#ifdef SMUDGE_SUPP - else if (AD.type == 8) // add smudge - { - - if (Map->GetFielddataAt(x + y * Map->GetIsoSize())->smudge >= 0) { - return; - } - - SMUDGE s; - s.type = AD.data_s; - s.x = x; - s.y = y; - s.deleted = 0; - Map->AddSmudge(&s); - - //RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW); - } -#endif - } void CIsoView::OnTimer(UINT_PTR nIDEvent) diff --git a/MissionEditor/IsoView.h b/MissionEditor/IsoView.h index 80e051b..6e72199 100644 --- a/MissionEditor/IsoView.h +++ b/MissionEditor/IsoView.h @@ -116,6 +116,7 @@ protected: // implementation protected: + void handleMouseActionManageOverlays(int x, int y); #ifdef _DEBUG virtual void AssertValid() const; diff --git a/MissionEditor/MapData.cpp b/MissionEditor/MapData.cpp index 01d03e2..cedf670 100644 --- a/MissionEditor/MapData.cpp +++ b/MissionEditor/MapData.cpp @@ -1837,7 +1837,9 @@ void CMapData::DeleteInfantry(DWORD dwIndex) { //if(dwIndex>=m_infantry.size()) MessageBox(0,"CMapData::DeleteInfantry(): Out of range error", "Error", 0); - if (dwIndex >= m_infantry.size()) return; + if (dwIndex >= m_infantry.size()) { + return; + } // BUG TRACING HERE, FOR THE COPY INSTEAD MOVE INFANTRY BUG! // SOLUTION WAS IN ADDINFANTRY(); @@ -1845,21 +1847,23 @@ void CMapData::DeleteInfantry(DWORD dwIndex) //MessageBox(0,"CMapData::DeleteInfantry() called for infantry that already got deleted!", "Error",0); errstream << "CMapData::DeleteInfantry() called for infantry that already got deleted! Index: " << dwIndex << endl; errstream.flush(); + + return; } - if (m_infantry[dwIndex].deleted) return; - - - m_infantry[dwIndex].deleted = 1; int x = atoi(m_infantry[dwIndex].x); int y = atoi(m_infantry[dwIndex].y); int pos = atoi(m_infantry[dwIndex].pos); - if (pos > 0) pos--; + if (pos > 0) { + pos--; + } - if (x + y * m_IsoSize < fielddata_size) fielddata[x + y * m_IsoSize].infantry[pos] = -1; + if (x + y * m_IsoSize < fielddata_size) { + fielddata[x + y * m_IsoSize].infantry[pos] = -1; + } Mini_UpdatePos(x, y, IsMultiplayer()); @@ -1919,7 +1923,9 @@ void CMapData::DeleteCelltag(DWORD dwIndex) void CMapData::DeleteUnit(DWORD dwIndex) { - if (dwIndex >= GetUnitCount()) return; + if (dwIndex >= GetUnitCount()) { + return; + } auto const& pSec = m_mapfile.TryGetSection("Units"); ASSERT(pSec != nullptr); @@ -2074,14 +2080,14 @@ BOOL CMapData::AddWaypoint(CString id, DWORD dwPos) -void CMapData::GetStructureData(DWORD dwIndex, STRUCTURE* lpStructure) const +CString CMapData::GetStructureData(DWORD dwIndex, STRUCTURE* lpStructure) const { auto const& section = m_mapfile.GetSection("Structures"); if (dwIndex >= section.Size()) { - return; + return {}; } - auto const& data = section.Nth(dwIndex).second; + auto const& [id, data] = section.Nth(dwIndex); lpStructure->house = GetParam(data, 0); lpStructure->type = GetParam(data, 1); @@ -2101,6 +2107,7 @@ void CMapData::GetStructureData(DWORD dwIndex, STRUCTURE* lpStructure) const lpStructure->flag3 = GetParam(data, 15); lpStructure->flag4 = GetParam(data, 16); + return id; } void CMapData::GetStdStructureData(DWORD dwIndex, STDOBJECTDATA* lpStdStructure) const @@ -2164,8 +2171,9 @@ BOOL CMapData::AddInfantry(INFANTRY* lpInfantry, LPCTSTR lpType, LPCTSTR lpHouse dwPos = atoi(infantry.x) + atoi(infantry.y) * Map->GetIsoSize(); // MW Bugfix: not checking if infantry.pos does already exist caused crashes with user scripts! - if (GetInfantryAt(dwPos, atoi(infantry.pos)) >= 0) + if (GetInfantryAt(dwPos, atoi(infantry.pos)) >= 0) { infantry.pos = "-1"; + } } else { char cx[10], cy[10]; itoa(dwPos % Map->GetIsoSize(), cx, 10); @@ -2195,9 +2203,9 @@ BOOL CMapData::AddInfantry(INFANTRY* lpInfantry, LPCTSTR lpType, LPCTSTR lpHouse int subpos = -1; int i; - if (GetInfantryCountAt(dwPos) == 0) + if (GetInfantryCountAt(dwPos) == 0) { subpos = 0; - else { + } else { int oldInf = GetInfantryAt(dwPos, 0); if (oldInf > -1) { INFANTRY inf; @@ -2229,7 +2237,9 @@ BOOL CMapData::AddInfantry(INFANTRY* lpInfantry, LPCTSTR lpType, LPCTSTR lpHouse } } - if (subpos < 0) return FALSE; + if (subpos < 0) { + return FALSE; + } char c[50]; itoa(subpos, c, 10); @@ -2267,36 +2277,43 @@ BOOL CMapData::AddInfantry(INFANTRY* lpInfantry, LPCTSTR lpType, LPCTSTR lpHouse // below code should be much more compatible to the very old code (the direct ini one) int sp = atoi(infantry.pos); - if (sp > 0) sp--; + if (sp > 0) { + sp--; + } int i; BOOL bFound = FALSE; if (suggestedIndex >= 0 && suggestedIndex < m_infantry.size()) { + // reuse slot if (m_infantry[suggestedIndex].deleted) { m_infantry[suggestedIndex] = infantry; - if (dwPos < fielddata_size) fielddata[dwPos].infantry[sp] = suggestedIndex; + if (dwPos < fielddata_size) { + fielddata[dwPos].infantry[sp] = suggestedIndex; + } bFound = TRUE; } } - if (!bFound) + if (!bFound) { for (i = 0; i < m_infantry.size(); i++) { - if (m_infantry[i].deleted) // yep, found one, replace it - { + // yep, found one, replace it + if (m_infantry[i].deleted) { m_infantry[i] = infantry; - if (dwPos < fielddata_size) fielddata[dwPos].infantry[sp] = i; + if (dwPos < fielddata_size) { + fielddata[dwPos].infantry[sp] = i; + } bFound = TRUE; break; } } - if (!bFound) { m_infantry.push_back(infantry); - if (dwPos < fielddata_size) fielddata[dwPos].infantry[sp] = m_infantry.size() - 1; + if (dwPos < fielddata_size) { + fielddata[dwPos].infantry[sp] = m_infantry.size() - 1; + } } - return TRUE; } @@ -2332,10 +2349,10 @@ BOOL CMapData::AddStructure(STRUCTURE* lpStructure, LPCTSTR lpType, LPCTSTR lpHo } - CString id = GetFree("Structures"); + CString id = suggestedID; - if (!suggestedID.IsEmpty() && !m_mapfile["Structures"].Exists(suggestedID)) { - id = suggestedID; + if (suggestedID.IsEmpty() || m_mapfile["Structures"].Exists(suggestedID)) { + id = GetFree("Structures"); } CString value; @@ -2344,7 +2361,8 @@ BOOL CMapData::AddStructure(STRUCTURE* lpStructure, LPCTSTR lpType, LPCTSTR lpHo structure.flag2 + "," + structure.energy + "," + structure.upgradecount + "," + structure.spotlight + "," + structure.upgrade1 + "," + structure.upgrade2 + "," + structure.upgrade3 + "," + structure.flag3 + "," + structure.flag4; - m_mapfile.SetString("Structures", id, value); + auto& section = m_mapfile.AddSection("Structures"); + section.InsertOrAssign(id, value); if (!m_noAutoObjectUpdate) { UpdateStructures(FALSE); @@ -2425,7 +2443,9 @@ void CMapData::GetInfantryData(DWORD dwIndex, INFANTRY* lpInfantry) const { ASSERT(dwIndex < m_infantry.size()); - if (dwIndex >= m_infantry.size()) return; + if (dwIndex >= m_infantry.size()) { + return; + } /*lpInfantry->house=m_infantry.house; lpInfantry->type=m_infantry.; @@ -2441,7 +2461,7 @@ void CMapData::GetInfantryData(DWORD dwIndex, INFANTRY* lpInfantry) const lpInfantry->flag3=m_infantry.; lpInfantry->flag4=m_infantry.; lpInfantry->flag5=m_infantry.;*/ - * lpInfantry = m_infantry[dwIndex]; + *lpInfantry = m_infantry[dwIndex]; //memcpy(lpInfantry, &m_infantry[dwIndex], sizeof(INFANTRY)); @@ -2470,14 +2490,14 @@ void CMapData::GetInfantryData(DWORD dwIndex, INFANTRY* lpInfantry) const } -void CMapData::GetUnitData(DWORD dwIndex, UNIT* lpUnit) const +CString CMapData::GetUnitData(DWORD dwIndex, UNIT* lpUnit) const { auto const& section = m_mapfile.GetSection("Units"); if (dwIndex >= section.Size()) { - return; + return {}; } - auto const& data = section.Nth(dwIndex).second; + auto const& [id, data] = section.Nth(dwIndex); lpUnit->house = GetParam(data, 0); lpUnit->type = GetParam(data, 1); @@ -2493,16 +2513,18 @@ void CMapData::GetUnitData(DWORD dwIndex, UNIT* lpUnit) const lpUnit->flag4 = GetParam(data, 11); lpUnit->flag5 = GetParam(data, 12); lpUnit->flag6 = GetParam(data, 13); + + return id; } -void CMapData::GetAircraftData(DWORD dwIndex, AIRCRAFT* lpAircraft) const +CString CMapData::GetAircraftData(DWORD dwIndex, AIRCRAFT* lpAircraft) const { auto const& section = m_mapfile.GetSection("Aircraft"); if (dwIndex >= section.Size()) { - return; + return {}; } - auto const& data = section.Nth(dwIndex).second; + auto const& [id, data] = section.Nth(dwIndex); lpAircraft->house = GetParam(data, 0); lpAircraft->type = GetParam(data, 1); @@ -2516,6 +2538,8 @@ void CMapData::GetAircraftData(DWORD dwIndex, AIRCRAFT* lpAircraft) const lpAircraft->group = GetParam(data, 9); lpAircraft->flag3 = GetParam(data, 10); lpAircraft->flag4 = GetParam(data, 11); + + return id; } BOOL CMapData::AddCelltag(LPCTSTR lpTag, DWORD dwPos) @@ -2583,10 +2607,10 @@ BOOL CMapData::AddAircraft(AIRCRAFT* lpAircraft, LPCTSTR lpType, LPCTSTR lpHouse aircraft.flag4 = "0"; } - CString id = GetFree("Aircraft"); + CString id = suggestedID; - if (!suggestedID.IsEmpty() && !m_mapfile["Aircraft"].Exists(suggestedID)) { - id = suggestedID; + if (suggestedID.IsEmpty() || m_mapfile["Aircraft"].Exists(suggestedID)) { + id = GetFree("Aircraft"); } CString value; @@ -2594,7 +2618,7 @@ BOOL CMapData::AddAircraft(AIRCRAFT* lpAircraft, LPCTSTR lpType, LPCTSTR lpHouse aircraft.x + "," + aircraft.direction + "," + aircraft.action + "," + aircraft.tag + "," + aircraft.flag1 + "," + aircraft.group + "," + aircraft.flag3 + "," + aircraft.flag4; - m_mapfile.SetString("Aircraft", id, value); + m_mapfile.AddSection("Aircraft").InsertOrAssign(id, value); if (!m_noAutoObjectUpdate) { UpdateAircraft(FALSE); @@ -2631,10 +2655,10 @@ BOOL CMapData::AddUnit(UNIT* lpUnit, LPCTSTR lpType, LPCTSTR lpHouse, DWORD dwPo } - CString id = GetFree("Units"); + CString id = suggestedID; - if (!suggestedID.IsEmpty() && !m_mapfile["Units"].Exists(suggestedID)) { - id = suggestedID; + if (suggestedID.IsEmpty() || m_mapfile["Units"].Exists(suggestedID)) { + id = GetFree("Units"); } CString value; @@ -2642,7 +2666,7 @@ BOOL CMapData::AddUnit(UNIT* lpUnit, LPCTSTR lpType, LPCTSTR lpHouse, DWORD dwPo unit.x + "," + unit.direction + "," + unit.action + "," + unit.tag + "," + unit.flag1 + "," + unit.group + "," + unit.flag3 + "," + unit.flag4 + "," + unit.flag5 + "," + unit.flag6; - m_mapfile.SetString("Units", id, value); + m_mapfile.AddSection("Units").InsertOrAssign(id, value); if (!m_noAutoObjectUpdate) { UpdateUnits(FALSE); diff --git a/MissionEditor/MapData.h b/MissionEditor/MapData.h index 1d76ed3..c6af5e1 100644 --- a/MissionEditor/MapData.h +++ b/MissionEditor/MapData.h @@ -251,8 +251,8 @@ public: BOOL AddAircraft(AIRCRAFT* lpAircraft, LPCTSTR lpType = NULL, LPCTSTR lpHouse = NULL, DWORD dwPos = 0, CString suggestedID = ""); void GetCelltagData(DWORD dwIndex, CString* lpTag, DWORD* lpdwPos) const; BOOL AddCelltag(LPCTSTR lpTag, DWORD dwPos); - void GetAircraftData(DWORD dwIndex, AIRCRAFT* lpAircraft) const; - void GetUnitData(DWORD dwIndex, UNIT* lpUnit) const; + CString GetAircraftData(DWORD dwIndex, AIRCRAFT* lpAircraft) const; + CString GetUnitData(DWORD dwIndex, UNIT* lpUnit) const; void GetInfantryData(DWORD dwIndex, INFANTRY* lpInfantry) const; void GetStdInfantryData(DWORD dwIndex, STDOBJECTDATA* lpStdInfantry) const; INT GetUnitTypeID(LPCTSTR lpType); @@ -261,7 +261,7 @@ public: BOOL AddInfantry(INFANTRY* lpInfantry, LPCTSTR lpType = NULL, LPCTSTR lpHouse = NULL, DWORD dwPos = 0, int suggestedIndex = -1); BOOL AddNode(NODE* lpNode, WORD dwPos); void GetStdStructureData(DWORD dwIndex, STDOBJECTDATA* lpStdStructure) const; - void GetStructureData(DWORD dwIndex, STRUCTURE* lpStructure) const; + CString GetStructureData(DWORD dwIndex, STRUCTURE* lpStructure) const; BOOL AddWaypoint(CString lpID, DWORD dwPos); void DeleteNode(LPCTSTR lpHouse, DWORD dwIndex); diff --git a/MissionEditor/Structs.h b/MissionEditor/Structs.h index c90753d..5644d33 100644 --- a/MissionEditor/Structs.h +++ b/MissionEditor/Structs.h @@ -34,6 +34,16 @@ class MapTool; +enum class MouseActionType : unsigned { + AddInfantry = 1, + AddStructure = 2, + AddAircraft = 3, + AddVehicle = 4, + AddTerrain = 5, + ManageOverlay = 6, + ChangeOwner = 7, + AddSmudge = 8, +}; enum class TheaterChar : char {