commit 1e5c5da2
Add a second variant of color
Changed files
| M | data/saland/items/armor.json before |
| M | data/sprites/pants2.sprite before |
| M | data/textures/spritesheet/generate_sprite.py before |
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 <item_name> <color1> [color2 ...] > ../../sprites/<item_name>.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": <x_offset>,
+ "topy": <y_offset>,
+ "height": 64,
+ "width": 64,
+ "number_of_frames": <frame_count>,
+ "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 <item_name> <color>", file=sys.stderr)
+ print("Usage: python3 generate_sprite.py <item_name> <color1> [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()