~starkingdoms/starkingdoms

ref: 85f89d3a734b494aa211f8a5bcf4cc2430cd4889 starkingdoms/spacetime/spacetime.py -rw-r--r-- 4.5 KiB
85f89d3a — c0repwn3r [wip] spacetime build beginnings 2 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import sys
from ninja_syntax import Writer
import os


def scan_assets(build_root):
    print(f'[spacetime] Scanning {build_root}/assets/src for assets')
    assets = []
    for entry in os.scandir(f'{build_root}/assets/src'):
        if entry.is_file() and entry.name.endswith('.ink.svg'):
            assets.append(f'{build_root}/assets/src/{entry.name}')
    print(f'[spacetime] Found {len(assets)} assets')
    return assets


default_asset_size = 512
asset_override = {
    'earth.ink.svg': 2048
}


def gen_inkscape_rules_for_asset_size(size, writer):
    writer.rule(f'inkscape_{size}px_full', f'inkscape -w {size * 1} -h {size * 1} $in -o $out')
    writer.rule(f'inkscape_{size}px_375', f'inkscape -w {int(size * 0.375)} -h {int(size * 0.375)} $in -o $out')
    writer.rule(f'inkscape_{size}px_125', f'inkscape -w {int(size * 0.125)} -h {int(size * 0.125)} $in -o $out')


def gen_inkscape_rules_for_asset_sizes(writer):
    gen_inkscape_rules_for_asset_size(default_asset_size, writer)
    for override in asset_override:
        gen_inkscape_rules_for_asset_size(asset_override[override], writer)


def asset_size(asset):
    if asset.split('/')[-1] in asset_override:
        return asset_override[asset.split('/')[-1]]
    else:
        return default_asset_size


def gen_inkscape_rules_for_asset(root, asset, writer, files_375, files_full, files_125):
    in_file = asset
    out_file_name = asset.split('.')[0].split('/')[-1]

    out_full = f'{root}/assets/final/full/{out_file_name}.png'
    files_full.append(out_full)
    rule_full = f'inkscape_{asset_size(asset)}px_full'

    out_375 = f'{root}/assets/final/375/{out_file_name}.png'
    files_375.append(out_375)
    rule_375 = f'inkscape_{asset_size(asset)}px_375'

    out_125 = f'{root}/assets/final/125/{out_file_name}.png'
    files_125.append(out_125)
    rule_125 = f'inkscape_{asset_size(asset)}px_125'

    writer.build([out_full], rule_full, [in_file])
    writer.build([out_375], rule_375, [in_file])
    writer.build([out_125], rule_125, [in_file])


def gen_inkscape(root, assets, writer, files_375, files_full, files_125):
    gen_inkscape_rules_for_asset_sizes(writer)

    for asset in assets:
        gen_inkscape_rules_for_asset(root, asset, writer, files_375, files_full, files_125)


def gen_packers(root, writer, files_375, files_full, files_125):
    # sheep pack assets/final/full/*.png -f amethyst_named -o assets/dist/spritesheet-full
    writer.rule(f'pack', 'sheep pack -f amethyst_named -o $out $in && touch $out')

    writer.build(f'{root}/assets/dist/spritesheet-full', 'pack', inputs=files_full,
                 implicit_outputs=[f'{root}/assets/dist/spritesheet-full.png',
                                   f'{root}/assets/dist/spritesheet-full.ron'])
    writer.build(f'asset-full', 'phony', inputs=[f'{root}/assets/dist/spritesheet-full'])

    writer.build(f'{root}/assets/dist/spritesheet-375', 'pack', inputs=files_375,
                 implicit_outputs=[f'{root}/assets/dist/spritesheet-375.png',
                                   f'{root}/assets/dist/spritesheet-375.ron'])
    writer.build(f'asset-375', 'phony', inputs=[f'{root}/assets/dist/spritesheet-375'])

    writer.build(f'{root}/assets/dist/spritesheet-125', 'pack', inputs=files_125,
                 implicit_outputs=[f'{root}/assets/dist/spritesheet-125.png',
                                   f'{root}/assets/dist/spritesheet-125.ron'])
    writer.build(f'asset-125', 'phony', inputs=[f'{root}/assets/dist/spritesheet-125'])

    writer.build(f'asset', 'phony',
                 inputs=[f'{root}/assets/dist/spritesheet-full', f'{root}/assets/dist/spritesheet-375',
                         f'{root}/assets/dist/spritesheet-125'])


def generate_assets_build_command(root, assets, writer):
    files_full = []
    files_375 = []
    files_125 = []
    gen_inkscape(root, assets, writer, files_375, files_full, files_125)
    gen_packers(root, writer, files_375, files_full, files_125)


def main():
    target = sys.argv[1]
    env = sys.argv[2]
    root = sys.argv[3]
    print(f'[spacetime] Configuring target {target} with ENV={env}, buildroot={root}')

    with open(f'{root}/build.ninja', 'w') as f:
        writer = Writer(f)

        writer.comment('Generated by spacetime.py')
        writer.comment('Do not manually edit this file')

        if env == 'prod' or target == 'asset':
            assets = scan_assets(root)
            generate_assets_build_command(root, assets, writer)



    print(f'[spacetime] Configured build')


if __name__ == "__main__":
    main()