I've updated the doc to reflect fixes in the following patches:
- https://www.ea.com/en-gb/games/the-sims/news/sims-legacy-and-the-sims-2-legacy-patch-notes-04-02
- https://www.ea.com/en-gb/games/the-sims/news/sims-legacy-and-the-sims-2-legacy-patch-notes-06-02
The Sims is a life simulation game that was written for Windows 9x but later evolved to properly support Windows XP. The years have not been kind... to the game engine, not the game itself. It's still great, it just doesn't really work anymore.
This gist will detail the changes I noticed in The Sims Legacy Collection, a "Windows 10/11 re-release" of The Sims recently published on Steam, the Epic Games store and the EA app. I'll start by giving more context before going into what's changed.
The entire game is played from an isometric viewpoint, with 3D characters interacting with 2D sprites seamlessly. This is done via a neat trick - nearly every sprite has an associated z-buffer sprite, which allows per-pixel depth sorting between objects and characters to seamlessly integrate them into the world.
All sprites also have an alpha channel, which allows them to appear anti-aliased and semi-transparent. This does mean they have to be sorted, which sometimes goes wrong, but gives a pretty clean image.
The game's large sprites are contained within a minimal amount of memory via a combination of run-length encoding and 256 colour palettes. Alpha channels have separate RLE, which is great for large objects where the only alpha pixels are on their edge.
Large objects that take up more than one tile are split up into single tile parts, each taking up one tile. The renderer needs to avoid introducing seams between the single tile parts, or the illusion will be broken.
With that out of the way, let's go over the problems with the original game...
The Sims can be launched either in 800x600 or 1024x768 resolution from a shortcut, which passes the -r1024x768
flag as an argument to launch in the larger resolution. For anything else, you need to mod the game and UI graphics. You can find information on how to do this alongside other fixes on the PC Gaming Wiki:
https://www.pcgamingwiki.com/wiki/The_Sims
The rendering relies heavily on a mixture of d3d6 and directdraw hacks. It renders characters using d3d6, but the architecture, terrain and objects use software rendering. It tries to avoid redrawing parts of the screen that haven't changed since the last frame using dirty rectangles. The game can render sprites directly from the RLE format with palette lookup, without having to decompress to a raw bitmap. Looks great, but is a bit heavy on the CPU at high resolutions.
Here's a short list of technical problems with this release on modern Windows 10/11:
- Alt-tabbing in full screen breaks the game in some pretty wild ways.
- Requires admin rights to read/write save data, as it's placed in the game directory.
- Unusually slow.
Over the years, there have been issues introduced and fixed by changes to Windows. It's surprisingly OK right now if you don't alt-tab or run Windowed, but earlier versions of Windows 10 didn't work with full screen at all, and people report a variety of issues that I don't personally see to this day.
Comparisons from here on will be done against Complete Collection running using Windows 11 23H2 directdraw with no compatibility layer, with the game at 1080p windowed.
For a start, the Steam version of the game now uses Steam DRM, so trying to open the EXE directly just tells Steam to open it instead. It makes attaching with RenderDoc a bit annoying, but if you're fast enough you can inject the process before it creates the Vulkan device.
gibbed has helpfully commented that you can add steam_appid.txt
containing the game's appid (3314060) to the game's folder and it won't immediately close on launch. This makes it a lot easier to attach renderdoc and pals.
Instead of being located in the install directory, save data is now at %HOME%Saved Games\Electronic Arts\The Sims 25
. On first launch, it copies UserData and UserData2 through 8 to this folder. This solves a lot of problems by itself.
The game doesn't support Steam Cloud saves, which is unfortunate. Maybe there are complications around the huge amount of data, or worries about sharing save between devices with mismatching mods/downloads folders. A second downloads folder could also be included in the cloud save, but then it could really be too large. Quotas seem to be able to go pretty high, though.
Also, the game no longer creates or relies on any entries in the Windows Registry. Not sure how I'm going to get Simitone to find it, I guess I'll have to ask Steam nicely.
The game automatically attempts to match your resolution on launch. Well, mostly. See the DPI scaling section for more details. This works similar to patching Ultimate Collection to display at a higher resolution, but some things have not been properly handled.
When you choose to call transport to a sub-hood like downtown or old town, the game opens a dialog that you can use to choose a destination. You can't normally tell it's a dialog without mods, as it should cover the entire screen. Modding the resolution to be higher causes some unexpected things to happen.
These dialogs have always had visual issues when modding the game to run at higher resolutions, but in this case the problems seem to run deeper. I can't select any of the properties at the bottom right of the neighbourhood - past the 1024x768 point from the top left of my screen. For example: 71 Elm Street, highlighted in the screenshot below.
Here's how all the dialogs fare:
- Downtown: Graphic stuck top left, selection works fine.
- Vacation: Graphic stuck top left, selection works fine.
- Old Town: Graphic stuck top left, can't select all properties...
- Studio Town: Graphic and selection work fine.
- Magic Town: Graphic and selection work fine.
In all cases, the current lot is visible behind the selection dialog.
Properly modding Ultimate Collection to 1080p currently avoids all of these issues:
The latest version of the game fixes these dialogs and draws covers the lot view with a black rectangle:
A large issue with running The Sims: Complete Collection at higher resolutions was that the panel graphics didn't cover the whole screen, leaving a part of the screen that was never painted and could accumulate a lot of garbage over time.
The legacy collection solution to this problem appears to be to stretch the panel background to cover the whole screen. This causes a few visual issues:
A few UI graphics don't use transparency, and instead contain a copy of the background that's normally behind them. Stretching the background misaligns the gradient between the buttons and the panel. This is probably the most noticable issue in the game.
Some UI graphics assume that the background will be a certain colour to clear a graphic without redrawing the background. The motive decay indicators are a good example of this - the dark blue arrows aren't normally visible.
This should be solved by only scaling the dark blue part of the panel graphic. The left part with the gradient should always be unstretched. Complete Collection mods do this by just duplicating the blue part of the panel graphic to the edge of the expected screen resolution, with the right edge also unstretched.
For comparison, here's how it looks in Complete Collection with a 1080p mod:
The latest version of the game fixes this issue in all ingame panels. Both the left gradient and rightmost bezel are not scaled, the solid blue section is.
This was only listed as "The mood level arrows and mood bars had visual artifacts in some cases", but it affects every panel in the game, so I think they're underselling it a bit.
They also fixed a visual issue with the overall mood indicator that was there in the original Complete Collection. See if you can spot it.
When the game launches, it forces a resolution match with the default display on your system, and selects a target resolution scale depending on it. At 1080p or lower, everything is 1x resolution and should look the same as the original game. At higher resolutions, such as 1440p (2x) or 4K (3x), the game will attempt to scale both ingame and UI graphics to avoid everything being tiny. Here's what it looks like at 4K:
This is done in such a way that 3D elements in the game (sims, roofs) are rendered at your native resolution, and sprites and the UI are scaled up to match.
At 4K DPI, this causes each sprite pixel to be tripled in both axis, with some odd exceptions. It's like playing at 720p, but with much sharper looking sims.
Interestingly, when zooming out with res scale active, the game will prefer to use the near view sprites... for everything except pools. This keeps things sharper when zooming out compared to playing at 720p, though with the 3x scale at 4K, the middle zoom is a 1.5x zoom, which introduces some ugly pixel scaling.
See Point Filtering and Non-Integer scaling section for the full example.
Pressing Alt+Enter cycles between modes:
- Windowed modes
- A windowed mode for each available res scale.
- At 1080p or lower, you'll only have 1x.
- At 1440p, you'll have 1x and 2x.
- At 4K, you'll have 1x, 2x and 3x.
- A windowed mode for each available res scale.
- Fullscreen mode
- Picks the highest scale for the mode, and fills the screen.
Here's what a 2x window looks like on a 4K screen:
Supposedly, you can control which screen the game chooses its resolution with using -monitor:<num>
. It didn't really work for me with two displays at 1080p and 4K.
This is undoubtedly the biggest change in the entire Legacy Collection pack. The Sims 1 now renders using the Vulkan API. This explains the new minimum requirements for the game:
https://help.ea.com/en/help/the-sims/the-sims-legacy-collection/the-sims-minimum-requirements/
At a glance, these GPUs should be far beyond the minimum spec The Sims 1 requires - it was released in 2000, after all. For all three vendors, the listed GPUs are their earliest GPUs that officially support the Vulkan API.
So, the biggest difference here is that everything you see onscreen is now GPU accelerated, and displaying with 24-bit colour depth instead of 16-bit.
All ingame sprites are loaded as uncompressed RGBA8 textures, which no-doubt costs more memory than before, but allows them to be rendered directly by the GPU with hardware accelerated depth testing seamlessly between sprites with depth buffers and 3D elements.
Depth is written by combining the depth value in the sprite with a depth offset, and writing to gl_FragDepth. Certain elements like floor tiles and shadows calculate depth in as vertex output rather than using a sprite.
Here's a breakdown of a frame in the legacy collection:
- Game render texture:
- Floor 1:
- Draw all floor tile sprites back to front - no batching.
- While drawing floor tiles one by one, both the terrain and grass overlay occasionally submit batches of 512 triangles.
- Draw grass edges when the top of a grass tile goes onto tiled floor
- Draw wall/fence sprites back to front
- Draw "static" object sprites back to front
- Draw all floor tile sprites back to front - no batching.
- Floor 2:
- Draw wall/fence sprites back to front
- Draw all floor tile sprites and "static" objects back to front
- Draw roofs
- Draw sims
- Draw "dynamic" sprite elements back to front
- Sprites that have changed graphic recently are drawn here, sprites that overlap them, and in some other situations.
- Floor 1:
- Draw certain UI containers at 1x in their own render textures
- UCP (the thing at the bottom left)
- Interaction queue buttons
- UI containers that are semitransparent
- Main texture
- Draw game texture onto main texture
- Draw UI onto main texture (scaled)
- Draw main texture onto backbuffer
This is a great step forward for the performance and compatibility of The Sims 1 moving into the future, and as a faithful recreation it's a good sign that nobody thought that anything had changed. However, as cool as it is, there are a bunch of issues that need resolved to make this version of the game a good replacement for the original.
This is an NVIDIA driver bug. To workaround this issue, change "Vulkan/OpenGL present method" to "Prefer native" in the NVIDIA Control Panel.
For some reason, lines of pixels are getting swapped when running the game on an NVIDIA GPU. Here's an example from the loading screen, at 1080p:
The right edge of the "I" in Sims has some pixels jumbled for some reason. What's odd is that they're jumbled as if they're being sampled wrong, as the swapped lines are two pixels wide at the output resolution of 1080p.
At 2x and 3x scales, a lot of UI elements appear to have pixels swap position, creating the weird edges you see in the motives and some of the buttons. Curiously, this doesn't happen when replaying a RenderDoc capture of the same frame:
It also doesn't happen when the UI panel is fading in/out, as it's drawn to a 1x texture before being drawn here. It also disappears if you take a screenshot with Steam instead of Windows... Broken UI elements get affected by dragging a semitransparent dialog box on top of them. Overall, very confusing.
This doesn't happen on the RDNA2 windows driver, either. I have an RTX 4070 SUPER - not sure if it also happens on earlier NVIDIA GPUs or just the newer ones.
I'm not sure what's causing this. It's possible that it's a UV precision error exaggerated by the point sampling, but I'm not sure why it would cause problems that disappear on inspection. The only odd thing is using vkCmdClearColorImage
and vkCmdClearDepthStencilImage
immediately before use in a render pass instead of clear load op, but this shouldn't cause anything to break if the barriers are correct - it's just a bit slow.
This appears to be an issue when Vulkan/OpenGL present mode is layered on DXGI swapchain instead of native. Hopefully either NVIDIA fix this at the driver level or EA ship some kind of workaround to stop it from doing this.
The game upscales UI graphics and sprites using point filtering. This is likely done to avoid introducing seams between conjoined UI elements, floor tiles and multitile object parts. This is a reasonable choice to make for this game, as accidentally introducing tile seams on every large object would ruin the visuals completely.
The biggest problem is when the scale isn't an integer factor. For example, 1.5x. The easiest way to encounter this look is to run the game at 4K, which uses a base scale of 3x, then go to the medium zoom level. Far zoom level will get you 0.75x.
There is a configuration where you can break the whole game to run at a fractional scale, UI and all. With two monitors, your main running at 1080p and second running at 1440p, start the game windowed, and move it over to the 1440p monitor.
Try and fullscreen it - you'll get an option to play with a black border, and one at 1.5x fractional resolution scale. The second probably shouldn't be allowed at all, given how it looks. Even the UI will have uneven pixel scaling:
The lighting in Legacy Collection is a close match for the original game in both visuals and limitations.
Lighting is performed in the fragment shader when drawing tiles / walls. There are shader variants for a tile or wall being lit by zero, one or two point light sources. Tile draws potentially swapping between light counts and locations could be the reason why they are not batched.
Let's start with the good - 24-bit colour makes lighting look a lot smoother:
In more complex situations, we can see the 2-light limit causing some visual issues. This is a match for the original game:
Interestingly, the new renderer supports light falloffs on diagonal walls, while the original simply shades with the room's ambient light colour.
...and as always, lighting can't affect objects or terrain:
It's impressive how much cleaner it looks, while still having the same aesthetic. Would be nice if it could affect objects and terrain, though that might require larger engine changes, and make the 2 light limit more obvious.
In the original game, terrain rendered at reduced resolution, 16-bit colour with basic dithering, with grass then drawn on top line by line. In legacy collection, the terrain is drawn as a 3D mesh directly into the render area at full res + colour depth. A big benefit of this is that the edges of the property exhibit much less stairstepping. Yes, really. The higher colour bit depth also reduces banding artifacts, most visible when grass blades are disabled:
The grass on top is a bit more complicated. In the original game, grass blades were placed at specific points in the terrain, and draw lines pointing directly up with length and colour based on liveness that varies per vertex on the terrain.
In legacy collection, the grass is simply drawn using a mesh similar to the terrain. They avoid placing grass blades individually by using a looping texture that encodes liveness thresholds + colour modifiers, and a colour lookup texture:
It's sampled using gl_FragCoord plus a scroll offset, meaning it's positioned relative to the screen rather than in 3D. There's a different version for medium and far zooms that looks more like noise than grass.
At near zoom, the game additionally draws grass edges on any grass-tile boundary so that it actually looks like grass instead of a rather convincing carpet:
This has another special repeating texture with liveness thresholds and colouring:
Amusingly, there's a toggle in the graphics options for Terrain Detail that changes how much grass is drawn, with the main goal being improved performance. Unlike the Character Detail option that was removed, Terrain Detail still functions largely the same, where medium draws less grass, and low doesn't draw any. With this new texture based strategy for drawing grass, the medium option won't actually be any faster, and the low option will barely be faster.
While everything else seems to scale appropriately with the new DPI change, the grass does not. To better demonstrate this point, here's the grass at 1x, 2x and 3x scales, scaled down to be the same resolution for comparison:
All of these images should be the same, but the grass appears to get shorter and thinner as the scale increases. This is because the grass always draws at the same pixel size, no matter what the scale is.
Here's the opposite comparison, where I've upscaled smaller scales to show what the grass should look like in relation to the sprite graphics.
The grass shader currently samples the repeating texture with the fragment coordinate directly - it should be divided by the same factor as the sprites. At fractional scales this will cause the same visual issues as floor and object sprites, but those should be resolved separately anyways.
Medium zoom at 3x scale also defaults to using the medium 1x scale grass, which just looks like noise. The sprites have a lot more care and attention in this regard.
The grid also always draws with single pixel dots. It might be harder to implement, but it should be thicker when rendering at a higher resolution, as it becomes a lot harder to see:
I would argue this is a bit less important than the grass, but it did get me while testing as it was hard to accurately place things on terrain.
Character animation appears to be done entirely on the CPU, with the Vulkan side of things essentially transforming and lighting static meshes in the vertex shader. There's a lot of room for improvement here - these could be skinned on the GPU to free up some CPU time and allow interpolation. I haven't seen any performance issues yet, so it's probably fine as is.
The EA video that plays when the game is launched presents at 4:3 and forces fullscreen for some reason. It has the annoying tendency to competely freeze, and force you to alt-tab away and back before the game's loading screen finally runs (as a black screen).
We get it, you published The Sims. I'd be happy about it too. One second should be enough.
Here's what far zoom pools look like at 3x when placed next to a regular floor tile:
Curiously, with the pool tool selected in Build Mode, the issue temporarily disappears:
There are a few differences that I would say don't really break anything, but are still noteworthy.
The new method of rendering the grass with a texture instead of individual blades means that the grass is positioned using only the screen position in pixels. It doesn't take terrain into account, meaning that it appears to stay in place as you alter the terrain.
terraincc.mp4
terrainlc.mp4
With the right combination of rooms and floor tiles on the top level, you can break the game's autoroof algorithm. The original game built roofs out of quarter tiles, and when something went wrong it would just choose the same quarter tile for all roof tiles:
ccroofbreak.mp4
The new engine draws the roof using a single draw of a 3d mesh. It seems to skip drawing most of the tiles:
lcroofbreak_clip.mp4
I wouldn't expect this to ever be fixed, it's just interesting seeing it behave differently.
Sims in the default neighbourhoods like Bob, Betty and the Goths somehow ended up with all of their interest points at 0 in Complete Collection:
In legacy collection, this seems to have been corrected:
This made it really hard to make friends with any of these sims, which left a bad first impression. The values are randomized, so you'll likely see different interests for Bob from the ones I posted above.
Icon rendering is different from the original game. The biggest change seems to be the camera position, which isn't as close to the sim's head. There also doesn't appear to be any sort of antialiasing, so the image looks aliased and noisy. You can see the difference between the Legacy Collection generated thumbnail, and the thumbnails for the premade families that were made with the original game:
Complete Collection generates icons that look more like this:
Picture in picture windows appear when something of interest happens on the lot. There appear to be a few issues with it right now:
- The sim head from the Pie menu is also drawn in the PIP window, but squished. It shouldn't be drawn at all.
- The close button for the PIP window appears to be misplaced
- Changing the resolution scale with alt+enter doesn't update the PIP window, it's still at the original zoom level.
This was a problem in the original game, but it's easier to notice now that the full screen redraws every frame:
cull.mp4
You can see the tops of larger objects disappear as they scroll off the bottom of the screen. A little bit more of an allowance couldn't hurt.
Apart from fixing the obvious bugs, I think there are a few things the release needs to really bring it up to scratch, especially if they're sure they want to support DPI scaling.
I'd say this one is a bug, but it'll probably fly under the radar. I've seen this be the first thing players glance about this release of the game, and they just assume the grass is broken. In promotional screenshot thumbnails, it almost looks like it's missing entirely. When it's corrected, the game should look consistent between scales.
Right now, cases where the game and UI scale to a non-integer increment are very hard to look at... especially in the case of 1.5x scaling, where it alternates between sprite pixels being 1 pixel and two pixels wide/tall. See the section above for more examples of this actually ingame.
Here's an example of what nearest scaling looks like at 1.5x. Open image in another tab for easier cross-referencing. This image is simulated for easier comparison with the other two, so ignore the UI:
Here are some options that might work better:
The game tries to do this for the overall scale for the UI, but fails if you move it between monitors. It doesn't do it for zoom levels - it instead uses fractional scales. However, the game could try to snap to integer scales for the zoom levels, instead of always dividing by 2.
- At small resolutions, the zoom levels are 1x, 0.5x, 0.25x with special graphics for medium and far zoom.
- At 1440p, the zoom levels are 2x, 1x, 0.5x, with far zoom equalling - vanilla medium zoom.
- At 4k, the zoom levels are 3x, 1.5x, 0.75x.
- Instead of this, it could be 3x, 2x, 1x, which would avoid any fractional scale factors. As a downside, it would reduce the visiblity of the far zooms.
If the game absolutely must have fractional scaling, there needs to be a way to smooth it out a little.
Round up the target scale to the nearest integer scale, and then draw onto a larger render target scaled by the difference. When scaling up by an integer, pixel sizes are consistent, so it can then be scaled down in a way that's a bit less jarring.
For example, drawing at 1.5x scale at 3840x2160 (can be experienced right now by doing going to medium zoom) would instead try to draw 2x scale. 2160 / 1.5 is 1440, so then scaled by 2x is 5120x2880.
The upside to this is that the graphics still appear sharp, while the fractional scale looks a lot less jarring. The 3D graphics at native even gain a little bit of supersampling.
The downside to this is that the intermediate texture that the game renders to is larger than the screen, using more VRAM and power to render.
Example - 2x scale to 1.5x scale:
Similar to above, the game is rendered at an integer scale on an offscreen texture, and scaled to fit with a linear sampler when drawing to the window. However, in this case it would round down to the nearest integer scale, which uses less memory and could be done within the existing canvas by setting a smaller viewport/scissor, instead of creating a new texture.
Downside is that you don't get high resolution for characters/roofs, and that this appears considerably softer than rounding up.
Example - 1x scale to 1.5x scale:
Scorched earth approach: you don't get sharp graphics anymore. This would definitely solve all inconsistencies, but having sharp sim graphics and graphics when zooming out is a really big benefit to the new renderer.
Especially in windowed mode, this is just annoying. The game has a feature "sim in background" that lets the game continue playing itself while the focus is on another window, but it's hard to check up on things if the window immediately minimizes itself when focus is lost.
The current way to switch between scale modes using Alt+Enter is confusing and I've seen a bunch of people misinterpret what it's supposed to do. I kind of understand not wanting to modify the original user interface, but here I think there's a pretty big impact to usability, especially when the DPI scaling has huge downsides (non-integer scaling, grass scale).
The Sims 2 also shares the problem of not being able to choose a windowed size. When modding or experimenting with the game, it's useful to have it at a low resolution so that multitasking is still possible. As things are right now, small window sizes are only possible when the game's effective resolution is lowered by the screen DPI. On 1080p, it just covers the whole screen without question.
It would also be useful to be able to choose the scale you want to use when in fullscreen. Right now, the scale is forced depending on your screen resoluton, (for example, 3x scale when at 4k, with an effective game resolution of 720p) but it could be useful to choose lower scales at higher resolutions (2x at 4k) or higher scales at lower resolutions (1.5x at 1080p, if fractional scaling is improved). The blocker here is probably changing the effective game resolution dynamically ingame, but I think it would be well worth the effort to remove so much confusion.
This one's a bit of a long shot. The Sims doesn't interpolate animations up to the machine's refresh rate. FreeSO and Simitone have this, though it's due to having GPU skinning, and some special treatment for characters performing routing that also interpolates their position and rotation. In The Sims, object and character positions are measured in 16th tiles, so movement at odd angles can appear jittery without hacking a more precise visual position in.
It can be argued that part of the original game's charm is in how the animations and movement look due to these limitations, so it's likely this won't be changed. We dare to dream, though...
When you open any lot for the first time in a neighbourhood, you're bombarded with messages telling you about every expansion that was ever released for The Sims.
These were intended to bring attention to the new features right after the user installed a new pack, but all they do now is immediately overwhelm people with too much information. If you back out and don't save the game, it does it again on your next session.
please 😇
There are likely more differences and quirks that I haven't yet spotted... or just didn't have time to go into detail about. I'll update this gist if anything new is found or if there are updates to the game.
Overall, I'm pretty impressed with the amount of work that went into this, but it clearly needs work to get it up to scratch... dubbing it a "re-release" instead of a "remaster" doesn't absolve you of all responsibility. With some work, this could easily be the definitive version of The Sims.
You can side-step any "Steam DRM" issues with the game launching through Steam by either creating a file named
steam_appid.txt
with the game's app id as its sole contents or set the environment variableSteamAppId
with the same before launching the executable.