diff --git a/data/saland/items/armor.json b/data/saland/items/armor.json index 1fb58b6..c94e494 100644 --- a/data/saland/items/armor.json +++ b/data/saland/items/armor.json @@ -38,6 +38,19 @@ "health" : 20, "pickup" : true } + , + { + "itemid" : "armor_pants2_black", + "sprite" : "male_standing_pants2_black_S", + "sprite2" : "", + "armor_lower_body" : "pants2_black", + "armor_restriction" : ["male", "female"], + "radius" : 16.0, + "isStatic" : false, + "isDestructible" : false, + "health" : 20, + "pickup" : true + } ] } diff --git a/data/sprites/pants2.sprite b/data/sprites/pants2.sprite index a367e34..690bb3a 100644 --- a/data/sprites/pants2.sprite +++ b/data/sprites/pants2.sprite @@ -372,5 +372,379 @@ "frame_time": 100, "originx": 32, "originy": 50 + }, + "male_slash_pants2_black_N": { + "texture": "spritesheet/pants2/male/slash/black", + "topx": 0, + "topy": 0, + "height": 64, + "width": 64, + "number_of_frames": 6, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "male_slash_pants2_black_W": { + "texture": "spritesheet/pants2/male/slash/black", + "topx": 0, + "topy": 64, + "height": 64, + "width": 64, + "number_of_frames": 6, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "male_slash_pants2_black_S": { + "texture": "spritesheet/pants2/male/slash/black", + "topx": 0, + "topy": 128, + "height": 64, + "width": 64, + "number_of_frames": 6, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "male_slash_pants2_black_E": { + "texture": "spritesheet/pants2/male/slash/black", + "topx": 0, + "topy": 192, + "height": 64, + "width": 64, + "number_of_frames": 6, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "male_spellcast_pants2_black_N": { + "texture": "spritesheet/pants2/male/spellcast/black", + "topx": 0, + "topy": 0, + "height": 64, + "width": 64, + "number_of_frames": 7, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "male_spellcast_pants2_black_W": { + "texture": "spritesheet/pants2/male/spellcast/black", + "topx": 0, + "topy": 64, + "height": 64, + "width": 64, + "number_of_frames": 7, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "male_spellcast_pants2_black_S": { + "texture": "spritesheet/pants2/male/spellcast/black", + "topx": 0, + "topy": 128, + "height": 64, + "width": 64, + "number_of_frames": 7, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "male_spellcast_pants2_black_E": { + "texture": "spritesheet/pants2/male/spellcast/black", + "topx": 0, + "topy": 192, + "height": 64, + "width": 64, + "number_of_frames": 7, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "male_standing_pants2_black_N": { + "texture": "spritesheet/pants2/male/idle/black", + "topx": 0, + "topy": 0, + "height": 64, + "width": 64, + "number_of_frames": 1, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "male_standing_pants2_black_W": { + "texture": "spritesheet/pants2/male/idle/black", + "topx": 0, + "topy": 64, + "height": 64, + "width": 64, + "number_of_frames": 1, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "male_standing_pants2_black_S": { + "texture": "spritesheet/pants2/male/idle/black", + "topx": 0, + "topy": 128, + "height": 64, + "width": 64, + "number_of_frames": 1, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "male_standing_pants2_black_E": { + "texture": "spritesheet/pants2/male/idle/black", + "topx": 0, + "topy": 192, + "height": 64, + "width": 64, + "number_of_frames": 1, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "male_walkcycle_pants2_black_N": { + "texture": "spritesheet/pants2/male/walk/black", + "topx": 64, + "topy": 0, + "height": 64, + "width": 64, + "number_of_frames": 8, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "male_walkcycle_pants2_black_W": { + "texture": "spritesheet/pants2/male/walk/black", + "topx": 64, + "topy": 64, + "height": 64, + "width": 64, + "number_of_frames": 8, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "male_walkcycle_pants2_black_S": { + "texture": "spritesheet/pants2/male/walk/black", + "topx": 64, + "topy": 128, + "height": 64, + "width": 64, + "number_of_frames": 8, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "male_walkcycle_pants2_black_E": { + "texture": "spritesheet/pants2/male/walk/black", + "topx": 64, + "topy": 192, + "height": 64, + "width": 64, + "number_of_frames": 8, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "male_hurt_pants2_black_S": { + "texture": "spritesheet/pants2/male/hurt/black", + "topx": 0, + "topy": 0, + "height": 64, + "width": 64, + "number_of_frames": 6, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "female_slash_pants2_black_N": { + "texture": "spritesheet/pants2/thin/slash/black", + "topx": 0, + "topy": 0, + "height": 64, + "width": 64, + "number_of_frames": 6, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "female_slash_pants2_black_W": { + "texture": "spritesheet/pants2/thin/slash/black", + "topx": 0, + "topy": 64, + "height": 64, + "width": 64, + "number_of_frames": 6, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "female_slash_pants2_black_S": { + "texture": "spritesheet/pants2/thin/slash/black", + "topx": 0, + "topy": 128, + "height": 64, + "width": 64, + "number_of_frames": 6, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "female_slash_pants2_black_E": { + "texture": "spritesheet/pants2/thin/slash/black", + "topx": 0, + "topy": 192, + "height": 64, + "width": 64, + "number_of_frames": 6, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "female_spellcast_pants2_black_N": { + "texture": "spritesheet/pants2/thin/spellcast/black", + "topx": 0, + "topy": 0, + "height": 64, + "width": 64, + "number_of_frames": 7, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "female_spellcast_pants2_black_W": { + "texture": "spritesheet/pants2/thin/spellcast/black", + "topx": 0, + "topy": 64, + "height": 64, + "width": 64, + "number_of_frames": 7, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "female_spellcast_pants2_black_S": { + "texture": "spritesheet/pants2/thin/spellcast/black", + "topx": 0, + "topy": 128, + "height": 64, + "width": 64, + "number_of_frames": 7, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "female_spellcast_pants2_black_E": { + "texture": "spritesheet/pants2/thin/spellcast/black", + "topx": 0, + "topy": 192, + "height": 64, + "width": 64, + "number_of_frames": 7, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "female_standing_pants2_black_N": { + "texture": "spritesheet/pants2/thin/idle/black", + "topx": 0, + "topy": 0, + "height": 64, + "width": 64, + "number_of_frames": 1, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "female_standing_pants2_black_W": { + "texture": "spritesheet/pants2/thin/idle/black", + "topx": 0, + "topy": 64, + "height": 64, + "width": 64, + "number_of_frames": 1, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "female_standing_pants2_black_S": { + "texture": "spritesheet/pants2/thin/idle/black", + "topx": 0, + "topy": 128, + "height": 64, + "width": 64, + "number_of_frames": 1, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "female_standing_pants2_black_E": { + "texture": "spritesheet/pants2/thin/idle/black", + "topx": 0, + "topy": 192, + "height": 64, + "width": 64, + "number_of_frames": 1, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "female_walkcycle_pants2_black_N": { + "texture": "spritesheet/pants2/thin/walk/black", + "topx": 64, + "topy": 0, + "height": 64, + "width": 64, + "number_of_frames": 8, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "female_walkcycle_pants2_black_W": { + "texture": "spritesheet/pants2/thin/walk/black", + "topx": 64, + "topy": 64, + "height": 64, + "width": 64, + "number_of_frames": 8, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "female_walkcycle_pants2_black_S": { + "texture": "spritesheet/pants2/thin/walk/black", + "topx": 64, + "topy": 128, + "height": 64, + "width": 64, + "number_of_frames": 8, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "female_walkcycle_pants2_black_E": { + "texture": "spritesheet/pants2/thin/walk/black", + "topx": 64, + "topy": 192, + "height": 64, + "width": 64, + "number_of_frames": 8, + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + "female_hurt_pants2_black_S": { + "texture": "spritesheet/pants2/thin/hurt/black", + "topx": 0, + "topy": 0, + "height": 64, + "width": 64, + "number_of_frames": 6, + "frame_time": 100, + "originx": 32, + "originy": 50 } } diff --git a/data/textures/spritesheet/generate_sprite.py b/data/textures/spritesheet/generate_sprite.py index 76075bd..a3a62bd 100644 --- a/data/textures/spritesheet/generate_sprite.py +++ b/data/textures/spritesheet/generate_sprite.py @@ -1,4 +1,60 @@ #!/usr/bin/env python3 +""" +Sprite Definition Generator for Saland Adventures + +This script generates sprite definition JSON files for character clothing/equipment items. +It creates sprite entries for all 5 character animations (slash, spellcast, standing, +walkcycle, and hurt) across both male and female character models. + +Usage: + python3 generate_sprite.py [color2 ...] > ../../sprites/.sprite + +Arguments: + item_name: Name of the clothing/equipment item (e.g., "pants2", "shirt1") + colors: One or more color variants (e.g., "black", "blue", "red") + +Output: + Generates JSON with sprite definitions in the format: + { + "race_animation_item_color_direction": { + "texture": "spritesheet/item/race_folder/animation_folder/color", + "topx": , + "topy": , + "height": 64, + "width": 64, + "number_of_frames": , + "frame_time": 100, + "originx": 32, + "originy": 50 + }, + ... + } + +Animations Generated: + - slash: Attack animation, 4 directions (N/W/S/E), 6 frames + - spellcast: Magic casting animation, 4 directions (N/W/S/E), 7 frames + - standing: Idle pose, 4 directions (N/W/S/E), 1 frame + - walkcycle: Walking animation, 4 directions (N/W/S/E), 8 frames + - hurt: Damage reaction, 1 direction (S only), 6 frames + +Notes: + - Sprite names use "male" and "female" for character race + - Texture paths use "male" and "thin" folders (thin = female body type) + - Standing and walkcycle animations use separate texture folders (idle/walk) + - Total output: 34 sprite entries (17 per race) + +Examples: + # Single color: + python3 generate_sprite.py pants2 black > ../../sprites/pants2_black.sprite + + # Multiple colors: + python3 generate_sprite.py pants2 black blue red > ../../sprites/pants2.sprite + + This generates sprites like: + - "male_walkcycle_pants2_black_N" -> texture: "spritesheet/pants2/male/walk/black" + - "male_walkcycle_pants2_blue_N" -> texture: "spritesheet/pants2/male/walk/blue" + - "female_hurt_pants2_black_S" -> texture: "spritesheet/pants2/thin/hurt/black" +""" import sys import json @@ -93,16 +149,22 @@ def generate_sprites(item_name, color): def main(): if len(sys.argv) < 3: - print("Usage: python3 generate_sprite.py ", file=sys.stderr) + print("Usage: python3 generate_sprite.py [color2 ...]", file=sys.stderr) print("Example: python3 generate_sprite.py pants2 black > ../../sprites/pants2_black.sprite", file=sys.stderr) + print(" python3 generate_sprite.py pants2 black blue red > ../../sprites/pants2.sprite", file=sys.stderr) sys.exit(1) item_name = sys.argv[1] - color = sys.argv[2] - sprites = generate_sprites(item_name, color) + colors = sys.argv[2:] # All remaining arguments are colors + + # Generate sprites for all colors and merge into one dictionary + all_sprites = {} + for color in colors: + sprites = generate_sprites(item_name, color) + all_sprites.update(sprites) # Output JSON with nice formatting - print(json.dumps(sprites, indent=4)) + print(json.dumps(all_sprites, indent=4)) if __name__ == "__main__": main()