def init(): tiles = loader('tiles', unit=TILE_SIZE) terrain2.terrain_blocks('grass', tiles('lpc-base-tiles/grass.png'), shape='floor') terrain2.terrain_blocks('water_grass', tiles('lpc-base-tiles/watergrass.png')) terrain2.terrain_cross_blocks('water_grass', tiles('lpc-watergrass-cross.png')) terrain2.interior_blocks('farmland', tiles('farmland-interior-parts.png'), shape='floor') structures = loader('structures', unit=TILE_SIZE) s = STRUCTURE.prefixed('tree') \ .shape(TREE_SHAPE) \ .layer(1) s.new('v0') \ .part(models.TREE['shadow'], structures('tree-shadow-round.png')) \ .part(models.TREE['trunk'], structures('tree-trunk.png')) \ .part(models.TREE['top'], structures('tree-top-round.png')) s.new('v1') \ .part(models.TREE['shadow'], structures('tree-shadow-cone.png')) \ .part(models.TREE['trunk'], structures('tree-trunk.png')) \ .part(models.TREE['top'], structures('tree-top-cone.png')) STRUCTURE.new('stump') \ .shape(STUMP_SHAPE) \ .layer(1) \ .part(models.TREE['stump'], structures('tree-stump.png'))
def init(): load = loader() struct_sheet = load('structures/crops.png', unit=TILE_SIZE) icon_sheet = load('icons/crops.png', unit=TILE_SIZE) def mk_crop(basename, display_name, index, size=(1, 1, 1), count=5): sx, sy, sz = size s = STRUCTURE.prefixed(basename) \ .model(models.solid(*size)) \ .shape(structure.solid(*size)) \ .layer(1) for i in range(count): s.new(str(i)) \ .image(struct_sheet.extract((i, 2 * index), size=(sx, sy + sz))) ITEM.new(basename) \ .display_name(display_name) \ .icon(icon_sheet.extract((index, 0))) mk_crop('tomato', 'Tomato', 0) mk_crop('potato', 'Potato', 1) mk_crop('carrot', 'Carrot', 2) mk_crop('artichoke', 'Artichoke', 3) mk_crop('pepper', 'Pepper', 4) mk_crop('cucumber', 'Cucumber', 5) mk_crop('corn', 'Corn', 6, size=(1, 1, 2))
def init(): structures = loader('structures', unit=TILE_SIZE) wall = do_wall_parts('interior_wall', structures('interior-wall.png'), door_image=structures('door.png')) wall_items_recipes(wall, 'interior', 'Interior', 'wood') wall = do_wall_parts('brick_wall', structures('brick-wall.png'), door_image=structures('door.png')) wall_items_recipes(wall, 'brick', 'Brick', 'stone') wall = do_wall_parts('wood_wall', structures('wood_wall.png'), door_image=structures('door-rough.png'), extra_parts=('window/v0',)) wall_items_recipes(wall, 'wood', 'Wooden', 'wood') wall = do_wall_parts('stone_wall', structures('stone-wall.png'), door_image=structures('door.png'), extra_parts=('window/v0', 'window/v1')) wall_items_recipes(wall, 'stone', 'Stone', 'stone') wall = do_wall_parts('ruined_wall', structures('ruined-wall.png'), door_image=structures('door.png'), extra_parts=('window/v0', 'window/v1')) wall_items_recipes(wall, 'ruined', 'Ruined', 'stone', icon_offset=(0, 40)) wall = do_wall_parts('cottage_wall', structures('cottage-wall.png'), door_image=structures('door.png'), extra_parts=['window/v%d' % i for i in range(2)] + ['variant/v%d' % i for i in range(3)]) wall_items_recipes(wall, 'cottage', 'Cottage', 'wood')
def init(): structures = loader('structures', unit=TILE_SIZE) door_anim_sheet = structures('cave-door.png').with_unit((3 * TILE_SIZE, 2 * TILE_SIZE)) door_anim = Anim( [door_anim_sheet.extract((0, i)) for i in range(door_anim_sheet.size[1])], 16, oneshot=True) do_dungeon_door('dungeon/door/key', structures('cave-doorway-keyhole.png'), door_anim) do_dungeon_door('dungeon/door/puzzle', structures('cave-doorway-plain.png'), door_anim)
def init(): icons = loader('icons', unit=ICON_SIZE) structures = loader('structures', unit=TILE_SIZE) ITEM.new('crystal') \ .display_name('Crystal') \ .icon(icons('crystal.png')) do_teleporter(structures('crystal-formation.png')) do_dungeon_entrance(structures('crystal-formation-red.png')) do_ward(structures('crystal-ward.png').extract((0, 0), (1, 2))) do_sign(structures('sign.png')) ITEM.new('hat') \ .display_name('Witch Hat') \ .icon(icons('equip_hat_icon.png')) ITEM.new('party_hat') \ .display_name('Party Hat') \ .icon(icons('party-hat-icon.png')) ITEM.new('santa_hat') \ .display_name('Santa Hat') \ .icon(icons('santa-hat-icon.png')) pillars = structures('pillar.png') do_pillar(pillars.extract((0, 0), (1, 3)), 'wood', 'Wooden') do_pillar(pillars.extract((1, 0), (1, 3)), 'stone', 'Stone') do_floor(structures('wood-floor.png')) COLORS = ( ('red', 'Red'), ('orange', 'Orange'), ('yellow', 'Yellow'), ('green', 'Green'), ('blue', 'Blue'), ('purple', 'Purple'), ) for i, (color, desc) in enumerate(COLORS): do_floor_variant(structures('floor-%s.png' % color), i, color, desc)
def init(): pony = get_pony_sprite() load = loader('sprites', unit=SPRITE_SIZE) load1 = loader('sprites') # Standard animations # Define animations for m in MOTIONS: for i, d in enumerate(DIRS): if d.mirror is None: pony.add_anim('%s-%d' % (m.name, i), m.len, m.fps) else: pony.derive_anim('%s-%d' % (m.name, i), '%s-%d' % (m.name, d.mirror), sprite.mirror_anim) # Define layers and collect sheets sheets = {} for sex, ms in (('f', 'mare'), ('m', 'stallion')): # Base layers for layer in ('base', 'horn', 'frontwing', 'backwing'): layer_name = '%s/%s' % (sex, layer) pony.add_layer(layer_name) sheets[layer_name] = load('base/%s/%s.png' % (ms, layer)) # Mane/tail layers for kind, idx in standard_manes_tails(): layer_name = '%s/%s/%d' % (sex, kind, idx) pony.add_layer(layer_name) sheets[layer_name] = load('parts/%s/%s%d.png' % (ms, kind, idx)) # Hat box layer_name = '%s/_dummy/hat_box' % sex pony.add_layer(layer_name) sheets[layer_name] = load('base/%s/hat-box.png' % ms) # Add graphics row_to_anim = lambda row, m: row.sheet_to_anim((1, 1), m.fps) for m, i, anim_name in standard_anims(): extract_graphics(sheets, m, i, anim_name, row_to_anim) # Other anims # Sleep pony.add_anim('sleep-0', 6, 2) pony.derive_anim('sleep-2', 'sleep-0', sprite.mirror_anim) def make_sleep_anim(row, _m): frames = [ row.extract((0, 0)), row.extract((0, 0)), row.extract((1, 0)), row.extract((2, 0)), row.extract((2, 0)), row.extract((1, 0)), ] return Anim(frames, 2) extract_graphics(sheets, Motion('sleep', 0, 10, 3, 2), 0, 'sleep-0', make_sleep_anim) for sex in ('m', 'f'): blank = Image(size=(3, 1), unit=SPRITE_SIZE) anim = make_sleep_anim(blank, None) pony.add_graphics('%s/eyes1' % sex, 'sleep-0', anim) # Hat layers for sex, ms in (('f', 'mare'), ('m', 'stallion')): # Eyes sheet = load1('parts/%s/eyes1.png' % ms) add_hat_layer('%s/eyes1' % sex, sex, sheet) # Hats for hat_type in ('witch', 'santa', 'party'): sheet = load1('equipment/%s-hat-%s.png' % (hat_type, sex)) add_hat_layer('%s/hat/%s' % (sex, hat_type), sex, sheet)
def init(): tiles = loader('tiles', unit=TILE_SIZE) def mk_layer(letter, img_name, is_base=True): return Layer(letter, chop_terrain(tiles(img_name)), is_base) layer_dct = { 'g': mk_layer('g', 'lpc-grassalt-with-variants.png'), 'm': mk_layer('m', 'lpc-base-tiles/dirt.png'), 'c': mk_layer('c', 'lpc-base-tiles/dirt2.png'), #'s': mk_layer('s', 'TODO'), 'a': mk_layer('a', 'lpc-base-tiles/lavarock.png'), 'w': mk_layer('w', 'lpc-base-tiles/water.png', is_base=False), 'l': mk_layer('l', 'lpc-base-tiles/lava.png', is_base=False), 'p': mk_layer('p', 'lpc-base-tiles/holemid.png', is_base=False), } order = 'mca wlp g s' def collect_layers(letters): return [layer_dct[l] for l in order if l in letters] # Base terrain floor_bb = BLOCK.prefixed('terrain').shape('floor') empty_bb = BLOCK.prefixed('terrain').shape('empty') seen = set() for letters in ('gc', 'gw'): for name, img in iter_terrain_floor(collect_layers(letters)): # Avoid duplicate blocks if name in seen: continue seen.add(name) bb = floor_bb if 'w' not in letters else empty_bb bb.new(name).bottom(img) # Variants for layer in layer_dct.values(): name = layer.name * 4 for i in range(4): key = 'full/v%d' % i if i > 0 else 'full' floor_bb.new('%s/v%d' % (name, i)).bottom(layer.dct[key]) # Hilltop edges grass_top = chop_terrain(tiles('cave-top-grass.png'), tiles('cave-top-grass-cross.png')) for code in iter_codes(2): d = describe(tuple(x == 0 for x in code)) blk = floor_bb.new('gggg/e%s' % ''.join(str(x) for x in code)).bottom(grass_top[d]) if code == (1, 1, 1, 1): blk.shape('empty') # Cave top (for ramp tops inside caves) cave_top = chop_terrain(tiles('lpc-cave-top2.png'), tiles('lpc-cave-top2-cross.png')) for code in iter_codes(2): d = describe(tuple(x == 0 for x in code)) blk = floor_bb.new('cccc/e%s' % ''.join(str(x) for x in code)).bottom(cave_top[d]) if code == (1, 1, 1, 1): blk.shape('empty') # Terrain with cave walls for floor in iter_terrain_floor(collect_layers('gc')): for cave in iter_cave_z0(tiles('lpc-cave-walls2.png')): BLOCK.new('terrain/%s/c%s' % (floor.name, cave.name)) \ .bottom(floor.bottom) \ .front(cave.front) \ .shape('floor' if cave.clear else 'solid') # Cave walls (z1 part) cave_top_dct = chop_cave_top(tiles('lpc-cave-walls2.png')) cave_front_dct = chop_cave_front(tiles('lpc-cave-walls2.png')) black_dct = chop_black() for code in iter_codes(3): ds = dissect(code, 3) name = ''.join(str(x) for x in code) front_desc = calc_front_desc(ds) front = cave_front_dct['%s/z1' % front_desc] if front_desc is not None else None top = image2.stack(( black_dct[ds[0]], cave_top_dct[ds[1]], cave_top_dct[ds[2]], )) clear = name in ('1111', '2222') BLOCK.new('cave_z1/c%s' % name) \ .shape('empty' if clear else 'solid') \ .top(top).front(front) # Ramps cave_bottom_dct = dict(iter_terrain_floor(collect_layers('gc'))) do_cave_ramps(tiles, cave_bottom_dct) do_cave_entrance(tiles, cave_bottom_dct)
def init(): tiles = loader('tiles', unit=TILE_SIZE) structures = loader('structures', unit=TILE_SIZE) do_cave_junk(structures('cave-junk.png'))