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. independent team Woofmeow.
- Voyager: co-owner, developer, project director, creator of the game's - Voyager: co-owner, developer, project director, creator of the game's
current provisional fish artwork and original 3D work except where another provisional fish placeholder artwork and original 3D work except where
creator is credited, and composer of the original title track another creator is credited, and composer of the original title track
`audio/music/title/as_in_four_wolves.ogg`, dusk/world track `audio/music/title/as_in_four_wolves.ogg`, dusk/world track
`audio/music/world/craft.mp3`, and the synthesized robot animalese tones. `audio/music/world/craft.mp3`, and the synthesized robot animalese tones.
- Endeavour: co-owner, developer, and 2D artist. Her incorporated work includes - Endeavour: co-owner, developer, and 2D artist. Her incorporated work includes
character pattern/channel-map art, environment and UI art, and item art. character pattern/channel-map art, environment and UI art, item art, and
Planned work is not described as incorporated until its files enter the finished fish and creature artwork. Planned work is not described as
project. incorporated until its files enter the project.
- chillnfill: contributor of original 3D models for the character bodies and - chillnfill: contributor of original 3D models for the character bodies and
arms, ears and tails, and multiple world props and decorative assets, arms, ears and tails, and multiple world props and decorative assets,
including trees and bridges. The contributor requested to be credited as 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 ## Project-created artwork and music
The current in-game fish images are provisional artwork by Voyager. Endeavour Fish entries without finished replacement artwork use provisional placeholder
is creating replacement fish artwork, but work that has not been incorporated artwork by Voyager. Incorporated finished fish and creature artwork is by
into this repository is not presented here as part of the game or attributed Endeavour; work that has not entered this repository is not presented here as
as a shipped asset. part of the game or attributed as a shipped asset.
Endeavour's incorporated 2D contributions include the inventory notepad, Endeavour's incorporated 2D contributions include the inventory notepad,
environment and UI artwork, item artwork, and character customization pattern environment and UI artwork, item artwork, finished fish and creature artwork,
and channel-map artwork. Voyager's incorporated original work includes 3D and character customization pattern and channel-map artwork. Voyager's
assets, the provisional fish artwork, the title and dusk music identified incorporated original work includes 3D assets, the provisional fish
above, and the robot animalese tones. Specific contributor exceptions are placeholder artwork, the title and dusk music identified above, and the robot
recorded below and in the in-game credits. animalese tones. Specific contributor exceptions are recorded below and in the
in-game credits.
These credits intentionally describe work by creator and contribution family These credits intentionally describe work by creator and contribution family
instead of maintaining a second file-by-file asset catalog. Runtime resources 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 2D contribution record
Endeavour created the incorporated character customization patterns and Endeavour created the incorporated character customization patterns and
channel maps as well as additional UI, environment, and item artwork. The channel maps as well as additional UI, environment, item, fish, and creature
current provisional fish artwork is not part of this credit. New or replacement artwork. Voyager's provisional fish placeholder is not part of this credit.
art is added to this record only after it is accepted into the repository. 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 The exact current filenames and bytes are intentionally not copied into this
document. The character appearance resources and Git history are the 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="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="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="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"] [sub_resource type="Resource" id="Availability"]
script = ExtResource("3_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="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="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="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"] [sub_resource type="Resource" id="Availability"]
script = ExtResource("3_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="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="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="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"] [sub_resource type="Resource" id="Availability"]
script = ExtResource("3_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="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="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="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"] [sub_resource type="Resource" id="Availability"]
script = ExtResource("3_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="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="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] [resource]
script = ExtResource("1_fish_data") 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="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="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="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"] [sub_resource type="Resource" id="Availability"]
script = ExtResource("3_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="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="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="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"] [sub_resource type="Resource" id="Availability"]
script = ExtResource("3_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="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="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="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"] [sub_resource type="Resource" id="Availability"]
script = ExtResource("3_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="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="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="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"] [sub_resource type="Resource" id="Availability"]
script = ExtResource("3_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="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="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="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"] [sub_resource type="Resource" id="Availability"]
script = ExtResource("3_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="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="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="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"] [sub_resource type="Resource" id="Availability"]
script = ExtResource("3_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="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="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="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"] [sub_resource type="Resource" id="Availability"]
script = ExtResource("3_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="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="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="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"] [sub_resource type="Resource" id="Availability"]
script = ExtResource("3_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="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="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="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"] [sub_resource type="Resource" id="AtlanticSalmonAvailability"]
script = ExtResource("3_availability_script") 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="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="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="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"] [sub_resource type="Resource" id="Availability"]
script = ExtResource("3_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="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="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="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"] [sub_resource type="Resource" id="Availability"]
script = ExtResource("3_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="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="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="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"] [sub_resource type="Resource" id="Availability"]
script = ExtResource("3_availability") script = ExtResource("3_availability")

View file

@ -40,6 +40,25 @@ const StarterRegionScene = preload(
const SharedFishPlaceholder: Texture2D = preload( const SharedFishPlaceholder: Texture2D = preload(
"res://art/exported/creatures/fish_placeholder.png" "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 ACTIVE_CATALOG_COUNT: int = 313
const INACTIVE_CATALOG_COUNT: int = 3 const INACTIVE_CATALOG_COUNT: int = 3
@ -186,6 +205,8 @@ func _validate_catalog_and_pools() -> void:
var active_count: int = 0 var active_count: int = 0
var inactive_count: int = 0 var inactive_count: int = 0
var fishing_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] = {} var catalog_numbers: Dictionary[int, bool] = {}
for fish: FishDataType in Catalog.candidates: for fish: FishDataType in Catalog.candidates:
assert(fish != null and not fish.id.is_empty()) assert(fish != null and not fish.id.is_empty())
@ -204,13 +225,24 @@ func _validate_catalog_and_pools() -> void:
inactive_count += 1 inactive_count += 1
assert(not fish.is_selectable()) assert(not fish.is_selectable())
assert(fish.display_texture == null) 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: if fish.collection_method == FishDataType.CollectionMethod.FISHING:
fishing_count += 1 fishing_count += 1
assert(fish.active) assert(fish.active)
assert(fish.display_texture == SharedFishPlaceholder) 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(active_count == ACTIVE_CATALOG_COUNT)
assert(inactive_count == INACTIVE_CATALOG_COUNT) assert(inactive_count == INACTIVE_CATALOG_COUNT)
assert(fishing_count == FISHING_SPECIES_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") var chum: FishDataType = Catalog.get_fish_by_id(&"salmon_chum")
assert(chum != null) assert(chum != null)
assert(chum.get_season_text() == "fall") 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)