git repos / saland

commit f25341c7

Poul Sander · 2025-12-22 16:44
f25341c743a9a3a5272a9b8ee012fa0634427d7d patch · browse files
parent 16a8bc243a3a9dc7a6ef1ef04829654cdcaf4567

Added a hair select menu. Seems to also currently reset to female... that needs to be checked

Changed files

A data/sprites/hair_blonde.sprite
A data/sprites/hair_blue.sprite
A data/sprites/hair_brunette.sprite
M data/sprites/hair_female.sprite before
A data/sprites/hair_raven.sprite
M data/sprites/std_hair.sprite before
M data/sprites/std_hair_female.sprite before
A src/ImGuiHairSelect.cpp
A src/ImGuiHairSelect.hpp
M src/ImGuiMainMenu.cpp before
M src/ImGuiMainMenu.hpp before
M src/saland.cpp before
M src/saland/Game.cpp before
M src/saland/globals.hpp before
M src/saland/model/Player.cpp before
M src/saland/model/Player.hpp before
diff --git a/data/sprites/hair_blonde.sprite b/data/sprites/hair_blonde.sprite new file mode 100644 index 0000000..a9120c3 --- /dev/null +++ b/data/sprites/hair_blonde.sprite
@@ -0,0 +1,219 @@
+{
+
+"male_walkcycle_hair_blonde_N" : {
+ "texture" : "std_hair/plain-male/blonde",
+ "topx" : 64,
+ "topy" : 512,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_walkcycle_hair_blonde_W" : {
+ "texture" : "std_hair/plain-male/blonde",
+ "topx" : 64,
+ "topy" : 576,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_walkcycle_hair_blonde_S" : {
+ "texture" : "std_hair/plain-male/blonde",
+ "topx" : 64,
+ "topy" : 640,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_walkcycle_hair_blonde_E" : {
+ "texture" : "std_hair/plain-male/blonde",
+ "topx" : 64,
+ "topy" : 704,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_standing_hair_blonde_N" : {
+ "texture" : "std_hair/plain-male/blonde",
+ "topx" : 0,
+ "topy" : 512,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_standing_hair_blonde_W" : {
+ "texture" : "std_hair/plain-male/blonde",
+ "topx" : 0,
+ "topy" : 576,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_standing_hair_blonde_S" : {
+ "texture" : "std_hair/plain-male/blonde",
+ "topx" : 0,
+ "topy" : 640,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_standing_hair_blonde_E" : {
+ "texture" : "std_hair/plain-male/blonde",
+ "topx" : 0,
+ "topy" : 704,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_hurt_hair_blonde_S" : {
+ "texture" : "std_hair/plain-male/blonde",
+ "topx" : 0,
+ "topy" : 1280,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 6,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_walkcycle_hair_blonde_N" : {
+ "texture" : "std_hair/ponytail2-female/blonde",
+ "topx" : 64,
+ "topy" : 512,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_walkcycle_hair_blonde_W" : {
+ "texture" : "std_hair/ponytail2-female/blonde",
+ "topx" : 64,
+ "topy" : 576,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_walkcycle_hair_blonde_S" : {
+ "texture" : "std_hair/ponytail2-female/blonde",
+ "topx" : 64,
+ "topy" : 640,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_walkcycle_hair_blonde_E" : {
+ "texture" : "std_hair/ponytail2-female/blonde",
+ "topx" : 64,
+ "topy" : 704,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_standing_hair_blonde_N" : {
+ "texture" : "std_hair/ponytail2-female/blonde",
+ "topx" : 0,
+ "topy" : 512,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_standing_hair_blonde_W" : {
+ "texture" : "std_hair/ponytail2-female/blonde",
+ "topx" : 0,
+ "topy" : 576,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_standing_hair_blonde_S" : {
+ "texture" : "std_hair/ponytail2-female/blonde",
+ "topx" : 0,
+ "topy" : 640,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_standing_hair_blonde_E" : {
+ "texture" : "std_hair/ponytail2-female/blonde",
+ "topx" : 0,
+ "topy" : 704,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_hurt_hair_blonde_S" : {
+ "texture" : "std_hair/ponytail2-female/blonde",
+ "topx" : 0,
+ "topy" : 1280,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 6,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+}
+
+}
diff --git a/data/sprites/hair_blue.sprite b/data/sprites/hair_blue.sprite new file mode 100644 index 0000000..853ff4f --- /dev/null +++ b/data/sprites/hair_blue.sprite
@@ -0,0 +1,219 @@
+{
+
+"male_walkcycle_hair_blue_N" : {
+ "texture" : "std_hair/plain-male/blue",
+ "topx" : 64,
+ "topy" : 512,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_walkcycle_hair_blue_W" : {
+ "texture" : "std_hair/plain-male/blue",
+ "topx" : 64,
+ "topy" : 576,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_walkcycle_hair_blue_S" : {
+ "texture" : "std_hair/plain-male/blue",
+ "topx" : 64,
+ "topy" : 640,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_walkcycle_hair_blue_E" : {
+ "texture" : "std_hair/plain-male/blue",
+ "topx" : 64,
+ "topy" : 704,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_standing_hair_blue_N" : {
+ "texture" : "std_hair/plain-male/blue",
+ "topx" : 0,
+ "topy" : 512,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_standing_hair_blue_W" : {
+ "texture" : "std_hair/plain-male/blue",
+ "topx" : 0,
+ "topy" : 576,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_standing_hair_blue_S" : {
+ "texture" : "std_hair/plain-male/blue",
+ "topx" : 0,
+ "topy" : 640,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_standing_hair_blue_E" : {
+ "texture" : "std_hair/plain-male/blue",
+ "topx" : 0,
+ "topy" : 704,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_hurt_hair_blue_S" : {
+ "texture" : "std_hair/plain-male/blue",
+ "topx" : 0,
+ "topy" : 1280,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 6,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_walkcycle_hair_blue_N" : {
+ "texture" : "std_hair/ponytail2-female/blue",
+ "topx" : 64,
+ "topy" : 512,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_walkcycle_hair_blue_W" : {
+ "texture" : "std_hair/ponytail2-female/blue",
+ "topx" : 64,
+ "topy" : 576,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_walkcycle_hair_blue_S" : {
+ "texture" : "std_hair/ponytail2-female/blue",
+ "topx" : 64,
+ "topy" : 640,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_walkcycle_hair_blue_E" : {
+ "texture" : "std_hair/ponytail2-female/blue",
+ "topx" : 64,
+ "topy" : 704,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_standing_hair_blue_N" : {
+ "texture" : "std_hair/ponytail2-female/blue",
+ "topx" : 0,
+ "topy" : 512,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_standing_hair_blue_W" : {
+ "texture" : "std_hair/ponytail2-female/blue",
+ "topx" : 0,
+ "topy" : 576,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_standing_hair_blue_S" : {
+ "texture" : "std_hair/ponytail2-female/blue",
+ "topx" : 0,
+ "topy" : 640,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_standing_hair_blue_E" : {
+ "texture" : "std_hair/ponytail2-female/blue",
+ "topx" : 0,
+ "topy" : 704,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_hurt_hair_blue_S" : {
+ "texture" : "std_hair/ponytail2-female/blue",
+ "topx" : 0,
+ "topy" : 1280,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 6,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+}
+
+}
diff --git a/data/sprites/hair_brunette.sprite b/data/sprites/hair_brunette.sprite new file mode 100644 index 0000000..7e663e9 --- /dev/null +++ b/data/sprites/hair_brunette.sprite
@@ -0,0 +1,219 @@
+{
+
+"male_walkcycle_hair_brunette_N" : {
+ "texture" : "std_hair/plain-male/brunette",
+ "topx" : 64,
+ "topy" : 512,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_walkcycle_hair_brunette_W" : {
+ "texture" : "std_hair/plain-male/brunette",
+ "topx" : 64,
+ "topy" : 576,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_walkcycle_hair_brunette_S" : {
+ "texture" : "std_hair/plain-male/brunette",
+ "topx" : 64,
+ "topy" : 640,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_walkcycle_hair_brunette_E" : {
+ "texture" : "std_hair/plain-male/brunette",
+ "topx" : 64,
+ "topy" : 704,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_standing_hair_brunette_N" : {
+ "texture" : "std_hair/plain-male/brunette",
+ "topx" : 0,
+ "topy" : 512,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_standing_hair_brunette_W" : {
+ "texture" : "std_hair/plain-male/brunette",
+ "topx" : 0,
+ "topy" : 576,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_standing_hair_brunette_S" : {
+ "texture" : "std_hair/plain-male/brunette",
+ "topx" : 0,
+ "topy" : 640,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_standing_hair_brunette_E" : {
+ "texture" : "std_hair/plain-male/brunette",
+ "topx" : 0,
+ "topy" : 704,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_hurt_hair_brunette_S" : {
+ "texture" : "std_hair/plain-male/brunette",
+ "topx" : 0,
+ "topy" : 1280,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 6,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_walkcycle_hair_brunette_N" : {
+ "texture" : "std_hair/ponytail2-female/brunette",
+ "topx" : 64,
+ "topy" : 512,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_walkcycle_hair_brunette_W" : {
+ "texture" : "std_hair/ponytail2-female/brunette",
+ "topx" : 64,
+ "topy" : 576,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_walkcycle_hair_brunette_S" : {
+ "texture" : "std_hair/ponytail2-female/brunette",
+ "topx" : 64,
+ "topy" : 640,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_walkcycle_hair_brunette_E" : {
+ "texture" : "std_hair/ponytail2-female/brunette",
+ "topx" : 64,
+ "topy" : 704,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_standing_hair_brunette_N" : {
+ "texture" : "std_hair/ponytail2-female/brunette",
+ "topx" : 0,
+ "topy" : 512,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_standing_hair_brunette_W" : {
+ "texture" : "std_hair/ponytail2-female/brunette",
+ "topx" : 0,
+ "topy" : 576,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_standing_hair_brunette_S" : {
+ "texture" : "std_hair/ponytail2-female/brunette",
+ "topx" : 0,
+ "topy" : 640,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_standing_hair_brunette_E" : {
+ "texture" : "std_hair/ponytail2-female/brunette",
+ "topx" : 0,
+ "topy" : 704,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_hurt_hair_brunette_S" : {
+ "texture" : "std_hair/ponytail2-female/brunette",
+ "topx" : 0,
+ "topy" : 1280,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 6,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+}
+
+}
diff --git a/data/sprites/hair_female.sprite b/data/sprites/hair_female.sprite index 84cf294..6d699da 100644 --- a/data/sprites/hair_female.sprite +++ b/data/sprites/hair_female.sprite
@@ -105,4 +105,6 @@
"number_of_frames" : 6,
"frame_time" : 100,
"originx" : 32,
- "originy" : 50
+ "originy" : 50}
+
+}
\ No newline at end of file
diff --git a/data/sprites/hair_raven.sprite b/data/sprites/hair_raven.sprite new file mode 100644 index 0000000..1239d9f --- /dev/null +++ b/data/sprites/hair_raven.sprite
@@ -0,0 +1,219 @@
+{
+
+"male_walkcycle_hair_raven_N" : {
+ "texture" : "std_hair/plain-male/raven",
+ "topx" : 64,
+ "topy" : 512,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_walkcycle_hair_raven_W" : {
+ "texture" : "std_hair/plain-male/raven",
+ "topx" : 64,
+ "topy" : 576,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_walkcycle_hair_raven_S" : {
+ "texture" : "std_hair/plain-male/raven",
+ "topx" : 64,
+ "topy" : 640,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_walkcycle_hair_raven_E" : {
+ "texture" : "std_hair/plain-male/raven",
+ "topx" : 64,
+ "topy" : 704,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_standing_hair_raven_N" : {
+ "texture" : "std_hair/plain-male/raven",
+ "topx" : 0,
+ "topy" : 512,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_standing_hair_raven_W" : {
+ "texture" : "std_hair/plain-male/raven",
+ "topx" : 0,
+ "topy" : 576,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_standing_hair_raven_S" : {
+ "texture" : "std_hair/plain-male/raven",
+ "topx" : 0,
+ "topy" : 640,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_standing_hair_raven_E" : {
+ "texture" : "std_hair/plain-male/raven",
+ "topx" : 0,
+ "topy" : 704,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"male_hurt_hair_raven_S" : {
+ "texture" : "std_hair/plain-male/raven",
+ "topx" : 0,
+ "topy" : 1280,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 6,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_walkcycle_hair_raven_N" : {
+ "texture" : "std_hair/ponytail2-female/raven",
+ "topx" : 64,
+ "topy" : 512,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_walkcycle_hair_raven_W" : {
+ "texture" : "std_hair/ponytail2-female/raven",
+ "topx" : 64,
+ "topy" : 576,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_walkcycle_hair_raven_S" : {
+ "texture" : "std_hair/ponytail2-female/raven",
+ "topx" : 64,
+ "topy" : 640,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_walkcycle_hair_raven_E" : {
+ "texture" : "std_hair/ponytail2-female/raven",
+ "topx" : 64,
+ "topy" : 704,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 8,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_standing_hair_raven_N" : {
+ "texture" : "std_hair/ponytail2-female/raven",
+ "topx" : 0,
+ "topy" : 512,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_standing_hair_raven_W" : {
+ "texture" : "std_hair/ponytail2-female/raven",
+ "topx" : 0,
+ "topy" : 576,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_standing_hair_raven_S" : {
+ "texture" : "std_hair/ponytail2-female/raven",
+ "topx" : 0,
+ "topy" : 640,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_standing_hair_raven_E" : {
+ "texture" : "std_hair/ponytail2-female/raven",
+ "topx" : 0,
+ "topy" : 704,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 1,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+},
+
+"female_hurt_hair_raven_S" : {
+ "texture" : "std_hair/ponytail2-female/raven",
+ "topx" : 0,
+ "topy" : 1280,
+ "height" : 64,
+ "width" : 64,
+ "number_of_frames" : 6,
+ "frame_time" : 100,
+ "originx" : 32,
+ "originy" : 50
+}
+
+}
diff --git a/data/sprites/std_hair.sprite b/data/sprites/std_hair.sprite index ccd5efd..0c36d96 100644 --- a/data/sprites/std_hair.sprite +++ b/data/sprites/std_hair.sprite
@@ -8,8 +8,8 @@
"width" : 64,
"number_of_frames" : 8,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"male_walkcycle_standard_hair_W" : {
@@ -20,8 +20,8 @@
"width" : 64,
"number_of_frames" : 8,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"male_walkcycle_standard_hair_S" : {
@@ -32,8 +32,8 @@
"width" : 64,
"number_of_frames" : 8,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"male_walkcycle_standard_hair_E" : {
@@ -44,8 +44,8 @@
"width" : 64,
"number_of_frames" : 8,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"male_standing_standard_hair_N" : {
@@ -56,8 +56,8 @@
"width" : 64,
"number_of_frames" : 1,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"male_standing_standard_hair_W" : {
@@ -68,8 +68,8 @@
"width" : 64,
"number_of_frames" : 1,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"male_standing_standard_hair_S" : {
@@ -80,8 +80,8 @@
"width" : 64,
"number_of_frames" : 1,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"male_standing_standard_hair_E" : {
@@ -92,8 +92,8 @@
"width" : 64,
"number_of_frames" : 1,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"male_slash_standard_hair_N" : {
@@ -104,8 +104,8 @@
"width" : 64,
"number_of_frames" : 6,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"male_slash_standard_hair_W" : {
@@ -116,8 +116,8 @@
"width" : 64,
"number_of_frames" : 6,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"male_slash_standard_hair_S" : {
@@ -128,8 +128,8 @@
"width" : 64,
"number_of_frames" : 6,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"male_slash_standard_hair_E" : {
@@ -140,8 +140,8 @@
"width" : 64,
"number_of_frames" : 6,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"male_hurt_standard_hair_S" : {
@@ -152,8 +152,8 @@
"width" : 64,
"number_of_frames" : 6,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
}
}
diff --git a/data/sprites/std_hair_female.sprite b/data/sprites/std_hair_female.sprite index 99a5328..aa8279d 100644 --- a/data/sprites/std_hair_female.sprite +++ b/data/sprites/std_hair_female.sprite
@@ -8,8 +8,8 @@
"width" : 64,
"number_of_frames" : 8,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"female_walkcycle_standard_hair_W" : {
@@ -20,8 +20,8 @@
"width" : 64,
"number_of_frames" : 8,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"female_walkcycle_standard_hair_S" : {
@@ -32,8 +32,8 @@
"width" : 64,
"number_of_frames" : 8,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"female_walkcycle_standard_hair_E" : {
@@ -44,8 +44,8 @@
"width" : 64,
"number_of_frames" : 8,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"female_standing_standard_hair_N" : {
@@ -56,8 +56,8 @@
"width" : 64,
"number_of_frames" : 1,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"female_standing_standard_hair_W" : {
@@ -68,8 +68,8 @@
"width" : 64,
"number_of_frames" : 1,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"female_standing_standard_hair_S" : {
@@ -80,8 +80,8 @@
"width" : 64,
"number_of_frames" : 1,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"female_standing_standard_hair_E" : {
@@ -92,8 +92,8 @@
"width" : 64,
"number_of_frames" : 1,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"female_slash_standard_hair_N" : {
@@ -104,8 +104,8 @@
"width" : 64,
"number_of_frames" : 6,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"female_slash_standard_hair_W" : {
@@ -116,8 +116,8 @@
"width" : 64,
"number_of_frames" : 6,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"female_slash_standard_hair_S" : {
@@ -128,8 +128,8 @@
"width" : 64,
"number_of_frames" : 6,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"female_slash_standard_hair_E" : {
@@ -140,8 +140,8 @@
"width" : 64,
"number_of_frames" : 6,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
},
"female_hurt_standard_hair_S" : {
@@ -152,8 +152,8 @@
"width" : 64,
"number_of_frames" : 6,
"frame_time" : 100,
- "originx" : 32,
- "originy" : 50
+ "originx" : 32,
+ "originy" : 50
}
}
diff --git a/src/ImGuiHairSelect.cpp b/src/ImGuiHairSelect.cpp new file mode 100644 index 0000000..9b4085a --- /dev/null +++ b/src/ImGuiHairSelect.cpp
@@ -0,0 +1,125 @@
+/*
+===========================================================================
+ * Saland Adventures
+Copyright (C) 2014-2024 Poul Sander
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see http://www.gnu.org/licenses/
+
+Source information and contacts persons can be found at
+https://github.com/sago007/saland
+===========================================================================
+ */
+
+#include "ImGuiHairSelect.hpp"
+#include "Libs/imgui/imgui.h"
+#include "common.h"
+#include "saland/globals.hpp"
+#include <SDL.h>
+
+ImGuiHairSelect::ImGuiHairSelect() {
+ currentHair = globalData.player.hair;
+
+ // Define available hair options
+ hairOptions = {
+ {"standard_hair", "Redhead"},
+ {"hair_blonde", "Blonde"},
+ {"hair_brunette", "Brunette"},
+ {"hair_raven", "Black"},
+ {"hair_blue", "Blue"},
+ {"hair_1", "Short Blue"} // The old male_hair_single_blue variant
+ };
+}
+
+bool ImGuiHairSelect::IsActive() {
+ return active;
+}
+
+void ImGuiHairSelect::Draw(SDL_Renderer* target) {
+ // Center the menu window
+ ImGuiIO& io = ImGui::GetIO();
+ ImVec2 window_size(400, 500);
+ ImVec2 window_pos(
+ (io.DisplaySize.x - window_size.x) * 0.5f,
+ (io.DisplaySize.y - window_size.y) * 0.5f
+ );
+
+ ImGui::SetNextWindowPos(window_pos, ImGuiCond_Always);
+ ImGui::SetNextWindowSize(window_size, ImGuiCond_Always);
+
+ if (!ImGui::Begin("Hair Select", &active,
+ ImGuiWindowFlags_NoResize |
+ ImGuiWindowFlags_NoMove |
+ ImGuiWindowFlags_NoCollapse)) {
+ ImGui::End();
+ return;
+ }
+
+ // Center buttons horizontally
+ float button_width = 300.0f;
+ float button_height = 50.0f;
+ float window_width = ImGui::GetWindowSize().x;
+ float button_x = (window_width - button_width) * 0.5f;
+
+ // Add some top spacing
+ ImGui::Dummy(ImVec2(0.0f, 30.0f));
+
+ // Display hair options as buttons
+ for (const auto& option : hairOptions) {
+ ImGui::SetCursorPosX(button_x);
+
+ // Highlight current selection
+ if (option.id == currentHair) {
+ ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.3f, 0.6f, 0.3f, 1.0f));
+ ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0.4f, 0.7f, 0.4f, 1.0f));
+ ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(0.2f, 0.5f, 0.2f, 1.0f));
+ }
+
+ if (ImGui::Button(option.displayName.c_str(), ImVec2(button_width, button_height))) {
+ pendingHair = option.id;
+ }
+
+ if (option.id == currentHair) {
+ ImGui::PopStyleColor(3);
+ }
+
+ ImGui::Dummy(ImVec2(0.0f, 5.0f));
+ }
+
+ ImGui::End();
+}
+
+void ImGuiHairSelect::ProcessInput(const SDL_Event& event, bool& processed) {
+ // Handle Escape key to close menu
+ if (event.type == SDL_KEYDOWN) {
+ if (event.key.keysym.sym == SDLK_ESCAPE) {
+ active = false;
+ processed = true;
+ }
+ }
+}
+
+void ImGuiHairSelect::SelectHair(const std::string& hairName) {
+ globalData.player.hair = hairName;
+ currentHair = hairName;
+ // Save player data
+ PlayerSave();
+ active = false;
+}
+
+void ImGuiHairSelect::Update() {
+ if (!pendingHair.empty()) {
+ SelectHair(pendingHair);
+ pendingHair.clear();
+ }
+}
diff --git a/src/ImGuiHairSelect.hpp b/src/ImGuiHairSelect.hpp new file mode 100644 index 0000000..1660e9b --- /dev/null +++ b/src/ImGuiHairSelect.hpp
@@ -0,0 +1,61 @@
+/*
+===========================================================================
+ * Saland Adventures
+Copyright (C) 2014-2024 Poul Sander
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see http://www.gnu.org/licenses/
+
+Source information and contacts persons can be found at
+https://github.com/sago007/saland
+===========================================================================
+ */
+
+#ifndef IMGUI_HAIR_SELECT_HPP
+#define IMGUI_HAIR_SELECT_HPP
+
+#include "sago/GameStateInterface.hpp"
+#include <string>
+#include <vector>
+
+struct SDL_Renderer;
+union SDL_Event;
+
+class ImGuiHairSelect : public sago::GameStateInterface {
+public:
+ ImGuiHairSelect();
+ virtual bool IsActive() override;
+ virtual void Draw(SDL_Renderer* target) override;
+ virtual void ProcessInput(const SDL_Event& event, bool& processed) override;
+ virtual void Update() override;
+
+ ImGuiHairSelect(const ImGuiHairSelect&) = delete;
+ ImGuiHairSelect& operator=(const ImGuiHairSelect&) = delete;
+ virtual ~ImGuiHairSelect() = default;
+
+private:
+ void SelectHair(const std::string& hairName);
+
+ bool active = true;
+ std::string pendingHair;
+ std::string currentHair;
+
+ struct HairOption {
+ std::string id;
+ std::string displayName;
+ };
+
+ std::vector<HairOption> hairOptions;
+};
+
+#endif // IMGUI_HAIR_SELECT_HPP
diff --git a/src/ImGuiMainMenu.cpp b/src/ImGuiMainMenu.cpp index 25fb222..02f1927 100644 --- a/src/ImGuiMainMenu.cpp +++ b/src/ImGuiMainMenu.cpp
@@ -44,7 +44,7 @@ void ImGuiMainMenu::UpdateLabels() {
void ImGuiMainMenu::Draw(SDL_Renderer* target) {
// Center the menu window
ImGuiIO& io = ImGui::GetIO();
- ImVec2 window_size(400, 500);
+ ImVec2 window_size(400, 570);
ImVec2 window_pos(
(io.DisplaySize.x - window_size.x) * 0.5f,
(io.DisplaySize.y - window_size.y) * 0.5f
@@ -68,7 +68,7 @@ void ImGuiMainMenu::Draw(SDL_Renderer* target) {
float button_x = (window_width - button_width) * 0.5f;
// Add some top spacing
- ImGui::SetCursorPosY(50);
+ ImGui::Dummy(ImVec2(0.0f, 30.0f));
// Start button
ImGui::SetCursorPosX(button_x);
@@ -90,6 +90,13 @@ void ImGuiMainMenu::Draw(SDL_Renderer* target) {
pendingAction = PendingAction::PlayerSelect;
}
+ // Hair Select button
+ ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 10);
+ ImGui::SetCursorPosX(button_x);
+ if (ImGui::Button("Hair Style", ImVec2(button_width, button_height))) {
+ pendingAction = PendingAction::HairSelect;
+ }
+
// Options button
ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 10);
ImGui::SetCursorPosX(button_x);
@@ -131,6 +138,9 @@ void ImGuiMainMenu::ExecutePendingAction() {
runPlayerSelect();
UpdateLabels();
break;
+ case PendingAction::HairSelect:
+ runHairSelect();
+ break;
case PendingAction::Options:
runMenuOptions();
break;
diff --git a/src/ImGuiMainMenu.hpp b/src/ImGuiMainMenu.hpp index ca8e1e8..f792b73 100644 --- a/src/ImGuiMainMenu.hpp +++ b/src/ImGuiMainMenu.hpp
@@ -34,6 +34,7 @@ union SDL_Event;
void runStartGame();
void runWorldSelect();
void runPlayerSelect();
+void runHairSelect();
void runMenuOptions();
void runHelpAbout();
@@ -55,6 +56,7 @@ private:
StartGame,
WorldSelect,
PlayerSelect,
+ HairSelect,
Options,
About
};
diff --git a/src/saland.cpp b/src/saland.cpp index c6f4b75..42d9339 100644 --- a/src/saland.cpp +++ b/src/saland.cpp
@@ -53,6 +53,7 @@ https://github.com/salandgame/saland
#include "ImGuiMainMenu.hpp"
#include "ImGuiWorldSelect.hpp"
#include "ImGuiPlayerSelect.hpp"
+#include "ImGuiHairSelect.hpp"
#include "ImGuiOptions.hpp"
#include "common.h"
@@ -325,6 +326,11 @@ void runPlayerSelect() {
RunGameState(m);
}
+void runHairSelect() {
+ ImGuiHairSelect m;
+ RunGameState(m);
+}
+
void ResetFullscreen() {
sago::SagoDataHolder& dataHolder = *globalData.dataHolder;
diff --git a/src/saland/Game.cpp b/src/saland/Game.cpp index 29f66ff..e9b3fba 100644 --- a/src/saland/Game.cpp +++ b/src/saland/Game.cpp
@@ -220,13 +220,13 @@ static SpawnPoint GetSpawnpoint(const sago::tiled::TileMap& tm) {
return ret;
}
-static void PlayerSave() {
+void PlayerSave() {
std::string playername = Config::getInstance()->getString("player");
nlohmann::json j = globalData.player;
sago::WriteFileContent(std::format("players/{}.json", playername).c_str(), j.dump());
}
-static void PlayerLoad() {
+void PlayerLoad() {
std::string playername = Config::getInstance()->getString("player");
nlohmann::json j;
std::string filename = std::format("players/{}.json", playername);
diff --git a/src/saland/globals.hpp b/src/saland/globals.hpp index d7f8772..98ca78e 100644 --- a/src/saland/globals.hpp +++ b/src/saland/globals.hpp
@@ -65,5 +65,9 @@ struct GlobalData {
extern GlobalData globalData;
+// Player save/load functions
+void PlayerSave();
+void PlayerLoad();
+
#endif /* GLOBALS_HPP */
diff --git a/src/saland/model/Player.cpp b/src/saland/model/Player.cpp index c3e06bb..ab9682e 100644 --- a/src/saland/model/Player.cpp +++ b/src/saland/model/Player.cpp
@@ -24,10 +24,13 @@ https://github.com/sago007/saland
#include "Player.hpp"
void to_json(nlohmann::json& j, const Player& p) {
- j = nlohmann::json{ {"race", p.race}, {"item_inventory", p.item_inventory} };
+ j = nlohmann::json{ {"race", p.race}, {"hair", p.hair}, {"item_inventory", p.item_inventory} };
}
void from_json(const nlohmann::json& j, Player& p) {
j.at("race").get_to(p.race);
+ if (j.contains("hair")) {
+ j.at("hair").get_to(p.hair);
+ }
j.at("item_inventory").get_to(p.item_inventory);
}
\ No newline at end of file
diff --git a/src/saland/model/Player.hpp b/src/saland/model/Player.hpp index 2e94e92..dc282e2 100644 --- a/src/saland/model/Player.hpp +++ b/src/saland/model/Player.hpp
@@ -32,11 +32,12 @@ struct Player {
Player() {};
std::string save_name="player1";
std::string race = "female";
+ std::string hair = "standard_hair";
std::string get_visible_race() {
return this->race;
}
std::string get_visible_hair() {
- return "standard_hair";
+ return this->hair;
}
std::string get_visible_bottom() {
return "pants_1";