void MissionStaticLayout(Mission *m, Vec2i oldSize) { assert(m->Type == MAPTYPE_STATIC && "invalid map type"); // re-layout the static map after a resize // The mission contains the new size; the old dimensions are oldSize // Simply try to "paint" the old tiles to the new mission Vec2i v; CArray oldTiles; CArrayInit(&oldTiles, m->u.Static.Tiles.elemSize); CArrayCopy(&oldTiles, &m->u.Static.Tiles); // Clear the tiles first CArrayTerminate(&m->u.Static.Tiles); CArrayInit(&m->u.Static.Tiles, oldTiles.elemSize); for (v.y = 0; v.y < m->Size.y; v.y++) { for (v.x = 0; v.x < m->Size.x; v.x++) { unsigned short tile = MAP_FLOOR; CArrayPushBack(&m->u.Static.Tiles, &tile); } } // Paint the old tiles back for (v.y = 0; v.y < m->Size.y; v.y++) { for (v.x = 0; v.x < m->Size.x; v.x++) { if (v.x >= oldSize.x || v.y >= oldSize.y) { MissionTrySetTile(m, v, MAP_NOTHING); } else { int idx = v.y * oldSize.x + v.x; unsigned short *tile = CArrayGet(&oldTiles, idx); MissionTrySetTile(m, v, *tile); } } } CArrayTerminate(&oldTiles); if (m->u.Static.Start.x >= m->Size.x || m->u.Static.Start.y >= m->Size.y) { m->u.Static.Start = Vec2iZero(); } }
static void SetTile(Mission *m, Vec2i pos, unsigned short tile) { if (MissionTrySetTile(m, pos, tile)) { MapSetTile(&gMap, pos, tile, m); } }