Add finished creature artwork
BIN
art/exported/creatures/101.png
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
42
art/exported/creatures/101.png.import
Normal 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
|
||||||
BIN
art/exported/creatures/102.png
Normal file
|
After Width: | Height: | Size: 8.4 KiB |
42
art/exported/creatures/102.png.import
Normal 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
|
||||||
BIN
art/exported/creatures/103.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
42
art/exported/creatures/103.png.import
Normal 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
|
||||||
BIN
art/exported/creatures/104.png
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
42
art/exported/creatures/104.png.import
Normal 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
|
||||||
BIN
art/exported/creatures/105.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
42
art/exported/creatures/105.png.import
Normal 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
|
||||||
BIN
art/exported/creatures/106.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
42
art/exported/creatures/106.png.import
Normal 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
|
||||||
BIN
art/exported/creatures/107.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
42
art/exported/creatures/107.png.import
Normal 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
|
||||||
BIN
art/exported/creatures/3906.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
42
art/exported/creatures/3906.png.import
Normal 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
|
||||||
BIN
art/exported/creatures/4401.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
42
art/exported/creatures/4401.png.import
Normal 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
|
||||||
BIN
art/exported/creatures/4701.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
42
art/exported/creatures/4701.png.import
Normal 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
|
||||||
BIN
art/exported/creatures/5702.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
42
art/exported/creatures/5702.png.import
Normal 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
|
||||||
BIN
art/exported/creatures/5901.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
42
art/exported/creatures/5901.png.import
Normal 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
|
||||||
BIN
art/exported/creatures/6103.png
Normal file
|
After Width: | Height: | Size: 5.9 KiB |
42
art/exported/creatures/6103.png.import
Normal 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
|
||||||
BIN
art/exported/creatures/6804.png
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
42
art/exported/creatures/6804.png.import
Normal 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
|
||||||
BIN
art/exported/creatures/6905.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
42
art/exported/creatures/6905.png.import
Normal 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
|
||||||
BIN
art/exported/creatures/7403.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
42
art/exported/creatures/7403.png.import
Normal 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
|
||||||
BIN
art/exported/creatures/7508.png
Normal file
|
After Width: | Height: | Size: 2 KiB |
42
art/exported/creatures/7508.png.import
Normal 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
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
230
tools/art/export_creature_art.py
Normal 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)
|
||||||