Replace hand-coded cabinet/lever/icons with real generated art

The user generated actual 3D-rendered assets (cabinet frame, lever,
reel-symbol sprite sheet) via an image model - swaps out the
StyleBoxFlat-approximated cabinet, Tween-animated marquee lights/glow,
and gradient-SVG icons from the last pass for the real thing.

The generated PNGs had no real alpha channel (a baked checkerboard
pattern standing in for transparency, a known limitation of some
image-gen output) - added a flood-fill background remover (BFS from
the image border, matching near-white/grey checkerboard tones) to
produce genuinely transparent PNGs, then sliced the sprite sheet into
6 individual icons and measured the cabinet's empty reel-window
rect as a fraction of the frame image so the real 3x3 reel grid and
lever can be positioned precisely over the static art via anchors.

Verified with actual rendered screenshots at each step (window
alignment, then lever sizing/position) rather than just structural
checks, since this is exactly the kind of thing that looks fine in
code and wrong on screen.
This commit is contained in:
hz
2026-07-30 04:06:35 -05:00
parent 0bd74fcabf
commit 3fd670d111
25 changed files with 237 additions and 388 deletions
-18
View File
@@ -1,18 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">
<defs>
<radialGradient id="coinBody" cx="35%" cy="30%" r="75%">
<stop offset="0%" stop-color="#fff6d8"/>
<stop offset="35%" stop-color="#ffd447"/>
<stop offset="75%" stop-color="#f5a623"/>
<stop offset="100%" stop-color="#c9780a"/>
</radialGradient>
<linearGradient id="coinRim" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#8a5a08"/>
<stop offset="100%" stop-color="#c9780a"/>
</linearGradient>
</defs>
<circle cx="32" cy="35" r="27" fill="url(#coinRim)"/>
<circle cx="32" cy="31" r="27" fill="url(#coinBody)"/>
<path d="M32 16 L36.5 26.5 48 27.5 39 35 41.8 46.5 32 40 22.2 46.5 25 35 16 27.5 27.5 26.5Z" fill="#fff8e6" opacity="0.95"/>
<ellipse cx="22" cy="19" rx="9" ry="5" fill="#ffffff" opacity="0.35"/>
</svg>

Before

Width:  |  Height:  |  Size: 878 B

-17
View File
@@ -1,17 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">
<defs>
<linearGradient id="stackTop" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#bfe0ff"/>
<stop offset="100%" stop-color="#2f80ff"/>
</linearGradient>
<linearGradient id="stackSide" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#1c56c9"/>
<stop offset="100%" stop-color="#123a8a"/>
</linearGradient>
</defs>
<path d="M14 46c0 4 8 7 18 7s18-3 18-7v-6c0 4-8 7-18 7s-18-3-18-7Z" fill="url(#stackSide)"/>
<ellipse cx="32" cy="40" rx="18" ry="7" fill="url(#stackTop)"/>
<path d="M14 34c0 4 8 7 18 7s18-3 18-7v-6c0 4-8 7-18 7s-18-3-18-7Z" fill="url(#stackSide)"/>
<ellipse cx="32" cy="28" rx="18" ry="7" fill="url(#stackTop)"/>
<ellipse cx="27" cy="25" rx="5" ry="2" fill="#ffffff" opacity="0.5"/>
</svg>

Before

Width:  |  Height:  |  Size: 867 B

