Add finished creature artwork

This commit is contained in:
Alexander Sellite 2026-08-24 12:01:20 -04:00
parent bb75121dcd
commit 7f5a522ae5
54 changed files with 1013 additions and 35 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

View file

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://x5e744k11k70"
path.s3tc="res://.godot/imported/101.png-81f7f90e29292575c1a9727aa6060fa0.s3tc.ctex"
path.etc2="res://.godot/imported/101.png-81f7f90e29292575c1a9727aa6060fa0.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://art/exported/creatures/101.png"
dest_files=["res://.godot/imported/101.png-81f7f90e29292575c1a9727aa6060fa0.s3tc.ctex", "res://.godot/imported/101.png-81f7f90e29292575c1a9727aa6060fa0.etc2.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

View file

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://1kla4jewitot"
path.s3tc="res://.godot/imported/102.png-2ab8ac9408a482b1042b6ba3cd3bd718.s3tc.ctex"
path.etc2="res://.godot/imported/102.png-2ab8ac9408a482b1042b6ba3cd3bd718.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://art/exported/creatures/102.png"
dest_files=["res://.godot/imported/102.png-2ab8ac9408a482b1042b6ba3cd3bd718.s3tc.ctex", "res://.godot/imported/102.png-2ab8ac9408a482b1042b6ba3cd3bd718.etc2.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cfdsg4tevv0jm"
path.s3tc="res://.godot/imported/103.png-f8985f10e04b19499cd6f5ffbadc83c9.s3tc.ctex"
path.etc2="res://.godot/imported/103.png-f8985f10e04b19499cd6f5ffbadc83c9.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://art/exported/creatures/103.png"
dest_files=["res://.godot/imported/103.png-f8985f10e04b19499cd6f5ffbadc83c9.s3tc.ctex", "res://.godot/imported/103.png-f8985f10e04b19499cd6f5ffbadc83c9.etc2.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

View file

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://pgm364g5qlgs"
path.s3tc="res://.godot/imported/104.png-e164f67032648af2cc0a545d2a861c7d.s3tc.ctex"
path.etc2="res://.godot/imported/104.png-e164f67032648af2cc0a545d2a861c7d.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://art/exported/creatures/104.png"
dest_files=["res://.godot/imported/104.png-e164f67032648af2cc0a545d2a861c7d.s3tc.ctex", "res://.godot/imported/104.png-e164f67032648af2cc0a545d2a861c7d.etc2.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dwanip2j561n7"
path.s3tc="res://.godot/imported/105.png-a2b440912e59b3375c6e61e17d08287b.s3tc.ctex"
path.etc2="res://.godot/imported/105.png-a2b440912e59b3375c6e61e17d08287b.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://art/exported/creatures/105.png"
dest_files=["res://.godot/imported/105.png-a2b440912e59b3375c6e61e17d08287b.s3tc.ctex", "res://.godot/imported/105.png-a2b440912e59b3375c6e61e17d08287b.etc2.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View file

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cr7tc11ievso5"
path.s3tc="res://.godot/imported/106.png-306ce449448588714e5a0e883ae441ac.s3tc.ctex"
path.etc2="res://.godot/imported/106.png-306ce449448588714e5a0e883ae441ac.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://art/exported/creatures/106.png"
dest_files=["res://.godot/imported/106.png-306ce449448588714e5a0e883ae441ac.s3tc.ctex", "res://.godot/imported/106.png-306ce449448588714e5a0e883ae441ac.etc2.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View file

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c8rf4tnxx8mov"
path.s3tc="res://.godot/imported/107.png-062740d0bdad6e3ac4ecc1cf92ee6b9d.s3tc.ctex"
path.etc2="res://.godot/imported/107.png-062740d0bdad6e3ac4ecc1cf92ee6b9d.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://art/exported/creatures/107.png"
dest_files=["res://.godot/imported/107.png-062740d0bdad6e3ac4ecc1cf92ee6b9d.s3tc.ctex", "res://.godot/imported/107.png-062740d0bdad6e3ac4ecc1cf92ee6b9d.etc2.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bdmm1jfod7gq0"
path.s3tc="res://.godot/imported/3906.png-39cc349a6d3e716822bc9e12bd0ac7a2.s3tc.ctex"
path.etc2="res://.godot/imported/3906.png-39cc349a6d3e716822bc9e12bd0ac7a2.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://art/exported/creatures/3906.png"
dest_files=["res://.godot/imported/3906.png-39cc349a6d3e716822bc9e12bd0ac7a2.s3tc.ctex", "res://.godot/imported/3906.png-39cc349a6d3e716822bc9e12bd0ac7a2.etc2.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View file

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://7dbcbicxwvlo"
path.s3tc="res://.godot/imported/4401.png-0fd242cb090b49614af9b4d07503b2db.s3tc.ctex"
path.etc2="res://.godot/imported/4401.png-0fd242cb090b49614af9b4d07503b2db.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://art/exported/creatures/4401.png"
dest_files=["res://.godot/imported/4401.png-0fd242cb090b49614af9b4d07503b2db.s3tc.ctex", "res://.godot/imported/4401.png-0fd242cb090b49614af9b4d07503b2db.etc2.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View file

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://do6hcv3omivv5"
path.s3tc="res://.godot/imported/4701.png-dcb44d4ce6dfdc812a2e185e7f9511be.s3tc.ctex"
path.etc2="res://.godot/imported/4701.png-dcb44d4ce6dfdc812a2e185e7f9511be.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://art/exported/creatures/4701.png"
dest_files=["res://.godot/imported/4701.png-dcb44d4ce6dfdc812a2e185e7f9511be.s3tc.ctex", "res://.godot/imported/4701.png-dcb44d4ce6dfdc812a2e185e7f9511be.etc2.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dxwr7yv5h30s"
path.s3tc="res://.godot/imported/5702.png-b0cead42bd9a5851c3f6775a7d0e469e.s3tc.ctex"
path.etc2="res://.godot/imported/5702.png-b0cead42bd9a5851c3f6775a7d0e469e.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://art/exported/creatures/5702.png"
dest_files=["res://.godot/imported/5702.png-b0cead42bd9a5851c3f6775a7d0e469e.s3tc.ctex", "res://.godot/imported/5702.png-b0cead42bd9a5851c3f6775a7d0e469e.etc2.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View file

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dovitajskavmi"
path.s3tc="res://.godot/imported/5901.png-10c9e77992ad31ce54d34b95a6db6f61.s3tc.ctex"
path.etc2="res://.godot/imported/5901.png-10c9e77992ad31ce54d34b95a6db6f61.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://art/exported/creatures/5901.png"
dest_files=["res://.godot/imported/5901.png-10c9e77992ad31ce54d34b95a6db6f61.s3tc.ctex", "res://.godot/imported/5901.png-10c9e77992ad31ce54d34b95a6db6f61.etc2.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

View file

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://k3ser2dy6wj7"
path.s3tc="res://.godot/imported/6103.png-5fc95bf908f801d5397114bde5081f55.s3tc.ctex"
path.etc2="res://.godot/imported/6103.png-5fc95bf908f801d5397114bde5081f55.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://art/exported/creatures/6103.png"
dest_files=["res://.godot/imported/6103.png-5fc95bf908f801d5397114bde5081f55.s3tc.ctex", "res://.godot/imported/6103.png-5fc95bf908f801d5397114bde5081f55.etc2.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

View file

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b5ejex5wtfoun"
path.s3tc="res://.godot/imported/6804.png-28bcc10060d656f6d7f080ea81e2d1d3.s3tc.ctex"
path.etc2="res://.godot/imported/6804.png-28bcc10060d656f6d7f080ea81e2d1d3.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://art/exported/creatures/6804.png"
dest_files=["res://.godot/imported/6804.png-28bcc10060d656f6d7f080ea81e2d1d3.s3tc.ctex", "res://.godot/imported/6804.png-28bcc10060d656f6d7f080ea81e2d1d3.etc2.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

View file

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c4d8x6qyhahvn"
path.s3tc="res://.godot/imported/6905.png-a52c1647421059618698e17d7a3f8f98.s3tc.ctex"
path.etc2="res://.godot/imported/6905.png-a52c1647421059618698e17d7a3f8f98.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://art/exported/creatures/6905.png"
dest_files=["res://.godot/imported/6905.png-a52c1647421059618698e17d7a3f8f98.s3tc.ctex", "res://.godot/imported/6905.png-a52c1647421059618698e17d7a3f8f98.etc2.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View file

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bl7ru6gm5xnpb"
path.s3tc="res://.godot/imported/7403.png-54b51089a6ff5c2091372d659ba4bdc7.s3tc.ctex"
path.etc2="res://.godot/imported/7403.png-54b51089a6ff5c2091372d659ba4bdc7.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://art/exported/creatures/7403.png"
dest_files=["res://.godot/imported/7403.png-54b51089a6ff5c2091372d659ba4bdc7.s3tc.ctex", "res://.godot/imported/7403.png-54b51089a6ff5c2091372d659ba4bdc7.etc2.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

View file

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bnw0dw14iyxbh"
path.s3tc="res://.godot/imported/7508.png-555eff33a2cb66622ccca9d7f063522e.s3tc.ctex"
path.etc2="res://.godot/imported/7508.png-555eff33a2cb66622ccca9d7f063522e.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://art/exported/creatures/7508.png"
dest_files=["res://.godot/imported/7508.png-555eff33a2cb66622ccca9d7f063522e.s3tc.ctex", "res://.godot/imported/7508.png-555eff33a2cb66622ccca9d7f063522e.etc2.ctex"]
[params]
compress/mode=2
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=0

View file

@ -12,14 +12,14 @@ publicly credited as Voyager and Endeavour and operating collectively as the
independent team Woofmeow.
- Voyager: co-owner, developer, project director, creator of the game's
current provisional fish artwork and original 3D work except where another
creator is credited, and composer of the original title track
provisional fish placeholder artwork and original 3D work except where
another creator is credited, and composer of the original title track
`audio/music/title/as_in_four_wolves.ogg`, dusk/world track
`audio/music/world/craft.mp3`, and the synthesized robot animalese tones.
- Endeavour: co-owner, developer, and 2D artist. Her incorporated work includes
character pattern/channel-map art, environment and UI art, and item art.
Planned work is not described as incorporated until its files enter the
project.
character pattern/channel-map art, environment and UI art, item art, and
finished fish and creature artwork. Planned work is not described as
incorporated until its files enter the project.
- chillnfill: contributor of original 3D models for the character bodies and
arms, ears and tails, and multiple world props and decorative assets,
including trees and bridges. The contributor requested to be credited as
@ -132,17 +132,18 @@ locations only and must never appear in scenes or resources.
## Project-created artwork and music
The current in-game fish images are provisional artwork by Voyager. Endeavour
is creating replacement fish artwork, but work that has not been incorporated
into this repository is not presented here as part of the game or attributed
as a shipped asset.
Fish entries without finished replacement artwork use provisional placeholder
artwork by Voyager. Incorporated finished fish and creature artwork is by
Endeavour; work that has not entered this repository is not presented here as
part of the game or attributed as a shipped asset.
Endeavour's incorporated 2D contributions include the inventory notepad,
environment and UI artwork, item artwork, and character customization pattern
and channel-map artwork. Voyager's incorporated original work includes 3D
assets, the provisional fish artwork, the title and dusk music identified
above, and the robot animalese tones. Specific contributor exceptions are
recorded below and in the in-game credits.
environment and UI artwork, item artwork, finished fish and creature artwork,
and character customization pattern and channel-map artwork. Voyager's
incorporated original work includes 3D assets, the provisional fish
placeholder artwork, the title and dusk music identified above, and the robot
animalese tones. Specific contributor exceptions are recorded below and in the
in-game credits.
These credits intentionally describe work by creator and contribution family
instead of maintaining a second file-by-file asset catalog. Runtime resources
@ -192,9 +193,10 @@ https://creativecommons.org/licenses/by/3.0/legalcode.
### Endeavour 2D contribution record
Endeavour created the incorporated character customization patterns and
channel maps as well as additional UI, environment, and item artwork. The
current provisional fish artwork is not part of this credit. New or replacement
art is added to this record only after it is accepted into the repository.
channel maps as well as additional UI, environment, item, fish, and creature
artwork. Voyager's provisional fish placeholder is not part of this credit.
New or replacement art is added to this record only after it is accepted into
the repository.
The exact current filenames and bytes are intentionally not copied into this
document. The character appearance resources and Git history are the

View file

@ -3,7 +3,7 @@
[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"]
[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"]
[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/7508.png" id="99_fish_placeholder"]
[sub_resource type="Resource" id="Availability"]
script = ExtResource("3_availability")

View file

@ -3,7 +3,7 @@
[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"]
[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"]
[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/101.png" id="4_texture"]
[sub_resource type="Resource" id="Availability"]
script = ExtResource("3_availability")

View file

@ -3,7 +3,7 @@
[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"]
[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"]
[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/5901.png" id="99_fish_placeholder"]
[sub_resource type="Resource" id="Availability"]
script = ExtResource("3_availability")

View file

@ -3,7 +3,7 @@
[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"]
[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"]
[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/5702.png" id="99_fish_placeholder"]
[sub_resource type="Resource" id="Availability"]
script = ExtResource("3_availability")

View file

@ -2,7 +2,7 @@
[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"]
[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"]
[ext_resource type="Texture2D" path="res://fish/species/crab_brown/crab_brown.png" id="3_texture"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/3906.png" id="3_texture"]
[resource]
script = ExtResource("1_fish_data")

View file

@ -3,7 +3,7 @@
[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"]
[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"]
[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/103.png" id="4_texture"]
[sub_resource type="Resource" id="Availability"]
script = ExtResource("3_availability")

View file

@ -3,7 +3,7 @@
[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"]
[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"]
[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/106.png" id="4_texture"]
[sub_resource type="Resource" id="Availability"]
script = ExtResource("3_availability")

View file

@ -3,7 +3,7 @@
[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"]
[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"]
[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/6103.png" id="99_fish_placeholder"]
[sub_resource type="Resource" id="Availability"]
script = ExtResource("3_availability")

View file

@ -3,7 +3,7 @@
[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"]
[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"]
[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/7403.png" id="99_fish_placeholder"]
[sub_resource type="Resource" id="Availability"]
script = ExtResource("3_availability")

View file

@ -3,7 +3,7 @@
[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"]
[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"]
[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/107.png" id="4_texture"]
[sub_resource type="Resource" id="Availability"]
script = ExtResource("3_availability")

View file

@ -3,7 +3,7 @@
[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"]
[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"]
[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/4701.png" id="99_fish_placeholder"]
[sub_resource type="Resource" id="Availability"]
script = ExtResource("3_availability")

View file

@ -3,7 +3,7 @@
[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"]
[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"]
[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/6804.png" id="99_fish_placeholder"]
[sub_resource type="Resource" id="Availability"]
script = ExtResource("3_availability")

View file

@ -3,7 +3,7 @@
[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"]
[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"]
[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/104.png" id="4_texture"]
[sub_resource type="Resource" id="Availability"]
script = ExtResource("3_availability")

View file

@ -3,7 +3,7 @@
[ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"]
[ext_resource type="Resource" path="res://fishing/bass_catch_profile.tres" id="2_profile"]
[ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/4401.png" id="4_texture"]
[sub_resource type="Resource" id="AtlanticSalmonAvailability"]
script = ExtResource("3_availability_script")

View file

@ -3,7 +3,7 @@
[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"]
[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"]
[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/6905.png" id="99_fish_placeholder"]
[sub_resource type="Resource" id="Availability"]
script = ExtResource("3_availability")

View file

@ -3,7 +3,7 @@
[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"]
[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"]
[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/102.png" id="4_texture"]
[sub_resource type="Resource" id="Availability"]
script = ExtResource("3_availability")

View file

@ -3,7 +3,7 @@
[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"]
[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"]
[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"]
[ext_resource type="Texture2D" path="res://art/exported/creatures/105.png" id="4_texture"]
[sub_resource type="Resource" id="Availability"]
script = ExtResource("3_availability")

View file

@ -40,6 +40,25 @@ const StarterRegionScene = preload(
const SharedFishPlaceholder: Texture2D = preload(
"res://art/exported/creatures/fish_placeholder.png"
)
const FINAL_CREATURE_TEXTURE_PATHS: Dictionary[StringName, String] = {
&"bowfin": "res://art/exported/creatures/101.png",
&"sturgeon_lake": "res://art/exported/creatures/102.png",
&"gar_longnose": "res://art/exported/creatures/103.png",
&"paddlefish": "res://art/exported/creatures/104.png",
&"sturgeon_shovelnose": "res://art/exported/creatures/105.png",
&"gar_spotted": "res://art/exported/creatures/106.png",
&"lungfish_west_african": "res://art/exported/creatures/107.png",
&"crab_brown": "res://art/exported/creatures/3906.png",
&"salmon_atlantic": "res://art/exported/creatures/4401.png",
&"mahi_mahi": "res://art/exported/creatures/4701.png",
&"clownfish_ocellaris": "res://art/exported/creatures/5702.png",
&"chromis_blue_green": "res://art/exported/creatures/5901.png",
&"hogfish": "res://art/exported/creatures/6103.png",
&"mullet_striped": "res://art/exported/creatures/6804.png",
&"sheepshead": "res://art/exported/creatures/6905.png",
&"ladyfish": "res://art/exported/creatures/7403.png",
&"betta_siamese": "res://art/exported/creatures/7508.png",
}
const ACTIVE_CATALOG_COUNT: int = 313
const INACTIVE_CATALOG_COUNT: int = 3
@ -186,6 +205,8 @@ func _validate_catalog_and_pools() -> void:
var active_count: int = 0
var inactive_count: int = 0
var fishing_count: int = 0
var final_art_count: int = 0
var placeholder_fishing_count: int = 0
var catalog_numbers: Dictionary[int, bool] = {}
for fish: FishDataType in Catalog.candidates:
assert(fish != null and not fish.id.is_empty())
@ -204,13 +225,24 @@ func _validate_catalog_and_pools() -> void:
inactive_count += 1
assert(not fish.is_selectable())
assert(fish.display_texture == null)
if FINAL_CREATURE_TEXTURE_PATHS.has(fish.id):
var expected_texture: Texture2D = load(
FINAL_CREATURE_TEXTURE_PATHS[fish.id]
) as Texture2D
assert(expected_texture != null)
assert(fish.display_texture == expected_texture)
final_art_count += 1
if fish.collection_method == FishDataType.CollectionMethod.FISHING:
fishing_count += 1
assert(fish.active)
if not FINAL_CREATURE_TEXTURE_PATHS.has(fish.id):
assert(fish.display_texture == SharedFishPlaceholder)
placeholder_fishing_count += 1
assert(active_count == ACTIVE_CATALOG_COUNT)
assert(inactive_count == INACTIVE_CATALOG_COUNT)
assert(fishing_count == FISHING_SPECIES_COUNT)
assert(final_art_count == FINAL_CREATURE_TEXTURE_PATHS.size())
assert(placeholder_fishing_count == 294)
var chum: FishDataType = Catalog.get_fish_by_id(&"salmon_chum")
assert(chum != null)
assert(chum.get_season_text() == "fall")

View file

@ -0,0 +1,230 @@
#!/usr/bin/env python3
"""Export cataloged creature artwork with consistent transparent margins."""
from __future__ import annotations
import argparse
import hashlib
import re
import sys
import zipfile
import xml.etree.ElementTree as ET
from pathlib import Path
from PIL import Image
TABLE_NAMESPACE = "urn:oasis:names:tc:opendocument:xmlns:table:1.0"
TABLE_ATTRIBUTE = "{%s}" % TABLE_NAMESPACE
NAMESPACES = {"table": TABLE_NAMESPACE}
VALID_EXPORT_SIZES = {64, 128, 256, 512}
SAFE_AREA_RATIO = 0.875
KNOWN_SOURCE_ALIASES = {
# The delivered filename predates the catalog's authoritative species ID.
"bowfish": "bowfin",
}
def parse_arguments() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description=(
"Export PNG creature art according to the catalog's recommended "
"canvas size, using alpha-bound trimming and nearest-neighbor scaling."
)
)
parser.add_argument("--tracker", required=True, type=Path)
parser.add_argument("--source", required=True, type=Path)
parser.add_argument("--output", required=True, type=Path)
parser.add_argument(
"--skip",
action="append",
default=[],
help="Catalog creature ID or source filename stem to skip; repeat as needed.",
)
parser.add_argument(
"--dry-run",
action="store_true",
help="Validate and report the batch without writing output files.",
)
return parser.parse_args()
def normalize_name(value: str) -> str:
normalized = value.strip().lower().replace("&", " and ")
normalized = re.sub(r"[^a-z0-9]+", "_", normalized)
return normalized.strip("_")
def expanded_row_values(row: ET.Element) -> list[str]:
values: list[str] = []
for cell in row.findall("table:table-cell", NAMESPACES):
repeat = int(
cell.attrib.get(
TABLE_ATTRIBUTE + "number-columns-repeated",
"1",
)
)
values.extend(["".join(cell.itertext()).strip()] * repeat)
return values
def load_catalog(tracker_path: Path) -> list[dict[str, str]]:
with zipfile.ZipFile(tracker_path) as archive:
root = ET.fromstring(archive.read("content.xml"))
table = root.find(".//table:table", NAMESPACES)
if table is None:
raise ValueError("tracker does not contain a table")
rows = table.findall("table:table-row", NAMESPACES)
if not rows:
raise ValueError("tracker table is empty")
headers = expanded_row_values(rows[0])
required_headers = {
"catalog_number",
"display_name",
"id",
"recommended_export_canvas_px",
}
missing_headers = required_headers.difference(headers)
if missing_headers:
raise ValueError(
"tracker is missing required columns: "
+ ", ".join(sorted(missing_headers))
)
records: list[dict[str, str]] = []
for row in rows[1:]:
values = expanded_row_values(row)
if not any(values):
continue
record = dict(zip(headers, values))
if record.get("id", "").strip():
records.append(record)
return records
def catalog_lookup(records: list[dict[str, str]]) -> dict[str, dict[str, str]]:
lookup: dict[str, dict[str, str]] = {}
for record in records:
keys = {
normalize_name(record["id"]),
normalize_name(record["display_name"]),
}
for key in keys:
previous = lookup.get(key)
if previous is not None and previous["id"] != record["id"]:
raise ValueError(
f"ambiguous normalized catalog name {key!r}: "
f"{previous['id']} and {record['id']}"
)
lookup[key] = record
return lookup
def resolve_record(
source_path: Path,
lookup: dict[str, dict[str, str]],
) -> dict[str, str]:
source_key = normalize_name(source_path.stem)
catalog_key = KNOWN_SOURCE_ALIASES.get(source_key, source_key)
record = lookup.get(catalog_key)
if record is None:
raise ValueError(
f"cannot map source {source_path.name!r} to one catalog creature"
)
return record
def normalize_artwork(source_path: Path, canvas_size: int) -> tuple[Image.Image, tuple[int, int, int, int], tuple[int, int]]:
with Image.open(source_path) as source_image:
artwork = source_image.convert("RGBA")
alpha_bounds = artwork.getchannel("A").getbbox()
if alpha_bounds is None:
raise ValueError(f"source {source_path.name!r} is fully transparent")
visible = artwork.crop(alpha_bounds)
safe_long_side = round(canvas_size * SAFE_AREA_RATIO)
scale = safe_long_side / max(visible.width, visible.height)
scaled_size = (
max(1, round(visible.width * scale)),
max(1, round(visible.height * scale)),
)
visible = visible.resize(scaled_size, Image.Resampling.NEAREST)
canvas = Image.new("RGBA", (canvas_size, canvas_size), (0, 0, 0, 0))
offset = (
(canvas_size - scaled_size[0]) // 2,
(canvas_size - scaled_size[1]) // 2,
)
canvas.alpha_composite(visible, offset)
return canvas, alpha_bounds, scaled_size
def sha256(path: Path) -> str:
digest = hashlib.sha256()
with path.open("rb") as source:
for block in iter(lambda: source.read(1024 * 1024), b""):
digest.update(block)
return digest.hexdigest()
def main() -> int:
arguments = parse_arguments()
records = load_catalog(arguments.tracker)
lookup = catalog_lookup(records)
skip_keys = {normalize_name(value) for value in arguments.skip}
source_paths = sorted(arguments.source.glob("*.png"))
if not source_paths:
raise ValueError(f"no PNG files found under {arguments.source}")
resolved: list[tuple[Path, dict[str, str]]] = []
output_names: set[str] = set()
for source_path in source_paths:
record = resolve_record(source_path, lookup)
source_key = normalize_name(source_path.stem)
creature_key = normalize_name(record["id"])
if source_key in skip_keys or creature_key in skip_keys:
print(f"SKIP {source_path.name} -> {record['id']}")
continue
output_name = f"{record['catalog_number']}.png"
if output_name in output_names:
raise ValueError(f"duplicate output filename {output_name}")
output_names.add(output_name)
resolved.append((source_path, record))
if not arguments.dry_run:
arguments.output.mkdir(parents=True, exist_ok=True)
for source_path, record in resolved:
canvas_size = int(record["recommended_export_canvas_px"])
if canvas_size not in VALID_EXPORT_SIZES:
raise ValueError(
f"{record['id']} has invalid export size {canvas_size}"
)
image, alpha_bounds, scaled_size = normalize_artwork(
source_path,
canvas_size,
)
output_path = arguments.output / f"{record['catalog_number']}.png"
if not arguments.dry_run:
image.save(output_path, format="PNG", optimize=False, compress_level=6)
output_hash = sha256(output_path)
else:
output_hash = "dry-run"
print(
"EXPORT "
f"{source_path.name} -> {output_path.name} "
f"id={record['id']} canvas={canvas_size}x{canvas_size} "
f"alpha_bounds={alpha_bounds} visible={scaled_size[0]}x{scaled_size[1]} "
f"source_sha256={sha256(source_path)} output_sha256={output_hash}"
)
print(
f"Complete: {len(resolved)} export(s), "
f"{len(source_paths) - len(resolved)} skipped."
)
return 0
if __name__ == "__main__":
try:
raise SystemExit(main())
except (OSError, ValueError, zipfile.BadZipFile) as error:
print(f"ERROR: {error}", file=sys.stderr)
raise SystemExit(1)