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(); } }
void MissionCopy(Mission *dst, Mission *src) { MissionTerminate(dst); MissionInit(dst); if (src->Title) { CSTRDUP(dst->Title, src->Title); } if (src->Description) { CSTRDUP(dst->Description, src->Description); } dst->Type = src->Type; dst->Size = src->Size; dst->WallStyle = src->WallStyle; dst->FloorStyle = src->FloorStyle; dst->RoomStyle = src->RoomStyle; dst->ExitStyle = src->ExitStyle; dst->KeyStyle = src->KeyStyle; dst->DoorStyle = src->DoorStyle; CArrayCopy(&dst->Objectives, &src->Objectives); for (int i = 0; i < (int)src->Objectives.size; i++) { MissionObjective *smo = CArrayGet(&src->Objectives, i); MissionObjective *dmo = CArrayGet(&dst->Objectives, i); if (smo->Description) { CSTRDUP(dmo->Description, smo->Description); } } CArrayCopy(&dst->Enemies, &src->Enemies); CArrayCopy(&dst->SpecialChars, &src->SpecialChars); CArrayCopy(&dst->Items, &src->Items); CArrayCopy(&dst->ItemDensities, &src->ItemDensities); dst->EnemyDensity = src->EnemyDensity; CArrayCopy(&dst->Weapons, &src->Weapons); memcpy(dst->Song, src->Song, sizeof dst->Song); dst->WallColor = src->WallColor; dst->FloorColor = src->FloorColor; dst->RoomColor = src->RoomColor; dst->AltColor = src->AltColor; switch (dst->Type) { case MAPTYPE_STATIC: CArrayCopy(&dst->u.Static.Tiles, &src->u.Static.Tiles); CArrayCopy(&dst->u.Static.Items, &src->u.Static.Items); CArrayCopy(&dst->u.Static.Wrecks, &src->u.Static.Wrecks); CArrayCopy(&dst->u.Static.Characters, &src->u.Static.Characters); CArrayCopy(&dst->u.Static.Objectives, &src->u.Static.Objectives); CArrayCopy(&dst->u.Static.Keys, &src->u.Static.Keys); dst->u.Static.Start = src->u.Static.Start; dst->u.Static.Exit = src->u.Static.Exit; break; default: memcpy(&dst->u, &src->u, sizeof dst->u); break; } }