@@ -1,43 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://copvrhhf0dqrw"
path="res://.godot/imported/slot_coin_stack.svg-a487fa07707da958c28fb0906d3edd11.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/icons/slots/slot_coin_stack.svg"
dest_files=["res://.godot/imported/slot_coin_stack.svg-a487fa07707da958c28fb0906d3edd11.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false
-21
View File
@@ -1,21 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">
<defs>
<linearGradient id="gemTop" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="#e6d6ff"/>
<stop offset="100%" stop-color="#9b6bff"/>
</linearGradient>
<linearGradient id="gemLeft" x1="0" y1="0" x2="1" y2="0">
<stop offset="0%" stop-color="#c9a6ff"/>
<stop offset="100%" stop-color="#7c3fe0"/>
</linearGradient>
<linearGradient id="gemRight" x1="0" y1="0" x2="1" y2="0">
<stop offset="0%" stop-color="#7c3fe0"/>
<stop offset="100%" stop-color="#5222a8"/>
</linearGradient>
</defs>
<path d="M14 22 L32 8 L50 22 L44 22 L32 14 L20 22Z" fill="url(#gemTop)"/>
<path d="M14 22 L28 22 L20 50Z" fill="url(#gemLeft)"/>
<path d="M50 22 L36 22 L44 50Z" fill="url(#gemRight)"/>
<path d="M28 22 L36 22 L32 50Z" fill="url(#gemTop)"/>
<path d="M14 22 L50 22 L44 22 L32 14 L20 22Z" fill="#f4ecff" opacity="0.5"/>
</svg>

Before

Width:  |  Height:  |  Size: 976 B

-14
View File
@@ -1,14 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">
<defs>
<linearGradient id="giftBody" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#ffe08a"/>
<stop offset="100%" stop-color="#d99a1b"/>
</linearGradient>
</defs>
<rect x="12" y="26" width="40" height="30" rx="3" fill="url(#giftBody)" stroke="#8a5a08" stroke-width="1.5"/>
<rect x="10" y="18" width="44" height="10" rx="3" fill="#ffcf4d" stroke="#8a5a08" stroke-width="1.5"/>
<rect x="28" y="18" width="8" height="38" fill="#e0432c"/>
<path d="M24 18c-6-2-9-8-4-12 5-3 10 4 8 12Z" fill="#e0432c"/>
<path d="M40 18c6-2 9-8 4-12-5-3-10 4-8 12Z" fill="#e0432c"/>
<ellipse cx="20" cy="34" rx="5" ry="3" fill="#ffffff" opacity="0.35"/>
</svg>

Before

Width:  |  Height:  |  Size: 771 B

-12
View File
@@ -1,12 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">
<defs>
<linearGradient id="flaskGlass" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#baf7d6"/>
<stop offset="100%" stop-color="#22c55e"/>
</linearGradient>
</defs>
<path d="M26 6h12v14l12 24a6 6 0 0 1-5.4 8.6H19.4A6 6 0 0 1 14 44l12-24Z" fill="url(#flaskGlass)" stroke="#0f7a3a" stroke-width="2"/>
<rect x="24" y="4" width="16" height="6" rx="2" fill="#0f7a3a"/>
<path d="M33 26 27 38h5l-3 10 9-14h-5Z" fill="#ffffff" opacity="0.9"/>
<ellipse cx="22" cy="36" rx="4" ry="10" fill="#ffffff" opacity="0.25"/>
</svg>

Before

Width:  |  Height:  |  Size: 643 B

-43
View File
@@ -1,43 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ckm4ojjcs7ieq"
path="res://.godot/imported/slot_potion.svg-9999b1edd902aa62dc18a3a287a24a1b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/icons/slots/slot_potion.svg"
dest_files=["res://.godot/imported/slot_potion.svg-9999b1edd902aa62dc18a3a287a24a1b.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false
-12
View File
@@ -1,12 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">
<defs>
<linearGradient id="shieldBody" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#7fb4ff"/>
<stop offset="55%" stop-color="#2563eb"/>
<stop offset="100%" stop-color="#12377a"/>
</linearGradient>
</defs>
<path d="M32 4 52 12v16c0 16-9 26-20 32C21 54 12 44 12 28V12Z" fill="url(#shieldBody)" stroke="#0b1f4d" stroke-width="1.5"/>
<path d="M32 4 52 12v6L32 10 12 18v-6Z" fill="#ffffff" opacity="0.25"/>
<path d="M24 30h16v6l-8 10-8-10Z" fill="#ffffff" opacity="0.9"/>
</svg>

Before

Width:  |  Height:  |  Size: 609 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://uwdmiagx2i0m"
path="res://.godot/imported/slot_gem.svg-3de6fe2b7f75e9c8cb236d31df99300e.ctex"
uid="uid://jwyvc10c44uu"
path="res://.godot/imported/cabinet_frame.png-97e2b6084ba7b318c962ef3eba634aa6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/icons/slots/slot_gem.svg"
dest_files=["res://.godot/imported/slot_gem.svg-3de6fe2b7f75e9c8cb236d31df99300e.ctex"]
source_file="res://assets/slot_machine/cabinet_frame.png"
dest_files=["res://.godot/imported/cabinet_frame.png-97e2b6084ba7b318c962ef3eba634aa6.ctex"]
[params]
@@ -38,6 +38,3 @@ process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://dhmuowv14d8w"
path="res://.godot/imported/slot_gift.svg-cd4b23128a05bdfe620f908a0c1209a9.ctex"
uid="uid://cqrjyobyp5h45"
path="res://.godot/imported/lever.png-08544c384e43fad84ca6f4c75fce0c0f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/icons/slots/slot_gift.svg"
dest_files=["res://.godot/imported/slot_gift.svg-cd4b23128a05bdfe620f908a0c1209a9.ctex"]
source_file="res://assets/slot_machine/lever.png"
dest_files=["res://.godot/imported/lever.png-08544c384e43fad84ca6f4c75fce0c0f.ctex"]
[params]
@@ -38,6 +38,3 @@ process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false
Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://baothvvse1io2"
path="res://.godot/imported/slot_coin.svg-d58109e8f39477605be91302ac3d3e1b.ctex"
uid="uid://bgp8erpmjoel7"
path="res://.godot/imported/slot_coin.png-0cc970c575e374ae6106c943cfe43ee1.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/icons/slots/slot_coin.svg"
dest_files=["res://.godot/imported/slot_coin.svg-d58109e8f39477605be91302ac3d3e1b.ctex"]
source_file="res://assets/slot_machine/slot_coin.png"
dest_files=["res://.godot/imported/slot_coin.png-0cc970c575e374ae6106c943cfe43ee1.ctex"]
[params]
@@ -38,6 +38,3 @@ process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false
Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://1ufnf4addccr"
path="res://.godot/imported/slot_shield.svg-8ab2381618dec7ec2bf42c10159a32f7.ctex"
uid="uid://bi1vl8p2q6bgn"
path="res://.godot/imported/slot_coin_stack.png-f16acecc5a2cc4262b0bf33096e5a7d6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/icons/slots/slot_shield.svg"
dest_files=["res://.godot/imported/slot_shield.svg-8ab2381618dec7ec2bf42c10159a32f7.ctex"]
source_file="res://assets/slot_machine/slot_coin_stack.png"
dest_files=["res://.godot/imported/slot_coin_stack.png-f16acecc5a2cc4262b0bf33096e5a7d6.ctex"]
[params]
@@ -38,6 +38,3 @@ process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false
Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

+40
View File
@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dd00eb70k5wbn"
path="res://.godot/imported/slot_gem.png-2012a867d096c962431a19f1d3e3a5c9.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/slot_machine/slot_gem.png"
dest_files=["res://.godot/imported/slot_gem.png-2012a867d096c962431a19f1d3e3a5c9.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

+40
View File
@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dqmvdujjawr5f"
path="res://.godot/imported/slot_gift.png-8717ecd0f5473181fb969b2aa00068db.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/slot_machine/slot_gift.png"
dest_files=["res://.godot/imported/slot_gift.png-8717ecd0f5473181fb969b2aa00068db.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c8r8uookc1ngx"
path="res://.godot/imported/slot_potion.png-ecd877764f2c68367f1819752498d30a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/slot_machine/slot_potion.png"
dest_files=["res://.godot/imported/slot_potion.png-ecd877764f2c68367f1819752498d30a.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://fsejopj5yup5"
path="res://.godot/imported/slot_shield.png-f53f74d032415edb239232a0bab0bef4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/slot_machine/slot_shield.png"
dest_files=["res://.godot/imported/slot_shield.png-f53f74d032415edb239232a0bab0bef4.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1