Skip to content

Commit

Permalink
Fix worldmap position calculation
Browse files Browse the repository at this point in the history
Closes #192
  • Loading branch information
alexbatalov committed Nov 7, 2022
1 parent c692fc9 commit 3ec827d
Showing 1 changed file with 22 additions and 5 deletions.
27 changes: 22 additions & 5 deletions src/worldmap.cc
Original file line number Diff line number Diff line change
Expand Up @@ -849,6 +849,15 @@ int wmWorldMap_init()
gTownMapHotkeysFix = true;
configGetBool(&gSfallConfig, SFALL_CONFIG_MISC_KEY, SFALL_CONFIG_TOWN_MAP_HOTKEYS_FIX_KEY, &gTownMapHotkeysFix);

// CE: City size fids should be initialized during startup. They are used
// during |wmTeleportToArea| to calculate worldmap position when jumping
// from Temple to Arroyo - before giving a chance to |wmInterfaceInit| to
// initialize it.
for (int citySize = 0; citySize < CITY_SIZE_COUNT; citySize++) {
CitySizeDescription* citySizeDescription = &(wmSphereData[citySize]);
citySizeDescription->fid = buildFid(OBJ_TYPE_INTERFACE, 336 + citySize, 0, 0, 0);
}

return 0;
}

Expand Down Expand Up @@ -4469,11 +4478,7 @@ static int wmInterfaceInit()

for (int citySize = 0; citySize < CITY_SIZE_COUNT; citySize++) {
CitySizeDescription* citySizeDescription = &(wmSphereData[citySize]);

fid = buildFid(OBJ_TYPE_INTERFACE, 336 + citySize, 0, 0, 0);
citySizeDescription->fid = fid;

if (!citySizeDescription->frmImage.lock(fid)) {
if (!citySizeDescription->frmImage.lock(citySizeDescription->fid)) {
return -1;
}
}
Expand Down Expand Up @@ -6540,9 +6545,21 @@ int wmTeleportToArea(int areaIdx)
// locations.
// CE: See `wmWorldMapFunc` for explanation.
CitySizeDescription* citySizeDescription = &(wmSphereData[city->size]);

// CE: This function might be called outside |wmWorldmapFunc|, so it's
// image might not be locked.
bool wasLocked = citySizeDescription->frmImage.isLocked();
if (!wasLocked) {
citySizeDescription->frmImage.lock(citySizeDescription->fid);
}

wmGenData.worldPosX = city->x + citySizeDescription->frmImage.getWidth() / 2 - WM_VIEW_X;
wmGenData.worldPosY = city->y + citySizeDescription->frmImage.getHeight() / 2 - WM_VIEW_Y;

if (!wasLocked) {
citySizeDescription->frmImage.unlock();
}

return 0;
}

Expand Down

0 comments on commit 3ec827d

Please sign in to comment.