Generate real glossy reel-symbol art and close the visual gap further
Hand-authored 6 gradient-shaded SVG icons (gold coin, purple gem, green potion, blue RZ shield, coin stack, gift box) to replace the flat monochrome placeholder icons in the reels and reward list - no image-generation tool is available here, so this is genuine vector art with radial/linear gradients and highlight layers rather than a literal asset match to the mockup's renders. Combined with real Godot techniques: a layered-label glow effect on the "RZ" marquee, chase-lit marquee bulbs down both sides of the reel screen (looping Tweens), a much more pronounced arch silhouette and neon border on the cabinet, and an overall scale-up (bigger reels, marquee, lever) so the machine reads as the dominant element instead of a cramped placeholder. Verified with an actual rendered screenshot (not just structural checks) at each iteration.
This commit is contained in:
@@ -0,0 +1,18 @@
|
|||||||
|
<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>
|
||||||
|
After Width: | Height: | Size: 878 B |
@@ -0,0 +1,43 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://baothvvse1io2"
|
||||||
|
path="res://.godot/imported/slot_coin.svg-d58109e8f39477605be91302ac3d3e1b.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"]
|
||||||
|
|
||||||
|
[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
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<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>
|
||||||
|
After Width: | Height: | Size: 867 B |
@@ -0,0 +1,43 @@
|
|||||||
|
[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
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<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>
|
||||||
|
After Width: | Height: | Size: 976 B |
@@ -0,0 +1,43 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://uwdmiagx2i0m"
|
||||||
|
path="res://.godot/imported/slot_gem.svg-3de6fe2b7f75e9c8cb236d31df99300e.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"]
|
||||||
|
|
||||||
|
[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
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<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>
|
||||||
|
After Width: | Height: | Size: 771 B |
@@ -0,0 +1,43 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://dhmuowv14d8w"
|
||||||
|
path="res://.godot/imported/slot_gift.svg-cd4b23128a05bdfe620f908a0c1209a9.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"]
|
||||||
|
|
||||||
|
[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
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<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>
|
||||||
|
After Width: | Height: | Size: 643 B |
@@ -0,0 +1,43 @@
|
|||||||
|
[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
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<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>
|
||||||
|
After Width: | Height: | Size: 609 B |
@@ -0,0 +1,43 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://1ufnf4addccr"
|
||||||
|
path="res://.godot/imported/slot_shield.svg-8ab2381618dec7ec2bf42c10159a32f7.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"]
|
||||||
|
|
||||||
|
[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
|
||||||
@@ -2,20 +2,22 @@ extends VBoxContainer
|
|||||||
|
|
||||||
const Brand := preload("res://scripts/ui/medmind_style.gd")
|
const Brand := preload("res://scripts/ui/medmind_style.gd")
|
||||||
const STAR_ICON := preload("res://assets/icons/lucide/star.svg")
|
const STAR_ICON := preload("res://assets/icons/lucide/star.svg")
|
||||||
const SHIELD_ICON := preload("res://assets/icons/lucide/shield.svg")
|
|
||||||
const CLOCK_ICON := preload("res://assets/icons/lucide/clock-3.svg")
|
const CLOCK_ICON := preload("res://assets/icons/lucide/clock-3.svg")
|
||||||
const RESET_ICON := preload("res://assets/icons/lucide/rotate-ccw.svg")
|
const SLOT_COIN := preload("res://assets/icons/slots/slot_coin.svg")
|
||||||
const GEM_ICON := preload("res://assets/icons/lucide/gem.svg")
|
const SLOT_GEM := preload("res://assets/icons/slots/slot_gem.svg")
|
||||||
const FLASK_ICON := preload("res://assets/icons/lucide/flask-conical.svg")
|
const SLOT_POTION := preload("res://assets/icons/slots/slot_potion.svg")
|
||||||
const REEL_SYMBOLS := [STAR_ICON, SHIELD_ICON, CLOCK_ICON, RESET_ICON, GEM_ICON, FLASK_ICON]
|
const SLOT_SHIELD := preload("res://assets/icons/slots/slot_shield.svg")
|
||||||
const ICON_BY_REWARD_KEY := {
|
const SLOT_COIN_STACK := preload("res://assets/icons/slots/slot_coin_stack.svg")
|
||||||
"jackpot": "star",
|
const SLOT_GIFT := preload("res://assets/icons/slots/slot_gift.svg")
|
||||||
"epic": "gem",
|
const REEL_SYMBOLS := [SLOT_COIN, SLOT_GEM, SLOT_POTION, SLOT_SHIELD, SLOT_COIN_STACK, SLOT_GIFT]
|
||||||
"great": "shield",
|
const REWARD_ICONS := {
|
||||||
"exam_token": "clock-3",
|
"jackpot": {"texture": SLOT_COIN, "modulate": false},
|
||||||
"qbank_reset": "rotate-ccw",
|
"epic": {"texture": SLOT_GEM, "modulate": false},
|
||||||
"nice": "star",
|
"great": {"texture": SLOT_SHIELD, "modulate": false},
|
||||||
"good_luck": "star",
|
"exam_token": {"texture": CLOCK_ICON, "modulate": true},
|
||||||
|
"qbank_reset": {"texture": SLOT_GIFT, "modulate": false},
|
||||||
|
"nice": {"texture": SLOT_COIN_STACK, "modulate": false},
|
||||||
|
"good_luck": {"texture": SLOT_COIN, "modulate": false, "tint": true},
|
||||||
}
|
}
|
||||||
|
|
||||||
var main: Control
|
var main: Control
|
||||||
@@ -94,60 +96,64 @@ func _build_header() -> void:
|
|||||||
func _build_machine(parent: Control) -> void:
|
func _build_machine(parent: Control) -> void:
|
||||||
var dark := UIThemeService.is_dark_mode()
|
var dark := UIThemeService.is_dark_mode()
|
||||||
machine_panel = PanelContainer.new()
|
machine_panel = PanelContainer.new()
|
||||||
|
machine_panel.custom_minimum_size = Vector2(560, 0)
|
||||||
machine_panel.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
machine_panel.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||||||
|
machine_panel.size_flags_vertical = Control.SIZE_SHRINK_BEGIN
|
||||||
machine_panel.add_theme_stylebox_override("panel", _cabinet_box())
|
machine_panel.add_theme_stylebox_override("panel", _cabinet_box())
|
||||||
parent.add_child(machine_panel)
|
parent.add_child(machine_panel)
|
||||||
|
|
||||||
var margin := MarginContainer.new()
|
var margin := MarginContainer.new()
|
||||||
margin.add_theme_constant_override("margin_left", 24)
|
margin.add_theme_constant_override("margin_left", 32)
|
||||||
margin.add_theme_constant_override("margin_right", 24)
|
margin.add_theme_constant_override("margin_right", 32)
|
||||||
margin.add_theme_constant_override("margin_top", 22)
|
margin.add_theme_constant_override("margin_top", 30)
|
||||||
margin.add_theme_constant_override("margin_bottom", 22)
|
margin.add_theme_constant_override("margin_bottom", 28)
|
||||||
machine_panel.add_child(margin)
|
machine_panel.add_child(margin)
|
||||||
|
|
||||||
var column := VBoxContainer.new()
|
var column := VBoxContainer.new()
|
||||||
column.add_theme_constant_override("separation", 16)
|
column.add_theme_constant_override("separation", 20)
|
||||||
margin.add_child(column)
|
margin.add_child(column)
|
||||||
|
|
||||||
_build_marquee(column)
|
_build_marquee(column)
|
||||||
|
|
||||||
var reel_row := HBoxContainer.new()
|
var reel_row := HBoxContainer.new()
|
||||||
reel_row.add_theme_constant_override("separation", 16)
|
reel_row.add_theme_constant_override("separation", 20)
|
||||||
reel_row.alignment = BoxContainer.ALIGNMENT_CENTER
|
reel_row.alignment = BoxContainer.ALIGNMENT_CENTER
|
||||||
column.add_child(reel_row)
|
column.add_child(reel_row)
|
||||||
|
|
||||||
|
reel_row.add_child(_build_light_strip(7))
|
||||||
|
|
||||||
var reel_screen := PanelContainer.new()
|
var reel_screen := PanelContainer.new()
|
||||||
reel_screen.add_theme_stylebox_override("panel", _reel_screen_box())
|
reel_screen.add_theme_stylebox_override("panel", _reel_screen_box())
|
||||||
reel_row.add_child(reel_screen)
|
reel_row.add_child(reel_screen)
|
||||||
|
|
||||||
var reel_margin := MarginContainer.new()
|
var reel_margin := MarginContainer.new()
|
||||||
reel_margin.add_theme_constant_override("margin_left", 16)
|
reel_margin.add_theme_constant_override("margin_left", 22)
|
||||||
reel_margin.add_theme_constant_override("margin_right", 16)
|
reel_margin.add_theme_constant_override("margin_right", 22)
|
||||||
reel_margin.add_theme_constant_override("margin_top", 14)
|
reel_margin.add_theme_constant_override("margin_top", 18)
|
||||||
reel_margin.add_theme_constant_override("margin_bottom", 14)
|
reel_margin.add_theme_constant_override("margin_bottom", 18)
|
||||||
reel_screen.add_child(reel_margin)
|
reel_screen.add_child(reel_margin)
|
||||||
|
|
||||||
var reels_grid := HBoxContainer.new()
|
var reels_grid := HBoxContainer.new()
|
||||||
reels_grid.add_theme_constant_override("separation", 12)
|
reels_grid.add_theme_constant_override("separation", 18)
|
||||||
reel_margin.add_child(reels_grid)
|
reel_margin.add_child(reels_grid)
|
||||||
|
|
||||||
reel_columns.clear()
|
reel_columns.clear()
|
||||||
for _column_index in range(3):
|
for _column_index in range(3):
|
||||||
var reel_col := VBoxContainer.new()
|
var reel_col := VBoxContainer.new()
|
||||||
reel_col.add_theme_constant_override("separation", 8)
|
reel_col.add_theme_constant_override("separation", 10)
|
||||||
reels_grid.add_child(reel_col)
|
reels_grid.add_child(reel_col)
|
||||||
var cells: Array = []
|
var cells: Array = []
|
||||||
for _row_index in range(3):
|
for _row_index in range(3):
|
||||||
var icon := TextureRect.new()
|
var icon := TextureRect.new()
|
||||||
icon.texture = STAR_ICON
|
icon.texture = REEL_SYMBOLS[randi() % REEL_SYMBOLS.size()]
|
||||||
icon.modulate = Brand.AMBER
|
icon.custom_minimum_size = Vector2(58, 58)
|
||||||
icon.custom_minimum_size = Vector2(34, 34)
|
|
||||||
icon.expand_mode = TextureRect.EXPAND_IGNORE_SIZE
|
icon.expand_mode = TextureRect.EXPAND_IGNORE_SIZE
|
||||||
icon.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
|
icon.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
|
||||||
reel_col.add_child(icon)
|
reel_col.add_child(icon)
|
||||||
cells.append(icon)
|
cells.append(icon)
|
||||||
reel_columns.append(cells)
|
reel_columns.append(cells)
|
||||||
|
|
||||||
|
reel_row.add_child(_build_light_strip(7))
|
||||||
reel_row.add_child(_build_lever())
|
reel_row.add_child(_build_lever())
|
||||||
|
|
||||||
win_up_to_card = PanelContainer.new()
|
win_up_to_card = PanelContainer.new()
|
||||||
@@ -240,15 +246,10 @@ func _build_machine(parent: Control) -> void:
|
|||||||
func _build_marquee(column: VBoxContainer) -> void:
|
func _build_marquee(column: VBoxContainer) -> void:
|
||||||
var row := HBoxContainer.new()
|
var row := HBoxContainer.new()
|
||||||
row.alignment = BoxContainer.ALIGNMENT_CENTER
|
row.alignment = BoxContainer.ALIGNMENT_CENTER
|
||||||
row.add_theme_constant_override("separation", 12)
|
row.add_theme_constant_override("separation", 14)
|
||||||
column.add_child(row)
|
column.add_child(row)
|
||||||
row.add_child(_marquee_star())
|
row.add_child(_marquee_star())
|
||||||
var mark := Label.new()
|
row.add_child(_marquee_glow_label())
|
||||||
mark.text = "RZ"
|
|
||||||
mark.add_theme_font_override("font", Brand.font)
|
|
||||||
mark.add_theme_font_size_override("font_size", 34)
|
|
||||||
mark.add_theme_color_override("font_color", Brand.SKY_BLUE)
|
|
||||||
row.add_child(mark)
|
|
||||||
row.add_child(_marquee_star())
|
row.add_child(_marquee_star())
|
||||||
|
|
||||||
|
|
||||||
@@ -262,6 +263,65 @@ func _marquee_star() -> TextureRect:
|
|||||||
return star
|
return star
|
||||||
|
|
||||||
|
|
||||||
|
func _marquee_glow_label() -> Control:
|
||||||
|
var wrap := Control.new()
|
||||||
|
wrap.custom_minimum_size = Vector2(150, 70)
|
||||||
|
var halo_specs := [
|
||||||
|
{"size": 74, "alpha": 0.22, "offset": Vector2(-4, -4)},
|
||||||
|
{"size": 74, "alpha": 0.22, "offset": Vector2(4, 4)},
|
||||||
|
{"size": 64, "alpha": 0.4, "offset": Vector2.ZERO},
|
||||||
|
]
|
||||||
|
for spec in halo_specs:
|
||||||
|
var glow := Label.new()
|
||||||
|
glow.text = "RZ"
|
||||||
|
glow.add_theme_font_override("font", Brand.font)
|
||||||
|
glow.add_theme_font_size_override("font_size", spec["size"])
|
||||||
|
glow.add_theme_color_override("font_color", Color(Brand.SKY_BLUE, spec["alpha"]))
|
||||||
|
glow.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
||||||
|
glow.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
|
||||||
|
glow.set_anchors_preset(Control.PRESET_FULL_RECT)
|
||||||
|
glow.position += spec["offset"]
|
||||||
|
wrap.add_child(glow)
|
||||||
|
var mark := Label.new()
|
||||||
|
mark.text = "RZ"
|
||||||
|
mark.add_theme_font_override("font", Brand.font)
|
||||||
|
mark.add_theme_font_size_override("font_size", 46)
|
||||||
|
mark.add_theme_color_override("font_color", Brand.SKY_BLUE)
|
||||||
|
mark.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
||||||
|
mark.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
|
||||||
|
mark.set_anchors_preset(Control.PRESET_FULL_RECT)
|
||||||
|
wrap.add_child(mark)
|
||||||
|
return wrap
|
||||||
|
|
||||||
|
|
||||||
|
func _build_light_strip(count: int) -> VBoxContainer:
|
||||||
|
var strip := VBoxContainer.new()
|
||||||
|
strip.add_theme_constant_override("separation", 14)
|
||||||
|
strip.alignment = BoxContainer.ALIGNMENT_CENTER
|
||||||
|
for index in range(count):
|
||||||
|
var bulb := PanelContainer.new()
|
||||||
|
bulb.custom_minimum_size = Vector2(11, 11)
|
||||||
|
var bulb_box := StyleBoxFlat.new()
|
||||||
|
bulb_box.bg_color = Color("fef3c7")
|
||||||
|
bulb_box.set_corner_radius_all(6)
|
||||||
|
bulb_box.corner_detail = 12
|
||||||
|
bulb_box.anti_aliasing = false
|
||||||
|
bulb.add_theme_stylebox_override("panel", bulb_box)
|
||||||
|
strip.add_child(bulb)
|
||||||
|
_animate_bulb(bulb, index)
|
||||||
|
return strip
|
||||||
|
|
||||||
|
|
||||||
|
func _animate_bulb(bulb: Control, index: int) -> void:
|
||||||
|
bulb.modulate.a = 0.3
|
||||||
|
var tween := create_tween()
|
||||||
|
tween.set_loops()
|
||||||
|
tween.tween_interval(index * 0.12)
|
||||||
|
tween.tween_property(bulb, "modulate:a", 1.0, 0.4).set_trans(Tween.TRANS_SINE)
|
||||||
|
tween.tween_property(bulb, "modulate:a", 0.3, 0.4).set_trans(Tween.TRANS_SINE)
|
||||||
|
tween.tween_interval(1.4)
|
||||||
|
|
||||||
|
|
||||||
func _build_lever() -> Control:
|
func _build_lever() -> Control:
|
||||||
var wrap := VBoxContainer.new()
|
var wrap := VBoxContainer.new()
|
||||||
wrap.alignment = BoxContainer.ALIGNMENT_BEGIN
|
wrap.alignment = BoxContainer.ALIGNMENT_BEGIN
|
||||||
@@ -269,11 +329,11 @@ func _build_lever() -> Control:
|
|||||||
wrap.add_theme_constant_override("separation", 0)
|
wrap.add_theme_constant_override("separation", 0)
|
||||||
|
|
||||||
var knob := PanelContainer.new()
|
var knob := PanelContainer.new()
|
||||||
knob.custom_minimum_size = Vector2(22, 22)
|
knob.custom_minimum_size = Vector2(30, 30)
|
||||||
knob.size_flags_horizontal = Control.SIZE_SHRINK_CENTER
|
knob.size_flags_horizontal = Control.SIZE_SHRINK_CENTER
|
||||||
var knob_box := StyleBoxFlat.new()
|
var knob_box := StyleBoxFlat.new()
|
||||||
knob_box.bg_color = Brand.ROYAL_BLUE
|
knob_box.bg_color = Brand.ROYAL_BLUE
|
||||||
knob_box.set_corner_radius_all(11)
|
knob_box.set_corner_radius_all(15)
|
||||||
knob_box.corner_detail = 20
|
knob_box.corner_detail = 20
|
||||||
knob_box.anti_aliasing = false
|
knob_box.anti_aliasing = false
|
||||||
knob.add_theme_stylebox_override("panel", knob_box)
|
knob.add_theme_stylebox_override("panel", knob_box)
|
||||||
@@ -281,7 +341,7 @@ func _build_lever() -> Control:
|
|||||||
|
|
||||||
var rod := ColorRect.new()
|
var rod := ColorRect.new()
|
||||||
rod.color = Color("64748b")
|
rod.color = Color("64748b")
|
||||||
rod.custom_minimum_size = Vector2(5, 90)
|
rod.custom_minimum_size = Vector2(6, 140)
|
||||||
rod.size_flags_horizontal = Control.SIZE_SHRINK_CENTER
|
rod.size_flags_horizontal = Control.SIZE_SHRINK_CENTER
|
||||||
wrap.add_child(rod)
|
wrap.add_child(rod)
|
||||||
|
|
||||||
@@ -292,13 +352,13 @@ func _cabinet_box() -> StyleBoxFlat:
|
|||||||
var box := StyleBoxFlat.new()
|
var box := StyleBoxFlat.new()
|
||||||
box.bg_color = Color("0b1220")
|
box.bg_color = Color("0b1220")
|
||||||
box.border_color = Brand.SKY_BLUE
|
box.border_color = Brand.SKY_BLUE
|
||||||
box.set_border_width_all(3)
|
box.set_border_width_all(4)
|
||||||
box.corner_radius_top_left = 48
|
box.corner_radius_top_left = 90
|
||||||
box.corner_radius_top_right = 48
|
box.corner_radius_top_right = 90
|
||||||
box.corner_radius_bottom_left = 16
|
box.corner_radius_bottom_left = 20
|
||||||
box.corner_radius_bottom_right = 16
|
box.corner_radius_bottom_right = 20
|
||||||
box.shadow_color = Color(Brand.SKY_BLUE, 0.35)
|
box.shadow_color = Color(Brand.SKY_BLUE, 0.45)
|
||||||
box.shadow_size = 10
|
box.shadow_size = 18
|
||||||
return box
|
return box
|
||||||
|
|
||||||
|
|
||||||
@@ -445,15 +505,19 @@ func _build_reward_row(dark: bool, reward: Dictionary) -> HBoxContainer:
|
|||||||
row.add_theme_constant_override("separation", 10)
|
row.add_theme_constant_override("separation", 10)
|
||||||
|
|
||||||
var icon_panel := PanelContainer.new()
|
var icon_panel := PanelContainer.new()
|
||||||
icon_panel.custom_minimum_size = Vector2(32, 32)
|
icon_panel.custom_minimum_size = Vector2(36, 36)
|
||||||
icon_panel.size_flags_vertical = Control.SIZE_SHRINK_CENTER
|
icon_panel.size_flags_vertical = Control.SIZE_SHRINK_CENTER
|
||||||
icon_panel.add_theme_stylebox_override("panel", Brand.icon_circle_box(dark, accent, 16))
|
icon_panel.add_theme_stylebox_override("panel", Brand.icon_circle_box(dark, accent, 18))
|
||||||
var icon := TextureRect.new()
|
var icon := TextureRect.new()
|
||||||
icon.texture = load("res://assets/icons/lucide/%s.svg" % str(ICON_BY_REWARD_KEY.get(key, "star")))
|
var spec: Dictionary = REWARD_ICONS.get(key, {"texture": SLOT_COIN, "modulate": false})
|
||||||
icon.custom_minimum_size = Vector2(16, 16)
|
icon.texture = spec.get("texture")
|
||||||
|
icon.custom_minimum_size = Vector2(22, 22)
|
||||||
icon.expand_mode = TextureRect.EXPAND_IGNORE_SIZE
|
icon.expand_mode = TextureRect.EXPAND_IGNORE_SIZE
|
||||||
icon.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
|
icon.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
|
||||||
icon.modulate = accent
|
if spec.get("modulate", false):
|
||||||
|
icon.modulate = accent
|
||||||
|
elif spec.get("tint", false):
|
||||||
|
icon.modulate = Color("94a3b8")
|
||||||
icon_panel.add_child(icon)
|
icon_panel.add_child(icon)
|
||||||
row.add_child(icon_panel)
|
row.add_child(icon_panel)
|
||||||
|
|
||||||
@@ -563,8 +627,7 @@ func _spin_one_reel(cells: Array, duration: float) -> void:
|
|||||||
elapsed += interval
|
elapsed += interval
|
||||||
interval = minf(interval * 1.18, 0.22)
|
interval = minf(interval * 1.18, 0.22)
|
||||||
for cell in cells:
|
for cell in cells:
|
||||||
cell.texture = STAR_ICON
|
cell.texture = SLOT_COIN
|
||||||
cell.modulate = Brand.AMBER
|
|
||||||
|
|
||||||
|
|
||||||
func _play_coin_burst(coins_won: int) -> void:
|
func _play_coin_burst(coins_won: int) -> void:
|
||||||
@@ -580,8 +643,7 @@ func _play_coin_burst(coins_won: int) -> void:
|
|||||||
var stagger := 0.035
|
var stagger := 0.035
|
||||||
for index in range(coin_count):
|
for index in range(coin_count):
|
||||||
var coin := TextureRect.new()
|
var coin := TextureRect.new()
|
||||||
coin.texture = STAR_ICON
|
coin.texture = SLOT_COIN
|
||||||
coin.modulate = Brand.AMBER
|
|
||||||
coin.custom_minimum_size = Vector2(16, 16)
|
coin.custom_minimum_size = Vector2(16, 16)
|
||||||
coin.size = Vector2(16, 16)
|
coin.size = Vector2(16, 16)
|
||||||
coin.top_level = true
|
coin.top_level = true
|
||||||
|
|||||||
Reference in New Issue
Block a user